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); }
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); }