Yes the patch works on my Orange Pi One (H3). Thank you Mark.
-----Original Message----- From: Mark Kettenis [mailto:mark.kette...@xs4all.nl] Sent: Sunday, November 12, 2017 10:05 AM To: s_g...@telus.net Cc: mark.kette...@xs4all.nl; arm@openbsd.org Subject: Re: sxipio driver changes for Allwinner H3 > From: "Stephen Graf" <s_g...@telus.net> > Date: Tue, 10 Oct 2017 23:09:07 -0700 > > Hi Mark, > > Have you had any time to look further at the sxipio driver changes > required for H3 devices? As you noted in an earlier email, the H3 > device initializes the configuration registers to all 1s, in contrast > to the A10 devices where the registers are set to 0. Thus the A10 > pins are set to input (0) while the H3 pins are set to a new status > called disabled (7) in the documentation. > > To make my system work I have simply added a line: > if(mux == 7) mux = 0; > > to the sxipio_attach_gpio function: > > /* Get pin configuration. */ > reg = SXIREAD4(sc, SXIPIO_CFG(port, pin)); > off = (pin & 0x7) << 2; > mux = (reg >> off) & 0x7; > > if(mux == 7) mux = 0; > > Could you formalize and bless this change? Sorry, I've been too busy to deal with this until now. Here is the diff I had in my tree to solve the issue. Does this one work for you? Thanks, Mark Index: dev/fdt/sxipio.c =================================================================== RCS file: /cvs/src/sys/dev/fdt/sxipio.c,v retrieving revision 1.4 diff -u -p -r1.4 sxipio.c --- dev/fdt/sxipio.c 30 Aug 2017 16:21:29 -0000 1.4 +++ dev/fdt/sxipio.c 12 Nov 2017 17:56:20 -0000 @@ -89,6 +89,7 @@ struct sxipio_softc { #define SXIPIO_GPIO_IN 0 #define SXIPIO_GPIO_OUT 1 +#define SXIPIO_DISABLED 7 int sxipio_match(struct device *, void *, void *); void sxipio_attach(struct device *, struct device *, void *); @@ -446,7 +447,7 @@ sxipio_attach_gpio(struct device *parent uint32_t reg; int port, pin; int off, mux; - int state; + int state, flags; int i; for (i = 0; i < sc->sc_npins; i++) { @@ -464,17 +465,28 @@ sxipio_attach_gpio(struct device *parent mux = (reg >> off) & 0x7; /* Skip pins that have been assigned other functions. */ - if (mux != SXIPIO_GPIO_IN && mux != SXIPIO_GPIO_OUT) + if (mux != SXIPIO_GPIO_IN && mux != SXIPIO_GPIO_OUT && + mux != SXIPIO_DISABLED) continue; + switch (mux) { + case SXIPIO_GPIO_IN: + flags = GPIO_PIN_SET | GPIO_PIN_INPUT; + break; + case SXIPIO_GPIO_OUT: + flags = GPIO_PIN_SET | GPIO_PIN_OUTPUT; + break; + default: + flags = GPIO_PIN_SET; + } + /* Get pin state. */ reg = SXIREAD4(sc, SXIPIO_DAT(port)); state = (reg >> pin) & 1; sc->sc_gpio_pins[port][pin].pin_caps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT; - sc->sc_gpio_pins[port][pin].pin_flags = - GPIO_PIN_SET | (mux ? GPIO_PIN_OUTPUT : GPIO_PIN_INPUT); + sc->sc_gpio_pins[port][pin].pin_flags = flags; sc->sc_gpio_pins[port][pin].pin_state = state; sc->sc_gpio_pins[port][pin].pin_num = pin; }