[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210518155013.45622-2-andriy.shevchenko@linux.intel.com>
Date: Tue, 18 May 2021 18:50:13 +0300
From: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
To: Kent Gibson <warthog618@...il.com>,
Bartosz Golaszewski <bgolaszewski@...libre.com>,
Andy Shevchenko <andriy.shevchenko@...ux.intel.com>,
linux-gpio@...r.kernel.org, linux-kernel@...r.kernel.org
Cc: Linus Walleij <linus.walleij@...aro.org>
Subject: [PATCH v1 2/2] gpiolib: Introduce gpiod_request_user() helper
The gpiod_request_user() is a special helper to avoid propagating stuff
to user space that should not be propagated, e.g. internal error codes.
For now, hide EPROBE_DEFER with ENODEV.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@...ux.intel.com>
---
drivers/gpio/gpiolib-cdev.c | 21 ++++++---------------
drivers/gpio/gpiolib-sysfs.c | 7 ++-----
drivers/gpio/gpiolib.h | 12 ++++++++++++
3 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/drivers/gpio/gpiolib-cdev.c b/drivers/gpio/gpiolib-cdev.c
index 1d8f66880d63..8a934914f93a 100644
--- a/drivers/gpio/gpiolib-cdev.c
+++ b/drivers/gpio/gpiolib-cdev.c
@@ -330,12 +330,9 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
goto out_free_lh;
}
- ret = gpiod_request(desc, lh->label);
- if (ret) {
- if (ret == -EPROBE_DEFER)
- ret = -ENODEV;
+ ret = gpiod_request_user(desc, lh->label);
+ if (ret)
goto out_free_lh;
- }
lh->descs[i] = desc;
linehandle_flags_to_desc_flags(handlereq.flags, &desc->flags);
@@ -1381,12 +1378,9 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)
goto out_free_linereq;
}
- ret = gpiod_request(desc, lr->label);
- if (ret) {
- if (ret == -EPROBE_DEFER)
- ret = -ENODEV;
+ ret = gpiod_request_user(desc, lr->label);
+ if (ret)
goto out_free_linereq;
- }
lr->lines[i].desc = desc;
flags = gpio_v2_line_config_flags(lc, i);
@@ -1770,12 +1764,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
}
}
- ret = gpiod_request(desc, le->label);
- if (ret) {
- if (ret == -EPROBE_DEFER)
- ret = -ENODEV;
+ ret = gpiod_request_user(desc, le->label);
+ if (ret)
goto out_free_le;
- }
le->desc = desc;
le->eflags = eflags;
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
index d836aba91d3c..22a9ad1a2978 100644
--- a/drivers/gpio/gpiolib-sysfs.c
+++ b/drivers/gpio/gpiolib-sysfs.c
@@ -473,12 +473,9 @@ static ssize_t export_store(struct class *class,
* they may be undone on its behalf too.
*/
- status = gpiod_request(desc, "sysfs");
- if (status) {
- if (status == -EPROBE_DEFER)
- status = -ENODEV;
+ status = gpiod_request_user(desc, "sysfs");
+ if (status)
goto done;
- }
status = gpiod_set_transitory(desc, false);
if (!status) {
diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
index 69c96a4276de..7f760745c457 100644
--- a/drivers/gpio/gpiolib.h
+++ b/drivers/gpio/gpiolib.h
@@ -142,6 +142,18 @@ struct gpio_desc {
int gpiod_request(struct gpio_desc *desc, const char *label);
void gpiod_free(struct gpio_desc *desc);
+
+static inline int gpiod_request_user(struct gpio_desc *desc, const char *label)
+{
+ int ret;
+
+ ret = gpiod_request(desc, label);
+ if (ret == -EPROBE_DEFER)
+ ret = -ENODEV;
+
+ return ret;
+}
+
int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
unsigned long lflags, enum gpiod_flags dflags);
int gpio_set_debounce_timeout(struct gpio_desc *desc, unsigned int debounce);
--
2.30.2
Powered by blists - more mailing lists