diff options
-rw-r--r-- | drivers/input/keyboard/mpr121_touchkey.c | 42 |
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 | |||
267 | err_free_irq: | ||
268 | free_irq(client->irq, mpr121); | ||
269 | err_free_mem: | ||
270 | input_free_device(input_dev); | ||
271 | kfree(mpr121); | ||
272 | return error; | ||
273 | } | ||
274 | |||
275 | static 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 | ||
333 | module_i2c_driver(mpr_touchkey_driver); | 315 | module_i2c_driver(mpr_touchkey_driver); |