linux-serial.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] serial: imx: fix clk_prepare/unprepare usage
@ 2015-11-12  9:58 Marcus Folkesson
  2015-11-16 12:16 ` Uwe Kleine-König
  2015-11-16 12:49 ` Fabio Estevam
  0 siblings, 2 replies; 6+ messages in thread
From: Marcus Folkesson @ 2015-11-12  9:58 UTC (permalink / raw)
  To: Greg Kroah-Hartman, Jiri Slaby
  Cc: linux-serial, linux-kernel, Marcus Folkesson

clk_prepare/unprapare APIs are not allowed in atomic context, so
move prepare/unprepare to probe/remove and use clk_enable/disable
instead.

Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
---
 drivers/tty/serial/imx.c | 45 ++++++++++++++++++++++++++++-----------------
 1 file changed, 28 insertions(+), 17 deletions(-)

diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index fe3d41c..dcb4b6b 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -1106,12 +1106,12 @@ static int imx_startup(struct uart_port *port)
 	int retval, i;
 	unsigned long flags, temp;
 
-	retval = clk_prepare_enable(sport->clk_per);
+	retval = clk_enable(sport->clk_per);
 	if (retval)
 		return retval;
-	retval = clk_prepare_enable(sport->clk_ipg);
+	retval = clk_enable(sport->clk_ipg);
 	if (retval) {
-		clk_disable_unprepare(sport->clk_per);
+		clk_disable(sport->clk_per);
 		return retval;
 	}
 
@@ -1223,8 +1223,8 @@ static void imx_shutdown(struct uart_port *port)
 	writel(temp, sport->port.membase + UCR1);
 	spin_unlock_irqrestore(&sport->port.lock, flags);
 
-	clk_disable_unprepare(sport->clk_per);
-	clk_disable_unprepare(sport->clk_ipg);
+	clk_disable(sport->clk_per);
+	clk_disable(sport->clk_ipg);
 }
 
 static void imx_flush_buffer(struct uart_port *port)
@@ -1496,12 +1496,12 @@ static int imx_poll_init(struct uart_port *port)
 	unsigned long temp;
 	int retval;
 
-	retval = clk_prepare_enable(sport->clk_ipg);
+	retval = clk_enable(sport->clk_ipg);
 	if (retval)
 		return retval;
-	retval = clk_prepare_enable(sport->clk_per);
+	retval = clk_enable(sport->clk_per);
 	if (retval)
-		clk_disable_unprepare(sport->clk_ipg);
+		clk_disable(sport->clk_ipg);
 
 	imx_setup_ufcr(sport, 0);
 
@@ -1631,12 +1631,12 @@ imx_console_write(struct console *co, const char *s, unsigned int count)
 	int locked = 1;
 	int retval;
 
-	retval = clk_prepare_enable(sport->clk_per);
+	retval = clk_enable(sport->clk_per);
 	if (retval)
 		return;
-	retval = clk_prepare_enable(sport->clk_ipg);
+	retval = clk_enable(sport->clk_ipg);
 	if (retval) {
-		clk_disable_unprepare(sport->clk_per);
+		clk_disable(sport->clk_per);
 		return;
 	}
 
@@ -1675,8 +1675,8 @@ imx_console_write(struct console *co, const char *s, unsigned int count)
 	if (locked)
 		spin_unlock_irqrestore(&sport->port.lock, flags);
 
-	clk_disable_unprepare(sport->clk_ipg);
-	clk_disable_unprepare(sport->clk_per);
+	clk_disable(sport->clk_ipg);
+	clk_disable(sport->clk_per);
 }
 
 /*
@@ -1764,7 +1764,7 @@ imx_console_setup(struct console *co, char *options)
 		return -ENODEV;
 
 	/* For setting the registers, we only need to enable the ipg clock. */
-	retval = clk_prepare_enable(sport->clk_ipg);
+	retval = clk_enable(sport->clk_ipg);
 	if (retval)
 		goto error_console;
 
@@ -1777,7 +1777,7 @@ imx_console_setup(struct console *co, char *options)
 
 	retval = uart_set_options(&sport->port, co, baud, parity, bits, flow);
 
-	clk_disable_unprepare(sport->clk_ipg);
+	clk_disable(sport->clk_ipg);
 
 error_console:
 	return retval;
@@ -1915,18 +1915,27 @@ static int serial_imx_probe(struct platform_device *pdev)
 		dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret);
 		return ret;
 	}
