Linux Serial subsystem development
 help / color / mirror / Atom feed
* Re: [PATCH v2 45/45] drivers: tty: serial: mux: use devm_* functions
From: Andy Shevchenko @ 2019-03-15  9:08 UTC (permalink / raw)
  To: Enrico Weigelt, metux IT consult
  Cc: Linux Kernel Mailing List, Greg Kroah-Hartman, Eric Anholt,
	Stefan Wahren, Florian Fainelli, Ray Jui, Scott Branden,
	bcm-kernel-feedback-list, Andy Shevchenko, Vladimir Zapolskiy,
	Matthias Brugger, Masahiro Yamada, Tobias Klauser, Richard Genoud,
	macro, Uwe Kleine-König, Sascha Hauer, slemieux.tyco
In-Reply-To: <1552602855-26086-46-git-send-email-info@metux.net>

On Fri, Mar 15, 2019 at 12:37 AM Enrico Weigelt, metux IT consult
<info@metux.net> wrote:
>
> Use the safer devm versions of memory mapping functions.

If you are going to use devm_*_free(), what's the point to have this
change from the beginning?

P.S. Disregard that this is untested series...

> --- a/drivers/tty/serial/mux.c
> +++ b/drivers/tty/serial/mux.c
> @@ -456,8 +456,9 @@ static int __init mux_probe(struct parisc_device *dev)
>         printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.6\n", port_count);
>
>         dev_set_drvdata(&dev->dev, (void *)(long)port_count);
> -       request_mem_region(dev->hpa.start + MUX_OFFSET,
> -                           port_count * MUX_LINE_OFFSET, "Mux");

> +       devm_request_mem_region(&dev->dev,
> +                               dev->hpa.start + MUX_OFFSET,
> +                               port_count * MUX_LINE_OFFSET, "Mux");

...and on top of this where is error checking?

>
>         if(!port_cnt) {
>                 mux_driver.cons = MUX_CONSOLE;
> @@ -474,7 +475,9 @@ static int __init mux_probe(struct parisc_device *dev)
>                 port->iobase    = 0;
>                 port->mapbase   = dev->hpa.start + MUX_OFFSET +
>                                                 (i * MUX_LINE_OFFSET);
> -               port->membase   = ioremap_nocache(port->mapbase, MUX_LINE_OFFSET);
> +               port->membase   = devm_ioremap_nocache(port->dev,
> +                                                      port->mapbase,
> +                                                      MUX_LINE_OFFSET);
>                 port->iotype    = UPIO_MEM;
>                 port->type      = PORT_MUX;
>                 port->irq       = 0;
> @@ -517,10 +520,12 @@ static int __exit mux_remove(struct parisc_device *dev)
>
>                 uart_remove_one_port(&mux_driver, port);
>                 if(port->membase)
> -                       iounmap(port->membase);
> +                       devm_iounmap(port->dev, port->membase);
>         }
>
> -       release_mem_region(dev->hpa.start + MUX_OFFSET, port_count * MUX_LINE_OFFSET);
> +       devm_release_mem_region(&dev->dev,
> +                               dev->hpa.start + MUX_OFFSET,
> +                               port_count * MUX_LINE_OFFSET);
>         return 0;
>  }


-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply

* Re: [PATCH v2 10/45] drivers: tty: serial: zs: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-15  9:06 UTC (permalink / raw)
  To: Greg KH, Enrico Weigelt, metux IT consult
  Cc: linux-kernel, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <20190314225204.GB1795@kroah.com>

On 14.03.19 23:52, Greg KH wrote:
> On Thu, Mar 14, 2019 at 11:33:40PM +0100, Enrico Weigelt, metux IT consult wrote:
>> Use the safer devm versions of memory mapping functions.
> 
> What is "safer" about them?

Garbage collection :)

Several drivers didn't seem to clean up properly (maybe these're just
used compiled-in, so nobody noticed yet).

In general, I think devm_* should be the standard case, unless there's
a really good reason to do otherwise.

<snip>

> Isn't the whole goal of the devm* functions such that you are not
> required to call "release" on them?

Looks that one slipped through, when I was doing that big bulk change
in the middle of the night and not enough coffe ;-)

One problem here is that many drivers do this stuff in request/release
port, instead of probe/remove. I'm not sure yet, whether we should
rewrite that. There're also cases which do request/release, but no
ioremap (doing hardcoded register accesses), others do ioremap w/o
request/release.

IMHO, we should have a closer look at those and check whether that's
really okay (just adding request/release blindly could cause trouble)

> And also, why make the change, you aren't changing any functionality for
> these old drivers at all from what I can tell (for the devm calls).
> What am I missing here?

Okay, there's a bigger story behind, you can't know yet. Finally, I'd
like to move everything to using struct resource and corresponding
helpers consistently, so most of the drivers would be pretty simple
at that point. (there're of course special cases, like devices w/
multiple register spaces, etc)

Here's my wip branch:

https://github.com/metux/linux/commits/wip/serial-res

In this consolidation process, I'm trying to move everything to
devm_*, to have it more generic (for now, I still need two versions
of the request/release/ioremap/iounmap helpers - one w/ and one
w/o devm).

My idea was moving to devm first, so it can be reviewed/tested
independently, before moving forward. Smaller, easily digestable
pieces should minimize the risk of breaking anything. But if you
prefer having this things squashed together, just let me know.

In the queue are also other minor cleanups like using dev_err()
instead of printk(), etc. Should I send these separately ?

By the way: do you have some public branch where you're collecting
accepted patches, which I could base mine on ? (tty.git/tty-next ?)


--mtx

-- 
Enrico Weigelt, metux IT consult
Free software and Linux embedded engineering
info@metux.net -- +49-151-27565287

^ permalink raw reply

* Re: [PATCH v2 02/45] drivers: tty: serial: 8250_dw: use devm_ioremap_resource()
From: Andy Shevchenko @ 2019-03-15  9:04 UTC (permalink / raw)
  To: Enrico Weigelt, metux IT consult
  Cc: Linux Kernel Mailing List, Greg Kroah-Hartman, Eric Anholt,
	Stefan Wahren, Florian Fainelli, Ray Jui, Scott Branden,
	bcm-kernel-feedback-list, Andy Shevchenko, Vladimir Zapolskiy,
	Matthias Brugger, Masahiro Yamada, Tobias Klauser, Richard Genoud,
	macro, Uwe Kleine-König, Sascha Hauer, slemieux.tyco
In-Reply-To: <1552602855-26086-3-git-send-email-info@metux.net>

On Fri, Mar 15, 2019 at 12:41 AM Enrico Weigelt, metux IT consult
<info@metux.net> wrote:
>
> Instead of fetching out data from a struct resource for passing
> it to devm_ioremap(), directly use devm_ioremap_resource()

I don't see any advantage of this change.
See also below.

