ARM: mach-at91: arm926ejs: fix data abort in startup returning from lowlevel_init
The startup code in arm/cpu/arm926ejs preserves the link register across the call to lowlevel_init by using r4: mov r4, lr /* perserve link reg across call */ bl lowlevel_init /* go setup pll,mux,memory */ mov lr, r4 /* restore link */ The lowlevel_init function for at91 machines based on the same CPU uses r4 and hence corrupts it causing a data abort when it returns to the startup code. This patch fixes this by using r6 instead of r4 in the lowlevel_init function. Discovered and the fix was tested on a AT91SAM9261 based board. Signed-off-by: Martin Townsend <martin@rufilla.com> Reviewed-by: Eugen Hristev <eugen.hristev@microchip.com>
This commit is contained in:
		
							parent
							
								
									8bad34a709
								
							
						
					
					
						commit
						bbfb81c187
					
				|  | @ -71,10 +71,10 @@ POS1: | ||||||
| 	str	r0, [r1] | 	str	r0, [r1] | ||||||
| 
 | 
 | ||||||
| 	/* Reading the PMC Status to detect when the Main Oscillator is enabled */ | 	/* Reading the PMC Status to detect when the Main Oscillator is enabled */ | ||||||
| 	mov	r4, #AT91_PMC_IXR_MOSCS | 	mov	r6, #AT91_PMC_IXR_MOSCS | ||||||
| MOSCS_Loop: | MOSCS_Loop: | ||||||
| 	ldr	r3, [r2] | 	ldr	r3, [r2] | ||||||
| 	and	r3, r4, r3 | 	and	r3, r6, r3 | ||||||
| 	cmp	r3, #AT91_PMC_IXR_MOSCS | 	cmp	r3, #AT91_PMC_IXR_MOSCS | ||||||
| 	bne	MOSCS_Loop | 	bne	MOSCS_Loop | ||||||
| 
 | 
 | ||||||
|  | @ -89,10 +89,10 @@ MOSCS_Loop: | ||||||
| 	str	r0, [r1] | 	str	r0, [r1] | ||||||
| 
 | 
 | ||||||
| 	/* Reading the PMC Status register to detect when the PLLA is locked */ | 	/* Reading the PMC Status register to detect when the PLLA is locked */ | ||||||
| 	mov	r4, #AT91_PMC_IXR_LOCKA | 	mov	r6, #AT91_PMC_IXR_LOCKA | ||||||
| MOSCS_Loop1: | MOSCS_Loop1: | ||||||
| 	ldr	r3, [r2] | 	ldr	r3, [r2] | ||||||
| 	and	r3, r4, r3 | 	and	r3, r6, r3 | ||||||
| 	cmp	r3, #AT91_PMC_IXR_LOCKA | 	cmp	r3, #AT91_PMC_IXR_LOCKA | ||||||
| 	bne	MOSCS_Loop1 | 	bne	MOSCS_Loop1 | ||||||
| 
 | 
 | ||||||
|  | @ -109,10 +109,10 @@ MOSCS_Loop1: | ||||||
| 	str	r0, [r1] | 	str	r0, [r1] | ||||||
| 
 | 
 | ||||||
| 	/* Reading the PMC Status to detect when the Master clock is ready */ | 	/* Reading the PMC Status to detect when the Master clock is ready */ | ||||||
| 	mov	r4, #AT91_PMC_IXR_MCKRDY | 	mov	r6, #AT91_PMC_IXR_MCKRDY | ||||||
| MCKRDY_Loop: | MCKRDY_Loop: | ||||||
| 	ldr	r3, [r2] | 	ldr	r3, [r2] | ||||||
| 	and	r3, r4, r3 | 	and	r3, r6, r3 | ||||||
| 	cmp	r3, #AT91_PMC_IXR_MCKRDY | 	cmp	r3, #AT91_PMC_IXR_MCKRDY | ||||||
| 	bne	MCKRDY_Loop | 	bne	MCKRDY_Loop | ||||||
| 
 | 
 | ||||||
|  | @ -120,10 +120,10 @@ MCKRDY_Loop: | ||||||
| 	str	r0, [r1] | 	str	r0, [r1] | ||||||
| 
 | 
 | ||||||
| 	/* Reading the PMC Status to detect when the Master clock is ready */ | 	/* Reading the PMC Status to detect when the Master clock is ready */ | ||||||
| 	mov	r4, #AT91_PMC_IXR_MCKRDY | 	mov	r6, #AT91_PMC_IXR_MCKRDY | ||||||
| MCKRDY_Loop1: | MCKRDY_Loop1: | ||||||
| 	ldr	r3, [r2] | 	ldr	r3, [r2] | ||||||
| 	and	r3, r4, r3 | 	and	r3, r6, r3 | ||||||
| 	cmp	r3, #AT91_PMC_IXR_MCKRDY | 	cmp	r3, #AT91_PMC_IXR_MCKRDY | ||||||
| 	bne	MCKRDY_Loop1 | 	bne	MCKRDY_Loop1 | ||||||
| PLL_setup_end: | PLL_setup_end: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue