aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xarch/arm/mach-omap2/emif.c15
-rw-r--r--arch/arm/mach-omap2/include/mach/emif.h1
-rwxr-xr-xarch/arm/mach-omap2/lpddr2_elpida_data.c2
-rwxr-xr-xarch/arm/mach-omap2/pm44xx.c40
4 files changed, 54 insertions, 4 deletions
diff --git a/arch/arm/mach-omap2/emif.c b/arch/arm/mach-omap2/emif.c
index 83b7f83..e951167 100755
--- a/arch/arm/mach-omap2/emif.c
+++ b/arch/arm/mach-omap2/emif.c
@@ -534,8 +534,10 @@ static u32 get_ddr_phy_ctrl_1(u32 freq, u8 RL)
val = EMIF_DLL_SLAVE_DLY_CTRL_100_MHZ_AND_LESS;
else if (freq <= 200000000)
val = EMIF_DLL_SLAVE_DLY_CTRL_200_MHZ;
- else
+ else if (freq <= 400000000)
val = EMIF_DLL_SLAVE_DLY_CTRL_400_MHZ;
+ else
+ val = EMIF_DLL_SLAVE_DLY_CTRL_466_MHZ;
mask_n_set(phy, OMAP44XX_REG_DLL_SLAVE_DLY_CTRL_SHIFT,
OMAP44XX_REG_DLL_SLAVE_DLY_CTRL_MASK, val);
@@ -660,6 +662,17 @@ static void setup_registers(u32 emif_nr, struct emif_regs *regs, u32 volt_state)
mask_n_set(temp, OMAP44XX_REG_DDR_PHY_CTRL_1_SHDW_SHIFT,
OMAP44XX_REG_DDR_PHY_CTRL_1_SHDW_MASK,
regs->emif_ddr_phy_ctlr_1_final);
+
+ /*
+ * Set Read Latency value RL=0xB according to OMAP4470 LPDDR
+ * interface configuration update for 466 MHz
+ */
+ if (regs->freq == 466666666) {
+ mask_n_set(temp, OMAP44XX_REG_READ_LATENCY_SHDW_SHIFT,
+ OMAP44XX_REG_READ_LATENCY_SHDW_MASK,
+ regs->RL_final);
+ }
+
__raw_writel(temp, base + OMAP44XX_EMIF_DDR_PHY_CTRL_1_SHDW);
__raw_writel(regs->temp_alert_config,
diff --git a/arch/arm/mach-omap2/include/mach/emif.h b/arch/arm/mach-omap2/include/mach/emif.h
index f257241..18614c3 100644
--- a/arch/arm/mach-omap2/include/mach/emif.h
+++ b/arch/arm/mach-omap2/include/mach/emif.h
@@ -173,6 +173,7 @@
* values suggested by hw team.
*/
#define EMIF_DDR_PHY_CTRL_1_BASE_VAL 0x049FF
+#define EMIF_DLL_SLAVE_DLY_CTRL_466_MHZ 0x37
#define EMIF_DLL_SLAVE_DLY_CTRL_400_MHZ 0x41
#define EMIF_DLL_SLAVE_DLY_CTRL_200_MHZ 0x80
#define EMIF_DLL_SLAVE_DLY_CTRL_100_MHZ_AND_LESS 0xFF
diff --git a/arch/arm/mach-omap2/lpddr2_elpida_data.c b/arch/arm/mach-omap2/lpddr2_elpida_data.c
index a4148f9..ecfad06 100755
--- a/arch/arm/mach-omap2/lpddr2_elpida_data.c
+++ b/arch/arm/mach-omap2/lpddr2_elpida_data.c
@@ -16,7 +16,7 @@
const struct lpddr2_timings lpddr2_elpida_timings_466_mhz = {
.max_freq = 466666666,
- .RL = 7,
+ .RL = 11,
.tRPab = 21,
.tRCD = 18,
.tWR = 13,
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c
index 065a94f..74c7255 100755
--- a/arch/arm/mach-omap2/pm44xx.c
+++ b/arch/arm/mach-omap2/pm44xx.c
@@ -1126,6 +1126,37 @@ static u32 __init _usec_to_val_scrm(unsigned long rate, u32 usec,
}
+/*
+ * According to the OMAP4470 LPDDR interface configuration
+ * update for 466MHz Slew Rate should be set to “FASTEST”
+ * and Impedance Control to “Drv12”:
+ * - CONTROL_LPDDR2IOx_2[LPDDR2IO1_GR10_SR] = 0
+ * - CONTROL_LPDDR2IOx_2[LPDDR2IO1_GR10_I] = 7
+ * where x=[1-2]
+ */
+static void __init syscontrol_lpddr2io_config_update_466_mhz(void)
+{
+ u32 v;
+
+ pr_info("OMAP4470 LPDDR interface configuration update for 466 MHz\n");
+
+ /* Setup LPDDR2IO1_2 */
+ v = omap4_ctrl_pad_readl(
+ OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_2);
+ v &= ~OMAP4_LPDDR2IO1_GR10_SR_MASK;
+ v |= OMAP4_LPDDR2IO1_GR10_I_MASK;
+ omap4_ctrl_pad_writel(v,
+ OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_2);
+
+ /* Setup LPDDR2IO2_2 */
+ v = omap4_ctrl_pad_readl(
+ OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_2);
+ v &= ~OMAP4_LPDDR2IO2_GR10_SR_MASK;
+ v |= OMAP4_LPDDR2IO2_GR10_I_MASK;
+ omap4_ctrl_pad_writel(v,
+ OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_2);
+}
+
static void __init syscontrol_setup_regs(void)
{
u32 v;
@@ -1134,14 +1165,19 @@ static void __init syscontrol_setup_regs(void)
v = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_3);
v &= ~(OMAP4_LPDDR21_VREF_EN_CA_MASK | OMAP4_LPDDR21_VREF_EN_DQ_MASK);
v |= OMAP4_LPDDR21_VREF_AUTO_EN_CA_MASK | OMAP4_LPDDR21_VREF_AUTO_EN_DQ_MASK;
- omap4_ctrl_pad_writel(v, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_3);
+ omap4_ctrl_pad_writel(v,
+ OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO1_3);
v = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_3);
v &= ~(OMAP4_LPDDR21_VREF_EN_CA_MASK | OMAP4_LPDDR21_VREF_EN_DQ_MASK);
v |= OMAP4_LPDDR21_VREF_AUTO_EN_CA_MASK | OMAP4_LPDDR21_VREF_AUTO_EN_DQ_MASK;
- omap4_ctrl_pad_writel(v, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_3);
+ omap4_ctrl_pad_writel(v,
+ OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_LPDDR2IO2_3);
syscontrol_lpddr_clk_io_errata(true);
+
+ if (cpu_is_omap447x())
+ syscontrol_lpddr2io_config_update_466_mhz();
}
static void __init prcm_setup_regs(void)