> --- a/drivers/tty/serial/8250/8250_dw.c
> +++ b/drivers/tty/serial/8250/8250_dw.c
> @@ -526,7 +526,7 @@ static int dw8250_probe(struct platform_device *pdev)
>         p->set_ldisc    = dw8250_set_ldisc;
>         p->set_termios  = dw8250_set_termios;
>
> -       p->membase = devm_ioremap(dev, regs->start, resource_size(regs));
> +       p->membase = devm_ioremap_resource(dev, regs);
>         if (!p->membase)

And how did you test this? devm_ioremap_resource() returns error
pointer in case of error.

>                 return -ENOMEM;

-- 
With Best Regards,
Andy Shevchenko

^ permalink raw reply

* Re: [PATCH v2] tty: atmel_serial: fix a NULL pointer dereference
From: Richard Genoud @ 2019-03-15  8:22 UTC (permalink / raw)
  To: Kangjie Lu
  Cc: Greg Kroah-Hartman, Jiri Slaby, Nicolas Ferre, Alexandre Belloni,
	Ludovic Desroches, linux-serial, linux-arm-kernel, linux-kernel
In-Reply-To: <20190315072709.22811-1-kjlu@umn.edu>

Le 15/03/2019 à 08:27, Kangjie Lu a écrit :
> Fixes: 34df42f59a60 ("serial: at91: add rx dma support")
The Fixes: tag should be just bellow the Signenf-off-by: tag
> 
> In case dmaengine_prep_dma_cyclic fails, the fix returns a proper
> error code to avoid NULL pointer dereference.
> 
> Signed-off-by: Kangjie Lu <kjlu@umn.edu>
^^^
here
> 
> ---
> V2: simplified the patch as suggested by
> Richard Genoud <richard.genoud@gmail.com>
> ---
>  drivers/tty/serial/atmel_serial.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
> index 05147fe24343..41b728d223d1 100644
> --- a/drivers/tty/serial/atmel_serial.c
> +++ b/drivers/tty/serial/atmel_serial.c
> @@ -1288,6 +1288,10 @@ static int atmel_prepare_rx_dma(struct uart_port *port)
>  					 sg_dma_len(&atmel_port->sg_rx)/2,
>  					 DMA_DEV_TO_MEM,
>  					 DMA_PREP_INTERRUPT);
> +	if (!desc) {
> +		dev_err(port->dev, "Preparing DMA cyclic failed\n");
> +		goto chan_err;
> +	}
>  	desc->callback = atmel_complete_rx_dma;
>  	desc->callback_param = port;
>  	atmel_port->desc_rx = desc;
> 

Thanks !

Richard.

^ permalink raw reply

* Re: [PATCH v2 39/45] drivers: tty: serial: efm32-uart: use devm_* functions
From: Uwe Kleine-König @ 2019-03-15  7:46 UTC (permalink / raw)
  To: Enrico Weigelt, metux IT consult
  Cc: linux-kernel, gregkh, eric, stefan.wahren, f.fainelli, rjui,
	sbranden, bcm-kernel-feedback-list, andriy.shevchenko, vz,
	matthias.bgg, yamada.masahiro, tklauser, richard.genoud, macro,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-40-git-send-email-info@metux.net>

Hello Enrico,

On Thu, Mar 14, 2019 at 11:34:09PM +0100, Enrico Weigelt, metux IT consult wrote:
> Use the safer devm versions of memory mapping functions.

In which aspect is devm_ioremap safer than ioremap?

The only upside I'm aware of is that the memory is automatically
unmapped on device unbind. But we don't benefit from this because an
UART port is "released" before the device is unbound and we call
devm_iounmap() then anyhow. So this patch just adds a memory allocation
(side note: on a platform that is quite tight on RAM) with no added
benefit.

I didn't look at the other patches in this series, but assuming that
they are similar in spirit, the same question applies for them.

Do I miss anything?

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

^ permalink raw reply

* [PATCH v2] tty: atmel_serial: fix a NULL pointer dereference
From: Kangjie Lu @ 2019-03-15  7:27 UTC (permalink / raw)
  To: kjlu
  Cc: Richard Genoud, Greg Kroah-Hartman, Jiri Slaby, Nicolas Ferre,
	Alexandre Belloni, Ludovic Desroches, linux-serial,
	linux-arm-kernel, linux-kernel
In-Reply-To: <CAMuHMdX=XwxVFb1eLupmyHBOMBGzB+=RXxcUCH9D-J1+YKiq5w@mail.gmail.com>

Fixes: 34df42f59a60 ("serial: at91: add rx dma support")

In case dmaengine_prep_dma_cyclic fails, the fix returns a proper
error code to avoid NULL pointer dereference.

Signed-off-by: Kangjie Lu <kjlu@umn.edu>

---
V2: simplified the patch as suggested by
Richard Genoud <richard.genoud@gmail.com>
---
 drivers/tty/serial/atmel_serial.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index 05147fe24343..41b728d223d1 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -1288,6 +1288,10 @@ static int atmel_prepare_rx_dma(struct uart_port *port)
 					 sg_dma_len(&atmel_port->sg_rx)/2,
 					 DMA_DEV_TO_MEM,
 					 DMA_PREP_INTERRUPT);
+	if (!desc) {
+		dev_err(port->dev, "Preparing DMA cyclic failed\n");
+		goto chan_err;
+	}
 	desc->callback = atmel_complete_rx_dma;
 	desc->callback_param = port;
 	atmel_port->desc_rx = desc;
-- 
2.17.1

^ permalink raw reply related

* [PATCH v2] tty: atmel_serial: fix a NULL pointer dereference
From: Kangjie Lu @ 2019-03-15  7:21 UTC (permalink / raw)
  To: kjlu
  Cc: Alexandre Belloni, Richard Genoud, Greg Kroah-Hartman, pakki001,
	linux-kernel, Ludovic Desroches, linux-serial, Jiri Slaby,
	linux-arm-kernel
In-Reply-To: <4369f8eb-e8d2-1f78-6fd5-f878ffbdee90@sorico.fr>

Fixes: 34df42f59a60 ("serial: at91: add rx dma support")

In case dmaengine_prep_dma_cyclic fails, the fix returns a proper
error code to avoid NULL pointer dereference.

Signed-off-by: Kangjie Lu <kjlu@umn.edu>

---
V2: simplified the patch as suggested by
Richard Genoud <richard.genoud@gmail.com>
---
 drivers/tty/serial/atmel_serial.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index 05147fe24343..41b728d223d1 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -1288,6 +1288,10 @@ static int atmel_prepare_rx_dma(struct uart_port *port)
 					 sg_dma_len(&atmel_port->sg_rx)/2,
 					 DMA_DEV_TO_MEM,
 					 DMA_PREP_INTERRUPT);
