提交 b5eee2fd 编写于 作者: T Thomas Gleixner 提交者: Sascha Hauer

ARM: mxc: Add missing lockdep annotation

The irq_set_wake() function of the gpio irq_chip calls
enable/disable_irq_wake() on the demultiplex interrupt. That leads to
a lockdep warning "INFO: possible recursive locking detected" because
irq_set_type() is called under irq_desc->lock and the *_irq_wake()
calls take irq_desc->lock of the demux interrupt.

Tell lockdep that the gpio irqs are in a different lock class.

Documentation/SubmitChecklist:
 15: All codepaths have been exercised with all lockdep features enabled.

That's a non-optional requirement, AFAICT.
Reported-and-tested-by: NArnaud Patard <arnaud.patard@rtp-net.org>
Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
LAKML-Reference: alpine.LFD.2.00.1104041416290.19945@localhost6.localdomain6
Signed-off-by: NUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: NSascha Hauer <s.hauer@pengutronix.de>
上级 0575b4b8
...@@ -295,6 +295,12 @@ static int mxc_gpio_direction_output(struct gpio_chip *chip, ...@@ -295,6 +295,12 @@ static int mxc_gpio_direction_output(struct gpio_chip *chip,
return 0; return 0;
} }
/*
* This lock class tells lockdep that GPIO irqs are in a different
* category than their parents, so it won't report false recursion.
*/
static struct lock_class_key gpio_lock_class;
int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt)
{ {
int i, j; int i, j;
...@@ -311,6 +317,7 @@ int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) ...@@ -311,6 +317,7 @@ int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt)
__raw_writel(~0, port[i].base + GPIO_ISR); __raw_writel(~0, port[i].base + GPIO_ISR);
for (j = port[i].virtual_irq_start; for (j = port[i].virtual_irq_start;
j < port[i].virtual_irq_start + 32; j++) { j < port[i].virtual_irq_start + 32; j++) {
irq_set_lockdep_class(j, &gpio_lock_class);
irq_set_chip_and_handler(j, &gpio_irq_chip, irq_set_chip_and_handler(j, &gpio_irq_chip,
handle_level_irq); handle_level_irq);
set_irq_flags(j, IRQF_VALID); set_irq_flags(j, IRQF_VALID);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册