diff options
| author | Aneesh V <aneesh@ti.com> | 2011-09-08 11:05:53 -0400 | 
|---|---|---|
| committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2011-09-13 08:25:15 +0200 | 
| commit | 025bc4254ba3d501cf2af49ae1d91d5b2e7c529d (patch) | |
| tree | f82cf7e4e6570d67148f8d63e33370b979e9c277 | |
| parent | 16dc702f2419d1bd5b829a60382785c22d9ee50c (diff) | |
| download | olio-uboot-2014.01-025bc4254ba3d501cf2af49ae1d91d5b2e7c529d.tar.xz olio-uboot-2014.01-025bc4254ba3d501cf2af49ae1d91d5b2e7c529d.zip | |
omap4: make SDRAM init work for ES1.0 silicon
SDRAM init was not working on ES1.0 due to a programming
error. A pointer that was passed by value to a function
was set in function emif_get_device_details(), but the effect
wouldn't be seen in the calling function. The issue came
out while testing for ES1.0 because ES1.0 doesn't have any
SDRAM chips connected to CS1
Signed-off-by: Aneesh V <aneesh@ti.com>
Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
| -rw-r--r-- | arch/arm/cpu/armv7/omap4/emif.c | 47 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap4/sdram_elpida.c | 24 | ||||
| -rw-r--r-- | arch/arm/include/asm/arch-omap4/emif.h | 5 | 
3 files changed, 22 insertions, 54 deletions
| diff --git a/arch/arm/cpu/armv7/omap4/emif.c b/arch/arm/cpu/armv7/omap4/emif.c index 487ec4211..8c4646498 100644 --- a/arch/arm/cpu/armv7/omap4/emif.c +++ b/arch/arm/cpu/armv7/omap4/emif.c @@ -963,10 +963,11 @@ static u8 is_lpddr2_sdram_present(u32 base, u32 cs,  	return 1;  } -static struct lpddr2_device_details *get_lpddr2_details(u32 base, u8 cs, +struct lpddr2_device_details *emif_get_device_details(u32 emif_nr, u8 cs,  			struct lpddr2_device_details *lpddr2_dev_details)  {  	u32 phy; +	u32 base = (emif_nr == 1) ? OMAP44XX_EMIF1 : OMAP44XX_EMIF2;  	struct emif_reg_struct *emif = (struct emif_reg_struct *)base;  	if (!lpddr2_dev_details) @@ -985,40 +986,6 @@ static struct lpddr2_device_details *get_lpddr2_details(u32 base, u8 cs,  	return lpddr2_dev_details;  } - -void emif_get_device_details(u32 emif_nr, -		struct lpddr2_device_details *cs0_device_details, -		struct lpddr2_device_details *cs1_device_details) -{ -	u32 base = (emif_nr == 1) ? OMAP44XX_EMIF1 : OMAP44XX_EMIF2; - -	if (running_from_sdram()) { -		/* -		 * We can not do automatic discovery running from SDRAM -		 * Most likely we came here by mistake. Indicate error -		 * by returning NULL -		 */ -		cs0_device_details = NULL; -		cs1_device_details = NULL; -	} else { -		/* -		 * Automatically find the device details: -		 * -		 * Reset the PHY after each call to get_lpddr2_details(). -		 * If there is nothing connected to a given chip select -		 * (typically CS1) mode register reads will mess up with -		 * the PHY state and subsequent initialization won't work. -		 * PHY reset brings back PHY to a good state. -		 */ -		cs0_device_details = -		    get_lpddr2_details(base, CS0, cs0_device_details); -		emif_reset_phy(base); - -		cs1_device_details = -		    get_lpddr2_details(base, CS1, cs1_device_details); -		emif_reset_phy(base); -	} -}  #endif /* CONFIG_SYS_AUTOMATIC_SDRAM_DETECTION */  static void do_sdram_init(u32 base) @@ -1051,10 +1018,12 @@ static void do_sdram_init(u32 base)  	 * - Obtained from user otherwise  	 */  	struct lpddr2_device_details cs0_dev_details, cs1_dev_details; -	emif_get_device_details(emif_nr, &cs0_dev_details, -				&cs1_dev_details); -	dev_details.cs0_device_details = &cs0_dev_details; -	dev_details.cs1_device_details = &cs1_dev_details; +	emif_reset_phy(base); +	dev_details.cs0_device_details = emif_get_device_details(base, CS0, +						&cs0_dev_details); +	dev_details.cs1_device_details = emif_get_device_details(base, CS1, +						&cs1_dev_details); +	emif_reset_phy(base);  	/* Return if no devices on this EMIF */  	if (!dev_details.cs0_device_details && diff --git a/arch/arm/cpu/armv7/omap4/sdram_elpida.c b/arch/arm/cpu/armv7/omap4/sdram_elpida.c index 7757aad2b..edc5326c3 100644 --- a/arch/arm/cpu/armv7/omap4/sdram_elpida.c +++ b/arch/arm/cpu/armv7/omap4/sdram_elpida.c @@ -141,24 +141,24 @@ static const struct lpddr2_device_details elpida_2G_S4_details = {  	.manufacturer	= LPDDR2_MANUFACTURER_ELPIDA  }; -static void emif_get_device_details_sdp(u32 emif_nr, -		struct lpddr2_device_details *cs0_device_details, -		struct lpddr2_device_details *cs1_device_details) +struct lpddr2_device_details *emif_get_device_details_sdp(u32 emif_nr, u8 cs, +			struct lpddr2_device_details *lpddr2_dev_details)  {  	u32 omap_rev = omap_revision();  	/* EMIF1 & EMIF2 have identical configuration */ -	*cs0_device_details = elpida_2G_S4_details; - -	if (omap_rev == OMAP4430_ES1_0) -		cs1_device_details = NULL; -	else -		*cs1_device_details = elpida_2G_S4_details; +	if ((omap_rev == OMAP4430_ES1_0) && (cs == CS1)) { +		/* Nothing connected on CS1 for ES1.0 */ +		return NULL; +	} else { +		/* In all other cases Elpida 2G device */ +		*lpddr2_dev_details = elpida_2G_S4_details; +		return lpddr2_dev_details; +	}  } -void emif_get_device_details(u32 emif_nr, -		struct lpddr2_device_details *cs0_device_details, -		struct lpddr2_device_details *cs1_device_details) +struct lpddr2_device_details *emif_get_device_details(u32 emif_nr, u8 cs, +			struct lpddr2_device_details *lpddr2_dev_details)  	__attribute__((weak, alias("emif_get_device_details_sdp")));  #endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */ diff --git a/arch/arm/include/asm/arch-omap4/emif.h b/arch/arm/include/asm/arch-omap4/emif.h index 37ad1fdd3..6845c65b2 100644 --- a/arch/arm/include/asm/arch-omap4/emif.h +++ b/arch/arm/include/asm/arch-omap4/emif.h @@ -1029,9 +1029,8 @@ struct emif_regs {  void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs);  void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs);  #else -void emif_get_device_details(u32 emif_nr, -		struct lpddr2_device_details *cs0_device_details, -		struct lpddr2_device_details *cs1_device_details); +struct lpddr2_device_details *emif_get_device_details(u32 emif_nr, u8 cs, +			struct lpddr2_device_details *lpddr2_dev_details);  void emif_get_device_timings(u32 emif_nr,  		const struct lpddr2_device_timings **cs0_device_timings,  		const struct lpddr2_device_timings **cs1_device_timings); |