diff options
Diffstat (limited to 'drivers/mfd/twl-core.c')
-rw-r--r-- | drivers/mfd/twl-core.c | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index f82413a..953189c 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c @@ -83,7 +83,7 @@ #define twl_has_madc() false #endif -#ifdef CONFIG_TWL4030_POWER +#if defined(CONFIG_TWL4030_POWER) || defined(CONFIG_TWL6030_POWER) #define twl_has_power() true #else #define twl_has_power() false @@ -126,6 +126,7 @@ /* Last - for index max*/ #define TWL4030_MODULE_LAST TWL4030_MODULE_SECURED_REG +#define TWL6030_MODULE_LAST TWL6030_MODULE_SLAVE_RES #define TWL_NUM_SLAVES 4 @@ -141,7 +142,7 @@ #define SUB_CHIP_ID2 2 #define SUB_CHIP_ID3 3 -#define TWL_MODULE_LAST TWL4030_MODULE_LAST +#define TWL_MODULE_LAST TWL6030_MODULE_LAST /* Base Address defns for twl4030_map[] */ @@ -187,6 +188,7 @@ #define TWL6030_BASEADD_MEM 0x0017 #define TWL6030_BASEADD_PM_MASTER 0x001F #define TWL6030_BASEADD_PM_SLAVE_MISC 0x0030 /* PM_RECEIVER */ +#define TWL6030_BASEADD_PM_SLAVE_RES 0x00AD #define TWL6030_BASEADD_PM_MISC 0x00E2 #define TWL6030_BASEADD_PM_PUPD 0x00F0 @@ -333,6 +335,7 @@ static struct twl_mapping twl6030_map[] = { { SUB_CHIP_ID0, TWL6030_BASEADD_RTC }, { SUB_CHIP_ID0, TWL6030_BASEADD_MEM }, { SUB_CHIP_ID1, TWL6025_BASEADD_CHARGER }, + { SUB_CHIP_ID0, TWL6030_BASEADD_PM_SLAVE_RES }, }; /*----------------------------------------------------------------------*/ @@ -386,8 +389,9 @@ int twl_i2c_write(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) /* i2c_transfer returns number of messages transferred */ if (ret != 1) { - pr_err("%s: i2c_write failed to transfer all messages\n", - DRIVER_NAME); + pr_err("%s: i2c_write failed to transfer all messages " + "(addr 0x%04x, reg %d, len %d)\n", + DRIVER_NAME, twl->address, reg, msg->len); if (ret < 0) return ret; else @@ -445,8 +449,9 @@ int twl_i2c_read(u8 mod_no, u8 *value, u8 reg, unsigned num_bytes) /* i2c_transfer returns number of messages transferred */ if (ret != 2) { - pr_err("%s: i2c_read failed to transfer all messages\n", - DRIVER_NAME); + pr_err("%s: i2c_read failed to transfer all messages " + "(addr 0x%04x, reg %d, len %d)\n", + DRIVER_NAME, twl->address, reg, msg->len); if (ret < 0) return ret; else @@ -827,7 +832,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) /* Phoenix codec driver is probed directly atm */ if (twl_has_codec() && pdata->codec && twl_class_is_6030()) { sub_chip_id = twl_map[TWL_MODULE_AUDIO_VOICE].sid; - child = add_child(sub_chip_id, "twl6040-codec", + child = add_child(sub_chip_id, "twl6040-audio", pdata->codec, sizeof(*pdata->codec), false, 0, 0); if (IS_ERR(child)) @@ -970,6 +975,26 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) features); if (IS_ERR(child)) return PTR_ERR(child); + + child = add_regulator(TWL6030_REG_CLK32KAUDIO, + pdata->clk32kaudio, features); + if (IS_ERR(child)) + return PTR_ERR(child); + + child = add_regulator(TWL6030_REG_VDD3, pdata->vdd3, + features); + if (IS_ERR(child)) + return PTR_ERR(child); + + child = add_regulator(TWL6030_REG_VMEM, pdata->vmem, + features); + if (IS_ERR(child)) + return PTR_ERR(child); + + child = add_regulator(TWL6030_REG_V2V1, pdata->v2v1, + features); + if (IS_ERR(child)) + return PTR_ERR(child); } /* 6030 and 6025 share this regulator */ @@ -1238,8 +1263,12 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id) } /* load power event scripts */ - if (twl_has_power() && pdata->power) - twl4030_power_init(pdata->power); + if (twl_has_power()) { + if (twl_class_is_4030() && pdata->power) + twl4030_power_init(pdata->power); + if (twl_class_is_6030()) + twl6030_power_init(pdata->power); + } /* Maybe init the T2 Interrupt subsystem */ if (client->irq |