+	if (!desc) {
+		dev_err(port->dev, "Preparing DMA cyclic failed\n");
+		goto chan_err;
+	}
 	desc->callback = atmel_complete_rx_dma;
 	desc->callback_param = port;
 	atmel_port->desc_rx = desc;
-- 
2.17.1

^ permalink raw reply related

* Re: [PATCH] tty: 8250: fix a missing check for pci_ioremap_bar
From: Jiri Slaby @ 2019-03-15  5:43 UTC (permalink / raw)
  To: Kangjie Lu; +Cc: Greg Kroah-Hartman, pakki001, linux-kernel, linux-serial
In-Reply-To: <20190315045617.7616-1-kjlu@umn.edu>

On 15. 03. 19, 5:56, Kangjie Lu wrote:
> pci_ioremap_bar could fail. The fix captures the failure and
> pass an error code upstream. This can avoid potential NULL
> pointer dereferences in the future.
> 
> Signed-off-by: Kangjie Lu <kjlu@umn.edu>
> ---
>  drivers/tty/serial/8250/8250_lpss.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/tty/serial/8250/8250_lpss.c b/drivers/tty/serial/8250/8250_lpss.c
> index 98dbc796353f..e95332d8b35e 100644
> --- a/drivers/tty/serial/8250/8250_lpss.c
> +++ b/drivers/tty/serial/8250/8250_lpss.c
...
> @@ -203,7 +207,7 @@ static void qrk_serial_exit_dma(struct lpss8250 *lpss)
>  	dw_dma_remove(&lpss->dma_chip);
>  }
>  #else	/* CONFIG_SERIAL_8250_DMA */
> -static void qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port) {}
> +static int qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port) {}

So you have to return something here now.

>  static void qrk_serial_exit_dma(struct lpss8250 *lpss) {}
>  #endif	/* !CONFIG_SERIAL_8250_DMA */
>  

regards,
-- 
js
suse labs

^ permalink raw reply

* [PATCH] tty: 8250: fix a missing check for pci_ioremap_bar
From: Kangjie Lu @ 2019-03-15  4:56 UTC (permalink / raw)
  To: kjlu; +Cc: pakki001, Greg Kroah-Hartman, Jiri Slaby, linux-serial,
	linux-kernel

pci_ioremap_bar could fail. The fix captures the failure and
pass an error code upstream. This can avoid potential NULL
pointer dereferences in the future.

Signed-off-by: Kangjie Lu <kjlu@umn.edu>
---
 drivers/tty/serial/8250/8250_lpss.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_lpss.c b/drivers/tty/serial/8250/8250_lpss.c
index 98dbc796353f..e95332d8b35e 100644
--- a/drivers/tty/serial/8250/8250_lpss.c
+++ b/drivers/tty/serial/8250/8250_lpss.c
@@ -162,7 +162,7 @@ static const struct dw_dma_platform_data qrk_serial_dma_pdata = {
 	.multi_block = {0},
 };
 
-static void qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port)
+static int qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port)
 {
 	struct uart_8250_dma *dma = &lpss->dma;
 	struct dw_dma_chip *chip = &lpss->dma_chip;
@@ -173,12 +173,14 @@ static void qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port)
 	chip->dev = &pdev->dev;
 	chip->irq = pci_irq_vector(pdev, 0);
 	chip->regs = pci_ioremap_bar(pdev, 1);
+	if (!chip->regs)
+		return -EIO;
 	chip->pdata = &qrk_serial_dma_pdata;
 
 	/* Falling back to PIO mode if DMA probing fails */
 	ret = dw_dma_probe(chip);
 	if (ret)
-		return;
+		return ret;
 
 	pci_try_set_mwi(pdev);
 
@@ -192,6 +194,8 @@ static void qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port)
 	param->hs_polarity = true;
 
 	lpss->dma_maxburst = 8;
+
+	return 0;
 }
 
 static void qrk_serial_exit_dma(struct lpss8250 *lpss)
@@ -203,7 +207,7 @@ static void qrk_serial_exit_dma(struct lpss8250 *lpss)
 	dw_dma_remove(&lpss->dma_chip);
 }
 #else	/* CONFIG_SERIAL_8250_DMA */
-static void qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port) {}
+static int qrk_serial_setup_dma(struct lpss8250 *lpss, struct uart_port *port) {}
 static void qrk_serial_exit_dma(struct lpss8250 *lpss) {}
 #endif	/* !CONFIG_SERIAL_8250_DMA */
 
@@ -220,8 +224,7 @@ static int qrk_serial_setup(struct lpss8250 *lpss, struct uart_port *port)
 
 	port->irq = pci_irq_vector(pdev, 0);
 
-	qrk_serial_setup_dma(lpss, port);
-	return 0;
+	return qrk_serial_setup_dma(lpss, port);
 }
 
 static void qrk_serial_exit(struct lpss8250 *lpss)
-- 
2.17.1

^ permalink raw reply related

* tty: uartlite: GP fault when calling tty_unregister_driver()
From: Randy Dunlap @ 2019-03-15  4:49 UTC (permalink / raw)
  To: LKML; +Cc: Peter Korsgaard, linux-serial

This is on v5.0-11053-gebc551f2b8f9 on x86_64. (March 12, 2019)
Just load uartlite module and then unload it.


