Module Name: src Committed By: tnn Date: Tue Oct 17 15:09:18 UTC 2023
Modified Files: src/sys/arch/arm/rockchip: rk_gpio.c Log Message: rk_gpio: de-duplicate some code from the fdtbus accessors Make fdtbus accessors implementation agnostic and use the chipset tag to call into implementation code. This makes it easy to populate the chipset tag with alternate implementation needed for v2 controllers. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/rockchip/rk_gpio.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/arm/rockchip/rk_gpio.c diff -u src/sys/arch/arm/rockchip/rk_gpio.c:1.5 src/sys/arch/arm/rockchip/rk_gpio.c:1.6 --- src/sys/arch/arm/rockchip/rk_gpio.c:1.5 Sat Aug 7 16:18:45 2021 +++ src/sys/arch/arm/rockchip/rk_gpio.c Tue Oct 17 15:09:18 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: rk_gpio.c,v 1.5 2021/08/07 16:18:45 thorpej Exp $ */ +/* $NetBSD: rk_gpio.c,v 1.6 2023/10/17 15:09:18 tnn Exp $ */ /*- * Copyright (c) 2018 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rk_gpio.c,v 1.5 2021/08/07 16:18:45 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rk_gpio.c,v 1.6 2023/10/17 15:09:18 tnn Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -90,30 +90,12 @@ static void rk_gpio_attach(device_t, dev CFATTACH_DECL_NEW(rk_gpio, sizeof(struct rk_gpio_softc), rk_gpio_match, rk_gpio_attach, NULL, NULL); -static int -rk_gpio_ctl(struct rk_gpio_softc *sc, u_int pin, int flags) -{ - uint32_t ddr; - - KASSERT(mutex_owned(&sc->sc_lock)); - - ddr = RD4(sc, GPIO_SWPORTA_DDR_REG); - if (flags & GPIO_PIN_INPUT) - ddr &= ~__BIT(pin); - else if (flags & GPIO_PIN_OUTPUT) - ddr |= __BIT(pin); - WR4(sc, GPIO_SWPORTA_DDR_REG, ddr); - - return 0; -} - static void * rk_gpio_acquire(device_t dev, const void *data, size_t len, int flags) { struct rk_gpio_softc * const sc = device_private(dev); struct rk_gpio_pin *gpin; const u_int *gpio = data; - int error; if (len != 12) return NULL; @@ -124,12 +106,7 @@ rk_gpio_acquire(device_t dev, const void if (pin >= __arraycount(sc->sc_pins)) return NULL; - mutex_enter(&sc->sc_lock); - error = rk_gpio_ctl(sc, pin, flags); - mutex_exit(&sc->sc_lock); - - if (error != 0) - return NULL; + sc->sc_gp.gp_pin_ctl(sc, pin, flags); gpin = kmem_zalloc(sizeof(*gpin), KM_SLEEP); gpin->pin_sc = sc; @@ -146,9 +123,9 @@ rk_gpio_release(device_t dev, void *priv struct rk_gpio_softc * const sc = device_private(dev); struct rk_gpio_pin *pin = priv; - mutex_enter(&sc->sc_lock); - rk_gpio_ctl(pin->pin_sc, pin->pin_nr, GPIO_PIN_INPUT); - mutex_exit(&sc->sc_lock); + KASSERT(sc == pin->pin_sc); + + sc->sc_gp.gp_pin_ctl(sc, pin->pin_nr, GPIO_PIN_INPUT); kmem_free(pin, sizeof(*pin)); } @@ -158,16 +135,11 @@ rk_gpio_read(device_t dev, void *priv, b { struct rk_gpio_softc * const sc = device_private(dev); struct rk_gpio_pin *pin = priv; - uint32_t data; int val; KASSERT(sc == pin->pin_sc); - const uint32_t data_mask = __BIT(pin->pin_nr); - - /* No lock required for reads */ - data = RD4(sc, GPIO_EXT_PORTA_REG); - val = __SHIFTOUT(data, data_mask); + val = sc->sc_gp.gp_pin_read(sc, pin->pin_nr); if (!raw && pin->pin_actlo) val = !val; @@ -179,23 +151,13 @@ rk_gpio_write(device_t dev, void *priv, { struct rk_gpio_softc * const sc = device_private(dev); struct rk_gpio_pin *pin = priv; - uint32_t data; KASSERT(sc == pin->pin_sc); - const uint32_t data_mask = __BIT(pin->pin_nr); - if (!raw && pin->pin_actlo) val = !val; - mutex_enter(&sc->sc_lock); - data = RD4(sc, GPIO_SWPORTA_DR_REG); - if (val) - data |= data_mask; - else - data &= ~data_mask; - WR4(sc, GPIO_SWPORTA_DR_REG, data); - mutex_exit(&sc->sc_lock); + sc->sc_gp.gp_pin_write(sc, pin->pin_nr, val); } static struct fdtbus_gpio_controller_func rk_gpio_funcs = { @@ -247,11 +209,17 @@ static void rk_gpio_pin_ctl(void *priv, int pin, int flags) { struct rk_gpio_softc * const sc = priv; + uint32_t ddr; KASSERT(pin < __arraycount(sc->sc_pins)); mutex_enter(&sc->sc_lock); - rk_gpio_ctl(sc, pin, flags); + ddr = RD4(sc, GPIO_SWPORTA_DDR_REG); + if (flags & GPIO_PIN_INPUT) + ddr &= ~__BIT(pin); + else if (flags & GPIO_PIN_OUTPUT) + ddr |= __BIT(pin); + WR4(sc, GPIO_SWPORTA_DDR_REG, ddr); mutex_exit(&sc->sc_lock); }