Hello Dmitry, just one question below: On Mon, 2021-10-11 at 18:37 -0700, Dmitry Torokhov wrote: > By using managed resources (devm) we are able to streamline error handling > in probe and remove most of the custom remove method. > > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx> > --- > drivers/input/keyboard/ep93xx_keypad.c | 116 ++++++++----------------- > 1 file changed, 36 insertions(+), 80 deletions(-) > > diff --git a/drivers/input/keyboard/ep93xx_keypad.c b/drivers/input/keyboard/ep93xx_keypad.c > index a66cfeaf5b21..90157707dc05 100644 > --- a/drivers/input/keyboard/ep93xx_keypad.c > +++ b/drivers/input/keyboard/ep93xx_keypad.c ... > @@ -227,61 +234,46 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) > struct resource *res; > int err; > > - keypad = kzalloc(sizeof(struct ep93xx_keypad), GFP_KERNEL); > + keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL); > if (!keypad) > return -ENOMEM; > > keypad->pdata = dev_get_platdata(&pdev->dev); > - if (!keypad->pdata) { > - err = -EINVAL; > - goto failed_free; > - } > + if (!keypad->pdata) > + return -EINVAL; > > keymap_data = keypad->pdata->keymap_data; > - if (!keymap_data) { > - err = -EINVAL; > - goto failed_free; > - } > + if (!keymap_data) > + return -EINVAL; > > keypad->irq = platform_get_irq(pdev, 0); > - if (keypad->irq < 0) { > - err = keypad->irq; > - goto failed_free; > - } > + if (keypad->irq < 0) > + return keypad->irq; > > res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > - if (!res) { > - err = -ENXIO; > - goto failed_free; > - } > - > - res = request_mem_region(res->start, resource_size(res), pdev->name); > - if (!res) { > - err = -EBUSY; > - goto failed_free; > - } > + if (!res) > + return -ENXIO; > > - keypad->mmio_base = ioremap(res->start, resource_size(res)); > - if (keypad->mmio_base == NULL) { > - err = -ENXIO; > - goto failed_free_mem; > - } > + keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(keypad->mmio_base)) > + return PTR_ERR(keypad->mmio_base); > > err = ep93xx_keypad_acquire_gpio(pdev); > if (err) > - goto failed_free_io; > + return err; > + > + err = devm_add_action_or_reset(&pdev->dev, > + ep93xx_keypad_release_gpio_action, pdev); > + if (err) > + return err; > > keypad->clk = clk_get(&pdev->dev, NULL); Isn't the conversion to devm_clk_get() missing here? > - if (IS_ERR(keypad->clk)) { > - err = PTR_ERR(keypad->clk); > - goto failed_free_gpio; > - } > + if (IS_ERR(keypad->clk)) > + return PTR_ERR(keypad->clk); > > - input_dev = input_allocate_device(); > - if (!input_dev) { > - err = -ENOMEM; > - goto failed_put_clk; > - } > + input_dev = devm_input_allocate_device(&pdev->dev); > + if (!input_dev) > + return -ENOMEM; > > keypad->input_dev = input_dev; > > @@ -289,26 +281,26 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) > input_dev->id.bustype = BUS_HOST; > input_dev->open = ep93xx_keypad_open; > input_dev->close = ep93xx_keypad_close; > - input_dev->dev.parent = &pdev->dev; > > err = matrix_keypad_build_keymap(keymap_data, NULL, > EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS, > keypad->keycodes, input_dev); > if (err) > - goto failed_free_dev; > + return err; > > if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) > __set_bit(EV_REP, input_dev->evbit); > input_set_drvdata(input_dev, keypad); > > - err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, > - 0, pdev->name, keypad); > + err = devm_request_irq(&pdev->dev, keypad->irq, > + ep93xx_keypad_irq_handler, > + 0, pdev->name, keypad); > if (err) > - goto failed_free_dev; > + return err; > > err = input_register_device(input_dev); > if (err) > - goto failed_free_irq; > + return err; > > platform_set_drvdata(pdev, keypad); > -- Alexander Sverdlin.