diff options
author | Benjamin Tissoires <benjamin.tissoires@redhat.com> | 2013-07-24 19:38:04 +0200 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-07-31 10:12:28 +0200 |
commit | abf832bfc349b54fd500f1e3b612f7f3cd9dfcc6 (patch) | |
tree | 4ece0e75cf3fd463be58376e3f900c1cfd60dd05 /drivers/hid/hid-apple.c | |
parent | 3366dd9fa887ebbda4872e9554f853eaeda764be (diff) | |
download | kernel_goldelico_gta04-abf832bfc349b54fd500f1e3b612f7f3cd9dfcc6.zip kernel_goldelico_gta04-abf832bfc349b54fd500f1e3b612f7f3cd9dfcc6.tar.gz kernel_goldelico_gta04-abf832bfc349b54fd500f1e3b612f7f3cd9dfcc6.tar.bz2 |
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 feae88b..bad40b9 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, unsigned int connect_mask = HID_CONNECT_DEFAULT; int ret; - asc = kzalloc(sizeof(*asc), GFP_KERNEL); + asc = devm_kzalloc(&hdev->dev, sizeof(*asc), GFP_KERNEL); if (asc == NULL) { hid_err(hdev, "can't alloc apple descriptor\n"); return -ENOMEM; @@ -362,7 +362,7 @@ static int apple_probe(struct hid_device *hdev, ret = hid_parse(hdev); if (ret) { hid_err(hdev, "parse failed\n"); - goto err_free; + return ret; } if (quirks & APPLE_HIDDEV) @@ -373,19 +373,10 @@ static int apple_probe(struct hid_device *hdev, ret = hid_hw_start(hdev, connect_mask); if (ret) { hid_err(hdev, "hw start failed\n"); - goto err_free; + return ret; } return 0; -err_free: - kfree(asc); - return ret; -} - -static void apple_remove(struct hid_device *hdev) -{ - hid_hw_stop(hdev); - kfree(hid_get_drvdata(hdev)); } static const struct hid_device_id apple_devices[] = { @@ -545,7 +536,6 @@ static struct hid_driver apple_driver = { .id_table = apple_devices, .report_fixup = apple_report_fixup, .probe = apple_probe, - .remove = apple_remove, .event = apple_event, .input_mapping = apple_input_mapping, .input_mapped = apple_input_mapped, |