diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-11-19 12:52:29 -0800 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2013-11-25 18:27:56 -0800 | 
| commit | fd91a5f01373ebf672a6691f4dcd487af48be945 (patch) | |
| tree | 5ecc838cc5e020e1b1f12a40762369cde23c423a /drivers/input/touchscreen | |
| parent | f261d46551275abc9e92b24773b15fbb82153b63 (diff) | |
| download | linux-fd91a5f01373ebf672a6691f4dcd487af48be945.tar.bz2 | |
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/touchscreen')
| -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,  	return 0;  } +static void tsc2007_call_exit_platform_hw(void *data) +{ +	struct device *dev = data; +	const struct tsc2007_platform_data *pdata = dev_get_platdata(dev); + +	pdata->exit_platform_hw(); +} +  static int tsc2007_probe(struct i2c_client *client,  			 const struct i2c_device_id *id)  { @@ -388,11 +396,9 @@ static int tsc2007_probe(struct i2c_client *client,  	if (err)  		return err; -	input_dev = input_allocate_device(); -	if (!input_dev) { -		err = -ENOMEM; -		goto err_free_input; -	}; +	input_dev = devm_input_allocate_device(&client->dev); +	if (!input_dev) +		return -ENOMEM;  	i2c_set_clientdata(client, ts); @@ -421,45 +427,41 @@ static int tsc2007_probe(struct i2c_client *client,  	input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT,  			     ts->fuzzz, 0); -	if (pdata && pdata->init_platform_hw) -		pdata->init_platform_hw(); +	if (pdata) { +		if (pdata->exit_platform_hw) { +			err = devm_add_action(&client->dev, +					      tsc2007_call_exit_platform_hw, +					      &client->dev); +			if (err) { +				dev_err(&client->dev, +					"Failed to register exit_platform_hw action, %d\n", +					err); +				return err; +			} +		} + +		if (pdata->init_platform_hw) +			pdata->init_platform_hw(); +	} -	err = request_threaded_irq(ts->irq, tsc2007_hard_irq, tsc2007_soft_irq, -				   IRQF_ONESHOT, client->dev.driver->name, ts); -	if (err < 0) { -		dev_err(&client->dev, "irq %d busy?\n", ts->irq); -		goto err_free_input; +	err = devm_request_threaded_irq(&client->dev, ts->irq, +					tsc2007_hard_irq, tsc2007_soft_irq, +					IRQF_ONESHOT, +					client->dev.driver->name, ts); +	if (err) { +		dev_err(&client->dev, "Failed to request irq %d: %d\n", +			ts->irq, err); +		return err;  	}  	tsc2007_stop(ts);  	err = input_register_device(input_dev); -	if (err) -		goto err_free_irq; - -	return 0; - - err_free_irq: -	free_irq(ts->irq, ts); -	if (pdata && pdata->exit_platform_hw) -		pdata->exit_platform_hw(); - err_free_input: -	input_free_device(input_dev); -	return err; -} - -static int tsc2007_remove(struct i2c_client *client) -{ -	const struct tsc2007_platform_data *pdata = dev_get_platdata(&client->dev); -	struct tsc2007 *ts = i2c_get_clientdata(client); - -	free_irq(ts->irq, ts); - -	if (pdata && pdata->exit_platform_hw) -		pdata->exit_platform_hw(); - -	input_unregister_device(ts->input); -	kfree(ts); +	if (err) { +		dev_err(&client->dev, +			"Failed to register input device: %d\n", err); +		return err; +	}  	return 0;  } @@ -487,7 +489,6 @@ static struct i2c_driver tsc2007_driver = {  	},  	.id_table	= tsc2007_idtable,  	.probe		= tsc2007_probe, -	.remove		= tsc2007_remove,  };  module_i2c_driver(tsc2007_driver); |