[ARM] pxa: add pxa2xx_mfp_set_lpm() to facilitate low power state change
authorEric Miao <eric.miao@marvell.com>
Mon, 16 Jun 2008 01:47:47 +0000 (09:47 +0800)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 9 Jul 2008 20:38:32 +0000 (21:38 +0100)
Some boards want to change low power state of pins on-the-fly, this
function helps to facilitate that operation instead of switching
back-n-forth between two configurations with pxa2xx_mfp_config().

Signed-off-by: Eric Miao <eric.miao@marvell.com>
Tested-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-pxa/mfp-pxa2xx.c
include/asm-arm/arch-pxa/mfp-pxa2xx.h

index ed91c043471bbf32825a0200af9efdcfce53adcb..fd4545eab8033172144a27f54edff48c4931872f 100644 (file)
@@ -39,6 +39,28 @@ struct gpio_desc {
 
 static struct gpio_desc gpio_desc[MFP_PIN_GPIO127 + 1];
 
+static int __mfp_config_lpm(unsigned gpio, unsigned long lpm)
+{
+       unsigned mask = GPIO_bit(gpio);
+
+       /* low power state */
+       switch (lpm) {
+       case MFP_LPM_DRIVE_HIGH:
+               PGSR(gpio) |= mask;
+               break;
+       case MFP_LPM_DRIVE_LOW:
+               PGSR(gpio) &= ~mask;
+               break;
+       case MFP_LPM_INPUT:
+               break;
+       default:
+               pr_warning("%s: invalid low power state for GPIO%d\n",
+                               __func__, gpio);
+               return -EINVAL;
+       }
+       return 0;
+}
+
 static int __mfp_config_gpio(unsigned gpio, unsigned long c)
 {
        unsigned long gafr, mask = GPIO_bit(gpio);
@@ -57,21 +79,8 @@ static int __mfp_config_gpio(unsigned gpio, unsigned long c)
        else
                GPDR(gpio) &= ~mask;
 
-       /* low power state */
-       switch (c & MFP_LPM_STATE_MASK) {
-       case MFP_LPM_DRIVE_HIGH:
-               PGSR(gpio) |= mask;
-               break;
-       case MFP_LPM_DRIVE_LOW:
-               PGSR(gpio) &= ~mask;
-               break;
-       case MFP_LPM_INPUT:
-               break;
-       default:
-               pr_warning("%s: invalid low power state for GPIO%d\n",
-                               __func__, gpio);
+       if (__mfp_config_lpm(gpio, c & MFP_LPM_STATE_MASK))
                return -EINVAL;
-       }
 
        /* give early warning if MFP_LPM_CAN_WAKEUP is set on the
         * configurations of those pins not able to wakeup
@@ -124,6 +133,20 @@ void pxa2xx_mfp_config(unsigned long *mfp_cfgs, int num)
        }
 }
 
+void pxa2xx_mfp_set_lpm(int mfp, unsigned long lpm)
+{
+       unsigned long flags;
+       int gpio;
+
+       gpio = __mfp_validate(mfp);
+       if (gpio < 0)
+               return;
+
+       local_irq_save(flags);
+       __mfp_config_lpm(gpio, lpm);
+       local_irq_restore(flags);
+}
+
 int gpio_set_wake(unsigned int gpio, unsigned int on)
 {
        struct gpio_desc *d;
index db8d890d237cab93c1ebf7ab493b16244e80a5d2..8de1c0dae624a29ff25b904a063dcf9633f290d2 100644 (file)
 #define GPIO84_GPIO    MFP_CFG_IN(GPIO84, AF0)
 
 extern void pxa2xx_mfp_config(unsigned long *mfp_cfgs, int num);
+extern void pxa2xx_mfp_set_lpm(int mfp, unsigned long lpm);
 extern int gpio_set_wake(unsigned int gpio, unsigned int on);
 #endif /* __ASM_ARCH_MFP_PXA2XX_H */