blob: 0d12c21647663d5191167569354bd3af1d7d84b5 [file] [log] [blame]
Lennert Buytenhek9569dae2008-10-20 01:51:03 +02001/*
2 * arch/arm/plat-orion/gpio.c
3 *
4 * Marvell Orion SoC GPIO handling.
5 *
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 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
Lennert Buytenhek07332312008-10-20 01:51:03 +020013#include <linux/irq.h>
Lennert Buytenhek9569dae2008-10-20 01:51:03 +020014#include <linux/module.h>
15#include <linux/spinlock.h>
16#include <linux/bitops.h>
17#include <linux/io.h>
18#include <asm/gpio.h>
19
20static DEFINE_SPINLOCK(gpio_lock);
21static const char *gpio_label[GPIO_MAX]; /* non null for allocated GPIOs */
22static unsigned long gpio_valid[BITS_TO_LONGS(GPIO_MAX)];
23
24static inline void __set_direction(unsigned pin, int input)
25{
26 u32 u;
27
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));
34}
35
36static void __set_level(unsigned pin, int high)
37{
38 u32 u;
39
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));
46}
47
48
49/*
50 * GENERIC_GPIO primitives.
51 */
52int gpio_direction_input(unsigned pin)
53{
54 unsigned long flags;
55
56 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
57 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
58 return -EINVAL;
59 }
60
61 spin_lock_irqsave(&gpio_lock, flags);
62
63 /*
64 * Some callers might not have used gpio_request(),
65 * so flag this pin as requested now.
66 */
67 if (gpio_label[pin] == NULL)
68 gpio_label[pin] = "?";
69
70 /*
71 * Configure GPIO direction.
72 */
73 __set_direction(pin, 1);
74
75 spin_unlock_irqrestore(&gpio_lock, flags);
76
77 return 0;
78}
79EXPORT_SYMBOL(gpio_direction_input);
80
81int gpio_direction_output(unsigned pin, int value)
82{
83 unsigned long flags;
84 u32 u;
85
86 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
87 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
88 return -EINVAL;
89 }
90
91 spin_lock_irqsave(&gpio_lock, flags);
92
93 /*
94 * Some callers might not have used gpio_request(),
95 * so flag this pin as requested now.
96 */
97 if (gpio_label[pin] == NULL)
98 gpio_label[pin] = "?";
99
100 /*
101 * Disable blinking.
102 */
103 u = readl(GPIO_BLINK_EN(pin));
104 u &= ~(1 << (pin & 31));
105 writel(u, GPIO_BLINK_EN(pin));
106
107 /*
108 * Configure GPIO output value.
109 */
110 __set_level(pin, value);
111
112 /*
113 * Configure GPIO direction.
114 */
115 __set_direction(pin, 0);
116
117 spin_unlock_irqrestore(&gpio_lock, flags);
118
119 return 0;
120}
121EXPORT_SYMBOL(gpio_direction_output);
122
123int gpio_get_value(unsigned pin)
124{
125 int val;
126
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));
131
132 return (val >> (pin & 31)) & 1;
133}
134EXPORT_SYMBOL(gpio_get_value);
135
136void gpio_set_value(unsigned pin, int value)
137{
138 unsigned long flags;
139 u32 u;
140
141 spin_lock_irqsave(&gpio_lock, flags);
142
143 /*
144 * Disable blinking.
145 */
146 u = readl(GPIO_BLINK_EN(pin));
147 u &= ~(1 << (pin & 31));
148 writel(u, GPIO_BLINK_EN(pin));
149
150 /*
151 * Configure GPIO output value.
152 */
153 __set_level(pin, value);
154
155 spin_unlock_irqrestore(&gpio_lock, flags);
156}
157EXPORT_SYMBOL(gpio_set_value);
158
159int gpio_request(unsigned pin, const char *label)
160{
161 unsigned long flags;
162 int ret;
163
164 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
165 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
166 return -EINVAL;
167 }
168
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;
177 }
178 spin_unlock_irqrestore(&gpio_lock, flags);
179
180 return ret;
181}
182EXPORT_SYMBOL(gpio_request);
183
184void gpio_free(unsigned pin)
185{
186 if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
187 pr_debug("%s: invalid GPIO %d\n", __func__, pin);
188 return;
189 }
190
191 if (gpio_label[pin] == NULL)
192 pr_warning("%s: GPIO %d already freed\n", __func__, pin);
193 else
194 gpio_label[pin] = NULL;
195}
196EXPORT_SYMBOL(gpio_free);
197
198
199/*
200 * Orion-specific GPIO API extensions.
201 */
202void __init orion_gpio_set_unused(unsigned pin)
203{
204 /*
205 * Configure as output, drive low.
206 */
207 __set_level(pin, 0);
208 __set_direction(pin, 0);
209}
210
211void __init orion_gpio_set_valid(unsigned pin, int valid)
212{
213 if (valid)
214 __set_bit(pin, gpio_valid);
215 else
216 __clear_bit(pin, gpio_valid);
217}
218
219void orion_gpio_set_blink(unsigned pin, int blink)
220{
221 unsigned long flags;
222 u32 u;
223
224 spin_lock_irqsave(&gpio_lock, flags);
225
226 /*
227 * Set output value to zero.
228 */
229 __set_level(pin, 0);
230
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));
237
238 spin_unlock_irqrestore(&gpio_lock, flags);
239}
240EXPORT_SYMBOL(orion_gpio_set_blink);
Lennert Buytenhek07332312008-10-20 01:51:03 +0200241
242
243/*****************************************************************************
244 * Orion GPIO IRQ
245 *
246 * GPIO_IN_POL register controls whether GPIO_DATA_IN will hold the same
247 * value of the line or the opposite value.
248 *
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.
257 *
258 * Every eight GPIO lines are grouped (OR'ed) before going up to main
259 * cause register.
260 *
261 * EDGE cause mask
262 * data-in /--------| |-----| |----\
263 * -----| |----- ---- to main cause reg
264 * X \----------------| |----/
265 * polarity LEVEL mask
266 *
267 ****************************************************************************/
Lennert Buytenhek07332312008-10-20 01:51:03 +0200268
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100269static void gpio_irq_ack(u32 irq)
270{
271 int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
272 if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
273 int pin = irq_to_gpio(irq);
274 writel(~(1 << (pin & 31)), GPIO_EDGE_CAUSE(pin));
275 }
Lennert Buytenhek07332312008-10-20 01:51:03 +0200276}
277
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100278static void gpio_irq_mask(u32 irq)
Lennert Buytenhek07332312008-10-20 01:51:03 +0200279{
280 int pin = irq_to_gpio(irq);
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100281 int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
282 u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
283 GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
284 u32 u = readl(reg);
Lennert Buytenhek07332312008-10-20 01:51:03 +0200285 u &= ~(1 << (pin & 31));
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100286 writel(u, reg);
Lennert Buytenhek07332312008-10-20 01:51:03 +0200287}
288
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100289static void gpio_irq_unmask(u32 irq)
Lennert Buytenhek07332312008-10-20 01:51:03 +0200290{
291 int pin = irq_to_gpio(irq);
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100292 int type = irq_desc[irq].status & IRQ_TYPE_SENSE_MASK;
293 u32 reg = (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) ?
294 GPIO_EDGE_MASK(pin) : GPIO_LEVEL_MASK(pin);
295 u32 u = readl(reg);
Lennert Buytenhek07332312008-10-20 01:51:03 +0200296 u |= 1 << (pin & 31);
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100297 writel(u, reg);
Lennert Buytenhek07332312008-10-20 01:51:03 +0200298}
299
300static int gpio_irq_set_type(u32 irq, u32 type)
301{
302 int pin = irq_to_gpio(irq);
303 struct irq_desc *desc;
304 u32 u;
305
306 u = readl(GPIO_IO_CONF(pin)) & (1 << (pin & 31));
307 if (!u) {
308 printk(KERN_ERR "orion gpio_irq_set_type failed "
309 "(irq %d, pin %d).\n", irq, pin);
310 return -EINVAL;
311 }
312
313 desc = irq_desc + irq;
314
315 /*
316 * Set edge/level type.
317 */
318 if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) {
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100319 desc->handle_irq = handle_edge_irq;
Lennert Buytenhek07332312008-10-20 01:51:03 +0200320 } else if (type & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) {
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100321 desc->handle_irq = handle_level_irq;
Lennert Buytenhek07332312008-10-20 01:51:03 +0200322 } else {
323 printk(KERN_ERR "failed to set irq=%d (type=%d)\n", irq, type);
324 return -EINVAL;
325 }
326
327 /*
328 * Configure interrupt polarity.
329 */
330 if (type == IRQ_TYPE_EDGE_RISING || type == IRQ_TYPE_LEVEL_HIGH) {
331 u = readl(GPIO_IN_POL(pin));
332 u &= ~(1 << (pin & 31));
333 writel(u, GPIO_IN_POL(pin));
334 } else if (type == IRQ_TYPE_EDGE_FALLING || type == IRQ_TYPE_LEVEL_LOW) {
335 u = readl(GPIO_IN_POL(pin));
336 u |= 1 << (pin & 31);
337 writel(u, GPIO_IN_POL(pin));
338 } else if (type == IRQ_TYPE_EDGE_BOTH) {
339 u32 v;
340
341 v = readl(GPIO_IN_POL(pin)) ^ readl(GPIO_DATA_IN(pin));
342
343 /*
344 * set initial polarity based on current input level
345 */
346 u = readl(GPIO_IN_POL(pin));
347 if (v & (1 << (pin & 31)))
348 u |= 1 << (pin & 31); /* falling */
349 else
350 u &= ~(1 << (pin & 31)); /* rising */
351 writel(u, GPIO_IN_POL(pin));
352 }
353
354 desc->status = (desc->status & ~IRQ_TYPE_SENSE_MASK) | type;
355
356 return 0;
357}
358
Nicolas Pitrefd4b9b32009-02-17 20:45:50 +0100359struct irq_chip orion_gpio_irq_chip = {
360 .name = "orion_gpio",
361 .ack = gpio_irq_ack,
362 .mask = gpio_irq_mask,
363 .unmask = gpio_irq_unmask,
Lennert Buytenhek07332312008-10-20 01:51:03 +0200364 .set_type = gpio_irq_set_type,
365};
366
367void orion_gpio_irq_handler(int pinoff)
368{
369 u32 cause;
370 int pin;
371
372 cause = readl(GPIO_DATA_IN(pinoff)) & readl(GPIO_LEVEL_MASK(pinoff));
373 cause |= readl(GPIO_EDGE_CAUSE(pinoff)) & readl(GPIO_EDGE_MASK(pinoff));
374
375 for (pin = pinoff; pin < pinoff + 8; pin++) {
376 int irq = gpio_to_irq(pin);
377 struct irq_desc *desc = irq_desc + irq;
378
379 if (!(cause & (1 << (pin & 31))))
380 continue;
381
382 if ((desc->status & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_BOTH) {
383 /* Swap polarity (race with GPIO line) */
384 u32 polarity;
385
386 polarity = readl(GPIO_IN_POL(pin));
387 polarity ^= 1 << (pin & 31);
388 writel(polarity, GPIO_IN_POL(pin));
389 }
390 desc_handle_irq(irq, desc);
391 }
392}