devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Agner <stefan@agner.ch>
To: shawnguo@kernel.org, mturquette@baylibre.com, sboyd@codeaurora.org
Cc: kernel@pengutronix.de, sergeimir@emcraft.com, tglx@linutronix.de,
	jason@lakedaemon.net, marc.zyngier@arm.com, robh+dt@kernel.org,
	pawel.moll@arm.com, mark.rutland@arm.com,
	ijc+devicetree@hellion.org.uk, galak@codeaurora.org,
	devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org,
	Stefan Agner <stefan@agner.ch>
Subject: [PATCH 12/18] gpio: vf610: add system PM suspend/resume
Date: Wed,  9 Mar 2016 18:16:53 -0800	[thread overview]
Message-ID: <1457576219-7971-13-git-send-email-stefan@agner.ch> (raw)
In-Reply-To: <1457576219-7971-1-git-send-email-stefan@agner.ch>

Store the state of the GPIO module (which contains the GPIO output
state) in memory during suspend. The driver already maintains an
interrupt configuration in memory, hence we can use this
configuration to restore the port control register (PCR).

Signed-off-by: Stefan Agner <stefan@agner.ch>
---
 drivers/gpio/gpio-vf610.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c
index 6284bdb..1a022be 100644
--- a/drivers/gpio/gpio-vf610.c
+++ b/drivers/gpio/gpio-vf610.c
@@ -37,6 +37,7 @@ struct vf610_gpio_port {
 	void __iomem *gpio_base;
 	u8 irqc[VF610_GPIO_PER_PORT];
 	int irq;
+	u32 state;
 };
 
 #define GPIO_PDOR		0x00
@@ -215,6 +216,40 @@ static struct irq_chip vf610_gpio_irq_chip = {
 	.irq_set_wake	= vf610_gpio_irq_set_wake,
 };
 
+static int __maybe_unused vf610_gpio_suspend(struct device *dev)
+{
+	struct vf610_gpio_port *port = dev_get_drvdata(dev);
+
+	port->state = vf610_gpio_readl(port->gpio_base + GPIO_PDOR);
+
+	/*
+	 * There is no need to store Port state since we maintain the state
+	 * alread in the irqc array
+	 */
+
+	return 0;
+}
+
+static int __maybe_unused vf610_gpio_resume(struct device *dev)
+{
+	struct vf610_gpio_port *port = dev_get_drvdata(dev);
+	int i;
+
+	vf610_gpio_writel(port->state, port->gpio_base + GPIO_PDOR);
+
+	for (i = 0; i < port->gc.ngpio; i++) {
+		u32 irqc = port->irqc[i] << PORT_PCR_IRQC_OFFSET;
+
+		vf610_gpio_writel(irqc, port->base + PORT_PCR(i));
+	}
+
+	return 0;
+}
+
+static const struct dev_pm_ops vf610_gpio_pm_ops = {
+	SET_SYSTEM_SLEEP_PM_OPS(vf610_gpio_suspend, vf610_gpio_resume)
+};
+
 static int vf610_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -272,6 +307,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
 	}
 	gpiochip_set_chained_irqchip(gc, &vf610_gpio_irq_chip, port->irq,
 				     vf610_gpio_irq_handler);
+	platform_set_drvdata(pdev, port);
 
 	return 0;
 }