[   75.334373] calling  ulite_init+0x0/0x1000 [uartlite] @ 1655
[   75.334634] initcall ulite_init+0x0/0x1000 [uartlite] returned 0 after 223 usecs
[   80.145544] kasan: CONFIG_KASAN_INLINE enabled
[   80.145578] kasan: GPF could be caused by NULL-ptr deref or user memory access
[   80.145614] general protection fault: 0000 [#1] PREEMPT SMP KASAN PTI
[   80.145634] CPU: 3 PID: 1658 Comm: rmmod Not tainted 5.0.0mod #1
[   80.145651] Hardware name: TOSHIBA PORTEGE R835/Portable PC, BIOS Version 4.10   01/08/2013
[   80.145677] RIP: 0010:tty_unregister_driver+0x25/0x1d0
[   80.145694] Code: 00 00 00 00 90 55 48 b8 00 00 00 00 00 fc ff df 48 89 e5 41 55 41 54 53 48 89 fb 48 83 c7 34 48 89 fa 48 c1 ea 03 48 83 ec 08 <0f> b6 14 02 48 89 f8 83 e0 07 83 c0 03 38 d0 7c 08 84 d2 0f 85 5e
[   80.145728] RSP: 0018:ffff8880a41ffda0 EFLAGS: 00010286
[   80.145744] RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 1ffffffff83a9a7b
[   80.145761] RDX: 0000000000000006 RSI: 0000000000000004 RDI: 0000000000000034
[   80.145778] RBP: ffff8880a41ffdc0 R08: ffffed101483ff9f R09: ffffed101483ff9f
[   80.145796] R10: 0000000000000001 R11: ffffed101483ff9f R12: ffffffffc1d4e040
[   80.145814] R13: ffff8880a41ffef0 R14: 0000000000000800 R15: ffffffffc1d4d3a0
[   80.145832] FS:  00007fe6d6029b80(0000) GS:ffff88811f400000(0000) knlGS:0000000000000000
[   80.145851] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   80.145867] CR2: 000055e9112790b8 CR3: 00000000a3742006 CR4: 00000000000606e0
[   80.145884] Call Trace:
[   80.145903]  uart_unregister_driver+0x43/0x1b0
[   80.145924]  ulite_exit+0x1c/0x25 [uartlite]
[   80.145941]  __x64_sys_delete_module+0x329/0x490
[   80.145958]  ? __ia32_sys_delete_module+0x490/0x490
[   80.145976]  ? blkcg_exit_queue+0x20/0x20
[   80.145991]  ? _raw_spin_unlock_irq+0x22/0x40
[   80.146014]  do_syscall_64+0xaa/0x310
[   80.146028]  ? prepare_exit_to_usermode+0x8b/0x150
[   80.146046]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
[   80.146062] RIP: 0033:0x7fe6d5717f77
[   80.146075] Code: 73 01 c3 48 8b 0d 21 af 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 b8 b0 00 00 00 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d f1 ae 2b 00 f7 d8 64 89 01 48
[   80.146111] RSP: 002b:00007fffdcc101b8 EFLAGS: 00000206 ORIG_RAX: 00000000000000b0
[   80.146130] RAX: ffffffffffffffda RBX: 00007fffdcc10218 RCX: 00007fe6d5717f77
[   80.146147] RDX: 000000000000000a RSI: 0000000000000800 RDI: 000055e91126e7d8
[   80.146164] RBP: 000055e91126e770 R08: 00007fffdcc0f131 R09: 0000000000000000
[   80.146181] R10: 00007fe6d57871c0 R11: 0000000000000206 R12: 00007fffdcc103e0
[   80.146199] R13: 00007fffdcc1275b R14: 000055e91126e260 R15: 000055e91126e770
[   80.146230] Modules linked in: uartlite(-) ctr ccm af_packet xt_tcpudp ip6t_rpfilter ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_conntrack ip_set nfnetlink ebtable_nat ebtable_broute bridge stp llc ip6table_nat ip6table_mangle ip6table_raw ip6table_security iptable_nat nf_nat nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 iptable_mangle iptable_raw iptable_security ebtable_filter ebtables ip6table_filter ip6_tables iptable_filter ip_tables x_tables bpfilter btrfs coretemp hwmon msr xor zstd_compress intel_rapl raid6_pq x86_pkg_temp_thermal hid_generic intel_powerclamp libcrc32c uvcvideo kvm_intel zstd_decompress usbmouse iTCO_wdt usbkbd kvm iTCO_vendor_support usbhid videobuf2_vmalloc videobuf2_memops hid videobuf2_v4l2 mei_hdcp videobuf2_common videodev arc4 iwldvm irqbypass media snd_hda_codec_hdmi mac80211 crct10dif_pclmul crc32_pclmul crc32c_intel ghash_clmulni_intel snd_hda_codec_realtek snd_hda_codec_generic ledtrig_audio snd_hda_intel iwlwifi snd_hda_codec aesni_intel
[   80.146319]  snd_hda_core aes_x86_64 crypto_simd snd_hwdep cryptd snd_pcm glue_helper sdhci_pci cqhci cfg80211 snd_timer intel_cstate intel_uncore uio_pdrv_genirq sdhci uio toshiba_acpi sparse_keymap sr_mod wmi cdrom mmc_core snd joydev pcspkr input_leds soundcore rfkill mousedev e1000e led_class intel_rapl_perf serio_raw industrialio rtc_cmos evdev mei_me mac_hid pcc_cpufreq thermal lpc_ich toshiba_haps mei battery ac sg dm_multipath dm_mod scsi_dh_rdac scsi_dh_emc scsi_dh_alua autofs4
[   80.146617] ---[ end trace e7f9f1d70ea2ceb9 ]---
[   80.146636] RIP: 0010:tty_unregister_driver+0x25/0x1d0
[   80.146657] Code: 00 00 00 00 90 55 48 b8 00 00 00 00 00 fc ff df 48 89 e5 41 55 41 54 53 48 89 fb 48 83 c7 34 48 89 fa 48 c1 ea 03 48 83 ec 08 <0f> b6 14 02 48 89 f8 83 e0 07 83 c0 03 38 d0 7c 08 84 d2 0f 85 5e
[   80.146702] RSP: 0018:ffff8880a41ffda0 EFLAGS: 00010286
[   80.146730] RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 1ffffffff83a9a7b
[   80.146750] RDX: 0000000000000006 RSI: 0000000000000004 RDI: 0000000000000034
[   80.146770] RBP: ffff8880a41ffdc0 R08: ffffed101483ff9f R09: ffffed101483ff9f
[   80.146790] R10: 0000000000000001 R11: ffffed101483ff9f R12: ffffffffc1d4e040
[   80.146809] R13: ffff8880a41ffef0 R14: 0000000000000800 R15: ffffffffc1d4d3a0
[   80.146830] FS:  00007fe6d6029b80(0000) GS:ffff88811f400000(0000) knlGS:0000000000000000
[   80.146850] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   80.146872] CR2: 000055e9112790b8 CR3: 00000000a3742006 CR4: 00000000000606e0



-- 
~Randy

^ permalink raw reply

* Re: [PATCH v2 10/45] drivers: tty: serial: zs: use devm_* functions
From: Greg KH @ 2019-03-14 22:52 UTC (permalink / raw)
  To: Enrico Weigelt, metux IT consult
  Cc: linux-kernel, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-11-git-send-email-info@metux.net>

On Thu, Mar 14, 2019 at 11:33:40PM +0100, Enrico Weigelt, metux IT consult wrote:
> Use the safer devm versions of memory mapping functions.

What is "safer" about them?

