diff options
author | Oleksandr Dmytryshyn <oleksandr.dmytryshyn@ti.com> | 2012-03-28 09:45:30 +0300 |
---|---|---|
committer | Ziyann <jaraidaniel@gmail.com> | 2014-10-01 12:57:34 +0200 |
commit | edca5f47fa1380a6eece7e71ff2fbc68e3c35fbf (patch) | |
tree | 96a5a7cd8f3eaeb2e7453724007369592f018818 /drivers/mfd | |
parent | 5a7f468141bf5a3f055118cea990e72f833852ad (diff) | |
download | kernel_samsung_tuna-edca5f47fa1380a6eece7e71ff2fbc68e3c35fbf.tar.gz kernel_samsung_tuna-edca5f47fa1380a6eece7e71ff2fbc68e3c35fbf.tar.bz2 kernel_samsung_tuna-edca5f47fa1380a6eece7e71ff2fbc68e3c35fbf.zip |
OMAP4: Regulator: Perform additional check for some LDOs
For TWL6032 revision < ES1.1 with EEPROM revision < rev56.0
LDO6 and LDOLN must be always ON because of the hardware
bug in the TWL6032. For TWL6032 revision >= ES1.1 with
EEPROM revision >= rev56.0 those LDOs can be off in sleep-mode.
If LDO6 or LDOLN is always on then SYSEN must be always on.
This patch performs additional checks.
Change-Id: I81e8e1a9dfdb628849277f4c3b4363bd0146cac4
Signed-off-by: Oleksandr Dmytryshyn <oleksandr.dmytryshyn@ti.com>
Diffstat (limited to 'drivers/mfd')
-rw-r--r-- | drivers/mfd/twl-core.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 2340bacc2a4..acc65075c71 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -230,6 +230,10 @@ /* need to access USB_PRODUCT_ID_LSB to identify which 6030 varient we are */ #define USB_PRODUCT_ID_LSB 0x02 +/* need to check eeprom revision and jtagver number */ +#define TWL6030_REG_EPROM_REV 0xdf +#define TWL6030_REG_JTAGVERNUM 0x87 + /*----------------------------------------------------------------------*/ /* is driver active, bound to a chip? */ @@ -641,6 +645,9 @@ add_regulator(int num, struct regulator_init_data *pdata, return add_regulator_linked(num, pdata, NULL, 0, features); } +#define SET_LDO_STATE_MEM(ldo, state) \ + ldo->constraints.state_mem.disabled = state + /* * NOTE: We know the first 8 IRQs after pdata->base_irq are * for the PIH, and the next are for the PWR_INT SIH, since @@ -652,6 +659,8 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) { struct device *child; unsigned sub_chip_id; + u8 eepromrev = 0; + u8 twlrev = 0; if (twl_has_gpio() && pdata->gpio) { child = add_child(SUB_CHIP_ID1, "twl4030_gpio", @@ -926,6 +935,32 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) return PTR_ERR(child); } + if (twl_has_regulator() && twl_class_is_6030()) { + /* + * For TWL6032 revision < ES1.1 with EEPROM revision < rev56.0 + * LDO6 and LDOLN must be always ON + * if LDO6 or LDOLN is always on then SYSEN must be always on + * for TWL6030 or TWL6032 revision >= ES1.1 with EEPROM + * revision >= rev56.0 those LDOs can be off in sleep-mode + */ + if (features & TWL6032_SUBCLASS) { + twl_i2c_read_u8(TWL6030_MODULE_ID2, &eepromrev, + TWL6030_REG_EPROM_REV); + + twl_i2c_read_u8(TWL6030_MODULE_ID2, &twlrev, + TWL6030_REG_JTAGVERNUM); + + if ((eepromrev < 56) && (twlrev < 1)) { + SET_LDO_STATE_MEM(pdata->ldo6, false); + SET_LDO_STATE_MEM(pdata->ldoln, false); + SET_LDO_STATE_MEM(pdata->sysen, false); + WARN(1, "This TWL6032 is an older revision that " + "does not support low power " + "measurements\n"); + } + } + } + /* twl6030 regulators */ if (twl_has_regulator() && twl_class_is_6030() && !(features & TWL6032_SUBCLASS)) { |