static int wiigpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags) { struct wiigpio_softc *sc; uint32_t reg, pinbank, pinmask; if (pin >= WIIGPIO_NPINS) return (EINVAL); if ((flags & ~(GPIO_PIN_OUTPUT|GPIO_PIN_INPUT)) != 0) return (EINVAL); if ((flags & (GPIO_PIN_OUTPUT|GPIO_PIN_INPUT)) == (GPIO_PIN_OUTPUT|GPIO_PIN_INPUT)) return (EINVAL); sc = device_get_softc(dev); pinbank = WIIGPIO_PINBANK(pin); pinmask = WIIGPIO_PINMASK(pin); WIIGPIO_LOCK(sc); reg = wiigpio_dir_read(sc, WIIGPIO_PINBANK(pin)); if (flags & GPIO_PIN_OUTPUT) wiigpio_dir_write(sc, pinbank, reg | pinmask); else wiigpio_dir_write(sc, pinbank, reg & ~pinmask); sc->sc_pins[pin].gp_flags = flags; WIIGPIO_UNLOCK(sc); return (0); }
static int wiigpio_pin_getname(device_t dev, uint32_t pin, char *name) { struct wiigpio_softc *sc; if (pin >= WIIGPIO_NPINS) return (EINVAL); sc = device_get_softc(dev); WIIGPIO_LOCK(sc); memcpy(name, sc->sc_pins[pin].gp_name, GPIOMAXNAME); WIIGPIO_UNLOCK(sc); return (0); }
static int wiigpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags) { struct wiigpio_softc *sc; if (pin >= WIIGPIO_NPINS) return (EINVAL); sc = device_get_softc(dev); WIIGPIO_LOCK(sc); *flags = sc->sc_pins[pin].gp_flags; WIIGPIO_UNLOCK(sc); return (0); }
static int wiigpio_pin_get(device_t dev, uint32_t pin, unsigned int *val) { struct wiigpio_softc *sc; uint32_t reg; if (pin >= WIIGPIO_NPINS) return (EINVAL); sc = device_get_softc(dev); WIIGPIO_LOCK(sc); reg = wiigpio_read(sc); *val = !!(reg & (1 << pin)); WIIGPIO_UNLOCK(sc); return (0); }
static int wiigpio_pin_toggle(device_t dev, uint32_t pin) { struct wiigpio_softc *sc; uint32_t val, pinmask = 1 << pin; sc = device_get_softc(dev); WIIGPIO_LOCK(sc); val = wiigpio_read(sc) & pinmask; if (val) wiigpio_write(sc, wiigpio_read(sc) & ~pinmask); else wiigpio_write(sc, wiigpio_read(sc) | pinmask); WIIGPIO_UNLOCK(sc); return (0); }
static int wiigpio_pin_set(device_t dev, uint32_t pin, unsigned int value) { struct wiigpio_softc *sc; uint32_t reg, pinmask = 1 << pin; if (pin >= WIIGPIO_NPINS) return (EINVAL); sc = device_get_softc(dev); WIIGPIO_LOCK(sc); reg = wiigpio_read(sc) & ~pinmask; if (value) reg |= pinmask; wiigpio_write(sc, reg); WIIGPIO_UNLOCK(sc); return (0); }
static int wiigpio_pin_toggle(device_t dev, uint32_t pin) { struct wiigpio_softc *sc; uint32_t val, pinbank, pinmask; if (pin >= WIIGPIO_NPINS) return (EINVAL); sc = device_get_softc(dev); pinbank = WIIGPIO_PINBANK(pin); pinmask = WIIGPIO_PINMASK(pin); WIIGPIO_LOCK(sc); val = wiigpio_read(sc, pinbank); if (val & pinmask) wiigpio_write(sc, pinbank, val & ~pinmask); else wiigpio_write(sc, pinbank, val | pinmask); WIIGPIO_UNLOCK(sc); return (0); }