2020-12-10 07:40:16

by Troy Lee

[permalink] [raw]
Subject: [PATCH] gpio: aspeed: Lock GPIO pin used as IRQ

GPIO pins can be used as IRQ indicators. When they do,
those pins should be flaged with locks to avoid kernel
warning message.

Signed-off-by: Chia-Wei, Wang <[email protected]>
Signed-off-by: Troy Lee <[email protected]>
---
drivers/gpio/gpio-aspeed.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c
index b966f5e28ebf..f5b3e1d89fbf 100644
--- a/drivers/gpio/gpio-aspeed.c
+++ b/drivers/gpio/gpio-aspeed.c
@@ -651,6 +651,13 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
aspeed_gpio_copro_release(gpio, offset);
spin_unlock_irqrestore(&gpio->lock, flags);

+ rc = gpiochip_lock_as_irq(&gpio->chip, d->hwirq);
+ if (rc) {
+ dev_err(gpio->chip.parent, "unable to lock GPIO %lu as IRQ\n",
+ d->hwirq);
+ return rc;
+ }
+
irq_set_handler_locked(d, handler);

return 0;
--
2.17.1


2020-12-11 01:27:58

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH] gpio: aspeed: Lock GPIO pin used as IRQ

On Thu, Dec 10, 2020 at 9:36 AM Troy Lee <[email protected]> wrote:
>
> GPIO pins can be used as IRQ indicators. When they do,
> those pins should be flaged with locks to avoid kernel

flagged

> warning message.

...

> @@ -651,6 +651,13 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)

> + rc = gpiochip_lock_as_irq(&gpio->chip, d->hwirq);
> + if (rc) {
> + dev_err(gpio->chip.parent, "unable to lock GPIO %lu as IRQ\n",
> + d->hwirq);
> + return rc;
> + }

It's a copy'n'paste of generic code. Why do you need it in an unusual
place, i.e. ->irq_set_type() IIUC?
Can you elaborate about an issue, because this seems to be a hack?

--
With Best Regards,
Andy Shevchenko

2020-12-14 09:32:47

by Andrew Jeffery

[permalink] [raw]
Subject: Re: [PATCH] gpio: aspeed: Lock GPIO pin used as IRQ



On Fri, 11 Dec 2020, at 00:44, Andy Shevchenko wrote:
> On Thu, Dec 10, 2020 at 9:36 AM Troy Lee <[email protected]> wrote:
> >
> > GPIO pins can be used as IRQ indicators. When they do,
> > those pins should be flaged with locks to avoid kernel
>
> flagged
>
> > warning message.
>
> ...
>
> > @@ -651,6 +651,13 @@ static int aspeed_gpio_set_type(struct irq_data *d, unsigned int type)
>
> > + rc = gpiochip_lock_as_irq(&gpio->chip, d->hwirq);
> > + if (rc) {
> > + dev_err(gpio->chip.parent, "unable to lock GPIO %lu as IRQ\n",
> > + d->hwirq);
> > + return rc;
> > + }
>
> It's a copy'n'paste of generic code. Why do you need it in an unusual
> place, i.e. ->irq_set_type() IIUC?
> Can you elaborate about an issue, because this seems to be a hack?

Yep - Troy please provide more information. What was the warning you saw? How
were the GPIOs allocated on the system that triggered the warning? What did you
do to trigger the warning?

Andrew