]> Pileus Git - ~andy/linux/blobdiff - drivers/power/tps65090-charger.c
Merge branch 'for-3.11/core' of git://git.kernel.dk/linux-block
[~andy/linux] / drivers / power / tps65090-charger.c
index 9fbca310a2ad98e77299156db4b83284d64e3ff6..bdd7b9b2546a500bc7366cfea79f5b1970cc0fae 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/mfd/tps65090.h>
 
 #define TPS65090_REG_INTR_STS  0x00
+#define TPS65090_REG_INTR_MASK 0x02
 #define TPS65090_REG_CG_CTRL0  0x04
 #define TPS65090_REG_CG_CTRL1  0x05
 #define TPS65090_REG_CG_CTRL2  0x06
@@ -67,8 +68,7 @@ static int tps65090_low_chrg_current(struct tps65090_charger *charger)
        return 0;
 }
 
-static int tps65090_enable_charging(struct tps65090_charger *charger,
-       uint8_t enable)
+static int tps65090_enable_charging(struct tps65090_charger *charger)
 {
        int ret;
        uint8_t ctrl0 = 0;
@@ -84,7 +84,7 @@ static int tps65090_enable_charging(struct tps65090_charger *charger,
        ret = tps65090_write(charger->dev->parent, TPS65090_REG_CG_CTRL0,
                                (ctrl0 | TPS65090_CHARGER_ENABLE));
        if (ret < 0) {
-               dev_err(charger->dev, "%s(): error reading in register 0x%x\n",
+               dev_err(charger->dev, "%s(): error writing in register 0x%x\n",
                                __func__, TPS65090_REG_CG_CTRL0);
                return ret;
        }
@@ -93,6 +93,7 @@ static int tps65090_enable_charging(struct tps65090_charger *charger,
 
 static int tps65090_config_charger(struct tps65090_charger *charger)
 {
+       uint8_t intrmask = 0;
        int ret;
 
        if (charger->pdata->enable_low_current_chrg) {
@@ -104,6 +105,23 @@ static int tps65090_config_charger(struct tps65090_charger *charger)
                }
        }
 
+       /* Enable the VACG interrupt for AC power detect */
+       ret = tps65090_read(charger->dev->parent, TPS65090_REG_INTR_MASK,
+                           &intrmask);
+       if (ret < 0) {
+               dev_err(charger->dev, "%s(): error reading in register 0x%x\n",
+                       __func__, TPS65090_REG_INTR_MASK);
+               return ret;
+       }
+
+       ret = tps65090_write(charger->dev->parent, TPS65090_REG_INTR_MASK,
+                            (intrmask | TPS65090_VACG));
+       if (ret < 0) {
+               dev_err(charger->dev, "%s(): error writing in register 0x%x\n",
+                       __func__, TPS65090_REG_CG_CTRL0);
+               return ret;
+       }
+
        return 0;
 }
 
@@ -146,7 +164,7 @@ static irqreturn_t tps65090_charger_isr(int irq, void *dev_id)
        }
 
        if (intrsts & TPS65090_VACG) {
-               ret = tps65090_enable_charging(charger, 1);
+               ret = tps65090_enable_charging(charger);
                if (ret < 0)
                        return IRQ_HANDLED;
                charger->ac_online = 1;
@@ -154,6 +172,13 @@ static irqreturn_t tps65090_charger_isr(int irq, void *dev_id)
                charger->ac_online = 0;
        }
 
+       /* Clear interrupts. */
+       ret = tps65090_write(charger->dev->parent, TPS65090_REG_INTR_STS, 0x00);
+       if (ret < 0) {
+               dev_err(charger->dev, "%s(): Error in writing reg 0x%x\n",
+                               __func__, TPS65090_REG_INTR_STS);
+       }
+
        if (charger->prev_ac_online != charger->ac_online)
                power_supply_changed(&charger->ac);
 
@@ -218,7 +243,7 @@ static int tps65090_charger_probe(struct platform_device *pdev)
                return -ENOMEM;
        }
 
-       dev_set_drvdata(&pdev->dev, cdata);
+       platform_set_drvdata(pdev, cdata);
 
        cdata->dev                      = &pdev->dev;
        cdata->pdata                    = pdata;
@@ -230,6 +255,7 @@ static int tps65090_charger_probe(struct platform_device *pdev)
        cdata->ac.num_properties        = ARRAY_SIZE(tps65090_ac_props);
        cdata->ac.supplied_to           = pdata->supplied_to;
        cdata->ac.num_supplicants       = pdata->num_supplicants;
+       cdata->ac.of_node               = pdev->dev.of_node;
 
        ret = power_supply_register(&pdev->dev, &cdata->ac);
        if (ret) {
@@ -270,7 +296,7 @@ static int tps65090_charger_probe(struct platform_device *pdev)
        }
 
        if (status1 != 0) {
-               ret = tps65090_enable_charging(cdata, 1);
+               ret = tps65090_enable_charging(cdata);
                if (ret < 0) {
                        dev_err(cdata->dev, "error enabling charger\n");
                        goto fail_free_irq;
@@ -291,7 +317,7 @@ fail_unregister_supply:
 
 static int tps65090_charger_remove(struct platform_device *pdev)
 {
-       struct tps65090_charger *cdata = dev_get_drvdata(&pdev->dev);
+       struct tps65090_charger *cdata = platform_get_drvdata(pdev);
 
        devm_free_irq(cdata->dev, cdata->irq, cdata);
        power_supply_unregister(&cdata->ac);