diff options
author | Hans de Goede <hdegoede@redhat.com> | 2016-12-21 17:36:49 +0300 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2017-01-05 00:02:39 +0300 |
commit | 42e2008a66a7e17ca0c4382ff676a9cfe7a633bd (patch) | |
tree | 09f987446b3844b989b710f4110d1df8a47f7724 /drivers/power | |
parent | e3668e37f9078ccc1e938b9ddfc112877bbcf60a (diff) | |
download | linux-42e2008a66a7e17ca0c4382ff676a9cfe7a633bd.tar.xz |
power: supply: axp288_charger: Register extcon notifers after power_supply
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>
Diffstat (limited to 'drivers/power')
-rw-r--r-- | drivers/power/supply/axp288_charger.c | 42 |
1 files changed, 15 insertions, 27 deletions
diff --git a/drivers/power/supply/axp288_charger.c b/drivers/power/supply/axp288_charger.c index d929742eef1e..250dd700226f 100644 --- a/drivers/power/supply/axp288_charger.c +++ b/drivers/power/supply/axp288_charger.c @@ -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; |