]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/mfd/twl-core.c
net: caif: spi: fix potential NULL dereference
[net-next-2.6.git] / drivers / mfd / twl-core.c
index 5d0fb60a4c147138833506588d6329b1e716e1ae..35275ba7096fdcbf941c400e017f8e29f1f7565e 100644 (file)
 #define twl_has_codec()        false
 #endif
 
+#if defined(CONFIG_CHARGER_TWL4030) || defined(CONFIG_CHARGER_TWL4030_MODULE)
+#define twl_has_bci()  true
+#else
+#define twl_has_bci()  false
+#endif
+
 /* Triton Core internal information (BEGIN) */
 
 /* Last - for index max*/
 
 /* Few power values */
 #define R_CFG_BOOT                     0x05
-#define R_PROTECT_KEY                  0x0E
-
-/* access control values for R_PROTECT_KEY */
-#define KEY_UNLOCK1                    0xce
-#define KEY_UNLOCK2                    0xec
-#define KEY_LOCK                       0x00
 
 /* some fields in R_CFG_BOOT */
 #define HFCLK_FREQ_19p2_MHZ            (1 << 0)
@@ -255,7 +255,7 @@ struct twl_mapping {
        unsigned char sid;      /* Slave ID */
        unsigned char base;     /* base address */
 };
-struct twl_mapping *twl_map;
+static struct twl_mapping *twl_map;
 
 static struct twl_mapping twl4030_map[TWL4030_MODULE_LAST + 1] = {
        /*
@@ -832,6 +832,17 @@ add_children(struct twl4030_platform_data *pdata, unsigned long features)
                        return PTR_ERR(child);
        }
 
+       if (twl_has_bci() && pdata->bci &&
+                       !(features & (TPS_SUBSET | TWL5031))) {
+               child = add_child(3, "twl4030_bci",
+                               pdata->bci, sizeof(*pdata->bci), false,
+                               /* irq0 = CHG_PRES, irq1 = BCI */
+                               pdata->irq_base + BCI_PRES_INTR_OFFSET,
+                               pdata->irq_base + BCI_INTR_OFFSET);
+               if (IS_ERR(child))
+                       return PTR_ERR(child);
+       }
+
        return 0;
 }
 
@@ -846,8 +857,8 @@ static inline int __init protect_pm_master(void)
 {
        int e = 0;
 
-       e = twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_LOCK,
-                       R_PROTECT_KEY);
+       e = twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER, 0,
+                       TWL4030_PM_MASTER_PROTECT_KEY);
        return e;
 }
 
@@ -855,10 +866,13 @@ static inline int __init unprotect_pm_master(void)
 {
        int e = 0;
 
-       e |= twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_UNLOCK1,
-                       R_PROTECT_KEY);
-       e |= twl_i2c_write_u8(TWL_MODULE_PM_MASTER, KEY_UNLOCK2,
-                       R_PROTECT_KEY);
+       e |= twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER,
+                       TWL4030_PM_MASTER_KEY_CFG1,
+                       TWL4030_PM_MASTER_PROTECT_KEY);
+       e |= twl_i2c_write_u8(TWL4030_MODULE_PM_MASTER,
+                       TWL4030_PM_MASTER_KEY_CFG2,
+                       TWL4030_PM_MASTER_PROTECT_KEY);
+
        return e;
 }