We take the same checks for the powersupply API than the one in the 3.17
branch

Signed-off-by: Benjamin Tissoires <benjamin.tissoi...@redhat.com>
---
 3.7/wacom.h     |  18 ++++++++-
 3.7/wacom_sys.c | 113 ++++++++++++++++++++++++++++++++++++++++++++------------
 3.7/wacom_wac.c |  10 ++---
 3 files changed, 110 insertions(+), 31 deletions(-)

diff --git a/3.7/wacom.h b/3.7/wacom.h
index de6c15f..50bdb5f 100644
--- a/3.7/wacom.h
+++ b/3.7/wacom.h
@@ -110,6 +110,16 @@ MODULE_LICENSE(DRIVER_LICENSE);
 #define USB_VENDOR_ID_WACOM    0x056a
 #define USB_VENDOR_ID_LENOVO   0x17ef
 
+#ifdef WACOM_POWERSUPPLY_41
+#define WACOM_POWERSUPPLY_DEVICE(ps) (ps)
+#define WACOM_POWERSUPPLY_REF(ps) (ps)
+#define WACOM_POWERSUPPLY_DESC(ps) (ps##_desc)
+#else
+#define WACOM_POWERSUPPLY_DEVICE(ps) ((ps).dev)
+#define WACOM_POWERSUPPLY_REF(ps) (&(ps))
+#define WACOM_POWERSUPPLY_DESC(ps) (ps)
+#endif
+
 enum wacom_worker {
        WACOM_WORKER_WIRELESS,
        WACOM_WORKER_BATTERY,
@@ -117,10 +127,14 @@ enum wacom_worker {
 };
 
 struct wacom_battery {
+       struct wacom *wacom;
+#ifdef WACOM_POWERSUPPLY_41
+       struct power_supply_desc bat_desc;
+       struct power_supply *battery;
+#else
        struct power_supply battery;
-       struct power_supply ac;
+#endif
        char bat_name[WACOM_NAME_MAX];
-       char ac_name[WACOM_NAME_MAX];
        int bat_status;
        int battery_capacity;
        int bat_charging;
diff --git a/3.7/wacom_sys.c b/3.7/wacom_sys.c
index ef880dc..82cbb21 100644
--- a/3.7/wacom_sys.c
+++ b/3.7/wacom_sys.c
@@ -1217,7 +1217,11 @@ static int wacom_battery_get_property(struct 
power_supply *psy,
                                      enum power_supply_property psp,
                                      union power_supply_propval *val)
 {
+#ifdef WACOM_POWERSUPPLY_41
+       struct wacom_battery *battery = power_supply_get_drvdata(psy);
+#else
        struct wacom_battery *battery = container_of(psy, struct wacom_battery, 
battery);
+#endif
        int ret = 0;
 
        switch (psp) {
@@ -1251,10 +1255,12 @@ static int wacom_battery_get_property(struct 
power_supply *psy,
        return ret;
 }
 
+#ifndef WACOM_POWERSUPPLY_41
 static int __wacom_initialize_battery(struct wacom *wacom,
                                      struct wacom_battery *battery)
 {
        static atomic_t battery_no = ATOMIC_INIT(0);
+       struct device *dev = &wacom->usbdev->dev;
        static DEFINE_SPINLOCK(ps_lock);
        unsigned long flags;
        int error = 0;
@@ -1264,29 +1270,71 @@ static int __wacom_initialize_battery(struct wacom 
*wacom,
 
        n = atomic_inc_return(&battery_no) - 1;
 
-       if (power_supply_get_by_name("wacom_battery"))
-               sprintf(battery->bat_name, "wacom_battery_%ld", n);
-       else
-               sprintf(battery->bat_name, "wacom_battery");
-
        battery->battery.properties = wacom_battery_props;
        battery->battery.num_properties = ARRAY_SIZE(wacom_battery_props);
        battery->battery.get_property = wacom_battery_get_property;
-       battery->battery.name = battery->bat_name;
+       sprintf(wacom->battery.bat_name, "wacom_battery_%ld", n);
+       battery->battery.name = wacom->battery.bat_name;
        battery->battery.type = POWER_SUPPLY_TYPE_USB;
        battery->battery.use_for_apm = 0;
 
-       error = power_supply_register(&wacom->usbdev->dev,
-                                     &battery->battery);
+       error = power_supply_register(dev, &battery->battery);
+
+       if (error)
+               return error;
 
-       if (!error)
-               power_supply_powers(&battery->battery,
-                                   &wacom->usbdev->dev);
+       power_supply_powers(WACOM_POWERSUPPLY_REF(battery->battery), dev);
 
        spin_unlock_irqrestore(&ps_lock, flags);
 
+       return 0;
+}
+
+#else
+static int __wacom_initialize_battery(struct wacom *wacom,
+                                     struct wacom_battery *battery)
+{
+       static atomic_t battery_no = ATOMIC_INIT(0);
+       struct device *dev = &wacom->usbdev->dev;
+       struct power_supply_config psy_cfg = { .drv_data = battery, };
+       struct power_supply *ps_bat;
+       struct power_supply_desc *bat_desc = &battery->bat_desc;
+       unsigned long n;
+       int error;
+
+       if (!devres_open_group(dev, bat_desc, GFP_KERNEL))
+               return -ENOMEM;
+
+       battery->wacom = wacom;
+
+       n = atomic_inc_return(&battery_no) - 1;
+
+       bat_desc->properties = wacom_battery_props;
+       bat_desc->num_properties = ARRAY_SIZE(wacom_battery_props);
+       bat_desc->get_property = wacom_battery_get_property;
+       sprintf(battery->bat_name, "wacom_battery_%ld", n);
+       bat_desc->name = battery->bat_name;
+       bat_desc->type = POWER_SUPPLY_TYPE_USB;
+       bat_desc->use_for_apm = 0;
+
+       ps_bat = devm_power_supply_register(dev, bat_desc, &psy_cfg);
+       if (IS_ERR(ps_bat)) {
+               error = PTR_ERR(ps_bat);
+               goto err;
+       }
+
+       power_supply_powers(ps_bat, &wacom->usbdev->dev);
+
+       battery->battery = ps_bat;
+
+       devres_close_group(dev, bat_desc);
+       return 0;
+
+err:
+       devres_release_group(dev, bat_desc);
        return error;
 }
+#endif
 
 static int wacom_initialize_battery(struct wacom *wacom)
 {
@@ -1298,19 +1346,26 @@ static int wacom_initialize_battery(struct wacom *wacom)
 
 static void wacom_destroy_battery(struct wacom *wacom)
 {
-       if (wacom->battery.battery.dev) {
+       if (WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery)) {
+#ifdef WACOM_POWERSUPPLY_41
+               devres_release_group(&wacom->usbdev->dev,
+                                    &wacom->battery.bat_desc);
+#else
                power_supply_unregister(&wacom->battery.battery);
-               wacom->battery.battery.dev = NULL;
+#endif
+               WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery) = NULL;
        }
 }
 
+#ifndef WACOM_POWERSUPPLY_41
 static void wacom_destroy_remote_battery(struct wacom_battery *battery)
 {
-       if (battery->battery.dev) {
+       if (WACOM_POWERSUPPLY_DEVICE(battery->battery)) {
                power_supply_unregister(&battery->battery);
-               battery->battery.dev = NULL;
+               WACOM_POWERSUPPLY_DEVICE(battery->battery) = NULL;
        }
 }
+#endif
 
 static ssize_t wacom_show_remote_mode(struct kobject *kobj,
                                      struct kobj_attribute *kattr,
@@ -1404,28 +1459,33 @@ static void wacom_remote_destroy_one(struct wacom 
*wacom, unsigned int index)
        remote->remotes[index].registered = false;
        spin_unlock_irqrestore(&remote->remote_lock, flags);
 
-       if (remote->remotes[index].group.name)
-               devres_release_group(&wacom->usbdev->dev,
-                                    &remote->remotes[index]);
-
        if (remote->remotes[index].input)
                input_unregister_device(remote->remotes[index].input);
 
+#ifdef WACOM_POWERSUPPLY_41
+       if (WACOM_POWERSUPPLY_DEVICE(remote->remotes[index].battery.battery))
+               devres_release_group(&wacom->usbdev->dev,
+                                    &remote->remotes[index].battery.bat_desc);
+#else
        if (remote->remotes[index].battery.battery.dev)
                wacom_destroy_remote_battery(&remote->remotes[index].battery);
+#endif
+
+       if (remote->remotes[index].group.name)
+               devres_release_group(&wacom->usbdev->dev,
+                                    &remote->remotes[index]);
 
        for (i = 0; i < WACOM_MAX_REMOTES; i++) {
                if (remote->remotes[i].serial == serial) {
                        remote->remotes[i].serial = 0;
-
                        /* Destroy the attribute group parts not
                         * covered by devres for this kernel.
                         */
                        kfree((char *)remote->remotes[i].group.name);
                        remote->remotes[i].group.name = NULL;
                        remote->remotes[i].registered = false;
-                       remote->remotes[i].battery.battery.dev = NULL;
                        wacom->led.select[i] = WACOM_STATUS_UNKNOWN;
+                       
WACOM_POWERSUPPLY_DEVICE(remote->remotes[i].battery.battery) = NULL;
                }
        }
 }
@@ -1468,16 +1528,21 @@ static const struct attribute *remote_unpair_attrs[] = {
 static void wacom_remotes_destroy(struct wacom *wacom)
 {
        struct wacom_remote *remote = wacom->remote;
+
+#ifndef WACOM_POWERSUPPLY_41
        int i;
+#endif
 
        if (!remote)
                return;
 
+#ifndef WACOM_POWERSUPPLY_41
        for (i = 0; i < WACOM_MAX_REMOTES; i++) {
                if (remote->remotes[i].registered) {
                        wacom_remote_destroy_one(wacom, i);
                }
        }
+#endif
        kobject_put(remote->remote_dir);
        kfifo_free(&remote->remote_fifo);
        wacom->remote = NULL;
@@ -1702,7 +1767,7 @@ static int wacom_remote_attach_battery(struct wacom 
*wacom, int index)
        if (!remote->remotes[index].registered)
                return 0;
 
-       if (remote->remotes[index].battery.battery.dev)
+       if (WACOM_POWERSUPPLY_DEVICE(remote->remotes[index].battery.battery))
                return 0;
 
        error = __wacom_initialize_battery(wacom,
@@ -1858,11 +1923,11 @@ void wacom_battery_work(struct work_struct *work)
        struct wacom *wacom = container_of(work, struct wacom, battery_work);
 
        if ((wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
-            !wacom->battery.battery.dev) {
+            !WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery)) {
                wacom_initialize_battery(wacom);
        }
        else if (!(wacom->wacom_wac.features.quirks & WACOM_QUIRK_BATTERY) &&
-                wacom->battery.battery.dev) {
+                WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery)) {
                wacom_destroy_battery(wacom);
        }
 }
diff --git a/3.7/wacom_wac.c b/3.7/wacom_wac.c
index a02d191..a421aff 100644
--- a/3.7/wacom_wac.c
+++ b/3.7/wacom_wac.c
@@ -76,8 +76,8 @@ static void __wacom_notify_battery(struct wacom_battery 
*battery,
                battery->bat_connected = bat_connected;
                battery->ps_connected = ps_connected;
 
-               if (battery->battery.dev)
-                       power_supply_changed(&battery->battery);
+               if (WACOM_POWERSUPPLY_DEVICE(battery->battery))
+                       
power_supply_changed(WACOM_POWERSUPPLY_REF(battery->battery));
        }
 }
 
@@ -1765,14 +1765,14 @@ static int wacom_status_irq(struct wacom_wac 
*wacom_wac, size_t len)
                wacom_notify_battery(wacom_wac, WACOM_POWER_SUPPLY_STATUS_AUTO,
                                     battery, charging, battery || charging, 1);
 
-               if (!wacom->battery.battery.dev &&
+               if (!WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery) &&
                    !(features->quirks & WACOM_QUIRK_BATTERY)) {
                        features->quirks |= WACOM_QUIRK_BATTERY;
                        wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
                }
        }
        else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
-                wacom->battery.battery.dev) {
+                WACOM_POWERSUPPLY_DEVICE(wacom->battery.battery)) {
                features->quirks &= ~WACOM_QUIRK_BATTERY;
                wacom_schedule_work(wacom_wac, WACOM_WORKER_BATTERY);
                wacom_notify_battery(wacom_wac, POWER_SUPPLY_STATUS_UNKNOWN, 0, 
0, 0, 0);
@@ -1810,7 +1810,7 @@ static int wacom_mspro_device_irq(struct wacom_wac *wacom)
        battery_level = data[1] & 0x7F;
        bat_charging = data[1] & 0x80;
 
-       if (!w->battery.battery.dev &&
+       if (!WACOM_POWERSUPPLY_DEVICE(w->battery.battery) &&
            !(features->quirks & WACOM_QUIRK_BATTERY)) {
                features->quirks |= WACOM_QUIRK_BATTERY;
                wacom_schedule_work(wacom, WACOM_WORKER_BATTERY);
-- 
2.14.3


------------------------------------------------------------------------------
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