diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-11-19 15:52:29 -0500 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-11-25 21:27:56 -0500 |
| commit | fd91a5f01373ebf672a6691f4dcd487af48be945 (patch) | |
| tree | 5ecc838cc5e020e1b1f12a40762369cde23c423a /drivers/input | |
| parent | f261d46551275abc9e92b24773b15fbb82153b63 (diff) | |
Input: tsc2007 - convert to use devres-managed resources
This simplifies error handling path and allows us get rid of
tsc2007_remove().
Tested-by: Denis Carikli <denis@eukrea.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
| -rw-r--r-- | drivers/input/touchscreen/tsc2007.c | 79 |
1 files changed, 40 insertions, 39 deletions
diff --git a/drivers/input/touchscreen/tsc2007.c b/drivers/input/touchscreen/tsc2007.c index 03fbdf1e8613..1bf9906b5a3f 100644 --- a/drivers/input/touchscreen/tsc2007.c +++ b/drivers/input/touchscreen/tsc2007.c | |||
| @@ -365,6 +365,14 @@ static int tsc2007_probe_pdev(struct i2c_client *client, struct tsc2007 *ts, | |||
| 365 | return 0; | 365 | return 0; |
| 366 | } | 366 | } |
| 367 | 367 | ||
| 368 | static void tsc2007_call_exit_platform_hw(void *data) | ||
| 369 | { | ||
| 370 | struct device *dev = data; | ||
| 371 | const struct tsc2007_platform_data *pdata = dev_get_platdata(dev); | ||
| 372 | |||
| 373 | pdata->exit_platform_hw(); | ||
| 374 | } | ||
| 375 | |||
| 368 | static int tsc2007_probe(struct i2c_client *client, | 376 | static int tsc2007_probe(struct i2c_client *client, |
| 369 | const struct i2c_device_id *id) | 377 | const struct i2c_device_id *id) |
| 370 | { | 378 | { |
| @@ -388,11 +396,9 @@ static int tsc2007_probe(struct i2c_client *client, | |||
| 388 | if (err) | 396 | if (err) |
| 389 | return err; | 397 | return err; |
| 390 | 398 | ||
| 391 | input_dev = input_allocate_device(); | 399 | input_dev = devm_input_allocate_device(&client->dev); |
| 392 | if (!input_dev) { | 400 | if (!input_dev) |
| 393 | err = -ENOMEM; | 401 | return -ENOMEM; |
| 394 | goto err_free_input; | ||
| 395 | }; | ||
| 396 | 402 | ||
| 397 | i2c_set_clientdata(client, ts); | 403 | i2c_set_clientdata(client, ts); |
| 398 | 404 | ||
| @@ -421,45 +427,41 @@ static int tsc2007_probe(struct i2c_client *client, | |||
| 421 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, | 427 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, |
| 422 | ts->fuzzz, 0); | 428 | ts->fuzzz, 0); |
| 423 | 429 | ||
| 424 | if (pdata && pdata->init_platform_hw) | 430 | if (pdata) { |
| 425 | pdata->init_platform_hw(); | 431 | if (pdata->exit_platform_hw) { |
| 432 | err = devm_add_action(&client->dev, | ||
| 433 | tsc2007_call_exit_platform_hw, | ||
| 434 | &client->dev); | ||
| 435 | if (err) { | ||
| 436 | dev_err(&client->dev, | ||
| 437 | "Failed to register exit_platform_hw action, %d\n", | ||
| 438 | err); | ||
| 439 | return err; | ||
| 440 | } | ||
| 441 | } | ||
| 442 | |||
| 443 | if (pdata->init_platform_hw) | ||
| 444 | pdata->init_platform_hw(); | ||
| 445 | } | ||
| 426 | 446 | ||
| 427 | err = request_threaded_irq(ts->irq, tsc2007_hard_irq, tsc2007_soft_irq, | 447 | err = devm_request_threaded_irq(&client->dev, ts->irq, |
| 428 | IRQF_ONESHOT, client->dev.driver->name, ts); | 448 | tsc2007_hard_irq, tsc2007_soft_irq, |
| 429 | if (err < 0) { | 449 | IRQF_ONESHOT, |
| 430 | dev_err(&client->dev, "irq %d busy?\n", ts->irq); | 450 | client->dev.driver->name, ts); |
| 431 | goto err_free_input; | 451 | if (err) { |
| 452 | dev_err(&client->dev, "Failed to request irq %d: %d\n", | ||
| 453 | ts->irq, err); | ||
| 454 | return err; | ||
| 432 | } | 455 | } |
| 433 | 456 | ||
| 434 | tsc2007_stop(ts); | 457 | tsc2007_stop(ts); |
| 435 | 458 | ||
| 436 | err = input_register_device(input_dev); | 459 | err = input_register_device(input_dev); |
| 437 | if (err) | 460 | if (err) { |
| 438 | goto err_free_irq; | 461 | dev_err(&client->dev, |
| 439 | 462 | "Failed to register input device: %d\n", err); | |
| 440 | return 0; | 463 | return err; |
| 441 | 464 | } | |
| 442 | err_free_irq: | ||
| 443 | free_irq(ts->irq, ts); | ||
| 444 | if (pdata && pdata->exit_platform_hw) | ||
| 445 | pdata->exit_platform_hw(); | ||
| 446 | err_free_input: | ||
| 447 | input_free_device(input_dev); | ||
| 448 | return err; | ||
| 449 | } | ||
| 450 | |||
| 451 | static int tsc2007_remove(struct i2c_client *client) | ||
| 452 | { | ||
| 453 | const struct tsc2007_platform_data *pdata = dev_get_platdata(&client->dev); | ||
| 454 | struct tsc2007 *ts = i2c_get_clientdata(client); | ||
| 455 | |||
| 456 | free_irq(ts->irq, ts); | ||
| 457 | |||
| 458 | if (pdata && pdata->exit_platform_hw) | ||
| 459 | pdata->exit_platform_hw(); | ||
| 460 | |||
| 461 | input_unregister_device(ts->input); | ||
| 462 | kfree(ts); | ||
| 463 | 465 | ||
| 464 | return 0; | 466 | return 0; |
| 465 | } | 467 | } |
| @@ -487,7 +489,6 @@ static struct i2c_driver tsc2007_driver = { | |||
| 487 | }, | 489 | }, |
| 488 | .id_table = tsc2007_idtable, | 490 | .id_table = tsc2007_idtable, |
| 489 | .probe = tsc2007_probe, | 491 | .probe = tsc2007_probe, |
| 490 | .remove = tsc2007_remove, | ||
| 491 | }; | 492 | }; |
| 492 | 493 | ||
| 493 | module_i2c_driver(tsc2007_driver); | 494 | module_i2c_driver(tsc2007_driver); |
