ARM: OMAP4+: Add support for getting pbias info from board
authorLokesh Vutla <lokeshvutla@ti.com>
Wed, 23 Nov 2016 07:55:28 +0000 (13:25 +0530)
committerTom Rini <trini@konsulko.com>
Sun, 4 Dec 2016 18:54:51 +0000 (13:54 -0500)
Palmas driver assumes it is always TPS659xx regulator on all DRA7xx based
boards to enable mmc regulator. This is not true always like in case of
DRA71x-evm. So get this information based on the board.

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
Signed-off-by: Vignesh R <vigneshr@ti.com>
Signed-off-by: Nishanth Menon <nm@ti.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
[trini: Delete omap4_vmmc_pbias_config from omap_hsmmc.c]
Signed-off-by: Tom Rini <trini@konsulko.com>
arch/arm/include/asm/omap_mmc.h
arch/arm/mach-omap2/omap4/hwinit.c
arch/arm/mach-omap2/omap5/hwinit.c
drivers/mmc/omap_hsmmc.c
drivers/power/palmas.c
include/palmas.h

index b69d0731e1f86a1fb8da301f1541fc570ae3ae53..f2bf645b33b1d438c6aaf10d27e388e8ac8b6bec 100644 (file)
@@ -167,5 +167,5 @@ struct hsmmc {
 int omap_mmc_init(int dev_index, uint host_caps_mask, uint f_max, int cd_gpio,
                int wp_gpio);
 
-
+void vmmc_pbias_config(uint voltage);
 #endif /* OMAP_MMC_H_ */
index 7c6638ca80dc30ac72cd743d9d80344c4d561808..67ab1ccd75b3afef131cda93591d7c2ae4d1690e 100644 (file)
@@ -12,6 +12,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #include <common.h>
+#include <palmas.h>
 #include <asm/armv7.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/sys_proto.h>
@@ -175,3 +176,15 @@ void v7_outer_cache_disable(void)
        omap_smc1(OMAP4_SERVICE_PL310_CONTROL_REG_SET, 0);
 }
 #endif /* !CONFIG_SYS_L2CACHE_OFF */
+
+void vmmc_pbias_config(uint voltage)
+{
+       u32 value = 0;
+
+       value = readl((*ctrl)->control_pbiaslite);
+       value &= ~(MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ);
+       writel(value, (*ctrl)->control_pbiaslite);
+       value = readl((*ctrl)->control_pbiaslite);
+       value |= MMC1_PBIASLITE_VMODE | MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ;
+       writel(value, (*ctrl)->control_pbiaslite);
+}
index e3ac8bbe9524744860c69c966364fd9392cb1f86..839d79d10204a97f8e3c6a91191dd6be1ddcb034 100644 (file)
@@ -13,6 +13,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 #include <common.h>
+#include <palmas.h>
 #include <asm/armv7.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/sys_proto.h>
@@ -451,3 +452,36 @@ void v7_arch_cp15_set_acr(u32 acr, u32 cpu_midr, u32 cpu_rev_comb,
 #endif
        omap_smc1(OMAP5_SERVICE_ACR_SET, acr);
 }
+
+#if defined(CONFIG_PALMAS_POWER)
+void vmmc_pbias_config(uint voltage)
+{
+       u32 value = 0;
+       struct vcores_data const *vcores = *omap_vcores;
+
+       value = readl((*ctrl)->control_pbias);
+       value &= ~SDCARD_PWRDNZ;
+       writel(value, (*ctrl)->control_pbias);
+       udelay(10); /* wait 10 us */
+       value &= ~SDCARD_BIAS_PWRDNZ;
+       writel(value, (*ctrl)->control_pbias);
+
+       if (vcores->core.pmic->i2c_slave_addr == 0x60) {
+               if (voltage == LDO_VOLT_3V0)
+                       voltage = 0x19;
+               else if (voltage == LDO_VOLT_1V8)
+                       voltage = 0xa;
+               lp873x_mmc1_poweron_ldo(voltage);
+       } else {
+               palmas_mmc1_poweron_ldo(voltage);
+       }
+
+       value = readl((*ctrl)->control_pbias);
+       value |= SDCARD_BIAS_PWRDNZ;
+       writel(value, (*ctrl)->control_pbias);
+       udelay(150); /* wait 150 us */
+       value |= SDCARD_PWRDNZ;
+       writel(value, (*ctrl)->control_pbias);
+       udelay(150); /* wait 150 us */
+}
+#endif
index 020db98462830a9878c0dfa8b369f77eefdd2749..0a1ee407a1842c94bc2a87a41d04c1850919e0f7 100644 (file)
@@ -96,44 +96,6 @@ static int omap_mmc_setup_gpio_in(int gpio, const char *label)
 }
 #endif
 
