Merge current mainline tree into linux-omap tree
[pandora-kernel.git] / drivers / power / twl4030_bci_battery.c
index 9ab6127..a36eaae 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/platform_device.h>
 #include <linux/i2c/twl4030.h>
 #include <linux/power_supply.h>
-#include <mach/bci.h>
 #include <linux/i2c/twl4030-madc.h>
 
 #define T2_BATTERY_VOLT                0x04
@@ -211,6 +210,14 @@ static irqreturn_t twl4030charger_interrupt(int irq, void *_di)
 {
        struct twl4030_bci_device_info *di = _di;
 
+#ifdef CONFIG_LOCKDEP
+       /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which
+        * we don't want and can't tolerate.  Although it might be
+        * friendlier not to borrow this thread context...
+        */
+       local_irq_enable();
+#endif
+
        twl4030charger_presence_evt();
        power_supply_changed(&di->bat);
 
@@ -311,6 +318,14 @@ static irqreturn_t twl4030battery_interrupt(int irq, void *_di)
        u8 isr1a_val, isr2a_val, clear_2a, clear_1a;
        int ret;
 
+#ifdef CONFIG_LOCKDEP
+       /* WORKAROUND for lockdep forcing IRQF_DISABLED on us, which
+        * we don't want and can't tolerate.  Although it might be
+        * friendlier not to borrow this thread context...
+        */
+       local_irq_enable();
+#endif
+
        ret = twl4030_i2c_read_u8(TWL4030_MODULE_INTERRUPTS, &isr1a_val,
                                REG_BCIISR1A);
        if (ret)
@@ -583,9 +598,8 @@ static int twl4030battery_current(void)
  */
 static int twl4030backupbatt_voltage(void)
 {
-       int ret, temp;
-       u8 volt;
        struct twl4030_madc_request req;
+       int temp;
 
        req.channels = (1 << 9);
        req.do_avg = 0;
@@ -826,9 +840,11 @@ static int twl4030_bci_battery_get_property(struct power_supply *psy,
                                        enum power_supply_property psp,
                                        union power_supply_propval *val)
 {
-       struct twl4030_bci_device_info *di = to_twl4030_bci_device_info(psy);
+       struct twl4030_bci_device_info *di;
        int status = 0;
 
+       di = to_twl4030_bci_device_info(psy);
+
        switch (psp) {
        case POWER_SUPPLY_PROP_STATUS:
                val->intval = di->charge_status;
@@ -893,6 +909,7 @@ static int __init twl4030_bci_battery_probe(struct platform_device *pdev)
 {
        struct twl4030_bci_platform_data *pdata = pdev->dev.platform_data;
        struct twl4030_bci_device_info *di;
+       int irq;
        int ret;
 
        therm_tbl = pdata->battery_tmp_tbl;
@@ -938,26 +955,30 @@ static int __init twl4030_bci_battery_probe(struct platform_device *pdev)
        if (ret)
                goto voltage_setup_fail;
 
+       /* REVISIT do we need to request both IRQs ?? */
+
        /* request BCI interruption */
        ret = request_irq(TWL4030_MODIRQ_BCI, twl4030battery_interrupt,
-               IRQF_DISABLED, pdev->name, NULL);
+               0, pdev->name, NULL);
        if (ret) {
                dev_dbg(&pdev->dev, "could not request irq %d, status %d\n",
                        TWL4030_MODIRQ_BCI, ret);
                goto batt_irq_fail;
        }
 
+       irq = platform_get_irq(pdev, 0);
+
        /* request Power interruption */
-       ret = request_irq(TWL4030_PWRIRQ_CHG_PRES, twl4030charger_interrupt,
+       ret = request_irq(irq, twl4030charger_interrupt,
                0, pdev->name, di);
 
        if (ret) {
                dev_dbg(&pdev->dev, "could not request irq %d, status %d\n",
-                       TWL4030_PWRIRQ_CHG_PRES, ret);
+                       irq, ret);
                goto chg_irq_fail;
        }
 
-       ret = power_supply_register(&dev->dev, &di->bat);
+       ret = power_supply_register(&pdev->dev, &di->bat);
        if (ret) {
                dev_dbg(&pdev->dev, "failed to register main battery\n");
                goto batt_failed;
@@ -982,9 +1003,8 @@ static int __init twl4030_bci_battery_probe(struct platform_device *pdev)
 bk_batt_failed:
        power_supply_unregister(&di->bat);
 batt_failed:
-       free_irq(TWL4030_MODIRQ_PWR, di);
+       free_irq(irq, di);
 chg_irq_fail:
-prev_setup_err:
        free_irq(TWL4030_MODIRQ_BCI, NULL);
 batt_irq_fail:
 voltage_setup_fail:
@@ -1001,6 +1021,7 @@ temp_setup_fail:
 static int __exit twl4030_bci_battery_remove(struct platform_device *pdev)
 {
        struct twl4030_bci_device_info *di = platform_get_drvdata(pdev);
+       int irq = platform_get_irq(pdev, 0);
 
        twl4030charger_ac_en(DISABLE);
        twl4030charger_usb_en(DISABLE);
@@ -1008,7 +1029,7 @@ static int __exit twl4030_bci_battery_remove(struct platform_device *pdev)
        twl4030battery_hw_presence_en(DISABLE);
 
        free_irq(TWL4030_MODIRQ_BCI, NULL);
-       free_irq(TWL4030_MODIRQ_PWR, di);
+       free_irq(irq, di);
 
        flush_scheduled_work();
        power_supply_unregister(&di->bat);