aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2016-07-13 12:06:02 -0400
committerJiri Kosina <jkosina@suse.cz>2016-08-05 07:39:16 -0400
commit83e6b40e2de6f8416ce6c8c3ca6c4bc8acfa8b32 (patch)
tree615def2263f412c2f4971a96b164b765e5921f7b
parente6f2813a6d3fd924a399f8b19bcd8b11487155bc (diff)
HID: wacom: EKR: have the wacom resources dynamically allocated
If we want to have one input device per remote, it's better to have our own struct wacom_remote which is dynamically allocated. Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Acked-by: Ping Cheng <pingc@wacom.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/wacom.h13
-rw-r--r--drivers/hid/wacom_sys.c133
-rw-r--r--drivers/hid/wacom_wac.c12
-rw-r--r--drivers/hid/wacom_wac.h2
4 files changed, 94 insertions, 66 deletions
diff --git a/drivers/hid/wacom.h b/drivers/hid/wacom.h
index 1797e4b3662a..110ea6793b99 100644
--- a/drivers/hid/wacom.h
+++ b/drivers/hid/wacom.h
@@ -116,6 +116,14 @@ struct wacom_group_leds {
116 u8 select; /* status led selector (0..3) */ 116 u8 select; /* status led selector (0..3) */
117}; 117};
118 118
119struct wacom_remote {
120 spinlock_t remote_lock;
121 struct kfifo remote_fifo;
122 struct kobject *remote_dir;
123 struct attribute_group remote_group[WACOM_MAX_REMOTES];
124 __u32 serial[WACOM_MAX_REMOTES];
125};
126
119struct wacom { 127struct wacom {
120 struct usb_device *usbdev; 128 struct usb_device *usbdev;
121 struct usb_interface *intf; 129 struct usb_interface *intf;
@@ -125,8 +133,7 @@ struct wacom {
125 struct work_struct wireless_work; 133 struct work_struct wireless_work;
126 struct work_struct battery_work; 134 struct work_struct battery_work;
127 struct work_struct remote_work; 135 struct work_struct remote_work;
128 spinlock_t remote_lock; 136 struct wacom_remote *remote;
129 struct kfifo remote_fifo;
130 struct wacom_leds { 137 struct wacom_leds {
131 struct wacom_group_leds *groups; 138 struct wacom_group_leds *groups;
132 u8 llv; /* status led brightness no button (1..127) */ 139 u8 llv; /* status led brightness no button (1..127) */
@@ -137,8 +144,6 @@ struct wacom {
137 struct power_supply *ac; 144 struct power_supply *ac;
138 struct power_supply_desc battery_desc; 145 struct power_supply_desc battery_desc;
139 struct power_supply_desc ac_desc; 146 struct power_supply_desc ac_desc;
140 struct kobject *remote_dir;
141 struct attribute_group remote_group[5];
142 bool resources; 147 bool resources;
143}; 148};
144 149
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index 7e01117433dd..64acb71adde4 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -1298,18 +1298,18 @@ static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
1298 int index) 1298 int index)
1299{ 1299{
1300 int error = 0; 1300 int error = 0;
1301 struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1301 struct wacom_remote *remote = wacom->remote;
1302 1302
1303 wacom_wac->serial[index] = serial; 1303 remote->serial[index] = serial;
1304 1304
1305 wacom->remote_group[index].name = devm_kasprintf(&wacom->hdev->dev, 1305 remote->remote_group[index].name = devm_kasprintf(&wacom->hdev->dev,
1306 GFP_KERNEL, 1306 GFP_KERNEL,
1307 "%d", serial); 1307 "%d", serial);
1308 if (!wacom->remote_group[index].name) 1308 if (!remote->remote_group[index].name)
1309 return -ENOMEM; 1309 return -ENOMEM;
1310 1310
1311 error = sysfs_create_group(wacom->remote_dir, 1311 error = sysfs_create_group(remote->remote_dir,
1312 &wacom->remote_group[index]); 1312 &remote->remote_group[index]);
1313 if (error) { 1313 if (error) {
1314 hid_err(wacom->hdev, 1314 hid_err(wacom->hdev,
1315 "cannot create sysfs group err: %d\n", error); 1315 "cannot create sysfs group err: %d\n", error);
@@ -1321,22 +1321,22 @@ static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
1321 1321
1322static void wacom_remote_destroy_attr_group(struct wacom *wacom, __u32 serial) 1322static void wacom_remote_destroy_attr_group(struct wacom *wacom, __u32 serial)
1323{ 1323{
1324 struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1324 struct wacom_remote *remote = wacom->remote;
1325 int i; 1325 int i;
1326 1326
1327 if (!serial) 1327 if (!serial)
1328 return; 1328 return;
1329 1329
1330 for (i = 0; i < WACOM_MAX_REMOTES; i++) { 1330 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1331 if (wacom_wac->serial[i] == serial) { 1331 if (remote->serial[i] == serial) {
1332 wacom_wac->serial[i] = 0; 1332 remote->serial[i] = 0;
1333 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN; 1333 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
1334 if (wacom->remote_group[i].name) { 1334 if (remote->remote_group[i].name) {
1335 sysfs_remove_group(wacom->remote_dir, 1335 sysfs_remove_group(remote->remote_dir,
1336 &wacom->remote_group[i]); 1336 &remote->remote_group[i]);
1337 devm_kfree(&wacom->hdev->dev, 1337 devm_kfree(&wacom->hdev->dev,
1338 (char *)wacom->remote_group[i].name); 1338 (char *)remote->remote_group[i].name);
1339 wacom->remote_group[i].name = NULL; 1339 remote->remote_group[i].name = NULL;
1340 } 1340 }
1341 } 1341 }
1342 } 1342 }
@@ -1398,27 +1398,57 @@ static const struct attribute *remote_unpair_attrs[] = {
1398 NULL 1398 NULL
1399}; 1399};
1400 1400
1401static int wacom_initialize_remote(struct wacom *wacom) 1401static void wacom_remotes_destroy(void *data)
1402{
1403 struct wacom *wacom = data;
1404 struct wacom_remote *remote = wacom->remote;
1405
1406 if (!remote)
1407 return;
1408
1409 kobject_put(remote->remote_dir);
1410 kfifo_free(&remote->remote_fifo);
1411 wacom->remote = NULL;
1412}
1413
1414static int wacom_initialize_remotes(struct wacom *wacom)
1402{ 1415{
1403 int error = 0; 1416 int error = 0;
1404 struct wacom_wac *wacom_wac = &(wacom->wacom_wac); 1417 struct wacom_remote *remote;
1405 int i; 1418 int i;
1406 1419
1407 if (wacom->wacom_wac.features.type != REMOTE) 1420 if (wacom->wacom_wac.features.type != REMOTE)
1408 return 0; 1421 return 0;
1409 1422
1410 wacom->remote_group[0] = remote0_serial_group; 1423 remote = devm_kzalloc(&wacom->hdev->dev, sizeof(*wacom->remote),
1411 wacom->remote_group[1] = remote1_serial_group; 1424 GFP_KERNEL);
1412 wacom->remote_group[2] = remote2_serial_group; 1425 if (!remote)
1413 wacom->remote_group[3] = remote3_serial_group; 1426 return -ENOMEM;
1414 wacom->remote_group[4] = remote4_serial_group;
1415 1427
1416 wacom->remote_dir = kobject_create_and_add("wacom_remote", 1428 wacom->remote = remote;
1417 &wacom->hdev->dev.kobj); 1429
1418 if (!wacom->remote_dir) 1430 spin_lock_init(&remote->remote_lock);
1431
1432 error = kfifo_alloc(&remote->remote_fifo,
1433 5 * sizeof(struct wacom_remote_data),
1434 GFP_KERNEL);
1435 if (error) {
1436 hid_err(wacom->hdev, "failed allocating remote_fifo\n");
1419 return -ENOMEM; 1437 return -ENOMEM;
1438 }
1420 1439
1421 error = sysfs_create_files(wacom->remote_dir, remote_unpair_attrs); 1440 remote->remote_group[0] = remote0_serial_group;
1441 remote->remote_group[1] = remote1_serial_group;
1442 remote->remote_group[2] = remote2_serial_group;
1443 remote->remote_group[3] = remote3_serial_group;
1444 remote->remote_group[4] = remote4_serial_group;
1445
1446 remote->remote_dir = kobject_create_and_add("wacom_remote",
1447 &wacom->hdev->dev.kobj);
1448 if (!remote->remote_dir)
1449 return -ENOMEM;
1450
1451 error = sysfs_create_files(remote->remote_dir, remote_unpair_attrs);
1422 1452
1423 if (error) { 1453 if (error) {
1424 hid_err(wacom->hdev, 1454 hid_err(wacom->hdev,
@@ -1428,9 +1458,14 @@ static int wacom_initialize_remote(struct wacom *wacom)
1428 1458
1429 for (i = 0; i < WACOM_MAX_REMOTES; i++) { 1459 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1430 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN; 1460 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
1431 wacom_wac->serial[i] = 0; 1461 remote->serial[i] = 0;
1432 } 1462 }
1433 1463
1464 error = devm_add_action_or_reset(&wacom->hdev->dev,
1465 wacom_remotes_destroy, wacom);
1466 if (error)
1467 return error;
1468
1434 return 0; 1469 return 0;
1435} 1470}
1436 1471
@@ -1740,7 +1775,7 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
1740 if (error) 1775 if (error)
1741 goto fail_leds; 1776 goto fail_leds;
1742 1777
1743 error = wacom_initialize_remote(wacom); 1778 error = wacom_initialize_remotes(wacom);
1744 if (error) 1779 if (error)
1745 goto fail_remote; 1780 goto fail_remote;
1746 } 1781 }
@@ -1792,7 +1827,6 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
1792fail_quirks: 1827fail_quirks:
1793 hid_hw_stop(hdev); 1828 hid_hw_stop(hdev);
1794fail_hw_start: 1829fail_hw_start:
1795 kobject_put(wacom->remote_dir);
1796fail_remote: 1830fail_remote:
1797fail_leds: 1831fail_leds:
1798fail_register_inputs: 1832fail_register_inputs:
@@ -1893,58 +1927,58 @@ fail:
1893static void wacom_remote_work(struct work_struct *work) 1927static void wacom_remote_work(struct work_struct *work)
1894{ 1928{
1895 struct wacom *wacom = container_of(work, struct wacom, remote_work); 1929 struct wacom *wacom = container_of(work, struct wacom, remote_work);
1896 struct wacom_wac *wacom_wac = &wacom->wacom_wac; 1930 struct wacom_remote *remote = wacom->remote;
1897 struct wacom_remote_data data; 1931 struct wacom_remote_data data;
1898 unsigned long flags; 1932 unsigned long flags;
1899 unsigned int count; 1933 unsigned int count;
1900 u32 serial; 1934 u32 serial;
1901 int i, k; 1935 int i, k;
1902 1936
1903 spin_lock_irqsave(&wacom->remote_lock, flags); 1937 spin_lock_irqsave(&remote->remote_lock, flags);
1904 1938
1905 count = kfifo_out(&wacom->remote_fifo, &data, sizeof(data)); 1939 count = kfifo_out(&remote->remote_fifo, &data, sizeof(data));
1906 1940
1907 if (count != sizeof(data)) { 1941 if (count != sizeof(data)) {
1908 hid_err(wacom->hdev, 1942 hid_err(wacom->hdev,
1909 "workitem triggered without status available\n"); 1943 "workitem triggered without status available\n");
1910 spin_unlock_irqrestore(&wacom->remote_lock, flags); 1944 spin_unlock_irqrestore(&remote->remote_lock, flags);
1911 return; 1945 return;
1912 } 1946 }
1913 1947
1914 if (!kfifo_is_empty(&wacom->remote_fifo)) 1948 if (!kfifo_is_empty(&remote->remote_fifo))
1915 wacom_schedule_work(&wacom->wacom_wac, WACOM_WORKER_REMOTE); 1949 wacom_schedule_work(&wacom->wacom_wac, WACOM_WORKER_REMOTE);
1916 1950
1917 spin_unlock_irqrestore(&wacom->remote_lock, flags); 1951 spin_unlock_irqrestore(&remote->remote_lock, flags);
1918 1952
1919 for (i = 0; i < WACOM_MAX_REMOTES; i++) { 1953 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1920 serial = data.remote[i].serial; 1954 serial = data.remote[i].serial;
1921 if (data.remote[i].connected) { 1955 if (data.remote[i].connected) {
1922 1956
1923 if (wacom_wac->serial[i] == serial) 1957 if (remote->serial[i] == serial)
1924 continue; 1958 continue;
1925 1959
1926 if (wacom_wac->serial[i]) { 1960 if (remote->serial[i]) {
1927 wacom_remote_destroy_attr_group(wacom, 1961 wacom_remote_destroy_attr_group(wacom,
1928 wacom_wac->serial[i]); 1962 remote->serial[i]);
1929 } 1963 }
1930 1964
1931 /* A remote can pair more than once with an EKR, 1965 /* A remote can pair more than once with an EKR,
1932 * check to make sure this serial isn't already paired. 1966 * check to make sure this serial isn't already paired.
1933 */ 1967 */
1934 for (k = 0; k < WACOM_MAX_REMOTES; k++) { 1968 for (k = 0; k < WACOM_MAX_REMOTES; k++) {
1935 if (wacom_wac->serial[k] == serial) 1969 if (remote->serial[k] == serial)
1936 break; 1970 break;
1937 } 1971 }
1938 1972
1939 if (k < WACOM_MAX_REMOTES) { 1973 if (k < WACOM_MAX_REMOTES) {
1940 wacom_wac->serial[i] = serial; 1974 remote->serial[i] = serial;
1941 continue; 1975 continue;
1942 } 1976 }
1943 wacom_remote_create_attr_group(wacom, serial, i); 1977 wacom_remote_create_attr_group(wacom, serial, i);
1944 1978
1945 } else if (wacom_wac->serial[i]) { 1979 } else if (remote->serial[i]) {
1946 wacom_remote_destroy_attr_group(wacom, 1980 wacom_remote_destroy_attr_group(wacom,
1947 wacom_wac->serial[i]); 1981 remote->serial[i]);
1948 } 1982 }
1949 } 1983 }
1950} 1984}
@@ -1992,16 +2026,6 @@ static int wacom_probe(struct hid_device *hdev,
1992 INIT_WORK(&wacom->wireless_work, wacom_wireless_work); 2026 INIT_WORK(&wacom->wireless_work, wacom_wireless_work);
1993 INIT_WORK(&wacom->battery_work, wacom_battery_work); 2027 INIT_WORK(&wacom->battery_work, wacom_battery_work);
1994 INIT_WORK(&wacom->remote_work, wacom_remote_work); 2028 INIT_WORK(&wacom->remote_work, wacom_remote_work);
1995 spin_lock_init(&wacom->remote_lock);
1996
1997 if (kfifo_alloc(&wacom->remote_fifo,
1998 5 * sizeof(struct wacom_remote_data),
1999 GFP_KERNEL)) {
2000 dev_err(&hdev->dev,
2001 "%s:failed allocating remote_fifo\n", __func__);
2002 error = -ENOMEM;
2003 goto fail_type;
2004 }
2005 2029
2006 /* ask for the report descriptor to be loaded by HID */ 2030 /* ask for the report descriptor to be loaded by HID */
2007 error = hid_parse(hdev); 2031 error = hid_parse(hdev);
@@ -2025,7 +2049,6 @@ static int wacom_probe(struct hid_device *hdev,
2025 return 0; 2049 return 0;
2026 2050
2027fail_parse: 2051fail_parse:
2028 kfifo_free(&wacom->remote_fifo);
2029fail_type: 2052fail_type:
2030 hid_set_drvdata(hdev, NULL); 2053 hid_set_drvdata(hdev, NULL);
2031 return error; 2054 return error;
@@ -2045,8 +2068,6 @@ static void wacom_remove(struct hid_device *hdev)
2045 cancel_work_sync(&wacom->wireless_work); 2068 cancel_work_sync(&wacom->wireless_work);
2046 cancel_work_sync(&wacom->battery_work); 2069 cancel_work_sync(&wacom->battery_work);
2047 cancel_work_sync(&wacom->remote_work); 2070 cancel_work_sync(&wacom->remote_work);
2048 kfifo_free(&wacom->remote_fifo);
2049 kobject_put(wacom->remote_dir);
2050 if (hdev->bus == BUS_BLUETOOTH) 2071 if (hdev->bus == BUS_BLUETOOTH)
2051 device_remove_file(&hdev->dev, &dev_attr_speed); 2072 device_remove_file(&hdev->dev, &dev_attr_speed);
2052 2073
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
index d54992967391..ce1089f1142d 100644
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -753,6 +753,7 @@ static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
753 unsigned char *data = wacom_wac->data; 753 unsigned char *data = wacom_wac->data;
754 struct input_dev *input = wacom_wac->pad_input; 754 struct input_dev *input = wacom_wac->pad_input;
755 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); 755 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
756 struct wacom_remote *remote = wacom->remote;
756 struct wacom_features *features = &wacom_wac->features; 757 struct wacom_features *features = &wacom_wac->features;
757 int bat_charging, bat_percent, touch_ring_mode; 758 int bat_charging, bat_percent, touch_ring_mode;
758 __u32 serial; 759 __u32 serial;
@@ -807,7 +808,7 @@ static int wacom_remote_irq(struct wacom_wac *wacom_wac, size_t len)
807 touch_ring_mode = (data[11] & 0xC0) >> 6; 808 touch_ring_mode = (data[11] & 0xC0) >> 6;
808 809
809 for (i = 0; i < WACOM_MAX_REMOTES; i++) { 810 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
810 if (wacom_wac->serial[i] == serial) 811 if (remote->serial[i] == serial)
811 wacom->led.groups[i].select = touch_ring_mode; 812 wacom->led.groups[i].select = touch_ring_mode;
812 } 813 }
813 814
@@ -827,6 +828,7 @@ static void wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
827{ 828{
828 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); 829 struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac);
829 unsigned char *data = wacom_wac->data; 830 unsigned char *data = wacom_wac->data;
831 struct wacom_remote *remote = wacom->remote;
830 struct wacom_remote_data remote_data; 832 struct wacom_remote_data remote_data;
831 unsigned long flags; 833 unsigned long flags;
832 int i, ret; 834 int i, ret;
@@ -845,16 +847,16 @@ static void wacom_remote_status_irq(struct wacom_wac *wacom_wac, size_t len)
845 remote_data.remote[i].connected = connected; 847 remote_data.remote[i].connected = connected;
846 } 848 }
847 849
848 spin_lock_irqsave(&wacom->remote_lock, flags); 850 spin_lock_irqsave(&remote->remote_lock, flags);
849 851
850 ret = kfifo_in(&wacom->remote_fifo, &remote_data, sizeof(remote_data)); 852 ret = kfifo_in(&remote->remote_fifo, &remote_data, sizeof(remote_data));
851 if (ret != sizeof(remote_data)) { 853 if (ret != sizeof(remote_data)) {
852 spin_unlock_irqrestore(&wacom->remote_lock, flags); 854 spin_unlock_irqrestore(&remote->remote_lock, flags);
853 hid_err(wacom->hdev, "Can't queue Remote status event.\n"); 855 hid_err(wacom->hdev, "Can't queue Remote status event.\n");
854 return; 856 return;
855 } 857 }
856 858
857 spin_unlock_irqrestore(&wacom->remote_lock, flags); 859 spin_unlock_irqrestore(&remote->remote_lock, flags);
858 860
859 wacom_schedule_work(wacom_wac, WACOM_WORKER_REMOTE); 861 wacom_schedule_work(wacom_wac, WACOM_WORKER_REMOTE);
860} 862}
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
index c2c65b8c71c1..6be6cae0d093 100644
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -234,7 +234,7 @@ struct wacom_wac {
234 unsigned char data[WACOM_PKGLEN_MAX]; 234 unsigned char data[WACOM_PKGLEN_MAX];
235 int tool[2]; 235 int tool[2];
236 int id[2]; 236 int id[2];
237 __u32 serial[5]; 237 __u32 serial[2];
238 bool reporting_data; 238 bool reporting_data;
239 struct wacom_features features; 239 struct wacom_features features;
240 struct wacom_shared *shared; 240 struct wacom_shared *shared;