diff options
Diffstat (limited to 'drivers/mfd/twl-core.c')
-rw-r--r-- | drivers/mfd/twl-core.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 5d0fb60a4c14..35275ba7096f 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
@@ -115,6 +115,12 @@ | |||
115 | #define twl_has_codec() false | 115 | #define twl_has_codec() false |
116 | #endif | 116 | #endif |
117 | 117 | ||
118 | #if defined(CONFIG_CHARGER_TWL4030) || defined(CONFIG_CHARGER_TWL4030_MODULE) | ||
119 | #define twl_has_bci() true | ||
120 | #else | ||
121 | #define twl_has_bci() false | ||
122 | #endif | ||
123 | |||
118 | /* Triton Core internal information (BEGIN) */ | 124 | /* Triton Core internal information (BEGIN) */ |
119 | 125 | ||
120 | /* Last - for index max*/ | 126 | /* Last - for index max*/ |
@@ -202,12 +208,6 @@ | |||
202 | 208 | ||
203 | /* Few power values */ | 209 | /* Few power values */ |
204 | #define R_CFG_BOOT 0x05 | 210 | #define R_CFG_BOOT 0x05 |
205 | #define R_PROTECT_KEY 0x0E | ||
206 | |||
207 | /* access control values for R_PROTECT_KEY */ | ||
208 | #define KEY_UNLOCK1 0xce | ||
209 | #define KEY_UNLOCK2 0xec | ||
210 | #define KEY_LOCK 0x00 | ||
211 | 211 | ||
212 | /* some fields in R_CFG_BOOT */ | 212 | /* some fields in R_CFG_BOOT */ |
213 | #define HFCLK_FREQ_19p2_MHZ (1 << 0) | 213 | #define HFCLK_FREQ_19p2_MHZ (1 << 0) |
@@ -255,7 +255,7 @@ struct twl_mapping { | |||
255 | unsigned char sid; /* Slave ID */ | 255 | unsigned char sid; /* Slave ID */ |
256 | unsigned char base; /* base address */ | 256 | unsigned char base; /* base address */ |
257 | }; | 257 | }; |
258 | struct twl_mapping *twl_map; | 258 | static struct twl_mapping *twl_map; |
259 | 259 | ||
260 | static struct twl_mapping twl4030_map[TWL4030_MODULE_LAST + 1] = { | 260 | static struct twl_mapping twl4030_map[TWL4030_MODULE_LAST + 1] = { |
261 | /* | 261 | /* |
@@ -832,6 +832,17 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features) | |||
832 | return PTR_ERR(child); | 832 | return PTR_ERR(child); |
833 | } | 833 | } |
834 | 834 | ||
835 | if (twl_has_bci() && pdata->bci && | ||
836 | !(features & (TPS_SUBSET | TWL5031))) { | ||
837 | child = add_child(3, "twl4030_bci", | ||
838 | pdata->bci, sizeof(*pdata->bci), false, | ||
839 | /* irq0 = CHG_PRES, irq1 = BCI */ | ||
840 | pdata->irq_base + BCI_PRES_INTR_OFFSET, | ||
841 | pdata->irq_base + BCI_INTR_OFFSET); | ||
842 | if (IS_ERR(child)) | ||
843 | return PTR_ERR(child); | ||
844 | } | ||
845 | |||
835 | return 0; | 846 | return 0; |
836 | } | 847 | } |
837 | 848 | ||
@@ -846,8 +857,8 @@ static inline int __init protect_pm_master(void) | |||
846 | { | 857 | { |
847 | int e = 0; | 858 | int e = 0; |
848 | 859 | ||
849 | e = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_LOCK, | 860 | e = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0, |
850 | R_PROTECT_KEY); | 861 | TWL4030_PM_MASTER_PROTECT_KEY); |
851 | return e; | 862 | return e; |
852 | } | 863 | } |
853 | 864 | ||
@@ -855,10 +866,13 @@ static inline int __init unprotect_pm_master(void) | |||
855 | { | 866 | { |
856 | int e = 0; | 867 | int e = 0; |
857 | 868 | ||
858 | e |= twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_UNLOCK1, | 869 | e |= twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, |
859 | R_PROTECT_KEY); | 870 | TWL4030_PM_MASTER_KEY_CFG1, |
860 | e |= twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_UNLOCK2, | 871 | TWL4030_PM_MASTER_PROTECT_KEY); |
861 | R_PROTECT_KEY); | 872 | e |= twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, |
873 | TWL4030_PM_MASTER_KEY_CFG2, | ||
874 | TWL4030_PM_MASTER_PROTECT_KEY); | ||
875 | |||
862 | return e; | 876 | return e; |
863 | } | 877 | } |
864 | 878 | ||