diff options
Diffstat (limited to 'recipes/linux/linux-omap-2.6.39/mfd/0011-MFD-TWL4030-TWL-version-checking.patch')
-rw-r--r-- | recipes/linux/linux-omap-2.6.39/mfd/0011-MFD-TWL4030-TWL-version-checking.patch | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.39/mfd/0011-MFD-TWL4030-TWL-version-checking.patch b/recipes/linux/linux-omap-2.6.39/mfd/0011-MFD-TWL4030-TWL-version-checking.patch new file mode 100644 index 0000000000..6de2193d0f --- /dev/null +++ b/recipes/linux/linux-omap-2.6.39/mfd/0011-MFD-TWL4030-TWL-version-checking.patch @@ -0,0 +1,164 @@ +From 3ceb224732230934aba7d082f3e2ca96c14a9ca0 Mon Sep 17 00:00:00 2001 +From: Lesly A M <leslyam@ti.com> +Date: Wed, 1 Jun 2011 14:56:56 -0700 +Subject: [PATCH 11/13] MFD: TWL4030: TWL version checking + +Added API to get the TWL5030 Si version from the IDCODE register. +It is used for enabling the workaround for TWL erratum 27. + +Signed-off-by: Lesly A M <leslyam@ti.com> +Cc: Nishanth Menon <nm@ti.com> +Cc: David Derrick <dderrick@ti.com> +Cc: Samuel Ortiz <sameo@linux.intel.com> +--- + drivers/mfd/twl-core.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++ + include/linux/i2c/twl.h | 17 ++++++++++++- + 2 files changed, 78 insertions(+), 1 deletions(-) + +diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c +index 9096d7d..a60601d 100644 +--- a/drivers/mfd/twl-core.c ++++ b/drivers/mfd/twl-core.c +@@ -251,6 +251,9 @@ + /* is driver active, bound to a chip? */ + static bool inuse; + ++/* TWL IDCODE Register value */ ++static u32 twl_idcode; ++ + static unsigned int twl_id; + unsigned int twl_rev(void) + { +@@ -509,6 +512,58 @@ EXPORT_SYMBOL(twl_i2c_read_u8); + + /*----------------------------------------------------------------------*/ + ++/** ++ * twl_read_idcode_register - API to read the IDCODE register. ++ * ++ * Unlocks the IDCODE register and read the 32 bit value. ++ */ ++static int twl_read_idcode_register(void) ++{ ++ int err; ++ ++ err = twl_i2c_write_u8(TWL4030_MODULE_INTBR, TWL_EEPROM_R_UNLOCK, ++ REG_UNLOCK_TEST_REG); ++ if (err) { ++ pr_err("TWL4030 Unable to unlock IDCODE registers -%d\n", err); ++ goto fail; ++ } ++ ++ err = twl_i2c_read(TWL4030_MODULE_INTBR, (u8 *)(&twl_idcode), ++ REG_IDCODE_7_0, 4); ++ if (err) { ++ pr_err("TWL4030: unable to read IDCODE -%d\n", err); ++ goto fail; ++ } ++ ++ err = twl_i2c_write_u8(TWL4030_MODULE_INTBR, 0x0, REG_UNLOCK_TEST_REG); ++ if (err) ++ pr_err("TWL4030 Unable to relock IDCODE registers -%d\n", err); ++fail: ++ return err; ++} ++ ++/** ++ * twl_get_type - API to get TWL Si type. ++ * ++ * Api to get the TWL Si type from IDCODE value. ++ */ ++int twl_get_type(void) ++{ ++ return TWL_SIL_TYPE(twl_idcode); ++} ++EXPORT_SYMBOL_GPL(twl_get_type); ++ ++/** ++ * twl_get_version - API to get TWL Si version. ++ * ++ * Api to get the TWL Si version from IDCODE value. ++ */ ++int twl_get_version(void) ++{ ++ return TWL_SIL_REV(twl_idcode); ++} ++EXPORT_SYMBOL_GPL(twl_get_version); ++ + static struct device * + add_numbered_child(unsigned chip, const char *name, int num, + void *pdata, unsigned pdata_len, +@@ -1071,6 +1126,7 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) + unsigned i; + struct twl4030_platform_data *pdata = client->dev.platform_data; + u8 temp; ++ int ret = 0; + + if (!pdata) { + dev_dbg(&client->dev, "no platform data?\n"); +@@ -1117,6 +1173,12 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) + /* setup clock framework */ + clocks_init(&client->dev, pdata->clock); + ++ /* read TWL IDCODE Register */ ++ if (twl_id == TWL4030_CLASS_ID) { ++ ret = twl_read_idcode_register(); ++ WARN(ret < 0, "Error: reading twl_idcode register value\n"); ++ } ++ + /* load power event scripts */ + if (twl_has_power() && pdata->power) + twl4030_power_init(pdata->power); +diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h +index f343974..23ec058 100644 +--- a/include/linux/i2c/twl.h ++++ b/include/linux/i2c/twl.h +@@ -151,7 +151,12 @@ + #define MMC_PU (0x1 << 3) + #define MMC_PD (0x1 << 2) + +- ++#define TWL_SIL_TYPE(rev) ((rev) & 0x00FFFFFF) ++#define TWL_SIL_REV(rev) ((rev) >> 24) ++#define TWL_SIL_5030 0x09002F ++#define TWL5030_REV_1_0 0x00 ++#define TWL5030_REV_1_1 0x10 ++#define TWL5030_REV_1_2 0x30 + + #define TWL4030_CLASS_ID 0x4030 + #define TWL6030_CLASS_ID 0x6030 +@@ -181,6 +186,9 @@ int twl_i2c_read_u8(u8 mod_no, u8 *val, u8 reg); + int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); + int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes); + ++int twl_get_type(void); ++int twl_get_version(void); ++ + int twl6030_interrupt_unmask(u8 bit_mask, u8 offset); + int twl6030_interrupt_mask(u8 bit_mask, u8 offset); + +@@ -286,7 +294,12 @@ extern struct twl4030_power_data twl4030_generic_script; + *(Use TWL_4030_MODULE_INTBR) + */ + ++#define REG_IDCODE_7_0 0x00 ++#define REG_IDCODE_15_8 0x01 ++#define REG_IDCODE_16_23 0x02 ++#define REG_IDCODE_31_24 0x03 + #define REG_GPPUPDCTR1 0x0F ++#define REG_UNLOCK_TEST_REG 0x12 + + /*I2C1 and I2C4(SR) SDA/SCL pull-up control bits */ + +@@ -295,6 +308,8 @@ extern struct twl4030_power_data twl4030_generic_script; + #define SR_I2C_SCL_CTRL_PU BIT(4) + #define SR_I2C_SDA_CTRL_PU BIT(6) + ++#define TWL_EEPROM_R_UNLOCK 0x49 ++ + /*----------------------------------------------------------------------*/ + + /* +-- +1.6.6.1 + |