Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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
+6 −0
Original line number Original line Diff line number Diff line
@@ -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)
+25 −0
Original line number Original line Diff line number Diff line
@@ -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,
	}
	}
}
}


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,
		__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)
	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;