fd2e10fb0fe70036e2a86d91c82683c8edc61ea7
[openwrt.git] / target / linux / ipq806x / patches / 0026-pinctrl-msm-Silence-recursive-lockdep-warning.patch
1 From 9588c91936434166007c3a15ad7f4e2f3729c5e7 Mon Sep 17 00:00:00 2001
2 From: Stephen Boyd <sboyd@codeaurora.org>
3 Date: Thu, 6 Mar 2014 22:44:40 -0800
4 Subject: [PATCH 026/182] pinctrl: msm: Silence recursive lockdep warning
5
6 If a driver calls enable_irq_wake() on a gpio turned interrupt
7 from the msm pinctrl driver we'll get a lockdep warning like so:
8
9 =============================================
10 [ INFO: possible recursive locking detected ]
11 3.14.0-rc3 #2 Not tainted
12 ---------------------------------------------
13 modprobe/52 is trying to acquire lock:
14  (&irq_desc_lock_class){-.....}, at: [<c026aea0>] __irq_get_desc_lock+0x48/0x88
15
16 but task is already holding lock:
17  (&irq_desc_lock_class){-.....}, at: [<c026aea0>] __irq_get_desc_lock+0x48/0x88
18
19 other info that might help us debug this:
20  Possible unsafe locking scenario:
21
22        CPU0
23        ----
24   lock(&irq_desc_lock_class);
25   lock(&irq_desc_lock_class);
26
27  *** DEADLOCK ***
28
29  May be due to missing lock nesting notation
30
31 4 locks held by modprobe/52:
32  #0:  (&__lockdep_no_validate__){......}, at: [<c04f2864>] __driver_attach+0x48/0x98
33  #1:  (&__lockdep_no_validate__){......}, at: [<c04f2874>] __driver_attach+0x58/0x98
34  #2:  (&irq_desc_lock_class){-.....}, at: [<c026aea0>] __irq_get_desc_lock+0x48/0x88
35  #3:  (&(&pctrl->lock)->rlock){......}, at: [<c04bb4b8>] msm_gpio_irq_set_wake+0x20/0xa8
36
37 Silence it by putting the gpios into their own lock class.
38
39 Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
40 Acked-by: Bjorn Andersson <bjorn.andersson@sonymobile.com>
41 Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
42 ---
43  drivers/pinctrl/pinctrl-msm.c |    7 +++++++
44  1 file changed, 7 insertions(+)
45
46 diff --git a/drivers/pinctrl/pinctrl-msm.c b/drivers/pinctrl/pinctrl-msm.c
47 index 0e43fdd..e61b30a 100644
48 --- a/drivers/pinctrl/pinctrl-msm.c
49 +++ b/drivers/pinctrl/pinctrl-msm.c
50 @@ -857,6 +857,12 @@ static void msm_gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
51         chained_irq_exit(chip, desc);
52  }
53  
54 +/*
55 + * This lock class tells lockdep that GPIO irqs are in a different
56 + * category than their parents, so it won't report false recursion.
57 + */
58 +static struct lock_class_key gpio_lock_class;
59 +
60  static int msm_gpio_init(struct msm_pinctrl *pctrl)
61  {
62         struct gpio_chip *chip;
63 @@ -895,6 +901,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
64  
65         for (i = 0; i < chip->ngpio; i++) {
66                 irq = irq_create_mapping(pctrl->domain, i);
67 +               irq_set_lockdep_class(irq, &gpio_lock_class);
68                 irq_set_chip_and_handler(irq, &msm_gpio_irq_chip, handle_edge_irq);
69                 irq_set_chip_data(irq, pctrl);
70         }
71 -- 
72 1.7.10.4
73