diff options
| -rw-r--r-- | arch/arm/include/asm/arch-omap5/omap.h | 7 | ||||
| -rw-r--r-- | drivers/mmc/omap_hsmmc.c | 33 | ||||
| -rw-r--r-- | drivers/power/twl6035.c | 25 | ||||
| -rw-r--r-- | include/twl6035.h | 1 | 
4 files changed, 63 insertions, 3 deletions
| diff --git a/arch/arm/include/asm/arch-omap5/omap.h b/arch/arm/include/asm/arch-omap5/omap.h index 272539296..d672b6f9d 100644 --- a/arch/arm/include/asm/arch-omap5/omap.h +++ b/arch/arm/include/asm/arch-omap5/omap.h @@ -125,9 +125,10 @@  /* CONTROL_EFUSE_2 */  #define CONTROL_EFUSE_2_NMOS_PMOS_PTV_CODE_1		0x00ffc000 -#define MMC1_PWRDNZ					(1 << 26) -#define MMC1_PBIASLITE_PWRDNZ				(1 << 22) -#define MMC1_PBIASLITE_VMODE				(1 << 21) +#define SDCARD_PWRDNZ					(1 << 26) +#define SDCARD_BIAS_HIZ_MODE				(1 << 25) +#define SDCARD_BIAS_PWRDNZ				(1 << 22) +#define SDCARD_PBIASLITE_VMODE				(1 << 21)  #ifndef __ASSEMBLY__ diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c index f421ff9ee..e3670d4ad 100644 --- a/drivers/mmc/omap_hsmmc.c +++ b/drivers/mmc/omap_hsmmc.c @@ -29,6 +29,7 @@  #include <i2c.h>  #include <twl4030.h>  #include <twl6030.h> +#include <twl6035.h>  #include <asm/io.h>  #include <asm/arch/mmc_host_def.h>  #include <asm/arch/sys_proto.h> @@ -60,6 +61,34 @@ static void omap4_vmmc_pbias_config(struct mmc *mmc)  }  #endif +#if defined(CONFIG_OMAP54XX) && defined(CONFIG_TWL6035_POWER) +static void omap5_pbias_config(struct mmc *mmc) +{ +	u32 value = 0; +	struct omap_sys_ctrl_regs *const ctrl = +		(struct omap_sys_ctrl_regs *) SYSCTRL_GENERAL_CORE_BASE; + +	value = readl(&ctrl->control_pbias); +	value &= ~(SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ); +	value |= SDCARD_BIAS_HIZ_MODE; +	writel(value, &ctrl->control_pbias); + +	twl6035_mmc1_poweron_ldo(); + +	value = readl(&ctrl->control_pbias); +	value &= ~SDCARD_BIAS_HIZ_MODE; +	value |= SDCARD_PBIASLITE_VMODE | SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ; +	writel(value, &ctrl->control_pbias); + +	value = readl(&ctrl->control_pbias); +	if (value & (1 << 23)) { +		value &= ~(SDCARD_PWRDNZ | SDCARD_BIAS_PWRDNZ); +		value |= SDCARD_BIAS_HIZ_MODE; +		writel(value, &ctrl->control_pbias); +	} +} +#endif +  unsigned char mmc_board_init(struct mmc *mmc)  {  #if defined(CONFIG_TWL4030_POWER) @@ -99,6 +128,10 @@ unsigned char mmc_board_init(struct mmc *mmc)  	if (mmc->block_dev.dev == 0)  		omap4_vmmc_pbias_config(mmc);  #endif +#if defined(CONFIG_OMAP54XX) && defined(CONFIG_TWL6035_POWER) +	if (mmc->block_dev.dev == 0) +		omap5_pbias_config(mmc); +#endif  	return 0;  } diff --git a/drivers/power/twl6035.c b/drivers/power/twl6035.c index d75212c96..624c09e85 100644 --- a/drivers/power/twl6035.c +++ b/drivers/power/twl6035.c @@ -34,7 +34,32 @@ int twl6035_i2c_read_u8(u8 chip_no, u8 *val, u8 reg)  	return i2c_read(chip_no, reg, 1, val, 1);  } +/* To align with i2c mw/mr address, reg, val command syntax */ +static inline int palmas_write_u8(u8 chip_no, u8 reg, u8 val) +{ +	return i2c_write(chip_no, reg, 1, &val, 1); +} + +static inline int palmas_read_u8(u8 chip_no, u8 reg, u8 *val) +{ +	return i2c_read(chip_no, reg, 1, val, 1); +} +  void twl6035_init_settings(void)  {  	return;  } + +void twl6035_mmc1_poweron_ldo(void) +{ +	u8 val = 0; + +	/* set LDO9 TWL6035 to 3V */ +	val = 0x2b; /* (3 -.9)*28 +1 */ +	palmas_write_u8(0x48, LDO9_VOLTAGE, val); + +	/* TURN ON LDO9 */ +	val = LDO_ON | LDO_MODE_SLEEP | LDO_MODE_ACTIVE; +	palmas_write_u8(0x48, LDO9_CTRL, val); +	return; +} diff --git a/include/twl6035.h b/include/twl6035.h index 1e133175d..e21ddbaf2 100644 --- a/include/twl6035.h +++ b/include/twl6035.h @@ -39,3 +39,4 @@  int twl6035_i2c_write_u8(u8 chip_no, u8 val, u8 reg);  int twl6035_i2c_read_u8(u8 chip_no, u8 *val, u8 reg);  void twl6035_init_settings(void); +void twl6035_mmc1_poweron_ldo(void); |