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

Commit 81a3c298 authored by Rabin Vincent's avatar Rabin Vincent Committed by Russell King
Browse files

ARM: 6149/1: nomadik-gpio: add function to configure sleep mode behaviour



Cc: Alessandro Rubini <rubini@unipv.it>

Acked-by: default avatarLinus Walleij <linus.walleij@stericsson.com>
Signed-off-by: default avatarRabin Vincent <rabin.vincent@stericsson.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 5b327edf
Loading
Loading
Loading
Loading
+40 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,20 @@ struct nmk_gpio_chip {
	u32 edge_falling;
	u32 edge_falling;
};
};


static void __nmk_gpio_set_slpm(struct nmk_gpio_chip *nmk_chip,
				unsigned offset, enum nmk_gpio_slpm mode)
{
	u32 bit = 1 << offset;
	u32 slpm;

	slpm = readl(nmk_chip->addr + NMK_GPIO_SLPC);
	if (mode == NMK_GPIO_SLPM_NOCHANGE)
		slpm |= bit;
	else
		slpm &= ~bit;
	writel(slpm, nmk_chip->addr + NMK_GPIO_SLPC);
}

static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
				unsigned offset, enum nmk_gpio_pull pull)
				unsigned offset, enum nmk_gpio_pull pull)
{
{
@@ -65,6 +79,32 @@ static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip,
		writel(bit, nmk_chip->addr + NMK_GPIO_DATC);
		writel(bit, nmk_chip->addr + NMK_GPIO_DATC);
}
}


/**
 * nmk_gpio_set_slpm() - configure the sleep mode of a pin
 * @gpio: pin number
 * @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE,
 *
 * Sets the sleep mode of a pin.  If @mode is NMK_GPIO_SLPM_INPUT, the pin is
 * changed to an input (with pullup/down enabled) in sleep and deep sleep.  If
 * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was
 * configured even when in sleep and deep sleep.
 */
int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode)
{
	struct nmk_gpio_chip *nmk_chip;
	unsigned long flags;

	nmk_chip = get_irq_chip_data(NOMADIK_GPIO_TO_IRQ(gpio));
	if (!nmk_chip)
		return -EINVAL;

	spin_lock_irqsave(&nmk_chip->lock, flags);
	__nmk_gpio_set_slpm(nmk_chip, gpio - nmk_chip->chip.base, mode);
	spin_unlock_irqrestore(&nmk_chip->lock, flags);

	return 0;
}

/**
/**
 * nmk_gpio_set_pull() - enable/disable pull up/down on a gpio
 * nmk_gpio_set_pull() - enable/disable pull up/down on a gpio
 * @gpio: pin number
 * @gpio: pin number
+7 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,13 @@ enum nmk_gpio_pull {
	NMK_GPIO_PULL_DOWN,
	NMK_GPIO_PULL_DOWN,
};
};


/* Sleep mode */
enum nmk_gpio_slpm {
	NMK_GPIO_SLPM_INPUT,
	NMK_GPIO_SLPM_NOCHANGE,
};

extern int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode);
extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull);
extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull);
extern int nmk_gpio_set_mode(int gpio, int gpio_mode);
extern int nmk_gpio_set_mode(int gpio, int gpio_mode);
extern int nmk_gpio_get_mode(int gpio);
extern int nmk_gpio_get_mode(int gpio);