diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/plat-nomadik/gpio.c | 40 | ||||
-rw-r--r-- | arch/arm/plat-nomadik/include/plat/gpio.h | 7 |
2 files changed, 47 insertions, 0 deletions
diff --git a/arch/arm/plat-nomadik/gpio.c b/arch/arm/plat-nomadik/gpio.c index 50c49fa9e01a..a678e887e0fe 100644 --- a/arch/arm/plat-nomadik/gpio.c +++ b/arch/arm/plat-nomadik/gpio.c | |||
@@ -46,6 +46,20 @@ struct nmk_gpio_chip { | |||
46 | u32 edge_falling; | 46 | u32 edge_falling; |
47 | }; | 47 | }; |
48 | 48 | ||
49 | static void __nmk_gpio_set_slpm(struct nmk_gpio_chip *nmk_chip, | ||
50 | unsigned offset, enum nmk_gpio_slpm mode) | ||
51 | { | ||
52 | u32 bit = 1 << offset; | ||
53 | u32 slpm; | ||
54 | |||
55 | slpm = readl(nmk_chip->addr + NMK_GPIO_SLPC); | ||
56 | if (mode == NMK_GPIO_SLPM_NOCHANGE) | ||
57 | slpm |= bit; | ||
58 | else | ||
59 | slpm &= ~bit; | ||
60 | writel(slpm, nmk_chip->addr + NMK_GPIO_SLPC); | ||
61 | } | ||
62 | |||
49 | static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip, | 63 | static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip, |
50 | unsigned offset, enum nmk_gpio_pull pull) | 64 | unsigned offset, enum nmk_gpio_pull pull) |
51 | { | 65 | { |
@@ -66,6 +80,32 @@ static void __nmk_gpio_set_pull(struct nmk_gpio_chip *nmk_chip, | |||
66 | } | 80 | } |
67 | 81 | ||
68 | /** | 82 | /** |
83 | * nmk_gpio_set_slpm() - configure the sleep mode of a pin | ||
84 | * @gpio: pin number | ||
85 | * @mode: NMK_GPIO_SLPM_INPUT or NMK_GPIO_SLPM_NOCHANGE, | ||
86 | * | ||
87 | * Sets the sleep mode of a pin. If @mode is NMK_GPIO_SLPM_INPUT, the pin is | ||
88 | * changed to an input (with pullup/down enabled) in sleep and deep sleep. If | ||
89 | * @mode is NMK_GPIO_SLPM_NOCHANGE, the pin remains in the state it was | ||
90 | * configured even when in sleep and deep sleep. | ||
91 | */ | ||
92 | int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode) | ||
93 | { | ||
94 | struct nmk_gpio_chip *nmk_chip; | ||
95 | unsigned long flags; | ||
96 | |||
97 | nmk_chip = get_irq_chip_data(NOMADIK_GPIO_TO_IRQ(gpio)); | ||
98 | if (!nmk_chip) | ||
99 | return -EINVAL; | ||
100 | |||
101 | spin_lock_irqsave(&nmk_chip->lock, flags); | ||
102 | __nmk_gpio_set_slpm(nmk_chip, gpio - nmk_chip->chip.base, mode); | ||
103 | spin_unlock_irqrestore(&nmk_chip->lock, flags); | ||
104 | |||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | /** | ||
69 | * nmk_gpio_set_pull() - enable/disable pull up/down on a gpio | 109 | * nmk_gpio_set_pull() - enable/disable pull up/down on a gpio |
70 | * @gpio: pin number | 110 | * @gpio: pin number |
71 | * @pull: one of NMK_GPIO_PULL_DOWN, NMK_GPIO_PULL_UP, and NMK_GPIO_PULL_NONE | 111 | * @pull: one of NMK_GPIO_PULL_DOWN, NMK_GPIO_PULL_UP, and NMK_GPIO_PULL_NONE |
diff --git a/arch/arm/plat-nomadik/include/plat/gpio.h b/arch/arm/plat-nomadik/include/plat/gpio.h index 1d97e96ad1f4..aba355101f49 100644 --- a/arch/arm/plat-nomadik/include/plat/gpio.h +++ b/arch/arm/plat-nomadik/include/plat/gpio.h | |||
@@ -62,6 +62,13 @@ enum nmk_gpio_pull { | |||
62 | NMK_GPIO_PULL_DOWN, | 62 | NMK_GPIO_PULL_DOWN, |
63 | }; | 63 | }; |
64 | 64 | ||
65 | /* Sleep mode */ | ||
66 | enum nmk_gpio_slpm { | ||
67 | NMK_GPIO_SLPM_INPUT, | ||
68 | NMK_GPIO_SLPM_NOCHANGE, | ||
69 | }; | ||
70 | |||
71 | extern int nmk_gpio_set_slpm(int gpio, enum nmk_gpio_slpm mode); | ||
65 | extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull); | 72 | extern int nmk_gpio_set_pull(int gpio, enum nmk_gpio_pull pull); |
66 | extern int nmk_gpio_set_mode(int gpio, int gpio_mode); | 73 | extern int nmk_gpio_set_mode(int gpio, int gpio_mode); |
67 | extern int nmk_gpio_get_mode(int gpio); | 74 | extern int nmk_gpio_get_mode(int gpio); |