linux/drivers/pinctrl
Mika Westerberg 78e1c89693 pinctrl: baytrail: Use raw_spinlock for locking
The Intel Baytrail pinctrl driver implements irqchip callbacks which are
called with desc->lock raw_spinlock held. In mainline this is fine because
spinlock resolves to raw_spinlock. However, running the same code in -rt we
get:

 BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:917
 in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper/0
 Preemption disabled at:[<ffffffff81092e9f>] cpu_startup_entry+0x17f/0x480

 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.1.5-rt5 #13
  ...
 Call Trace:
  <IRQ>  [<ffffffff816283c6>] dump_stack+0x4a/0x61
  [<ffffffff81077e17>] ___might_sleep+0xe7/0x170
  [<ffffffff8162d6cf>] rt_spin_lock+0x1f/0x50
  [<ffffffff812e3b88>] byt_gpio_clear_triggering+0x38/0x60
  [<ffffffff812e3bc1>] byt_irq_mask+0x11/0x20
  [<ffffffff810a7013>] handle_level_irq+0x83/0x150
  [<ffffffff810a3457>] generic_handle_irq+0x27/0x40
  [<ffffffff812e3a5f>] byt_gpio_irq_handler+0x7f/0xc0
  [<ffffffff810050aa>] handle_irq+0xaa/0x190
  ...

This is because in -rt spinlocks are preemptible so taking the driver
private spinlock in irqchip callbacks causes might_sleep() to trigger.

In order to keep -rt happy but at the same time make sure that register
accesses get serialized, convert the driver to use raw_spinlock instead.

Also shorten the critical section a bit in few places.

