pinctrl: baytrail: Use raw_spinlock for locking
commit
78e1c896932df5b8bcdff7bf5417d8e72a4d0d6b upstream.
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>
Cc: Lucas De Marchi <lucas.de.marchi@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>