diff options
| author | Lokesh Vutla <lokeshvutla@ti.com> | 2013-04-04 19:51:14 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-04-08 11:29:34 -0400 | 
| commit | d3d82e9fc69e284fa66ca82c8623f7de64a28130 (patch) | |
| tree | df7cf4906d83f428df10f7737bda9c6778e1aa61 /arch/arm/cpu/armv7/omap-common/emif-common.c | |
| parent | a8f408a8c4607a63cf2803be205f7350f316f3bc (diff) | |
| download | olio-uboot-2014.01-d3d82e9fc69e284fa66ca82c8623f7de64a28130.tar.xz olio-uboot-2014.01-d3d82e9fc69e284fa66ca82c8623f7de64a28130.zip | |
arm: omap4: Fix SDRAM AUTO DETECTION
Commit "8602114 omap: emif: configure emif only when required"
breaks SDRAM_AUTO_DETECTION.
The issue is dmm_init() depends on emif_sizes[](SDRAM Auto detection)
done in do_sdram_init(). The above commit moves dmm_init() above
do_sdram_init() because of which dmm_init() uses uninitialized
emif_sizes[].
So instead of using global emif_sizes[], get sdram details locally
and calculate emif sizes.
Reported-by: Michael Cashwell <mboards@prograde.net>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Diffstat (limited to 'arch/arm/cpu/armv7/omap-common/emif-common.c')
| -rw-r--r-- | arch/arm/cpu/armv7/omap-common/emif-common.c | 29 | 
1 files changed, 16 insertions, 13 deletions
| diff --git a/arch/arm/cpu/armv7/omap-common/emif-common.c b/arch/arm/cpu/armv7/omap-common/emif-common.c index 9eb1279d4..cdb443972 100644 --- a/arch/arm/cpu/armv7/omap-common/emif-common.c +++ b/arch/arm/cpu/armv7/omap-common/emif-common.c @@ -655,20 +655,27 @@ static u32 get_ddr_phy_ctrl_1(u32 freq, u8 RL)  	return phy;  } -static u32 get_emif_mem_size(struct emif_device_details *devices) +static u32 get_emif_mem_size(u32 base)  {  	u32 size_mbytes = 0, temp; +	struct emif_device_details dev_details; +	struct lpddr2_device_details cs0_dev_details, cs1_dev_details; +	u32 emif_nr = emif_num(base); -	if (!devices) -		return 0; +	emif_reset_phy(base); +	dev_details.cs0_device_details = emif_get_device_details(emif_nr, CS0, +						&cs0_dev_details); +	dev_details.cs1_device_details = emif_get_device_details(emif_nr, CS1, +						&cs1_dev_details); +	emif_reset_phy(base); -	if (devices->cs0_device_details) { -		temp = devices->cs0_device_details->density; +	if (dev_details.cs0_device_details) { +		temp = dev_details.cs0_device_details->density;  		size_mbytes += lpddr2_density_2_size_in_mbytes[temp];  	} -	if (devices->cs1_device_details) { -		temp = devices->cs1_device_details->density; +	if (dev_details.cs1_device_details) { +		temp = dev_details.cs1_device_details->density;  		size_mbytes += lpddr2_density_2_size_in_mbytes[temp];  	}  	/* convert to bytes */ @@ -1040,13 +1047,9 @@ static void do_sdram_init(u32 base)  	/* Return if no devices on this EMIF */  	if (!dev_details.cs0_device_details &&  	    !dev_details.cs1_device_details) { -		emif_sizes[emif_nr - 1] = 0;  		return;  	} -	if (!in_sdram) -		emif_sizes[emif_nr - 1] = get_emif_mem_size(&dev_details); -  	/*  	 * Get device timings:  	 * - Default timings specified by JESD209-2 if @@ -1108,8 +1111,8 @@ void dmm_init(u32 base)  	mapped_size = 0;  	section_cnt = 3;  	sys_addr = CONFIG_SYS_SDRAM_BASE; -	emif1_size = emif_sizes[0]; -	emif2_size = emif_sizes[1]; +	emif1_size = get_emif_mem_size(EMIF1_BASE); +	emif2_size = get_emif_mem_size(EMIF2_BASE);  	debug("emif1_size 0x%x emif2_size 0x%x\n", emif1_size, emif2_size);  	if (!emif1_size && !emif2_size) |