> 
> Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
> ---
>  drivers/tty/serial/zs.c | 16 ++++++++++------
>  1 file changed, 10 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/tty/serial/zs.c b/drivers/tty/serial/zs.c
> index b03d3e4..0b1ec2f 100644
> --- a/drivers/tty/serial/zs.c
> +++ b/drivers/tty/serial/zs.c
> @@ -984,16 +984,17 @@ static const char *zs_type(struct uart_port *uport)
>  
>  static void zs_release_port(struct uart_port *uport)
>  {
> -	iounmap(uport->membase);
> +	devm_iounmap(uport->dev, uport->membase);
>  	uport->membase = 0;
> -	release_mem_region(uport->mapbase, ZS_CHAN_IO_SIZE);
> +	devm_release_mem_region(uport->dev, uport->mapbase, ZS_CHAN_IO_SIZE);

Isn't the whole goal of the devm* functions such that you are not
required to call "release" on them?

If so, are you sure this patchset is correct?

And also, why make the change, you aren't changing any functionality for
these old drivers at all from what I can tell (for the devm calls).
What am I missing here?

thanks,

greg k-h

^ permalink raw reply

* [PATCH v2 45/45] drivers: tty: serial: mux: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/mux.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/mux.c b/drivers/tty/serial/mux.c
index 00ce31e..cd08f0f 100644
--- a/drivers/tty/serial/mux.c
+++ b/drivers/tty/serial/mux.c
@@ -456,8 +456,9 @@ static int __init mux_probe(struct parisc_device *dev)
 	printk(KERN_INFO "Serial mux driver (%d ports) Revision: 0.6\n", port_count);
 
 	dev_set_drvdata(&dev->dev, (void *)(long)port_count);
-	request_mem_region(dev->hpa.start + MUX_OFFSET,
-                           port_count * MUX_LINE_OFFSET, "Mux");
+	devm_request_mem_region(&dev->dev,
+				dev->hpa.start + MUX_OFFSET,
+				port_count * MUX_LINE_OFFSET, "Mux");
 
 	if(!port_cnt) {
 		mux_driver.cons = MUX_CONSOLE;
@@ -474,7 +475,9 @@ static int __init mux_probe(struct parisc_device *dev)
 		port->iobase	= 0;
 		port->mapbase	= dev->hpa.start + MUX_OFFSET +
 						(i * MUX_LINE_OFFSET);
-		port->membase	= ioremap_nocache(port->mapbase, MUX_LINE_OFFSET);
+		port->membase	= devm_ioremap_nocache(port->dev,
+						       port->mapbase,
+						       MUX_LINE_OFFSET);
 		port->iotype	= UPIO_MEM;
 		port->type	= PORT_MUX;
 		port->irq	= 0;
@@ -517,10 +520,12 @@ static int __exit mux_remove(struct parisc_device *dev)
 
 		uart_remove_one_port(&mux_driver, port);
 		if(port->membase)
-			iounmap(port->membase);
+			devm_iounmap(port->dev, port->membase);
 	}
 
-	release_mem_region(dev->hpa.start + MUX_OFFSET, port_count * MUX_LINE_OFFSET);
+	devm_release_mem_region(&dev->dev,
+				dev->hpa.start + MUX_OFFSET,
+				port_count * MUX_LINE_OFFSET);
 	return 0;
 }
 
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 44/45] drivers: tty: serial: pnx8xxx_uart: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/pnx8xxx_uart.c | 9 ++-------
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/drivers/tty/serial/pnx8xxx_uart.c b/drivers/tty/serial/pnx8xxx_uart.c
index 223a949..3951226 100644
--- a/drivers/tty/serial/pnx8xxx_uart.c
+++ b/drivers/tty/serial/pnx8xxx_uart.c
@@ -568,10 +568,7 @@ static const char *pnx8xxx_type(struct uart_port *port)
  */
 static void pnx8xxx_release_port(struct uart_port *port)
 {
-	struct pnx8xxx_port *sport =
-		container_of(port, struct pnx8xxx_port, port);
-
-	release_mem_region(sport->port.mapbase, UART_PORT_SIZE);
+	devm_release_mem_region(port->dev, port->mapbase, UART_PORT_SIZE);
 }
 
 /*
@@ -579,9 +576,7 @@ static void pnx8xxx_release_port(struct uart_port *port)
  */
 static int pnx8xxx_request_port(struct uart_port *port)
 {
-	struct pnx8xxx_port *sport =
-		container_of(port, struct pnx8xxx_port, port);
-	return request_mem_region(sport->port.mapbase, UART_PORT_SIZE,
+	return devm_request_mem_region(port->dev, port->mapbase, UART_PORT_SIZE,
 			"pnx8xxx-uart") != NULL ? 0 : -EBUSY;
 }
 
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 43/45] drivers: tty: serial: pmac_zilog: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/pmac_zilog.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/tty/serial/pmac_zilog.c b/drivers/tty/serial/pmac_zilog.c
index bcb5bf7..bce19b0 100644
--- a/drivers/tty/serial/pmac_zilog.c
+++ b/drivers/tty/serial/pmac_zilog.c
@@ -1411,7 +1411,7 @@ static int __init pmz_init_port(struct uart_pmac_port *uap)
 	if (of_address_to_resource(np, 0, &r_ports))
 		return -ENODEV;
 	uap->port.mapbase = r_ports.start;
-	uap->port.membase = ioremap(uap->port.mapbase, 0x1000);
+	uap->port.membase = devm_ioremap(uap->port->dev, uap->port.mapbase, 0x1000);
 
 	uap->control_reg = uap->port.membase;
 	uap->data_reg = uap->control_reg + 0x10;
