Commit c4be5e5a authored by Dmitry Torokhov's avatar Dmitry Torokhov

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: default avatarAlexander Sverdlin <alexander.sverdlin@gmail.com>
Link: https://lore.kernel.org/r/YWZGKWgdarGtvtYA@google.comSigned-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent ab317169
...@@ -219,6 +219,13 @@ static int __maybe_unused ep93xx_keypad_resume(struct device *dev) ...@@ -219,6 +219,13 @@ static int __maybe_unused ep93xx_keypad_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops, static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops,
ep93xx_keypad_suspend, ep93xx_keypad_resume); ep93xx_keypad_suspend, ep93xx_keypad_resume);
static void ep93xx_keypad_release_gpio_action(void *_pdev)
{
struct platform_device *pdev = _pdev;
ep93xx_keypad_release_gpio(pdev);
}
static int ep93xx_keypad_probe(struct platform_device *pdev) static int ep93xx_keypad_probe(struct platform_device *pdev)
{ {
struct ep93xx_keypad *keypad; struct ep93xx_keypad *keypad;
...@@ -227,61 +234,46 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) ...@@ -227,61 +234,46 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
struct resource *res; struct resource *res;
int err; int err;
keypad = kzalloc(sizeof(struct ep93xx_keypad), GFP_KERNEL); keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL);
if (!keypad) if (!keypad)
return -ENOMEM; return -ENOMEM;
keypad->pdata = dev_get_platdata(&pdev->dev); keypad->pdata = dev_get_platdata(&pdev->dev);
if (!keypad->pdata) { if (!keypad->pdata)
err = -EINVAL; return -EINVAL;
goto failed_free;
}
keymap_data = keypad->pdata->keymap_data; keymap_data = keypad->pdata->keymap_data;
if (!keymap_data) { if (!keymap_data)
err = -EINVAL; return -EINVAL;
goto failed_free;
}
keypad->irq = platform_get_irq(pdev, 0); keypad->irq = platform_get_irq(pdev, 0);
if (keypad->irq < 0) { if (keypad->irq < 0)
err = keypad->irq; return keypad->irq;
goto failed_free;
}
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) { if (!res)
err = -ENXIO; return -ENXIO;
goto failed_free;
}
res = request_mem_region(res->start, resource_size(res), pdev->name); keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res);
if (!res) { if (IS_ERR(keypad->mmio_base))
err = -EBUSY; return PTR_ERR(keypad->mmio_base);
goto failed_free;
}
keypad->mmio_base = ioremap(res->start, resource_size(res));
if (keypad->mmio_base == NULL) {
err = -ENXIO;
goto failed_free_mem;
}
err = ep93xx_keypad_acquire_gpio(pdev); err = ep93xx_keypad_acquire_gpio(pdev);
if (err) if (err)
goto failed_free_io; return err;
keypad->clk = clk_get(&pdev->dev, NULL); err = devm_add_action_or_reset(&pdev->dev,
if (IS_ERR(keypad->clk)) { ep93xx_keypad_release_gpio_action, pdev);
err = PTR_ERR(keypad->clk); if (err)
goto failed_free_gpio; return err;
}
input_dev = input_allocate_device(); keypad->clk = devm_clk_get(&pdev->dev, NULL);
if (!input_dev) { if (IS_ERR(keypad->clk))
err = -ENOMEM; return PTR_ERR(keypad->clk);
goto failed_put_clk;
} input_dev = devm_input_allocate_device(&pdev->dev);
if (!input_dev)
return -ENOMEM;
keypad->input_dev = input_dev; keypad->input_dev = input_dev;
...@@ -289,26 +281,26 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) ...@@ -289,26 +281,26 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
input_dev->id.bustype = BUS_HOST; input_dev->id.bustype = BUS_HOST;
input_dev->open = ep93xx_keypad_open; input_dev->open = ep93xx_keypad_open;
input_dev->close = ep93xx_keypad_close; input_dev->close = ep93xx_keypad_close;
input_dev->dev.parent = &pdev->dev;
err = matrix_keypad_build_keymap(keymap_data, NULL, err = matrix_keypad_build_keymap(keymap_data, NULL,
EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS, EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS,
keypad->keycodes, input_dev); keypad->keycodes, input_dev);
if (err) if (err)
goto failed_free_dev; return err;
if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT)
__set_bit(EV_REP, input_dev->evbit); __set_bit(EV_REP, input_dev->evbit);
input_set_drvdata(input_dev, keypad); input_set_drvdata(input_dev, keypad);
err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, err = devm_request_irq(&pdev->dev, keypad->irq,
ep93xx_keypad_irq_handler,
0, pdev->name, keypad); 0, pdev->name, keypad);
if (err) if (err)
goto failed_free_dev; return err;
err = input_register_device(input_dev); err = input_register_device(input_dev);
if (err) if (err)
goto failed_free_irq; return err;
platform_set_drvdata(pdev, keypad); platform_set_drvdata(pdev, keypad);
...@@ -318,48 +310,12 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) ...@@ -318,48 +310,12 @@ static int ep93xx_keypad_probe(struct platform_device *pdev)
dev_warn(&pdev->dev, "failed to set up wakeup irq: %d\n", err); dev_warn(&pdev->dev, "failed to set up wakeup irq: %d\n", err);
return 0; return 0;
failed_free_irq:
free_irq(keypad->irq, keypad);
failed_free_dev:
input_free_device(input_dev);
failed_put_clk:
clk_put(keypad->clk);
failed_free_gpio:
ep93xx_keypad_release_gpio(pdev);
failed_free_io:
iounmap(keypad->mmio_base);
failed_free_mem:
release_mem_region(res->start, resource_size(res));
failed_free:
kfree(keypad);
return err;
} }
static int ep93xx_keypad_remove(struct platform_device *pdev) static int ep93xx_keypad_remove(struct platform_device *pdev)
{ {
struct ep93xx_keypad *keypad = platform_get_drvdata(pdev);
struct resource *res;
dev_pm_clear_wake_irq(&pdev->dev); dev_pm_clear_wake_irq(&pdev->dev);
free_irq(keypad->irq, keypad);
if (keypad->enabled)
clk_disable(keypad->clk);
clk_put(keypad->clk);
input_unregister_device(keypad->input_dev);
ep93xx_keypad_release_gpio(pdev);
iounmap(keypad->mmio_base);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
release_mem_region(res->start, resource_size(res));
kfree(keypad);
return 0; return 0;
} }
......
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