Re: [PATCH] save/restore samcop gpio configuration upon PM events

From: Milan Plzik <milan.plzik_at_gmail.com>
Date: Wed, 26 Sep 2007 20:17:50 +0200

  New revision of patch, with static functions and added some
whitespace:)

Signed-off-by: Milan Plzik <milan.plzik_at_gmail.com>

---
 drivers/mfd/samcop_base.c |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/drivers/mfd/samcop_base.c b/drivers/mfd/samcop_base.c
index 97901f6..4a92176 100644
--- a/drivers/mfd/samcop_base.c
+++ b/drivers/mfd/samcop_base.c
@@ -64,6 +64,8 @@
 #include <asm/arch/clock.h>
 #include <asm/types.h>
 
+#define SAMCOP_GPIO_REGISTERS (_SAMCOP_GPIO_INTPND/sizeof(uint32_t))
+
 struct samcop_data
 {
 	struct device *dev;
@@ -73,6 +75,7 @@ struct samcop_data
 	unsigned long irqmask;
 	struct platform_device **devices;
 	int ndevices;
+	uint32_t gpio_suspend_data[SAMCOP_GPIO_REGISTERS];
 } *samcop_device_data;	/* XXX samcop_device_data is a hack */
 
 static void samcop_set_gpio_bit(struct device *dev, unsigned gpio, int
val);
@@ -981,6 +984,32 @@ void samcop_set_gpio_int_enable(struct device *dev,
unsigned int idx, u32 mask,
 	spin_unlock_irqrestore(&samcop->gpio_lock, flags);
 }
 
+static void samcop_gpio_suspend(struct platform_device *pdev)
+{
+	struct samcop_data *samcop;
+	int i;
+
+	samcop = platform_get_drvdata(pdev);
+
+	for (i=0; i < SAMCOP_GPIO_REGISTERS; i++) {
+		samcop->gpio_suspend_data[i] = 
+			samcop_read_register(samcop, _SAMCOP_GPIO_Base + i * 4);
+	};
+}
+
+static void samcop_gpio_resume(struct platform_device *pdev)
+{
+	struct samcop_data *samcop;
+	int i;
+
+	samcop = platform_get_drvdata(pdev);
+
+	for (i = 0; i < SAMCOP_GPIO_REGISTERS; i++) {
+		samcop_write_register(samcop, _SAMCOP_GPIO_Base + i * 4, 
+			samcop->gpio_suspend_data[i]);
+	};
+}
+
 void samcop_reset_fcd(struct device *dev)
 {
 	struct samcop_data *samcop = dev->driver_data;
@@ -1403,6 +1432,8 @@ static int samcop_suspend(struct platform_device
*pdev, pm_message_t state)
 {
 	struct samcop_data *samcop;
 
+	samcop_gpio_suspend(pdev);
+
 	samcop = platform_get_drvdata(pdev);
 
 	samcop->irqmask = samcop_read_register(samcop, SAMCOP_IC_INTMSK);
@@ -1418,6 +1449,8 @@ static int samcop_resume(struct platform_device
*pdev)
 {
 	struct samcop_data *samcop;
 
+	samcop_gpio_resume(pdev);
+
 	samcop = platform_get_drvdata(pdev);
 
 	if (samcop->irqmask != 0xffffffff)
-- 
1.5.3.2
Received on Wed Sep 26 2007 - 14:17:49 EDT

This archive was generated by hypermail 2.2.0 : Wed Sep 26 2007 - 14:18:33 EDT