lkml.org 
[lkml]   [2021]   [May]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v1 2/2] gpiolib: Introduce gpiod_request_user() helper
Date
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@linux.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
\
 
 \ /
  Last update: 2021-05-18 17:51    [W:3.227 / U:0.788 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site