diff options
author | Rabin Vincent <rabin.vincent@stericsson.com> | 2012-01-31 14:36:37 +0530 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@stericsson.com> | 2012-05-22 11:01:35 +0200 |
commit | dd49b5972e691ab15a15d518abc2196c0f8d8eb9 (patch) | |
tree | 227d1f720c73300717a9b97a7ab1aa0ddc1ff891 | |
parent | 95bf79961b622ea2e6854139cf0b00b36241d785 (diff) |
tty: serial: amba-pl011: use pm_runtime_irq_safe()
PL011 should use pm_runtime_irq_safe() since it calls the pm_runtime routines
with interrupts disabled.
Found via lockdep:
=================================
[ INFO: inconsistent lock state ]
3.0.8+ #1187
---------------------------------
inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage.
kworker/u:0/5 [HC0[0]:SC0[0]:HE1:SE1] takes:
(&port_lock_key){?.....}, at: [<c03ca23c>] pl011_clock_on+0xc/0xc4
{IN-HARDIRQ-W} state was registered at:
[<c01fc734>] mark_irqflags+0x68/0x170
[<c01ff788>] __lock_acquire+0x598/0x788
[<c01fff84>] lock_acquire+0x10c/0x130
[<c06513cc>] _raw_spin_lock_irqsave+0x5c/0x98
[<c03cb788>] pl011_int+0x10/0x128
[<c0217a80>] handle_irq_event_percpu+0x98/0x1f4
[<c0217c18>] handle_irq_event+0x3c/0x5c
[<c021a0f4>] handle_fasteoi_irq+0xc8/0x100
[<c02175e4>] generic_handle_irq+0x28/0x30
[<c0197078>] asm_do_IRQ+0x78/0xb8
[<c019cc90>] __irq_svc+0x50/0xf4
[<c0651e44>] _raw_spin_unlock_irq+0x28/0x54
[<c03c7394>] uart_carrier_raised+0x3c/0x44
[<c03c486c>] tty_port_carrier_raised+0x1c/0x20
[<c03c4d6c>] tty_port_block_til_ready+0x220/0x2cc
[<c03bf2b0>] tty_open+0x1f0/0x32c
[<c0273580>] chrdev_open+0x20c/0x238
[<c026e874>] __dentry_open+0x220/0x338
[<c026ea44>] nameidata_to_filp+0x50/0x5c
[<c027c670>] do_last+0x43c/0x4c4
[<c027d480>] path_openat+0xb8/0x37c
[<c027d824>] do_filp_open+0x30/0x7c
[<c026e594>] do_sys_open+0xd8/0x170
[<c019d240>] ret_fast_syscall+0x0/0x3c
irq event stamp: 60637
hardirqs last enabled at (60636): [<c0650558>] mutex_lock_nested+0x364/0x3c8
hardirqs last disabled at (60637): [<c065138c>] _raw_spin_lock_irqsave+0x1c/0x98
softirqs last enabled at (60509): [<c01d05b8>] irq_exit+0x5c/0xc0
softirqs last disabled at (60490): [<c01d05b8>] irq_exit+0x5c/0xc0
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(&port_lock_key);
<Interrupt>
lock(&port_lock_key);
*** DEADLOCK ***
7 locks held by kworker/u:0/5:
#0: ((hdev->name)){.+.+.+}, at: [<c01e242c>] process_one_work+0x1cc/0x4c8
#1: ((&hdev->power_on)){+.+.+.}, at: [<c01e242c>] process_one_work+0x1cc/0x4c8
#2: (&hdev->req_lock){+.+.+.}, at: [<c05f51e8>] hci_dev_open+0x28/0x334
#3: (&main_info->man_mutex#2){+.+.+.}, at: [<c04d5f10>] cg2900_open+0xa8/0x49c
#4: (&(uart_info->sleep_state_lock)){+.+.+.}, at: [<c04dd648>] uart_set_chip_power+0x64/0x228
#5: (&tty->termios_mutex){+.+...}, at: [<c04de6cc>] cg2900_hci_uart_set_baudrate+0x34/0x8c
#6: (&port_lock_key){?.....}, at: [<c03ca23c>] pl011_clock_on+0xc/0xc4
stack backtrace:
[<c01a36ac>] (unwind_backtrace+0x0/0xec) from [<c01fc014>] (print_usage_bug+0x184/0x1c4)
[<c01fc014>] (print_usage_bug+0x184/0x1c4) from [<c01fc110>] (mark_lock_irq+0xbc/0x280)
[<c01fc110>] (mark_lock_irq+0xbc/0x280) from [<c01fc59c>] (mark_lock+0x2c8/0x3f8)
[<c01fc59c>] (mark_lock+0x2c8/0x3f8) from [<c01fc898>] (mark_held_locks+0x5c/0x80)
[<c01fc898>] (mark_held_locks+0x5c/0x80) from [<c01fcba8>] (trace_hardirqs_on_caller+0x138/0x18c)
[<c01fcba8>] (trace_hardirqs_on_caller+0x138/0x18c) from [<c0651e40>] (_raw_spin_unlock_irq+0x24/0x54)
[<c0651e40>] (_raw_spin_unlock_irq+0x24/0x54) from [<c03f8df8>] (rpm_callback+0x3c/0x5c)
[<c03f8df8>] (rpm_callback+0x3c/0x5c) from [<c03f9abc>] (rpm_resume+0x2ec/0x3c0)
[<c03f9abc>] (rpm_resume+0x2ec/0x3c0) from [<c03f9e04>] (__pm_runtime_resume+0x48/0x60)
[<c03f9e04>] (__pm_runtime_resume+0x48/0x60) from [<c03ca264>] (pl011_clock_on+0x34/0xc4)
[<c03ca264>] (pl011_clock_on+0x34/0xc4) from [<c03ca34c>] (pl011_set_termios+0x28/0x308)
[<c03ca34c>] (pl011_set_termios+0x28/0x308) from [<c03c76b8>] (uart_change_speed+0x90/0x94)
[<c03c76b8>] (uart_change_speed+0x90/0x94) from [<c03c7724>] (uart_set_termios+0x68/0x1b4)
[<c03c7724>] (uart_set_termios+0x68/0x1b4) from [<c04de710>] (cg2900_hci_uart_set_baudrate+0x78/0x8c)
[<c04de710>] (cg2900_hci_uart_set_baudrate+0x78/0x8c) from [<c04dd6e4>] (uart_set_chip_power+0x100/0x228)
[<c04dd6e4>] (uart_set_chip_power+0x100/0x228) from [<c04d6090>] (cg2900_open+0x228/0x49c)
[<c04d6090>] (cg2900_open+0x228/0x49c) from [<c04dc4b4>] (btcg2900_open+0x84/0x188)
[<c04dc4b4>] (btcg2900_open+0x84/0x188) from [<c05f5254>] (hci_dev_open+0x94/0x334)
[<c05f5254>] (hci_dev_open+0x94/0x334) from [<c05f5508>] (hci_power_on+0x14/0x6c)
[<c05f5508>] (hci_power_on+0x14/0x6c) from [<c01e250c>] (process_one_work+0x2ac/0x4c8)
[<c01e250c>] (process_one_work+0x2ac/0x4c8) from [<c01e29f8>] (worker_thread+0x144/0x234)
[<c01e29f8>] (worker_thread+0x144/0x234) from [<c01e8280>] (kthread+0x80/0x88)
[<c01e8280>] (kthread+0x80/0x88) from [<c019dc88>] (kernel_thread_exit+0x0/0x8)
Change-Id: I8b05184e348656a0d422b5b68267ee03246c6563
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
ST-Ericsson ID: 413918
ST-Ericsson Linux next: NA
ST-Ericsson FOSS-OUT ID: Trivial
Change-Id: Id5a17f56dfa1b1b8c469237be5b9c236ad212137
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/47173
Reviewed-by: QABUILD
Tested-by: Rabin VINCENT <rabin.vincent@stericsson.com>
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Reviewed-by: Rabin VINCENT <rabin.vincent@stericsson.com>
-rw-r--r-- | drivers/tty/serial/amba-pl011.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c index 5bbd97e61ff..bed430df99e 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c @@ -2308,6 +2308,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) amba_set_drvdata(dev, uap); + pm_runtime_irq_safe(&dev->dev); + pl011_clock_control_init(uap); ret = uart_add_one_port(&amba_reg, &uap->port); |