aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2016-07-13 12:06:05 -0400
committerJiri Kosina <jkosina@suse.cz>2016-08-05 07:39:17 -0400
commitf9036bd43602562f549ace170391c932f28446cd (patch)
tree29fb1465fb2f473866d8301edf4e40d91fc48dff
parent04bfa27b429fc45197fbb1a3dfe01585b931824b (diff)
HID: wacom: EKR: use devres groups to manage resources
This will be useful when each remote will be assigned its own input device. We won't need to unregister each input and sysfs and other elements one at a time. 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_sys.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index 27ca1473940f..9121e72c1b40 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -934,8 +934,9 @@ static void wacom_devm_sysfs_group_release(struct device *dev, void *res)
934 sysfs_remove_group(kobj, devres->group); 934 sysfs_remove_group(kobj, devres->group);
935} 935}
936 936
937static int wacom_devm_sysfs_create_group(struct wacom *wacom, 937static int __wacom_devm_sysfs_create_group(struct wacom *wacom,
938 struct attribute_group *group) 938 struct kobject *root,
939 struct attribute_group *group)
939{ 940{
940 struct wacom_sysfs_group_devres *devres; 941 struct wacom_sysfs_group_devres *devres;
941 int error; 942 int error;
@@ -947,7 +948,7 @@ static int wacom_devm_sysfs_create_group(struct wacom *wacom,
947 return -ENOMEM; 948 return -ENOMEM;
948 949
949 devres->group = group; 950 devres->group = group;
950 devres->root = &wacom->hdev->dev.kobj; 951 devres->root = root;
951 952
952 error = sysfs_create_group(devres->root, group); 953 error = sysfs_create_group(devres->root, group);
953 if (error) 954 if (error)
@@ -958,6 +959,13 @@ static int wacom_devm_sysfs_create_group(struct wacom *wacom,
958 return 0; 959 return 0;
959} 960}
960 961
962static int wacom_devm_sysfs_create_group(struct wacom *wacom,
963 struct attribute_group *group)
964{
965 return __wacom_devm_sysfs_create_group(wacom, &wacom->hdev->dev.kobj,
966 group);
967}
968
961static void wacom_led_groups_release(void *data) 969static void wacom_led_groups_release(void *data)
962{ 970{
963 struct wacom *wacom = data; 971 struct wacom *wacom = data;
@@ -1306,9 +1314,10 @@ static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
1306 if (!remote->remote_group[index].name) 1314 if (!remote->remote_group[index].name)
1307 return -ENOMEM; 1315 return -ENOMEM;
1308 1316
1309 error = sysfs_create_group(remote->remote_dir, 1317 error = __wacom_devm_sysfs_create_group(wacom, remote->remote_dir,
1310 &remote->remote_group[index]); 1318 &remote->remote_group[index]);
1311 if (error) { 1319 if (error) {
1320 remote->remote_group[index].name = NULL;
1312 hid_err(wacom->hdev, 1321 hid_err(wacom->hdev,
1313 "cannot create sysfs group err: %d\n", error); 1322 "cannot create sysfs group err: %d\n", error);
1314 return error; 1323 return error;
@@ -1317,15 +1326,6 @@ static int wacom_remote_create_attr_group(struct wacom *wacom, __u32 serial,
1317 return 0; 1326 return 0;
1318} 1327}
1319 1328
1320static void wacom_remote_destroy_attr_group(struct wacom *wacom, unsigned int i)
1321{
1322 struct wacom_remote *remote = wacom->remote;
1323
1324 sysfs_remove_group(remote->remote_dir, &remote->remote_group[i]);
1325 devm_kfree(&wacom->hdev->dev, (char *)remote->remote_group[i].name);
1326 remote->remote_group[i].name = NULL;
1327}
1328
1329static int wacom_cmd_unpair_remote(struct wacom *wacom, unsigned char selector) 1329static int wacom_cmd_unpair_remote(struct wacom *wacom, unsigned char selector)
1330{ 1330{
1331 const size_t buf_size = 2; 1331 const size_t buf_size = 2;
@@ -1906,11 +1906,13 @@ static void wacom_remote_destroy_one(struct wacom *wacom, unsigned int index)
1906 u32 serial = remote->serial[index]; 1906 u32 serial = remote->serial[index];
1907 int i; 1907 int i;
1908 1908
1909 wacom_remote_destroy_attr_group(wacom, index); 1909 if (remote->remote_group[index].name)
1910 devres_release_group(&wacom->hdev->dev, &remote->serial[index]);
1910 1911
1911 for (i = 0; i < WACOM_MAX_REMOTES; i++) { 1912 for (i = 0; i < WACOM_MAX_REMOTES; i++) {
1912 if (remote->serial[i] == serial) { 1913 if (remote->serial[i] == serial) {
1913 remote->serial[i] = 0; 1914 remote->serial[i] = 0;
1915 remote->remote_group[i].name = NULL;
1914 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN; 1916 wacom->led.groups[i].select = WACOM_STATUS_UNKNOWN;
1915 } 1917 }
1916 } 1918 }
@@ -1920,6 +1922,7 @@ static int wacom_remote_create_one(struct wacom *wacom, u32 serial,
1920 unsigned int index) 1922 unsigned int index)
1921{ 1923{
1922 struct wacom_remote *remote = wacom->remote; 1924 struct wacom_remote *remote = wacom->remote;
1925 struct device *dev = &wacom->hdev->dev;
1923 int error, k; 1926 int error, k;
1924 1927
1925 /* A remote can pair more than once with an EKR, 1928 /* A remote can pair more than once with an EKR,
@@ -1935,13 +1938,22 @@ static int wacom_remote_create_one(struct wacom *wacom, u32 serial,
1935 return 0; 1938 return 0;
1936 } 1939 }
1937 1940
1941 if (!devres_open_group(dev, &remote->serial[index], GFP_KERNEL))
1942 return -ENOMEM;
1943
1938 error = wacom_remote_create_attr_group(wacom, serial, index); 1944 error = wacom_remote_create_attr_group(wacom, serial, index);
1939 if (error) 1945 if (error)
1940 return error; 1946 goto fail;
1941 1947
1942 remote->serial[index] = serial; 1948 remote->serial[index] = serial;
1943 1949
1950 devres_close_group(dev, &remote->serial[index]);
1944 return 0; 1951 return 0;
1952
1953fail:
1954 devres_release_group(dev, &remote->serial[index]);
1955 remote->serial[index] = 0;
1956 return error;
1945} 1957}
1946 1958
1947static void wacom_remote_work(struct work_struct *work) 1959static void wacom_remote_work(struct work_struct *work)