diff options
author | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2013-07-24 13:38:04 -0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-07-31 04:12:28 -0400 |
commit | abf832bfc349b54fd500f1e3b612f7f3cd9dfcc6 (patch) | |
tree | 4ece0e75cf3fd463be58376e3f900c1cfd60dd05 /drivers/hid/hid-apple.c | |
parent | 3366dd9fa887ebbda4872e9554f853eaeda764be (diff) |
HID: trivial devm conversion for special hid drivers
It is safe to use devres allocation within the hid subsystem:
- the devres release is called _after_ the call to .remove(), meaning
that no freed pointers will exists while removing the device
- if a .probe() fails, devres releases all the allocated ressources
before going to the next driver: there will not be ghost ressources
attached to a hid device if several drivers are probed.
Given that, we can clean up a little some of the HID drivers. These ones
are trivial:
- there is only one kzalloc in the driver
- the .remove() callback contains only one kfree on top of hid_hw_stop()
- the error path in the probe is easy enough to be manually checked
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-apple.c')
-rw-r--r-- | drivers/hid/hid-apple.c | 16 |
1 files changed, 3 insertions, 13 deletions
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c index feae88b53fcd..bad40b9315b2 100644 --- a/drivers/hid/hid-apple.c +++ b/drivers/hid/hid-apple.c | |||
@@ -349,7 +349,7 @@ static int apple_probe(struct hid_device *hdev, | |||
349 | unsigned int connect_mask = HID_CONNECT_DEFAULT; | 349 | unsigned int connect_mask = HID_CONNECT_DEFAULT; |
350 | int ret; | 350 | int ret; |
351 | 351 | ||
352 | asc = kzalloc(sizeof(*asc), GFP_KERNEL); | 352 | asc = devm_kzalloc(&hdev->dev, sizeof(*asc), GFP_KERNEL); |
353 | if (asc == NULL) { | 353 | if (asc == NULL) { |
354 | hid_err(hdev, "can't alloc apple descriptor\n"); | 354 | hid_err(hdev, "can't alloc apple descriptor\n"); |
355 | return -ENOMEM; | 355 | return -ENOMEM; |
@@ -362,7 +362,7 @@ static int apple_probe(struct hid_device *hdev, | |||
362 | ret = hid_parse(hdev); | 362 | ret = hid_parse(hdev); |
363 | if (ret) { | 363 | if (ret) { |
364 | hid_err(hdev, "parse failed\n"); | 364 | hid_err(hdev, "parse failed\n"); |
365 | goto err_free; | 365 | return ret; |
366 | } | 366 | } |
367 | 367 | ||
368 | if (quirks & APPLE_HIDDEV) | 368 | if (quirks & APPLE_HIDDEV) |
@@ -373,19 +373,10 @@ static int apple_probe(struct hid_device *hdev, | |||
373 | ret = hid_hw_start(hdev, connect_mask); | 373 | ret = hid_hw_start(hdev, connect_mask); |
374 | if (ret) { | 374 | if (ret) { |
375 | hid_err(hdev, "hw start failed\n"); | 375 | hid_err(hdev, "hw start failed\n"); |
376 | goto err_free; | 376 | return ret; |
377 | } | 377 | } |
378 | 378 | ||
379 | return 0; | 379 | return 0; |
380 | err_free: | ||
381 | kfree(asc); | ||
382 | return ret; | ||
383 | } | ||
384 | |||
385 | static void apple_remove(struct hid_device *hdev) | ||
386 | { | ||
387 | hid_hw_stop(hdev); | ||
388 | kfree(hid_get_drvdata(hdev)); | ||
389 | } | 380 | } |
390 | 381 | ||
391 | static const struct hid_device_id apple_devices[] = { | 382 | static const struct hid_device_id apple_devices[] = { |
@@ -545,7 +536,6 @@ static struct hid_driver apple_driver = { | |||
545 | .id_table = apple_devices, | 536 | .id_table = apple_devices, |
546 | .report_fixup = apple_report_fixup, | 537 | .report_fixup = apple_report_fixup, |
547 | .probe = apple_probe, | 538 | .probe = apple_probe, |
548 | .remove = apple_remove, | ||
549 | .event = apple_event, | 539 | .event = apple_event, |
550 | .input_mapping = apple_input_mapping, | 540 | .input_mapping = apple_input_mapping, |
551 | .input_mapped = apple_input_mapped, | 541 | .input_mapped = apple_input_mapped, |