@@ -1428,14 +1428,16 @@ static int __init pmz_init_port(struct uart_pmac_port *uap)
 	memset(&r_rxdma, 0, sizeof(struct resource));
 #endif	
 	if (ZS_HAS_DMA(uap)) {
-		uap->tx_dma_regs = ioremap(r_txdma.start, 0x100);
+		uap->tx_dma_regs = devm_ioremap(uap->port.dev,
+					        r_txdma.start, 0x100);
 		if (uap->tx_dma_regs == NULL) {	
 			uap->flags &= ~PMACZILOG_FLAG_HAS_DMA;
 			goto no_dma;
 		}
-		uap->rx_dma_regs = ioremap(r_rxdma.start, 0x100);
+		uap->rx_dma_regs = devm_ioremap(uap->port.dev,
+					        r_rxdma.start, 0x100);
 		if (uap->rx_dma_regs == NULL) {	
-			iounmap(uap->tx_dma_regs);
+			devm_iounmap(uap->port.dev, uap->tx_dma_regs);
 			uap->tx_dma_regs = NULL;
 			uap->flags &= ~PMACZILOG_FLAG_HAS_DMA;
 			goto no_dma;
@@ -1530,9 +1532,9 @@ static void pmz_dispose_port(struct uart_pmac_port *uap)
 	struct device_node *np;
 
 	np = uap->node;
-	iounmap(uap->rx_dma_regs);
-	iounmap(uap->tx_dma_regs);
-	iounmap(uap->control_reg);
+	devm_iounmap(uap->port.dev, uap->rx_dma_regs);
+	devm_iounmap(uap->port.dev, uap->tx_dma_regs);
+	devm_iounmap(uap->port.dev, uap->control_reg);
 	uap->node = NULL;
 	of_node_put(np);
 	memset(uap, 0, sizeof(struct uart_pmac_port));
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 42/45] drivers: tty: serial: sa1100: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/sa1100.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/sa1100.c b/drivers/tty/serial/sa1100.c
index a399772b..3aa20a2 100644
--- a/drivers/tty/serial/sa1100.c
+++ b/drivers/tty/serial/sa1100.c
@@ -522,7 +522,7 @@ static void sa1100_release_port(struct uart_port *port)
 	struct sa1100_port *sport =
 		container_of(port, struct sa1100_port, port);
 
-	release_mem_region(sport->port.mapbase, UART_PORT_SIZE);
+	devm_release_mem_region(port->dev, sport->port.mapbase, UART_PORT_SIZE);
 }
 
 /*
@@ -533,7 +533,7 @@ static int sa1100_request_port(struct uart_port *port)
 	struct sa1100_port *sport =
 		container_of(port, struct sa1100_port, port);
 
-	return request_mem_region(sport->port.mapbase, UART_PORT_SIZE,
+	return devm_request_mem_region(port->dev, port->mapbase, UART_PORT_SIZE,
 			"sa11x0-uart") != NULL ? 0 : -EBUSY;
 }
 
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 41/45] drivers: tty: serial: timuart: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/men_z135_uart.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/men_z135_uart.c b/drivers/tty/serial/men_z135_uart.c
index ef89534..349f70e 100644
--- a/drivers/tty/serial/men_z135_uart.c
+++ b/drivers/tty/serial/men_z135_uart.c
@@ -732,7 +732,7 @@ static void men_z135_release_port(struct uart_port *port)
 {
 	struct men_z135_port *uart = to_men_z135(port);
 
-	iounmap(port->membase);
+	devm_iounmap(port->dev, port->membase);
 	port->membase = NULL;
 
 	mcb_release_mem(uart->mem);
@@ -751,7 +751,7 @@ static int men_z135_request_port(struct uart_port *port)
 	port->mapbase = mem->start;
 	uart->mem = mem;
 
-	port->membase = ioremap(mem->start, resource_size(mem));
+	port->membase = devm_ioremap_resource(port->dev, mem);
 	if (port->membase == NULL) {
 		mcb_release_mem(mem);
 		return -ENOMEM;
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 40/45] drivers: tty: serial: mpc52xx_uart: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/mpc52xx_uart.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/tty/serial/mpc52xx_uart.c b/drivers/tty/serial/mpc52xx_uart.c
index 3a75ee0..3e74e44 100644
--- a/drivers/tty/serial/mpc52xx_uart.c
+++ b/drivers/tty/serial/mpc52xx_uart.c
@@ -1276,11 +1276,13 @@ static u8 mpc5125_psc_get_mr1(struct uart_port *port)
 
 	/* remapped by us ? */
 	if (port->flags & UPF_IOREMAP) {
-		iounmap(port->membase);
+		devm_iounmap(port->dev, port->membase);
 		port->membase = NULL;
 	}
 
-	release_mem_region(port->mapbase, sizeof(struct mpc52xx_psc));
+	devm_release_mem_region(port->dev,
+				port->mapbase,
+				sizeof(struct mpc52xx_psc));
 }
 
 static int
@@ -1289,13 +1291,14 @@ static u8 mpc5125_psc_get_mr1(struct uart_port *port)
 	int err;
 
 	if (port->flags & UPF_IOREMAP) /* Need to remap ? */
-		port->membase = ioremap(port->mapbase,
+		port->membase = devm_ioremap(port->dev, port->mapbase,
 					sizeof(struct mpc52xx_psc));
 
 	if (!port->membase)
 		return -EINVAL;
 
-	err = request_mem_region(port->mapbase, sizeof(struct mpc52xx_psc),
+	err = devm_request_mem_region(port->mapbase,
+			sizeof(struct mpc52xx_psc),
 			"mpc52xx_psc_uart") != NULL ? 0 : -EBUSY;
 
 	if (err)
@@ -1310,10 +1313,12 @@ static u8 mpc5125_psc_get_mr1(struct uart_port *port)
 	return 0;
 
 out_mapregion:
-	release_mem_region(port->mapbase, sizeof(struct mpc52xx_psc));
+	devm_release_mem_region(port->dev,
+				port->mapbase,
+				sizeof(struct mpc52xx_psc));
 out_membase:
 	if (port->flags & UPF_IOREMAP) {
-		iounmap(port->membase);
+		devm_iounmap(port->dev, port->membase);
 		port->membase = NULL;
 	}
 	return err;
@@ -1653,7 +1658,9 @@ static u8 mpc5125_psc_get_mr1(struct uart_port *port)
 	port->uartclk = uartclk;
 	port->ops	= &mpc52xx_uart_ops;
 	port->mapbase = res.start;
-	port->membase = ioremap(res.start, sizeof(struct mpc52xx_psc));
+	port->membase = devm_ioremap(port->dev,
+				     res.start,
+				     sizeof(struct mpc52xx_psc));
 	port->irq = irq_of_parse_and_map(np, 0);
 
 	if (port->membase == NULL)
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 39/45] drivers: tty: serial: efm32-uart: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/efm32-uart.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/efm32-uart.c b/drivers/tty/serial/efm32-uart.c
index d6b5e54..a79cadc 100644
--- a/drivers/tty/serial/efm32-uart.c
+++ b/drivers/tty/serial/efm32-uart.c
@@ -437,7 +437,7 @@ static void efm32_uart_release_port(struct uart_port *port)
 
 	clk_unprepare(efm_port->clk);
 	clk_put(efm_port->clk);
-	iounmap(port->membase);
+	devm_iounmap(port->dev, port->membase);
 }
 
 static int efm32_uart_request_port(struct uart_port *port)
@@ -445,7 +445,7 @@ static int efm32_uart_request_port(struct uart_port *port)
 	struct efm32_uart_port *efm_port = to_efm_port(port);
 	int ret;
 
