@@ -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;
@@ -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) {
@@ -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);
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(-)