aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2016-01-16 23:22:07 -0500
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2016-01-18 12:17:27 -0500
commitd9202af2ffa083f096684fd5f4b530aebbc07439 (patch)
tree0360cee99a7fbc9a3a83cf3f35abfeeb823df8d4
parentafd2ff9b7e1b367172f18ba7f693dfb62bdcb2dc (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.c86
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
366exit_free_irq_b:
367 free_irq(encoder->irq_b, encoder);
368exit_free_irq_a:
369 free_irq(encoder->irq_a, encoder);
370exit_free_gpio_b:
371 gpio_free(pdata->gpio_b);
372exit_free_gpio_a:
373 gpio_free(pdata->gpio_a);
374exit_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
383static 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
433static struct platform_driver rotary_encoder_driver = { 398static 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,