|
@@ -70,6 +70,67 @@ u32 omap_boot_mode(void)
|
|
|
{
|
|
|
return omap4_boot_mode;
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Some tuning of IOs for optimal power and performance
|
|
|
+ */
|
|
|
+static void do_io_settings(void)
|
|
|
+{
|
|
|
+ u32 lpddr2io;
|
|
|
+ struct control_lpddr2io_regs *lpddr2io_regs =
|
|
|
+ (struct control_lpddr2io_regs *)LPDDR2_IO_REGS_BASE;
|
|
|
+ struct omap4_sys_ctrl_regs *const ctrl =
|
|
|
+ (struct omap4_sys_ctrl_regs *)SYSCTRL_GENERAL_CORE_BASE;
|
|
|
+
|
|
|
+ u32 omap4_rev = omap_revision();
|
|
|
+
|
|
|
+ if (omap4_rev == OMAP4430_ES1_0)
|
|
|
+ lpddr2io = CONTROL_LPDDR2IO_SLEW_125PS_DRV8_PULL_DOWN;
|
|
|
+ else if (omap4_rev == OMAP4430_ES2_0)
|
|
|
+ lpddr2io = CONTROL_LPDDR2IO_SLEW_325PS_DRV8_GATE_KEEPER;
|
|
|
+ else
|
|
|
+ lpddr2io = CONTROL_LPDDR2IO_SLEW_315PS_DRV12_PULL_DOWN;
|
|
|
+
|
|
|
+ /* EMIF1 */
|
|
|
+ writel(lpddr2io, &lpddr2io_regs->control_lpddr2io1_0);
|
|
|
+ writel(lpddr2io, &lpddr2io_regs->control_lpddr2io1_1);
|
|
|
+ /* No pull for GR10 as per hw team's recommendation */
|
|
|
+ writel(lpddr2io & ~LPDDR2IO_GR10_WD_MASK,
|
|
|
+ &lpddr2io_regs->control_lpddr2io1_2);
|
|
|
+ writel(CONTROL_LPDDR2IO_3_VAL, &lpddr2io_regs->control_lpddr2io1_3);
|
|
|
+
|
|
|
+ /* EMIF2 */
|
|
|
+ writel(lpddr2io, &lpddr2io_regs->control_lpddr2io2_0);
|
|
|
+ writel(lpddr2io, &lpddr2io_regs->control_lpddr2io2_1);
|
|
|
+ /* No pull for GR10 as per hw team's recommendation */
|
|
|
+ writel(lpddr2io & ~LPDDR2IO_GR10_WD_MASK,
|
|
|
+ &lpddr2io_regs->control_lpddr2io2_2);
|
|
|
+ writel(CONTROL_LPDDR2IO_3_VAL, &lpddr2io_regs->control_lpddr2io2_3);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Some of these settings (TRIM values) come from eFuse and are
|
|
|
+ * in turn programmed in the eFuse at manufacturing time after
|
|
|
+ * calibration of the device. Do the software over-ride only if
|
|
|
+ * the device is not correctly trimmed
|
|
|
+ */
|
|
|
+ if (!(readl(&ctrl->control_std_fuse_opp_bgap) & 0xFFFF)) {
|
|
|
+
|
|
|
+ writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
|
|
|
+ &ctrl->control_ldosram_iva_voltage_ctrl);
|
|
|
+
|
|
|
+ writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
|
|
|
+ &ctrl->control_ldosram_mpu_voltage_ctrl);
|
|
|
+
|
|
|
+ writel(LDOSRAM_VOLT_CTRL_OVERRIDE,
|
|
|
+ &ctrl->control_ldosram_core_voltage_ctrl);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!readl(&ctrl->control_efuse_1))
|
|
|
+ writel(CONTROL_EFUSE_1_OVERRIDE, &ctrl->control_efuse_1);
|
|
|
+
|
|
|
+ if (!readl(&ctrl->control_efuse_2))
|
|
|
+ writel(CONTROL_EFUSE_2_OVERRIDE, &ctrl->control_efuse_2);
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
void do_set_mux(u32 base, struct pad_conf_entry const *array, int size)
|
|
@@ -197,6 +258,7 @@ void s_init(void)
|
|
|
set_mux_conf_regs();
|
|
|
#ifdef CONFIG_SPL_BUILD
|
|
|
preloader_console_init();
|
|
|
+ do_io_settings();
|
|
|
#endif
|
|
|
prcm_init();
|
|
|
#ifdef CONFIG_SPL_BUILD
|