linux-uconsole/drivers/gpio
Marek Vasut 83fa27bdb9 gpio: mxs: Allow for recursive enable_irq_wake() call
commit a585f87c86 upstream.

The scenario here is that someone calls enable_irq_wake() from somewhere
in the code. This will result in the lockdep producing a backtrace as can
be seen below. In my case, this problem is triggered when using the wl1271
(TI WlCore) driver found in drivers/net/wireless/ti/ .

The problem cause is rather obvious from the backtrace, but let's outline
the dependency. enable_irq_wake() grabs the IRQ buslock in irq_set_irq_wake(),
which in turns calls mxs_gpio_set_wake_irq() . But mxs_gpio_set_wake_irq()
calls enable_irq_wake() again on the one-level-higher IRQ , thus it tries to
grab the IRQ buslock again in irq_set_irq_wake() . Because the spinlock in
irq_set_irq_wake()->irq_get_desc_buslock()->__irq_get_desc_lock() is not
marked as recursive, lockdep will spew the stuff below.

We know we can safely re-enter the lock, so use IRQ_GC_INIT_NESTED_LOCK to
fix the spew.

 =============================================
 [ INFO: possible recursive locking detected ]
 3.10.33-00012-gf06b763-dirty #61 Not tainted
 ---------------------------------------------
 kworker/0:1/18 is trying to acquire lock:
  (&irq_desc_lock_class){-.-...}, at: [<c00685f0>] __irq_get_desc_lock+0x48/0x88

 but task is already holding lock:
  (&irq_desc_lock_class){-.-...}, at: [<c00685f0>] __irq_get_desc_lock+0x48/0x88

 other info that might help us debug this:
  Possible unsafe locking scenario:

        CPU0
        ----
   lock(&irq_desc_lock_class);
   lock(&irq_desc_lock_class);

  *** DEADLOCK ***

  May be due to missing lock nesting notation

 3 locks held by kworker/0:1/18:
  #0:  (events){.+.+.+}, at: [<c0036308>] process_one_work+0x134/0x4a4
  #1:  ((&fw_work->work)){+.+.+.}, at: [<c0036308>] process_one_work+0x134/0x4a4
  #2:  (&irq_desc_lock_class){-.-...}, at: [<c00685f0>] __irq_get_desc_lock+0x48/0x88

 stack backtrace:
 CPU: 0 PID: 18 Comm: kworker/0:1 Not tainted 3.10.33-00012-gf06b763-dirty #61
 Workqueue: events request_firmware_work_func
 [<c0013eb4>] (unwind_backtrace+0x0/0xf0) from [<c0011c74>] (show_stack+0x10/0x14)
 [<c0011c74>] (show_stack+0x10/0x14) from [<c005bb08>] (__lock_acquire+0x140c/0x1a64)
 [<c005bb08>] (__lock_acquire+0x140c/0x1a64) from [<c005c6a8>] (lock_acquire+0x9c/0x104)
 [<c005c6a8>] (lock_acquire+0x9c/0x104) from [<c051d5a4>] (_raw_spin_lock_irqsave+0x44/0x58)
 [<c051d5a4>] (_raw_spin_lock_irqsave+0x44/0x58) from [<c00685f0>] (__irq_get_desc_lock+0x48/0x88)
 [<c00685f0>] (__irq_get_desc_lock+0x48/0x88) from [<c0068e78>] (irq_set_irq_wake+0x20/0xf4)
 [<c0068e78>] (irq_set_irq_wake+0x20/0xf4) from [<c027260c>] (mxs_gpio_set_wake_irq+0x1c/0x24)
 [<c027260c>] (mxs_gpio_set_wake_irq+0x1c/0x24) from [<c0068cf4>] (set_irq_wake_real+0x30/0x44)
 [<c0068cf4>] (set_irq_wake_real+0x30/0x44) from [<c0068ee4>] (irq_set_irq_wake+0x8c/0xf4)
 [<c0068ee4>] (irq_set_irq_wake+0x8c/0xf4) from [<c0310748>] (wlcore_nvs_cb+0x10c/0x97c)
 [<c0310748>] (wlcore_nvs_cb+0x10c/0x97c) from [<c02be5e8>] (request_firmware_work_func+0x38/0x58)
 [<c02be5e8>] (request_firmware_work_func+0x38/0x58) from [<c0036394>] (process_one_work+0x1c0/0x4a4)
 [<c0036394>] (process_one_work+0x1c0/0x4a4) from [<c0036a4c>] (worker_thread+0x138/0x394)
 [<c0036a4c>] (worker_thread+0x138/0x394) from [<c003cb74>] (kthread+0xa4/0xb0)
 [<c003cb74>] (kthread+0xa4/0xb0) from [<c000ee00>] (ret_from_fork+0x14/0x34)
 wlcore: loaded

