From a0806f9eed23a5d317e8591e06bc3ebffdbd36e8 Mon Sep 17 00:00:00 2001 From: Stephen Boyd Date: Wed, 18 Apr 2012 20:00:23 -0700 Subject: [PATCH] USB: OTG: msm: Fix inconsistent lockdep state warning ================================= [ INFO: inconsistent lock state ] 3.0.21-g51ce160-00021-g8b33780-dirty #2904 --------------------------------- inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} kworker/0:1/32 [HC0[0]:SC0[0]:HE1:SE1] takes: (&irq_desc_lock_class){?.....}, at: [] irq_read_line+0x3c/0x80 {IN-HARDIRQ-W} state was registered at: [] __lock_acquire+0x704/0x9f8 [] lock_acquire+0x10c/0x130 [] _raw_spin_lock+0x44/0x54 [] handle_fasteoi_irq+0x14/0x108 [] generic_handle_irq+0x28/0x3c [] handle_IRQ+0x7c/0xc0 [] gic_handle_irq+0xac/0x104 [] __irq_svc+0x58/0x8c [] default_idle+0x28/0x2c [] cpu_idle+0x8c/0xf4 [] rest_init+0xd8/0x100 [] start_kernel+0x464/0x4d8 [<8020803c>] 0x8020803c other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&irq_desc_lock_class); lock(&irq_desc_lock_class); *** DEADLOCK *** 2 locks held by kworker/0:1/32: #0: (events_nrt){.+.+..}, at: [] process_one_work+0x1f8/0x518 #1: ((&motg->sm_work)){+.+...}, at: [] process_one_work+0x1f8/0x518 stack backtrace: [] (unwind_backtrace+0x0/0x12c) from [] [] (print_usage_bug+0x248/0x2ac) from [] [] (mark_lock+0x3e4/0x6ec) from [] [] (__lock_acquire+0x790/0x9f8) from [] [] (lock_acquire+0x10c/0x130) from [] [] (_raw_spin_lock+0x44/0x54) from [] [] (irq_read_line+0x3c/0x80) from [] [] (msm_otg_sm_work+0x1a0/0x1510) from [] [] (process_one_work+0x2d8/0x518) from [] [] (worker_thread+0x220/0x3a0) from [] [] (kthread+0x88/0x94) from [] Change-Id: I7966d183cad54758508cb9635ebe3f31fba408b9 Signed-off-by: Stephen Boyd --- drivers/usb/otg/msm_otg.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c index 40089adfec0..55a45d9a4c8 100644 --- a/drivers/usb/otg/msm_otg.c +++ b/drivers/usb/otg/msm_otg.c @@ -1995,10 +1995,13 @@ static void msm_otg_init_sm(struct msm_otg *motg) clear_bit(B_SESS_VLD, &motg->inputs); } else if (pdata->otg_control == OTG_PMIC_CONTROL) { if (pdata->pmic_id_irq) { + unsigned long flags; + local_irq_save(flags); if (irq_read_line(pdata->pmic_id_irq)) set_bit(ID, &motg->inputs); else clear_bit(ID, &motg->inputs); + local_irq_restore(flags); } /* * VBUS initial state is reported after PMIC