aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-ks8695/gpio.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-ks8695/gpio.c')
-rw-r--r--arch/arm/mach-ks8695/gpio.c44
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 */
38static void __init_or_module ks8695_gpio_mode(unsigned int pin, short gpio) 40static 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 */
64int __init_or_module ks8695_gpio_interrupt(unsigned int pin, unsigned int type) 66int 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 */
97int __init_or_module gpio_direction_input(unsigned int pin) 99static 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}
118EXPORT_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 */
124int __init_or_module gpio_direction_output(unsigned int pin, unsigned int state) 125static 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}
153EXPORT_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 */
159void gpio_set_value(unsigned int pin, unsigned int state) 160static 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}
178EXPORT_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 */
184int gpio_get_value(unsigned int pin) 185static 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}
194EXPORT_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 */
200int gpio_to_irq(unsigned int pin) 200static 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}
207EXPORT_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}
220EXPORT_SYMBOL(irq_to_gpio); 218EXPORT_SYMBOL(irq_to_gpio);
221 219
220/* GPIOLIB interface */
221
222static 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 */
235void 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