| From 37e7b0b331e9a38fb897719bc760dce01e75097e Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 1 Aug 2019 14:33:30 -0700 |
| Subject: power: supply: Init device wakeup after device_add() |
| |
| From: Stephen Boyd <swboyd@chromium.org> |
| |
| [ Upstream commit 8288022284859acbcc3cf1a073a1e2692d6c2543 ] |
| |
| We may want to use the device pointer in device_init_wakeup() with |
| functions that expect the device to already be added with device_add(). |
| For example, if we were to link the device initializing wakeup to |
| something in sysfs such as a class for wakeups we'll run into an error. |
| It looks like this code was written with the assumption that the device |
| would be added before initializing wakeup due to the order of operations |
| in power_supply_unregister(). |
| |
| Let's change the order of operations so we don't run into problems here. |
| |
| Fixes: 948dcf966228 ("power_supply: Prevent suspend until power supply events are processed") |
| Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: Tri Vo <trong@android.com> |
| Cc: Kalesh Singh <kaleshsingh@google.com> |
| Cc: Ravi Chandra Sadineni <ravisadineni@chromium.org> |
| Cc: Viresh Kumar <viresh.kumar@linaro.org> |
| Signed-off-by: Stephen Boyd <swboyd@chromium.org> |
| Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/power/supply/power_supply_core.c | 10 +++++----- |
| 1 file changed, 5 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c |
| index 9e05ae0430a99..cb0b3d3d132fc 100644 |
| --- a/drivers/power/supply/power_supply_core.c |
| +++ b/drivers/power/supply/power_supply_core.c |
| @@ -764,14 +764,14 @@ __power_supply_register(struct device *parent, |
| } |
| |
| spin_lock_init(&psy->changed_lock); |
| - rc = device_init_wakeup(dev, ws); |
| - if (rc) |
| - goto wakeup_init_failed; |
| - |
| rc = device_add(dev); |
| if (rc) |
| goto device_add_failed; |
| |
| + rc = device_init_wakeup(dev, ws); |
| + if (rc) |
| + goto wakeup_init_failed; |
| + |
| rc = psy_register_thermal(psy); |
| if (rc) |
| goto register_thermal_failed; |
| @@ -808,8 +808,8 @@ register_cooler_failed: |
| psy_unregister_thermal(psy); |
| register_thermal_failed: |
| device_del(dev); |
| -device_add_failed: |
| wakeup_init_failed: |
| +device_add_failed: |
| check_supplies_failed: |
| dev_set_name_failed: |
| put_device(dev); |
| -- |
| 2.20.1 |
| |