* [PATCH] tty: serial: altera_uart: Use platform_{get,set}_drvdata
From: Tobias Klauser @ 2012-08-20 13:56 UTC (permalink / raw)
To: Alan Cox, Greg Kroah-Hartman; +Cc: linux-serial
Use the wrapper functions, so we can directly pass a struct
platfrom_device.
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
---
drivers/tty/serial/altera_uart.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/tty/serial/altera_uart.c b/drivers/tty/serial/altera_uart.c
index 1f03309..15d80b9 100644
--- a/drivers/tty/serial/altera_uart.c
+++ b/drivers/tty/serial/altera_uart.c
@@ -591,7 +591,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
port->ops = &altera_uart_ops;
port->flags = UPF_BOOT_AUTOCONF;
- dev_set_drvdata(&pdev->dev, port);
+ platform_set_drvdata(pdev, port);
uart_add_one_port(&altera_uart_driver, port);
@@ -600,11 +600,11 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
static int __devexit altera_uart_remove(struct platform_device *pdev)
{
- struct uart_port *port = dev_get_drvdata(&pdev->dev);
+ struct uart_port *port = platform_get_drvdata(pdev);
if (port) {
uart_remove_one_port(&altera_uart_driver, port);
- dev_set_drvdata(&pdev->dev, NULL);
+ platform_set_drvdata(pdev, NULL);
port->mapbase = 0;
}
--
1.7.5.4
^ permalink raw reply related
* Re: restart callback not supposed to sleep?
From: Uwe Kleine-König @ 2012-08-20 9:47 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: Lothar Waßmann, linux-serial, linux-arm-kernel
In-Reply-To: <20120820094455.GS18957@n2100.arm.linux.org.uk>
Hello,
On Mon, Aug 20, 2012 at 10:44:55AM +0100, Russell King - ARM Linux wrote:
> On Mon, Aug 20, 2012 at 11:21:45AM +0200, Uwe Kleine-König wrote:
> > Just for the log: The restart works ok.
>
> Restart with a command or restart with sysrq ?
using sysrq. I get all these messages, but in the end the machine
restarts.
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: restart callback not supposed to sleep?
From: Russell King - ARM Linux @ 2012-08-20 9:44 UTC (permalink / raw)
To: Uwe Kleine-König; +Cc: Lothar Waßmann, linux-serial, linux-arm-kernel
In-Reply-To: <20120820092145.GM2232@pengutronix.de>
On Mon, Aug 20, 2012 at 11:21:45AM +0200, Uwe Kleine-König wrote:
> Just for the log: The restart works ok.
Restart with a command or restart with sysrq ?
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: restart callback not supposed to sleep?
From: Uwe Kleine-König @ 2012-08-20 9:21 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: Lothar Waßmann, linux-serial, linux-arm-kernel
In-Reply-To: <20120820090546.GR18957@n2100.arm.linux.org.uk>
On Mon, Aug 20, 2012 at 10:05:46AM +0100, Russell King - ARM Linux wrote:
> On Mon, Aug 20, 2012 at 10:57:34AM +0200, Lothar Waßmann wrote:
> > Hi,
> >
> > Uwe Kleine-König writes:
> > > Hello,
> > >
> > > while triggering a reboot via sysrq on an ARM machine I saw a "BUG:
> > > sleeping function called from invalid context" message (details below).
> > > The reason is that the sysrq handler is calling the restart hook in irq
> > > context. So what should be done about that? The obvious possiblities
> > > are:
> > >
> > > a) ignore the problem as it won't result in problems (and maybe somehow
> > > silence the warnign); or
> > > b) make the restart hook atomic; or
> > > c) assert sysrq not calling the hook in atomic mode
> > >
> > > What do you think?
> > >
> > This has been discussed earlier (with your participation) with 'a)'
> > being the conclusion.
> > http://lists.infradead.org/pipermail/linux-arm-kernel/2010-December/033877.html
>
> Except if you look at the backtrace, it seems that it fails to restart.
> There are two attempts there at making it restart so the first could
> not have succeeded.
Just for the log: The restart works ok.
Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: restart callback not supposed to sleep?
From: Russell King - ARM Linux @ 2012-08-20 9:05 UTC (permalink / raw)
To: Lothar Waßmann; +Cc: Uwe Kleine-König, linux-serial, linux-arm-kernel
In-Reply-To: <20529.64510.403690.325993@ipc1.ka-ro>
On Mon, Aug 20, 2012 at 10:57:34AM +0200, Lothar Waßmann wrote:
> Hi,
>
> Uwe Kleine-König writes:
> > Hello,
> >
> > while triggering a reboot via sysrq on an ARM machine I saw a "BUG:
> > sleeping function called from invalid context" message (details below).
> > The reason is that the sysrq handler is calling the restart hook in irq
> > context. So what should be done about that? The obvious possiblities
> > are:
> >
> > a) ignore the problem as it won't result in problems (and maybe somehow
> > silence the warnign); or
> > b) make the restart hook atomic; or
> > c) assert sysrq not calling the hook in atomic mode
> >
> > What do you think?
> >
> This has been discussed earlier (with your participation) with 'a)'
> being the conclusion.
> http://lists.infradead.org/pipermail/linux-arm-kernel/2010-December/033877.html
Except if you look at the backtrace, it seems that it fails to restart.
There are two attempts there at making it restart so the first could
not have succeeded.
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: restart callback not supposed to sleep?
From: Lothar Waßmann @ 2012-08-20 8:57 UTC (permalink / raw)
To: Uwe Kleine-König; +Cc: linux-arm-kernel, linux-serial
In-Reply-To: <20120820082423.GJ2232@pengutronix.de>
Hi,
Uwe Kleine-König writes:
> Hello,
>
> while triggering a reboot via sysrq on an ARM machine I saw a "BUG:
> sleeping function called from invalid context" message (details below).
> The reason is that the sysrq handler is calling the restart hook in irq
> context. So what should be done about that? The obvious possiblities
> are:
>
> a) ignore the problem as it won't result in problems (and maybe somehow
> silence the warnign); or
> b) make the restart hook atomic; or
> c) assert sysrq not calling the hook in atomic mode
>
> What do you think?
>
This has been discussed earlier (with your participation) with 'a)'
being the conclusion.
http://lists.infradead.org/pipermail/linux-arm-kernel/2010-December/033877.html
Lothar Waßmann
--
___________________________________________________________
Ka-Ro electronics GmbH | Pascalstraße 22 | D - 52076 Aachen
Phone: +49 2408 1402-0 | Fax: +49 2408 1402-10
Geschäftsführer: Matthias Kaussen
Handelsregistereintrag: Amtsgericht Aachen, HRB 4996
www.karo-electronics.de | info@karo-electronics.de
___________________________________________________________
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: restart callback not supposed to sleep?
From: Russell King - ARM Linux @ 2012-08-20 8:57 UTC (permalink / raw)
To: Uwe Kleine-König; +Cc: linux-arm-kernel, linux-serial
In-Reply-To: <20120820082423.GJ2232@pengutronix.de>
On Mon, Aug 20, 2012 at 10:24:23AM +0200, Uwe Kleine-König wrote:
> while triggering a reboot via sysrq on an ARM machine I saw a "BUG:
> sleeping function called from invalid context" message (details below).
> The reason is that the sysrq handler is calling the restart hook in irq
> context.
Correct - it's been the case for years that the restart hook is called
from atomic contexts (it's not only sysrq, but also softdog as well which
does this, as well as any system panic with panic timeout/panic-on-oops
enabled.)
You need to fix your platform restart hook.
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* restart callback not supposed to sleep?
From: Uwe Kleine-König @ 2012-08-20 8:24 UTC (permalink / raw)
To: linux-arm-kernel, linux-serial
Hello,
while triggering a reboot via sysrq on an ARM machine I saw a "BUG:
sleeping function called from invalid context" message (details below).
The reason is that the sysrq handler is calling the restart hook in irq
context. So what should be done about that? The obvious possiblities
are:
a) ignore the problem as it won't result in problems (and maybe somehow
silence the warnign); or
b) make the restart hook atomic; or
c) assert sysrq not calling the hook in atomic mode
What do you think?
Best regards
Uwe
[ 357.957733] SysRq : Resetting
[ 357.960772] BUG: sleeping function called from invalid context at kernel/mutex.c:269
[ 357.973053] in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper
[ 357.979508] 2 locks held by swapper/0:
[ 357.983268] #0: (&port_lock_key){-.-...}, at: [<801df9ec>] imx_rxint+0x24/0x2a4
[ 357.990887] #1: (sysrq_key_table_lock){-.....}, at: [<801cda7c>] __handle_sysrq+0x1c/0x188
[ 357.999442] Backtrace:
[ 358.001962] [<80010e9c>] (dump_backtrace+0x0/0x10c) from [<80365da0>] (dump_stack+0x18/0x1c)
[ 358.010415] r6:0000166c r5:804dbc00 r4:804ce000 r3:60000113
[ 358.016200] [<80365d88>] (dump_stack+0x0/0x1c) from [<80040f70>] (__might_sleep+0xe0/0x11c)
[ 358.024590] [<80040e90>] (__might_sleep+0x0/0x11c) from [<80369d8c>] (mutex_lock_nested+0x2c/0x2d0)
[ 358.033649] r6:804e90dc r5:80425b9c r4:804fb224
[ 358.038372] [<80369d60>] (mutex_lock_nested+0x0/0x2d0) from [<8028ffdc>] (clk_get_sys+0x24/0x110)
[ 358.047290] [<8028ffb8>] (clk_get_sys+0x0/0x110) from [<800188c8>] (mxc_restart+0x18/0xb8)
[ 358.055588] [<800188b0>] (mxc_restart+0x0/0xb8) from [<8000ed70>] (machine_restart+0x24/0x60)
[ 358.064126] r5:804e4d70 r4:804dab3c
[ 358.067863] [<8000ed4c>] (machine_restart+0x0/0x60) from [<8002d554>] (emergency_restart+0x1c/0x20)
[ 358.076961] r5:00000062 r4:804dab3c
[ 358.080615] [<8002d538>] (emergency_restart+0x0/0x20) from [<801cd93c>] (sysrq_handle_reboot+0x1c/0x20)
[ 358.090073] [<801cd920>] (sysrq_handle_reboot+0x0/0x20) from [<801cdb6c>] (__handle_sysrq+0x10c/0x188)
[ 358.099441] [<801cda60>] (__handle_sysrq+0x0/0x188) from [<801cde00>] (handle_sysrq+0x30/0x38)
[ 358.108115] [<801cddd0>] (handle_sysrq+0x0/0x38) from [<801dfba8>] (imx_rxint+0x1e0/0x2a4)
[ 358.116440] [<801df9c8>] (imx_rxint+0x0/0x2a4) from [<801e0b0c>] (imx_int+0xa0/0xb8)
[ 358.124224] [<801e0a6c>] (imx_int+0x0/0xb8) from [<80063f44>] (handle_irq_event_percpu+0x54/0x1bc)
[ 358.133226] r6:00000000 r5:87808e90 r4:870e9000 r3:801e0a6c
[ 358.139026] [<80063ef0>] (handle_irq_event_percpu+0x0/0x1bc) from [<800640f0>] (handle_irq_event+0x44/0x64)
[ 358.148834] [<800640ac>] (handle_irq_event+0x0/0x64) from [<80066414>] (handle_level_irq+0x94/0xf0)
[ 358.157923] r6:00000000 r5:87808e90 r4:87808e40 r3:00020000
[ 358.163698] [<80066380>] (handle_level_irq+0x0/0xf0) from [<800637a8>] (generic_handle_irq+0x28/0x38)
[ 358.172961] r5:0000003d r4:0000003d
[ 358.176635] [<80063780>] (generic_handle_irq+0x0/0x38) from [<8000e92c>] (handle_IRQ+0x38/0x8c)
[ 358.185347] r4:804e4da4 r3:000000b4
[ 358.189023] [<8000e8f4>] (handle_IRQ+0x0/0x8c) from [<800084c4>] (avic_handle_irq+0x3c/0x5c)
[ 358.197502] r6:0000ffff r5:804cff18 r4:80502e58 r3:00000010
[ 358.203272] [<80008488>] (avic_handle_irq+0x0/0x5c) from [<8000dd24>] (__irq_svc+0x44/0x58)
[ 358.211670] Exception stack(0x804cff18 to 0x804cff60)
[ 358.216769] ff00: 00000001 00000001
[ 358.224977] ff20: 00000000 804d8600 804ce000 80502a68 804d98d0 804ce000 80004008 4117b363
[ 358.233211] ff40: 804c1cec 804cff6c 804cff30 804cff60 800530e0 8000eaac 20000013 ffffffff
[ 358.241430] r6:ffffffff r5:20000013 r4:8000eaac r3:804d8600
[ 358.247229] [<8000ea84>] (default_idle+0x0/0x40) from [<8000ec88>] (cpu_idle+0x64/0xd0)
[ 358.255281] [<8000ec24>] (cpu_idle+0x0/0xd0) from [<803605a8>] (rest_init+0xc4/0xec)
[ 358.263069] r7:00000002 r6:00000001 r5:804dc534 r4:804ce000
[ 358.268876] [<803604e4>] (rest_init+0x0/0xec) from [<804a27d0>] (start_kernel+0x2ac/0x2fc)
[ 358.277184] r7:80b4e620 r6:804c31bc r5:805029c0 r4:804d6140
[ 358.282954] [<804a2524>] (start_kernel+0x0/0x2fc) from [<80008040>] (0x80008040)
[ 358.290400] BUG: scheduling while atomic: swapper/0/0x40010004
[ 358.296277] 2 locks held by swapper/0:
[ 358.300038] #0: (&port_lock_key){-.-...}, at: [<801df9ec>] imx_rxint+0x24/0x2a4
[ 358.307669] #1: (sysrq_key_table_lock){-.....}, at: [<801cda7c>] __handle_sysrq+0x1c/0x188
[ 358.316253] Modules linked in:
[ 358.319337] Backtrace:
[ 358.321837] [<80010e9c>] (dump_backtrace+0x0/0x10c) from [<80365da0>] (dump_stack+0x18/0x1c)
[ 358.330320] r6:804d8600 r5:80425b9c r4:804d8600 r3:20000113
[ 358.336121] [<80365d88>] (dump_stack+0x0/0x1c) from [<803664cc>] (__schedule_bug+0x64/0x78)
[ 358.344505] [<80366468>] (__schedule_bug+0x0/0x78) from [<8036acf8>] (__schedule+0x3fc/0x464)
[ 358.353072] r4:804ce000 r3:00000000
[ 358.356752] [<8036a8fc>] (__schedule+0x0/0x464) from [<8004153c>] (__cond_resched+0x28/0x38)
[ 358.365225] [<80041514>] (__cond_resched+0x0/0x38) from [<8036adf4>] (_cond_resched+0x38/0x48)
[ 358.373880] r4:804fb224 r3:00010003
[ 358.377553] [<8036adbc>] (_cond_resched+0x0/0x48) from [<80369d90>] (mutex_lock_nested+0x30/0x2d0)
[ 358.386580] [<80369d60>] (mutex_lock_nested+0x0/0x2d0) from [<8028ffdc>] (clk_get_sys+0x24/0x110)
[ 358.395492] [<8028ffb8>] (clk_get_sys+0x0/0x110) from [<800188c8>] (mxc_restart+0x18/0xb8)
[ 358.403824] [<800188b0>] (mxc_restart+0x0/0xb8) from [<8000ed70>] (machine_restart+0x24/0x60)
[ 358.412393] r5:804e4d70 r4:804dab3c
[ 358.416046] [<8000ed4c>] (machine_restart+0x0/0x60) from [<8002d554>] (emergency_restart+0x1c/0x20)
[ 358.425135] r5:00000062 r4:804dab3c
[ 358.428810] [<8002d538>] (emergency_restart+0x0/0x20) from [<801cd93c>] (sysrq_handle_reboot+0x1c/0x20)
[ 358.438265] [<801cd920>] (sysrq_handle_reboot+0x0/0x20) from [<801cdb6c>] (__handle_sysrq+0x10c/0x188)
[ 358.447631] [<801cda60>] (__handle_sysrq+0x0/0x188) from [<801cde00>] (handle_sysrq+0x30/0x38)
[ 358.456308] [<801cddd0>] (handle_sysrq+0x0/0x38) from [<801dfba8>] (imx_rxint+0x1e0/0x2a4)
[ 358.464604] [<801df9c8>] (imx_rxint+0x0/0x2a4) from [<801e0b0c>] (imx_int+0xa0/0xb8)
[ 358.472410] [<801e0a6c>] (imx_int+0x0/0xb8) from [<80063f44>] (handle_irq_event_percpu+0x54/0x1bc)
[ 358.481411] r6:00000000 r5:87808e90 r4:870e9000 r3:801e0a6c
[ 358.487210] [<80063ef0>] (handle_irq_event_percpu+0x0/0x1bc) from [<800640f0>] (handle_irq_event+0x44/0x64)
[ 358.497013] [<800640ac>] (handle_irq_event+0x0/0x64) from [<80066414>] (handle_level_irq+0x94/0xf0)
[ 358.506072] r6:00000000 r5:87808e90 r4:87808e40 r3:00020000
[ 358.511877] [<80066380>] (handle_level_irq+0x0/0xf0) from [<800637a8>] (generic_handle_irq+0x28/0x38)
[ 358.521139] r5:0000003d r4:0000003d
[ 358.524787] [<80063780>] (generic_handle_irq+0x0/0x38) from [<8000e92c>] (handle_IRQ+0x38/0x8c)
[ 358.533529] r4:804e4da4 r3:000000b4
[ 358.537199] [<8000e8f4>] (handle_IRQ+0x0/0x8c) from [<800084c4>] (avic_handle_irq+0x3c/0x5c)
[ 358.545650] r6:0000ffff r5:804cff18 r4:80502e58 r3:00000010
[ 358.551450] [<80008488>] (avic_handle_irq+0x0/0x5c) from [<8000dd24>] (__irq_svc+0x44/0x58)
[ 358.559847] Exception stack(0x804cff18 to 0x804cff60)
[ 358.564918] ff00: 00000001 00000001
[ 358.573156] ff20: 00000000 804d8600 804ce000 80502a68 804d98d0 804ce000 80004008 4117b363
[ 358.581391] ff40: 804c1cec 804cff6c 804cff30 804cff60 800530e0 8000eaac 20000013 ffffffff
[ 358.589609] r6:ffffffff r5:20000013 r4:8000eaac r3:804d8600
[ 358.595383] [<8000ea84>] (default_idle+0x0/0x40) from [<8000ec88>] (cpu_idle+0x64/0xd0)
[ 358.603455] [<8000ec24>] (cpu_idle+0x0/0xd0) from [<803605a8>] (rest_init+0xc4/0xec)
[ 358.611241] r7:00000002 r6:00000001 r5:804dc534 r4:804ce000
[ 358.617041] [<803604e4>] (rest_init+0x0/0xec) from [<804a27d0>] (start_kernel+0x2ac/0x2fc)
[ 358.625319] r7:80b4e620 r6:804c31bc r5:805029c0 r4:804d6140
[ 358.631118] [<804a2524>] (start_kernel+0x0/0x2fc) from [<80008040>] (0x80008040)
[ 358.686854] ------------[ cut here ]------------
[ 358.691551] WARNING: at kernel/mutex.c:198 mutex_lock_nested+0x290/0x2d0()
[ 358.703020] Modules linked in:
[ 358.706145] Backtrace:
[ 358.708665] [<80010e9c>] (dump_backtrace+0x0/0x10c) from [<80365da0>] (dump_stack+0x18/0x1c)
[ 358.717153] r6:000000c6 r5:80369ff0 r4:00000000 r3:00000000
[ 358.722925] [<80365d88>] (dump_stack+0x0/0x1c) from [<8001b4d0>] (warn_slowpath_common+0x54/0x6c)
[ 358.731860] [<8001b47c>] (warn_slowpath_common+0x0/0x6c) from [<8001b50c>] (warn_slowpath_null+0x24/0x2c)
[ 358.741469] r8:00000000 r7:804d8600 r6:804ce000 r5:8050401c r4:804fb224 r3:00000009
[ 358.749478] [<8001b4e8>] (warn_slowpath_null+0x0/0x2c) from [<80369ff0>] (mutex_lock_nested+0x290/0x2d0)
[ 358.759032] [<80369d60>] (mutex_lock_nested+0x0/0x2d0) from [<8028ffdc>] (clk_get_sys+0x24/0x110)
[ 358.767984] [<8028ffb8>] (clk_get_sys+0x0/0x110) from [<800188c8>] (mxc_restart+0x18/0xb8)
[ 358.776318] [<800188b0>] (mxc_restart+0x0/0xb8) from [<8000ed70>] (machine_restart+0x24/0x60)
[ 358.784858] r5:804e4d70 r4:804dab3c
[ 358.788547] [<8000ed4c>] (machine_restart+0x0/0x60) from [<8002d554>] (emergency_restart+0x1c/0x20)
[ 358.797637] r5:00000062 r4:804dab3c
[ 358.801294] [<8002d538>] (emergency_restart+0x0/0x20) from [<801cd93c>] (sysrq_handle_reboot+0x1c/0x20)
[ 358.810750] [<801cd920>] (sysrq_handle_reboot+0x0/0x20) from [<801cdb6c>] (__handle_sysrq+0x10c/0x188)
[ 358.820115] [<801cda60>] (__handle_sysrq+0x0/0x188) from [<801cde00>] (handle_sysrq+0x30/0x38)
[ 358.828795] [<801cddd0>] (handle_sysrq+0x0/0x38) from [<801dfba8>] (imx_rxint+0x1e0/0x2a4)
[ 358.837123] [<801df9c8>] (imx_rxint+0x0/0x2a4) from [<801e0b0c>] (imx_int+0xa0/0xb8)
[ 358.844909] [<801e0a6c>] (imx_int+0x0/0xb8) from [<80063f44>] (handle_irq_event_percpu+0x54/0x1bc)
[ 358.853909] r6:00000000 r5:87808e90 r4:870e9000 r3:801e0a6c
[ 358.859708] [<80063ef0>] (handle_irq_event_percpu+0x0/0x1bc) from [<800640f0>] (handle_irq_event+0x44/0x64)
[ 358.869513] [<800640ac>] (handle_irq_event+0x0/0x64) from [<80066414>] (handle_level_irq+0x94/0xf0)
[ 358.878602] r6:00000000 r5:87808e90 r4:87808e40 r3:00020000
[ 358.884374] [<80066380>] (handle_level_irq+0x0/0xf0) from [<800637a8>] (generic_handle_irq+0x28/0x38)
[ 358.893635] r5:0000003d r4:0000003d
[ 358.897307] [<80063780>] (generic_handle_irq+0x0/0x38) from [<8000e92c>] (handle_IRQ+0x38/0x8c)
[ 358.906020] r4:804e4da4 r3:000000b4
[ 358.909693] [<8000e8f4>] (handle_IRQ+0x0/0x8c) from [<800084c4>] (avic_handle_irq+0x3c/0x5c)
[ 358.918173] r6:0000ffff r5:804cff18 r4:80502e58 r3:00000010
[ 358.923941] [<80008488>] (avic_handle_irq+0x0/0x5c) from [<8000dd24>] (__irq_svc+0x44/0x58)
[ 358.932339] Exception stack(0x804cff18 to 0x804cff60)
[ 358.937439] ff00: 00000001 00000001
[ 358.945645] ff20: 00000000 804d8600 804ce000 80502a68 804d98d0 804ce000 80004008 4117b363
[ 358.953878] ff40: 804c1cec 804cff6c 804cff30 804cff60 800530e0 8000eaac 20000013 ffffffff
[ 358.962095] r6:ffffffff r5:20000013 r4:8000eaac r3:804d8600
[ 358.967894] [<8000ea84>] (default_idle+0x0/0x40) from [<8000ec88>] (cpu_idle+0x64/0xd0)
[ 358.975943] [<8000ec24>] (cpu_idle+0x0/0xd0) from [<803605a8>] (rest_init+0xc4/0xec)
[ 358.983728] r7:00000002 r6:00000001 r5:804dc534 r4:804ce000
[ 358.989531] [<803604e4>] (rest_init+0x0/0xec) from [<804a27d0>] (start_kernel+0x2ac/0x2fc)
[ 358.997838] r7:80b4e620 r6:804c31bc r5:805029c0 r4:804d6140
[ 359.003606] [<804a2524>] (start_kernel+0x0/0x2fc) from [<80008040>] (0x80008040)
[ 359.011047] ---[ end trace 1ad357144973f17c ]---
[ 359.015715] BUG: sleeping function called from invalid context at kernel/mutex.c:269
[ 359.028025] in_atomic(): 1, irqs_disabled(): 0, pid: 0, name: swapper
[ 359.034479] INFO: lockdep is turned off.
[ 359.038440] Backtrace:
[ 359.040946] [<80010e9c>] (dump_backtrace+0x0/0x10c) from [<80365da0>] (dump_stack+0x18/0x1c)
[ 359.049430] r6:000016d5 r5:804dbc00 r4:804ce000 r3:60000013
[ 359.055216] [<80365d88>] (dump_stack+0x0/0x1c) from [<80040f70>] (__might_sleep+0xe0/0x11c)
[ 359.063635] [<80040e90>] (__might_sleep+0x0/0x11c) from [<80369d8c>] (mutex_lock_nested+0x2c/0x2d0)
[ 359.072726] r6:804e90dc r5:8780db40 r4:804fb274
[ 359.077470] [<80369d60>] (mutex_lock_nested+0x0/0x2d0) from [<80291478>] (clk_prepare+0x20/0x40)
[ 359.086333] [<80291458>] (clk_prepare+0x0/0x40) from [<800188d8>] (mxc_restart+0x28/0xb8)
[ 359.094526] r5:804e4d70 r4:8780db40
[ 359.098207] [<800188b0>] (mxc_restart+0x0/0xb8) from [<8000ed70>] (machine_restart+0x24/0x60)
[ 359.106776] r5:804e4d70 r4:804dab3c
[ 359.110427] [<8000ed4c>] (machine_restart+0x0/0x60) from [<8002d554>] (emergency_restart+0x1c/0x20)
[ 359.119517] r5:00000062 r4:804dab3c
[ 359.123166] [<8002d538>] (emergency_restart+0x0/0x20) from [<801cd93c>] (sysrq_handle_reboot+0x1c/0x20)
[ 359.132621] [<801cd920>] (sysrq_handle_reboot+0x0/0x20) from [<801cdb6c>] (__handle_sysrq+0x10c/0x188)
[ 359.141988] [<801cda60>] (__handle_sysrq+0x0/0x188) from [<801cde00>] (handle_sysrq+0x30/0x38)
[ 359.150664] [<801cddd0>] (handle_sysrq+0x0/0x38) from [<801dfba8>] (imx_rxint+0x1e0/0x2a4)
[ 359.158987] [<801df9c8>] (imx_rxint+0x0/0x2a4) from [<801e0b0c>] (imx_int+0xa0/0xb8)
[ 359.166794] [<801e0a6c>] (imx_int+0x0/0xb8) from [<80063f44>] (handle_irq_event_percpu+0x54/0x1bc)
[ 359.175767] r6:00000000 r5:87808e90 r4:870e9000 r3:801e0a6c
[ 359.181569] [<80063ef0>] (handle_irq_event_percpu+0x0/0x1bc) from [<800640f0>] (handle_irq_event+0x44/0x64)
[ 359.191374] [<800640ac>] (handle_irq_event+0x0/0x64) from [<80066414>] (handle_level_irq+0x94/0xf0)
[ 359.200461] r6:00000000 r5:87808e90 r4:87808e40 r3:00020000
[ 359.206260] [<80066380>] (handle_level_irq+0x0/0xf0) from [<800637a8>] (generic_handle_irq+0x28/0x38)
[ 359.215494] r5:0000003d r4:0000003d
[ 359.219168] [<80063780>] (generic_handle_irq+0x0/0x38) from [<8000e92c>] (handle_IRQ+0x38/0x8c)
[ 359.227911] r4:804e4da4 r3:000000b4
[ 359.231555] [<8000e8f4>] (handle_IRQ+0x0/0x8c) from [<800084c4>] (avic_handle_irq+0x3c/0x5c)
[ 359.240035] r6:0000ffff r5:804cff18 r4:80502e58 r3:00000010
[ 359.245803] [<80008488>] (avic_handle_irq+0x0/0x5c) from [<8000dd24>] (__irq_svc+0x44/0x58)
[ 359.254198] Exception stack(0x804cff18 to 0x804cff60)
[ 359.259296] ff00: 00000001 00000001
[ 359.267530] ff20: 00000000 804d8600 804ce000 80502a68 804d98d0 804ce000 80004008 4117b363
[ 359.275736] ff40: 804c1cec 804cff6c 804cff30 804cff60 800530e0 8000eaac 20000013 ffffffff
[ 359.283951] r6:ffffffff r5:20000013 r4:8000eaac r3:804d8600
[ 359.289748] [<8000ea84>] (default_idle+0x0/0x40) from [<8000ec88>] (cpu_idle+0x64/0xd0)
[ 359.297818] [<8000ec24>] (cpu_idle+0x0/0xd0) from [<803605a8>] (rest_init+0xc4/0xec)
[ 359.305576] r7:00000002 r6:00000001 r5:804dc534 r4:804ce000
[ 359.311380] [<803604e4>] (rest_init+0x0/0xec) from [<804a27d0>] (start_kernel+0x2ac/0x2fc)
[ 359.319688] r7:80b4e620 r6:804c31bc r5:805029c0 r4:804d6140
[ 359.325454] [<804a2524>] (start_kernel+0x0/0x2fc) from [<80008040>] (0x80008040)
[ 359.332899] BUG: scheduling while atomic: swapper/0/0x40010004
[ 359.338769] INFO: lockdep is turned off.
[ 359.342703] Modules linked in:
[ 359.345783] Backtrace:
[ 359.348312] [<80010e9c>] (dump_backtrace+0x0/0x10c) from [<80365da0>] (dump_stack+0x18/0x1c)
[ 359.356797] r6:804d8600 r5:8780db40 r4:804d8600 r3:60000013
[ 359.362567] [<80365d88>] (dump_stack+0x0/0x1c) from [<803664cc>] (__schedule_bug+0x64/0x78)
[ 359.370980] [<80366468>] (__schedule_bug+0x0/0x78) from [<8036acf8>] (__schedule+0x3fc/0x464)
[ 359.379546] r4:804ce000 r3:00000000
[ 359.383201] [<8036a8fc>] (__schedule+0x0/0x464) from [<8004153c>] (__cond_resched+0x28/0x38)
[ 359.391708] [<80041514>] (__cond_resched+0x0/0x38) from [<8036adf4>] (_cond_resched+0x38/0x48)
[ 359.400365] r4:804fb274 r3:00010003
[ 359.404012] [<8036adbc>] (_cond_resched+0x0/0x48) from [<80369d90>] (mutex_lock_nested+0x30/0x2d0)
[ 359.413041] [<80369d60>] (mutex_lock_nested+0x0/0x2d0) from [<80291478>] (clk_prepare+0x20/0x40)
[ 359.421896] [<80291458>] (clk_prepare+0x0/0x40) from [<800188d8>] (mxc_restart+0x28/0xb8)
[ 359.430116] r5:804e4d70 r4:8780db40
[ 359.433767] [<800188b0>] (mxc_restart+0x0/0xb8) from [<8000ed70>] (machine_restart+0x24/0x60)
[ 359.442336] r5:804e4d70 r4:804dab3c
[ 359.445986] [<8000ed4c>] (machine_restart+0x0/0x60) from [<8002d554>] (emergency_restart+0x1c/0x20)
[ 359.455074] r5:00000062 r4:804dab3c
[ 359.458748] [<8002d538>] (emergency_restart+0x0/0x20) from [<801cd93c>] (sysrq_handle_reboot+0x1c/0x20)
[ 359.468202] [<801cd920>] (sysrq_handle_reboot+0x0/0x20) from [<801cdb6c>] (__handle_sysrq+0x10c/0x188)
[ 359.477569] [<801cda60>] (__handle_sysrq+0x0/0x188) from [<801cde00>] (handle_sysrq+0x30/0x38)
[ 359.486242] [<801cddd0>] (handle_sysrq+0x0/0x38) from [<801dfba8>] (imx_rxint+0x1e0/0x2a4)
[ 359.494538] [<801df9c8>] (imx_rxint+0x0/0x2a4) from [<801e0b0c>] (imx_int+0xa0/0xb8)
[ 359.502344] [<801e0a6c>] (imx_int+0x0/0xb8) from [<80063f44>] (handle_irq_event_percpu+0x54/0x1bc)
[ 359.511344] r6:00000000 r5:87808e90 r4:870e9000 r3:801e0a6c
[ 359.517140] [<80063ef0>] (handle_irq_event_percpu+0x0/0x1bc) from [<800640f0>] (handle_irq_event+0x44/0x64)
[ 359.526943] [<800640ac>] (handle_irq_event+0x0/0x64) from [<80066414>] (handle_level_irq+0x94/0xf0)
[ 359.536002] r6:00000000 r5:87808e90 r4:87808e40 r3:00020000
[ 359.541803] [<80066380>] (handle_level_irq+0x0/0xf0) from [<800637a8>] (generic_handle_irq+0x28/0x38)
[ 359.551064] r5:0000003d r4:0000003d
[ 359.554713] [<80063780>] (generic_handle_irq+0x0/0x38) from [<8000e92c>] (handle_IRQ+0x38/0x8c)
[ 359.563453] r4:804e4da4 r3:000000b4
[ 359.567121] [<8000e8f4>] (handle_IRQ+0x0/0x8c) from [<800084c4>] (avic_handle_irq+0x3c/0x5c)
[ 359.575572] r6:0000ffff r5:804cff18 r4:80502e58 r3:00000010
[ 359.581372] [<80008488>] (avic_handle_irq+0x0/0x5c) from [<8000dd24>] (__irq_svc+0x44/0x58)
[ 359.589768] Exception stack(0x804cff18 to 0x804cff60)
[ 359.594839] ff00: 00000001 00000001
[ 359.603073] ff20: 00000000 804d8600 804ce000 80502a68 804d98d0 804ce000 80004008 4117b363
[ 359.611307] ff40: 804c1cec 804cff6c 804cff30 804cff60 800530e0 8000eaac 20000013 ffffffff
[ 359.619524] r6:ffffffff r5:20000013 r4:8000eaac r3:804d8600
[ 359.625296] [<8000ea84>] (default_idle+0x0/0x40) from [<8000ec88>] (cpu_idle+0x64/0xd0)
[ 359.633366] [<8000ec24>] (cpu_idle+0x0/0xd0) from [<803605a8>] (rest_init+0xc4/0xec)
[ 359.641152] r7:00000002 r6:00000001 r5:804dc534 r4:804ce000
[ 359.646950] [<803604e4>] (rest_init+0x0/0xec) from [<804a27d0>] (start_kernel+0x2ac/0x2fc)
[ 359.655227] r7:80b4e620 r6:804c31bc r5:805029c0 r4:804d6140
[ 359.661024] [<804a2524>] (start_kernel+0x0/0x2fc) from [<80008040>] (0x80008040)
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [PATCH] serial/imx: improve error diagnosics for clock and pinctrl failures
From: Uwe Kleine-König @ 2012-08-20 7:57 UTC (permalink / raw)
To: linux-kernel, Alan Cox, Greg Kroah-Hartman; +Cc: kernel, linux-serial
These error paths are used more often now after deep changes to the
clock code and pinctrl is still new for imx. So help debugging and give
clues in the boot log.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
drivers/tty/serial/imx.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
index d5c689d6..ce44de7 100644
--- a/drivers/tty/serial/imx.c
+++ b/drivers/tty/serial/imx.c
@@ -1505,18 +1505,21 @@ static int serial_imx_probe(struct platform_device *pdev)
pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
if (IS_ERR(pinctrl)) {
ret = PTR_ERR(pinctrl);
+ dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret);
goto unmap;
}
sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
if (IS_ERR(sport->clk_ipg)) {
ret = PTR_ERR(sport->clk_ipg);
+ dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret);
goto unmap;
}
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);
goto unmap;
}
--
1.7.10.4
^ permalink raw reply related
* [PATCHv4 1/1] [RFC] uartclk from serial_core exposed to sysfs
From: Tomas Hlavacek @ 2012-08-19 18:34 UTC (permalink / raw)
To: gregkh, alan, linux-serial, linux-kernel; +Cc: marek.vasut, Tomas Hlavacek
In-Reply-To: <1344929718-22736-1-git-send-email-tmshlvck@gmail.com>
Added file /sys/devices/.../tty/ttySX/uartclk to allow reading
uartclk value in struct uart_port in serial_core via sysfs.
It simplifies initialization verification of no-name cards that
have non-standard oscillator speed while having no distinguishing
PCI IDs to allow autodetection.
tty_register_device() has been generalized and refactored in order
to add support for setting drvdata and attribute_group to the device.
Signed-off-by: Tomas Hlavacek <tmshlvck@gmail.com>
---
Documentation/ABI/testing/sysfs-tty | 9 +++++
drivers/tty/serial/serial_core.c | 37 +++++++++++++++++++-
drivers/tty/tty_io.c | 63 ++++++++++++++++++++++++++++++++---
include/linux/tty.h | 4 +++
4 files changed, 108 insertions(+), 5 deletions(-)
diff --git a/Documentation/ABI/testing/sysfs-tty b/Documentation/ABI/testing/sysfs-tty
index b138b66..b93a174 100644
--- a/Documentation/ABI/testing/sysfs-tty
+++ b/Documentation/ABI/testing/sysfs-tty
@@ -17,3 +17,12 @@ Description:
device, like 'tty1'.
The file supports poll() to detect virtual
console switches.
+
+What: /sys/class/tty/ttyS0/uartclk
+Date: Aug 2012
+Contact: Tomas Hlavacek <tmshlvck@gmail.com>
+Description:
+ Shows the current uartclk value associated with the
+ UART port in serial_core, that is bound to TTY like ttyS0.
+ uartclk = 16 * baud_base
+
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index a21dc8e..e0c11da 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -2293,6 +2293,38 @@ struct tty_driver *uart_console_device(struct console *co, int *index)
return p->tty_driver;
}
+static ssize_t uart_get_attr_uartclk(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int ret;
+
+ struct tty_port *port = dev_get_drvdata(dev);
+ struct uart_state *state = container_of(port, struct uart_state, port);
+
+ mutex_lock(&state->port.mutex);
+ ret = snprintf(buf, PAGE_SIZE, "%d\n", state->uart_port->uartclk);
+ mutex_unlock(&state->port.mutex);
+
+ return ret;
+}
+
+static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk,
+ NULL);
+
+static struct attribute *tty_dev_attrs[] = {
+ &dev_attr_uartclk.attr,
+ NULL,
+};
+
+static struct attribute_group tty_dev_attr_group = {
+ .attrs = tty_dev_attrs,
+};
+
+static struct attribute_group *tty_dev_attr_groups[] = {
+ &tty_dev_attr_group,
+ NULL
+};
+
/**
* uart_add_one_port - attach a driver-defined port structure
* @drv: pointer to the uart low level driver structure for this port
@@ -2345,8 +2377,11 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
/*
* Register the port whether it's detected or not. This allows
* setserial to be used to alter this ports parameters.
+ * Use driverdata of the tty device for referencing the UART port.
+ * Set default device attributes to the new device.
*/
- tty_dev = tty_register_device(drv->tty_driver, uport->line, uport->dev);
+ tty_dev = tty_register_device_attr(drv->tty_driver, uport->line,
+ uport->dev, port, tty_dev_attr_groups);
if (likely(!IS_ERR(tty_dev))) {
device_set_wakeup_capable(tty_dev, 1);
} else {
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index b425c79..1c9d5b5 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -3009,12 +3009,42 @@ struct class *tty_class;
*
* Locking: ??
*/
-
struct device *tty_register_device(struct tty_driver *driver, unsigned index,
struct device *device)
{
+ return tty_register_device_attr(driver, index, device, NULL, NULL);
+}
+EXPORT_SYMBOL(tty_register_device);
+
+/**
+ * tty_register_device_attr - register a tty device
+ * @driver: the tty driver that describes the tty device
+ * @index: the index in the tty driver for this tty device
+ * @device: a struct device that is associated with this tty device.
+ * This field is optional, if there is no known struct device
+ * for this tty device it can be set to NULL safely.
+ * @drvdata: Driver data to be set to device (NULL = do not touch).
+ * @attr_grp: Attribute group to be set on device (NULL = do not touch).
+ *
+ * Returns a pointer to the struct device for this tty device
+ * (or ERR_PTR(-EFOO) on error).
+ *
+ * This call is required to be made to register an individual tty device
+ * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If
+ * that bit is not set, this function should not be called by a tty
+ * driver.
+ *
+ * Locking: ??
+ */
+struct device *tty_register_device_attr(struct tty_driver *driver,
+ unsigned index, struct device *device,
+ void *drvdata,
+ struct attribute_group **attr_grp)
+{
char name[64];
- dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
+ struct device *dev = NULL;
+ int retval = -ENODEV;
+ dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
if (index >= driver->num) {
printk(KERN_ERR "Attempt to register invalid tty line number "
@@ -3027,9 +3057,34 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index,
else
tty_line_name(driver, index, name);
- return device_create(tty_class, device, dev, NULL, name);
+
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (!dev) {
+ retval = -ENOMEM;
+ goto error;
+ }
+
+ dev->devt = devt;
+ dev->class = tty_class;
+ dev->parent = device;
+ dev_set_name(dev, "%s", name);
+ if (attr_grp)
+ dev->groups = attr_grp;
+ if (drvdata)
+ dev_set_drvdata(dev, drvdata);
+
+ retval = device_register(dev);
+ if (retval)
+ goto error;
+
+ return dev;
+
+error:
+ put_device(dev);
+ return ERR_PTR(retval);
+
}
-EXPORT_SYMBOL(tty_register_device);
+EXPORT_SYMBOL_GPL(tty_register_device_attr);
/**
* tty_unregister_device - unregister a tty device
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 9f47ab5..424777a 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -410,6 +410,10 @@ extern int tty_register_driver(struct tty_driver *driver);
extern int tty_unregister_driver(struct tty_driver *driver);
extern struct device *tty_register_device(struct tty_driver *driver,
unsigned index, struct device *dev);
+struct device *tty_register_device_attr(struct tty_driver *driver,
+ unsigned index, struct device *device,
+ void *drvdata,
+ struct attribute_group **attr_grp);
extern void tty_unregister_device(struct tty_driver *driver, unsigned index);
extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp,
int buflen);
--
1.7.10.4
^ permalink raw reply related
* [PATCH] serial: add a new helper function
From: Huang Shijie @ 2012-08-19 18:27 UTC (permalink / raw)
To: gregkh; +Cc: alan, jirislaby, linux-kernel, linux-serial, netdev, Huang Shijie
In most of the time, the driver needs to check if the cts flow control
is enabled. But now, the driver checks the ASYNC_CTS_FLOW flag manually,
which is not a grace way. So add a new wraper function to make the code
tidy and clean.
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
drivers/char/pcmcia/synclink_cs.c | 2 +-
drivers/tty/amiserial.c | 2 +-
drivers/tty/cyclades.c | 2 +-
drivers/tty/isicom.c | 2 +-
drivers/tty/mxser.c | 2 +-
drivers/tty/serial/mxs-auart.c | 2 +-
drivers/tty/serial/serial_core.c | 4 ++--
drivers/tty/synclink.c | 2 +-
drivers/tty/synclink_gt.c | 2 +-
drivers/tty/synclinkmp.c | 2 +-
include/linux/tty.h | 7 +++++++
net/irda/ircomm/ircomm_tty.c | 4 ++--
net/irda/ircomm/ircomm_tty_attach.c | 2 +-
13 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 5db08c7..3f57d5de 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -1050,7 +1050,7 @@ static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty)
wake_up_interruptible(&info->status_event_wait_q);
wake_up_interruptible(&info->event_wait_q);
- if (info->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&info->port)) {
if (tty->hw_stopped) {
if (info->serial_signals & SerialSignal_CTS) {
if (debug_level >= DEBUG_LEVEL_ISR)
diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c
index 2b7535d..42d0a25 100644
--- a/drivers/tty/amiserial.c
+++ b/drivers/tty/amiserial.c
@@ -420,7 +420,7 @@ static void check_modem_status(struct serial_state *info)
tty_hangup(port->tty);
}
}
- if (port->flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(port)) {
if (port->tty->hw_stopped) {
if (!(status & SER_CTS)) {
#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
diff --git a/drivers/tty/cyclades.c b/drivers/tty/cyclades.c
index e3954da..0a6a0bc 100644
--- a/drivers/tty/cyclades.c
+++ b/drivers/tty/cyclades.c
@@ -727,7 +727,7 @@ static void cyy_chip_modem(struct cyclades_card *cinfo, int chip,
else
tty_hangup(tty);
}
- if ((mdm_change & CyCTS) && (info->port.flags & ASYNC_CTS_FLOW)) {
+ if ((mdm_change & CyCTS) && tty_port_cts_enabled(&info->port)) {
if (tty->hw_stopped) {
if (mdm_status & CyCTS) {
/* cy_start isn't used
diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c
index 99cf22e..d7492e1 100644
--- a/drivers/tty/isicom.c
+++ b/drivers/tty/isicom.c
@@ -600,7 +600,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
port->status &= ~ISI_DCD;
}
- if (port->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&port->port)) {
if (tty->hw_stopped) {
if (header & ISI_CTS) {
port->port.tty->hw_stopped = 0;
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
index bb2da4c..cfda47d 100644
--- a/drivers/tty/mxser.c
+++ b/drivers/tty/mxser.c
@@ -830,7 +830,7 @@ static void mxser_check_modem_status(struct tty_struct *tty,
wake_up_interruptible(&port->port.open_wait);
}
- if (port->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&port->port)) {
if (tty->hw_stopped) {
if (status & UART_MSR_CTS) {
tty->hw_stopped = 0;
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index 3a667ee..dafeef2 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -262,7 +262,7 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
ctrl &= ~AUART_CTRL2_RTSEN;
if (mctrl & TIOCM_RTS) {
- if (u->state->port.flags & ASYNC_CTS_FLOW)
+ if (tty_port_cts_enabled(&u->state->port))
ctrl |= AUART_CTRL2_RTSEN;
}
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 5b308c8..1920e5c 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -176,7 +176,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
}
- if (port->flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(port)) {
spin_lock_irq(&uport->lock);
if (!(uport->ops->get_mctrl(uport) & TIOCM_CTS))
tty->hw_stopped = 1;
@@ -2493,7 +2493,7 @@ void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
uport->icount.cts++;
- if (port->flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(port)) {
if (tty->hw_stopped) {
if (status) {
tty->hw_stopped = 0;
diff --git a/drivers/tty/synclink.c b/drivers/tty/synclink.c
index 666aa14..70e3a52 100644
--- a/drivers/tty/synclink.c
+++ b/drivers/tty/synclink.c
@@ -1359,7 +1359,7 @@ static void mgsl_isr_io_pin( struct mgsl_struct *info )
}
}
- if ( (info->port.flags & ASYNC_CTS_FLOW) &&
+ if (tty_port_cts_enabled(&info->port) &&
(status & MISCSTATUS_CTS_LATCHED) ) {
if (info->port.tty->hw_stopped) {
if (status & MISCSTATUS_CTS) {
diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c
index 45f6136..b38e954 100644
--- a/drivers/tty/synclink_gt.c
+++ b/drivers/tty/synclink_gt.c
@@ -2053,7 +2053,7 @@ static void cts_change(struct slgt_info *info, unsigned short status)
wake_up_interruptible(&info->event_wait_q);
info->pending_bh |= BH_STATUS;
- if (info->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&info->port)) {
if (info->port.tty) {
if (info->port.tty->hw_stopped) {
if (info->signals & SerialSignal_CTS) {
diff --git a/drivers/tty/synclinkmp.c b/drivers/tty/synclinkmp.c
index 53429c8..f17d9f3 100644
--- a/drivers/tty/synclinkmp.c
+++ b/drivers/tty/synclinkmp.c
@@ -2500,7 +2500,7 @@ static void isr_io_pin( SLMP_INFO *info, u16 status )
}
}
- if ( (info->port.flags & ASYNC_CTS_FLOW) &&
+ if (tty_port_cts_enabled(&info->port) &&
(status & MISCSTATUS_CTS_LATCHED) ) {
if ( info->port.tty ) {
if (info->port.tty->hw_stopped) {
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 69a787f..e0b4871 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -43,6 +43,7 @@
#include <linux/tty_driver.h>
#include <linux/tty_ldisc.h>
#include <linux/mutex.h>
+#include <linux/serial.h>
@@ -513,6 +514,12 @@ static inline struct tty_port *tty_port_get(struct tty_port *port)
return port;
}
+/* If the cts flow control is enabled, return true. */
+static inline bool tty_port_cts_enabled(struct tty_port *port)
+{
+ return port->flags & ASYNC_CTS_FLOW;
+}
+
extern struct tty_struct *tty_port_tty_get(struct tty_port *port);
extern void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty);
extern int tty_port_carrier_raised(struct tty_port *port);
diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c
index 9668990..95a3a7a 100644
--- a/net/irda/ircomm/ircomm_tty.c
+++ b/net/irda/ircomm/ircomm_tty.c
@@ -1070,7 +1070,7 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
goto put;
}
}
- if (tty && self->port.flags & ASYNC_CTS_FLOW) {
+ if (tty && tty_port_cts_enabled(&self->port)) {
if (tty->hw_stopped) {
if (status & IRCOMM_CTS) {
IRDA_DEBUG(2,
@@ -1313,7 +1313,7 @@ static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
seq_puts(m, "Flags:");
sep = ' ';
- if (self->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&self->port)) {
seq_printf(m, "%cASYNC_CTS_FLOW", sep);
sep = '|';
}
diff --git a/net/irda/ircomm/ircomm_tty_attach.c b/net/irda/ircomm/ircomm_tty_attach.c
index 3ab70e7..edab393 100644
--- a/net/irda/ircomm/ircomm_tty_attach.c
+++ b/net/irda/ircomm/ircomm_tty_attach.c
@@ -578,7 +578,7 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
* will have to wait for the peer device (DCE) to raise the CTS
* line.
*/
- if ((self->port.flags & ASYNC_CTS_FLOW) &&
+ if (tty_port_cts_enabled(&self->port) &&
((self->settings.dce & IRCOMM_CTS) == 0)) {
IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ );
goto put;
--
1.7.4.4
^ permalink raw reply related
* Re: [PATCH] [media] winbond-cir: Fix initialization
From: Alan Cox @ 2012-08-19 16:00 UTC (permalink / raw)
To: Mauro Carvalho Chehab
Cc: David Härdeman, Sean Young, Jarod Wilson, Alan Cox,
linux-media, linux-serial, lirc-list
In-Reply-To: <5026BE78.80902@redhat.com>
> > +#ifdef CONFIG_SERIAL_8250
Coule be modular
> > + if (!io) {
> > + struct uart_port port = { .iobase = data->sbase };
> > + int line = serial8250_find_port(&port);
> > + if (line >= 0) {
> > + serial8250_unregister_port(line);
>
> Hmm... Not sure if it makes sense, but perhaps the unregistering code
> should be reverting serial8250_unregister_port(line).
Can't do that anyway it may well be busy.
> > --- a/drivers/tty/serial/8250/8250.c
> > +++ b/drivers/tty/serial/8250/8250.c
> > @@ -2914,6 +2914,7 @@ int serial8250_find_port(struct uart_port *p)
> > }
> > return -ENODEV;
> > }
> > +EXPORT_SYMBOL(serial8250_find_port);
No - this leaks all the uart internal abstractions into the tree. We
really don't want that happening.
The right way to fix this (and a couple of other uglies) is to make 8250
on x86 scan for PnP ports *before* generic ports and to make a note of
any ports to skip on the PnP scan (so that the port poking scan ignores
them too)
Alan
^ permalink raw reply
* Re: [PATCH] serial: add a new helper function
From: Alan Cox @ 2012-08-19 15:46 UTC (permalink / raw)
To: Greg KH; +Cc: Huang Shijie, alan, jirislaby, linux-kernel, linux-serial, netdev
In-Reply-To: <20120819064429.GA3252@kroah.com>
On Sat, 18 Aug 2012 23:44:29 -0700
Greg KH <gregkh@linuxfoundation.org> wrote:
> On Sun, Aug 19, 2012 at 02:27:12PM -0400, Huang Shijie wrote:
> > --- a/include/linux/tty.h
> > +++ b/include/linux/tty.h
> > @@ -43,6 +43,7 @@
> > #include <linux/tty_driver.h>
> > #include <linux/tty_ldisc.h>
> > #include <linux/mutex.h>
> > +#include <linux/serial.h>
> >
> >
> >
> > @@ -513,6 +514,12 @@ static inline struct tty_port *tty_port_get(struct tty_port *port)
> > return port;
> > }
> >
> > +/* If the cts flow control is enabled, return true. */
> > +static inline bool tty_port_cts_enabled(struct tty_port *port)
> > +{
> > + return port->flags & ASYNC_CTS_FLOW;
> > +}
> > +
>
> The fact that you have to add serial.h to this file kind of implies that
> this function shouldn't be here, right?
>
> How about serial.h instead? Not all tty drivers are serial drivers :)
tty_port is tty generic so possibly if there is a generic helper the
flags and helper should likewise be this way.
As it stands at the moment ASYNC_CTS_FLOW is a convention a few drivers
use. So calling it tty_port_xxx is going to misleading.
Alan
^ permalink raw reply
* [PATCH v2] serial: add a new helper function
From: Huang Shijie @ 2012-08-19 21:33 UTC (permalink / raw)
To: gregkh; +Cc: alan, jirislaby, linux-kernel, linux-serial, netdev, Huang Shijie
In most of the time, the driver needs to check if the cts flow control
is enabled. But now, the driver checks the ASYNC_CTS_FLOW flag manually,
which is not a grace way. So add a new wraper function to make the code
tidy and clean.
Signed-off-by: Huang Shijie <shijie8@gmail.com>
---
v1 --> v2:
move the new help function to serial.h
---
drivers/char/pcmcia/synclink_cs.c | 2 +-
drivers/tty/amiserial.c | 2 +-
drivers/tty/cyclades.c | 2 +-
drivers/tty/isicom.c | 2 +-
drivers/tty/mxser.c | 2 +-
drivers/tty/serial/mxs-auart.c | 2 +-
drivers/tty/serial/serial_core.c | 4 ++--
drivers/tty/synclink.c | 2 +-
drivers/tty/synclink_gt.c | 2 +-
drivers/tty/synclinkmp.c | 2 +-
include/linux/serial.h | 7 +++++++
net/irda/ircomm/ircomm_tty.c | 4 ++--
net/irda/ircomm/ircomm_tty_attach.c | 2 +-
13 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c
index 5db08c7..3f57d5de 100644
--- a/drivers/char/pcmcia/synclink_cs.c
+++ b/drivers/char/pcmcia/synclink_cs.c
@@ -1050,7 +1050,7 @@ static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty)
wake_up_interruptible(&info->status_event_wait_q);
wake_up_interruptible(&info->event_wait_q);
- if (info->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&info->port)) {
if (tty->hw_stopped) {
if (info->serial_signals & SerialSignal_CTS) {
if (debug_level >= DEBUG_LEVEL_ISR)
diff --git a/drivers/tty/amiserial.c b/drivers/tty/amiserial.c
index 2b7535d..42d0a25 100644
--- a/drivers/tty/amiserial.c
+++ b/drivers/tty/amiserial.c
@@ -420,7 +420,7 @@ static void check_modem_status(struct serial_state *info)
tty_hangup(port->tty);
}
}
- if (port->flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(port)) {
if (port->tty->hw_stopped) {
if (!(status & SER_CTS)) {
#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
diff --git a/drivers/tty/cyclades.c b/drivers/tty/cyclades.c
index e3954da..0a6a0bc 100644
--- a/drivers/tty/cyclades.c
+++ b/drivers/tty/cyclades.c
@@ -727,7 +727,7 @@ static void cyy_chip_modem(struct cyclades_card *cinfo, int chip,
else
tty_hangup(tty);
}
- if ((mdm_change & CyCTS) && (info->port.flags & ASYNC_CTS_FLOW)) {
+ if ((mdm_change & CyCTS) && tty_port_cts_enabled(&info->port)) {
if (tty->hw_stopped) {
if (mdm_status & CyCTS) {
/* cy_start isn't used
diff --git a/drivers/tty/isicom.c b/drivers/tty/isicom.c
index 99cf22e..d7492e1 100644
--- a/drivers/tty/isicom.c
+++ b/drivers/tty/isicom.c
@@ -600,7 +600,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
port->status &= ~ISI_DCD;
}
- if (port->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&port->port)) {
if (tty->hw_stopped) {
if (header & ISI_CTS) {
port->port.tty->hw_stopped = 0;
diff --git a/drivers/tty/mxser.c b/drivers/tty/mxser.c
index bb2da4c..cfda47d 100644
--- a/drivers/tty/mxser.c
+++ b/drivers/tty/mxser.c
@@ -830,7 +830,7 @@ static void mxser_check_modem_status(struct tty_struct *tty,
wake_up_interruptible(&port->port.open_wait);
}
- if (port->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&port->port)) {
if (tty->hw_stopped) {
if (status & UART_MSR_CTS) {
tty->hw_stopped = 0;
diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c
index 3a667ee..dafeef2 100644
--- a/drivers/tty/serial/mxs-auart.c
+++ b/drivers/tty/serial/mxs-auart.c
@@ -262,7 +262,7 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
ctrl &= ~AUART_CTRL2_RTSEN;
if (mctrl & TIOCM_RTS) {
- if (u->state->port.flags & ASYNC_CTS_FLOW)
+ if (tty_port_cts_enabled(&u->state->port))
ctrl |= AUART_CTRL2_RTSEN;
}
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 5b308c8..1920e5c 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -176,7 +176,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
}
- if (port->flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(port)) {
spin_lock_irq(&uport->lock);
if (!(uport->ops->get_mctrl(uport) & TIOCM_CTS))
tty->hw_stopped = 1;
@@ -2493,7 +2493,7 @@ void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
uport->icount.cts++;
- if (port->flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(port)) {
if (tty->hw_stopped) {
if (status) {
tty->hw_stopped = 0;
diff --git a/drivers/tty/synclink.c b/drivers/tty/synclink.c
index 666aa14..70e3a52 100644
--- a/drivers/tty/synclink.c
+++ b/drivers/tty/synclink.c
@@ -1359,7 +1359,7 @@ static void mgsl_isr_io_pin( struct mgsl_struct *info )
}
}
- if ( (info->port.flags & ASYNC_CTS_FLOW) &&
+ if (tty_port_cts_enabled(&info->port) &&
(status & MISCSTATUS_CTS_LATCHED) ) {
if (info->port.tty->hw_stopped) {
if (status & MISCSTATUS_CTS) {
diff --git a/drivers/tty/synclink_gt.c b/drivers/tty/synclink_gt.c
index 45f6136..b38e954 100644
--- a/drivers/tty/synclink_gt.c
+++ b/drivers/tty/synclink_gt.c
@@ -2053,7 +2053,7 @@ static void cts_change(struct slgt_info *info, unsigned short status)
wake_up_interruptible(&info->event_wait_q);
info->pending_bh |= BH_STATUS;
- if (info->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&info->port)) {
if (info->port.tty) {
if (info->port.tty->hw_stopped) {
if (info->signals & SerialSignal_CTS) {
diff --git a/drivers/tty/synclinkmp.c b/drivers/tty/synclinkmp.c
index 53429c8..f17d9f3 100644
--- a/drivers/tty/synclinkmp.c
+++ b/drivers/tty/synclinkmp.c
@@ -2500,7 +2500,7 @@ static void isr_io_pin( SLMP_INFO *info, u16 status )
}
}
- if ( (info->port.flags & ASYNC_CTS_FLOW) &&
+ if (tty_port_cts_enabled(&info->port) &&
(status & MISCSTATUS_CTS_LATCHED) ) {
if ( info->port.tty ) {
if (info->port.tty->hw_stopped) {
diff --git a/include/linux/serial.h b/include/linux/serial.h
index 90e9f98..154dc94 100644
--- a/include/linux/serial.h
+++ b/include/linux/serial.h
@@ -11,6 +11,7 @@
#define _LINUX_SERIAL_H
#include <linux/types.h>
+#include <linux/tty.h>
#ifdef __KERNEL__
#include <asm/page.h>
@@ -218,6 +219,12 @@ struct serial_rs485 {
are a royal PITA .. */
};
+/* If the cts flow control is enabled, return true. */
+static inline bool tty_port_cts_enabled(struct tty_port *port)
+{
+ return port->flags & ASYNC_CTS_FLOW;
+}
+
#ifdef __KERNEL__
#include <linux/compiler.h>
diff --git a/net/irda/ircomm/ircomm_tty.c b/net/irda/ircomm/ircomm_tty.c
index 9668990..95a3a7a 100644
--- a/net/irda/ircomm/ircomm_tty.c
+++ b/net/irda/ircomm/ircomm_tty.c
@@ -1070,7 +1070,7 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
goto put;
}
}
- if (tty && self->port.flags & ASYNC_CTS_FLOW) {
+ if (tty && tty_port_cts_enabled(&self->port)) {
if (tty->hw_stopped) {
if (status & IRCOMM_CTS) {
IRDA_DEBUG(2,
@@ -1313,7 +1313,7 @@ static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
seq_puts(m, "Flags:");
sep = ' ';
- if (self->port.flags & ASYNC_CTS_FLOW) {
+ if (tty_port_cts_enabled(&self->port)) {
seq_printf(m, "%cASYNC_CTS_FLOW", sep);
sep = '|';
}
diff --git a/net/irda/ircomm/ircomm_tty_attach.c b/net/irda/ircomm/ircomm_tty_attach.c
index 3ab70e7..edab393 100644
--- a/net/irda/ircomm/ircomm_tty_attach.c
+++ b/net/irda/ircomm/ircomm_tty_attach.c
@@ -578,7 +578,7 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
* will have to wait for the peer device (DCE) to raise the CTS
* line.
*/
- if ((self->port.flags & ASYNC_CTS_FLOW) &&
+ if (tty_port_cts_enabled(&self->port) &&
((self->settings.dce & IRCOMM_CTS) == 0)) {
IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ );
goto put;
--
1.7.4.4
^ permalink raw reply related
* Re: [PATCH] serial: add a new helper function
From: Huang Shijie @ 2012-08-19 7:00 UTC (permalink / raw)
To: Greg KH; +Cc: alan, jirislaby, linux-kernel, linux-serial, netdev
In-Reply-To: <20120819064429.GA3252@kroah.com>
On Sun, Aug 19, 2012 at 2:44 AM, Greg KH <gregkh@linuxfoundation.org> wrote:
> On Sun, Aug 19, 2012 at 02:27:12PM -0400, Huang Shijie wrote:
>> --- a/include/linux/tty.h
>> +++ b/include/linux/tty.h
>> @@ -43,6 +43,7 @@
>> #include <linux/tty_driver.h>
>> #include <linux/tty_ldisc.h>
>> #include <linux/mutex.h>
>> +#include <linux/serial.h>
>>
>>
>>
>> @@ -513,6 +514,12 @@ static inline struct tty_port *tty_port_get(struct tty_port *port)
>> return port;
>> }
>>
>> +/* If the cts flow control is enabled, return true. */
>> +static inline bool tty_port_cts_enabled(struct tty_port *port)
>> +{
>> + return port->flags & ASYNC_CTS_FLOW;
>> +}
>> +
>
> The fact that you have to add serial.h to this file kind of implies that
> this function shouldn't be here, right?
>
> How about serial.h instead? Not all tty drivers are serial drivers :)
OK.
thanks for so quick review.
Huang Shijie
>
> greg k-h
^ permalink raw reply
* Re: [PATCH] serial: add a new helper function
From: Greg KH @ 2012-08-19 6:44 UTC (permalink / raw)
To: Huang Shijie; +Cc: alan, jirislaby, linux-kernel, linux-serial, netdev
In-Reply-To: <1345400832-23572-1-git-send-email-shijie8@gmail.com>
On Sun, Aug 19, 2012 at 02:27:12PM -0400, Huang Shijie wrote:
> --- a/include/linux/tty.h
> +++ b/include/linux/tty.h
> @@ -43,6 +43,7 @@
> #include <linux/tty_driver.h>
> #include <linux/tty_ldisc.h>
> #include <linux/mutex.h>
> +#include <linux/serial.h>
>
>
>
> @@ -513,6 +514,12 @@ static inline struct tty_port *tty_port_get(struct tty_port *port)
> return port;
> }
>
> +/* If the cts flow control is enabled, return true. */
> +static inline bool tty_port_cts_enabled(struct tty_port *port)
> +{
> + return port->flags & ASYNC_CTS_FLOW;
> +}
> +
The fact that you have to add serial.h to this file kind of implies that
this function shouldn't be here, right?
How about serial.h instead? Not all tty drivers are serial drivers :)
greg k-h
^ permalink raw reply
* Re: [PATCH] [media] winbond-cir: Fix initialization
From: David Härdeman @ 2012-08-18 22:46 UTC (permalink / raw)
To: Sean Young
Cc: Mauro Carvalho Chehab, Jarod Wilson, Alan Cox, linux-media,
linux-serial, lirc-list, greg
In-Reply-To: <1343731023-9822-1-git-send-email-sean@mess.org>
On Tue, Jul 31, 2012 at 11:37:03AM +0100, Sean Young wrote:
>The serial driver will detect the winbond cir device as a serial port,
>since it looks exactly like a serial port unless you know what it is
>from the PNP ID.
>
>Winbond CIR 00:04: Region 0x2f8-0x2ff already in use!
>Winbond CIR 00:04: disabled
>Winbond CIR: probe of 00:04 failed with error -16
The proposed solution means that a serial port will show up and then
automagically disappear (potentially) during boot, which isn't very
elegant.
When I discussed this a long time ago with Alan Cox (while he was still
the serial maintainer) I got the feeling that he was advocating
implementing a PNP ID based blacklist in the serial driver (apologies to
Alan if I misrepresented him now).
That seems to be a better solution (one that I never got around to
implementing myself).
>
>Signed-off-by: Sean Young <sean@mess.org>
>---
> drivers/media/rc/winbond-cir.c | 21 ++++++++++++++++++++-
> drivers/tty/serial/8250/8250.c | 1 +
> 2 files changed, 21 insertions(+), 1 deletion(-)
(BTW, I'm on vacation with sporadic Internet access for two more weeks,
and when I return I'll be spending most of my spare time moving in to a
new apartment, expect slow turnaround times for replying to emails).
^ permalink raw reply
* hii
From: sonia @ 2012-08-18 17:35 UTC (permalink / raw)
To: sonialife2
Hello my dear
How was your living life today i hope all is well, am Sonia by name i just
went into your profile at this site linux-archive.org and saw how you have
pest
your explanation over it i feel to know who your are so that we can shear one
thing or the
other from there i can send you my photo you can know who am ok . i am waiting
for your reply yours Sonia
^ permalink raw reply
* [PATCH 2/2] tty: serial: Remove explicit use of devm_kfree
From: Emil Goode @ 2012-08-18 16:12 UTC (permalink / raw)
To: alan, gregkh; +Cc: linux-serial, linux-kernel, kernel-janitors, Emil Goode
In-Reply-To: <1345306369-10407-1-git-send-email-emilgoode@gmail.com>
There is no reason to explicitly call devm_kfree
in probe or remove functions.
Signed-off-by: Emil Goode <emilgoode@gmail.com>
---
drivers/tty/serial/max310x.c | 3 ---
1 file changed, 3 deletions(-)
diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
index 06ff5ad..2bc28a5 100644
--- a/drivers/tty/serial/max310x.c
+++ b/drivers/tty/serial/max310x.c
@@ -1198,7 +1198,6 @@ err_freq:
err_out:
dev_set_drvdata(dev, NULL);
- devm_kfree(dev, s);
return ret;
}
@@ -1234,8 +1233,6 @@ static int __devexit max310x_remove(struct spi_device *spi)
if (s->pdata->exit)
s->pdata->exit();
- devm_kfree(dev, s);
-
return ret;
}
--
1.7.10.4
^ permalink raw reply related
* [PATCH 1/2] tty: serial: Check return code of gpiochip_remove
From: Emil Goode @ 2012-08-18 16:12 UTC (permalink / raw)
To: alan, gregkh; +Cc: linux-serial, linux-kernel, kernel-janitors, Emil Goode
The gpiochip_remove function may fail to remove a gpio_chip
if any GPIOs are still requested. This patch informs the caller
of such a senario.
Sparse is warning because the function prototype has a
__must_check annotation.
Sparse warning:
drivers/tty/serial/max310x.c:1223:18: warning:
ignoring return value of ‘gpiochip_remove’,
declared with attribute warn_unused_result
[-Wunused-result]
Signed-off-by: Emil Goode <emilgoode@gmail.com>
---
drivers/tty/serial/max310x.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
index 534e448..06ff5ad 100644
--- a/drivers/tty/serial/max310x.c
+++ b/drivers/tty/serial/max310x.c
@@ -1207,6 +1207,7 @@ static int __devexit max310x_remove(struct spi_device *spi)
{
struct device *dev = &spi->dev;
struct max310x_port *s = dev_get_drvdata(dev);
+ int ret = 0;
dev_dbg(dev, "Removing port\n");
@@ -1219,8 +1220,11 @@ static int __devexit max310x_remove(struct spi_device *spi)
uart_unregister_driver(&s->uart);
#ifdef CONFIG_GPIOLIB
- if (s->pdata->gpio_base)
- gpiochip_remove(&s->gpio);
+ if (s->pdata->gpio_base) {
+ ret = gpiochip_remove(&s->gpio);
+ if (ret)
+ dev_err(dev, "Failed to remove gpio chip: %d\n", ret);
+ }
#endif
dev_set_drvdata(dev, NULL);
@@ -1232,7 +1236,7 @@ static int __devexit max310x_remove(struct spi_device *spi)
devm_kfree(dev, s);
- return 0;
+ return ret;
}
static const struct spi_device_id max310x_id_table[] = {
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related
* Re: [PATCHv3 1/1] [RFC] uartclk from serial_core exposed to sysfs
From: Tomas Hlavacek @ 2012-08-17 20:25 UTC (permalink / raw)
To: Greg KH; +Cc: Marek Vasut, alan, linux-serial, linux-kernel
In-Reply-To: <20120817190114.GA31011@kroah.com>
Hello!
On Fri, Aug 17, 2012 at 9:01 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> On Fri, Aug 17, 2012 at 08:44:14PM +0200, Marek Vasut wrote:
>> Dear Greg KH,
>>
>> > On Fri, Aug 17, 2012 at 06:30:36PM +0200, Tomas Hlavacek wrote:
>> > > Hello Greg!
>> > >
>> > > On Fri, Aug 17, 2012 at 5:06 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
>> > > >> @@ -2355,6 +2373,14 @@ int uart_add_one_port(struct uart_driver *drv,
>> > > >> struct uart_port *uport)
>> > > >>
>> > > >> }
>> > > >>
>> > > >> /*
>> > > >>
>> > > >> + * Expose uartclk in sysfs. Use driverdata of the tty device for
>> > > >> + * referencing the UART port.
>> > > >> + */
>> > > >> + dev_set_drvdata(tty_dev, port);
>> > > >> + if (device_create_file(tty_dev, &dev_attr_uartclk) < 0)
>> > > >> + dev_err(tty_dev, "Failed to add uartclk attr\n");
>> > > >
>> > > > I think you just raced with userspace in creating the file after the
>> > > > device was announced to userspace. Are you sure it's ok?
>> > > >
>> > > > If not (hint, I don't think so), please make it a default attribute of
>> > > > the device, which will then cause the file to be created before it is
>> > > > announced to userspace. It will also be less code as you don't have to
>> > > > clean it up by hand :)
>> > >
>> > > Do you mean I should modify the tty_register_device() function not to
>> > > use device_create() but it should rather do the device initialization
>> > > on it's own.
>> >
>> > No, not at all.
>> >
>> > > And I should add add the attribute (via struct attribute_group) to
>> > > struct device in between device_initialize() and device_add() calls.
>> > > Did I get it right?
>> >
>> > No, make this a driver attribute, that way when the device is
>> > registered, it adds the attribute automagically to the device that is
>> > bound to it.
>>
>> (hint, DEVICE_ATTR), right ?
>
> No, that's just a macro that creates the structure for the attribute.
> You need to take that structure and tie it to the driver itself, using
> the struct device_driver->groups; field.
Please forgive me my ignorance, but I am lost in this. I tried to read
through the serial_core and tty_io.c over and over to figure out how
the drivers are registered and where could I hook the driver
initialization for all UART ports, but I do not get it.
And there is another thing I am confused of: Should I use macro
DEVICE_ATTR or DRIVER_ATTR? There is a different signature of
callbacks in case of DRIVER_ATTR and I do not know how to find out
from struct device_driver which particular UART port it is associated
to? (Is it indeed associated with one particular port?) Value uartclk
could be, AFAIK, different on each port of the same chip and therefore
I need to know which particular TTY device I want to operate on. More
precisely, I have to get to proper struct uart_state associated with
the particular port.
Thanks,
Tomas
--
Tomáš Hlaváček <tmshlvck@gmail.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCHv3 1/1] [RFC] uartclk from serial_core exposed to sysfs
From: Greg KH @ 2012-08-17 19:01 UTC (permalink / raw)
To: Marek Vasut; +Cc: Tomas Hlavacek, alan, linux-serial, linux-kernel
In-Reply-To: <201208172044.14868.marek.vasut@gmail.com>
On Fri, Aug 17, 2012 at 08:44:14PM +0200, Marek Vasut wrote:
> Dear Greg KH,
>
> > On Fri, Aug 17, 2012 at 06:30:36PM +0200, Tomas Hlavacek wrote:
> > > Hello Greg!
> > >
> > > On Fri, Aug 17, 2012 at 5:06 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> > > >> @@ -2355,6 +2373,14 @@ int uart_add_one_port(struct uart_driver *drv,
> > > >> struct uart_port *uport)
> > > >>
> > > >> }
> > > >>
> > > >> /*
> > > >>
> > > >> + * Expose uartclk in sysfs. Use driverdata of the tty device for
> > > >> + * referencing the UART port.
> > > >> + */
> > > >> + dev_set_drvdata(tty_dev, port);
> > > >> + if (device_create_file(tty_dev, &dev_attr_uartclk) < 0)
> > > >> + dev_err(tty_dev, "Failed to add uartclk attr\n");
> > > >
> > > > I think you just raced with userspace in creating the file after the
> > > > device was announced to userspace. Are you sure it's ok?
> > > >
> > > > If not (hint, I don't think so), please make it a default attribute of
> > > > the device, which will then cause the file to be created before it is
> > > > announced to userspace. It will also be less code as you don't have to
> > > > clean it up by hand :)
> > >
> > > Do you mean I should modify the tty_register_device() function not to
> > > use device_create() but it should rather do the device initialization
> > > on it's own.
> >
> > No, not at all.
> >
> > > And I should add add the attribute (via struct attribute_group) to
> > > struct device in between device_initialize() and device_add() calls.
> > > Did I get it right?
> >
> > No, make this a driver attribute, that way when the device is
> > registered, it adds the attribute automagically to the device that is
> > bound to it.
>
> (hint, DEVICE_ATTR), right ?
No, that's just a macro that creates the structure for the attribute.
You need to take that structure and tie it to the driver itself, using
the struct device_driver->groups; field.
greg k-h
^ permalink raw reply
* Re: [PATCHv3 1/1] [RFC] uartclk from serial_core exposed to sysfs
From: Marek Vasut @ 2012-08-17 18:44 UTC (permalink / raw)
To: Greg KH; +Cc: Tomas Hlavacek, alan, linux-serial, linux-kernel
In-Reply-To: <20120817165446.GA12361@kroah.com>
Dear Greg KH,
> On Fri, Aug 17, 2012 at 06:30:36PM +0200, Tomas Hlavacek wrote:
> > Hello Greg!
> >
> > On Fri, Aug 17, 2012 at 5:06 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> > >> @@ -2355,6 +2373,14 @@ int uart_add_one_port(struct uart_driver *drv,
> > >> struct uart_port *uport)
> > >>
> > >> }
> > >>
> > >> /*
> > >>
> > >> + * Expose uartclk in sysfs. Use driverdata of the tty device for
> > >> + * referencing the UART port.
> > >> + */
> > >> + dev_set_drvdata(tty_dev, port);
> > >> + if (device_create_file(tty_dev, &dev_attr_uartclk) < 0)
> > >> + dev_err(tty_dev, "Failed to add uartclk attr\n");
> > >
> > > I think you just raced with userspace in creating the file after the
> > > device was announced to userspace. Are you sure it's ok?
> > >
> > > If not (hint, I don't think so), please make it a default attribute of
> > > the device, which will then cause the file to be created before it is
> > > announced to userspace. It will also be less code as you don't have to
> > > clean it up by hand :)
> >
> > Do you mean I should modify the tty_register_device() function not to
> > use device_create() but it should rather do the device initialization
> > on it's own.
>
> No, not at all.
>
> > And I should add add the attribute (via struct attribute_group) to
> > struct device in between device_initialize() and device_add() calls.
> > Did I get it right?
>
> No, make this a driver attribute, that way when the device is
> registered, it adds the attribute automagically to the device that is
> bound to it.
(hint, DEVICE_ATTR), right ?
> Does that make sense?
>
> greg k-h
Best regards,
Marek Vasut
^ permalink raw reply
* [GIT PATCH] Serial fixes for 3.6-rc3
From: Greg KH @ 2012-08-17 18:10 UTC (permalink / raw)
To: Linus Torvalds, Alan Cox, Jiri Slaby
Cc: Andrew Morton, linux-kernel, linux-serial
The following changes since commit 0d7614f09c1ebdbaa1599a5aba7593f147bf96ee:
Linux 3.6-rc1 (2012-08-02 16:38:10 -0700)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git/ tags/tty-3.6-rc3
for you to fetch changes up to 38f8eefccf3a23c4058a570fa2938a4f553cf8e0:
pmac_zilog,kdb: Fix console poll hook to return instead of loop (2012-08-16 12:20:20 -0700)
----------------------------------------------------------------
TTY fixes for 3.6-rc3
Here are 4 tiny patches, each fixing a serial driver problem that people
have reported.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----------------------------------------------------------------
Alexander Shiyan (1):
serial: Change Kconfig entry for CLPS711X-target
Fengguang Wu (1):
serial: ifx6x60: fix paging fault on spi_register_driver
Huang Shijie (1):
serial: mxs-auart: fix the wrong RTS hardware flow control
Jason Wessel (1):
pmac_zilog,kdb: Fix console poll hook to return instead of loop
drivers/tty/serial/Kconfig | 10 +++++-----
drivers/tty/serial/ifx6x60.c | 2 +-
drivers/tty/serial/mxs-auart.c | 14 +++++++++-----
drivers/tty/serial/pmac_zilog.c | 12 +++++++++---
4 files changed, 24 insertions(+), 14 deletions(-)
^ permalink raw reply
* Re: [PATCHv3 1/1] [RFC] uartclk from serial_core exposed to sysfs
From: Greg KH @ 2012-08-17 16:54 UTC (permalink / raw)
To: Tomas Hlavacek; +Cc: alan, linux-serial, linux-kernel, marek.vasut
In-Reply-To: <CAEB7QLBEdNArtKz9zP7R4Za54049jJqCEqhPvE6rS59j1tD0PQ@mail.gmail.com>
On Fri, Aug 17, 2012 at 06:30:36PM +0200, Tomas Hlavacek wrote:
> Hello Greg!
>
> On Fri, Aug 17, 2012 at 5:06 PM, Greg KH <gregkh@linuxfoundation.org> wrote:
> >> @@ -2355,6 +2373,14 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
> >> }
> >>
> >> /*
> >> + * Expose uartclk in sysfs. Use driverdata of the tty device for
> >> + * referencing the UART port.
> >> + */
> >> + dev_set_drvdata(tty_dev, port);
> >> + if (device_create_file(tty_dev, &dev_attr_uartclk) < 0)
> >> + dev_err(tty_dev, "Failed to add uartclk attr\n");
> >
> > I think you just raced with userspace in creating the file after the
> > device was announced to userspace. Are you sure it's ok?
> >
> > If not (hint, I don't think so), please make it a default attribute of
> > the device, which will then cause the file to be created before it is
> > announced to userspace. It will also be less code as you don't have to
> > clean it up by hand :)
>
> Do you mean I should modify the tty_register_device() function not to
> use device_create() but it should rather do the device initialization
> on it's own.
No, not at all.
> And I should add add the attribute (via struct attribute_group) to
> struct device in between device_initialize() and device_add() calls.
> Did I get it right?
No, make this a driver attribute, that way when the device is
registered, it adds the attribute automagically to the device that is
bound to it.
Does that make sense?
greg k-h
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox