gpio: add function _dm_gpio_set_dir_flags
authorPatrick Delaunay <patrick.delaunay@st.com>
Mon, 13 Jan 2020 10:35:03 +0000 (11:35 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 17 Apr 2020 03:06:54 +0000 (23:06 -0400)
Introduce the function _dm_gpio_set_dir_flags to set dir flags
without check if the GPIO is reserved.

Separate the reserved check for "set_dir" and "set_dir_flags".

This patch is a preliminary step to add new ops.

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
drivers/gpio/gpio-uclass.c

index 5c82a4a..3b505d0 100644 (file)
@@ -510,15 +510,11 @@ int dm_gpio_set_value(const struct gpio_desc *desc, int value)
        return 0;
 }
 
-int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
+static int _dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
 {
        struct udevice *dev = desc->dev;
        struct dm_gpio_ops *ops = gpio_get_ops(dev);
-       int ret;
-
-       ret = check_reserved(desc, "set_dir");
-       if (ret)
-               return ret;
+       int ret = 0;
 
        if (flags & GPIOD_IS_OUT) {
                int value = flags & GPIOD_IS_OUT_ACTIVE ? 1 : 0;
@@ -529,20 +525,36 @@ int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
        } else  if (flags & GPIOD_IS_IN) {
                ret = ops->direction_input(dev, desc->offset);
        }
+
+       return ret;
+}
+
+int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
+{
+       int ret;
+
+       ret = check_reserved(desc, "set_dir_flags");
        if (ret)
                return ret;
-       /*
-        * Update desc->flags here, so that GPIO_ACTIVE_LOW is honoured in
-        * futures
-        */
-       desc->flags = flags;
 
-       return 0;
+       ret = _dm_gpio_set_dir_flags(desc, flags);
+
+       /* update the descriptor flags */
+       if (ret)
+               desc->flags = flags;
+
+       return ret;
 }
 
 int dm_gpio_set_dir(struct gpio_desc *desc)
 {
-       return dm_gpio_set_dir_flags(desc, desc->flags);
+       int ret;
+
+       ret = check_reserved(desc, "set_dir");
+       if (ret)
+               return ret;
+
+       return _dm_gpio_set_dir_flags(desc, desc->flags);
 }
 
 /**