-	port->membase = ioremap(port->mapbase, 60);
+	port->membase = devm_ioremap(port->dev, port->mapbase, 60);
 	if (!efm_port->port.membase) {
 		ret = -ENOMEM;
 		efm_debug(efm_port, "failed to remap\n");
@@ -464,7 +464,7 @@ static int efm32_uart_request_port(struct uart_port *port)
 		clk_put(efm_port->clk);
 err_clk_get:
 
-		iounmap(port->membase);
+		devm_iounmap(port->dev, port->membase);
 err_ioremap:
 		return ret;
 	}
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 38/45] drivers: tty: serial: samsung: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/samsung.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c
index a49cf15..e0bab87 100644
--- a/drivers/tty/serial/samsung.c
+++ b/drivers/tty/serial/samsung.c
@@ -1436,13 +1436,16 @@ static const char *s3c24xx_serial_type(struct uart_port *port)
 
 static void s3c24xx_serial_release_port(struct uart_port *port)
 {
-	release_mem_region(port->mapbase, MAP_SIZE);
+	devm_release_mem_region(port->dev, port->mapbase, MAP_SIZE);
 }
 
 static int s3c24xx_serial_request_port(struct uart_port *port)
 {
 	const char *name = s3c24xx_serial_portname(port);
-	return request_mem_region(port->mapbase, MAP_SIZE, name) ? 0 : -EBUSY;
+	return devm_request_mem_region(port->dev,
+				       port->mapbase,
+				       MAP_SIZE,
+				       name) ? 0 : -EBUSY;
 }
 
 static void s3c24xx_serial_config_port(struct uart_port *port, int flags)
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 37/45] drivers: tty: serial: apbuart: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/apbuart.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/apbuart.c b/drivers/tty/serial/apbuart.c
index 60cd133..5eaaee9 100644
--- a/drivers/tty/serial/apbuart.c
+++ b/drivers/tty/serial/apbuart.c
@@ -293,12 +293,15 @@ static const char *apbuart_type(struct uart_port *port)
 
 static void apbuart_release_port(struct uart_port *port)
 {
-	release_mem_region(port->mapbase, 0x100);
+	devm_release_mem_region(port->dev, port->mapbase, 0x100);
 }
 
 static int apbuart_request_port(struct uart_port *port)
 {
-	return request_mem_region(port->mapbase, 0x100, "grlib-apbuart")
+	return devm_request_mem_region(port->dev,
+				       port->mapbase,
+				       0x100,
+				       "grlib-apbuart")
 	    != NULL ? 0 : -EBUSY;
 	return 0;
 }
@@ -622,7 +625,9 @@ static int __init grlib_apbuart_configure(void)
 		port = &grlib_apbuart_ports[line];
 
 		port->mapbase = addr;
-		port->membase = ioremap(addr, sizeof(struct grlib_apbuart_regs_map));
+		port->membase = devm_ioremap(port->dev,
+					     addr,
+					     sizeof(struct grlib_apbuart_regs_map));
 		port->irq = 0;
 		port->iotype = UPIO_MEM;
 		port->ops = &grlib_apbuart_ops;
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 36/45] drivers: tty: serial: pic32_uart: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/pic32_uart.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/pic32_uart.c b/drivers/tty/serial/pic32_uart.c
index 0bdf168..b4f0b29 100644
--- a/drivers/tty/serial/pic32_uart.c
+++ b/drivers/tty/serial/pic32_uart.c
@@ -614,15 +614,19 @@ static int pic32_uart_request_port(struct uart_port *port)
 	if (unlikely(!res_mem))
 		return -EINVAL;
 
-	if (!request_mem_region(port->mapbase, resource_size(res_mem),
-				"pic32_uart_mem"))
+	if (!devm_request_mem_region(port->dev,
+				     port->mapbase,
+				     resource_size(res_mem),
+				     "pic32_uart_mem"))
 		return -EBUSY;
 
 	port->membase = devm_ioremap_nocache(port->dev, port->mapbase,
 						resource_size(res_mem));
 	if (!port->membase) {
 		dev_err(port->dev, "Unable to map registers\n");
-		release_mem_region(port->mapbase, resource_size(res_mem));
+		devm_release_mem_region(port->dev,
+					port->mapbase,
+					resource_size(res_mem));
 		return -ENOMEM;
 	}
 
@@ -641,7 +645,7 @@ static void pic32_uart_release_port(struct uart_port *port)
 		return;
 	res_size = resource_size(res_mem);
 
-	release_mem_region(port->mapbase, res_size);
+	devm_release_mem_region(port->dev, port->mapbase, res_size);
 }
 
 /* serial core request to do any port required auto-configuration */
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 35/45] drivers: tty: serial: lpc32xx_hs: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/lpc32xx_hs.c | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/lpc32xx_hs.c b/drivers/tty/serial/lpc32xx_hs.c
index f4e27d0..0bb86d7 100644
--- a/drivers/tty/serial/lpc32xx_hs.c
+++ b/drivers/tty/serial/lpc32xx_hs.c
@@ -575,11 +575,11 @@ static void serial_lpc32xx_release_port(struct uart_port *port)
 {
 	if ((port->iotype == UPIO_MEM32) && (port->mapbase)) {
 		if (port->flags & UPF_IOREMAP) {
-			iounmap(port->membase);
+			devm_iounmap(port->dev, port->membase);
 			port->membase = NULL;
 		}
 
-		release_mem_region(port->mapbase, SZ_4K);
+		devm_release_mem_region(port->dev, port->mapbase, SZ_4K);
 	}
 }
 
@@ -590,12 +590,19 @@ static int serial_lpc32xx_request_port(struct uart_port *port)
 	if ((port->iotype == UPIO_MEM32) && (port->mapbase)) {
 		ret = 0;
 
-		if (!request_mem_region(port->mapbase, SZ_4K, MODNAME))
+		if (!devm_request_mem_region(port->dev,
+					     port->mapbase,
+					     SZ_4K,
+					     MODNAME))
 			ret = -EBUSY;
 		else if (port->flags & UPF_IOREMAP) {
-			port->membase = ioremap(port->mapbase, SZ_4K);
+			port->membase = devm_ioremap(port->dev,
+						     port->mapbase,
+						     SZ_4K);
 			if (!port->membase) {
-				release_mem_region(port->mapbase, SZ_4K);
+				devm_release_mem_region(port->dev,
+							port->mapbase,
+							SZ_4K);
 				ret = -ENOMEM;
 			}
 		}
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 34/45] drivers: tty: serial: sb1250-duart: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/sb1250-duart.c | 42 +++++++++++++++++++++++++--------------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/drivers/tty/serial/sb1250-duart.c b/drivers/tty/serial/sb1250-duart.c
index 655961c..e77eef6 100644
--- a/drivers/tty/serial/sb1250-duart.c
+++ b/drivers/tty/serial/sb1250-duart.c
@@ -651,14 +651,18 @@ static void sbd_release_port(struct uart_port *uport)
 	struct sbd_port *sport = to_sport(uport);
 	struct sbd_duart *duart = sport->duart;
 
-	iounmap(sport->memctrl);
+	devm_iounmap(uport->dev, sport->memctrl);
 	sport->memctrl = NULL;
-	iounmap(uport->membase);
+	devm_iounmap(uport->dev, uport->membase);
 	uport->membase = NULL;
 
 	if(refcount_dec_and_test(&duart->map_guard))
-		release_mem_region(duart->mapctrl, DUART_CHANREG_SPACING);
-	release_mem_region(uport->mapbase, DUART_CHANREG_SPACING);
+		devm_release_mem_region(uport->dev,
+					duart->mapctrl,
+					DUART_CHANREG_SPACING);
+	devm_release_mem_region(uport->dev,
+				uport->mapbase,
+				DUART_CHANREG_SPACING);
 }
 
 static int sbd_map_port(struct uart_port *uport)
@@ -667,19 +671,21 @@ static int sbd_map_port(struct uart_port *uport)
 	struct sbd_duart *duart = sport->duart;
 
 	if (!uport->membase)
