Message ID | 1397174424-30855-1-git-send-email-tim.kryger@linaro.org |
---|---|
State | New |
Headers | show |
On Fri, Apr 11, 2014 at 2:00 AM, Tim Kryger <tim.kryger@linaro.org> wrote: > If a consumer of a GPIO-based IRQ identifies itself as wanting to > have the capability to wake up the system through that interrupt, > update the flags to keep that interrupt enabled in suspend. > > Signed-off-by: Tim Kryger <tim.kryger@linaro.org> (...) > +#ifdef CONFIG_SUSPEND > +static int bcm_kona_gpio_irq_set_wake(struct irq_data *d, unsigned int on) > +{ > + > + struct irq_desc *desc = container_of(d, struct irq_desc, irq_data); > + > + if (on) > + desc->action->flags |= IRQF_NO_SUSPEND; > + else > + desc->action->flags &= ~IRQF_NO_SUSPEND; > + > + return 0; > +} > +#else > +#define bcm_kona_gpio_irq_set_wake NULL > +#endif Tglx: is this generally speaking the right thing to do for a cascaded irqchip? (It looks a bit odd but makes some sense.) > static void bcm_kona_gpio_irq_mask(struct irq_data *d) > { > struct bcm_kona_gpio *kona_gpio; > @@ -494,6 +512,7 @@ static struct irq_chip bcm_gpio_irq_chip = { > .irq_set_type = bcm_kona_gpio_irq_set_type, > .irq_request_resources = bcm_kona_gpio_irq_reqres, > .irq_release_resources = bcm_kona_gpio_irq_relres, > + .irq_set_wake = bcm_kona_gpio_irq_set_wake, > }; So I have introduced the generic GPIO irqchip helpers in order to avoid fixing exactly this type of bug in 200 different places. Can you take this action: (A) Convert the BCM kona driver to use the genric GPIO irqchip helpers e.g. in the manner of this patch: http://marc.info/?l=linux-gpio&m=139696011031186&w=2 (B) Make exactly this bug fix in the gpiolib irqchip helpers, by partching drivers/gpio/gpiolib.c instead? That way we solve the problem for *several* chips in one go. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpio/gpio-bcm-kona.c b/drivers/gpio/gpio-bcm-kona.c index 3f6b33c..b0e0971 100644 --- a/drivers/gpio/gpio-bcm-kona.c +++ b/drivers/gpio/gpio-bcm-kona.c @@ -20,6 +20,7 @@ #include <linux/module.h> #include <linux/irqdomain.h> #include <linux/irqchip/chained_irq.h> +#include <linux/interrupt.h> #define BCM_GPIO_PASSWD 0x00a5a501 #define GPIO_PER_BANK 32 @@ -340,6 +341,23 @@ static void bcm_kona_gpio_irq_ack(struct irq_data *d) spin_unlock_irqrestore(&kona_gpio->lock, flags); } +#ifdef CONFIG_SUSPEND +static int bcm_kona_gpio_irq_set_wake(struct irq_data *d, unsigned int on) +{ + + struct irq_desc *desc = container_of(d, struct irq_desc, irq_data); + + if (on) + desc->action->flags |= IRQF_NO_SUSPEND; + else + desc->action->flags &= ~IRQF_NO_SUSPEND; + + return 0; +} +#else +#define bcm_kona_gpio_irq_set_wake NULL +#endif + static void bcm_kona_gpio_irq_mask(struct irq_data *d) { struct bcm_kona_gpio *kona_gpio; @@ -494,6 +512,7 @@ static struct irq_chip bcm_gpio_irq_chip = { .irq_set_type = bcm_kona_gpio_irq_set_type, .irq_request_resources = bcm_kona_gpio_irq_reqres, .irq_release_resources = bcm_kona_gpio_irq_relres, + .irq_set_wake = bcm_kona_gpio_irq_set_wake, }; static struct __initconst of_device_id bcm_kona_gpio_of_match[] = {
If a consumer of a GPIO-based IRQ identifies itself as wanting to have the capability to wake up the system through that interrupt, update the flags to keep that interrupt enabled in suspend. Signed-off-by: Tim Kryger <tim.kryger@linaro.org> --- drivers/gpio/gpio-bcm-kona.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)