diff options
Diffstat (limited to 'arch/arm/mach-ks8695/gpio.c')
-rw-r--r-- | arch/arm/mach-ks8695/gpio.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/arch/arm/mach-ks8695/gpio.c b/arch/arm/mach-ks8695/gpio.c index 9aecf0c4b8b1..55fbf7111a5b 100644 --- a/arch/arm/mach-ks8695/gpio.c +++ b/arch/arm/mach-ks8695/gpio.c | |||
@@ -2,6 +2,8 @@ | |||
2 | * arch/arm/mach-ks8695/gpio.c | 2 | * arch/arm/mach-ks8695/gpio.c |
3 | * | 3 | * |
4 | * Copyright (C) 2006 Andrew Victor | 4 | * Copyright (C) 2006 Andrew Victor |
5 | * Updated to GPIOLIB, Copyright 2008 Simtec Electronics | ||
6 | * Daniel Silverstone <dsilvers@simtec.co.uk> | ||
5 | * | 7 | * |
6 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License version 2 as | 9 | * it under the terms of the GNU General Public License version 2 as |
@@ -35,7 +37,7 @@ | |||
35 | * Configure a GPIO line for either GPIO function, or its internal | 37 | * Configure a GPIO line for either GPIO function, or its internal |
36 | * function (Interrupt, Timer, etc). | 38 | * function (Interrupt, Timer, etc). |
37 | */ | 39 | */ |
38 | static void __init_or_module ks8695_gpio_mode(unsigned int pin, short gpio) | 40 | static void ks8695_gpio_mode(unsigned int pin, short gpio) |
39 | { | 41 | { |
40 | unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN }; | 42 | unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN }; |
41 | unsigned long x, flags; | 43 | unsigned long x, flags; |
@@ -61,7 +63,7 @@ static unsigned short gpio_irq[] = { KS8695_IRQ_EXTERN0, KS8695_IRQ_EXTERN1, KS8 | |||
61 | /* | 63 | /* |
62 | * Configure GPIO pin as external interrupt source. | 64 | * Configure GPIO pin as external interrupt source. |
63 | */ | 65 | */ |
64 | int __init_or_module ks8695_gpio_interrupt(unsigned int pin, unsigned int type) | 66 | int ks8695_gpio_interrupt(unsigned int pin, unsigned int type) |
65 | { | 67 | { |
66 | unsigned long x, flags; | 68 | unsigned long x, flags; |
67 | 69 | ||
@@ -94,7 +96,7 @@ EXPORT_SYMBOL(ks8695_gpio_interrupt); | |||
94 | /* | 96 | /* |
95 | * Configure the GPIO line as an input. | 97 | * Configure the GPIO line as an input. |
96 | */ | 98 | */ |
97 | int __init_or_module gpio_direction_input(unsigned int pin) | 99 | static int ks8695_gpio_direction_input(struct gpio_chip *gc, unsigned int pin) |
98 | { | 100 | { |
99 | unsigned long x, flags; | 101 | unsigned long x, flags; |
100 | 102 | ||
@@ -115,13 +117,13 @@ int __init_or_module gpio_direction_input(unsigned int pin) | |||
115 | 117 | ||
116 | return 0; | 118 | return 0; |
117 | } | 119 | } |
118 | EXPORT_SYMBOL(gpio_direction_input); | ||
119 | 120 | ||
120 | 121 | ||
121 | /* | 122 | /* |
122 | * Configure the GPIO line as an output, with default state. | 123 | * Configure the GPIO line as an output, with default state. |
123 | */ | 124 | */ |
124 | int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) | 125 | static int ks8695_gpio_direction_output(struct gpio_chip *gc, |
126 | unsigned int pin, int state) | ||
125 | { | 127 | { |
126 | unsigned long x, flags; | 128 | unsigned long x, flags; |
127 | 129 | ||
@@ -150,13 +152,13 @@ int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) | |||
150 | 152 | ||
151 | return 0; | 153 | return 0; |
152 | } | 154 | } |
153 | EXPORT_SYMBOL(gpio_direction_output); | ||
154 | 155 | ||
155 | 156 | ||
156 | /* | 157 | /* |
157 | * Set the state of an output GPIO line. | 158 | * Set the state of an output GPIO line. |
158 | */ | 159 | */ |
159 | void gpio_set_value(unsigned int pin, unsigned int state) | 160 | static void ks8695_gpio_set_value(struct gpio_chip *gc, |
161 | unsigned int pin, int state) | ||
160 | { | 162 | { |
161 | unsigned long x, flags; | 163 | unsigned long x, flags; |
162 | 164 | ||
@@ -175,13 +177,12 @@ void gpio_set_value(unsigned int pin, unsigned int state) | |||
175 | 177 | ||
176 | local_irq_restore(flags); | 178 | local_irq_restore(flags); |
177 | } | 179 | } |
178 | EXPORT_SYMBOL(gpio_set_value); | ||
179 | 180 | ||
180 | 181 | ||
181 | /* | 182 | /* |
182 | * Read the state of a GPIO line. | 183 | * Read the state of a GPIO line. |
183 | */ | 184 | */ |
184 | int gpio_get_value(unsigned int pin) | 185 | static int ks8695_gpio_get_value(struct gpio_chip *gc, unsigned int pin) |
185 | { | 186 | { |
186 | unsigned long x; | 187 | unsigned long x; |
187 | 188 | ||
@@ -191,21 +192,18 @@ int gpio_get_value(unsigned int pin) | |||
191 | x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD); | 192 | x = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD); |
192 | return (x & IOPD(pin)) != 0; | 193 | return (x & IOPD(pin)) != 0; |
193 | } | 194 | } |
194 | EXPORT_SYMBOL(gpio_get_value); | ||
195 | 195 | ||
196 | 196 | ||
197 | /* | 197 | /* |
198 | * Map GPIO line to IRQ number. | 198 | * Map GPIO line to IRQ number. |
199 | */ | 199 | */ |
200 | int gpio_to_irq(unsigned int pin) | 200 | static int ks8695_gpio_to_irq(struct gpio_chip *gc, unsigned int pin) |
201 | { | 201 | { |
202 | if (pin > KS8695_GPIO_3) /* only GPIO 0..3 can generate IRQ */ | 202 | if (pin > KS8695_GPIO_3) /* only GPIO 0..3 can generate IRQ */ |
203 | return -EINVAL; | 203 | return -EINVAL; |
204 | 204 | ||
205 | return gpio_irq[pin]; | 205 | return gpio_irq[pin]; |
206 | } | 206 | } |
207 | EXPORT_SYMBOL(gpio_to_irq); | ||
208 | |||
209 | 207 | ||
210 | /* | 208 | /* |
211 | * Map IRQ number to GPIO line. | 209 | * Map IRQ number to GPIO line. |
@@ -219,6 +217,26 @@ int irq_to_gpio(unsigned int irq) | |||
219 | } | 217 | } |
220 | EXPORT_SYMBOL(irq_to_gpio); | 218 | EXPORT_SYMBOL(irq_to_gpio); |
221 | 219 | ||
220 | /* GPIOLIB interface */ | ||
221 | |||
222 | static struct gpio_chip ks8695_gpio_chip = { | ||
223 | .label = "KS8695", | ||
224 | .direction_input = ks8695_gpio_direction_input, | ||
225 | .direction_output = ks8695_gpio_direction_output, | ||
226 | .get = ks8695_gpio_get_value, | ||
227 | .set = ks8695_gpio_set_value, | ||
228 | .to_irq = ks8695_gpio_to_irq, | ||
229 | .base = 0, | ||
230 | .ngpio = 16, | ||
231 | .can_sleep = 0, | ||
232 | }; | ||
233 | |||
234 | /* Register the GPIOs */ | ||
235 | void ks8695_register_gpios(void) | ||
236 | { | ||
237 | if (gpiochip_add(&ks8695_gpio_chip)) | ||
238 | printk(KERN_ERR "Unable to register core GPIOs\n"); | ||
239 | } | ||
222 | 240 | ||
223 | /* .... Debug interface ..................................................... */ | 241 | /* .... Debug interface ..................................................... */ |
224 | 242 | ||