Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+40 -39
+40 -39
drivers/input/touchscreen/tsc2007.c
··· 365 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 376 static int tsc2007_probe(struct i2c_client *client, 369 377 const struct i2c_device_id *id) 370 378 { ··· 396 388 if (err) 397 389 return err; 398 390 399 - input_dev = input_allocate_device(); 400 - if (!input_dev) { 401 - err = -ENOMEM; 402 - goto err_free_input; 403 - }; 391 + input_dev = devm_input_allocate_device(&client->dev); 392 + if (!input_dev) 393 + return -ENOMEM; 404 394 405 395 i2c_set_clientdata(client, ts); 406 396 ··· 427 421 input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, 428 422 ts->fuzzz, 0); 429 423 430 - if (pdata && pdata->init_platform_hw) 431 - pdata->init_platform_hw(); 424 + if (pdata) { 425 + if (pdata->exit_platform_hw) { 426 + err = devm_add_action(&client->dev, 427 + tsc2007_call_exit_platform_hw, 428 + &client->dev); 429 + if (err) { 430 + dev_err(&client->dev, 431 + "Failed to register exit_platform_hw action, %d\n", 432 + err); 433 + return err; 434 + } 435 + } 432 436 433 - err = request_threaded_irq(ts->irq, tsc2007_hard_irq, tsc2007_soft_irq, 434 - IRQF_ONESHOT, client->dev.driver->name, ts); 435 - if (err < 0) { 436 - dev_err(&client->dev, "irq %d busy?\n", ts->irq); 437 - goto err_free_input; 437 + if (pdata->init_platform_hw) 438 + pdata->init_platform_hw(); 439 + } 440 + 441 + err = devm_request_threaded_irq(&client->dev, ts->irq, 442 + tsc2007_hard_irq, tsc2007_soft_irq, 443 + IRQF_ONESHOT, 444 + client->dev.driver->name, ts); 445 + if (err) { 446 + dev_err(&client->dev, "Failed to request irq %d: %d\n", 447 + ts->irq, err); 448 + return err; 438 449 } 439 450 440 451 tsc2007_stop(ts); 441 452 442 453 err = input_register_device(input_dev); 443 - if (err) 444 - goto err_free_irq; 445 - 446 - return 0; 447 - 448 - err_free_irq: 449 - free_irq(ts->irq, ts); 450 - if (pdata && pdata->exit_platform_hw) 451 - pdata->exit_platform_hw(); 452 - err_free_input: 453 - input_free_device(input_dev); 454 - return err; 455 - } 456 - 457 - static int tsc2007_remove(struct i2c_client *client) 458 - { 459 - const struct tsc2007_platform_data *pdata = dev_get_platdata(&client->dev); 460 - struct tsc2007 *ts = i2c_get_clientdata(client); 461 - 462 - free_irq(ts->irq, ts); 463 - 464 - if (pdata && pdata->exit_platform_hw) 465 - pdata->exit_platform_hw(); 466 - 467 - input_unregister_device(ts->input); 468 - kfree(ts); 454 + if (err) { 455 + dev_err(&client->dev, 456 + "Failed to register input device: %d\n", err); 457 + return err; 458 + } 469 459 470 460 return 0; 471 461 } ··· 489 487 }, 490 488 .id_table = tsc2007_idtable, 491 489 .probe = tsc2007_probe, 492 - .remove = tsc2007_remove, 493 490 }; 494 491 495 492 module_i2c_driver(tsc2007_driver);