Commit e7339118 authored by Dmitry Torokhov's avatar Dmitry Torokhov

Input: kxtj9 - switch to using managed resources

Using devm API allows to clean up error handling and drop the remove()
method.

Link: https://lore.kernel.org/r/20191017204217.106453-22-dmitry.torokhov@gmail.comSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent b873f73c
...@@ -292,7 +292,6 @@ static void kxtj9_init_input_device(struct kxtj9_data *tj9, ...@@ -292,7 +292,6 @@ static void kxtj9_init_input_device(struct kxtj9_data *tj9,
input_dev->name = "kxtj9_accel"; input_dev->name = "kxtj9_accel";
input_dev->id.bustype = BUS_I2C; input_dev->id.bustype = BUS_I2C;
input_dev->dev.parent = &tj9->client->dev;
} }
static int kxtj9_setup_input_device(struct kxtj9_data *tj9) static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
...@@ -300,7 +299,7 @@ static int kxtj9_setup_input_device(struct kxtj9_data *tj9) ...@@ -300,7 +299,7 @@ static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
struct input_dev *input_dev; struct input_dev *input_dev;
int err; int err;
input_dev = input_allocate_device(); input_dev = devm_input_allocate_device(&tj9->client->dev);
if (!input_dev) { if (!input_dev) {
dev_err(&tj9->client->dev, "input device allocate failed\n"); dev_err(&tj9->client->dev, "input device allocate failed\n");
return -ENOMEM; return -ENOMEM;
...@@ -319,7 +318,6 @@ static int kxtj9_setup_input_device(struct kxtj9_data *tj9) ...@@ -319,7 +318,6 @@ static int kxtj9_setup_input_device(struct kxtj9_data *tj9)
dev_err(&tj9->client->dev, dev_err(&tj9->client->dev,
"unable to register input polled device %s: %d\n", "unable to register input polled device %s: %d\n",
tj9->input_dev->name, err); tj9->input_dev->name, err);
input_free_device(tj9->input_dev);
return err; return err;
} }
...@@ -424,8 +422,8 @@ static int kxtj9_setup_polled_device(struct kxtj9_data *tj9) ...@@ -424,8 +422,8 @@ static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
{ {
int err; int err;
struct input_polled_dev *poll_dev; struct input_polled_dev *poll_dev;
poll_dev = input_allocate_polled_device();
poll_dev = devm_input_allocate_polled_device(&tj9->client->dev);
if (!poll_dev) { if (!poll_dev) {
dev_err(&tj9->client->dev, dev_err(&tj9->client->dev,
"Failed to allocate polled device\n"); "Failed to allocate polled device\n");
...@@ -446,19 +444,12 @@ static int kxtj9_setup_polled_device(struct kxtj9_data *tj9) ...@@ -446,19 +444,12 @@ static int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
if (err) { if (err) {
dev_err(&tj9->client->dev, dev_err(&tj9->client->dev,
"Unable to register polled device, err=%d\n", err); "Unable to register polled device, err=%d\n", err);
input_free_polled_device(poll_dev);
return err; return err;
} }
return 0; return 0;
} }
static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9)
{
input_unregister_polled_device(tj9->poll_dev);
input_free_polled_device(tj9->poll_dev);
}
#else #else
static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9) static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
...@@ -466,11 +457,15 @@ static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9) ...@@ -466,11 +457,15 @@ static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9)
return -ENOSYS; return -ENOSYS;
} }
static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) #endif
static void kxtj9_platform_exit(void *data)
{ {
} struct kxtj9_data *tj9 = data;
#endif if (tj9->pdata.exit)
tj9->pdata.exit();
}
static int kxtj9_verify(struct kxtj9_data *tj9) static int kxtj9_verify(struct kxtj9_data *tj9)
{ {
...@@ -494,7 +489,7 @@ static int kxtj9_verify(struct kxtj9_data *tj9) ...@@ -494,7 +489,7 @@ static int kxtj9_verify(struct kxtj9_data *tj9)
} }
static int kxtj9_probe(struct i2c_client *client, static int kxtj9_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
const struct kxtj9_platform_data *pdata = const struct kxtj9_platform_data *pdata =
dev_get_platdata(&client->dev); dev_get_platdata(&client->dev);
...@@ -512,7 +507,7 @@ static int kxtj9_probe(struct i2c_client *client, ...@@ -512,7 +507,7 @@ static int kxtj9_probe(struct i2c_client *client,
return -EINVAL; return -EINVAL;
} }
tj9 = kzalloc(sizeof(*tj9), GFP_KERNEL); tj9 = devm_kzalloc(&client->dev, sizeof(*tj9), GFP_KERNEL);
if (!tj9) { if (!tj9) {
dev_err(&client->dev, dev_err(&client->dev,
"failed to allocate memory for module data\n"); "failed to allocate memory for module data\n");
...@@ -525,13 +520,17 @@ static int kxtj9_probe(struct i2c_client *client, ...@@ -525,13 +520,17 @@ static int kxtj9_probe(struct i2c_client *client,
if (pdata->init) { if (pdata->init) {
err = pdata->init(); err = pdata->init();
if (err < 0) if (err < 0)
goto err_free_mem; return err;
} }
err = devm_add_action_or_reset(&client->dev, kxtj9_platform_exit, tj9);
if (err)
return err;
err = kxtj9_verify(tj9); err = kxtj9_verify(tj9);
if (err < 0) { if (err < 0) {
dev_err(&client->dev, "device not recognized\n"); dev_err(&client->dev, "device not recognized\n");
goto err_pdata_exit; return err;
} }
i2c_set_clientdata(client, tj9); i2c_set_clientdata(client, tj9);
...@@ -546,59 +545,31 @@ static int kxtj9_probe(struct i2c_client *client, ...@@ -546,59 +545,31 @@ static int kxtj9_probe(struct i2c_client *client,
err = kxtj9_setup_input_device(tj9); err = kxtj9_setup_input_device(tj9);
if (err) if (err)
goto err_pdata_exit; return err;
err = request_threaded_irq(client->irq, NULL, kxtj9_isr, err = devm_request_threaded_irq(&client->dev, client->irq,
IRQF_TRIGGER_RISING | IRQF_ONESHOT, NULL, kxtj9_isr,
"kxtj9-irq", tj9); IRQF_TRIGGER_RISING |
IRQF_ONESHOT,
"kxtj9-irq", tj9);
if (err) { if (err) {
dev_err(&client->dev, "request irq failed: %d\n", err); dev_err(&client->dev, "request irq failed: %d\n", err);
goto err_destroy_input; return err;
} }
err = sysfs_create_group(&client->dev.kobj, &kxtj9_attribute_group); err = devm_device_add_group(&client->dev,
&kxtj9_attribute_group);
if (err) { if (err) {
dev_err(&client->dev, "sysfs create failed: %d\n", err); dev_err(&client->dev, "sysfs create failed: %d\n", err);
goto err_free_irq; return err;
} }
} else { } else {
err = kxtj9_setup_polled_device(tj9); err = kxtj9_setup_polled_device(tj9);
if (err) if (err)
goto err_pdata_exit; return err;
}
return 0;
err_free_irq:
free_irq(client->irq, tj9);
err_destroy_input:
input_unregister_device(tj9->input_dev);
err_pdata_exit:
if (tj9->pdata.exit)
tj9->pdata.exit();
err_free_mem:
kfree(tj9);
return err;
}
static int kxtj9_remove(struct i2c_client *client)
{
struct kxtj9_data *tj9 = i2c_get_clientdata(client);
if (client->irq) {
sysfs_remove_group(&client->dev.kobj, &kxtj9_attribute_group);
free_irq(client->irq, tj9);
input_unregister_device(tj9->input_dev);
} else {
kxtj9_teardown_polled_device(tj9);
} }
if (tj9->pdata.exit)
tj9->pdata.exit();
kfree(tj9);
return 0; return 0;
} }
...@@ -647,7 +618,6 @@ static struct i2c_driver kxtj9_driver = { ...@@ -647,7 +618,6 @@ static struct i2c_driver kxtj9_driver = {
.pm = &kxtj9_pm_ops, .pm = &kxtj9_pm_ops,
}, },
.probe = kxtj9_probe, .probe = kxtj9_probe,
.remove = kxtj9_remove,
.id_table = kxtj9_id, .id_table = kxtj9_id,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment