/* SPDX-License-Identifier: GPL-2.0-or-later */

/***************************************************************************
 *   Copyright (C) 2017 Zale Yu                                            *
 *   CYYU@nuvoton.com                                                      *
 *                                                                         *
 *   Copyright (C) 2022 Jian-Hong Pan                                      *
 *   chienhung.pan@gmail.com                                               *
 ***************************************************************************/

	.text
	.cpu cortex-m4
	.thumb

	/* Params:
	 * r0 - workarea buffer / result
	 * r1 - target address
	 * r2 - wordcount
	 * Clobbered:
	 * r4 - tmp
	 * r5 - tmp
	 * r6 - tmp
	 * r7 - tmp
	 */

.L1:
	/* for(register uint32_t i=0;i<wcount;i++){ */
	mov	r4, r0
	mov	r3, #0
.L2:
	sub	r5, r1, r0
	add	r7, r4, r5
	cmp	r3, r2
	beq	.L7
.L4:
	/* NUMICRO_FLASH_ISPADR = faddr; */
	ldr	r6, .L8
	str	r7, [r6]
	/* NUMICRO_FLASH_ISPDAT = *pLW; */
	ldmia	r4!, {r7}
	ldr	r5, .L8+4
	str	r7, [r5]
	/* faddr += 4; */
	/* pLW++; */
	/*  Trigger write action  */
	/* NUMICRO_FLASH_ISPTRG = ISPTRG_ISPGO; */
	ldr	r5, .L8+8
	mov	r6, #1
	str	r6, [r5]
.L3:
	/* while((NUMICRO_FLASH_ISPTRG & ISPTRG_ISPGO) == ISPTRG_ISPGO){}; */
	ldr	r7, [r5]
	lsl	r7, r7, #31
	bmi	.L3

	add	r3, r3, #1
	b	.L2
.L7:
	/* return (NUMICRO_FLASH_ISPCON & ISPCON_ISPFF); */
	ldr	r3, .L8+12
	ldr	r0, [r3]
	mov	r1, #64
	and	r0, r1
.L9:
	bkpt	#0
.L8:
	.word	0x4000C004
	.word	0x4000C008
	.word	0x4000C010
	.word	0x4000C000