-		uport->membase = ioremap_nocache(uport->mapbase,
-						 DUART_CHANREG_SPACING);
+		uport->membase = devm_ioremap_nocache(uport->dev,
+						      uport->mapbase,
+						      DUART_CHANREG_SPACING);
 	if (!uport->membase) {
 		dev_err(uport->dev, "Cannot map MMIO (base)\n");
 		return -ENOMEM;
 	}
 
 	if (!sport->memctrl)
-		sport->memctrl = ioremap_nocache(duart->mapctrl,
-						 DUART_CHANREG_SPACING);
+		sport->memctrl = devm_ioremap_nocache(uport->dev,
+						      duart->mapctrl,
+						      DUART_CHANREG_SPACING);
 	if (!sport->memctrl) {
 		dev_err(uport->dev, "Cannot map MMIO (ctrl)\n");
-		iounmap(uport->membase);
+		devm_iounmap(uport->dev, uport->membase);
 		uport->membase = NULL;
 		return -ENOMEM;
 	}
@@ -693,15 +699,18 @@ static int sbd_request_port(struct uart_port *uport)
 	struct sbd_duart *duart = to_sport(uport)->duart;
 	int ret = 0;
 
-	if (!request_mem_region(uport->mapbase, DUART_CHANREG_SPACING,
+	if (!devm_request_mem_region(uport->dev,
+				uport->mapbase, DUART_CHANREG_SPACING,
 				"sb1250-duart")) {
 		printk(err);
 		return -EBUSY;
 	}
 	refcount_inc(&duart->map_guard);
 	if (refcount_read(&duart->map_guard) == 1) {
-		if (!request_mem_region(duart->mapctrl, DUART_CHANREG_SPACING,
-					"sb1250-duart")) {
+		if (!devm_request_mem_region(uport->dev,
+					     duart->mapctrl,
+					     DUART_CHANREG_SPACING,
+					     "sb1250-duart")) {
 			refcount_dec(&duart->map_guard);
 			printk(err);
 			ret = -EBUSY;
@@ -711,12 +720,15 @@ static int sbd_request_port(struct uart_port *uport)
 		ret = sbd_map_port(uport);
 		if (ret) {
 			if (refcount_dec_and_test(&duart->map_guard))
-				release_mem_region(duart->mapctrl,
-						   DUART_CHANREG_SPACING);
+				devm_release_mem_region(uport->dev,
+							duart->mapctrl,
+							DUART_CHANREG_SPACING);
 		}
 	}
 	if (ret) {
-		release_mem_region(uport->mapbase, DUART_CHANREG_SPACING);
+		devm_release_mem_region(uport->dev,
+					uport->mapbase,
+					DUART_CHANREG_SPACING);
 		return ret;
 	}
 	return 0;
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 33/45] drivers: tty: serial: sb1250-duart: use dev_err() instead of printk()
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Using dev_err() instead of printk() for more consistent output.
(prints device name, etc).

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/sb1250-duart.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/sb1250-duart.c b/drivers/tty/serial/sb1250-duart.c
index 329aced..655961c 100644
--- a/drivers/tty/serial/sb1250-duart.c
+++ b/drivers/tty/serial/sb1250-duart.c
@@ -663,7 +663,6 @@ static void sbd_release_port(struct uart_port *uport)
 
 static int sbd_map_port(struct uart_port *uport)
 {
-	const char *err = KERN_ERR "sbd: Cannot map MMIO\n";
 	struct sbd_port *sport = to_sport(uport);
 	struct sbd_duart *duart = sport->duart;
 
@@ -671,7 +670,7 @@ static int sbd_map_port(struct uart_port *uport)
 		uport->membase = ioremap_nocache(uport->mapbase,
 						 DUART_CHANREG_SPACING);
 	if (!uport->membase) {
-		printk(err);
+		dev_err(uport->dev, "Cannot map MMIO (base)\n");
 		return -ENOMEM;
 	}
 
@@ -679,7 +678,7 @@ static int sbd_map_port(struct uart_port *uport)
 		sport->memctrl = ioremap_nocache(duart->mapctrl,
 						 DUART_CHANREG_SPACING);
 	if (!sport->memctrl) {
-		printk(err);
+		dev_err(uport->dev, "Cannot map MMIO (ctrl)\n");
 		iounmap(uport->membase);
 		uport->membase = NULL;
 		return -ENOMEM;
-- 
1.9.1

^ permalink raw reply related

* [PATCH v2 32/45] drivers: tty: serial: atmel_serial: use devm_* functions
From: Enrico Weigelt, metux IT consult @ 2019-03-14 22:34 UTC (permalink / raw)
  To: linux-kernel
  Cc: gregkh, eric, stefan.wahren, f.fainelli, rjui, sbranden,
	bcm-kernel-feedback-list, andriy.shevchenko, vz, matthias.bgg,
	yamada.masahiro, tklauser, richard.genoud, macro, u.kleine-koenig,
	kernel, slemieux.tyco, andy.gross, david.brown, shawnguo, s.hauer,
	festevam, linux-imx, baohua, jacmet, linux-serial, linux-arm-msm,
	linuxppc-dev
In-Reply-To: <1552602855-26086-1-git-send-email-info@metux.net>

Use the safer devm versions of memory mapping functions.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
---
 drivers/tty/serial/atmel_serial.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c
index 05147fe..084f106 100644
--- a/drivers/tty/serial/atmel_serial.c
+++ b/drivers/tty/serial/atmel_serial.c
@@ -2389,10 +2389,10 @@ static void atmel_release_port(struct uart_port *port)
 	struct platform_device *mpdev = to_platform_device(port->dev->parent);
 	int size = resource_size(mpdev->resource);
 
-	release_mem_region(port->mapbase, size);
+	devm_release_mem_region(port->dev, port->mapbase, size);
 
 	if (port->flags & UPF_IOREMAP) {
-		iounmap(port->membase);
+		devm_iounmap(port->dev, port->membase);
 		port->membase = NULL;
 	}
 }
@@ -2405,13 +2405,16 @@ static int atmel_request_port(struct uart_port *port)
 	struct platform_device *mpdev = to_platform_device(port->dev->parent);
 	int size = resource_size(mpdev->resource);
 
-	if (!request_mem_region(port->mapbase, size, "atmel_serial"))
+	if (!devm_request_mem_region(port->dev,
+				     port->mapbase,
+				     size,
+				     "atmel_serial"))
 		return -EBUSY;
 
 	if (port->flags & UPF_IOREMAP) {
-		port->membase = ioremap(port->mapbase, size);
+		port->membase = devm_ioremap(port->dev, port->mapbase, size);
 		if (port->membase == NULL) {
-			release_mem_region(port->mapbase, size);
+			devm_release_mem_region(port->dev, port->mapbase, size);
 			return -ENOMEM;
 		}
 	}
-- 
1.9.1

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox