mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 04:43:53 +00:00
aw_gpio: temporarily switch to input function if read in eint mode
This is needed for gpiokeys driver that needs to read input state after receiving an interrupt for either edge. PR: 248138 MFC after: 1 month
This commit is contained in:
parent
2fb174d18a
commit
b98558e69b
|
@ -654,18 +654,30 @@ aw_gpio_pin_get_locked(struct aw_gpio_softc *sc,uint32_t pin,
|
|||
unsigned int *val)
|
||||
{
|
||||
uint32_t bank, reg_data;
|
||||
int32_t func;
|
||||
int err;
|
||||
|
||||
AW_GPIO_LOCK_ASSERT(sc);
|
||||
|
||||
if (pin > sc->conf->padconf->npins)
|
||||
return (EINVAL);
|
||||
|
||||
func = aw_gpio_get_function(sc, pin);
|
||||
if (func == sc->conf->padconf->pins[pin].eint_func) { /* "pl_eintX */
|
||||
err = aw_gpio_set_function(sc, pin, AW_GPIO_INPUT);
|
||||
if (err != 0)
|
||||
return (err);
|
||||
}
|
||||
|
||||
bank = sc->conf->padconf->pins[pin].port;
|
||||
pin = sc->conf->padconf->pins[pin].pin;
|
||||
|
||||
reg_data = AW_GPIO_READ(sc, AW_GPIO_GP_DAT(bank));
|
||||
*val = (reg_data & (1 << pin)) ? 1 : 0;
|
||||
|
||||
if (func == sc->conf->padconf->pins[pin].eint_func)
|
||||
(void)aw_gpio_set_function(sc, pin, func);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue