MERGE-master-patchset-edits
[linux-2.6/openmoko-kernel.git] / arch / arm / plat-orion / gpio.c
blob967186425ca1073ecea837206ebe22c081335693
1 /*
2 * arch/arm/plat-orion/gpio.c
4 * Marvell Orion SoC GPIO handling.
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/irq.h>
14 #include <linux/module.h>
15 #include <linux/spinlock.h>
16 #include <linux/bitops.h>
17 #include <linux/io.h>
18 #include <asm/gpio.h>
20 static DEFINE_SPINLOCK(gpio_lock);
21 static const char *gpio_label[GPIO_MAX]; /* non null for allocated GPIOs */
22 static unsigned long gpio_valid[BITS_TO_LONGS(GPIO_MAX)];
24 static inline void __set_direction(unsigned pin, int input)
26 u32 u;
28 u = readl(GPIO_IO_CONF(pin));
29 if (input)
30 u |= 1 << (pin & 31);
31 else
32 u &= ~(1 << (pin & 31));
33 writel(u, GPIO_IO_CONF(pin));
36 static void __set_level(unsigned pin, int high)
38 u32 u;
40 u = readl(GPIO_OUT(pin));
41 if (high)
42 u |= 1 << (pin & 31);
43 else
44 u &= ~(1 << (pin & 31));
45 writel(u, GPIO_OUT(pin));
50 * GENERIC_GPIO primitives.
52 int gpio_direction_input(unsigned pin)
54 unsigned long flags;
56 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
57 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
58 return -EINVAL;
61 spin_lock_irqsave(&gpio_lock, flags);
64 * Some callers might not have used gpio_request(),
65 * so flag this pin as requested now.
67 if (gpio_label[pin] == NULL)
68 gpio_label[pin] = "?";
71 * Configure GPIO direction.
73 __set_direction(pin, 1);
75 spin_unlock_irqrestore(&gpio_lock, flags);
77 return 0;
79 EXPORT_SYMBOL(gpio_direction_input);
81 int gpio_direction_output(unsigned pin, int value)
83 unsigned long flags;
84 u32 u;
86 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
87 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
88 return -EINVAL;
91 spin_lock_irqsave(&gpio_lock, flags);
94 * Some callers might not have used gpio_request(),
95 * so flag this pin as requested now.
97 if (gpio_label[pin] == NULL)
98 gpio_label[pin] = "?";
101 * Disable blinking.
103 u = readl(GPIO_BLINK_EN(pin));
104 u &= ~(1 << (pin & 31));
105 writel(u, GPIO_BLINK_EN(pin));
108 * Configure GPIO output value.
110 __set_level(pin, value);
113 * Configure GPIO direction.
115 __set_direction(pin, 0);
117 spin_unlock_irqrestore(&gpio_lock, flags);
119 return 0;
121 EXPORT_SYMBOL(gpio_direction_output);
123 int gpio_get_value(unsigned pin)
125 int val;
127 if (readl(GPIO_IO_CONF(pin)) & (1 << (pin & 31)))
128 val = readl(GPIO_DATA_IN(pin)) ^ readl(GPIO_IN_POL(pin));
129 else
130 val = readl(GPIO_OUT(pin));
132 return (val >> (pin & 31)) & 1;
134 EXPORT_SYMBOL(gpio_get_value);
136 void gpio_set_value(unsigned pin, int value)
138 unsigned long flags;
139 u32 u;
141 spin_lock_irqsave(&gpio_lock, flags);
144 * Disable blinking.
146 u = readl(GPIO_BLINK_EN(pin));
147 u &= ~(1 << (pin & 31));
148 writel(u, GPIO_BLINK_EN(pin));
151 * Configure GPIO output value.
153 __set_level(pin, value);
155 spin_unlock_irqrestore(&gpio_lock, flags);
157 EXPORT_SYMBOL(gpio_set_value);
159 int gpio_request(unsigned pin, const char *label)
161 unsigned long flags;
162 int ret;
164 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
165 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
166 return -EINVAL;
169 spin_lock_irqsave(&gpio_lock, flags);
170 if (gpio_label[pin] == NULL) {
171 gpio_label[pin] = label ? label : "?";
172 ret = 0;
173 } else {
174 pr_debug("%s: GPIO %d already used as %s\n",
175 __func__, pin, gpio_label[pin]);
176 ret = -EBUSY;
178 spin_unlock_irqrestore(&gpio_lock, flags);
180 return ret;
182 EXPORT_SYMBOL(gpio_request);
184 void gpio_free(unsigned pin)
186 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
187 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
188 return;
191 if (gpio_label[pin] == NULL)
192 pr_warning("%s: GPIO %d already freed\n", __func__, pin);
193 else
194 gpio_label[pin] = NULL;
196 EXPORT_SYMBOL(gpio_free);
200 * Orion-specific GPIO API extensions.
202 void __init orion_gpio_set_unused(unsigned pin)
205 * Configure as output, drive low.
207 __set_level(pin, 0);
208 __set_direction(pin, 0);
211 void __init orion_gpio_set_valid(unsigned pin, int valid)
213 if (valid)
214 __set_bit(pin, gpio_valid);
215 else
216 __clear_bit(pin, gpio_valid);
219 void orion_gpio_set_blink(unsigned pin, int blink)
221 unsigned long flags;
222 u32 u;
224 spin_lock_irqsave(&gpio_lock, flags);
227 * Set output value to zero.
229 __set_level(pin, 0);
231 u = readl(GPIO_BLINK_EN(pin));
232 if (blink)
233 u |= 1 << (pin & 31);
234 else
235 u &= ~(1 << (pin & 31));
236 writel(u, GPIO_BLINK_EN(pin));
238 spin_unlock_irqrestore(&gpio_lock, flags);
240 EXPORT_SYMBOL(orion_gpio_set_blink);
243 /*****************************************************************************
244 * Orion GPIO IRQ
246 * GPIO_IN_POL register controls whether GPIO_DATA_IN will hold the same
247 * value of the line or the opposite value.
249 * Level IRQ handlers: DATA_IN is used directly as cause register.
250 * Interrupt are masked by LEVEL_MASK registers.
251 * Edge IRQ handlers: Change in DATA_IN are latched in EDGE_CAUSE.
252 * Interrupt are masked by EDGE_MASK registers.
253 * Both-edge handlers: Similar to regular Edge handlers, but also swaps
254 * the polarity to catch the next line transaction.
255 * This is a race condition that might not perfectly
256 * work on some use cases.
258 * Every eight GPIO lines are grouped (OR'ed) before going up to main
259 * cause register.
261 * EDGE cause mask
262 * data-in /--------| |-----| |----\
263 * -----| |----- ---- to main cause reg
264 * X \----------------| |----/
265 * polarity LEVEL mask
267 ****************************************************************************/
268 static void gpio_irq_edge_ack(u32 irq)
270 int pin = irq_to_gpio(irq);
272 writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
275 static void gpio_irq_edge_mask(u32 irq)
277 int pin = irq_to_gpio(irq);
278 u32 u;
280 u = readl(GPIO_EDGE_MASK(pin));
281 u &= ~(1 << (pin & 31));
282 writel(u, GPIO_EDGE_MASK(pin));
285 static void gpio_irq_edge_unmask(u32 irq)
287 int pin = irq_to_gpio(irq);
288 u32 u;
290 u = readl(GPIO_EDGE_MASK(pin));
291 u |= 1 << (pin & 31);
292 writel(u, GPIO_EDGE_MASK(pin));
295 static void gpio_irq_level_mask(u32 irq)
297 int pin = irq_to_gpio(irq);
298 u32 u;
300 u = readl(GPIO_LEVEL_MASK(pin));
301 u &= ~(1 << (pin & 31));
302 writel(u, GPIO_LEVEL_MASK(pin));
305 static void gpio_irq_level_unmask(u32 irq)
307 int pin = irq_to_gpio(irq);
308 u32 u;
310 u = readl(GPIO_LEVEL_MASK(pin));
311 u |= 1 << (pin & 31);
312 writel(u, GPIO_LEVEL_MASK(pin));
315 static int gpio_irq_set_type(u32 irq, u32 type)
317 int pin = irq_to_gpio(irq);
318 struct irq_desc *desc;
319 u32 u;
321 u = readl(GPIO_IO_CONF(pin)) & (1 << (pin & 31));
322 if (!u) {
323 printk(KERN_ERR "orion gpio_irq_set_type failed "
324 "(irq %d, pin %d).\n", irq, pin);
325 return -EINVAL;
328 desc = irq_desc + irq;
331 * Set edge/level type.
333 if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
334 desc->chip = &orion_gpio_irq_edge_chip;
335 } else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
336 desc->chip = &orion_gpio_irq_level_chip;
337 } else {
338 printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
339 return -EINVAL;
343 * Configure interrupt polarity.
345 if (type == IRQ_TYPE_EDGE_RISING || type == IRQ_TYPE_LEVEL_HIGH) {
346 u = readl(GPIO_IN_POL(pin));
347 u &= ~(1 << (pin & 31));
348 writel(u, GPIO_IN_POL(pin));
349 } else if (type == IRQ_TYPE_EDGE_FALLING || type == IRQ_TYPE_LEVEL_LOW) {
350 u = readl(GPIO_IN_POL(pin));
351 u |= 1 << (pin & 31);
352 writel(u, GPIO_IN_POL(pin));
353 } else if (type == IRQ_TYPE_EDGE_BOTH) {
354 u32 v;
356 v = readl(GPIO_IN_POL(pin)) ^ readl(GPIO_DATA_IN(pin));
359 * set initial polarity based on current input level
361 u = readl(GPIO_IN_POL(pin));
362 if (v & (1 << (pin & 31)))
363 u |= 1 << (pin & 31); /* falling */
364 else
365 u &= ~(1 << (pin & 31)); /* rising */
366 writel(u, GPIO_IN_POL(pin));
369 desc->status = (desc->status & ~IRQ_TYPE_SENSE_MASK) | type;
371 return 0;
374 struct irq_chip orion_gpio_irq_edge_chip = {
375 .name = "orion_gpio_irq_edge",
376 .ack = gpio_irq_edge_ack,
377 .mask = gpio_irq_edge_mask,
378 .unmask = gpio_irq_edge_unmask,
379 .set_type = gpio_irq_set_type,
382 struct irq_chip orion_gpio_irq_level_chip = {
383 .name = "orion_gpio_irq_level",
384 .mask = gpio_irq_level_mask,
385 .mask_ack = gpio_irq_level_mask,
386 .unmask = gpio_irq_level_unmask,
387 .set_type = gpio_irq_set_type,
390 void orion_gpio_irq_handler(int pinoff)
392 u32 cause;
393 int pin;
395 cause = readl(GPIO_DATA_IN(pinoff)) & readl(GPIO_LEVEL_MASK(pinoff));
396 cause |= readl(GPIO_EDGE_CAUSE(pinoff)) & readl(GPIO_EDGE_MASK(pinoff));
398 for (pin = pinoff; pin < pinoff + 8; pin++) {
399 int irq = gpio_to_irq(pin);
400 struct irq_desc *desc = irq_desc + irq;
402 if (!(cause & (1 << (pin & 31))))
403 continue;
405 if ((desc->status & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) {
406 /* Swap polarity (race with GPIO line) */
407 u32 polarity;
409 polarity = readl(GPIO_IN_POL(pin));
410 polarity ^= 1 << (pin & 31);
411 writel(polarity, GPIO_IN_POL(pin));
413 desc_handle_irq(irq, desc);