Skip to content

Commit

Permalink
gpio/nomadik: support low EMI mode
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rabin Vincent authored and Linus Walleij committed Apr 23, 2012
1 parent 6c42ad1 commit ebc6178
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
1 change: 1 addition & 0 deletions arch/arm/plat-nomadik/include/plat/gpio-nomadik.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions arch/arm/plat-nomadik/include/plat/pincfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
25 changes: 25 additions & 0 deletions drivers/gpio/gpio-nomadik.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ struct nmk_gpio_chip {
u32 rimsc;
u32 fimsc;
u32 pull_up;
u32 lowemi;
};

static struct nmk_gpio_chip *
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit ebc6178

Please sign in to comment.