Message ID | 20201210065013.29348-1-troy_lee@aspeedtech.com |
---|---|
State | New |
Headers | show |
Series | gpio: aspeed: Lock GPIO pin used as IRQ | expand |
On Thu, Dec 10, 2020 at 9:36 AM Troy Lee <troy_lee@aspeedtech.com> 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?
On Fri, 11 Dec 2020, at 00:44, Andy Shevchenko wrote: > On Thu, Dec 10, 2020 at 9:36 AM Troy Lee <troy_lee@aspeedtech.com> 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
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;