aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Armstrong Skomra <skomra@gmail.com>2017-01-25 15:08:42 -0500
committerJiri Kosina <jkosina@suse.cz>2017-01-26 15:46:45 -0500
commit10c55cacb8b20518fddf92de43fbfb198f288eb2 (patch)
tree530ff17adcfb4421b67e57fd30610ae4111a8373
parentd2ec58aee8b1d68d309656a0561c81c12197a987 (diff)
HID: wacom: generic: support LEDs
Add support for the LEDs around the mode switch to the generic code path in support of the second generation Intuos Pro. Signed-off-by: Aaron Skomra <aaron.skomra@wacom.com> Reviewed-by: Ping Cheng <pingc@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/wacom.h2
-rw-r--r--drivers/hid/wacom_sys.c39
-rw-r--r--drivers/hid/wacom_wac.c14
-rw-r--r--drivers/hid/wacom_wac.h1
4 files changed, 52 insertions, 4 deletions
diff --git a/drivers/hid/wacom.h b/drivers/hid/wacom.h
index 0e7b840bb80b..d0d7dc1572ca 100644
--- a/drivers/hid/wacom.h
+++ b/drivers/hid/wacom.h
@@ -168,6 +168,7 @@ struct wacom {
168 struct work_struct remote_work; 168 struct work_struct remote_work;
169 struct delayed_work init_work; 169 struct delayed_work init_work;
170 struct wacom_remote *remote; 170 struct wacom_remote *remote;
171 bool generic_has_leds;
171 struct wacom_leds { 172 struct wacom_leds {
172 struct wacom_group_leds *groups; 173 struct wacom_group_leds *groups;
173 unsigned int count; 174 unsigned int count;
@@ -220,4 +221,5 @@ struct wacom_led *wacom_led_find(struct wacom *wacom, unsigned int group,
220 unsigned int id); 221 unsigned int id);
221struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur); 222struct wacom_led *wacom_led_next(struct wacom *wacom, struct wacom_led *cur);
222int wacom_equivalent_usage(int usage); 223int wacom_equivalent_usage(int usage);
224int wacom_initialize_leds(struct wacom *wacom);
223#endif 225#endif
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index a8e68dc2ca99..3586acbdb467 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -771,8 +771,13 @@ static int wacom_led_control(struct wacom *wacom)
771 if (!buf) 771 if (!buf)
772 return -ENOMEM; 772 return -ENOMEM;
773 773
774 if (wacom->wacom_wac.features.type >= INTUOS5S && 774 if (wacom->wacom_wac.features.type == HID_GENERIC) {
775 wacom->wacom_wac.features.type <= INTUOSPL) { 775 buf[0] = WAC_CMD_LED_CONTROL_GENERIC;
776 buf[1] = wacom->led.llv;
777 buf[2] = wacom->led.groups[0].select & 0x03;
778
779 } else if ((wacom->wacom_wac.features.type >= INTUOS5S &&
780 wacom->wacom_wac.features.type <= INTUOSPL)) {
776 /* 781 /*
777 * Touch Ring and crop mark LED luminance may take on 782 * Touch Ring and crop mark LED luminance may take on
778 * one of four values: 783 * one of four values:
@@ -1042,6 +1047,17 @@ static struct attribute_group intuos5_led_attr_group = {
1042 .attrs = intuos5_led_attrs, 1047 .attrs = intuos5_led_attrs,
1043}; 1048};
1044 1049
1050static struct attribute *generic_led_attrs[] = {
1051 &dev_attr_status0_luminance.attr,
1052 &dev_attr_status_led0_select.attr,
1053 NULL
1054};
1055
1056static struct attribute_group generic_led_attr_group = {
1057 .name = "wacom_led",
1058 .attrs = generic_led_attrs,
1059};
1060
1045struct wacom_sysfs_group_devres { 1061struct wacom_sysfs_group_devres {
1046 struct attribute_group *group; 1062 struct attribute_group *group;
1047 struct kobject *root; 1063 struct kobject *root;
@@ -1363,7 +1379,7 @@ static int wacom_leds_alloc_and_register(struct wacom *wacom, int group_count,
1363 return 0; 1379 return 0;
1364} 1380}
1365 1381
1366static int wacom_initialize_leds(struct wacom *wacom) 1382int wacom_initialize_leds(struct wacom *wacom)
1367{ 1383{
1368 int error; 1384 int error;
1369 1385
@@ -1372,6 +1388,23 @@ static int wacom_initialize_leds(struct wacom *wacom)
1372 1388
1373 /* Initialize default values */ 1389 /* Initialize default values */
1374 switch (wacom->wacom_wac.features.type) { 1390 switch (wacom->wacom_wac.features.type) {
1391 case HID_GENERIC:
1392 if (!wacom->generic_has_leds)
1393 return 0;
1394 wacom->led.llv = 100;
1395 wacom->led.max_llv = 100;
1396
1397 error = wacom_leds_alloc_and_register(wacom, 1, 4, false);
1398 if (error) {
1399 hid_err(wacom->hdev,
1400 "cannot create leds err: %d\n", error);
1401 return error;
1402 }
1403
1404 error = wacom_devm_sysfs_create_group(wacom,
1405 &generic_led_attr_group);
1406 break;
1407
1375 case INTUOS4S: 1408 case INTUOS4S:
1376 case INTUOS4: 1409 case INTUOS4:
1377 case INTUOS4WL: 1410 case INTUOS4WL:
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index 06d152a286a0..0dad786d2135 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -43,6 +43,8 @@ static void wacom_report_numbered_buttons(struct input_dev *input_dev,
43 43
44static int wacom_numbered_button_to_key(int n); 44static int wacom_numbered_button_to_key(int n);
45 45
46static void wacom_update_led(struct wacom *wacom, int button_count, int mask,
47 int group);
46/* 48/*
47 * Percent of battery capacity for Graphire. 49 * Percent of battery capacity for Graphire.
48 * 8th value means AC online and show 100% capacity. 50 * 8th value means AC online and show 100% capacity.
@@ -1715,12 +1717,14 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev,
1715 wacom_map_usage(input, usage, field, EV_ABS, ABS_Z, 0); 1717 wacom_map_usage(input, usage, field, EV_ABS, ABS_Z, 0);
1716 features->device_type |= WACOM_DEVICETYPE_PAD; 1718 features->device_type |= WACOM_DEVICETYPE_PAD;
1717 break; 1719 break;
1720 case WACOM_HID_WD_BUTTONCENTER:
1721 wacom->generic_has_leds = true;
1722 /* fall through */
1718 case WACOM_HID_WD_BUTTONHOME: 1723 case WACOM_HID_WD_BUTTONHOME:
1719 case WACOM_HID_WD_BUTTONUP: 1724 case WACOM_HID_WD_BUTTONUP:
1720 case WACOM_HID_WD_BUTTONDOWN: 1725 case WACOM_HID_WD_BUTTONDOWN:
1721 case WACOM_HID_WD_BUTTONLEFT: 1726 case WACOM_HID_WD_BUTTONLEFT:
1722 case WACOM_HID_WD_BUTTONRIGHT: 1727 case WACOM_HID_WD_BUTTONRIGHT:
1723 case WACOM_HID_WD_BUTTONCENTER:
1724 wacom_map_usage(input, usage, field, EV_KEY, 1728 wacom_map_usage(input, usage, field, EV_KEY,
1725 wacom_numbered_button_to_key(features->numbered_buttons), 1729 wacom_numbered_button_to_key(features->numbered_buttons),
1726 0); 1730 0);
@@ -1797,7 +1801,9 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
1797 struct wacom *wacom = hid_get_drvdata(hdev); 1801 struct wacom *wacom = hid_get_drvdata(hdev);
1798 struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1802 struct wacom_wac *wacom_wac = &wacom->wacom_wac;
1799 struct input_dev *input = wacom_wac->pad_input; 1803 struct input_dev *input = wacom_wac->pad_input;
1804 struct wacom_features *features = &wacom_wac->features;
1800 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid); 1805 unsigned equivalent_usage = wacom_equivalent_usage(usage->hid);
1806 int i;
1801 1807
1802 /* 1808 /*
1803 * Avoid reporting this event and setting inrange_state if this usage 1809 * Avoid reporting this event and setting inrange_state if this usage
@@ -1824,6 +1830,12 @@ static void wacom_wac_pad_event(struct hid_device *hdev, struct hid_field *field
1824 input_sync(wacom_wac->shared->touch_input); 1830 input_sync(wacom_wac->shared->touch_input);
1825 } 1831 }
1826 break; 1832 break;
1833
1834 case WACOM_HID_WD_BUTTONCENTER:
1835 for (i = 0; i < wacom->led.count; i++)
1836 wacom_update_led(wacom, features->numbered_buttons,
1837 value, i);
1838 /* fall through*/
1827 default: 1839 default:
1828 input_event(input, usage->type, usage->code, value); 1840 input_event(input, usage->type, usage->code, value);
1829 break; 1841 break;
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index 4feaf94fb08b..857ccee16f38 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -79,6 +79,7 @@
79#define WAC_CMD_ICON_XFER 0x23 79#define WAC_CMD_ICON_XFER 0x23
80#define WAC_CMD_ICON_BT_XFER 0x26 80#define WAC_CMD_ICON_BT_XFER 0x26
81#define WAC_CMD_DELETE_PAIRING 0x20 81#define WAC_CMD_DELETE_PAIRING 0x20
82#define WAC_CMD_LED_CONTROL_GENERIC 0x32
82#define WAC_CMD_UNPAIR_ALL 0xFF 83#define WAC_CMD_UNPAIR_ALL 0xFF
83#define WAC_CMD_WL_INTUOSP2 0x82 84#define WAC_CMD_WL_INTUOSP2 0x82
84 85