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>
This commit is contained in:
parent
16dc702f24
commit
025bc4254b
@ -963,10 +963,11 @@ static u8 is_lpddr2_sdram_present(u32 base, u32 cs,
|
|||||||
return 1;
|
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)
|
struct lpddr2_device_details *lpddr2_dev_details)
|
||||||
{
|
{
|
||||||
u32 phy;
|
u32 phy;
|
||||||
|
u32 base = (emif_nr == 1) ? OMAP44XX_EMIF1 : OMAP44XX_EMIF2;
|
||||||
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
struct emif_reg_struct *emif = (struct emif_reg_struct *)base;
|
||||||
|
|
||||||
if (!lpddr2_dev_details)
|
if (!lpddr2_dev_details)
|
||||||
@ -985,40 +986,6 @@ static struct lpddr2_device_details *get_lpddr2_details(u32 base, u8 cs,
|
|||||||
|
|
||||||
return lpddr2_dev_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)
|
|
||||||
{
|
|
||||||
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 */
|
#endif /* CONFIG_SYS_AUTOMATIC_SDRAM_DETECTION */
|
||||||
|
|
||||||
static void do_sdram_init(u32 base)
|
static void do_sdram_init(u32 base)
|
||||||
@ -1051,10 +1018,12 @@ static void do_sdram_init(u32 base)
|
|||||||
* - Obtained from user otherwise
|
* - Obtained from user otherwise
|
||||||
*/
|
*/
|
||||||
struct lpddr2_device_details cs0_dev_details, cs1_dev_details;
|
struct lpddr2_device_details cs0_dev_details, cs1_dev_details;
|
||||||
emif_get_device_details(emif_nr, &cs0_dev_details,
|
emif_reset_phy(base);
|
||||||
&cs1_dev_details);
|
dev_details.cs0_device_details = emif_get_device_details(base, CS0,
|
||||||
dev_details.cs0_device_details = &cs0_dev_details;
|
&cs0_dev_details);
|
||||||
dev_details.cs1_device_details = &cs1_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 */
|
/* Return if no devices on this EMIF */
|
||||||
if (!dev_details.cs0_device_details &&
|
if (!dev_details.cs0_device_details &&
|
||||||
|
@ -141,24 +141,24 @@ static const struct lpddr2_device_details elpida_2G_S4_details = {
|
|||||||
.manufacturer = LPDDR2_MANUFACTURER_ELPIDA
|
.manufacturer = LPDDR2_MANUFACTURER_ELPIDA
|
||||||
};
|
};
|
||||||
|
|
||||||
static void emif_get_device_details_sdp(u32 emif_nr,
|
struct lpddr2_device_details *emif_get_device_details_sdp(u32 emif_nr, u8 cs,
|
||||||
struct lpddr2_device_details *cs0_device_details,
|
struct lpddr2_device_details *lpddr2_dev_details)
|
||||||
struct lpddr2_device_details *cs1_device_details)
|
|
||||||
{
|
{
|
||||||
u32 omap_rev = omap_revision();
|
u32 omap_rev = omap_revision();
|
||||||
|
|
||||||
/* EMIF1 & EMIF2 have identical configuration */
|
/* EMIF1 & EMIF2 have identical configuration */
|
||||||
*cs0_device_details = elpida_2G_S4_details;
|
if ((omap_rev == OMAP4430_ES1_0) && (cs == CS1)) {
|
||||||
|
/* Nothing connected on CS1 for ES1.0 */
|
||||||
if (omap_rev == OMAP4430_ES1_0)
|
return NULL;
|
||||||
cs1_device_details = NULL;
|
} else {
|
||||||
else
|
/* In all other cases Elpida 2G device */
|
||||||
*cs1_device_details = elpida_2G_S4_details;
|
*lpddr2_dev_details = elpida_2G_S4_details;
|
||||||
|
return lpddr2_dev_details;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void emif_get_device_details(u32 emif_nr,
|
struct lpddr2_device_details *emif_get_device_details(u32 emif_nr, u8 cs,
|
||||||
struct lpddr2_device_details *cs0_device_details,
|
struct lpddr2_device_details *lpddr2_dev_details)
|
||||||
struct lpddr2_device_details *cs1_device_details)
|
|
||||||
__attribute__((weak, alias("emif_get_device_details_sdp")));
|
__attribute__((weak, alias("emif_get_device_details_sdp")));
|
||||||
|
|
||||||
#endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
|
#endif /* CONFIG_SYS_EMIF_PRECALCULATED_TIMING_REGS */
|
||||||
|
@ -1029,9 +1029,8 @@ struct emif_regs {
|
|||||||
void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **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);
|
void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs);
|
||||||
#else
|
#else
|
||||||
void emif_get_device_details(u32 emif_nr,
|
struct lpddr2_device_details *emif_get_device_details(u32 emif_nr, u8 cs,
|
||||||
struct lpddr2_device_details *cs0_device_details,
|
struct lpddr2_device_details *lpddr2_dev_details);
|
||||||
struct lpddr2_device_details *cs1_device_details);
|
|
||||||
void emif_get_device_timings(u32 emif_nr,
|
void emif_get_device_timings(u32 emif_nr,
|
||||||
const struct lpddr2_device_timings **cs0_device_timings,
|
const struct lpddr2_device_timings **cs0_device_timings,
|
||||||
const struct lpddr2_device_timings **cs1_device_timings);
|
const struct lpddr2_device_timings **cs1_device_timings);
|
||||||
|
Loading…
Reference in New Issue
Block a user