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:
Andriy Gapon 2024-02-18 15:55:20 +02:00
parent 2fb174d18a
commit b98558e69b

View file

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