Merge remote-tracking branch 'goog/android-master' into android-omap-tungsten
diff --git a/arch/arm/cpu/armv7/omap4/clocks.c b/arch/arm/cpu/armv7/omap4/clocks.c
index c877758..ae91fc1 100644
--- a/arch/arm/cpu/armv7/omap4/clocks.c
+++ b/arch/arm/cpu/armv7/omap4/clocks.c
@@ -36,15 +36,13 @@
#include <asm/arch/sys_proto.h>
#include <asm/utils.h>
#include <asm/omap_gpio.h>
+#include <asm/arch/emif.h>
-#ifndef CONFIG_OMAP4430_ES1_0_MPU_DPLL
-#define CONFIG_OMAP4430_ES1_0_MPU_DPLL mpu_dpll_params_1200mhz
-#endif
-#ifndef CONFIG_OMAP4430_non_ES1_0_MPU_DPLL
-#define CONFIG_OMAP4430_non_ES1_0_MPU_DPLL mpu_dpll_params_1584mhz
+#ifndef CONFIG_OMAP4430_MPU_DPLL
+#define CONFIG_OMAP4430_MPU_DPLL mpu_dpll_params_1200mhz
#endif
#ifndef CONFIG_OMAP4460_MPU_DPLL
-#define CONFIG_OMAP4460_MPU_DPLL mpu_dpll_params_1840mhz
+#define CONFIG_OMAP4460_MPU_DPLL mpu_dpll_params_1400mhz
#endif
#define str(s) #s
@@ -85,15 +83,15 @@
* Please use this tool for creating the table for any new frequency.
*/
-/* dpll locked at 1840 MHz MPU clk at 920 MHz(OPP Turbo 4460) - DCC OFF */
-static const struct dpll_params mpu_dpll_params_1840mhz[NUM_SYS_CLKS] = {
- {230, 2, 1, -1, -1, -1, -1, -1}, /* 12 MHz */
- {920, 12, 1, -1, -1, -1, -1, -1}, /* 13 MHz */
- {219, 3, 1, -1, -1, -1, -1, -1}, /* 16.8 MHz */
- {575, 11, 1, -1, -1, -1, -1, -1}, /* 19.2 MHz */
- {460, 12, 1, -1, -1, -1, -1, -1}, /* 26 MHz */
- {920, 26, 1, -1, -1, -1, -1, -1}, /* 27 MHz */
- {575, 23, 1, -1, -1, -1, -1, -1} /* 38.4 MHz */
+/* dpll locked at 1400 MHz MPU clk at 700 MHz(OPP100) - DCC OFF */
+static const struct dpll_params mpu_dpll_params_1400mhz[NUM_SYS_CLKS] = {
+ {175, 2, 1, -1, -1, -1, -1, -1}, /* 12 MHz */
+ {700, 12, 1, -1, -1, -1, -1, -1}, /* 13 MHz */
+ {125, 2, 1, -1, -1, -1, -1, -1}, /* 16.8 MHz */
+ {401, 10, 1, -1, -1, -1, -1, -1}, /* 19.2 MHz */
+ {350, 12, 1, -1, -1, -1, -1, -1}, /* 26 MHz */
+ {700, 26, 1, -1, -1, -1, -1, -1}, /* 27 MHz */
+ {638, 34, 1, -1, -1, -1, -1, -1} /* 38.4 MHz */
};
/* dpll locked at 700 MHz MPU clk at 350 MHz(OPP50 4460) - DCC OFF */
@@ -130,34 +128,34 @@
};
static const struct dpll_params core_dpll_params_1600mhz[NUM_SYS_CLKS] = {
- {200, 2, 1, 5, 8, 4, 6, 5}, /* 12 MHz */
- {800, 12, 1, 5, 8, 4, 6, 5}, /* 13 MHz */
- {619, 12, 1, 5, 8, 4, 6, 5}, /* 16.8 MHz */
- {125, 2, 1, 5, 8, 4, 6, 5}, /* 19.2 MHz */
- {400, 12, 1, 5, 8, 4, 6, 5}, /* 26 MHz */
- {800, 26, 1, 5, 8, 4, 6, 5}, /* 27 MHz */
- {125, 5, 1, 5, 8, 4, 6, 5} /* 38.4 MHz */
+ {200, 2, 1, 5, 8, 4, 6, 6}, /* 12 MHz */
+ {800, 12, 1, 5, 8, 4, 6, 6}, /* 13 MHz */
+ {619, 12, 1, 5, 8, 4, 6, 6}, /* 16.8 MHz */
+ {125, 2, 1, 5, 8, 4, 6, 6}, /* 19.2 MHz */
+ {400, 12, 1, 5, 8, 4, 6, 6}, /* 26 MHz */
+ {800, 26, 1, 5, 8, 4, 6, 6}, /* 27 MHz */
+ {125, 5, 1, 5, 8, 4, 6, 6} /* 38.4 MHz */
};
static const struct dpll_params core_dpll_params_es1_1524mhz[NUM_SYS_CLKS] = {
- {127, 1, 1, 5, 8, 4, 6, 5}, /* 12 MHz */
- {762, 12, 1, 5, 8, 4, 6, 5}, /* 13 MHz */
- {635, 13, 1, 5, 8, 4, 6, 5}, /* 16.8 MHz */
- {635, 15, 1, 5, 8, 4, 6, 5}, /* 19.2 MHz */
- {381, 12, 1, 5, 8, 4, 6, 5}, /* 26 MHz */
- {254, 8, 1, 5, 8, 4, 6, 5}, /* 27 MHz */
- {496, 24, 1, 5, 8, 4, 6, 5} /* 38.4 MHz */
+ {127, 1, 1, 5, 8, 4, 6, 6}, /* 12 MHz */
+ {762, 12, 1, 5, 8, 4, 6, 6}, /* 13 MHz */
+ {635, 13, 1, 5, 8, 4, 6, 6}, /* 16.8 MHz */
+ {635, 15, 1, 5, 8, 4, 6, 6}, /* 19.2 MHz */
+ {381, 12, 1, 5, 8, 4, 6, 6}, /* 26 MHz */
+ {254, 8, 1, 5, 8, 4, 6, 6}, /* 27 MHz */
+ {496, 24, 1, 5, 8, 4, 6, 6} /* 38.4 MHz */
};
static const struct dpll_params
core_dpll_params_es2_1600mhz_ddr200mhz[NUM_SYS_CLKS] = {
- {200, 2, 2, 5, 8, 4, 6, 5}, /* 12 MHz */
- {800, 12, 2, 5, 8, 4, 6, 5}, /* 13 MHz */
- {619, 12, 2, 5, 8, 4, 6, 5}, /* 16.8 MHz */
- {125, 2, 2, 5, 8, 4, 6, 5}, /* 19.2 MHz */
- {400, 12, 2, 5, 8, 4, 6, 5}, /* 26 MHz */
- {800, 26, 2, 5, 8, 4, 6, 5}, /* 27 MHz */
- {125, 5, 2, 5, 8, 4, 6, 5} /* 38.4 MHz */
+ {200, 2, 2, 5, 8, 4, 6, 6}, /* 12 MHz */
+ {800, 12, 2, 5, 8, 4, 6, 6}, /* 13 MHz */
+ {619, 12, 2, 5, 8, 4, 6, 6}, /* 16.8 MHz */
+ {125, 2, 2, 5, 8, 4, 6, 6}, /* 19.2 MHz */
+ {400, 12, 2, 5, 8, 4, 6, 6}, /* 26 MHz */
+ {800, 26, 2, 5, 8, 4, 6, 6}, /* 27 MHz */
+ {125, 5, 2, 5, 8, 4, 6, 6} /* 38.4 MHz */
};
static const struct dpll_params per_dpll_params_1536mhz[NUM_SYS_CLKS] = {
@@ -381,10 +379,10 @@
/*
* Lock MPU dpll
*
- * Resulting MPU frequencies:
+ * Resulting MPU frequencies (OPP_NUM):
* 4430 ES1.0 : 600 MHz
- * 4430 ES2.x : 792 MHz (OPP Turbo)
- * 4460 : 920 MHz (OPP Turbo) - DCC disabled
+ * 4430 ES2.x : 600 MHz
+ * 4460 : 700 MHz
*/
void configure_mpu_dpll(void)
{
@@ -395,11 +393,8 @@
omap4_rev = omap_revision();
sysclk_ind = get_sys_clk_index();
- if (omap4_rev == OMAP4430_ES1_0)
- SET_MPU_DPLL_PARAMS(params, CONFIG_OMAP4430_ES1_0_MPU_DPLL,
- sysclk_ind);
- else if (omap4_rev < OMAP4460_ES1_0)
- SET_MPU_DPLL_PARAMS(params, CONFIG_OMAP4430_non_ES1_0_MPU_DPLL,
+ if (omap4_rev < OMAP4460_ES1_0)
+ SET_MPU_DPLL_PARAMS(params, CONFIG_OMAP4430_MPU_DPLL,
sysclk_ind);
else
SET_MPU_DPLL_PARAMS(params, CONFIG_OMAP4460_MPU_DPLL,
@@ -425,6 +420,13 @@
debug("MPU DPLL locked\n");
}
+static void init_m2_core_dpll(u32 *const base, int m2)
+{
+ struct dpll_regs *const dpll_regs = (struct dpll_regs *)base;
+
+ writel(m2, &dpll_regs->cm_div_m2_dpll);
+}
+
static void setup_dplls(void)
{
u32 sysclk_ind, temp;
@@ -435,12 +437,17 @@
/* CORE dpll */
params = get_core_dpll_params(); /* default - safest */
+
/*
- * Do not lock the core DPLL now. Just set it up.
- * Core DPLL will be locked after setting up EMIF
- * using the FREQ_UPDATE method(freq_update_core())
+ * Lock the core DPLL here to get the right sequence.
+ * But set the M2 post divider to a maximum value so that
+ * emif/ddr freqeuncy is at a low value for the beginning.
+ * FREQ_UPDATE method(freq_update_core()) updates the correct
+ * m2 later.
*/
- do_setup_dpll(&prcm->cm_clkmode_dpll_core, params, DPLL_NO_LOCK);
+ do_setup_dpll(&prcm->cm_clkmode_dpll_core, params, DPLL_LOCK);
+ init_m2_core_dpll(&prcm->cm_clkmode_dpll_core, CORE_DPLL_M2_INIT);
+
/* Set the ratios for CORE_CLK, L3_CLK, L4_CLK */
temp = (CLKSEL_CORE_X2_DIV_1 << CLKSEL_CORE_SHIFT) |
(CLKSEL_L3_CORE_DIV_2 << CLKSEL_L3_SHIFT) |
@@ -448,13 +455,14 @@
writel(temp, &prcm->cm_clksel_core);
debug("Core DPLL configured\n");
+ /* MPU dpll */
+ configure_mpu_dpll();
+
/* lock PER dpll */
do_setup_dpll(&prcm->cm_clkmode_dpll_per,
&per_dpll_params_1536mhz[sysclk_ind], DPLL_LOCK);
debug("PER DPLL locked\n");
- /* MPU dpll */
- configure_mpu_dpll();
}
static void setup_non_essential_dplls(void)
diff --git a/arch/arm/cpu/armv7/omap4/emif.c b/arch/arm/cpu/armv7/omap4/emif.c
index 45c88ab..77fcc20 100644
--- a/arch/arm/cpu/armv7/omap4/emif.c
+++ b/arch/arm/cpu/armv7/omap4/emif.c
@@ -1230,10 +1230,6 @@
in_sdram = running_from_sdram();
debug("in_sdram = %d\n", in_sdram);
- if (!in_sdram) {
- bypass_dpll(&prcm->cm_clkmode_dpll_core);
- }
-
do_sdram_init(OMAP44XX_EMIF1);
do_sdram_init(OMAP44XX_EMIF2);
diff --git a/arch/arm/include/asm/arch-omap4/emif.h b/arch/arm/include/asm/arch-omap4/emif.h
index 3a549ba..35a7a4d 100644
--- a/arch/arm/include/asm/arch-omap4/emif.h
+++ b/arch/arm/include/asm/arch-omap4/emif.h
@@ -907,6 +907,12 @@
#define MR8_IO_WIDTH_SHIFT 0x6
#define MR8_IO_WIDTH_MASK (0x3 << 0x6)
+/*
+ * CORE DPLL m2 divider init, set to maximum
+ * to have the lowest possible frequency.
+ */
+#define CORE_DPLL_M2_INIT 0x1F
+
struct lpddr2_addressing {
u8 num_banks;
u8 t_REFI_us_x10;
diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
index fbac289..b65f72c 100644
--- a/drivers/mmc/omap_hsmmc.c
+++ b/drivers/mmc/omap_hsmmc.c
@@ -734,6 +734,10 @@
*/
if ((get_cpu_family() == CPU_OMAP34XX) && (get_cpu_rev() <= CPU_3XX_ES21))
mmc->b_max = 1;
+
+ /* MMC1 and MMC2 support 8-bit, but MMC0 only supports 4-bit */
+ if (dev_index != 0)
+ mmc->host_caps |= MMC_MODE_8BIT;
#endif
mmc_register(mmc);
diff --git a/drivers/usb/phy/twl4030.c b/drivers/usb/phy/twl4030.c
index 54d2e61..6dcf6c9 100644
--- a/drivers/usb/phy/twl4030.c
+++ b/drivers/usb/phy/twl4030.c
@@ -118,10 +118,22 @@
{
u8 pwr, clk;
- /* Power the PHY */
+ /* First make sure PHY is powered down to
+ * clear any state from a previous reboot and
+ * force unenumeration. Otherwise, sometimes
+ * the device doesn't enumerate properly on
+ * a warm reboot.
+ */
+
+ /* Power down the PHY */
pwr = twl4030_usb_read(TWL4030_USB_PHY_PWR_CTRL);
+ pwr |= PHYPWD;
+ twl4030_usb_write(TWL4030_USB_PHY_PWR_CTRL, pwr);
+
+ /* Power the PHY */
pwr &= ~PHYPWD;
twl4030_usb_write(TWL4030_USB_PHY_PWR_CTRL, pwr);
+
/* Enable clocks */
clk = twl4030_usb_read(TWL4030_USB_PHY_CLK_CTRL);
clk |= CLOCKGATING_EN | CLK32K_EN;
@@ -139,6 +151,8 @@
long timeout = 1000 * 1000; /* 1 sec */;
u8 clk, sts, pwr;
+ i2c_set_bus_num(0);
+
/* twl4030 ldo init */
twl4030_usb_ldo_init();