[ARM] pxa: add muxed gpio wakeup sources on pxa2xx architectures
authorRobert Jarzmik <robert.jarzmik@free.fr>
Thu, 13 Nov 2008 22:30:00 +0000 (23:30 +0100)
committerEric Miao <eric.miao@marvell.com>
Tue, 2 Dec 2008 06:42:36 +0000 (14:42 +0800)
PXA SoC have several GPIOs muxed on only one wakeup source.
Add support for these wakeup sources which were missing
in mfp core support.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Eric Miao <eric.miao@marvell.com>
arch/arm/mach-pxa/mfp-pxa2xx.c

index 2061c00c8ead6afd35d276b2f64028b50577fa25..28d10679e22503f3ea5e88391a2f091508d0cab9 100644 (file)
@@ -39,6 +39,7 @@ struct gpio_desc {
        unsigned        can_wakeup      : 1;
        unsigned        keypad_gpio     : 1;
        unsigned int    mask; /* bit mask in PWER or PKWR */
+       unsigned int    mux_mask; /* bit mask of muxed gpio bits, 0 if no mux */
        unsigned long   config;
 };
 
@@ -169,7 +170,7 @@ void pxa2xx_mfp_set_lpm(int mfp, unsigned long lpm)
 int gpio_set_wake(unsigned int gpio, unsigned int on)
 {
        struct gpio_desc *d;
-       unsigned long c;
+       unsigned long c, mux_taken;
 
        if (gpio > mfp_to_gpio(MFP_PIN_GPIO127))
                return -EINVAL;
@@ -183,9 +184,13 @@ int gpio_set_wake(unsigned int gpio, unsigned int on)
        if (d->keypad_gpio)
                return -EINVAL;
 
+       mux_taken = (PWER & d->mux_mask) & (~d->mask);
+       if (on && mux_taken)
+               return -EBUSY;
+
        if (d->can_wakeup && (c & MFP_LPM_CAN_WAKEUP)) {
                if (on) {
-                       PWER |= d->mask;
+                       PWER = (PWER & ~d->mux_mask) | d->mask;
 
                        if (c & MFP_LPM_EDGE_RISE)
                                PRER |= d->mask;
@@ -251,6 +256,22 @@ int keypad_set_wake(unsigned int on)
        return 0;
 }
 
+#define PWER_WEMUX2_GPIO38     (1 << 16)
+#define PWER_WEMUX2_GPIO53     (2 << 16)
+#define PWER_WEMUX2_GPIO40     (3 << 16)
+#define PWER_WEMUX2_GPIO36     (4 << 16)
+#define PWER_WEMUX2_MASK       (7 << 16)
+#define PWER_WEMUX3_GPIO31     (1 << 19)
+#define PWER_WEMUX3_GPIO113    (2 << 19)
+#define PWER_WEMUX3_MASK       (3 << 19)
+
+#define INIT_GPIO_DESC_MUXED(mux, gpio)                                \
+do {                                                           \
+       gpio_desc[(gpio)].can_wakeup = 1;                       \
+       gpio_desc[(gpio)].mask = PWER_ ## mux ## _GPIO ##gpio;  \
+       gpio_desc[(gpio)].mux_mask = PWER_ ## mux ## _MASK;     \
+} while (0)
+
 static void __init pxa27x_mfp_init(void)
 {
        int i, gpio;
@@ -286,6 +307,12 @@ static void __init pxa27x_mfp_init(void)
        gpio_desc[35].can_wakeup = 1;
        gpio_desc[35].mask = PWER_WE35;
 
+       INIT_GPIO_DESC_MUXED(WEMUX3, 31);
+       INIT_GPIO_DESC_MUXED(WEMUX3, 113);
+       INIT_GPIO_DESC_MUXED(WEMUX2, 38);
+       INIT_GPIO_DESC_MUXED(WEMUX2, 53);
+       INIT_GPIO_DESC_MUXED(WEMUX2, 40);
+       INIT_GPIO_DESC_MUXED(WEMUX2, 36);
        gpio_nr = 121;
 }
 #else