summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinayak Pane <vpane@nvidia.com>2014-05-13 17:23:22 -0700
committerMandar Padmawar <mpadmawar@nvidia.com>2014-06-25 00:49:09 -0700
commit0c07f4b361386c6b1969f4144d46708f5a8d823a (patch)
tree84f588663bee5e4ad0e793bbf8b6e6a256036060
parent927d8143510a81e33bbcb71b45b6ff342e781699 (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
-rw-r--r--drivers/hid/hid-nvidia-blake.c31
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);