Skip to content

Commit c4be5e5

Browse files
committed
Input: ep93xx_keypad - switch to using managed resources
By using managed resources (devm) we are able to streamline error handling in probe and remove most of the custom remove method. Acked-by: Alexander Sverdlin <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Dmitry Torokhov <[email protected]>
1 parent ab31716 commit c4be5e5

File tree

1 file changed

+37
-81
lines changed

1 file changed

+37
-81
lines changed

drivers/input/keyboard/ep93xx_keypad.c

Lines changed: 37 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,13 @@ static int __maybe_unused ep93xx_keypad_resume(struct device *dev)
219219
static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops,
220220
ep93xx_keypad_suspend, ep93xx_keypad_resume);
221221

222+
static void ep93xx_keypad_release_gpio_action(void *_pdev)
223+
{
224+
struct platform_device *pdev = _pdev;
225+
226+
ep93xx_keypad_release_gpio(pdev);
227+
}
228+
222229
static int ep93xx_keypad_probe(struct platform_device *pdev)
223230
{
224231
struct ep93xx_keypad *keypad;
@@ -227,88 +234,73 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
227234
struct resource *res;
228235
int err;
229236

230-
keypad = kzalloc(sizeof(struct ep93xx_keypad), GFP_KERNEL);
237+
keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL);
231238
if (!keypad)
232239
return -ENOMEM;
233240

234241
keypad->pdata = dev_get_platdata(&pdev->dev);
235-
if (!keypad->pdata) {
236-
err = -EINVAL;
237-
goto failed_free;
238-
}
242+
if (!keypad->pdata)
243+
return -EINVAL;
239244

240245
keymap_data = keypad->pdata->keymap_data;
241-
if (!keymap_data) {
242-
err = -EINVAL;
243-
goto failed_free;
244-
}
246+
if (!keymap_data)
247+
return -EINVAL;
245248

246249
keypad->irq = platform_get_irq(pdev, 0);
247-
if (keypad->irq < 0) {
248-
err = keypad->irq;
249-
goto failed_free;
250-
}
250+
if (keypad->irq < 0)
251+
return keypad->irq;
251252

252253
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
253-
if (!res) {
254-
err = -ENXIO;
255-
goto failed_free;
256-
}
257-
258-
res = request_mem_region(res->start, resource_size(res), pdev->name);
259-
if (!res) {
260-
err = -EBUSY;
261-
goto failed_free;
262-
}
254+
if (!res)
255+
return -ENXIO;
263256

264-
keypad->mmio_base = ioremap(res->start, resource_size(res));
265-
if (keypad->mmio_base == NULL) {
266-
err = -ENXIO;
267-
goto failed_free_mem;
268-
}
257+
keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res);
258+
if (IS_ERR(keypad->mmio_base))
259+
return PTR_ERR(keypad->mmio_base);
269260

270261
err = ep93xx_keypad_acquire_gpio(pdev);
271262
if (err)
272-
goto failed_free_io;
263+
return err;
273264

274-
keypad->clk = clk_get(&pdev->dev, NULL);
275-
if (IS_ERR(keypad->clk)) {
276-
err = PTR_ERR(keypad->clk);
277-
goto failed_free_gpio;
278-
}
265+
err = devm_add_action_or_reset(&pdev->dev,
266+
ep93xx_keypad_release_gpio_action, pdev);
267+
if (err)
268+
return err;
279269

280-
input_dev = input_allocate_device();
281-
if (!input_dev) {
282-
err = -ENOMEM;
283-
goto failed_put_clk;
284-
}
270+
keypad->clk = devm_clk_get(&pdev->dev, NULL);
271+
if (IS_ERR(keypad->clk))
272+
return PTR_ERR(keypad->clk);
273+
274+
input_dev = devm_input_allocate_device(&pdev->dev);
275+
if (!input_dev)
276+
return -ENOMEM;
285277

286278
keypad->input_dev = input_dev;
287279

288280
input_dev->name = pdev->name;
289281
input_dev->id.bustype = BUS_HOST;
290282
input_dev->open = ep93xx_keypad_open;
291283
input_dev->close = ep93xx_keypad_close;
292-
input_dev->dev.parent = &pdev->dev;
293284

294285
err = matrix_keypad_build_keymap(keymap_data, NULL,
295286
EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS,
296287
keypad->keycodes, input_dev);
297288
if (err)
298-
goto failed_free_dev;
289+
return err;
299290

300291
if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT)
301292
__set_bit(EV_REP, input_dev->evbit);
302293
input_set_drvdata(input_dev, keypad);
303294

304-
err = request_irq(keypad->irq, ep93xx_keypad_irq_handler,
305-
0, pdev->name, keypad);
295+
err = devm_request_irq(&pdev->dev, keypad->irq,
296+
ep93xx_keypad_irq_handler,
297+
0, pdev->name, keypad);
306298
if (err)
307-
goto failed_free_dev;
299+
return err;
308300

309301
err = input_register_device(input_dev);
310302
if (err)
311-
goto failed_free_irq;
303+
return err;
312304

313305
platform_set_drvdata(pdev, keypad);
314306

@@ -318,48 +310,12 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
318310
dev_warn(&pdev->dev, "failed to set up wakeup irq: %d\n", err);
319311

320312
return 0;
321-
322-
failed_free_irq:
323-
free_irq(keypad->irq, keypad);
324-
failed_free_dev:
325-
input_free_device(input_dev);
326-
failed_put_clk:
327-
clk_put(keypad->clk);
328-
failed_free_gpio:
329-
ep93xx_keypad_release_gpio(pdev);
330-
failed_free_io:
331-
iounmap(keypad->mmio_base);
332-
failed_free_mem:
333-
release_mem_region(res->start, resource_size(res));
334-
failed_free:
335-
kfree(keypad);
336-
return err;
337313
}
338314

339315
static int ep93xx_keypad_remove(struct platform_device *pdev)
340316
{
341-
struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);
342-
struct resource *res;
343-
344317
dev_pm_clear_wake_irq(&pdev->dev);
345318

346-
free_irq(keypad->irq, keypad);
347-
348-
if (keypad->enabled)
349-
clk_disable(keypad->clk);
350-
clk_put(keypad->clk);
351-
352-
input_unregister_device(keypad->input_dev);
353-
354-
ep93xx_keypad_release_gpio(pdev);
355-
356-
iounmap(keypad->mmio_base);
357-
358-
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
359-
release_mem_region(res->start, resource_size(res));
360-
361-
kfree(keypad);
362-
363319
return 0;
364320
}
365321

0 commit comments

Comments
 (0)