Simplifying the error code paths.
We need to keep wacom_destroy_battery() around for now as the wireless
module and the remotes are using it to dynamically remove the battery
supply on disconnect.

Signed-off-by: Benjamin Tissoires <benjamin.tissoi...@redhat.com>
Acked-by: Ping Cheng <pi...@wacom.com>
Signed-off-by: Jiri Kosina <jkos...@suse.cz>
[aaron.sko...@wacom.com: Imported into input-wacom repository (b189da9)]
Signed-off-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
[aaron.sko...@wacom.com: Backported from input-wacom repository (f1754f8)]
Signed-off-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
---
 3.17/wacom_sys.c | 64 +++++++++++++++++++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 21 deletions(-)

diff --git a/3.17/wacom_sys.c b/3.17/wacom_sys.c
index c79a854..f248979 100644
--- a/3.17/wacom_sys.c
+++ b/3.17/wacom_sys.c
@@ -1094,12 +1094,16 @@ static int wacom_ac_get_property(struct power_supply 
*psy,
 static int wacom_initialize_battery(struct wacom *wacom)
 {
        static atomic_t battery_no = ATOMIC_INIT(0);
+       struct device *dev = &wacom->hdev->dev;
+       int error;
+       unsigned long n;
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
        struct power_supply_config psy_cfg = { .drv_data = wacom, };
-#else
-       int error;
+       struct power_supply_desc *bat_desc = 
&WACOM_POWERSUPPLY_DESC(wacom->battery);
+
+       if (!devres_open_group(dev, bat_desc, GFP_KERNEL))
+               return -ENOMEM;
 #endif
-       unsigned long n;
 
        if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) {
                n = atomic_inc_return(&battery_no) - 1;
@@ -1121,52 +1125,66 @@ static int wacom_initialize_battery(struct wacom *wacom)
                WACOM_POWERSUPPLY_DESC(wacom->battery).use_for_apm = 0;
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
-               wacom->battery = power_supply_register(&wacom->hdev->dev,
-                                                      
&WACOM_POWERSUPPLY_DESC(wacom->battery),
-                                                      &psy_cfg);
-               if (IS_ERR(wacom->battery))
-                       return PTR_ERR(wacom->battery);
+               wacom->battery = devm_power_supply_register(dev,
+                                                          
&WACOM_POWERSUPPLY_DESC(wacom->battery),
+                                                          &psy_cfg);
+               if (IS_ERR(wacom->battery)) {
+                       error = PTR_ERR(wacom->battery);
+                       goto err;
+               }
 #else
-               error = power_supply_register(&wacom->hdev->dev,
+               error = power_supply_register(dev,
                                              &wacom->battery);
 
                if (error)
                        return error;
 #endif
 
-               power_supply_powers(WACOM_POWERSUPPLY_REF(wacom->battery), 
&wacom->hdev->dev);
+               power_supply_powers(WACOM_POWERSUPPLY_REF(wacom->battery), dev);
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
-               wacom->ac = power_supply_register(&wacom->hdev->dev,
-                                                 
&WACOM_POWERSUPPLY_DESC(wacom->ac),
-                                                 &psy_cfg
-                       );
-
+               wacom->ac = devm_power_supply_register(dev,
+                                                      
&WACOM_POWERSUPPLY_DESC(wacom->battery),
+                                                      &psy_cfg);
                if (IS_ERR(wacom->ac)) {
-                       power_supply_unregister(wacom->battery);
-                       return PTR_ERR(wacom->ac);
+                       error = PTR_ERR(wacom->ac);
+                       goto err;
                }
 #else
-               error = power_supply_register(&wacom->hdev->dev, &wacom->ac);
+               error = power_supply_register(dev, &wacom->ac);
 
                if (error) {
                        power_supply_unregister(&wacom->battery);
                        return error;
                }
 #endif
-
-               power_supply_powers(WACOM_POWERSUPPLY_REF(wacom->ac), 
&wacom->hdev->dev);
+               power_supply_powers(WACOM_POWERSUPPLY_REF(wacom->ac), dev);
        }
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+       devres_close_group(dev, bat_desc);
+#endif
+
        return 0;
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+err:
+       devres_release_group(dev, bat_desc);
+       return error;
+#endif
 }
 
 static void wacom_destroy_battery(struct wacom *wacom)
 {
        if (WACOM_POWERSUPPLY_DEVICE(wacom->battery)) {
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+               devres_release_group(&wacom->hdev->dev, 
WACOM_POWERSUPPLY_DEVICE(wacom->battery));
+#else
                power_supply_unregister(WACOM_POWERSUPPLY_REF(wacom->battery));
-               WACOM_POWERSUPPLY_DEVICE(wacom->battery) = NULL;
                power_supply_unregister(WACOM_POWERSUPPLY_REF(wacom->ac));
+#endif
+               WACOM_POWERSUPPLY_DEVICE(wacom->battery) = NULL;
                WACOM_POWERSUPPLY_DEVICE(wacom->ac) = NULL;
        }
 }
@@ -1773,7 +1791,9 @@ fail_remote:
 fail_leds:
        wacom_clean_inputs(wacom);
 fail_register_inputs:
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
        wacom_destroy_battery(wacom);
+#endif
 fail_battery:
        wacom_remove_shared_data(wacom);
 fail_shared_data:
@@ -1962,7 +1982,9 @@ static void wacom_remove(struct hid_device *hdev)
        wacom_clean_inputs(wacom);
        if (hdev->bus == BUS_BLUETOOTH)
                device_remove_file(&hdev->dev, &dev_attr_speed);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
        wacom_destroy_battery(wacom);
+#endif
        wacom_remove_shared_data(wacom);
 
        hid_set_drvdata(hdev, NULL);
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most 
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to