-#if defined(CONFIG_OMAP44XX)
-static void omap4_vmmc_pbias_config(struct mmc *mmc)
-{
-       u32 value = 0;
-
-       value = readl((*ctrl)->control_pbiaslite);
-       value &= ~(MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ);
-       writel(value, (*ctrl)->control_pbiaslite);
-       value = readl((*ctrl)->control_pbiaslite);
-       value |= MMC1_PBIASLITE_VMODE | MMC1_PBIASLITE_PWRDNZ | MMC1_PWRDNZ;
-       writel(value, (*ctrl)->control_pbiaslite);
-}
-#endif
-
-#if defined(CONFIG_OMAP54XX) && defined(CONFIG_PALMAS_POWER)
-static void omap5_pbias_config(struct mmc *mmc)
-{
-       u32 value = 0;
-
-       value = readl((*ctrl)->control_pbias);
-       value &= ~SDCARD_PWRDNZ;
-       writel(value, (*ctrl)->control_pbias);
-       udelay(10); /* wait 10 us */
-       value &= ~SDCARD_BIAS_PWRDNZ;
-       writel(value, (*ctrl)->control_pbias);
-
-       palmas_mmc1_poweron_ldo();
-
-       value = readl((*ctrl)->control_pbias);
-       value |= SDCARD_BIAS_PWRDNZ;
-       writel(value, (*ctrl)->control_pbias);
-       udelay(150); /* wait 150 us */
-       value |= SDCARD_PWRDNZ;
-       writel(value, (*ctrl)->control_pbias);
-       udelay(150); /* wait 150 us */
-}
-#endif
-
 static unsigned char mmc_board_init(struct mmc *mmc)
 {
 #if defined(CONFIG_OMAP34XX)
@@ -173,14 +135,10 @@ static unsigned char mmc_board_init(struct mmc *mmc)
                &prcm_base->iclken1_core);
 #endif
 
-#if defined(CONFIG_OMAP44XX)
+#if defined(CONFIG_OMAP54XX) || defined(CONFIG_OMAP44XX)
        /* PBIAS config needed for MMC1 only */
        if (mmc->block_dev.devnum == 0)
-               omap4_vmmc_pbias_config(mmc);
-#endif
-#if defined(CONFIG_OMAP54XX) && defined(CONFIG_PALMAS_POWER)
-       if (mmc->block_dev.devnum == 0)
-               omap5_pbias_config(mmc);
+               vmmc_pbias_config(LDO_VOLT_3V0);
 #endif
 
        return 0;
@@ -214,7 +172,6 @@ void mmc_init_stream(struct hsmmc *mmc_base)
        writel(readl(&mmc_base->con) & ~INIT_INITSTREAM, &mmc_base->con);
 }
 
-
 static int omap_hsmmc_init_setup(struct mmc *mmc)
 {
        struct hsmmc *mmc_base;
index cfbc9dc52208c3434f5e062acd9c14d11ecae334..4f9a62cb34b2aaf08f72abea2a60e0168b4789d1 100644 (file)
@@ -23,7 +23,26 @@ void palmas_init_settings(void)
 #endif
 }
 
-int palmas_mmc1_poweron_ldo(void)
+#if defined(CONFIG_OMAP54XX)
+int lp873x_mmc1_poweron_ldo(uint voltage)
+{
+       if (palmas_i2c_write_u8(LP873X_LDO1_ADDR, LP873X_LDO1_VOLTAGE,
+                               voltage)) {
+               printf("lp873x: could not set LDO1 voltage.\n");
+               return 1;
+       }
+       /* TURN ON LDO1 */
+       if (palmas_i2c_write_u8(LP873X_LDO1_ADDR, LP873X_LDO1_CTRL,
+                               LP873X_LDO_CTRL_EN | LP873X_LDO_CTRL_RDIS_EN)) {
+               printf("lp873x: could not turn on LDO1.\n");
+               return 1;
+       }
+       return 0;
+
+}
+#endif
+
+int palmas_mmc1_poweron_ldo(uint voltage)
 {
        u8 val = 0;
 
index cca3f9a9d19cca4cc7c8e6a82f1926c16d77f248..d676617344cf122e34a52e30c16f9bf3e40c0f0c 100644 (file)
 #define LDO1_CTRL              0x50
 #define LDO1_VOLTAGE           0x51
 
+/* LDO1 control/voltage for LP873x */
+#define LP873X_LDO1_ADDR       0x60
+#define LP873X_LDO1_CTRL       0x9
+#define LP873X_LDO1_VOLTAGE    0xa
+#define LP873X_LDO_VOLT_3V0    0x19
+#define LP873X_LDO_VOLT_1V8    0xa
+#define LP873X_LDO_CTRL_EN     (0x1 << 0)
+#define LP873X_LDO_CTRL_EN_PINCTRL     (0x1 << 1)
+#define LP873X_LDO_CTRL_RDIS_EN        (0x1 << 2)
+
 /* LDO2 control/voltage */
 #define LDO2_CTRL              0x52
 #define LDO2_VOLTAGE           0x53
@@ -119,7 +129,8 @@ static inline int palmas_i2c_read_u8(u8 chip_no, u8 reg, u8 *val)
 }
 
 void palmas_init_settings(void);
-int palmas_mmc1_poweron_ldo(void);
+int palmas_mmc1_poweron_ldo(uint voltage);
+int lp873x_mmc1_poweron_ldo(uint voltage);
 int twl603x_mmc1_set_ldo9(u8 vsel);
 int twl603x_audio_power(u8 on);
 int twl603x_enable_bb_charge(u8 bb_fields);