@ SCB_BASE	0xE01FC000      @ System Control Block
@ #define PLLCON_OFFSET		0x080
@ #define PLLCFG_OFFSET		0x084
@ #define PLLSTAT_OFFSET	0x088
@ #define PLLFEED_OFFSET	0x08C
@ #define SCS_OFFSET		0x1A0
@ #define MAMCR_OFFSET		0x000
@ #define MAMTIM_OFFSET		0x004
@ #define MEMMAP_OFFSET		0x040

#ifdef CONFIG_PLL_SETUP
	ldr r0, =SCB_BASE
	ldr r1, [r0, #PLLSTAT_OFFSET]
	ldr r2, [r1]
	tst r2, #(1<<25)
	bne label_1
	
	/* Enable PLL, disconnected  */
	
	mov r3, #1
	str r3, [r0, #PLLCON_OFFSET]
	mov	r1, #0xAA
	mov	r2, #0x55
	str	r1, [r0, #PLLFEED_OFFSET]
	str	r2, [r0, #PLLFEED_OFFSET]
	
 	/*  Disable PLL, disconnected  */
	
label_1:
    mov r3, #0
    str r3, [r0, #PLLCON_OFFSET]
	mov	r1, #0xAA
	mov	r2, #0x55
	str	r1, [r0, #PLLFEED_OFFSET]
	str	r2, [r0, #PLLFEED_OFFSET]
	
	/*  Enable main OSC   */
	
	ldr r3, [r0, #SCS_OFFSET]
	ldr r2, [r3]
	orr r2, r2, #0x20
	strb r2, [r3]

	/* Use Fast I0 on P0 & P1 */

	ldr r1, [r0, #SCS_OFFSET]
	ldr r2, [r1]
	orr r2, r2, #0x01
	strb r2, [r1]

	/* Wait until main OSC is stable */
	
label_2:
	ldr r1, [r0, #SCS_OFFSET]
	ldr r2, [r1]
	tst r2, #0x40
	beq label_2

	/* Set PLL Clock Source,  CONFIG_PLL_CLKSRC = IRC=0 || MAIN=1 || RTC=2 */
	
	mov r1, #CONFIG_PLL_CLKSRC
	str r1, [r0, #LPC23XX_CLKSRCSEL_OFFSET]
	
	/* Set PLL Multiplier and Divider */

	mov r3, #CONFIG_PLLCFG_VALUE
	str r3, [r0, #PLLCFG_OFFSET]
	mov	r1, #0xAA
	mov	r2, #0x55
	str	r1, [r0, #PLLFEED_OFFSET]
	str	r2, [r0, #PLLFEED_OFFSET]

	/* Enable PLL, disconnected */
	
	mov r3, #1
	str r3, [r0, #PLLCON_OFFSET]
	mov	r1, #0xAA
	mov	r2, #0x55
	str	r1, [r0, #PLLFEED_OFFSET]
	str	r2, [r0, #PLLFEED_OFFSET]
	
	/* Set clock divider */
	
	mov r1, #LPC23XX_CCLK_DIV
	str r1, [r0, #LPC23XX_CCLKCFG_OFFSET]

	/* Wait until PLL Locked */
1:
	ldr r3, [r0, #PLLSTAT_OFFSET]
	ands r3, r3, #PLLSTAT_PLOCK
	beq	1b

	/* Enable and connect PLL */

	@mov	r3, #(PLLCON_PLLE | PLLCON_PLLC)
	mov r3, #3
	str	r3, [r0, #PLLCON_OFFSET]
	mov	r1, #0xAA
	mov	r2, #0x55
	str	r1, [r0, #PLLFEED_OFFSET]
	str	r2, [r0, #PLLFEED_OFFSET]
	
	/* Check for connect bit */
2:
	ldr r3, [r0, #PLLSTAT_OFFSET]
	ands r3, r3, #PLLSTAT_PLLC
	beq	2b

	/* PCLK is the same as CCLK */
	
	@ldr r1, =0x55555555 /* fixup error to big constant */
	mov r1, #0x55 
	str r1, [r0, #LPC23XX_PCLKSEL0_OFFSET]
	@str r2, [r0, #LPC23XX_PCLKSEL1_OFFSET]
	
	/* Configure the Memory Accelerator Module (MAM) */
	
	mov r3, #0
	mov r2, #3
	strb r3, [r0, #MAMCR_OFFSET]
	strb r2, [r0, #MAMTIM_OFFSET]
	mov r1, #2
	strb r1, [r0, #MAMCR_OFFSET]

#endif
