HID: wacom: Provide battery charge state to system over USB if available
authorJason Gerecke <killertofu@gmail.com>
Fri, 6 Mar 2015 19:47:41 +0000 (11:47 -0800)
committerJiri Kosina <jkosina@suse.cz>
Wed, 11 Mar 2015 15:46:12 +0000 (11:46 -0400)
If a wireless adapter (which contains the charging circuitry) is
detected as being attached to the tablet then create a new battery
interface and update its status as data is reported. Also destroy the
battery if the adapter goes away.

Signed-off-by: Jason Gerecke <killertofu@gmail.com>
Acked-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/wacom_wac.c

index 5d57fec177a8a72e7ea0d6a313cd57c91044e0e7..f1e53f15abb528ca70fc669fa3aa242dd1ca3628 100644 (file)
@@ -1952,6 +1952,7 @@ static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len)
 
 static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
 {
+       struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
        struct wacom_features *features = &wacom_wac->features;
        unsigned char *data = wacom_wac->data;
 
@@ -1965,6 +1966,30 @@ static int wacom_status_irq(struct wacom_wac *wacom_wac, size_t len)
                                    SW_MUTE_DEVICE, data[8] & 0x40);
                input_sync(wacom_wac->shared->touch_input);
        }
+
+       if (data[9] & 0x02) { /* wireless module is attached */
+               int battery = (data[8] & 0x3f) * 100 / 31;
+               bool ps_connected = !!(data[8] & 0x80);
+               bool charging = ps_connected &&
+                               wacom_wac->battery_capacity < 100;
+
+               wacom_notify_battery(wacom_wac, battery, charging,
+                                    ps_connected);
+
+               if (!wacom->battery.dev &&
+                   !(features->quirks & WACOM_QUIRK_BATTERY)) {
+                       features->quirks |= WACOM_QUIRK_BATTERY;
+                       INIT_WORK(&wacom->work, wacom_battery_work);
+                       wacom_schedule_work(wacom_wac);
+               }
+       }
+       else if ((features->quirks & WACOM_QUIRK_BATTERY) &&
+                wacom->battery.dev) {
+               features->quirks &= ~WACOM_QUIRK_BATTERY;
+               INIT_WORK(&wacom->work, wacom_battery_work);
+               wacom_schedule_work(wacom_wac);
+               wacom_notify_battery(wacom_wac, 0, 0, 0);
+       }
        return 0;
 }