diff options
author | Rabin Vincent <rabin.vincent@stericsson.com> | 2010-09-02 06:28:48 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-09-02 10:52:19 -0400 |
commit | 6720db7cc592b2148e0d88a7d76dc0532f3d266c (patch) | |
tree | 68b2ba061880c163358bc4d5144dac99c127596a /arch/arm/plat-nomadik/gpio.c | |
parent | 7e3f7e59ccc6ed8b243de9941ffd09d2ad7a5b9c (diff) |
ARM: 6354/1: nomadik-gpio: allow control of sleep mode direction and pull up
DB8500v2 allows control of direction and pull up/down configuration in
sleep mode, instead of switching the pin to input with pull up/down
enabled.
Acked-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/plat-nomadik/gpio.c')
-rw-r--r-- | arch/arm/plat-nomadik/gpio.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/arch/arm/plat-nomadik/gpio.c b/arch/arm/plat-nomadik/gpio.c index 014da39b6a88..7afc7e8850b6 100644 --- a/arch/arm/plat-nomadik/gpio.c +++ b/arch/arm/plat-nomadik/gpio.c | |||
@@ -102,6 +102,22 @@ static void __nmk_gpio_make_input(struct nmk_gpio_chip *nmk_chip, | |||
102 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC); | 102 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRC); |
103 | } | 103 | } |
104 | 104 | ||
105 | static void __nmk_gpio_set_output(struct nmk_gpio_chip *nmk_chip, | ||
106 | unsigned offset, int val) | ||
107 | { | ||
108 | if (val) | ||
109 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATS); | ||
110 | else | ||
111 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DATC); | ||
112 | } | ||
113 | |||
114 | static void __nmk_gpio_make_output(struct nmk_gpio_chip *nmk_chip, | ||
115 | unsigned offset, int val) | ||
116 | { | ||
117 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRS); | ||
118 | __nmk_gpio_set_output(nmk_chip, offset, val); | ||
119 | } | ||
120 | |||
105 | static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset, | 121 | static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset, |
106 | pin_cfg_t cfg) | 122 | pin_cfg_t cfg) |
107 | { | 123 | { |
@@ -126,12 +142,21 @@ static void __nmk_config_pin(struct nmk_gpio_chip *nmk_chip, unsigned offset, | |||
126 | int pull = PIN_PULL(cfg); | 142 | int pull = PIN_PULL(cfg); |
127 | int af = PIN_ALT(cfg); | 143 | int af = PIN_ALT(cfg); |
128 | int slpm = PIN_SLPM(cfg); | 144 | int slpm = PIN_SLPM(cfg); |
145 | int output = PIN_DIR(cfg); | ||
146 | int val = PIN_VAL(cfg); | ||
129 | 147 | ||
130 | dev_dbg(nmk_chip->chip.dev, "pin %d: af %s, pull %s, slpm %s\n", | 148 | dev_dbg(nmk_chip->chip.dev, "pin %d: af %s, pull %s, slpm %s (%s%s)\n", |
131 | pin, afnames[af], pullnames[pull], slpmnames[slpm]); | 149 | pin, afnames[af], pullnames[pull], slpmnames[slpm], |
150 | output ? "output " : "input", | ||
151 | output ? (val ? "high" : "low") : ""); | ||
152 | |||
153 | if (output) | ||
154 | __nmk_gpio_make_output(nmk_chip, offset, val); | ||
155 | else { | ||
156 | __nmk_gpio_make_input(nmk_chip, offset); | ||
157 | __nmk_gpio_set_pull(nmk_chip, offset, pull); | ||
158 | } | ||
132 | 159 | ||
133 | __nmk_gpio_make_input(nmk_chip, offset); | ||
134 | __nmk_gpio_set_pull(nmk_chip, offset, pull); | ||
135 | __nmk_gpio_set_slpm(nmk_chip, offset, slpm); | 160 | __nmk_gpio_set_slpm(nmk_chip, offset, slpm); |
136 | __nmk_gpio_set_mode(nmk_chip, offset, af); | 161 | __nmk_gpio_set_mode(nmk_chip, offset, af); |
137 | } | 162 | } |
@@ -519,12 +544,8 @@ static void nmk_gpio_set_output(struct gpio_chip *chip, unsigned offset, | |||
519 | { | 544 | { |
520 | struct nmk_gpio_chip *nmk_chip = | 545 | struct nmk_gpio_chip *nmk_chip = |
521 | container_of(chip, struct nmk_gpio_chip, chip); | 546 | container_of(chip, struct nmk_gpio_chip, chip); |
522 | u32 bit = 1 << offset; | ||
523 | 547 | ||
524 | if (val) | 548 | __nmk_gpio_set_output(nmk_chip, offset, val); |
525 | writel(bit, nmk_chip->addr + NMK_GPIO_DATS); | ||
526 | else | ||
527 | writel(bit, nmk_chip->addr + NMK_GPIO_DATC); | ||
528 | } | 549 | } |
529 | 550 | ||
530 | static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset, | 551 | static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset, |
@@ -533,8 +554,7 @@ static int nmk_gpio_make_output(struct gpio_chip *chip, unsigned offset, | |||
533 | struct nmk_gpio_chip *nmk_chip = | 554 | struct nmk_gpio_chip *nmk_chip = |
534 | container_of(chip, struct nmk_gpio_chip, chip); | 555 | container_of(chip, struct nmk_gpio_chip, chip); |
535 | 556 | ||
536 | writel(1 << offset, nmk_chip->addr + NMK_GPIO_DIRS); | 557 | __nmk_gpio_make_output(nmk_chip, offset, val); |
537 | nmk_gpio_set_output(chip, offset, val); | ||
538 | 558 | ||
539 | return 0; | 559 | return 0; |
540 | } | 560 | } |