[PATCH] gpio-aspeed: Write value on switch to output

Joel Stanley joel at jms.id.au
Mon Aug 8 15:06:28 AEST 2016


On Fri, Aug 5, 2016 at 9:53 PM, Andrew Jeffery <andrew at aj.id.au> wrote:
> [0] notes that the Barreleye beep LED turned off during boot despite
> configuring the default-state DT property to "on". The documentation for the
> direction_output() callback in struct gpio_chip doesn't make any mention of
> setting values[1] but the function prototype takes a value as a formal
> parameter. Additionally, other drivers' callback implementations (e.g. the
> gemini GPIO driver) write out the provided value.
>
> Make the Aspeed GPIO driver implementation consistent with the expected
> behaviour.
>
> [0] https://github.com/openbmc/linux/issues/98
> [1] "@direction_output: configures signal "offset" as output, or returns error"

Thanks. I applied the version that you intended to send to my
development tree. I think we want to push this out to dev-4.4 for the
barreleye stable branch too?

Cheers,

Joel

>
> Signed-off-by: Andrew Jeffery <andrew at aj.id.au>
> ---
>  drivers/gpio/gpio-aspeed.c | 31 ++++++++++++++++++++-----------
>  1 file changed, 20 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
> index 2ecaa2b12759..7817b98fe8cd 100644
> --- a/drivers/gpio/gpio-aspeed.c
> +++ b/drivers/gpio/gpio-aspeed.c
> @@ -120,23 +120,29 @@ static int aspeed_gpio_get(struct gpio_chip *gc, unsigned int offset)
>                         & GPIO_BIT(offset));
>  }
>
> -static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
> -                           int val)
> +static void __aspeed_gpio_set(void __iomem *addr, unsigned int offset, int val)
>  {
> -       struct aspeed_gpio *gpio = to_aspeed_gpio(gc);
> -       const struct aspeed_gpio_bank *bank = to_bank(offset);
> -       unsigned long flags;
>         u32 reg;
>
> -       spin_lock_irqsave(&gpio->lock, flags);
> -
> -       reg = ioread32(bank_val_reg(gpio, bank, GPIO_DATA));
> +       reg = ioread32(addr);
>         if (val)
>                 reg |= GPIO_BIT(offset);
>         else
>                 reg &= ~GPIO_BIT(offset);
>
> -       iowrite32(reg, bank_val_reg(gpio, bank, GPIO_DATA));
> +       iowrite32(reg, addr);
> +}
> +
> +static void aspeed_gpio_set(struct gpio_chip *gc, unsigned int offset,
> +                           int val)
> +{
> +       struct aspeed_gpio *gpio = to_aspeed_gpio(gc);
> +       const struct aspeed_gpio_bank *bank = to_bank(offset);
> +       unsigned long flags;
> +
> +       spin_lock_irqsave(&gpio->lock, flags);
> +
> +       __aspeed_gpio_set(bank_val_reg(gpio, bank, GPIO_DATA), offset, val);
>
>         spin_unlock_irqrestore(&gpio->lock, flags);
>  }
> @@ -163,13 +169,16 @@ static int aspeed_gpio_dir_out(struct gpio_chip *gc,
>  {
>         struct aspeed_gpio *gpio = to_aspeed_gpio(gc);
>         const struct aspeed_gpio_bank *bank = to_bank(offset);
> +       void __iomem *addr = bank_val_reg(gpio, bank, GPIO_DIR);
>         unsigned long flags;
>         u32 reg;
>
>         spin_lock_irqsave(&gpio->lock, flags);
>
> -       reg = ioread32(bank_val_reg(gpio, bank, GPIO_DIR));
> -       iowrite32(reg | GPIO_BIT(offset), bank_val_reg(gpio, bank, GPIO_DIR));
> +       reg = ioread32(addr);
> +       iowrite32(reg | GPIO_BIT(offset), addr);
> +
> +       __aspeed_gpio_set(addr, offset, val);
>
>         spin_unlock_irqrestore(&gpio->lock, flags);
>
> --
> 2.9.2.597.g66765a4
>


More information about the openbmc mailing list