Signed-off-by: Marek Vasut <marex@denx.de>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-05-13 13:59:45 +02:00
..
devres.c gpio: export devm_gpio_request_one 2012-07-05 14:49:13 +02:00
gpio-74x164.c gpio: 74x164: use spi_get_drvdata() and spi_set_drvdata() 2013-03-27 16:05:13 +01:00
gpio-adnp.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-adp5520.c gpio: adp5520: use devm_kzalloc() 2013-03-27 16:05:10 +01:00
gpio-adp5588.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-amd8111.c gpio: add a driver for GPIO pins found on AMD-8111 south bridge chips 2012-07-12 13:40:13 +02:00
gpio-arizona.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-bt8xx.c Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media 2012-10-07 17:49:05 +09:00
gpio-clps711x.c GPIO: clps711x: use platform_device_unregister in gpio_clps711x_init() 2012-10-27 18:17:30 +02:00
gpio-cs5535.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-da9052.c This is the MFD patch set for the 3.8 merge window. 2012-12-16 18:55:20 -08:00
gpio-da9055.c Drivers: misc: remove __dev* attributes. 2013-01-03 15:57:16 -08:00
gpio-davinci.c gpio: davinci: preparation for switch to common clock framework 2012-09-01 01:12:01 +02:00
gpio-em.c gpio: em: Make use of devm functions 2013-03-27 16:05:09 +01:00
gpio-ep93xx.c gpio: remove use of __devinit 2012-11-28 11:39:33 -08:00
gpio-ge.c powerpc/85xx: Board support for GE IMP3A 2012-03-16 11:15:48 -05:00
gpio-generic.c GPIO: gpio-generic: remove kfree() from bgpio_remove call 2013-04-11 19:33:54 +02:00
gpio-grgpio.c gpio: grgpio: Add irq support 2013-04-26 08:52:38 +02:00
gpio-ich.c GPIO changes for Linux 3.10 2013-05-06 15:40:55 -07:00
gpio-it8761e.c
gpio-janz-ttl.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-ks8695.c
gpio-langwell.c gpio-langwell: fix irq conflicts when DT is not used 2013-05-20 20:10:22 +02:00
gpio-lpc32xx.c Removal of GENERIC_GPIO for v3.10 2013-05-09 09:59:16 -07:00
gpio-lynxpoint.c gpio/lynxpoint: check if the interrupt is enabled in IRQ handler 2013-11-04 04:31:06 -08:00
gpio-max730x.c Driver core updates for 3.8-rc1 2012-12-11 13:13:55 -08:00
gpio-max732x.c gpio: max732x: use devm_kzalloc() 2013-03-27 16:05:11 +01:00
gpio-max7300.c gpio: max7300: use devm_kzalloc() 2013-03-27 16:05:11 +01:00
gpio-max7301.c MAX7301 GPIO: Do not force SPI speed when using OF Platform 2013-03-27 16:05:18 +01:00
gpio-mc9s08dz60.c gpio: mc9s08dz60: Use devm_kzalloc API 2012-09-01 01:02:27 +02:00
gpio-mc33880.c gpio: mc33880: use spi_get_drvdata() and spi_set_drvdata() 2013-03-27 16:05:14 +01:00
gpio-mcp23s08.c gpio: mcp23s08: convert driver to DT 2013-04-10 23:41:17 +02:00
gpio-ml-ioh.c gpio: Don't override the error code in probe error handling 2013-05-20 20:27:30 +02:00
gpio-mm-lantiq.c GPIO: MIPS: lantiq: convert gpio-mm-lantiq to OF and of_mm_gpio 2012-05-21 14:31:53 +01:00
gpio-mpc8xxx.c powerpc/gpio: Fix the wrong GPIO input data on MPC8572/MPC8536 2013-12-11 22:36:27 -08:00
gpio-mpc5200.c gpio: remove use of __devinit 2012-11-28 11:39:33 -08:00
gpio-msic.c gpio: remove use of __devinit 2012-11-28 11:39:33 -08:00
gpio-msm-v1.c gpio: Make gpio-msm-v1 into a platform driver 2013-03-05 12:05:43 -08:00
gpio-msm-v2.c gpio: msm: Fix irq mask/unmask by writing bits instead of numbers 2014-01-09 12:24:24 -08:00
gpio-mvebu.c gpio: mvebu: make mvchip->irqbase signed for error handling 2013-12-04 10:55:50 -08:00
gpio-mxc.c arm: Move chained_irq_(enter|exit) to a generic file 2013-03-26 16:11:43 +00:00
gpio-mxs.c gpio: mxs: Allow for recursive enable_irq_wake() call 2014-05-13 13:59:45 +02:00
gpio-omap.c gpio/omap: auto-setup a GPIO when used as an IRQ 2013-10-13 16:08:31 -07:00
gpio-palmas.c gpio: palmas: Add support for Palmas GPIO 2013-02-14 00:22:45 +01:00
gpio-pca953x.c GPIO changes for Linux 3.10 2013-05-06 15:40:55 -07:00
gpio-pcf857x.c gpio: pcf857x: use devm_kzalloc() 2013-03-27 16:05:12 +01:00
gpio-pch.c gpio: Don't override the error code in probe error handling 2013-05-20 20:27:30 +02:00
gpio-pl061.c gpio: pl061: move irqdomain initialization 2013-12-04 10:57:20 -08:00
gpio-pxa.c GPIO changes for Linux 3.10 2013-05-06 15:40:55 -07:00
gpio-rc5t583.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-rcar.c gpio-rcar: R-Car GPIO IRQ share interrupt 2014-01-15 15:28:45 -08:00
gpio-rdc321x.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-sa1100.c ARM: 7342/2: sa1100: prepare for sparse irq conversion 2012-03-25 23:57:20 +01:00
gpio-samsung.c GPIO changes for Linux 3.10 2013-05-06 15:40:55 -07:00
gpio-sch.c gpio: Don't override the error code in probe error handling 2013-05-20 20:27:30 +02:00
gpio-sodaville.c gpio: remove use of __devinit 2012-11-28 11:39:33 -08:00
gpio-spear-spics.c gpio: Convert to devm_ioremap_resource() 2013-01-22 11:41:56 -08:00
gpio-sta2x11.c gpio: remove use of __devinit 2012-11-28 11:39:33 -08:00
gpio-stmpe.c gpio: stmpe: pass DT node to irqdomain 2013-03-27 11:21:52 +01:00
gpio-stp-xway.c gpio: gpio-stp-xway.c: fix checkpatch error 2013-03-27 16:05:16 +01:00
gpio-sx150x.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-tc3589x.c gpio: gpio-tc3589x.c: fix checkpatch errors 2013-03-27 16:05:17 +01:00
gpio-tegra.c drivers/gpio: don't check resource with devm_ioremap_resource 2013-05-18 11:55:19 +02:00
gpio-timberdale.c gpio: gpio-timberdale.c: fix checkpatch error 2013-03-27 16:05:17 +01:00
gpio-tnetv107x.c
gpio-tps6586x.c This is the MFD patch set for the 3.8 merge window. 2012-12-16 18:55:20 -08:00
gpio-tps65910.c gpio: gpio-tps65910.c: fix checkpatch error 2013-03-27 16:05:18 +01:00
gpio-tps65912.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-ts5500.c Drivers: misc: remove __dev* attributes. 2013-01-03 15:57:16 -08:00
gpio-twl4030.c gpio: twl4030: Fix regression for twl gpio LED output 2014-01-09 12:24:24 -08:00
gpio-twl6040.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-ucb1400.c mfd: ucb1400: Pass ucb1400-gpio data through ac97 bus 2013-04-19 00:40:07 +02:00
gpio-viperboard.c gpio: Don't override the error code in probe error handling 2013-05-20 20:27:30 +02:00
gpio-vr41xx.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-vx855.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-wm831x.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-wm8350.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-wm8994.c gpio: remove use of __devexit 2012-11-28 11:39:59 -08:00
gpio-xilinx.c gpio: remove use of __devinitdata 2012-11-28 11:39:59 -08:00
gpiolib-acpi.c gpiolib-acpi: introduce acpi_get_gpio_by_index() helper 2013-04-12 00:31:18 +02:00
gpiolib-of.c GPIO changes for Linux 3.10 2013-05-06 15:40:55 -07:00
gpiolib.c gpiolib: move comment to right function 2013-03-02 13:20:20 +00:00
Kconfig gpio: mcp23s08: Fix build error when CONFIG_SPI_MASTER=y && CONFIG_I2C=m 2013-05-20 19:16:16 +02:00
Makefile ARM: arm-soc platform updates for 3.10, part 2 2013-05-07 10:57:51 -07:00