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