Suggested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2015-08-26 09:25:33 +02:00
..
bcm pinctrl: kill off set_irq_flags usage 2015-07-28 12:15:19 +02:00
berlin ARM: SoC: driver updates for v4.2 2015-06-26 11:54:29 -07:00
freescale pinctrl: imx6ul: Remove .owner field 2015-08-25 16:29:06 +02:00
intel pinctrl: baytrail: Use raw_spinlock for locking 2015-08-26 09:25:33 +02:00
mediatek pinctrl/mediatek: fix spelling mistake in dev_err error message 2015-08-13 14:17:36 +02:00
meson Here is the bulk of pin control changes for the v4.2 series: 2015-06-24 19:21:02 -07:00
mvebu Here is the bulk of pin control changes for the v4.2 series: 2015-06-24 19:21:02 -07:00
nomadik pinctrl: nomadik: reflect current input value 2015-08-11 17:12:57 +02:00
qcom pinctrl/qcom/msm: Prepare msm_gpio_irq_handler for irq argument removal 2015-07-17 21:56:22 +02:00
samsung pinctrl: kill off set_irq_flags usage 2015-07-28 12:15:19 +02:00
sh-pfc pinctrl: sh-pfc: Implement pinconf power-source param for voltage switching 2015-08-24 10:44:54 +02:00
sirf pinctrl: atlas7: clear ugly branch statements for pull and drivestrength 2015-08-13 14:37:21 +02:00
spear pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
sunxi pinctrl: sun4i: add spdif to pin description. 2015-08-13 16:03:21 +02:00
uniphier pinctrl: UniPhier: PH1-Pro5: add I2C ch6 pin-mux setting 2015-08-13 13:15:05 +02:00
vt8500 pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
core.c pinctrl: use dev_err() to show message in pinctrl_register_one_pin() 2015-07-27 14:43:43 +02:00
core.h pinctrl: Don't just pretend to protect pinctrl_maps, do it for real 2015-05-06 16:24:28 +02:00
devicetree.c pinctrl: simplify of_pinctrl_get() 2015-07-16 09:39:03 +02:00
devicetree.h pinctrl: core device tree mapping table parsing support 2012-04-18 13:53:10 +02:00
Kconfig pinctrl: driver for Conexant Digicolor CX92755 pin mapping 2015-07-27 11:47:25 +02:00
Makefile pinctrl: driver for Conexant Digicolor CX92755 pin mapping 2015-07-27 11:47:25 +02:00
pinconf-generic.c pinctrl: pinconf-generic: add dt node names to error messages 2015-03-27 09:53:10 +01:00
pinconf.c pinctrl: join dev_dbg strings into a single line 2015-08-03 10:13:00 +02:00
pinconf.h pinctrl: pinconf-generic: Allow driver to specify DT params 2015-01-11 22:32:19 +01:00
pinctrl-adi2-bf54x.c pinctrl: pinctrl-adi: combine multiple groups of one function together 2014-02-25 10:49:13 +01:00
pinctrl-adi2-bf60x.c added tabs instead of spaces 2015-07-16 09:39:01 +02:00
pinctrl-adi2.c pinctrl/adi2: Use irq_set_handler_locked() 2015-07-17 21:56:17 +02:00
pinctrl-adi2.h pinctrl: pinctrl-adi: combine multiple groups of one function together 2014-02-25 10:49:13 +01:00
pinctrl-amd.c pinctrl/amd: Prepare amd_gpio_irq_handler for irq argument removal 2015-07-17 21:56:20 +02:00
pinctrl-amd.h Fix inconsistent spinlock of AMD GPIO driver which can be 2015-04-07 11:36:49 +02:00
pinctrl-as3722.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-at91.c pinctrl: Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc 2015-07-17 21:56:20 +02:00
pinctrl-at91.h pinctrl: at91: use own header 2014-10-29 09:28:35 +01:00
pinctrl-coh901.c pinctrl/coh901: Prepare u300_gpio_irq_handler for irq argument removal 2015-07-17 21:56:21 +02:00
pinctrl-coh901.h pinctrl: support pinconfig on the U300 2012-03-12 22:49:03 +01:00
pinctrl-digicolor.c pinctrl: driver for Conexant Digicolor CX92755 pin mapping 2015-07-27 11:47:25 +02:00
pinctrl-falcon.c staging: drivers: pinctrl: Fixed checkpatch.pl warnings 2015-01-21 11:02:26 +01:00
pinctrl-lantiq.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-lantiq.h pinctrl: lantiq: fix include guard #endif comment 2015-03-09 18:10:57 +01:00
pinctrl-lpc18xx.c pinctrl: lpc18xx: add support for usb1 pinconf 2015-07-17 14:23:15 +02:00
pinctrl-palmas.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-pistachio.c pinctrl/pistachio: Prepare pistachio_gpio_irq_handler for irq argument removal 2015-07-17 21:56:21 +02:00
pinctrl-rockchip.c pinctrl: rockchip: only enable gpio clock when it setting 2015-08-13 14:23:26 +02:00
pinctrl-single.c pinctrl: kill off set_irq_flags usage 2015-07-28 12:15:19 +02:00
pinctrl-st.c pinctrl: Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc 2015-07-17 21:56:20 +02:00
pinctrl-tb10x.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-tegra20.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra30.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra114.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra124.c pinctrl: tegra: some bits move between registers 2015-03-09 18:10:58 +01:00
pinctrl-tegra210.c pinctrl: tegra: add a driver for Tegra210 2015-03-09 18:10:59 +01:00
pinctrl-tegra-xusb.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-tegra.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-tegra.h pinctrl: tegra: use signed bitfields for optional fields 2015-03-19 09:20:17 +01:00
pinctrl-tz1090-pdc.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-tz1090.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-u300.c pinctrl: make pinctrl_register() return proper error code 2015-06-10 14:49:52 +02:00
pinctrl-utils.c pinctrl: utils: include export.h to avoid warnings 2013-08-28 15:50:33 +02:00
pinctrl-utils.h pinctrl: add utility functions for add map/configs 2013-08-14 21:00:41 +02:00
pinctrl-xway.c pinctrl: lantiq: remove bogus of_gpio_chip_add 2015-01-14 14:20:46 +01:00
pinctrl-zynq.c pinctrl: zynq: Fix typos in smc0_nand_grp and smc0_nor_grp 2015-08-25 16:21:31 +02:00
pinmux.c pinctrl: use dev_err() to show message in pinmux_func_name_to_selector() 2015-07-27 14:44:33 +02:00
pinmux.h pinctrl: ifdef CONFIG_DEBUG_FS cleanup 2012-04-18 13:53:12 +02:00