power: supply: twl4030-charger: move irq allocation to just before irqs are enabled
authorH. Nikolaus Schaller <hns@goldelico.com>
Mon, 3 Jul 2017 16:37:10 +0000 (18:37 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.co.uk>
Mon, 3 Jul 2017 17:15:00 +0000 (19:15 +0200)
And initialize workers and notifiers as soon as possible.

This avoids a potential race if irqs are enabled and triggered too early
before the worker is properly set up.

Suggested-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
drivers/power/supply/twl4030_charger.c

index 3de802f169a162ceaa4644f26d979837e2e00841..9fad387e50817784b1acf80ca794fe27d1f9d780 100644 (file)
@@ -980,12 +980,27 @@ static int twl4030_bci_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, bci);
 
+       INIT_WORK(&bci->work, twl4030_bci_usb_work);
+       INIT_DELAYED_WORK(&bci->current_worker, twl4030_current_worker);
+
        bci->channel_vac = devm_iio_channel_get(&pdev->dev, "vac");
        if (IS_ERR(bci->channel_vac)) {
                bci->channel_vac = NULL;
                dev_warn(&pdev->dev, "could not request vac iio channel");
        }
 
+       if (bci->dev->of_node) {
+               struct device_node *phynode;
+
+               phynode = of_find_compatible_node(bci->dev->of_node->parent,
+                                                 NULL, "ti,twl4030-usb");
+               if (phynode) {
+                       bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
+                       bci->transceiver = devm_usb_get_phy_by_node(
+                               bci->dev, phynode, &bci->usb_nb);
+               }
+       }
+
        bci->ac = devm_power_supply_register(&pdev->dev, &twl4030_bci_ac_desc,
                                             NULL);
        if (IS_ERR(bci->ac)) {
@@ -1019,20 +1034,6 @@ static int twl4030_bci_probe(struct platform_device *pdev)
                return ret;
        }
 
-       INIT_WORK(&bci->work, twl4030_bci_usb_work);
-       INIT_DELAYED_WORK(&bci->current_worker, twl4030_current_worker);
-
-       bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
-       if (bci->dev->of_node) {
-               struct device_node *phynode;
-
-               phynode = of_find_compatible_node(bci->dev->of_node->parent,
-                                                 NULL, "ti,twl4030-usb");
-               if (phynode)
-                       bci->transceiver = devm_usb_get_phy_by_node(
-                               bci->dev, phynode, &bci->usb_nb);
-       }
-
        /* Enable interrupts now. */
        reg = ~(u32)(TWL4030_ICHGLOW | TWL4030_ICHGEOC | TWL4030_TBATOR2 |
                TWL4030_TBATOR1 | TWL4030_BATSTS);