This patch configures the wakeup padconf registers to reflect the sysfs
power/wakeup settings. This allows a GPIO to wake the processor from
off mode.

Signed-off-by: Russ Dill <russ.d...@gmail.com>

---
 arch/arm/plat-omap/gpio.c |   58 ++++++++++++++++++++++++++++++--------------
 1 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/arch/arm/plat-omap/gpio.c b/arch/arm/plat-omap/gpio.c
index 64852db..3b2054b 100644
--- a/arch/arm/plat-omap/gpio.c
+++ b/arch/arm/plat-omap/gpio.c
@@ -277,7 +277,14 @@ static const struct gpio_pad_range gpio_pads_config[] = {
        { 170, 182, 0x1c6 },
        { 0, 0, 0x1e0 },
        { 186, 186, 0x1e2 },
+       { 187, 187, 0x238 },
+       { 32, 32, 0x23a },
        { 12, 29, 0x5d8 },
+       { 1, 1, 0xa06 },
+       { 30, 30, 0xa08 },
+       { 2, 10, 0xa0a },
+       { 11, 11, 0xa24 },
+       { 31, 31, 0xa26 },
 };
 
 /* GPIO -> PAD config mapping for OMAP3 */
@@ -289,7 +296,8 @@ struct gpio_pad {
 
 #define OMAP34XX_GPIO_AMT      (32 * OMAP34XX_NR_GPIOS)
 
-struct gpio_pad *gpio_pads;
+static struct gpio_pad *gpio_pads;
+static u16 gpio_pad_map[OMAP34XX_GPIO_AMT];
 #endif
 
 static struct gpio_bank *gpio_bank;
@@ -1353,32 +1361,21 @@ static int __init omap3_gpio_pads_init(void)
 {
        int i, j, min, max, gpio_amt;
        u16 offset;
-       u16 *gpio_pad_map;
 
        gpio_amt = 0;
 
-       gpio_pad_map = kzalloc(sizeof(u16) * OMAP34XX_GPIO_AMT, GFP_KERNEL);
-       if (gpio_pad_map == NULL) {
-               printk(KERN_ERR "FATAL: Failed to allocate gpio_pad_map\n");
-               return -ENOMEM;
-       }
-
        for (i = 0; i < ARRAY_SIZE(gpio_pads_config); i++) {
                min = gpio_pads_config[i].min;
                max = gpio_pads_config[i].max;
                offset = gpio_pads_config[i].offset;
 
                for (j = min; j <= max; j++) {
-                       /*
-                        * Check if pad has been configured as GPIO.
-                        * First module (gpio 0...31) is ignored as it is
-                        * in wakeup domain and does not need special
-                        * handling during off mode.
-                        */
-                       if (j > 31 && (omap_ctrl_readw(offset) &
+                       /* Check if pad has been configured as GPIO. */
+                       if ((omap_ctrl_readw(offset) &
                                OMAP34XX_MUX_MODE7) == OMAP34XX_MUX_MODE4) {
                                gpio_pad_map[j] = offset;
-                               gpio_amt++;
+                               if (j > 31)
+                                       gpio_amt++;
                        }
                        offset += 2;
                }
@@ -1388,20 +1385,23 @@ static int __init omap3_gpio_pads_init(void)
 
        if (gpio_pads == NULL) {
                printk(KERN_ERR "FATAL: Failed to allocate gpio_pads\n");
-               kfree(gpio_pad_map);
                return -ENOMEM;
        }
 
        gpio_amt = 0;
        for (i = 0; i < OMAP34XX_GPIO_AMT; i++) {
-               if (gpio_pad_map[i] != 0) {
+               /*
+                * First module (gpio 0...31) is ignored as it is
+                * in wakeup domain and does not need special
+                * handling during off mode.
+                */
+               if (gpio_pad_map[i] && i > 31) {
                        gpio_pads[gpio_amt].gpio = i;
                        gpio_pads[gpio_amt].offset = gpio_pad_map[i];
                        gpio_amt++;
                }
        }
        gpio_pads[gpio_amt].gpio = -1;
-       kfree(gpio_pad_map);
        return 0;
 }
 late_initcall(omap3_gpio_pads_init);
@@ -1676,6 +1676,26 @@ static int omap_gpio_suspend(struct sys_device *dev, 
pm_message_t mesg)
                __raw_writel(0xffffffff, wake_clear);
                __raw_writel(bank->suspend_wakeup, wake_set);
                spin_unlock_irqrestore(&bank->lock, flags);
+
+#ifdef CONFIG_ARCH_OMAP34XX
+               if (bank->method == METHOD_GPIO_24XX) {
+                       int j;
+                       for (j = 0; j < 32; j++) {
+                               int offset = gpio_pad_map[j + i * 32];
+                               u16 v;
+
+                               if (!offset)
+                                       continue;
+
+                               v = omap_ctrl_readw(offset);
+                               if (bank->suspend_wakeup & (1 << j))
+                                       v |= OMAP3_PADCONF_WAKEUPENABLE0;
+                               else
+                                       v &= ~OMAP3_PADCONF_WAKEUPENABLE0;
+                               omap_ctrl_writew(v, offset);
+                       }
+               }
+#endif
        }
 
        return 0;
-- 
1.6.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to