Let's switch the driver to use managed resources, this will simplify error handling and driver unbinding logic.
Unified · Split
| @@ -16,6 +16,7 @@ · 15 unmodified lines | ||
| 16 | 16 | * published by the Free Software Foundation. |
| 17 | 17 | */ |
| 18 | 18 | |
| 19 | +#include <linux/device.h> | |
| 19 | 20 | #include <linux/input.h> |
| 20 | 21 | #include <linux/input-polldev.h> |
| 21 | 22 | #include <linux/interrupt.h> |
| @@ -185,14 +186,15 @@ static int jornada680kbd_probe(struct platform_device *pdev) · 163 unmodified lines | ||
| 185 | 186 | struct input_dev *input_dev; |
| 186 | 187 | int i, error; |
| 187 | 188 | |
| 188 | − jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); | |
| 189 | + jornadakbd = devm_kzalloc(&pdev->dev, sizeof(struct jornadakbd), | |
| 190 | + GFP_KERNEL); | |
| 189 | 191 | if (!jornadakbd) |
| 190 | 192 | return -ENOMEM; |
| 191 | 193 | |
| 192 | − poll_dev = input_allocate_polled_device(); | |
| 194 | + poll_dev = devm_input_allocate_polled_device(&pdev->dev); | |
| 193 | 195 | if (!poll_dev) { |
| 194 | − error = -ENOMEM; | |
| 195 | − goto failed; | |
| 196 | + dev_err(&pdev->dev, "failed to allocate polled input device\n"); | |
| 197 | + return -ENOMEM; | |
| 196 | 198 | } |
| 197 | 199 | |
| 198 | 200 | platform_set_drvdata(pdev, jornadakbd); |
| @@ -224,27 +226,10 @@ static int jornada680kbd_probe(struct platform_device *pdev) · 25 unmodified lines | ||
| 224 | 226 | input_set_capability(input_dev, EV_MSC, MSC_SCAN); |
| 225 | 227 | |
| 226 | 228 | error = input_register_polled_device(jornadakbd->poll_dev); |
| 227 | − if (error) | |
| 228 | − goto failed; | |
| 229 | − | |
| 230 | − return 0; | |
| 231 | − | |
| 232 | − failed: | |
| 233 | − printk(KERN_ERR "Jornadakbd: failed to register driver, error: %d\n", | |
| 234 | − error); | |
| 235 | − input_free_polled_device(poll_dev); | |
| 236 | − kfree(jornadakbd); | |
| 237 | − return error; | |
| 238 | − | |
| 239 | −} | |
| 240 | − | |
| 241 | −static int jornada680kbd_remove(struct platform_device *pdev) | |
| 242 | −{ | |
| 243 | − struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); | |
| 244 | − | |
| 245 | − input_unregister_polled_device(jornadakbd->poll_dev); | |
| 246 | − input_free_polled_device(jornadakbd->poll_dev); | |
| 247 | − kfree(jornadakbd); | |
| 229 | + if (error) { | |
| 230 | + dev_err(&pdev->dev, "failed to register polled input device\n"); | |
| 231 | + return error; | |
| 232 | + } | |
| 248 | 233 | |
| 249 | 234 | return 0; |
| 250 | 235 | } |
| @@ -255,7 +240,6 @@ static struct platform_driver jornada680kbd_driver = { · 4 unmodified lines | ||
| 255 | 240 | .owner = THIS_MODULE, |
| 256 | 241 | }, |
| 257 | 242 | .probe = jornada680kbd_probe, |
| 258 | − .remove = jornada680kbd_remove, | |
| 259 | 243 | }; |
| 260 | 244 | module_platform_driver(jornada680kbd_driver); |
| 261 | 245 | |