aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/input/touchscreen/max11801_ts.c37
1 files changed, 9 insertions, 28 deletions
diff --git a/drivers/input/touchscreen/max11801_ts.c b/drivers/input/touchscreen/max11801_ts.c
index 00bc6caa27f5..9f84fcd08732 100644
--- a/drivers/input/touchscreen/max11801_ts.c
+++ b/drivers/input/touchscreen/max11801_ts.c
@@ -181,12 +181,11 @@ static int max11801_ts_probe(struct i2c_client *client,
181 struct input_dev *input_dev; 181 struct input_dev *input_dev;
182 int error; 182 int error;
183 183
184 data = kzalloc(sizeof(struct max11801_data), GFP_KERNEL); 184 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
185 input_dev = input_allocate_device(); 185 input_dev = devm_input_allocate_device(&client->dev);
186 if (!data || !input_dev) { 186 if (!data || !input_dev) {
187 dev_err(&client->dev, "Failed to allocate memory\n"); 187 dev_err(&client->dev, "Failed to allocate memory\n");
188 error = -ENOMEM; 188 return -ENOMEM;
189 goto err_free_mem;
190 } 189 }
191 190
192 data->client = client; 191 data->client = client;
@@ -205,38 +204,21 @@ static int max11801_ts_probe(struct i2c_client *client,
205 204
206 max11801_ts_phy_init(data); 205 max11801_ts_phy_init(data);
207 206
208 error = request_threaded_irq(client->irq, NULL, max11801_ts_interrupt, 207 error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
209 IRQF_TRIGGER_LOW | IRQF_ONESHOT, 208 max11801_ts_interrupt,
210 "max11801_ts", data); 209 IRQF_TRIGGER_LOW | IRQF_ONESHOT,
210 "max11801_ts", data);
211 if (error) { 211 if (error) {
212 dev_err(&client->dev, "Failed to register interrupt\n"); 212 dev_err(&client->dev, "Failed to register interrupt\n");
213 goto err_free_mem; 213 return error;
214 } 214 }
215 215
216 error = input_register_device(data->input_dev); 216 error = input_register_device(data->input_dev);
217 if (error) 217 if (error)
218 goto err_free_irq; 218 return error;
219 219
220 i2c_set_clientdata(client, data); 220 i2c_set_clientdata(client, data);
221 return 0; 221 return 0;
222
223err_free_irq:
224 free_irq(client->irq, data);
225err_free_mem:
226 input_free_device(input_dev);
227 kfree(data);
228 return error;
229}
230
231static int max11801_ts_remove(struct i2c_client *client)
232{
233 struct max11801_data *data = i2c_get_clientdata(client);
234
235 free_irq(client->irq, data);
236 input_unregister_device(data->input_dev);
237 kfree(data);
238
239 return 0;
240} 222}
241 223
242static const struct i2c_device_id max11801_ts_id[] = { 224static const struct i2c_device_id max11801_ts_id[] = {
@@ -252,7 +234,6 @@ static struct i2c_driver max11801_ts_driver = {
252 }, 234 },
253 .id_table = max11801_ts_id, 235 .id_table = max11801_ts_id,
254 .probe = max11801_ts_probe, 236 .probe = max11801_ts_probe,
255 .remove = max11801_ts_remove,
256}; 237};
257 238
258module_i2c_driver(max11801_ts_driver); 239module_i2c_driver(max11801_ts_driver);