Commit d36058b8 authored by Bartosz Golaszewski's avatar Bartosz Golaszewski
Browse files

gpiolib: wrap gpio_chip::set()



We have three places where we dereference the gpio_chip::set() callback.
In order to make it easier to incorporate the upcoming new variant of
this callback (one returning an integer value), wrap it in a helper so
that the dereferencing only happens once.

Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarUwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://lore.kernel.org/r/20250220-gpio-set-retval-v2-3-bc4cfd38dae3@linaro.org


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent 8ce258f6
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -2825,6 +2825,17 @@ int gpiod_direction_input_nonotify(struct gpio_desc *desc)
	return ret;
}

static int gpiochip_set(struct gpio_chip *gc, unsigned int offset, int value)
{
	lockdep_assert_held(&gc->gpiodev->srcu);

	if (WARN_ON(unlikely(!gc->set)))
		return -EOPNOTSUPP;

	gc->set(gc, offset, value);
	return 0;
}

static int gpiod_direction_output_raw_commit(struct gpio_desc *desc, int value)
{
	int val = !!value, ret = 0;
@@ -2867,7 +2878,9 @@ static int gpiod_direction_output_raw_commit(struct gpio_desc *desc, int value)
		 * If we can't actively set the direction, we are some
		 * output-only chip, so just drive the output as desired.
		 */
		guard.gc->set(guard.gc, gpio_chip_hwgpio(desc), val);
		ret = gpiochip_set(guard.gc, gpio_chip_hwgpio(desc), val);
		if (ret)
			return ret;
	}

	if (!ret)
@@ -3557,9 +3570,7 @@ static int gpiod_set_raw_value_commit(struct gpio_desc *desc, bool value)
		return -ENODEV;

	trace_gpio_value(desc_to_gpio(desc), 0, value);
	guard.gc->set(guard.gc, gpio_chip_hwgpio(desc), value);

	return 0;
	return gpiochip_set(guard.gc, gpio_chip_hwgpio(desc), value);
}

/*
@@ -3584,7 +3595,7 @@ static void gpio_chip_set_multiple(struct gpio_chip *gc,

		/* set outputs if the corresponding mask bit is set */
		for_each_set_bit(i, mask, gc->ngpio)
			gc->set(gc, i, test_bit(i, bits));
			gpiochip_set(gc, i, test_bit(i, bits));
	}
}