summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRabin Vincent <rabin.vincent@stericsson.com>2012-01-31 14:36:37 +0530
committerPhilippe Langlais <philippe.langlais@stericsson.com>2012-05-22 11:01:35 +0200
commitdd49b5972e691ab15a15d518abc2196c0f8d8eb9 (patch)
tree227d1f720c73300717a9b97a7ab1aa0ddc1ff891
parent95bf79961b622ea2e6854139cf0b00b36241d785 (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.c2
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);