static void led_func(void *arg, int onoff) { struct led_avila_softc *sc = arg; uint32_t reg; IXP4XX_GPIO_LOCK(); reg = GPIO_CONF_READ_4(sc, IXP425_GPIO_GPOUTR); if (onoff) reg &= ~GPIO_LED_STATUS_BIT; else reg |= GPIO_LED_STATUS_BIT; GPIO_CONF_WRITE_4(sc, IXP425_GPIO_GPOUTR, reg); IXP4XX_GPIO_UNLOCK(); }
static int avila_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags) { struct avila_gpio_softc *sc = device_get_softc(dev); if (pin >= IXP4XX_GPIO_PINS || !(sc->sc_valid & (1 << pin))) return (EINVAL); IXP4XX_GPIO_LOCK(); /* refresh since we do not own all the pins */ sc->sc_pins[pin].gp_flags = avila_gpio_pin_flags(sc, pin); *flags = sc->sc_pins[pin].gp_flags; IXP4XX_GPIO_UNLOCK(); return (0); }
static int avila_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value) { struct avila_gpio_softc *sc = device_get_softc(dev); uint32_t mask = 1 << pin; if (pin >= IXP4XX_GPIO_PINS || !(sc->sc_valid & mask)) return (EINVAL); IXP4XX_GPIO_LOCK(); if (value) GPIO_SET_BITS(sc, IXP425_GPIO_GPOUTR, mask); else GPIO_CLEAR_BITS(sc, IXP425_GPIO_GPOUTR, mask); IXP4XX_GPIO_UNLOCK(); return (0); }
static int avila_gpio_pin_toggle(device_t dev, uint32_t pin) { struct avila_gpio_softc *sc = device_get_softc(dev); uint32_t mask = 1 << pin; int res; if (pin >= IXP4XX_GPIO_PINS || !(sc->sc_valid & mask)) return (EINVAL); IXP4XX_GPIO_LOCK(); res = GPIO_CONF_READ_4(sc, IXP425_GPIO_GPINR) & mask; if (res) GPIO_CLEAR_BITS(sc, IXP425_GPIO_GPOUTR, mask); else GPIO_SET_BITS(sc, IXP425_GPIO_GPOUTR, mask); IXP4XX_GPIO_UNLOCK(); return (0); }