twl4030_charger: remember to clean up USB regulator
authorGrond <grond66@riseup.net>
Tue, 20 Dec 2016 18:59:30 +0000 (10:59 -0800)
committerGrazvydas Ignotas <notasas@gmail.com>
Wed, 21 Dec 2016 23:40:28 +0000 (01:40 +0200)
This was causing issues when the driver was modularized.
Removing and re-inserting the driver with modprobe would cause noisy
breakage because the regulator wasn't released when the driver exited.

drivers/power/twl4030_charger.c

index 9488b37..575407a 100644 (file)
@@ -895,6 +895,13 @@ fail_chg_irq:
        power_supply_unregister(&bci->usb);
 fail_register_usb:
        power_supply_unregister(&bci->ac);
        power_supply_unregister(&bci->usb);
 fail_register_usb:
        power_supply_unregister(&bci->ac);
+
+       if (bci->usb_reg) {
+               if (bci->usb_enabled)
+                       regulator_disable(bci->usb_reg);
+               regulator_put(bci->usb_reg);
+       }
+
 fail_register_ac:
        led_trigger_unregister_simple(bci->charging_any_trig);
        platform_set_drvdata(pdev, NULL);
 fail_register_ac:
        led_trigger_unregister_simple(bci->charging_any_trig);
        platform_set_drvdata(pdev, NULL);
@@ -927,6 +934,13 @@ static int __exit twl4030_bci_remove(struct platform_device *pdev)
        free_irq(bci->irq_chg, bci);
        power_supply_unregister(&bci->usb);
        power_supply_unregister(&bci->ac);
        free_irq(bci->irq_chg, bci);
        power_supply_unregister(&bci->usb);
        power_supply_unregister(&bci->ac);
+
+       if (bci->usb_reg) {
+               if (bci->usb_enabled)
+                       regulator_disable(bci->usb_reg);
+               regulator_put(bci->usb_reg);
+       }
+
        led_trigger_unregister_simple(bci->charging_any_trig);
        platform_set_drvdata(pdev, NULL);
        kfree(bci);
        led_trigger_unregister_simple(bci->charging_any_trig);
        platform_set_drvdata(pdev, NULL);
        kfree(bci);