Adds support for usages that may appear on the pen or pad interface which
report the state of the tablet battery.

Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoi...@redhat.com>
[jason.gere...@wacom.com: Imported into input-wacom repository (93aab7f)]
Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
[jason.gere...@wacom.com: backported from input-wacom repository (3412062)]
Signed-off-by: Jason Gerecke <jason.gere...@wacom.com>
---
 3.17/wacom_wac.c | 41 ++++++++++++++++++++++++++++++++++++++++-
 3.17/wacom_wac.h | 10 ++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/3.17/wacom_wac.c b/3.17/wacom_wac.c
index 4e21c0d..0e4fb8b 100644
--- a/3.17/wacom_wac.c
+++ b/3.17/wacom_wac.c
@@ -1532,6 +1532,10 @@ static void wacom_wac_pad_usage_mapping(struct 
hid_device *hdev,
        unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
 
        switch (equivalent_usage) {
+       case WACOM_HID_WD_BATTERY_LEVEL:
+       case WACOM_HID_WD_BATTERY_CHARGING:
+               features->quirks |= WACOM_QUIRK_BATTERY;
+               break;
        case WACOM_HID_WD_ACCELEROMETER_X:
                __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
                wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 0);
@@ -1581,8 +1585,25 @@ static int wacom_wac_pad_event(struct hid_device *hdev, 
struct hid_field *field,
                wacom_wac->hid_data.inrange_state |= value;
        }
 
-       if (equivalent_usage != WACOM_HID_WD_TOUCHRINGSTATUS)
+       switch (equivalent_usage) {
+       case WACOM_HID_WD_BATTERY_LEVEL:
+               wacom_wac->hid_data.battery_capacity = value;
+               wacom_wac->hid_data.bat_connected = 1;
+               return 0;
+
+       case WACOM_HID_WD_BATTERY_CHARGING:
+               wacom_wac->hid_data.bat_charging = value;
+               wacom_wac->hid_data.ps_connected = value;
+               wacom_wac->hid_data.bat_connected = 1;
+               return 0;
+
+       case WACOM_HID_WD_TOUCHRINGSTATUS:
+               return 0;
+
+       default:
                input_event(input, usage->type, usage->code, value);
+               break;
+       }
 
        return 0;
 }
@@ -1601,6 +1622,7 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
 {
        struct wacom *wacom = hid_get_drvdata(hdev);
        struct wacom_wac *wacom_wac = &wacom->wacom_wac;
+       struct wacom_features *features = &wacom_wac->features;
        struct input_dev *input = wacom_wac->pad_input;
        bool active = wacom_wac->hid_data.inrange_state != 0;
 
@@ -1611,6 +1633,16 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
        if (wacom_equivalent_usage(report->field[0]->physical) == 
HID_DG_TABLETFUNCTIONKEY)
                input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 
0);
 
+       if (features->quirks & WACOM_QUIRK_BATTERY) {
+               int capacity = wacom_wac->hid_data.battery_capacity;
+               bool charging = wacom_wac->hid_data.bat_charging;
+               bool connected = wacom_wac->hid_data.bat_connected;
+               bool powered = wacom_wac->hid_data.ps_connected;
+
+               wacom_notify_battery(wacom_wac, capacity, charging,
+                                    connected, powered);
+       }
+
        input_sync(input);
 }
 
@@ -1640,6 +1672,9 @@ static void wacom_wac_pen_usage_mapping(struct hid_device 
*hdev,
        case HID_DG_INRANGE:
                wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
                break;
+       case HID_DG_BATTERYSTRENGTH:
+               features->quirks |= WACOM_QUIRK_BATTERY;
+               break;
        case HID_DG_INVERT:
                wacom_map_usage(input, usage, field, EV_KEY,
                                BTN_TOOL_RUBBER, 0);
@@ -1710,6 +1745,10 @@ static int wacom_wac_pen_event(struct hid_device *hdev, 
struct hid_field *field,
                if (!(features->quirks & WACOM_QUIRK_SENSE))
                        wacom_wac->hid_data.sense_state = value;
                return 0;
+       case HID_DG_BATTERYSTRENGTH:
+               wacom_wac->hid_data.battery_capacity = value;
+               wacom_wac->hid_data.bat_connected = 1;
+               break;
        case HID_DG_INVERT:
                wacom_wac->hid_data.invert_state = value;
                return 0;
diff --git a/3.17/wacom_wac.h b/3.17/wacom_wac.h
index e6e1c23..4cbf58a 100644
--- a/3.17/wacom_wac.h
+++ b/3.17/wacom_wac.h
@@ -85,6 +85,10 @@
 #define WACOM_DEVICETYPE_WL_MONITOR     0x0008
 #define WACOM_DEVICETYPE_DIRECT         0x0010
 
+#ifndef HID_DG_BATTERYSTRENGTH
+#define HID_DG_BATTERYSTRENGTH          (HID_UP_DIGITIZER | 0x3B)
+#endif
+
 #ifndef HID_DG_TILT_X
 #define HID_DG_TILT_X                   (HID_UP_DIGITIZER | 0x3D)
 #endif
@@ -113,6 +117,8 @@
 #define WACOM_HID_WD_ACCELEROMETER_X    (WACOM_HID_UP_WACOMDIGITIZER | 0x0401)
 #define WACOM_HID_WD_ACCELEROMETER_Y    (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
 #define WACOM_HID_WD_ACCELEROMETER_Z    (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
+#define WACOM_HID_WD_BATTERY_CHARGING   (WACOM_HID_UP_WACOMDIGITIZER | 0x0404)
+#define WACOM_HID_WD_BATTERY_LEVEL      (WACOM_HID_UP_WACOMDIGITIZER | 0x043b)
 #define WACOM_HID_WD_EXPRESSKEY00       (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
 #define WACOM_HID_WD_BUTTONHOME         (WACOM_HID_UP_WACOMDIGITIZER | 0x0990)
 #define WACOM_HID_WD_BUTTONUP           (WACOM_HID_UP_WACOMDIGITIZER | 0x0991)
@@ -269,6 +275,10 @@ struct hid_data {
        int last_slot_field;
        int num_expected;
        int num_received;
+       int battery_capacity;
+       int bat_charging;
+       int bat_connected;
+       int ps_connected;
 };
 
 struct wacom_remote_data {
-- 
2.10.2


------------------------------------------------------------------------------
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to