]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
gpio/nomadik: support low EMI mode
authorRabin Vincent <rabin.vincent@stericsson.com>
Wed, 28 Sep 2011 10:19:11 +0000 (15:49 +0530)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 23 Apr 2012 09:06:08 +0000 (11:06 +0200)
Low EMI (Electro-Magnetic Interference) mode means lower slew
rate on the signals. The Nomadik GPIO controller supports
this so create an interface to enable it.

Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
Reviewed-by: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
arch/arm/plat-nomadik/include/plat/gpio-nomadik.h
arch/arm/plat-nomadik/include/plat/pincfg.h
drivers/gpio/gpio-nomadik.c

index 9605bf227df9e9ebca2ccda718f8e4aa7a81c9f8..3e8b7f16fb7819716f62a6442a99b7ad7752ab03 100644 (file)
@@ -29,6 +29,7 @@
 #define NMK_GPIO_SLPC  0x1c
 #define NMK_GPIO_AFSLA 0x20
 #define NMK_GPIO_AFSLB 0x24
+#define NMK_GPIO_LOWEMI        0x28
 
 #define NMK_GPIO_RIMSC 0x40
 #define NMK_GPIO_FIMSC 0x44
index 22cb97d2d8adc0bc225458f43f7561e32f540734..da6b1e35e171a2e51240c51e73b397f232b1b587 100644 (file)
@@ -105,6 +105,12 @@ typedef unsigned long pin_cfg_t;
 #define PIN_SLPM_VAL_LOW       ((1 + 0) << PIN_SLPM_VAL_SHIFT)
 #define PIN_SLPM_VAL_HIGH      ((1 + 1) << PIN_SLPM_VAL_SHIFT)
 
+#define PIN_LOWEMI_SHIFT       25
+#define PIN_LOWEMI_MASK                (0x1 << PIN_LOWEMI_SHIFT)
+#define PIN_LOWEMI(x)          (((x) & PIN_LOWEMI_MASK) >> PIN_LOWEMI_SHIFT)
+#define PIN_LOWEMI_DISABLED    (0 << PIN_LOWEMI_SHIFT)
+#define PIN_LOWEMI_ENABLED     (1 << PIN_LOWEMI_SHIFT)
+
 /* Shortcuts.  Use these instead of separate DIR, PULL, and VAL.  */
 #define PIN_INPUT_PULLDOWN     (PIN_DIR_INPUT | PIN_PULL_DOWN)
 #define PIN_INPUT_PULLUP       (PIN_DIR_INPUT | PIN_PULL_UP)
index 681daee80291abb91aa43537a5662124e3eb332e..7b45d88b4f44256b845a7505639cd43502303b93 100644 (file)
@@ -61,6 +61,7 @@ struct nmk_gpio_chip {
        u32 rimsc;
        u32 fimsc;
        u32 pull_up;
+       u32 lowemi;
 };
 
 static struct nmk_gpio_chip *
@@ -125,6 +126,24 @@ static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
        }
 }
 
+static void __nmk_gpio_set_lowemi(struct nmk_gpio_chip *nmk_chip,
+                                 unsigned offset, bool lowemi)
+{
+       u32 bit = BIT(offset);
+       bool enabled = nmk_chip->lowemi & bit;
+
+       if (lowemi == enabled)
+               return;
+
+       if (lowemi)
+               nmk_chip->lowemi |= bit;
+       else
+               nmk_chip->lowemi &= ~bit;
+
+       writel_relaxed(nmk_chip->lowemi,
+                      nmk_chip->addr + NMK_GPIO_LOWEMI);
+}
+
 static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip,
                                  unsigned offset)
 {
@@ -269,6 +288,8 @@ static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset,
                __nmk_gpio_set_pull(nmk_chip, offset, pull);
        }
 
+       __nmk_gpio_set_lowemi(nmk_chip, offset, PIN_LOWEMI(cfg));
+
        /*
         * If the pin is switching to altfunc, and there was an interrupt
         * installed on it which has been lazy disabled, actually mask the
@@ -1181,6 +1202,10 @@ static int __devinit nmk_gpio_probe(struct platform_device *dev)
        chip->dev = &dev->dev;
        chip->owner = THIS_MODULE;
 
+       clk_enable(nmk_chip->clk);
+       nmk_chip->lowemi = readl_relaxed(nmk_chip->addr + NMK_GPIO_LOWEMI);
+       clk_disable(nmk_chip->clk);
+
        ret = gpiochip_add(&nmk_chip->chip);
        if (ret)
                goto out_free;