Module Name: src Committed By: matt Date: Sat Dec 31 03:33:13 UTC 2011
Modified Files: src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_gpio_pci.c Log Message: Fix xlgpio_pin_ctl inversion problem. To generate a diff of this commit: cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/arch/mips/rmi/rmixl_gpio_pci.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mips/rmi/rmixl_gpio_pci.c diff -u src/sys/arch/mips/rmi/rmixl_gpio_pci.c:1.1.2.1 src/sys/arch/mips/rmi/rmixl_gpio_pci.c:1.1.2.2 --- src/sys/arch/mips/rmi/rmixl_gpio_pci.c:1.1.2.1 Fri Dec 30 06:48:55 2011 +++ src/sys/arch/mips/rmi/rmixl_gpio_pci.c Sat Dec 31 03:33:13 2011 @@ -29,7 +29,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: rmixl_gpio_pci.c,v 1.1.2.1 2011/12/30 06:48:55 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: rmixl_gpio_pci.c,v 1.1.2.2 2011/12/31 03:33:13 matt Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -100,7 +100,7 @@ struct xlgpio_intrpin { #define PINGROUP (PINMASK+1) #define PIN_GROUP(pin) ((pin) / PINGROUP) #define PIN_SELECT(pin) ((pin) & PINMASK) -#define PIN_MASK(pin) (1 << ((pin) & PINMASK)) +#define PIN_MASK(pin) (1 << PIN_SELECT(pin)) struct xlgpio_softc { device_t sc_dev; @@ -493,7 +493,7 @@ xlgpio_pin_write(void *arg, int pin, int { struct xlgpio_softc * const sc = arg; struct xlgpio_group * const gg = &sc->sc_groups[PIN_GROUP(pin)]; - const uint32_t mask = 1 << (pin & PINMASK); + const uint32_t mask = PIN_MASK(pin); mutex_enter(sc->sc_pin_lock); @@ -515,23 +515,25 @@ static void xlgpio_pin_ctl(void *arg, int pin, int flags) { struct xlgpio_softc * const sc = arg; - const bus_size_t r_padoe = RMIXLP_GPIO_PADOE(pin / PINGROUP); - const uint32_t mask = 1 << (pin & PINMASK); + struct xlgpio_group * const gg = &sc->sc_groups[PIN_GROUP(pin)]; + const uint32_t mask = PIN_MASK(pin); mutex_enter(sc->sc_pin_lock); KASSERT(pin < sc->sc_pincnt); - const uint32_t old = xlgpio_read_4(sc, r_padoe); - uint32_t new; + uint32_t new_padoe; switch (flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) { - case GPIO_PIN_INPUT: new = old | mask; break; - case GPIO_PIN_OUTPUT: new = old & ~mask; break; - default: new = old; + case GPIO_PIN_OUTPUT: new_padoe = gg->gg_padoe | mask; break; + case GPIO_PIN_INPUT: new_padoe = gg->gg_padoe & ~mask; break; + default: new_padoe = gg->gg_padoe; + } + + if (gg->gg_padoe != new_padoe) { + gg->gg_padoe = new_padoe; + xlgpio_write_4(sc, gg->gg_r_padoe, gg->gg_padoe); } - if (old != new) - xlgpio_write_4(sc, r_padoe, new); mutex_exit(sc->sc_pin_lock); }