Or Gnome complains about an empty battery.

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 (9f1015d)]
Signed-off-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
[aaron.sko...@wacom.com: Backported from input-wacom repository (4cbb4d9)]
Signed-off-by: Aaron Armstrong Skomra <aaron.sko...@wacom.com>
---
 2.6.38/wacom_sys.c | 28 ++++++++++++++++++++++------
 3.17/wacom_sys.c   | 50 ++++++++++++++++++++++++++++++++++++++++++++------
 3.7/wacom_sys.c    | 28 ++++++++++++++++++++++------
 3 files changed, 88 insertions(+), 18 deletions(-)

diff --git a/2.6.38/wacom_sys.c b/2.6.38/wacom_sys.c
index 5683cd8..481942a 100644
--- a/2.6.38/wacom_sys.c
+++ b/2.6.38/wacom_sys.c
@@ -1372,6 +1372,7 @@ static void wacom_remote_destroy_one(struct wacom *wacom, 
unsigned int index)
                        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;
                }
        }
@@ -1631,11 +1632,6 @@ static int wacom_remote_create_one(struct wacom *wacom, 
u32 serial,
 
        remote->remotes[index].registered = true;
 
-       error = __wacom_initialize_battery(wacom,
-                                          &remote->remotes[index].battery);
-       if (error)
-               goto fail;
-
        devres_close_group(dev, &remote->remotes[index]);
 
        return 0;
@@ -1649,6 +1645,24 @@ fail:
        return error;
 }
 
+static int wacom_remote_attach_battery(struct wacom *wacom, int index)
+{
+       struct wacom_remote *remote = wacom->remote;
+       int error;
+       if (!remote->remotes[index].registered)
+               return 0;
+
+       if (remote->remotes[index].battery.battery.dev)
+               return 0;
+
+       error = __wacom_initialize_battery(wacom,
+                                          
&wacom->remote->remotes[index].battery);
+       if (error)
+               return error;
+
+       return 0;
+}
+
 /*
  * Not all devices report physical dimensions from HID.
  * Compute the default from hardcoded logical dimension
@@ -1830,8 +1844,10 @@ static void wacom_remote_work(struct work_struct *work)
                serial = data.remote[i].serial;
                if (data.remote[i].connected) {
 
-                       if (remote->remotes[i].serial == serial)
+                       if (remote->remotes[i].serial == serial) {
+                               wacom_remote_attach_battery(wacom, i);
                                continue;
+                       }
 
                        if (remote->remotes[i].serial)
                                wacom_remote_destroy_one(wacom, i);
diff --git a/3.17/wacom_sys.c b/3.17/wacom_sys.c
index 793cb72..29a5396 100644
--- a/3.17/wacom_sys.c
+++ b/3.17/wacom_sys.c
@@ -2020,6 +2020,16 @@ fail:
        return;
 }
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,1,0)
+static void wacom_destroy_remote_battery(struct wacom_battery *battery)
+{
+       if (battery->battery.dev) {
+               power_supply_unregister(&battery->battery);
+               battery->battery.dev = NULL;
+       }
+}
+#endif
+
 static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
 {
        struct wacom_remote *remote = wacom->remote;
@@ -2031,6 +2041,15 @@ 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 LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)
+       if (WACOM_POWERSUPPLY_DEVICE(remote->remotes[index].battery.battery))
+                devres_release_group(&wacom->hdev->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->hdev->dev,
                                     &remote->remotes[index]);
@@ -2040,6 +2059,7 @@ static void wacom_remote_destroy_one(struct wacom *wacom, 
unsigned int index)
                        remote->remotes[i].serial = 0;
                        remote->remotes[i].group.name = NULL;
                        remote->remotes[i].registered = false;
+                       
WACOM_POWERSUPPLY_DEVICE(remote->remotes[i].battery.battery) = NULL;
                        wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
                }
        }
@@ -2096,11 +2116,6 @@ static int wacom_remote_create_one(struct wacom *wacom, 
u32 serial,
        if (error)
                goto fail;
 
-       error = __wacom_initialize_battery(wacom,
-                                          &remote->remotes[index].battery);
-       if (error)
-                goto fail;
-
        remote->remotes[index].registered = true;
 
        devres_close_group(dev, &remote->remotes[index]);
@@ -2112,6 +2127,27 @@ fail:
        return error;
 }
 
+static int wacom_remote_attach_battery(struct wacom *wacom, int index)
+{
+       struct wacom_remote *remote = wacom->remote;
+       int error;
+       if (!remote->remotes[index].registered)
+               return 0;
+
+       if (WACOM_POWERSUPPLY_DEVICE(remote->remotes[index].battery.battery))
+               return 0;
+
+       if (wacom->led.groups[index].select == WACOM_STATUS_UNKNOWN)
+               return 0;
+
+       error = __wacom_initialize_battery(wacom,
+                                          
&wacom->remote->remotes[index].battery);
+       if (error)
+               return error;
+
+       return 0;
+}
+
 static void wacom_remote_work(struct work_struct *work)
 {
        struct wacom *wacom = container_of(work, struct wacom, remote_work);
@@ -2142,8 +2178,10 @@ static void wacom_remote_work(struct work_struct *work)
                serial = data.remote[i].serial;
                if (data.remote[i].connected) {
 
-                       if (remote->remotes[i].serial == serial)
+                       if (remote->remotes[i].serial == serial) {
+                               wacom_remote_attach_battery(wacom, i);
                                continue;
+                       }
 
                        if (remote->remotes[i].serial)
                                wacom_remote_destroy_one(wacom, i);
diff --git a/3.7/wacom_sys.c b/3.7/wacom_sys.c
index 0094ff5..37e1700 100644
--- a/3.7/wacom_sys.c
+++ b/3.7/wacom_sys.c
@@ -1365,6 +1365,7 @@ static void wacom_remote_destroy_one(struct wacom *wacom, 
unsigned int index)
                        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;
                }
        }
@@ -1622,11 +1623,6 @@ static int wacom_remote_create_one(struct wacom *wacom, 
u32 serial,
 
        remote->remotes[index].registered = true;
 
-       error = __wacom_initialize_battery(wacom,
-                                          &remote->remotes[index].battery);
-       if (error)
-               goto fail;
-
        devres_close_group(dev, &remote->remotes[index]);
 
        return 0;
@@ -1640,6 +1636,24 @@ fail:
        return error;
 }
 
+static int wacom_remote_attach_battery(struct wacom *wacom, int index)
+{
+       struct wacom_remote *remote = wacom->remote;
+       int error;
+       if (!remote->remotes[index].registered)
+               return 0;
+
+       if (remote->remotes[index].battery.battery.dev)
+               return 0;
+
+       error = __wacom_initialize_battery(wacom,
+                                          
&wacom->remote->remotes[index].battery);
+       if (error)
+               return error;
+
+       return 0;
+}
+
 /*
  * Not all devices report physical dimensions from HID.
  * Compute the default from hardcoded logical dimension
@@ -1825,8 +1839,10 @@ static void wacom_remote_work(struct work_struct *work)
                serial = data.remote[i].serial;
                if (data.remote[i].connected) {
 
-                       if (remote->remotes[i].serial == serial)
+                       if (remote->remotes[i].serial == serial) {
+                               wacom_remote_attach_battery(wacom, i);
                                continue;
+                       }
 
                        if (remote->remotes[i].serial)
                                wacom_remote_destroy_one(wacom, i);
-- 
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