power: supply: axp288_charger: Register extcon notifers after power_supply
authorHans de Goede <hdegoede@redhat.com>
Wed, 21 Dec 2016 14:36:49 +0000 (15:36 +0100)
committerSebastian Reichel <sre@kernel.org>
Wed, 4 Jan 2017 21:02:39 +0000 (22:02 +0100)
The extcon notifier work calls power_supply_changed on the power_supply
we register, so the extcon notifiers should be registered after we
register the power_supply.

While touching this code anyways, refactor the code for the 3 cable types
into a loop to avoid code repetition.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sebastian Reichel <sre@kernel.org>
drivers/power/supply/axp288_charger.c

index d929742..250dd70 100644 (file)
@@ -815,6 +815,8 @@ static int axp288_charger_probe(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
        struct power_supply_config charger_cfg = {};
+       unsigned int cable_ids[] = { EXTCON_CHG_USB_SDP, EXTCON_CHG_USB_CDP,
+                                    EXTCON_CHG_USB_DCP };
 
        info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
        if (!info)
@@ -831,33 +833,6 @@ static int axp288_charger_probe(struct platform_device *pdev)
                return -EPROBE_DEFER;
        }
 
-       /* Register for extcon notification */
-       INIT_WORK(&info->cable.work, axp288_charger_extcon_evt_worker);
-       info->cable.nb.notifier_call = axp288_charger_handle_cable_evt;
-       ret = devm_extcon_register_notifier(&pdev->dev, info->cable.edev,
-                                       EXTCON_CHG_USB_SDP, &info->cable.nb);
-       if (ret) {
-               dev_err(&info->pdev->dev,
-                       "failed to register extcon notifier for SDP %d\n", ret);
-               return ret;
-       }
-
-       ret = devm_extcon_register_notifier(&pdev->dev, info->cable.edev,
-                                       EXTCON_CHG_USB_CDP, &info->cable.nb);
-       if (ret) {
-               dev_err(&info->pdev->dev,
-                       "failed to register extcon notifier for CDP %d\n", ret);
-               return ret;
-       }
-
-       ret = devm_extcon_register_notifier(&pdev->dev, info->cable.edev,
-                                       EXTCON_CHG_USB_DCP, &info->cable.nb);
-       if (ret) {
-               dev_err(&info->pdev->dev,
-                       "failed to register extcon notifier for DCP %d\n", ret);
-               return ret;
-       }
-
        platform_set_drvdata(pdev, info);
        mutex_init(&info->lock);
 
@@ -871,6 +846,19 @@ static int axp288_charger_probe(struct platform_device *pdev)
                return ret;
        }
 
+       /* Register for extcon notification */
+       INIT_WORK(&info->cable.work, axp288_charger_extcon_evt_worker);
+       info->cable.nb.notifier_call = axp288_charger_handle_cable_evt;
+       for (i = 0; i < ARRAY_SIZE(cable_ids); i++) {
+               ret = devm_extcon_register_notifier(dev, info->cable.edev,
+                                               cable_ids[i], &info->cable.nb);
+               if (ret) {
+                       dev_err(dev, "failed to register extcon notifier for %u: %d\n",
+                               cable_ids[i], ret);
+                       return ret;
+               }
+       }
+
        /* Register for OTG notification */
        INIT_WORK(&info->otg.work, axp288_charger_otg_evt_worker);
        info->otg.id_nb.notifier_call = axp288_charger_handle_otg_evt;