diff options
author | Vinayak Pane <vpane@nvidia.com> | 2014-05-13 17:23:22 -0700 |
---|---|---|
committer | Mandar Padmawar <mpadmawar@nvidia.com> | 2014-06-25 00:49:09 -0700 |
commit | 0c07f4b361386c6b1969f4144d46708f5a8d823a (patch) | |
tree | 84f588663bee5e4ad0e793bbf8b6e6a256036060 /drivers | |
parent | 927d8143510a81e33bbcb71b45b6ff342e781699 (diff) |
HID: add remove function in nv hidraw
Adding remove function to remove sysfs attribute nodes
when blake is disconnected.
Bug 200003632
Change-Id: I5bf571176d2653b9f74f548775da904ef93007c8
Reviewed-on: http://git-master/r/410596
(cherry picked from commit 9904c21f42b14f3675c27ef2646eae669440bd07)
Reviewed-on: http://git-master/r/409169
(cherry picked from commit 3d1e96872a5769ff66678c0235654ade43c9ea3c)
Signed-off-by: Jean Huang <jeanh@nvidia.com>
Reviewed-on: http://git-master/r/427946
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hid/hid-nvidia-blake.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/hid/hid-nvidia-blake.c b/drivers/hid/hid-nvidia-blake.c index 7e45449d07d2..e66f1f779c35 100644 --- a/drivers/hid/hid-nvidia-blake.c +++ b/drivers/hid/hid-nvidia-blake.c @@ -516,12 +516,16 @@ static int nvidia_probe(struct hid_device *hdev, const struct hid_device_id *id) loc->mode = MOUSE_MODE; hid_set_drvdata(hdev, loc); - ret = hid_open_report(hdev); - if (!ret) - ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); + /* Parse the HID report now */ + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto err_parse; + } + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); if (ret) - goto end; + goto err_parse; ret = device_create_file(&hdev->dev, &dev_attr_speed); if (ret) @@ -529,15 +533,31 @@ static int nvidia_probe(struct hid_device *hdev, const struct hid_device_id *id) ret = device_create_file(&hdev->dev, &dev_attr_mode); if (ret) hid_warn(hdev, "cannot create sysfs for mode\n"); + return 0; nvidia_init_ff(hdev, loc); nvidia_find_tp_len(hdev, loc); -end: +err_parse: + kfree(loc); return ret; } +static void nvidia_remove(struct hid_device *hdev) +{ + struct nvidia_tp_loc *loc = hid_get_drvdata(hdev); + + if (!loc) + return; + + device_remove_file(&hdev->dev, &dev_attr_speed); + device_remove_file(&hdev->dev, &dev_attr_mode); + + hid_hw_stop(hdev); + kfree(loc); +} + static int nvidia_input_mapped(struct hid_device *hdev, struct hid_input *hi, struct hid_field *field, struct hid_usage *usage, unsigned long **bit, int *max) @@ -588,6 +608,7 @@ static struct hid_driver nvidia_driver = { .report_fixup = nv_report_fixup, .event = nvidia_event, .probe = nvidia_probe, + .remove = nvidia_remove, }; module_hid_driver(nvidia_driver); |