Skip to contentSkip to conversation

Patch "gpio: do not double-check direction on sleeping chips" has been added to the 4.8-stable tree

PATCH [email protected] 1 participant 1 message Nov 21, 2016

Subsystems (2)
lore
Share & tools
lore

[email protected]

author maintainer Applied
#0 lore raw

This is a note to let you know that I've just added the patch titled

gpio: do not double-check direction on sleeping chips

to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
gpio-do-not-double-check-direction-on-sleeping-chips.patch
and it can be found in the queue-4.8 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.

Quoted 1 line

From 60f8339eb388df8a46f8eb4282ff0e15f08f218c Mon Sep 17 00:00:00 2001

From: Linus Walleij <[email protected]>
Date: Sat, 12 Nov 2016 15:01:09 +0100
Subject: gpio: do not double-check direction on sleeping chips

From: Linus Walleij <[email protected]>

commit 60f8339eb388df8a46f8eb4282ff0e15f08f218c upstream.

When locking a GPIO line as IRQ, we go to lengths to double-check that the line is really set as input before marking it as used for IRQ. This is not good on GPIO chips that can sleep, because this function is called in IRQ-safe context. Just skip this if it can't be checked quickly.

Currently this happens on sleeping expanders such as STMPE or TC3589x:

BUG: scheduling while atomic: swapper/1/0x00000002
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Not tainted 4.9.0-rc1+ #38
Hardware name: Nomadik STn8815
[<c000f2e0>] (unwind_backtrace) from [<c000d244>] (show_stack+0x10/0x14)
[<c000d244>] (show_stack) from [<c0037b78>] (__schedule_bug+0x54/0x80)
[<c0037b78>] (__schedule_bug) from [<c042df14>] (__schedule+0x3a0/0x460)
[<c042df14>] (__schedule) from [<c042e028>] (schedule+0x54/0xb8)

(...)

This patch fixes that problem and relies on the direction read from the chip when it was added.

Fixes 9c10280d85c1 ("gpio: flush direction status in gpiochip_lock_as_irq()")
Cc Patrice Chotard <[email protected]>
---
 drivers/gpio/gpiolib.c |    7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/gpio/gpiolib.c +5 -2
@@ -2667,8 +2667,11 @@ int gpiochip_lock_as_irq(struct gpio_chi
 	if (IS_ERR(desc))
 		return PTR_ERR(desc);
 
-	/* Flush direction if something changed behind our back */
-	if (chip->get_direction) {
+	/*
+	 * If it's fast: flush the direction setting if something changed
+	 * behind our back
+	 */
+	if (!chip->can_sleep && chip->get_direction) {
 		int dir = chip->get_direction(chip, offset);
 
 		if (dir)

Patches currently in stable-queue which might be from [email protected] are

queue-4.8/gpio-do-not-double-check-direction-on-sleeping-chips.patch queue-4.8/mfd-stmpe-fix-reset-regression-on-stmpe2401.patch queue-4.8/i2c-mux-fix-up-dependencies.patch