+	ret = clk_prepare(sport->clk_ipg);
+	if (ret)
+		return ret;
 
 	sport->clk_per = devm_clk_get(&pdev->dev, "per");
 	if (IS_ERR(sport->clk_per)) {
 		ret = PTR_ERR(sport->clk_per);
 		dev_err(&pdev->dev, "failed to get per clk: %d\n", ret);
+		clk_unprepare(sport->clk_ipg);
+		return ret;
+	}
+	ret = clk_prepare(sport->clk_per);
+	if (ret) {
+		clk_unprepare(sport->clk_ipg);
 		return ret;
 	}
 
 	sport->port.uartclk = clk_get_rate(sport->clk_per);
 
 	/* For register access, we only need to enable the ipg clock. */
-	ret = clk_prepare_enable(sport->clk_ipg);
+	ret = clk_enable(sport->clk_ipg);
 	if (ret)
 		return ret;
 
@@ -1936,7 +1945,7 @@ static int serial_imx_probe(struct platform_device *pdev)
 		 UCR1_TXMPTYEN | UCR1_RTSDEN);
 	writel_relaxed(reg, sport->port.membase + UCR1);
 
-	clk_disable_unprepare(sport->clk_ipg);
+	clk_disable(sport->clk_ipg);
 
 	/*
 	 * Allocate the IRQ(s) i.MX1 has three interrupts whereas later
@@ -1969,6 +1978,8 @@ static int serial_imx_probe(struct platform_device *pdev)
 static int serial_imx_remove(struct platform_device *pdev)
 {
 	struct imx_port *sport = platform_get_drvdata(pdev);
+	clk_unprepare(sport->clk_ipg);
+	clk_unprepare(sport->clk_per);
 
 	return uart_remove_one_port(&imx_reg, &sport->port);
 }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] serial: imx: fix clk_prepare/unprepare usage
  2015-11-12  9:58 [PATCH] serial: imx: fix clk_prepare/unprepare usage Marcus Folkesson
@ 2015-11-16 12:16 ` Uwe Kleine-König
  2015-11-16 13:52   ` Marcus Folkesson
  2015-11-16 12:49 ` Fabio Estevam
  1 sibling, 1 reply; 6+ messages in thread
From: Uwe Kleine-König @ 2015-11-16 12:16 UTC (permalink / raw)
  To: Marcus Folkesson
  Cc: Greg Kroah-Hartman, Jiri Slaby, linux-serial, linux-kernel

On Thu, Nov 12, 2015 at 10:58:48AM +0100, Marcus Folkesson wrote:
> clk_prepare/unprapare APIs are not allowed in atomic context, so
> move prepare/unprepare to probe/remove and use clk_enable/disable
> instead.
> 
> Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>

Do you see a problem? I don't claim your patch is wrong, I just wonder
why nobody else noticed it earlier (including me).

Best regards
Uwe

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] serial: imx: fix clk_prepare/unprepare usage
  2015-11-12  9:58 [PATCH] serial: imx: fix clk_prepare/unprepare usage Marcus Folkesson
  2015-11-16 12:16 ` Uwe Kleine-König
@ 2015-11-16 12:49 ` Fabio Estevam
  2015-11-16 14:11   ` Marcus Folkesson
  1 sibling, 1 reply; 6+ messages in thread
From: Fabio Estevam @ 2015-11-16 12:49 UTC (permalink / raw)
  To: Marcus Folkesson
  Cc: Greg Kroah-Hartman, Jiri Slaby, linux-serial@vger.kernel.org,
	linux-kernel

On Thu, Nov 12, 2015 at 7:58 AM, Marcus Folkesson
<marcus.folkesson@gmail.com> wrote:
> clk_prepare/unprapare APIs are not allowed in atomic context, so
> move prepare/unprepare to probe/remove and use clk_enable/disable
> instead.
>
> Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>

Looks like you are using an older kernel.

Please check 0c727a42043f79db2.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] serial: imx: fix clk_prepare/unprepare usage
  2015-11-16 12:16 ` Uwe Kleine-König
@ 2015-11-16 13:52   ` Marcus Folkesson
  2015-11-16 14:11     ` Fabio Estevam
  0 siblings, 1 reply; 6+ messages in thread
From: Marcus Folkesson @ 2015-11-16 13:52 UTC (permalink / raw)
  To: Uwe Kleine-König
  Cc: Greg Kroah-Hartman, Jiri Slaby, linux-serial, linux-kernel

On Mon, Nov 16, 2015 at 01:16:25PM +0100, Uwe Kleine-König wrote:
> On Thu, Nov 12, 2015 at 10:58:48AM +0100, Marcus Folkesson wrote:
> > clk_prepare/unprapare APIs are not allowed in atomic context, so
> > move prepare/unprepare to probe/remove and use clk_enable/disable
> > instead.
> > 
> > Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
> 
> Do you see a problem? I don't claim your patch is wrong, I just wonder
> why nobody else noticed it earlier (including me).
> 
> Best regards
> Uwe
> 
> -- 
> Pengutronix e.K.                           | Uwe Kleine-König            |
> Industrial Linux Solutions                 | http://www.pengutronix.de/  |


Sorry, seems like the cover-letter was never sent.
The patch solves this issue:


[    6.374678] ------------[ cut here ]------------
[    6.374716] WARNING: CPU: 0 PID: 113 at kernel/locking/mutex.c:868 mutex_trylock+0x234/0x238()
[    6.374733] DEBUG_LOCKS_WARN_ON(in_interrupt())
[    6.374741] Modules linked in:
[    6.374762] CPU: 0 PID: 113 Comm: mmcqd/0 Not tainted 4.3.0-rc4-dirty #18
[    6.374772] Hardware name: Freescale i.MX6 Ultralite (Device Tree)
[    6.374785] Backtrace:
[    6.374822] [<80013fe8>] (dump_backtrace) from [<800141d8>] (show_stack+0x18/0x1c)
[    6.374856]  r6:80726734 r5:00000000 r4:8081bd80 r3:00000000
[    6.374890] [<800141c0>] (show_stack) from [<80235210>] (dump_stack+0x8c/0x9c)
[    6.374920] [<80235184>] (dump_stack) from [<800264a8>] (warn_slowpath_common+0x88/0xb8)
[    6.374940]  r5:00000364 r4:9dc3b978
[    6.374962] [<80026420>] (warn_slowpath_common) from [<80026510>] (warn_slowpath_fmt+0x38/0x40)
[    6.374999]  r8:8041270c r7:802b3f14 r6:810422ec r5:00000001 r4:80845494
[    6.375024] [<800264dc>] (warn_slowpath_fmt) from [<805f571c>] (mutex_trylock+0x234/0x238)
[    6.375042]  r3:8072674c r2:80724180
[    6.375072] [<805f54e8>] (mutex_trylock) from [<8041270c>] (clk_prepare_lock+0x18/0x100)
[    6.375113]  r9:00000037 r8:805fcc20 r7:802b3f14 r6:9e604e00 r5:00000037 r4:9e604e00
[    6.375138] [<804126f4>] (clk_prepare_lock) from [<80413cd4>] (clk_prepare+0x18/0x38)
[    6.375158]  r5:00000037 r4:9e604e00
[    6.375185] [<80413cbc>] (clk_prepare) from [<802b3f48>] (imx_console_write+0x34/0x230)
[    6.375203]  r4:80fffac8 r3:8105dd6c
[    6.375236] [<802b3f14>] (imx_console_write) from [<80073d8c>] (call_console_drivers.constprop.13+0x108/0x120)
[    6.375276]  r10:00000000 r9:00000037 r8:805fcc20 r7:802b3f14 r6:9dc3a000 r5:80fff5c0
[    6.375287]  r4:80827a9c
[    6.375317] [<80073c84>] (call_console_drivers.constprop.13) from [<80075088>] (console_unlock+0x4e0/0x5c4)
[    6.375356]  r10:00000006 r9:8103f4c0 r8:00000006 r7:00000000 r6:00000005 r5:00000037
[    6.375369]  r4:81002fb8
[    6.375397] [<80074ba8>] (console_unlock) from [<800753e4>] (vprintk_emit+0x278/0x5e0)
[    6.375437]  r10:00000027 r9:00000000 r8:00000000 r7:00000005 r6:80fff5c0 r5:00000027
[    6.375448]  r4:00000001
[    6.375474] [<8007516c>] (vprintk_emit) from [<800758b8>] (vprintk_default+0x2c/0x34)
[    6.375515]  r10:00001ffe r9:00001000 r8:00000008 r7:60000193 r6:80827e94 r5:80827e94
[    6.375526]  r4:80827cd8
[    6.375557] [<8007588c>] (vprintk_default) from [<800c3da4>] (printk+0x38/0x40)
[    6.375590] [<800c3d70>] (printk) from [<802b9b6c>] (credit_entropy_bits+0x2f4/0x300)
[    6.375624]  r3:00000000 r2:9e7df300 r1:80749354 r0:80749268
[    6.375659] [<802b9878>] (credit_entropy_bits) from [<802bac34>] (add_interrupt_randomness+0x16c/0x1e8)
[    6.375699]  r10:8084ebf7 r9:000000d5 r8:9dc3bcc0 r7:80827dd0 r6:ffff8d4c r5:80827d9c
[    6.375711]  r4:9ebd2650
[    6.375744] [<802baac8>] (add_interrupt_randomness) from [<80076ef8>] (handle_irq_event_percpu+0x98/0x138)
[    6.375783]  r9:9e4e6900 r8:000000d5 r7:00000080 r6:00000001 r5:00000001 r4:00000000
[    6.375814] [<80076e60>] (handle_irq_event_percpu) from [<80076fe0>] (handle_irq_event+0x48/0x6c)
[    6.375854]  r10:9dc3bdbc r9:a0805000 r8:9e406000 r7:00000001 r6:9e7e9680 r5:9e4e6960
[    6.375866]  r4:9e4e6900
[    6.375895] [<80076f98>] (handle_irq_event) from [<8007a00c>] (handle_fasteoi_irq+0xc0/0x194)
[    6.375926]  r6:8080dc88 r5:9e4e6960 r4:9e4e6900 r3:00000000
[    6.375950] [<80079f4c>] (handle_fasteoi_irq) from [<800764f8>] (generic_handle_irq+0x2c/0x3c)
[    6.375981]  r7:00000001 r6:00000000 r5:00000000 r4:808015fc
[    6.376009] [<800764cc>] (generic_handle_irq) from [<80076810>] (__handle_domain_irq+0x64/0xb8)
[    6.376037] [<800767ac>] (__handle_domain_irq) from [<800094c0>] (gic_handle_irq+0x50/0x90)
[    6.376077]  r8:9dc3bcc0 r7:a080400c r6:8081c000 r5:80808834 r4:a0804000 r3:9dc3bcc0
[    6.376101] [<80009470>] (gic_handle_irq) from [<80014eb8>] (__irq_svc+0x58/0x78)
[    6.376113] Exception stack(0x9dc3bcc0 to 0x9dc3bd08)
[    6.376139] bcc0: 00000001 00000001 00000000 9e7df300 9dc3bdc0 9dc3bdc0 00000002 9dc3a000
[    6.376162] bce0: 00000000 00000000 9dc3bdbc 9dc3bd24 00000000 9dc3bd10 80069a88 805f9a04
[    6.376174] bd00: 20000113 ffffffff
[    6.376214]  r9:00000000 r8:00000000 r7:9dc3bcf4 r6:ffffffff r5:20000113 r4:805f9a04
[    6.376248] [<805f99d4>] (_raw_spin_unlock_irq) from [<805f5260>] (wait_for_common+0xb8/0x148)
[    6.376266]  r4:7fffffff r3:9e7df300
[    6.376294] [<805f51a8>] (wait_for_common) from [<805f5308>] (wait_for_completion+0x18/0x1c)
[    6.376334]  r10:24590081 r9:00000000 r8:00000000 r7:9dc3bdbc r6:9dc3bdac r5:9e7fc800
[    6.376346]  r4:9dc3be14
[    6.376376] [<805f52f0>] (wait_for_completion) from [<803d07a4>] (mmc_wait_for_req_done+0x84/0x110)
[    6.376402] [<803d0720>] (mmc_wait_for_req_done) from [<803d08c4>] (mmc_wait_for_cmd+0x6c/0x8c)
[    6.376442]  r8:0000000d r7:00000015 r6:00000000 r5:9e7fc800 r4:9dc3be14 r3:00000000
[    6.376468] [<803d0858>] (mmc_wait_for_cmd) from [<803d1790>] (mmc_do_erase+0x1bc/0x31c)
[    6.376492]  r6:0000776f r5:80808100 r4:9dc2c800
[    6.376518] [<803d15d4>] (mmc_do_erase) from [<803d1a0c>] (mmc_erase+0x11c/0x1c0)
[    6.376557]  r10:24590081 r9:00086787 r8:00086780 r7:00000001 r6:00000008 r5:00000000
[    6.376570]  r4:9dc2c800
[    6.376599] [<803d18f0>] (mmc_erase) from [<803e0adc>] (mmc_blk_issue_rq+0x434/0x4d8)
[    6.376639]  r9:00000000 r8:9dc2bc00 r7:9dc2c800 r6:9dc471a0 r5:9dc2c800 r4:9dc2bc24
[    6.376667] [<803e06a8>] (mmc_blk_issue_rq) from [<803e20e0>] (mmc_queue_thread+0xb8/0x160)
[    6.376707]  r10:9dc471a0 r9:00000001 r8:24590081 r7:00000000 r6:9dc3a000 r5:9e71df90
[    6.376720]  r4:9dc2bc24
[    6.376748] [<803e2028>] (mmc_queue_thread) from [<80045c20>] (kthread+0xf0/0x104)
[    6.376789]  r10:00000000 r9:00000000 r8:00000000 r7:803e2028 r6:9dc2bc24 r5:00000000
[    6.376801]  r4:9dc09400
[    6.376829] [<80045b30>] (kthread) from [<8000faf0>] (ret_from_fork+0x14/0x24)
[    6.376860]  r7:00000000 r6:00000000 r5:80045b30 r4:9dc09400
[    6.376871] ---[ end trace 98f7b2a2644c179a ]---
[


Best regards
Marcus Folkesson

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] serial: imx: fix clk_prepare/unprepare usage
  2015-11-16 12:49 ` Fabio Estevam
@ 2015-11-16 14:11   ` Marcus Folkesson
  0 siblings, 0 replies; 6+ messages in thread
From: Marcus Folkesson @ 2015-11-16 14:11 UTC (permalink / raw)
  To: Fabio Estevam
  Cc: Greg Kroah-Hartman, Jiri Slaby, linux-serial@vger.kernel.org,
	linux-kernel

On Mon, Nov 16, 2015 at 10:49:01AM -0200, Fabio Estevam wrote:
> On Thu, Nov 12, 2015 at 7:58 AM, Marcus Folkesson
> <marcus.folkesson@gmail.com> wrote:
> > clk_prepare/unprapare APIs are not allowed in atomic context, so
> > move prepare/unprepare to probe/remove and use clk_enable/disable
> > instead.
> >
> > Signed-off-by: Marcus Folkesson <marcus.folkesson@gmail.com>
> 
> Looks like you are using an older kernel.
> 
> Please check 0c727a42043f79db2.


You are right, the bug does not seems to exist anymore.

Thanks

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] serial: imx: fix clk_prepare/unprepare usage
  2015-11-16 13:52   ` Marcus Folkesson
@ 2015-11-16 14:11     ` Fabio Estevam
  0 siblings, 0 replies; 6+ messages in thread
From: Fabio Estevam @ 2015-11-16 14:11 UTC (permalink / raw)
  To: Marcus Folkesson
  Cc: Uwe Kleine-König, Greg Kroah-Hartman, Jiri Slaby,
	linux-serial@vger.kernel.org, linux-kernel

On Mon, Nov 16, 2015 at 11:52 AM, Marcus Folkesson
<marcus.folkesson@gmail.com> wrote:

> Sorry, seems like the cover-letter was never sent.
> The patch solves this issue:
>
>
> [    6.374678] ------------[ cut here ]------------
> [    6.374716] WARNING: CPU: 0 PID: 113 at kernel/locking/mutex.c:868 mutex_trylock+0x234/0x238()
> [    6.374733] DEBUG_LOCKS_WARN_ON(in_interrupt())
> [    6.374741] Modules linked in:
> [    6.374762] CPU: 0 PID: 113 Comm: mmcqd/0 Not tainted 4.3.0-rc4-dirty #18

This is an old kernel :-) We fixed this in 4.3.0-rc5.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-11-16 14:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-12  9:58 [PATCH] serial: imx: fix clk_prepare/unprepare usage Marcus Folkesson
2015-11-16 12:16 ` Uwe Kleine-König
2015-11-16 13:52   ` Marcus Folkesson
2015-11-16 14:11     ` Fabio Estevam
2015-11-16 12:49 ` Fabio Estevam
2015-11-16 14:11   ` Marcus Folkesson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).