aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/input/keyboard/mpr121_touchkey.c42
1 files changed, 12 insertions, 30 deletions
diff --git a/drivers/input/keyboard/mpr121_touchkey.c b/drivers/input/keyboard/mpr121_touchkey.c
index 009c82256e89..3aa2ec45bcab 100644
--- a/drivers/input/keyboard/mpr121_touchkey.c
+++ b/drivers/input/keyboard/mpr121_touchkey.c
@@ -214,13 +214,14 @@ static int mpr_touchkey_probe(struct i2c_client *client,
214 return -EINVAL; 214 return -EINVAL;
215 } 215 }
216 216
217 mpr121 = kzalloc(sizeof(struct mpr121_touchkey), GFP_KERNEL); 217 mpr121 = devm_kzalloc(&client->dev, sizeof(*mpr121),
218 input_dev = input_allocate_device(); 218 GFP_KERNEL);
219 if (!mpr121 || !input_dev) { 219 if (!mpr121)
220 dev_err(&client->dev, "Failed to allocate memory\n"); 220 return -ENOMEM;
221 error = -ENOMEM; 221
222 goto err_free_mem; 222 input_dev = devm_input_allocate_device(&client->dev);
223 } 223 if (!input_dev)
224 return -ENOMEM;
224 225
225 mpr121->client = client; 226 mpr121->client = client;
226 mpr121->input_dev = input_dev; 227 mpr121->input_dev = input_dev;
@@ -243,44 +244,26 @@ static int mpr_touchkey_probe(struct i2c_client *client,
243 error = mpr121_phys_init(pdata, mpr121, client); 244 error = mpr121_phys_init(pdata, mpr121, client);
244 if (error) { 245 if (error) {
245 dev_err(&client->dev, "Failed to init register\n"); 246 dev_err(&client->dev, "Failed to init register\n");
246 goto err_free_mem; 247 return error;
247 } 248 }
248 249
249 error = request_threaded_irq(client->irq, NULL, 250 error = devm_request_threaded_irq(&client->dev, client->irq, NULL,
250 mpr_touchkey_interrupt, 251 mpr_touchkey_interrupt,
251 IRQF_TRIGGER_FALLING | IRQF_ONESHOT, 252 IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
252 client->dev.driver->name, mpr121); 253 client->dev.driver->name, mpr121);
253 if (error) { 254 if (error) {
254 dev_err(&client->dev, "Failed to register interrupt\n"); 255 dev_err(&client->dev, "Failed to register interrupt\n");
255 goto err_free_mem; 256 return error;
256 } 257 }
257 258
258 error = input_register_device(input_dev); 259 error = input_register_device(input_dev);
259 if (error) 260 if (error)
260 goto err_free_irq; 261 return error;
261 262
262 i2c_set_clientdata(client, mpr121); 263 i2c_set_clientdata(client, mpr121);
263 device_init_wakeup(&client->dev, pdata->wakeup); 264 device_init_wakeup(&client->dev, pdata->wakeup);
264 265
265 return 0; 266 return 0;
266
267err_free_irq:
268 free_irq(client->irq, mpr121);
269err_free_mem:
270 input_free_device(input_dev);
271 kfree(mpr121);
272 return error;
273}
274
275static int mpr_touchkey_remove(struct i2c_client *client)
276{
277 struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client);
278
279 free_irq(client->irq, mpr121);
280 input_unregister_device(mpr121->input_dev);
281 kfree(mpr121);
282
283 return 0;
284} 267}
285 268
286#ifdef CONFIG_PM_SLEEP 269#ifdef CONFIG_PM_SLEEP
@@ -327,7 +310,6 @@ static struct i2c_driver mpr_touchkey_driver = {
327 }, 310 },
328 .id_table = mpr121_id, 311 .id_table = mpr121_id,
329 .probe = mpr_touchkey_probe, 312 .probe = mpr_touchkey_probe,
330 .remove = mpr_touchkey_remove,
331}; 313};
332 314
333module_i2c_driver(mpr_touchkey_driver); 315module_i2c_driver(mpr_touchkey_driver);