]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
gpio: sandbox: Track whether a GPIO is driven
authorSimon Glass <sjg@chromium.org>
Fri, 5 Feb 2021 04:22:07 +0000 (21:22 -0700)
committerTom Rini <trini@konsulko.com>
Wed, 3 Mar 2021 20:40:11 +0000 (15:40 -0500)
Add a new flag to keep track of whether sandbox is driving the pin, or
whether it is expecting an input signal. If it is driving, then the value
of the pin is the value being driven (0 or 1). If not driving, then we
consider the value 0, since we don't currently handle things like pull-ups
yet.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
arch/sandbox/include/asm/gpio.h
drivers/gpio/sandbox.c

index 74d7a4cd9598cce32ea0f8cc70659a4496b785bb..33b83ea4cc3fad3e2f2e11905d036a7123b6cb26 100644 (file)
@@ -25,8 +25,9 @@
 
 /* Our own private GPIO flags, which musn't conflict with GPIOD_... */
 #define GPIOD_EXT_HIGH         BIT(31) /* external source is high (else low) */
+#define GPIOD_EXT_DRIVEN       BIT(30) /* external source is driven */
 
-#define GPIOD_SANDBOX_MASK     BIT(31)
+#define GPIOD_SANDBOX_MASK     GENMASK(31, 30)
 
 /**
  * Return the simulated value of a GPIO (used only in sandbox test code)
index d1e561ab5e6878c6bc82f03fc58c19fa971f5223..700098446b501c5578913c57b2d1fa948e4b1d44 100644 (file)
@@ -76,16 +76,22 @@ static int set_gpio_flag(struct udevice *dev, unsigned int offset, ulong flag,
 int sandbox_gpio_get_value(struct udevice *dev, unsigned offset)
 {
        struct gpio_state *state = get_gpio_state(dev, offset);
+       bool val;
 
        if (get_gpio_flag(dev, offset, GPIOD_IS_OUT))
                debug("sandbox_gpio: get_value on output gpio %u\n", offset);
 
-       return state->flags & GPIOD_EXT_HIGH ? true : false;
+       if (state->flags & GPIOD_EXT_DRIVEN)
+               val = state->flags & GPIOD_EXT_HIGH;
+       else
+               val = false;
+
+       return val;
 }
 
 int sandbox_gpio_set_value(struct udevice *dev, unsigned offset, int value)
 {
-       set_gpio_flag(dev, offset, GPIOD_EXT_HIGH, value);
+       set_gpio_flag(dev, offset, GPIOD_EXT_DRIVEN | GPIOD_EXT_HIGH, value);
 
        return 0;
 }
@@ -142,8 +148,8 @@ static int sb_gpio_direction_output(struct udevice *dev, unsigned offset,
        ret = sandbox_gpio_set_direction(dev, offset, 1);
        if (ret)
                return ret;
-       ret = set_gpio_flag(dev, offset, GPIOD_IS_OUT_ACTIVE | GPIOD_EXT_HIGH,
-                           value);
+       ret = set_gpio_flag(dev, offset, GPIOD_IS_OUT_ACTIVE |
+                           GPIOD_EXT_DRIVEN | GPIOD_EXT_HIGH, value);
        if (ret)
                return ret;
 
@@ -171,8 +177,8 @@ static int sb_gpio_set_value(struct udevice *dev, unsigned offset, int value)
                return -1;
        }
 
-       ret = set_gpio_flag(dev, offset, GPIOD_IS_OUT_ACTIVE | GPIOD_EXT_HIGH,
-                           value);
+       ret = set_gpio_flag(dev, offset, GPIOD_IS_OUT_ACTIVE |
+                           GPIOD_EXT_DRIVEN | GPIOD_EXT_HIGH, value);
        if (ret)
                return ret;
 
@@ -218,10 +224,13 @@ static int sb_gpio_set_flags(struct udevice *dev, unsigned int offset,
        struct gpio_state *state = get_gpio_state(dev, offset);
 
        if (flags & GPIOD_IS_OUT) {
+               flags |= GPIOD_EXT_DRIVEN;
                if (flags & GPIOD_IS_OUT_ACTIVE)
                        flags |= GPIOD_EXT_HIGH;
                else
                        flags &= ~GPIOD_EXT_HIGH;
+       } else {
+               flags |= state->flags & GPIOD_SANDBOX_MASK;
        }
        state->flags = flags;