@@ -279,6 +315,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
 static struct platform_driver vf610_gpio_driver = {
 	.driver		= {
 		.name	= "gpio-vf610",
+		.pm = &vf610_gpio_pm_ops,
 		.of_match_table = vf610_gpio_dt_ids,
 	},
 	.probe		= vf610_gpio_probe,
-- 
2.7.2


  parent reply	other threads:[~2016-03-10  2:16 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-10  2:16 [PATCH 00/18] ARM: vf610: Suspend/resume with self-refresh mode Stefan Agner
2016-03-10  2:16 ` [PATCH 02/18] ARM: dts: vf610: add GPC as new interrupt parent Stefan Agner
2016-03-31  8:21   ` Shawn Guo
2016-03-31 17:53     ` Stefan Agner
2016-03-10  2:16 ` [PATCH 03/18] ARM: dts: vf610-colibri: GPIO wakeup key Stefan Agner
2016-03-31  8:19   ` Shawn Guo
2016-03-31 17:55     ` Stefan Agner
2016-03-10  2:16 ` [PATCH 04/18] ARM: dts: vf610: add on-chip SRAM Stefan Agner
2016-03-31  8:33   ` Shawn Guo
2016-03-31 17:57     ` Stefan Agner
2016-03-10  2:16 ` [PATCH 05/18] ARM: dts: vf610: add modules required for PM Stefan Agner
     [not found]   ` <1457576219-7971-6-git-send-email-stefan-XLVq0VzYD2Y@public.gmane.org>
2016-03-31  8:34     ` Shawn Guo
2016-03-10  2:16 ` [PATCH 06/18] ARM: imx: clk-gate2: allow custom gate configuration Stefan Agner
2016-03-31 11:37   ` Shawn Guo
2016-03-31 17:59     ` Stefan Agner
2016-03-10  2:16 ` [PATCH 07/18] ARM: imx: clk-vf610: leave DDR clock on Stefan Agner
2016-03-10  2:16 ` [PATCH 09/18] ARM: vf610: clk: add suspend/resume support Stefan Agner
2016-03-31 11:39   ` Shawn Guo
     [not found] ` <1457576219-7971-1-git-send-email-stefan-XLVq0VzYD2Y@public.gmane.org>
2016-03-10  2:16   ` [PATCH 01/18] irqchip: vf610-gpc: add Vybrid GPC IRQ controller Stefan Agner
     [not found]     ` <1457576219-7971-2-git-send-email-stefan-XLVq0VzYD2Y@public.gmane.org>
2016-03-11  3:41       ` Marc Zyngier
2016-03-11 18:11         ` Stefan Agner
2016-03-12  0:21           ` Marc Zyngier
2016-03-31  8:07     ` Shawn Guo
2016-03-10  2:16   ` [PATCH 08/18] ARM: clk: add WKPU unit Stefan Agner
2016-03-16  1:13     ` Stephen Boyd
2016-03-10  2:16   ` [PATCH 10/18] tty: serial: fsl_lpuart: support suspend/resume Stefan Agner
2016-03-31 11:41     ` Shawn Guo
2016-03-10  2:16   ` [PATCH 13/18] ARM: dts: vf610: add WKPU connection to GPIO Stefan Agner
2016-03-10  2:16   ` [PATCH 17/18] Documentation: dt: add Vybrid DDR memory controller bindings Stefan Agner
2016-03-18 16:10     ` Rob Herring
2016-03-10  2:16 ` [PATCH 11/18] pinctrl: pinctrl-imx: implement suspend/resume Stefan Agner
2016-03-10  2:16 ` Stefan Agner [this message]
2016-03-10  2:16 ` [PATCH 14/18] gpio: vf610: add support for WKPU unit Stefan Agner
2016-03-17 20:00   ` Rob Herring
2016-03-17 22:12     ` Stefan Agner
2016-03-10  2:16 ` [PATCH 15/18] ARM: vf610: PM: initial suspend/resume support Stefan Agner
2016-03-10 21:19   ` kbuild test robot
2016-04-01  2:25   ` Shawn Guo
2016-04-01  6:40     ` Stefan Agner
2016-03-10  2:16 ` [PATCH 16/18] ARM: vf610: PM: enable Suspend-to-RAM only if hardware fixes are in place Stefan Agner
2016-03-10  2:16 ` [PATCH 18/18] ARM: vf610: PM: enable SNVS access Stefan Agner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1457576219-7971-13-git-send-email-stefan@agner.ch \
    --to=stefan@agner.ch \
    --cc=devicetree@vger.kernel.org \
    --cc=galak@codeaurora.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=jason@lakedaemon.net \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=mark.rutland@arm.com \
    --cc=mturquette@baylibre.com \
    --cc=pawel.moll@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=sboyd@codeaurora.org \
    --cc=sergeimir@emcraft.com \
    --cc=shawnguo@kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).