tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

pin-configurable skip of gpio_resume()



Hello

I encoutered this problem with gpio_resume(): it will attemp to restore state 
for all pins, calling xxx_pin_ctl() and xxx_pin_write() for each of them.

The behavior may be harmful if the firmware uses some pins, for instance
to enable/disable other chips. The state we restore may be irrelevant
at resume time, and wreck the system. 

What about this change, so that the underlying GPIO driver can prevent
state resume for some pins?

Index: sys/dev/gpio/gpio.c
===================================================================
RCS file: /cvsroot/src/sys/dev/gpio/gpio.c,v
retrieving revision 1.71
diff -U4 -r1.71 gpio.c
--- sys/dev/gpio/gpio.c	27 Apr 2022 23:15:30 -0000	1.71
+++ sys/dev/gpio/gpio.c	17 Aug 2022 09:59:25 -0000
@@ -147,8 +147,10 @@
 	struct gpio_softc *sc = device_private(self);
 	int pin;
 
 	for (pin = 0; pin < sc->sc_npins; pin++) {
+		if (sc->sc_pins[pin].pin_flags & GPIO_PIN_NORESUME)
+			continue;
 		gpiobus_pin_ctl(sc->sc_gc, pin, sc->sc_pins[pin].pin_flags);
 		gpiobus_pin_write(sc->sc_gc, pin, sc->sc_pins[pin].pin_state);
 	}
 	return true;
cvs diff: Diffing sys/sys
Index: sys/sys/gpio.h
===================================================================
RCS file: /cvsroot/src/sys/sys/gpio.h,v
retrieving revision 1.16
diff -U4 -r1.16 gpio.h
--- sys/sys/gpio.h	19 May 2018 13:59:06 -0000	1.16
+++ sys/sys/gpio.h	17 Aug 2022 09:59:25 -0000
@@ -51,8 +51,9 @@
 #define GPIO_PIN_ALT4		0x00100000	/* alternate function 4 */
 #define GPIO_PIN_ALT5		0x00200000	/* alternate function 5 */
 #define GPIO_PIN_ALT6		0x00400000	/* alternate function 6 */
 #define GPIO_PIN_ALT7		0x00800000	/* alternate function 7 */
+#define GPIO_PIN_NORESUME	0x01000000	/* Do not resume state */
 
 #define	GPIO_PIN_HWCAPS		(GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | \
 				 GPIO_PIN_INOUT | GPIO_PIN_OPENDRAIN | \
 				 GPIO_PIN_PUSHPULL | GPIO_PIN_TRISTATE | \


-- 
Emmanuel Dreyfus
manu%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index