gpio: dwapb: Add wakeup source support

Message ID 1504910475-6682-1-git-send-email-hotran@apm.com
State New
Headers show
Series
  • gpio: dwapb: Add wakeup source support
Related show

Commit Message

Hoan Tran Sept. 8, 2017, 10:41 p.m.
This patch supports irq_set_wake for dwapb gpio. It allows GPIOs
to be configured as wakeup sources and wake the system from suspend.

Signed-off-by: Hoan Tran <hotran@apm.com>
---
 drivers/gpio/gpio-dwapb.c | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

Comments

Linus Walleij Sept. 12, 2017, 9:47 a.m. | #1
On Sat, Sep 9, 2017 at 12:41 AM, Hoan Tran <hotran@apm.com> wrote:

> This patch supports irq_set_wake for dwapb gpio. It allows GPIOs
> to be configured as wakeup sources and wake the system from suspend.
>
> Signed-off-by: Hoan Tran <hotran@apm.com>

Seems very useful, patch applied for v4.15 (next).

This important, complex and versatile driver does not
have an active maintainer in MAINTAINERS.

Jamie, do you consider yourself maintainer? If not
would someone else using this driver please step up?

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
Jamie Iles Sept. 12, 2017, 10:14 p.m. | #2
Hi Linus,

On Tue, Sep 12, 2017 at 11:47:52AM +0200, Linus Walleij wrote:
> Jamie, do you consider yourself maintainer? If not
> would someone else using this driver please step up?

I don't think I'm best suited to the job - I don't actually have access 
to the docs for this IP block any more so can't provide meaningful 
review for hardware details.

Thanks,

Jamie
--
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
Linus Walleij Sept. 14, 2017, 9:15 a.m. | #3
On Wed, Sep 13, 2017 at 12:14 AM, Jamie Iles <jamie@jamieiles.com> wrote:
> On Tue, Sep 12, 2017 at 11:47:52AM +0200, Linus Walleij wrote:
>> Jamie, do you consider yourself maintainer? If not
>> would someone else using this driver please step up?
>
> I don't think I'm best suited to the job - I don't actually have access
> to the docs for this IP block any more so can't provide meaningful
> review for hardware details.

Fair enough.

Hoan, would you please consider adding yourself as maintainer
for this driver in MAINTAINERS?

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

Patch

diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
index c07ada9..5cdb7bc 100644
--- a/drivers/gpio/gpio-dwapb.c
+++ b/drivers/gpio/gpio-dwapb.c
@@ -77,6 +77,7 @@  struct dwapb_context {
 	u32 int_type;
 	u32 int_pol;
 	u32 int_deb;
+	u32 wake_en;
 };
 #endif
 
@@ -295,6 +296,22 @@  static int dwapb_irq_set_type(struct irq_data *d, u32 type)
 	return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int dwapb_irq_set_wake(struct irq_data *d, unsigned int enable)
+{
+	struct irq_chip_generic *igc = irq_data_get_irq_chip_data(d);
+	struct dwapb_gpio *gpio = igc->private;
+	struct dwapb_context *ctx = gpio->ports[0].ctx;
+
+	if (enable)
+		ctx->wake_en |= BIT(d->hwirq);
+	else
+		ctx->wake_en &= ~BIT(d->hwirq);
+
+	return 0;
+}
+#endif
+
 static int dwapb_gpio_set_debounce(struct gpio_chip *gc,
 				   unsigned offset, unsigned debounce)
 {
@@ -385,6 +402,9 @@  static void dwapb_configure_irqs(struct dwapb_gpio *gpio,
 		ct->chip.irq_disable = dwapb_irq_disable;
 		ct->chip.irq_request_resources = dwapb_irq_reqres;
 		ct->chip.irq_release_resources = dwapb_irq_relres;
+#ifdef CONFIG_PM_SLEEP
+		ct->chip.irq_set_wake = dwapb_irq_set_wake;
+#endif
 		ct->regs.ack = gpio_reg_convert(gpio, GPIO_PORTA_EOI);
 		ct->regs.mask = gpio_reg_convert(gpio, GPIO_INTMASK);
 		ct->type = IRQ_TYPE_LEVEL_MASK;
@@ -699,7 +719,8 @@  static int dwapb_gpio_suspend(struct device *dev)
 			ctx->int_deb	= dwapb_read(gpio, GPIO_PORTA_DEBOUNCE);
 
 			/* Mask out interrupts */
-			dwapb_write(gpio, GPIO_INTMASK, 0xffffffff);
+			dwapb_write(gpio, GPIO_INTMASK,
+				    0xffffffff & ~ctx->wake_en);
 		}
 	}
 	spin_unlock_irqrestore(&gc->bgpio_lock, flags);