2020-07-09 13:57:34

by Chuhong Yuan

[permalink] [raw]
Subject: [PATCH v2] serial: mxs-auart: add missed iounmap() in probe failure and remove

This driver calls ioremap() in probe, but it misses calling iounmap() in
probe's error handler and remove.
Add the missed calls to fix it.

Fixes: 47d37d6f94cc ("serial: Add auart driver for i.MX23/28")
Signed-off-by: Chuhong Yuan <[email protected]>
---
Changes in v2:
- Use iounmap() instead of devm_ioremap() to fix the bugs.
- Modify the subject and the description.

drivers/tty/serial/mxs-auart.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index b4f835e7de23..b784323a6a7b 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -1698,21 +1698,21 @@ static int mxs_auart_probe(struct platform_device *pdev)
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
ret = irq;
- goto out_disable_clks;
+ goto out_iounmap;
}

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_disable_clks;
+ goto out_iounmap;

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_disable_clks;
+ goto out_iounmap;
}

/*
@@ -1720,7 +1720,7 @@ static int mxs_auart_probe(struct platform_device *pdev)
*/
ret = mxs_auart_request_gpio_irq(s);
if (ret)
- goto out_disable_clks;
+ goto out_iounmap;

auart_port[s->port.line] = s;

@@ -1746,6 +1746,9 @@ static int mxs_auart_probe(struct platform_device *pdev)
mxs_auart_free_gpio_irq(s);
auart_port[pdev->id] = NULL;

+out_iounmap:
+ iounmap(s->port.membase);
+
out_disable_clks:
if (is_asm9260_auart(s)) {
clk_disable_unprepare(s->clk);
@@ -1761,6 +1764,7 @@ static int mxs_auart_remove(struct platform_device *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);
clk_disable_unprepare(s->clk_ahb);
--
2.26.2


2020-07-14 11:30:04

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH v2] serial: mxs-auart: add missed iounmap() in probe failure and remove

On 09. 07. 20, 15:56, Chuhong Yuan wrote:
> This driver calls ioremap() in probe, but it misses calling iounmap() in
> probe's error handler and remove.
> Add the missed calls to fix it.
>
> Fixes: 47d37d6f94cc ("serial: Add auart driver for i.MX23/28")
> Signed-off-by: Chuhong Yuan <[email protected]>
> ---
> Changes in v2:
> - Use iounmap() instead of devm_ioremap() to fix the bugs.

Out of curiosity, what was wrong with devm_ioremap? I seem I cannot find
the reason...

> - Modify the subject and the description.
>
> drivers/tty/serial/mxs-auart.c | 12 ++++++++----
> 1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
> index b4f835e7de23..b784323a6a7b 100644
> --- a/drivers/tty/serial/mxs-auart.c
> +++ b/drivers/tty/serial/mxs-auart.c
> @@ -1698,21 +1698,21 @@ static int mxs_auart_probe(struct platform_device *pdev)
> irq = platform_get_irq(pdev, 0);
> if (irq < 0) {
> ret = irq;
> - goto out_disable_clks;
> + goto out_iounmap;
> }
>
> 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_disable_clks;
> + goto out_iounmap;
>
> 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_disable_clks;
> + goto out_iounmap;
> }
>
> /*
> @@ -1720,7 +1720,7 @@ static int mxs_auart_probe(struct platform_device *pdev)
> */
> ret = mxs_auart_request_gpio_irq(s);
> if (ret)
> - goto out_disable_clks;
> + goto out_iounmap;
>
> auart_port[s->port.line] = s;
>
> @@ -1746,6 +1746,9 @@ static int mxs_auart_probe(struct platform_device *pdev)
> mxs_auart_free_gpio_irq(s);
> auart_port[pdev->id] = NULL;
>
> +out_iounmap:
> + iounmap(s->port.membase);
> +
> out_disable_clks:
> if (is_asm9260_auart(s)) {
> clk_disable_unprepare(s->clk);
> @@ -1761,6 +1764,7 @@ static int mxs_auart_remove(struct platform_device *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);
> clk_disable_unprepare(s->clk_ahb);
>


--
js
suse labs