diff options
author | Timo Teräs <timo.teras@iki.fi> | 2016-01-16 23:22:07 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2016-01-18 12:17:27 -0500 |
commit | d9202af2ffa083f096684fd5f4b530aebbc07439 (patch) | |
tree | 0360cee99a7fbc9a3a83cf3f35abfeeb823df8d4 | |
parent | afd2ff9b7e1b367172f18ba7f693dfb62bdcb2dc (diff) |
Input: rotary_encoder - convert to devm-* api
Use managed resource API for simplifying error paths.
Signed-off-by: Timo Teräs <timo.teras@iki.fi>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r-- | drivers/input/misc/rotary_encoder.c | 86 |
1 files changed, 25 insertions, 61 deletions
diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c index 8aee71986430..ebbadf3f0579 100644 --- a/drivers/input/misc/rotary_encoder.c +++ b/drivers/input/misc/rotary_encoder.c | |||
@@ -211,8 +211,8 @@ static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct devic | |||
211 | if (!of_id || !np) | 211 | if (!of_id || !np) |
212 | return NULL; | 212 | return NULL; |
213 | 213 | ||
214 | pdata = kzalloc(sizeof(struct rotary_encoder_platform_data), | 214 | pdata = devm_kzalloc(dev, sizeof(struct rotary_encoder_platform_data), |
215 | GFP_KERNEL); | 215 | GFP_KERNEL); |
216 | if (!pdata) | 216 | if (!pdata) |
217 | return ERR_PTR(-ENOMEM); | 217 | return ERR_PTR(-ENOMEM); |
218 | 218 | ||
@@ -277,12 +277,13 @@ static int rotary_encoder_probe(struct platform_device *pdev) | |||
277 | } | 277 | } |
278 | } | 278 | } |
279 | 279 | ||
280 | encoder = kzalloc(sizeof(struct rotary_encoder), GFP_KERNEL); | 280 | encoder = devm_kzalloc(dev, sizeof(struct rotary_encoder), GFP_KERNEL); |
281 | input = input_allocate_device(); | 281 | if (!encoder) |
282 | if (!encoder || !input) { | 282 | return -ENOMEM; |
283 | err = -ENOMEM; | 283 | |
284 | goto exit_free_mem; | 284 | input = devm_input_allocate_device(dev); |
285 | } | 285 | if (!input) |
286 | return -ENOMEM; | ||
286 | 287 | ||
287 | encoder->input = input; | 288 | encoder->input = input; |
288 | encoder->pdata = pdata; | 289 | encoder->pdata = pdata; |
@@ -301,16 +302,18 @@ static int rotary_encoder_probe(struct platform_device *pdev) | |||
301 | } | 302 | } |
302 | 303 | ||
303 | /* request the GPIOs */ | 304 | /* request the GPIOs */ |
304 | err = gpio_request_one(pdata->gpio_a, GPIOF_IN, dev_name(dev)); | 305 | err = devm_gpio_request_one(dev, pdata->gpio_a, GPIOF_IN, |
306 | dev_name(dev)); | ||
305 | if (err) { | 307 | if (err) { |
306 | dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_a); | 308 | dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_a); |
307 | goto exit_free_mem; | 309 | return err; |
308 | } | 310 | } |
309 | 311 | ||
310 | err = gpio_request_one(pdata->gpio_b, GPIOF_IN, dev_name(dev)); | 312 | err = devm_gpio_request_one(dev, pdata->gpio_b, GPIOF_IN, |
313 | dev_name(dev)); | ||
311 | if (err) { | 314 | if (err) { |
312 | dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_b); | 315 | dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_b); |
313 | goto exit_free_gpio_a; | 316 | return err; |
314 | } | 317 | } |
315 | 318 | ||
316 | encoder->irq_a = gpio_to_irq(pdata->gpio_a); | 319 | encoder->irq_a = gpio_to_irq(pdata->gpio_a); |
@@ -331,30 +334,29 @@ static int rotary_encoder_probe(struct platform_device *pdev) | |||
331 | default: | 334 | default: |
332 | dev_err(dev, "'%d' is not a valid steps-per-period value\n", | 335 | dev_err(dev, "'%d' is not a valid steps-per-period value\n", |
333 | pdata->steps_per_period); | 336 | pdata->steps_per_period); |
334 | err = -EINVAL; | 337 | return -EINVAL; |
335 | goto exit_free_gpio_b; | ||
336 | } | 338 | } |
337 | 339 | ||
338 | err = request_irq(encoder->irq_a, handler, | 340 | err = devm_request_irq(dev, encoder->irq_a, handler, |
339 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 341 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
340 | DRV_NAME, encoder); | 342 | DRV_NAME, encoder); |
341 | if (err) { | 343 | if (err) { |
342 | dev_err(dev, "unable to request IRQ %d\n", encoder->irq_a); | 344 | dev_err(dev, "unable to request IRQ %d\n", encoder->irq_a); |
343 | goto exit_free_gpio_b; | 345 | return err; |
344 | } | 346 | } |
345 | 347 | ||
346 | err = request_irq(encoder->irq_b, handler, | 348 | err = devm_request_irq(dev, encoder->irq_b, handler, |
347 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 349 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
348 | DRV_NAME, encoder); | 350 | DRV_NAME, encoder); |
349 | if (err) { | 351 | if (err) { |
350 | dev_err(dev, "unable to request IRQ %d\n", encoder->irq_b); | 352 | dev_err(dev, "unable to request IRQ %d\n", encoder->irq_b); |
351 | goto exit_free_irq_a; | 353 | return err; |
352 | } | 354 | } |
353 | 355 | ||
354 | err = input_register_device(input); | 356 | err = input_register_device(input); |
355 | if (err) { | 357 | if (err) { |
356 | dev_err(dev, "failed to register input device\n"); | 358 | dev_err(dev, "failed to register input device\n"); |
357 | goto exit_free_irq_b; | 359 | return err; |
358 | } | 360 | } |
359 | 361 | ||
360 | device_init_wakeup(&pdev->dev, pdata->wakeup_source); | 362 | device_init_wakeup(&pdev->dev, pdata->wakeup_source); |
@@ -362,43 +364,6 @@ static int rotary_encoder_probe(struct platform_device *pdev) | |||
362 | platform_set_drvdata(pdev, encoder); | 364 | platform_set_drvdata(pdev, encoder); |
363 | 365 | ||
364 | return 0; | 366 | return 0; |
365 | |||
366 | exit_free_irq_b: | ||
367 | free_irq(encoder->irq_b, encoder); | ||
368 | exit_free_irq_a: | ||
369 | free_irq(encoder->irq_a, encoder); | ||
370 | exit_free_gpio_b: | ||
371 | gpio_free(pdata->gpio_b); | ||
372 | exit_free_gpio_a: | ||
373 | gpio_free(pdata->gpio_a); | ||
374 | exit_free_mem: | ||
375 | input_free_device(input); | ||
376 | kfree(encoder); | ||
377 | if (!dev_get_platdata(&pdev->dev)) | ||
378 | kfree(pdata); | ||
379 | |||
380 | return err; | ||
381 | } | ||
382 | |||
383 | static int rotary_encoder_remove(struct platform_device *pdev) | ||
384 | { | ||
385 | struct rotary_encoder *encoder = platform_get_drvdata(pdev); | ||
386 | const struct rotary_encoder_platform_data *pdata = encoder->pdata; | ||
387 | |||
388 | device_init_wakeup(&pdev->dev, false); | ||
389 | |||
390 | free_irq(encoder->irq_a, encoder); | ||
391 | free_irq(encoder->irq_b, encoder); | ||
392 | gpio_free(pdata->gpio_a); | ||
393 | gpio_free(pdata->gpio_b); | ||
394 | |||
395 | input_unregister_device(encoder->input); | ||
396 | kfree(encoder); | ||
397 | |||
398 | if (!dev_get_platdata(&pdev->dev)) | ||
399 | kfree(pdata); | ||
400 | |||
401 | return 0; | ||
402 | } | 367 | } |
403 | 368 | ||
404 | #ifdef CONFIG_PM_SLEEP | 369 | #ifdef CONFIG_PM_SLEEP |
@@ -432,7 +397,6 @@ static SIMPLE_DEV_PM_OPS(rotary_encoder_pm_ops, | |||
432 | 397 | ||
433 | static struct platform_driver rotary_encoder_driver = { | 398 | static struct platform_driver rotary_encoder_driver = { |
434 | .probe = rotary_encoder_probe, | 399 | .probe = rotary_encoder_probe, |
435 | .remove = rotary_encoder_remove, | ||
436 | .driver = { | 400 | .driver = { |
437 | .name = DRV_NAME, | 401 | .name = DRV_NAME, |
438 | .pm = &rotary_encoder_pm_ops, | 402 | .pm = &rotary_encoder_pm_ops, |