On 5/30/2020 12:49 AM, Stefan Wahren wrote: > Hi Florian, > > Am 29.05.20 um 21:15 schrieb Florian Fainelli: >> Leverage the IRQCHIP_MASK_ON_SUSPEND flag in order to avoid having to >> specifically treat the GPIO interrupts during suspend and resume, and >> simply implement an irq_set_wake() callback that is responsible for >> enabling the parent wake-up interrupt as a wake-up interrupt. >> >> To avoid allocating unnecessary resources for other chips, the wake-up >> interrupts are only initialized if we have a brcm,bcm7211-gpio >> compatibility string. >> >> Signed-off-by: Florian Fainelli <f.fainelli@xxxxxxxxx> >> --- >> drivers/pinctrl/bcm/pinctrl-bcm2835.c | 76 ++++++++++++++++++++++++++- >> 1 file changed, 75 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c >> index 1b00d93aa66e..1fbf067a3eed 100644 >> --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c >> +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c >> @@ -19,6 +19,7 @@ >> #include <linux/irq.h> >> #include <linux/irqdesc.h> >> #include <linux/init.h> >> +#include <linux/interrupt.h> >> #include <linux/of_address.h> >> #include <linux/of.h> >> #include <linux/of_irq.h> >> @@ -76,6 +77,7 @@ >> struct bcm2835_pinctrl { >> struct device *dev; >> void __iomem *base; >> + int *wake_irq; >> >> /* note: locking assumes each bank will have its own unsigned long */ >> unsigned long enabled_irq_map[BCM2835_NUM_BANKS]; >> @@ -435,6 +437,11 @@ static void bcm2835_gpio_irq_handler(struct irq_desc *desc) >> chained_irq_exit(host_chip, desc); >> } >> >> +static irqreturn_t bcm2835_gpio_wake_irq_handler(int irq, void *dev_id) >> +{ >> + return IRQ_HANDLED; >> +} >> + >> static inline void __bcm2835_gpio_irq_config(struct bcm2835_pinctrl *pc, >> unsigned reg, unsigned offset, bool enable) >> { >> @@ -634,6 +641,34 @@ static void bcm2835_gpio_irq_ack(struct irq_data *data) >> bcm2835_gpio_set_bit(pc, GPEDS0, gpio); >> } >> >> +static int bcm2835_gpio_irq_set_wake(struct irq_data *data, unsigned int on) >> +{ >> + struct gpio_chip *chip = irq_data_get_irq_chip_data(data); >> + struct bcm2835_pinctrl *pc = gpiochip_get_data(chip); >> + unsigned gpio = irqd_to_hwirq(data); >> + unsigned int irqgroup; >> + int ret = -EINVAL; >> + >> + if (!pc->wake_irq) >> + return ret; >> + >> + if (gpio <= 27) >> + irqgroup = 0; >> + else if (gpio >= 28 && gpio <= 45) >> + irqgroup = 1; >> + else if (gpio >= 46 && gpio <= 53) >> + irqgroup = 2; > in case the BCM7211 has 58 GPIOs, but the wake up interrupts are only > available for the first 54 this should deserve a comment. irqgroup 2 covers GPIOs 46 through 57, thanks for noticing. Do you have more comments before I spin a v3? Thank you for reviewing. -- Florian