aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gerecke <killertofu@gmail.com>2016-10-19 21:03:52 -0400
committerJiri Kosina <jkosina@suse.cz>2016-10-20 03:54:00 -0400
commit93aab7fa4f8091d8fe2aed7e79a650fc1c084512 (patch)
tree0061ecf62f45a7c31822f621435946a8f4e14455
parent5922e613256f159f8d53d99b17379f362e544541 (diff)
HID: wacom: generic: Add support for battery status on pen and pad interfaces
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.gerecke@wacom.com> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/wacom_wac.c41
-rw-r--r--drivers/hid/wacom_wac.h6
-rw-r--r--include/linux/hid.h1
3 files changed, 47 insertions, 1 deletions
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 70de1fa930cc..f3edecf52c06 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -1525,6 +1525,10 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
1525 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid); 1525 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1526 1526
1527 switch (equivalent_usage) { 1527 switch (equivalent_usage) {
1528 case WACOM_HID_WD_BATTERY_LEVEL:
1529 case WACOM_HID_WD_BATTERY_CHARGING:
1530 features->quirks |= WACOM_QUIRK_BATTERY;
1531 break;
1528 case WACOM_HID_WD_ACCELEROMETER_X: 1532 case WACOM_HID_WD_ACCELEROMETER_X:
1529 __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit); 1533 __set_bit(INPUT_PROP_ACCELEROMETER, input->propbit);
1530 wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 0); 1534 wacom_map_usage(input, usage, field, EV_ABS, ABS_X, 0);
@@ -1574,8 +1578,25 @@ static int wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field,
1574 wacom_wac->hid_data.inrange_state |= value; 1578 wacom_wac->hid_data.inrange_state |= value;
1575 } 1579 }
1576 1580
1577 if (equivalent_usage != WACOM_HID_WD_TOUCHRINGSTATUS) 1581 switch (equivalent_usage) {
1582 case WACOM_HID_WD_BATTERY_LEVEL:
1583 wacom_wac->hid_data.battery_capacity = value;
1584 wacom_wac->hid_data.bat_connected = 1;
1585 return 0;
1586
1587 case WACOM_HID_WD_BATTERY_CHARGING:
1588 wacom_wac->hid_data.bat_charging = value;
1589 wacom_wac->hid_data.ps_connected = value;
1590 wacom_wac->hid_data.bat_connected = 1;
1591 return 0;
1592
1593 case WACOM_HID_WD_TOUCHRINGSTATUS:
1594 return 0;
1595
1596 default:
1578 input_event(input, usage->type, usage->code, value); 1597 input_event(input, usage->type, usage->code, value);
1598 break;
1599 }
1579 1600
1580 return 0; 1601 return 0;
1581} 1602}
@@ -1594,6 +1615,7 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
1594{ 1615{
1595 struct wacom *wacom = hid_get_drvdata(hdev); 1616 struct wacom *wacom = hid_get_drvdata(hdev);
1596 struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1617 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1618 struct wacom_features *features = &wacom_wac->features;
1597 struct input_dev *input = wacom_wac->pad_input; 1619 struct input_dev *input = wacom_wac->pad_input;
1598 bool active = wacom_wac->hid_data.inrange_state != 0; 1620 bool active = wacom_wac->hid_data.inrange_state != 0;
1599 1621
@@ -1604,6 +1626,16 @@ static void wacom_wac_pad_report(struct hid_device *hdev,
1604 if (wacom_equivalent_usage(report->field[0]->physical) == HID_DG_TABLETFUNCTIONKEY) 1626 if (wacom_equivalent_usage(report->field[0]->physical) == HID_DG_TABLETFUNCTIONKEY)
1605 input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0); 1627 input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0);
1606 1628
1629 if (features->quirks & WACOM_QUIRK_BATTERY) {
1630 int capacity = wacom_wac->hid_data.battery_capacity;
1631 bool charging = wacom_wac->hid_data.bat_charging;
1632 bool connected = wacom_wac->hid_data.bat_connected;
1633 bool powered = wacom_wac->hid_data.ps_connected;
1634
1635 wacom_notify_battery(wacom_wac, capacity, charging,
1636 connected, powered);
1637 }
1638
1607 input_sync(input); 1639 input_sync(input);
1608} 1640}
1609 1641
@@ -1633,6 +1665,9 @@ static void wacom_wac_pen_usage_mapping(struct hid_device *hdev,
1633 case HID_DG_INRANGE: 1665 case HID_DG_INRANGE:
1634 wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0); 1666 wacom_map_usage(input, usage, field, EV_KEY, BTN_TOOL_PEN, 0);
1635 break; 1667 break;
1668 case HID_DG_BATTERYSTRENGTH:
1669 features->quirks |= WACOM_QUIRK_BATTERY;
1670 break;
1636 case HID_DG_INVERT: 1671 case HID_DG_INVERT:
1637 wacom_map_usage(input, usage, field, EV_KEY, 1672 wacom_map_usage(input, usage, field, EV_KEY,
1638 BTN_TOOL_RUBBER, 0); 1673 BTN_TOOL_RUBBER, 0);
@@ -1703,6 +1738,10 @@ static int wacom_wac_pen_event(struct hid_device *hdev, struct hid_field *field,
1703 if (!(features->quirks & WACOM_QUIRK_SENSE)) 1738 if (!(features->quirks & WACOM_QUIRK_SENSE))
1704 wacom_wac->hid_data.sense_state = value; 1739 wacom_wac->hid_data.sense_state = value;
1705 return 0; 1740 return 0;
1741 case HID_DG_BATTERYSTRENGTH:
1742 wacom_wac->hid_data.battery_capacity = value;
1743 wacom_wac->hid_data.bat_connected = 1;
1744 break;
1706 case HID_DG_INVERT: 1745 case HID_DG_INVERT:
1707 wacom_wac->hid_data.invert_state = value; 1746 wacom_wac->hid_data.invert_state = value;
1708 return 0; 1747 return 0;
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 1f7c4a86d91b..7418c9715d31 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -101,6 +101,8 @@
101#define WACOM_HID_WD_ACCELEROMETER_X (WACOM_HID_UP_WACOMDIGITIZER | 0x0401) 101#define WACOM_HID_WD_ACCELEROMETER_X (WACOM_HID_UP_WACOMDIGITIZER | 0x0401)
102#define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402) 102#define WACOM_HID_WD_ACCELEROMETER_Y (WACOM_HID_UP_WACOMDIGITIZER | 0x0402)
103#define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403) 103#define WACOM_HID_WD_ACCELEROMETER_Z (WACOM_HID_UP_WACOMDIGITIZER | 0x0403)
104#define WACOM_HID_WD_BATTERY_CHARGING (WACOM_HID_UP_WACOMDIGITIZER | 0x0404)
105#define WACOM_HID_WD_BATTERY_LEVEL (WACOM_HID_UP_WACOMDIGITIZER | 0x043b)
104#define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910) 106#define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
105#define WACOM_HID_WD_BUTTONHOME (WACOM_HID_UP_WACOMDIGITIZER | 0x0990) 107#define WACOM_HID_WD_BUTTONHOME (WACOM_HID_UP_WACOMDIGITIZER | 0x0990)
106#define WACOM_HID_WD_BUTTONUP (WACOM_HID_UP_WACOMDIGITIZER | 0x0991) 108#define WACOM_HID_WD_BUTTONUP (WACOM_HID_UP_WACOMDIGITIZER | 0x0991)
@@ -257,6 +259,10 @@ struct hid_data {
257 int last_slot_field; 259 int last_slot_field;
258 int num_expected; 260 int num_expected;
259 int num_received; 261 int num_received;
262 int battery_capacity;
263 int bat_charging;
264 int bat_connected;
265 int ps_connected;
260}; 266};
261 267
262struct wacom_remote_data { 268struct wacom_remote_data {
diff --git a/include/linux/hid.h b/include/linux/hid.h
index e712101a1670..3baa2f962e48 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -231,6 +231,7 @@ struct hid_item {
231#define HID_DG_TAP 0x000d0035 231#define HID_DG_TAP 0x000d0035
232#define HID_DG_TABLETFUNCTIONKEY 0x000d0039 232#define HID_DG_TABLETFUNCTIONKEY 0x000d0039
233#define HID_DG_PROGRAMCHANGEKEY 0x000d003a 233#define HID_DG_PROGRAMCHANGEKEY 0x000d003a
234#define HID_DG_BATTERYSTRENGTH 0x000d003b
234#define HID_DG_INVERT 0x000d003c 235#define HID_DG_INVERT 0x000d003c
235#define HID_DG_TILT_X 0x000d003d 236#define HID_DG_TILT_X 0x000d003d
236#define HID_DG_TILT_Y 0x000d003e 237#define HID_DG_TILT_Y 0x000d003e