Remove these locks - they aren't strictly needed and cause measurable
performance issues. * Access to the GPIO bus is already locked by requesting and releasing the bus - thus the lock isn't really needed for each GPIO pin change. * Don't lock and unlock the GPIO bus for -each- i2c access - the i2c bus code is already doing this by calling the upper layer callback to request/release the bus. This thus locks the bus for the entirety of the transaction. TODO: * Further verify that everything is correctly requesting/ releasing the GPIO bus. * Look at how to lock the GPIO pin configuration stuff, potentially by locking/unlocking the bus at the gpiobus layer.
This commit is contained in:
parent
25841e912f
commit
ddd7699151
@ -55,7 +55,6 @@ struct gpioiic_softc
|
||||
{
|
||||
device_t sc_dev;
|
||||
device_t sc_busdev;
|
||||
struct mtx sc_mtx;
|
||||
struct cdev *sc_leddev;
|
||||
int scl_pin;
|
||||
int sda_pin;
|
||||
@ -148,7 +147,6 @@ gpioiic_setsda(device_t dev, int val)
|
||||
{
|
||||
struct gpioiic_softc *sc = device_get_softc(dev);
|
||||
|
||||
GPIOBUS_LOCK_BUS(sc->sc_busdev);
|
||||
if (val == 0) {
|
||||
GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev, sc->sda_pin, 0);
|
||||
GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sda_pin,
|
||||
@ -157,7 +155,6 @@ gpioiic_setsda(device_t dev, int val)
|
||||
GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sda_pin,
|
||||
GPIO_PIN_INPUT);
|
||||
}
|
||||
GPIOBUS_UNLOCK_BUS(sc->sc_busdev);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -165,7 +162,6 @@ gpioiic_setscl(device_t dev, int val)
|
||||
{
|
||||
struct gpioiic_softc *sc = device_get_softc(dev);
|
||||
|
||||
GPIOBUS_LOCK_BUS(sc->sc_busdev);
|
||||
if (val == 0) {
|
||||
GPIOBUS_PIN_SET(sc->sc_busdev, sc->sc_dev, sc->scl_pin, 0);
|
||||
GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->scl_pin,
|
||||
@ -174,7 +170,6 @@ gpioiic_setscl(device_t dev, int val)
|
||||
GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->scl_pin,
|
||||
GPIO_PIN_INPUT);
|
||||
}
|
||||
GPIOBUS_UNLOCK_BUS(sc->sc_busdev);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -183,11 +178,9 @@ gpioiic_getscl(device_t dev)
|
||||
struct gpioiic_softc *sc = device_get_softc(dev);
|
||||
unsigned int val;
|
||||
|
||||
GPIOBUS_LOCK_BUS(sc->sc_busdev);
|
||||
GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->scl_pin,
|
||||
GPIO_PIN_INPUT);
|
||||
GPIOBUS_PIN_GET(sc->sc_busdev, sc->sc_dev, sc->scl_pin, &val);
|
||||
GPIOBUS_UNLOCK_BUS(sc->sc_busdev);
|
||||
|
||||
return ((int)val);
|
||||
}
|
||||
@ -198,11 +191,9 @@ gpioiic_getsda(device_t dev)
|
||||
struct gpioiic_softc *sc = device_get_softc(dev);
|
||||
unsigned int val;
|
||||
|
||||
GPIOBUS_LOCK_BUS(sc->sc_busdev);
|
||||
GPIOBUS_PIN_SETFLAGS(sc->sc_busdev, sc->sc_dev, sc->sda_pin,
|
||||
GPIO_PIN_INPUT);
|
||||
GPIOBUS_PIN_GET(sc->sc_busdev, sc->sc_dev, sc->sda_pin, &val);
|
||||
GPIOBUS_UNLOCK_BUS(sc->sc_busdev);
|
||||
|
||||
return ((int)val);
|
||||
}
|
||||
@ -212,13 +203,11 @@ gpioiic_reset(device_t dev, u_char speed, u_char addr, u_char *oldaddr)
|
||||
{
|
||||
struct gpioiic_softc *sc = device_get_softc(dev);
|
||||
|
||||
GPIOBUS_LOCK_BUS(sc->sc_busdev);
|
||||
GPIOBUS_ACQUIRE_BUS(sc->sc_busdev, sc->sc_dev);
|
||||
|
||||
gpioiic_reset_bus(sc->sc_dev);
|
||||
|
||||
GPIOBUS_RELEASE_BUS(sc->sc_busdev, sc->sc_dev);
|
||||
GPIOBUS_UNLOCK_BUS(sc->sc_busdev);
|
||||
|
||||
return (IIC_ENOADDR);
|
||||
}
|
||||
|
@ -89,17 +89,13 @@ static int ar71xx_gpio_pin_toggle(device_t dev, uint32_t pin);
|
||||
static void
|
||||
ar71xx_gpio_function_enable(struct ar71xx_gpio_softc *sc, uint32_t mask)
|
||||
{
|
||||
GPIO_LOCK(sc);
|
||||
GPIO_SET_BITS(sc, AR71XX_GPIO_FUNCTION, mask);
|
||||
GPIO_UNLOCK(sc);
|
||||
}
|
||||
|
||||
static void
|
||||
ar71xx_gpio_function_disable(struct ar71xx_gpio_softc *sc, uint32_t mask)
|
||||
{
|
||||
GPIO_LOCK(sc);
|
||||
GPIO_CLEAR_BITS(sc, AR71XX_GPIO_FUNCTION, mask);
|
||||
GPIO_UNLOCK(sc);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -109,7 +105,6 @@ ar71xx_gpio_pin_configure(struct ar71xx_gpio_softc *sc, struct gpio_pin *pin,
|
||||
uint32_t mask;
|
||||
|
||||
mask = 1 << pin->gp_pin;
|
||||
GPIO_LOCK(sc);
|
||||
|
||||
/*
|
||||
* Manage input/output
|
||||
@ -125,8 +120,6 @@ ar71xx_gpio_pin_configure(struct ar71xx_gpio_softc *sc, struct gpio_pin *pin,
|
||||
GPIO_CLEAR_BITS(sc, AR71XX_GPIO_OE, mask);
|
||||
}
|
||||
}
|
||||
|
||||
GPIO_UNLOCK(sc);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -253,12 +246,10 @@ ar71xx_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
|
||||
if (i >= sc->gpio_npins)
|
||||
return (EINVAL);
|
||||
|
||||
GPIO_LOCK(sc);
|
||||
if (value)
|
||||
GPIO_WRITE(sc, AR71XX_GPIO_SET, (1 << pin));
|
||||
else
|
||||
GPIO_WRITE(sc, AR71XX_GPIO_CLEAR, (1 << pin));
|
||||
GPIO_UNLOCK(sc);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -277,9 +268,7 @@ ar71xx_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
|
||||
if (i >= sc->gpio_npins)
|
||||
return (EINVAL);
|
||||
|
||||
GPIO_LOCK(sc);
|
||||
*val = (GPIO_READ(sc, AR71XX_GPIO_IN) & (1 << pin)) ? 1 : 0;
|
||||
GPIO_UNLOCK(sc);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -298,13 +287,11 @@ ar71xx_gpio_pin_toggle(device_t dev, uint32_t pin)
|
||||
if (i >= sc->gpio_npins)
|
||||
return (EINVAL);
|
||||
|
||||
GPIO_LOCK(sc);
|
||||
res = (GPIO_READ(sc, AR71XX_GPIO_IN) & (1 << pin)) ? 1 : 0;
|
||||
if (res)
|
||||
GPIO_WRITE(sc, AR71XX_GPIO_CLEAR, (1 << pin));
|
||||
else
|
||||
GPIO_WRITE(sc, AR71XX_GPIO_SET, (1 << pin));
|
||||
GPIO_UNLOCK(sc);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user