Re: [PATCHv3 3/6] serial: mxs-auart: use devm resources for iomem and GPIO IRQs
Frank Li <[email protected]>
| Newsgroups | org.kernel.vger.linux-serial,dev.linux.lists.imx,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <alELF7h54nY8Kycz@SMW015318> |
On Wed, Jun 10, 2026 at 08:38:53PM -0700, Rosen Penev wrote: > Replace platform_get_resource + ioremap with > devm_platform_get_and_ioremap_resource and convert GPIO IRQ > request_irq/free_irq to devm_request_irq. This eliminates the > mxs_auart_free_gpio_irq function and its call sites, and the > out_iounmap error label. Simplify the remove function accordingly. > Please use two patches to do it, one for platform_get_resource(), one for irq part Frank > Assisted-by: opencode:big-pickle > Signed-off-by: Rosen Penev <[email protected]> > --- > drivers/tty/serial/mxs-auart.c | 53 +++++++--------------------------- > 1 file changed, 11 insertions(+), 42 deletions(-) > > diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c > index aa59a48bfad7..4499e3206e85 100644 > --- a/drivers/tty/serial/mxs-auart.c > +++ b/drivers/tty/serial/mxs-auart.c > @@ -1517,15 +1517,6 @@ static int mxs_auart_init_gpios(struct mxs_auart_port *s, struct device *dev) > return 0; > } > > -static void mxs_auart_free_gpio_irq(struct mxs_auart_port *s) > -{ > - enum mctrl_gpio_idx i; > - > - for (i = 0; i < UART_GPIO_MAX; i++) > - if (s->gpio_irq[i] >= 0) > - free_irq(s->gpio_irq[i], s); > -} > - > static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) > { > int *irq = s->gpio_irq; > @@ -1537,21 +1528,13 @@ static int mxs_auart_request_gpio_irq(struct mxs_auart_port *s) > continue; > > irq_set_status_flags(irq[i], IRQ_NOAUTOEN); > - err = request_irq(irq[i], mxs_auart_irq_handle, > - IRQ_TYPE_EDGE_BOTH, dev_name(s->dev), s); > + err = devm_request_irq(s->dev, irq[i], mxs_auart_irq_handle, > + IRQ_TYPE_EDGE_BOTH, dev_name(s->dev), s); > if (err) > dev_err(s->dev, "%s - Can't get %d irq\n", > __func__, irq[i]); > } > > - /* > - * If something went wrong, rollback. > - * Be careful: i may be unsigned. > - */ > - while (err && (i-- > 0)) > - if (irq[i] >= 0) > - free_irq(irq[i], s); > - > return err; > } > > @@ -1596,18 +1579,12 @@ static int mxs_auart_probe(struct platform_device *pdev) > if (ret) > return ret; > > - r = platform_get_resource(pdev, IORESOURCE_MEM, 0); > - if (!r) { > - ret = -ENXIO; > + s->port.membase = devm_platform_get_and_ioremap_resource(pdev, 0, &r); > + if (IS_ERR(s->port.membase)) { > + ret = PTR_ERR(s->port.membase); > goto out_disable_clk; > } > - > s->port.mapbase = r->start; > - s->port.membase = ioremap(r->start, resource_size(r)); > - if (!s->port.membase) { > - ret = -ENOMEM; > - goto out_disable_clk; > - } > s->port.ops = &mxs_auart_ops; > s->port.iotype = UPIO_MEM; > s->port.fifosize = MXS_AUART_FIFO_SIZE; > @@ -1622,21 +1599,21 @@ static int mxs_auart_probe(struct platform_device *pdev) > irq = platform_get_irq(pdev, 0); > if (irq < 0) { > ret = irq; > - goto out_iounmap; > + goto out_disable_clk; > } > > s->port.irq = irq; > ret = devm_request_irq(&pdev->dev, irq, mxs_auart_irq_handle, 0, > dev_name(&pdev->dev), s); > if (ret) > - goto out_iounmap; > + goto out_disable_clk; > > platform_set_drvdata(pdev, s); > > ret = mxs_auart_init_gpios(s, &pdev->dev); > if (ret) { > dev_err(&pdev->dev, "Failed to initialize GPIOs.\n"); > - goto out_iounmap; > + goto out_disable_clk; > } > > /* > @@ -1644,7 +1621,7 @@ static int mxs_auart_probe(struct platform_device *pdev) > */ > ret = mxs_auart_request_gpio_irq(s); > if (ret) > - goto out_iounmap; > + goto out_disable_clk; > > auart_port[s->port.line] = s; > > @@ -1667,11 +1644,7 @@ static int mxs_auart_probe(struct platform_device *pdev) > return 0; > > out_free_qpio_irq: > - mxs_auart_free_gpio_irq(s); > - auart_port[pdev->id] = NULL; > - > -out_iounmap: > - iounmap(s->port.membase); > + auart_port[s->port.line] = NULL; > > out_disable_clk: > clk_disable_unprepare(s->clk); > @@ -1683,11 +1656,7 @@ static void mxs_auart_remove(struct platform_device *pdev) > struct mxs_auart_port *s = platform_get_drvdata(pdev); > > uart_remove_one_port(&auart_driver, &s->port); > - auart_port[pdev->id] = NULL; > - mxs_auart_free_gpio_irq(s); > - iounmap(s->port.membase); > - if (is_asm9260_auart(s)) > - clk_disable_unprepare(s->clk); > + auart_port[s->port.line] = NULL; > } > > static struct platform_driver mxs_auart_driver = { > -- > 2.54.0 > >