From: Bartosz Golaszewski <brgl@bgdev.pl>
To: "Linus Walleij" <linus.walleij@linaro.org>,
"Bartosz Golaszewski" <brgl@bgdev.pl>,
"Michael Walle" <mwalle@kernel.org>,
"Bamvor Jian Zhang" <bamv2005@gmail.com>,
"Geert Uytterhoeven" <geert+renesas@glider.be>,
Keerthy <j-keerthy@ti.com>,
"Uwe Kleine-König" <ukleinek@kernel.org>
Cc: linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pwm@vger.kernel.org,
Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Subject: [PATCH v2 05/15] gpiolib: introduce gpio_chip setters that return values
Date: Thu, 20 Feb 2025 10:57:02 +0100 [thread overview]
Message-ID: <20250220-gpio-set-retval-v2-5-bc4cfd38dae3@linaro.org> (raw)
In-Reply-To: <20250220-gpio-set-retval-v2-0-bc4cfd38dae3@linaro.org>
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Add new variants of the set() and set_multiple() callbacks that have
integer return values allowing to indicate failures to users of the GPIO
consumer API. Until we convert all GPIO providers treewide to using
them, they will live in parallel to the existing ones.
Make sure that providers cannot define both. Prefer the new ones and
only use the old ones as fallback.
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
---
drivers/gpio/gpiolib.c | 27 +++++++++++++++++++++++++--
include/linux/gpio/driver.h | 10 ++++++++++
2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index b1e7d368bc7d..19f78ffcc3c1 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -926,6 +926,11 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
int base = 0;
int ret = 0;
+ /* Only allow one set() and one set_multiple(). */
+ if ((gc->set && gc->set_rv) ||
+ (gc->set_multiple && gc->set_multiple_rv))
+ return -EINVAL;
+
/*
* First: allocate and populate the internal stat container, and
* set up the struct device.
@@ -2757,11 +2762,21 @@ int gpiod_direction_input_nonotify(struct gpio_desc *desc)
static int gpiochip_set(struct gpio_chip *gc, unsigned int offset, int value)
{
+ int ret;
+
lockdep_assert_held(&gc->gpiodev->srcu);
- if (WARN_ON(unlikely(!gc->set)))
+ if (WARN_ON(unlikely(!gc->set && !gc->set_rv)))
return -EOPNOTSUPP;
+ if (gc->set_rv) {
+ ret = gc->set_rv(gc, offset, value);
+ if (ret > 0)
+ ret = -EBADE;
+
+ return ret;
+ }
+
gc->set(gc, offset, value);
return 0;
}
@@ -3501,9 +3516,17 @@ static int gpiochip_set_multiple(struct gpio_chip *gc,
lockdep_assert_held(&gc->gpiodev->srcu);
- if (WARN_ON(unlikely(!gc->set_multiple && !gc->set)))
+ if (WARN_ON(unlikely(!gc->set_multiple && !gc->set_multiple_rv)))
return -EOPNOTSUPP;
+ if (gc->set_multiple_rv) {
+ ret = gc->set_multiple_rv(gc, mask, bits);
+ if (ret > 0)
+ ret = -EBADE;
+
+ return ret;
+ }
+
if (gc->set_multiple) {
gc->set_multiple(gc, mask, bits);
return 0;
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h
index 10544f4a03e5..b2627c8ed513 100644
--- a/include/linux/gpio/driver.h
+++ b/include/linux/gpio/driver.h
@@ -347,6 +347,10 @@ struct gpio_irq_chip {
* stores them in "bits", returns 0 on success or negative error
* @set: assigns output value for signal "offset"
* @set_multiple: assigns output values for multiple signals defined by "mask"
+ * @set_rv: assigns output value for signal "offset", returns 0 on success or
+ * negative error value
+ * @set_multiple_rv: assigns output values for multiple signals defined by
+ * "mask", returns 0 on success or negative error value
* @set_config: optional hook for all kinds of settings. Uses the same
* packed config format as generic pinconf.
* @to_irq: optional hook supporting non-static gpiod_to_irq() mappings;
@@ -442,6 +446,12 @@ struct gpio_chip {
void (*set_multiple)(struct gpio_chip *gc,
unsigned long *mask,
unsigned long *bits);
+ int (*set_rv)(struct gpio_chip *gc,
+ unsigned int offset,
+ int value);
+ int (*set_multiple_rv)(struct gpio_chip *gc,
+ unsigned long *mask,
+ unsigned long *bits);
int (*set_config)(struct gpio_chip *gc,
unsigned int offset,
unsigned long config);
--
2.45.2
next prev parent reply other threads:[~2025-02-20 9:57 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-20 9:56 [PATCH v2 00/15] gpiolib: indicate errors in value setters Bartosz Golaszewski
2025-02-20 9:56 ` [PATCH v2 01/15] leds: aw200xx: don't use return with gpiod_set_value() variants Bartosz Golaszewski
2025-03-06 22:51 ` (subset) " Lee Jones
2025-03-07 7:03 ` Bartosz Golaszewski
2025-03-13 15:29 ` Lee Jones
2025-02-20 9:56 ` [PATCH v2 02/15] gpiolib: make value setters have return values Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 03/15] gpiolib: wrap gpio_chip::set() Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 04/15] gpiolib: rework the wrapper around gpio_chip::set_multiple() Bartosz Golaszewski
2025-02-20 9:57 ` Bartosz Golaszewski [this message]
[not found] ` <CGME20250227140054eucas1p2bf6e3f2416e11e3c62a704682bf052bf@eucas1p2.samsung.com>
2025-02-27 14:00 ` [PATCH v2 05/15] gpiolib: introduce gpio_chip setters that return values Marek Szyprowski
2025-02-27 14:10 ` Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 06/15] gpio: sim: use value returning setters Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 07/15] gpio: regmap: " Bartosz Golaszewski
2025-02-20 10:08 ` Michael Walle
2025-02-20 9:57 ` [PATCH v2 08/15] gpio: pca953x: " Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 09/15] gpio: mockup: " Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 10/15] gpio: aggregator: " Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 11/15] gpio: max77650: " Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 12/15] gpio: latch: use lock guards Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 13/15] gpio: latch: use value returning setters Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 14/15] gpio: davinci: " Bartosz Golaszewski
2025-02-20 9:57 ` [PATCH v2 15/15] gpio: mvebu: " Bartosz Golaszewski
2025-02-21 9:33 ` [PATCH v2 00/15] gpiolib: indicate errors in value setters Uwe Kleine-König
2025-02-26 10:19 ` Bartosz Golaszewski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250220-gpio-set-retval-v2-5-bc4cfd38dae3@linaro.org \
--to=brgl@bgdev.pl \
--cc=bamv2005@gmail.com \
--cc=bartosz.golaszewski@linaro.org \
--cc=geert+renesas@glider.be \
--cc=j-keerthy@ti.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=mwalle@kernel.org \
--cc=ukleinek@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).