Commit ebc6178d authored by Rabin Vincent's avatar Rabin Vincent Committed by Linus Walleij

gpio/nomadik: support low EMI mode

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: default avatarRabin Vincent <rabin.vincent@stericsson.com>
Reviewed-by: default avatarSrinidhi Kasagar <srinidhi.kasagar@stericsson.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 6c42ad1c
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#define NMK_GPIO_SLPC 0x1c #define NMK_GPIO_SLPC 0x1c
#define NMK_GPIO_AFSLA 0x20 #define NMK_GPIO_AFSLA 0x20
#define NMK_GPIO_AFSLB 0x24 #define NMK_GPIO_AFSLB 0x24
#define NMK_GPIO_LOWEMI 0x28
#define NMK_GPIO_RIMSC 0x40 #define NMK_GPIO_RIMSC 0x40
#define NMK_GPIO_FIMSC 0x44 #define NMK_GPIO_FIMSC 0x44
......
...@@ -105,6 +105,12 @@ typedef unsigned long pin_cfg_t; ...@@ -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_LOW ((1 + 0) << PIN_SLPM_VAL_SHIFT)
#define PIN_SLPM_VAL_HIGH ((1 + 1) << 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. */ /* Shortcuts. Use these instead of separate DIR, PULL, and VAL. */
#define PIN_INPUT_PULLDOWN (PIN_DIR_INPUT | PIN_PULL_DOWN) #define PIN_INPUT_PULLDOWN (PIN_DIR_INPUT | PIN_PULL_DOWN)
#define PIN_INPUT_PULLUP (PIN_DIR_INPUT | PIN_PULL_UP) #define PIN_INPUT_PULLUP (PIN_DIR_INPUT | PIN_PULL_UP)
......
...@@ -61,6 +61,7 @@ struct nmk_gpio_chip { ...@@ -61,6 +61,7 @@ struct nmk_gpio_chip {
u32 rimsc; u32 rimsc;
u32 fimsc; u32 fimsc;
u32 pull_up; u32 pull_up;
u32 lowemi;
}; };
static struct nmk_gpio_chip * static struct nmk_gpio_chip *
...@@ -125,6 +126,24 @@ static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_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, static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip,
unsigned offset) unsigned offset)
{ {
...@@ -269,6 +288,8 @@ static void __nmk_config_pin(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_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 * If the pin is switching to altfunc, and there was an interrupt
* installed on it which has been lazy disabled, actually mask the * 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) ...@@ -1181,6 +1202,10 @@ static int __devinit nmk_gpio_probe(struct platform_device *dev)
chip->dev = &dev->dev; chip->dev = &dev->dev;
chip->owner = THIS_MODULE; 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); ret = gpiochip_add(&nmk_chip->chip);
if (ret) if (ret)
goto out_free; goto out_free;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment