]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpio: syscon: use new GPIO line value setter callbacks
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 25 Jun 2025 10:33:33 +0000 (12:33 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Wed, 2 Jul 2025 09:05:38 +0000 (11:05 +0200)
struct gpio_chip now has callbacks for setting line values that return
an integer, allowing to indicate failures. Convert the driver to using
them.

Link: https://lore.kernel.org/r/20250625-gpiochip-set-rv-gpio-round2-v1-10-bc110a3b52ff@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpio-syscon.c

index 5ab394ec81e69beae2080a3ca7ecf35868e79abf..f86f78655c2420ef91f1248653b4943b5d8ed1c0 100644 (file)
@@ -40,8 +40,8 @@ struct syscon_gpio_data {
        unsigned int    bit_count;
        unsigned int    dat_bit_offset;
        unsigned int    dir_bit_offset;
-       void            (*set)(struct gpio_chip *chip,
-                              unsigned offset, int value);
+       int             (*set)(struct gpio_chip *chip, unsigned int offset,
+                              int value);
 };
 
 struct syscon_gpio_priv {
@@ -68,17 +68,17 @@ static int syscon_gpio_get(struct gpio_chip *chip, unsigned offset)
        return !!(val & BIT(offs % SYSCON_REG_BITS));
 }
 
-static void syscon_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
+static int syscon_gpio_set(struct gpio_chip *chip, unsigned int offset, int val)
 {
        struct syscon_gpio_priv *priv = gpiochip_get_data(chip);
        unsigned int offs;
 
        offs = priv->dreg_offset + priv->data->dat_bit_offset + offset;
 
-       regmap_update_bits(priv->syscon,
-                          (offs / SYSCON_REG_BITS) * SYSCON_REG_SIZE,
-                          BIT(offs % SYSCON_REG_BITS),
-                          val ? BIT(offs % SYSCON_REG_BITS) : 0);
+       return regmap_update_bits(priv->syscon,
+                                 (offs / SYSCON_REG_BITS) * SYSCON_REG_SIZE,
+                                 BIT(offs % SYSCON_REG_BITS),
+                                 val ? BIT(offs % SYSCON_REG_BITS) : 0);
 }
 
 static int syscon_gpio_dir_in(struct gpio_chip *chip, unsigned offset)
@@ -115,9 +115,7 @@ static int syscon_gpio_dir_out(struct gpio_chip *chip, unsigned offset, int val)
                                   BIT(offs % SYSCON_REG_BITS));
        }
 
-       chip->set(chip, offset, val);
-
-       return 0;
+       return chip->set_rv(chip, offset, val);
 }
 
 static const struct syscon_gpio_data clps711x_mctrl_gpio = {
@@ -127,8 +125,8 @@ static const struct syscon_gpio_data clps711x_mctrl_gpio = {
        .dat_bit_offset = 0x40 * 8 + 8,
 };
 
-static void rockchip_gpio_set(struct gpio_chip *chip, unsigned int offset,
-                             int val)
+static int rockchip_gpio_set(struct gpio_chip *chip, unsigned int offset,
+                            int val)
 {
        struct syscon_gpio_priv *priv = gpiochip_get_data(chip);
        unsigned int offs;
@@ -144,6 +142,8 @@ static void rockchip_gpio_set(struct gpio_chip *chip, unsigned int offset,
                           data);
        if (ret < 0)
                dev_err(chip->parent, "gpio write failed ret(%d)\n", ret);
+
+       return ret;
 }
 
 static const struct syscon_gpio_data rockchip_rk3328_gpio_mute = {
@@ -156,7 +156,8 @@ static const struct syscon_gpio_data rockchip_rk3328_gpio_mute = {
 
 #define KEYSTONE_LOCK_BIT BIT(0)
 
-static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
+static int keystone_gpio_set(struct gpio_chip *chip, unsigned int offset,
+                            int val)
 {
        struct syscon_gpio_priv *priv = gpiochip_get_data(chip);
        unsigned int offs;
@@ -165,7 +166,7 @@ static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
        offs = priv->dreg_offset + priv->data->dat_bit_offset + offset;
 
        if (!val)
-               return;
+               return 0;
 
        ret = regmap_update_bits(
                        priv->syscon,
@@ -174,6 +175,8 @@ static void keystone_gpio_set(struct gpio_chip *chip, unsigned offset, int val)
                        BIT(offs % SYSCON_REG_BITS) | KEYSTONE_LOCK_BIT);
        if (ret < 0)
                dev_err(chip->parent, "gpio write failed ret(%d)\n", ret);
+
+       return ret;
 }
 
 static const struct syscon_gpio_data keystone_dsp_gpio = {
@@ -248,7 +251,7 @@ static int syscon_gpio_probe(struct platform_device *pdev)
        if (priv->data->flags & GPIO_SYSCON_FEAT_IN)
                priv->chip.direction_input = syscon_gpio_dir_in;
        if (priv->data->flags & GPIO_SYSCON_FEAT_OUT) {
-               priv->chip.set = priv->data->set ? : syscon_gpio_set;
+               priv->chip.set_rv = priv->data->set ? : syscon_gpio_set;
                priv->chip.direction_output = syscon_gpio_dir_out;
        }