summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/power_supply.c
diff options
context:
space:
mode:
authorRui Miguel Silva <rui.silva@linaro.org>2016-01-08 13:53:43 +0000
committerGreg Kroah-Hartman <gregkh@google.com>2016-01-11 19:18:14 -0800
commitff85f723ca362986dc984217433cbdd133fc03d6 (patch)
tree4e15c5bdb20ae4c5974e03ce38991916be0f2d13 /drivers/staging/greybus/power_supply.c
parent7ccac20d59ca45a2efea93a24a99d57022ff8911 (diff)
greybus: power_supply: fix unregister on error path
If setup fail the release for each supply needs to know the status at unregister time. So, add the field to the structure, update it at setup time and use it at release. Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org> Reported-by: Johan Hovold <johan@hovoldconsulting.com> Reviewed-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/power_supply.c')
-rw-r--r--drivers/staging/greybus/power_supply.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/staging/greybus/power_supply.c b/drivers/staging/greybus/power_supply.c
index 1ce57f6333da..764d2f640164 100644
--- a/drivers/staging/greybus/power_supply.c
+++ b/drivers/staging/greybus/power_supply.c
@@ -25,6 +25,7 @@ struct gb_power_supply_prop {
struct gb_power_supply {
u8 id;
+ bool registered;
#ifdef DRIVER_OWNS_PSY_STRUCT
struct power_supply psy;
#define to_gb_power_supply(x) container_of(x, struct gb_power_supply, psy)
@@ -557,9 +558,11 @@ static void _gb_power_supply_release(struct gb_power_supply *gbpsy)
cancel_delayed_work_sync(&gbpsy->work);
#ifdef DRIVER_OWNS_PSY_STRUCT
- power_supply_unregister(&gbpsy->psy);
+ if (gbpsy->registered)
+ power_supply_unregister(&gbpsy->psy);
#else
- power_supply_unregister(gbpsy->psy);
+ if (gbpsy->registered)
+ power_supply_unregister(gbpsy->psy);
#endif
_gb_power_supply_free(gbpsy);
@@ -628,6 +631,9 @@ static int gb_power_supply_config(struct gb_power_supplies *supplies, int id)
schedule_delayed_work(&gbpsy->work, 0);
out:
+ /* if everything went fine just mark it for release code to know */
+ if (ret == 0)
+ gbpsy->registered = true;
return ret;
}