aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd
diff options
context:
space:
mode:
authorOleksandr Dmytryshyn <oleksandr.dmytryshyn@ti.com>2012-03-28 09:45:30 +0300
committerZiyann <jaraidaniel@gmail.com>2014-10-01 12:57:34 +0200
commitedca5f47fa1380a6eece7e71ff2fbc68e3c35fbf (patch)
tree96a5a7cd8f3eaeb2e7453724007369592f018818 /drivers/mfd
parent5a7f468141bf5a3f055118cea990e72f833852ad (diff)
downloadkernel_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.c35
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)) {