diff mbox series

[09/15] gpio: sandbox: Make sandbox_gpio_set_flags() set all flags

Message ID 20210115140500.846307-10-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show
Series gpio: Update and simplify the uclass API | expand

Commit Message

Simon Glass Jan. 15, 2021, 2:04 p.m. UTC
Allow this function to see all flags, including the internal sandbox ones.
This allows the tests to fully control the behaviour of the driver.

To make this work, move the setting of GPIOD_EXT_HIGH -to where the flags
are updated via driver model, rather than the sandbox 'back door'.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/gpio/sandbox.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

Comments

Patrick DELAUNAY Jan. 21, 2021, 9:43 a.m. UTC | #1
Hi Simon,

On 1/15/21 3:04 PM, Simon Glass wrote:
> Allow this function to see all flags, including the internal sandbox ones.
> This allows the tests to fully control the behaviour of the driver.
>
> To make this work, move the setting of GPIOD_EXT_HIGH -to where the flags
> are updated via driver model, rather than the sandbox 'back door'.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>   drivers/gpio/sandbox.c | 21 ++++++++++++++-------
>   1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpio/sandbox.c b/drivers/gpio/sandbox.c
> index ebc160cb849..11d4757abbb 100644
> --- a/drivers/gpio/sandbox.c
> +++ b/drivers/gpio/sandbox.c
> @@ -114,9 +114,7 @@ int sandbox_gpio_set_flags(struct udevice *dev, uint offset, ulong flags)
>   {
>   	struct gpio_state *state = get_gpio_state(dev, offset);
>   
> -	if (flags & GPIOD_IS_OUT_ACTIVE)
> -		flags |= GPIOD_EXT_HIGH;
> -	state->flags = (state->flags & GPIOD_SANDBOX_MASK) | flags;
> +	state->flags = flags;
>   
>   	return 0;
>   }
> @@ -213,17 +211,26 @@ static int sb_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
>   	return 0;
>   }
>   
> -static int sb_gpio_update_flags(struct udevice *dev, uint offset, ulong newf)
> +static int sb_gpio_update_flags(struct udevice *dev, uint offset, ulong flags)
>   {
> -	debug("%s: offset:%u, flags = %lx\n", __func__, offset, newf);
> +	debug("%s: offset:%u, flags = %lx\n", __func__, offset, flags);
> +	struct gpio_state *state = get_gpio_state(dev, offset);
> +
> +	if (flags & GPIOD_IS_OUT) {
> +		if (flags & GPIOD_IS_OUT_ACTIVE)
> +			flags |= GPIOD_EXT_HIGH;
> +		else
> +			flags &= ~GPIOD_EXT_HIGH;
> +	}

Here GPIOD_EXT_HIGH is fully managed with GPIOD_IS_OUT_ACTIVE.

So that correct my remark on function sandbox_gpio_set_flags() in 
previous patche

[PATCH 07/15] gpio: sandbox: Use a separate flag for the value


> +	state->flags = flags;
>   
> -	return sandbox_gpio_set_flags(dev, offset, newf);
> +	return 0;
>   }
>   
>   static int sb_gpio_get_flags(struct udevice *dev, uint offset, ulong *flagsp)
>   {
>   	debug("%s: offset:%u\n", __func__, offset);
> -	*flagsp = *get_gpio_flags(dev, offset);
> +	*flagsp = *get_gpio_flags(dev, offset) & ~GPIOD_SANDBOX_MASK;
>   
>   	return 0;
>   }


Reviewed-by: Patrick Delaunay <patrick.delaunay@foss.st.com>

Thanks

Patrick
diff mbox series

Patch

diff --git a/drivers/gpio/sandbox.c b/drivers/gpio/sandbox.c
index ebc160cb849..11d4757abbb 100644
--- a/drivers/gpio/sandbox.c
+++ b/drivers/gpio/sandbox.c
@@ -114,9 +114,7 @@  int sandbox_gpio_set_flags(struct udevice *dev, uint offset, ulong flags)
 {
 	struct gpio_state *state = get_gpio_state(dev, offset);
 
-	if (flags & GPIOD_IS_OUT_ACTIVE)
-		flags |= GPIOD_EXT_HIGH;
-	state->flags = (state->flags & GPIOD_SANDBOX_MASK) | flags;
+	state->flags = flags;
 
 	return 0;
 }
@@ -213,17 +211,26 @@  static int sb_gpio_xlate(struct udevice *dev, struct gpio_desc *desc,
 	return 0;
 }
 
-static int sb_gpio_update_flags(struct udevice *dev, uint offset, ulong newf)
+static int sb_gpio_update_flags(struct udevice *dev, uint offset, ulong flags)
 {
-	debug("%s: offset:%u, flags = %lx\n", __func__, offset, newf);
+	debug("%s: offset:%u, flags = %lx\n", __func__, offset, flags);
+	struct gpio_state *state = get_gpio_state(dev, offset);
+
+	if (flags & GPIOD_IS_OUT) {
+		if (flags & GPIOD_IS_OUT_ACTIVE)
+			flags |= GPIOD_EXT_HIGH;
+		else
+			flags &= ~GPIOD_EXT_HIGH;
+	}
+	state->flags = flags;
 
-	return sandbox_gpio_set_flags(dev, offset, newf);
+	return 0;
 }
 
 static int sb_gpio_get_flags(struct udevice *dev, uint offset, ulong *flagsp)
 {
 	debug("%s: offset:%u\n", __func__, offset);
-	*flagsp = *get_gpio_flags(dev, offset);
+	*flagsp = *get_gpio_flags(dev, offset) & ~GPIOD_SANDBOX_MASK;
 
 	return 0;
 }