Commit 4b28762c authored by Bartosz Golaszewski's avatar Bartosz Golaszewski
Browse files

gpio: latch: use value returning setters



struct gpio_chip now has additional variants of the set(_multiple)
driver callbacks that return an integer to indicate success or failure.
Convert the driver to using them.

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-13-bc4cfd38dae3@linaro.org


Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
parent 14628b69
Loading
Loading
Loading
Loading
+19 −14
Original line number Diff line number Diff line
@@ -73,41 +73,46 @@ static int gpio_latch_get_direction(struct gpio_chip *gc, unsigned int offset)
	return GPIO_LINE_DIRECTION_OUT;
}

static void gpio_latch_set_unlocked(struct gpio_latch_priv *priv,
static int gpio_latch_set_unlocked(struct gpio_latch_priv *priv,
				   int (*set)(struct gpio_desc *desc, int value),
				   unsigned int offset, bool val)
{
	int latch = offset / priv->n_latched_gpios;
	int i;
	int latch = offset / priv->n_latched_gpios, i, ret;

	assign_bit(offset, priv->shadow, val);

	for (i = 0; i < priv->n_latched_gpios; i++)
		set(priv->latched_gpios->desc[i],
		    test_bit(latch * priv->n_latched_gpios + i, priv->shadow));
	for (i = 0; i < priv->n_latched_gpios; i++) {
		ret = set(priv->latched_gpios->desc[i],
			  test_bit(latch * priv->n_latched_gpios + i,
				   priv->shadow));
		if (ret)
			return ret;
	}

	ndelay(priv->setup_duration_ns);
	set(priv->clk_gpios->desc[latch], 1);
	ndelay(priv->clock_duration_ns);
	set(priv->clk_gpios->desc[latch], 0);

	return 0;
}

static void gpio_latch_set(struct gpio_chip *gc, unsigned int offset, int val)
static int gpio_latch_set(struct gpio_chip *gc, unsigned int offset, int val)
{
	struct gpio_latch_priv *priv = gpiochip_get_data(gc);

	guard(spinlock_irqsave)(&priv->spinlock);

	gpio_latch_set_unlocked(priv, gpiod_set_value, offset, val);
	return gpio_latch_set_unlocked(priv, gpiod_set_value, offset, val);
}

static void gpio_latch_set_can_sleep(struct gpio_chip *gc, unsigned int offset, int val)
static int gpio_latch_set_can_sleep(struct gpio_chip *gc, unsigned int offset, int val)
{
	struct gpio_latch_priv *priv = gpiochip_get_data(gc);

	guard(mutex)(&priv->mutex);

	gpio_latch_set_unlocked(priv, gpiod_set_value_cansleep, offset, val);
	return gpio_latch_set_unlocked(priv, gpiod_set_value_cansleep, offset, val);
}

static bool gpio_latch_can_sleep(struct gpio_latch_priv *priv, unsigned int n_latches)
@@ -161,11 +166,11 @@ static int gpio_latch_probe(struct platform_device *pdev)

	if (gpio_latch_can_sleep(priv, n_latches)) {
		priv->gc.can_sleep = true;
		priv->gc.set = gpio_latch_set_can_sleep;
		priv->gc.set_rv = gpio_latch_set_can_sleep;
		mutex_init(&priv->mutex);
	} else {
		priv->gc.can_sleep = false;
		priv->gc.set = gpio_latch_set;
		priv->gc.set_rv = gpio_latch_set;
		spin_lock_init(&priv->spinlock);
	}