gpio: mmio: don't use legacy GPIO chip setters
We've converted this driver to using the new GPIO line value setters but
missed the instances where the legacy callback is accessed directly using
the function pointer. This will lead to a NULL-pointer dereference as
this pointer is no longer populated. The issue needs fixing locally as
well as in the already converted previously users of gpio-mmio.
Fixes: b908d35d00 ("gpio: mmio: use new GPIO line value setter callbacks")
Reported-by: Klara Modin <klarasmodin@gmail.com>
Closes: https://lore.kernel.org/all/2rw2sncevdiyirpdovotztlg77apcq2btzytuv5jnm55aqhlne@swtts3hl53tw/
Tested-by: Klara Modin <klarasmodin@gmail.com>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Tested-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250618-gpio-mmio-fix-setter-v1-2-2578ffb77019@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
This commit is contained in:
@@ -100,7 +100,7 @@ static int mmio_74xx_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)
|
||||
struct mmio_74xx_gpio_priv *priv = gpiochip_get_data(gc);
|
||||
|
||||
if (priv->flags & MMIO_74XX_DIR_OUT) {
|
||||
gc->set(gc, gpio, val);
|
||||
gc->set_rv(gc, gpio, val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ static int airoha_dir_set(struct gpio_chip *gc, unsigned int gpio,
|
||||
iowrite32(dir, ctrl->dir[gpio / 16]);
|
||||
|
||||
if (out)
|
||||
gc->set(gc, gpio, val);
|
||||
gc->set_rv(gc, gpio, val);
|
||||
|
||||
iowrite32(output, ctrl->output);
|
||||
|
||||
|
||||
@@ -367,7 +367,7 @@ static int bgpio_dir_out_err(struct gpio_chip *gc, unsigned int gpio,
|
||||
static int bgpio_simple_dir_out(struct gpio_chip *gc, unsigned int gpio,
|
||||
int val)
|
||||
{
|
||||
gc->set(gc, gpio, val);
|
||||
gc->set_rv(gc, gpio, val);
|
||||
|
||||
return bgpio_dir_return(gc, gpio, true);
|
||||
}
|
||||
@@ -432,14 +432,14 @@ static int bgpio_dir_out_dir_first(struct gpio_chip *gc, unsigned int gpio,
|
||||
int val)
|
||||
{
|
||||
bgpio_dir_out(gc, gpio, val);
|
||||
gc->set(gc, gpio, val);
|
||||
gc->set_rv(gc, gpio, val);
|
||||
return bgpio_dir_return(gc, gpio, true);
|
||||
}
|
||||
|
||||
static int bgpio_dir_out_val_first(struct gpio_chip *gc, unsigned int gpio,
|
||||
int val)
|
||||
{
|
||||
gc->set(gc, gpio, val);
|
||||
gc->set_rv(gc, gpio, val);
|
||||
bgpio_dir_out(gc, gpio, val);
|
||||
return bgpio_dir_return(gc, gpio, true);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user