pxa2x0_gpio.c revision 1.16.14.1 1 /* $NetBSD: pxa2x0_gpio.c,v 1.16.14.1 2017/08/28 17:51:32 skrll Exp $ */
2
3 /*
4 * Copyright 2003 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Steve C. Woodford for Wasabi Systems, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed for the NetBSD Project by
20 * Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 * or promote products derived from this software without specific prior
23 * written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 #include <sys/cdefs.h>
39 __KERNEL_RCSID(0, "$NetBSD: pxa2x0_gpio.c,v 1.16.14.1 2017/08/28 17:51:32 skrll Exp $");
40
41 #include "gpio.h"
42 #include "opt_pxa2x0_gpio.h"
43
44 #include <sys/param.h>
45 #include <sys/systm.h>
46 #include <sys/device.h>
47 #include <sys/malloc.h>
48
49 #include <machine/intr.h>
50 #include <sys/bus.h>
51
52 #include <arm/xscale/pxa2x0cpu.h>
53 #include <arm/xscale/pxa2x0reg.h>
54 #include <arm/xscale/pxa2x0var.h>
55 #include <arm/xscale/pxa2x0_gpio.h>
56
57 #include "locators.h"
58
59 #include <sys/gpio.h>
60 #include <dev/gpio/gpiovar.h>
61
62 struct gpio_irq_handler {
63 struct gpio_irq_handler *gh_next;
64 int (*gh_func)(void *);
65 void *gh_arg;
66 int gh_spl;
67 u_int gh_gpio;
68 int gh_level;
69 };
70
71 struct pxagpio_softc {
72 device_t sc_dev;
73 bus_space_tag_t sc_bust;
74 bus_space_handle_t sc_bush;
75 void *sc_irqcookie[4];
76 uint32_t sc_mask[4];
77 #ifdef PXAGPIO_HAS_GPION_INTRS
78 struct gpio_irq_handler *sc_handlers[GPIO_NPINS];
79 #else
80 struct gpio_irq_handler *sc_handlers[2];
81 #endif
82 struct gpio_chipset_tag sc_gpio_gc;
83 gpio_pin_t sc_gpio_pins[GPIO_NPINS];
84 };
85
86 static int pxagpio_match(device_t, cfdata_t, void *);
87 static void pxagpio_attach(device_t, device_t, void *);
88
89 #if NGPIO > 0
90 static int pxa2x0_gpio_pin_read(void *, int);
91 static void pxa2x0_gpio_pin_write(void *, int, int);
92 static void pxa2x0_gpio_pin_ctl(void *, int, int);
93 #endif
94
95 CFATTACH_DECL_NEW(pxagpio, sizeof(struct pxagpio_softc),
96 pxagpio_match, pxagpio_attach, NULL, NULL);
97
98 static struct pxagpio_softc *pxagpio_softc;
99 static vaddr_t pxagpio_regs;
100 #define GPIO_BOOTSTRAP_REG(reg) \
101 (*((volatile uint32_t *)(pxagpio_regs + (reg))))
102
103 static int gpio_intr0(void *);
104 static int gpio_intr1(void *);
105 #ifdef PXAGPIO_HAS_GPION_INTRS
106 static int gpio_dispatch(struct pxagpio_softc *, int);
107 static int gpio_intrN(void *);
108 #endif
109
110 static inline uint32_t
111 pxagpio_reg_read(struct pxagpio_softc *sc, int reg)
112 {
113 if (__predict_true(sc != NULL))
114 return (bus_space_read_4(sc->sc_bust, sc->sc_bush, reg));
115 else
116 if (pxagpio_regs)
117 return (GPIO_BOOTSTRAP_REG(reg));
118 panic("pxagpio_reg_read: not bootstrapped");
119 }
120
121 static inline void
122 pxagpio_reg_write(struct pxagpio_softc *sc, int reg, uint32_t val)
123 {
124 if (__predict_true(sc != NULL))
125 bus_space_write_4(sc->sc_bust, sc->sc_bush, reg, val);
126 else
127 if (pxagpio_regs)
128 GPIO_BOOTSTRAP_REG(reg) = val;
129 else
130 panic("pxagpio_reg_write: not bootstrapped");
131 return;
132 }
133
134 static int
135 pxagpio_match(device_t parent, cfdata_t cf, void *aux)
136 {
137 struct pxaip_attach_args *pxa = aux;
138
139 if (pxagpio_softc != NULL || pxa->pxa_addr != PXA2X0_GPIO_BASE)
140 return (0);
141
142 pxa->pxa_size = PXA2X0_GPIO_SIZE;
143
144 return (1);
145 }
146
147 static void
148 pxagpio_attach(device_t parent, device_t self, void *aux)
149 {
150 struct pxagpio_softc *sc = device_private(self);
151 struct pxaip_attach_args *pxa = aux;
152 #if NGPIO > 0
153 struct gpiobus_attach_args gba;
154 int pin, maxpin;
155 u_int func;
156 #endif
157
158 sc->sc_dev = self;
159 sc->sc_bust = pxa->pxa_iot;
160
161 aprint_normal(": GPIO Controller\n");
162
163 if (bus_space_map(sc->sc_bust, pxa->pxa_addr, pxa->pxa_size, 0,
164 &sc->sc_bush)) {
165 aprint_error_dev(self, "Can't map registers!\n");
166 return;
167 }
168
169 pxagpio_regs = (vaddr_t)bus_space_vaddr(sc->sc_bust, sc->sc_bush);
170
171 memset(sc->sc_handlers, 0, sizeof(sc->sc_handlers));
172
173 /*
174 * Disable all GPIO interrupts
175 */
176 pxagpio_reg_write(sc, GPIO_GRER0, 0);
177 pxagpio_reg_write(sc, GPIO_GRER1, 0);
178 pxagpio_reg_write(sc, GPIO_GRER2, 0);
179 pxagpio_reg_write(sc, GPIO_GFER0, 0);
180 pxagpio_reg_write(sc, GPIO_GFER1, 0);
181 pxagpio_reg_write(sc, GPIO_GFER2, 0);
182 pxagpio_reg_write(sc, GPIO_GEDR0, ~0);
183 pxagpio_reg_write(sc, GPIO_GEDR1, ~0);
184 pxagpio_reg_write(sc, GPIO_GEDR2, ~0);
185 #ifdef CPU_XSCALE_PXA270
186 if (CPU_IS_PXA270) {
187 pxagpio_reg_write(sc, GPIO_GRER3, 0);
188 pxagpio_reg_write(sc, GPIO_GFER3, 0);
189 pxagpio_reg_write(sc, GPIO_GEDR3, ~0);
190 }
191 #endif
192
193 #ifdef PXAGPIO_HAS_GPION_INTRS
194 sc->sc_irqcookie[2] = pxa2x0_intr_establish(PXA2X0_INT_GPION, IPL_BIO,
195 gpio_intrN, sc);
196 if (sc->sc_irqcookie[2] == NULL) {
197 aprint_error_dev(self, "failed to hook main GPIO interrupt\n");
198 return;
199 }
200 #endif
201
202 sc->sc_irqcookie[0] = sc->sc_irqcookie[1] = NULL;
203
204 pxagpio_softc = sc;
205 #if NGPIO > 0
206 #if defined(CPU_XSCALE_PXA250) && defined(CPU_XSCALE_PXA270)
207 maxpin = CPU_IS_PXA270 ? PXA270_GPIO_NPINS : PXA250_GPIO_NPINS;
208 #else
209 maxpin = GPIO_NPINS;
210 #endif
211 for (pin = 0; pin < maxpin; ++pin) {
212
213 sc->sc_gpio_pins[pin].pin_num = pin;
214 func = pxa2x0_gpio_get_function(pin);
215
216 if (GPIO_IS_GPIO(func)) {
217 sc->sc_gpio_pins[pin].pin_caps = GPIO_PIN_INPUT |
218 GPIO_PIN_OUTPUT;
219 sc->sc_gpio_pins[pin].pin_state =
220 pxa2x0_gpio_pin_read(sc, pin);
221 } else {
222 sc->sc_gpio_pins[pin].pin_caps = 0;
223 sc->sc_gpio_pins[pin].pin_state = 0;
224 }
225 }
226
227 /* create controller tag */
228 sc->sc_gpio_gc.gp_cookie = sc;
229 sc->sc_gpio_gc.gp_pin_read = pxa2x0_gpio_pin_read;
230 sc->sc_gpio_gc.gp_pin_write = pxa2x0_gpio_pin_write;
231 sc->sc_gpio_gc.gp_pin_ctl = pxa2x0_gpio_pin_ctl;
232
233 gba.gba_gc = &sc->sc_gpio_gc;
234 gba.gba_pins = sc->sc_gpio_pins;
235 gba.gba_npins = maxpin;
236
237 config_found_ia(self, "gpiobus", &gba, gpiobus_print);
238 #else
239 aprint_normal_dev(sc->sc_dev, "no GPIO configured in kernel\n");
240 #endif
241 }
242
243 void
244 pxa2x0_gpio_bootstrap(vaddr_t gpio_regs)
245 {
246
247 pxagpio_regs = gpio_regs;
248 }
249
250 void *
251 pxa2x0_gpio_intr_establish(u_int gpio, int level, int spl, int (*func)(void *),
252 void *arg)
253 {
254 struct pxagpio_softc *sc = pxagpio_softc;
255 struct gpio_irq_handler *gh;
256 uint32_t bit, reg;
257
258 #ifdef PXAGPIO_HAS_GPION_INTRS
259 if (gpio >= GPIO_NPINS)
260 panic("pxa2x0_gpio_intr_establish: bad pin number: %d", gpio);
261 #else
262 if (gpio > 1)
263 panic("pxa2x0_gpio_intr_establish: bad pin number: %d", gpio);
264 #endif
265
266 if (!GPIO_IS_GPIO_IN(pxa2x0_gpio_get_function(gpio)))
267 panic("pxa2x0_gpio_intr_establish: Pin %d not GPIO_IN", gpio);
268
269 switch (level) {
270 case IST_EDGE_FALLING:
271 case IST_EDGE_RISING:
272 case IST_EDGE_BOTH:
273 break;
274
275 default:
276 panic("pxa2x0_gpio_intr_establish: bad level: %d", level);
277 break;
278 }
279
280 if (sc->sc_handlers[gpio] != NULL)
281 panic("pxa2x0_gpio_intr_establish: illegal shared interrupt");
282
283 gh = malloc(sizeof(struct gpio_irq_handler), M_DEVBUF, M_NOWAIT);
284
285 gh->gh_func = func;
286 gh->gh_arg = arg;
287 gh->gh_spl = spl;
288 gh->gh_gpio = gpio;
289 gh->gh_level = level;
290 gh->gh_next = sc->sc_handlers[gpio];
291 sc->sc_handlers[gpio] = gh;
292
293 if (gpio == 0) {
294 KDASSERT(sc->sc_irqcookie[0] == NULL);
295 sc->sc_irqcookie[0] = pxa2x0_intr_establish(PXA2X0_INT_GPIO0,
296 spl, gpio_intr0, sc);
297 KDASSERT(sc->sc_irqcookie[0]);
298 } else
299 if (gpio == 1) {
300 KDASSERT(sc->sc_irqcookie[1] == NULL);
301 sc->sc_irqcookie[1] = pxa2x0_intr_establish(PXA2X0_INT_GPIO1,
302 spl, gpio_intr1, sc);
303 KDASSERT(sc->sc_irqcookie[1]);
304 }
305
306 bit = GPIO_BIT(gpio);
307 sc->sc_mask[GPIO_BANK(gpio)] |= bit;
308
309 switch (level) {
310 case IST_EDGE_FALLING:
311 reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gpio));
312 pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gpio), reg | bit);
313 break;
314
315 case IST_EDGE_RISING:
316 reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gpio));
317 pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gpio), reg | bit);
318 break;
319
320 case IST_EDGE_BOTH:
321 reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gpio));
322 pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gpio), reg | bit);
323 reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gpio));
324 pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gpio), reg | bit);
325 break;
326 }
327
328 return (gh);
329 }
330
331 void
332 pxa2x0_gpio_intr_disestablish(void *cookie)
333 {
334 struct pxagpio_softc *sc = pxagpio_softc;
335 struct gpio_irq_handler *gh = cookie;
336 uint32_t bit, reg;
337
338 bit = GPIO_BIT(gh->gh_gpio);
339
340 reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gh->gh_gpio));
341 reg &= ~bit;
342 pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gh->gh_gpio), reg);
343 reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gh->gh_gpio));
344 reg &= ~bit;
345 pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gh->gh_gpio), reg);
346
347 pxagpio_reg_write(sc, GPIO_REG(GPIO_GEDR0, gh->gh_gpio), bit);
348
349 sc->sc_mask[GPIO_BANK(gh->gh_gpio)] &= ~bit;
350 sc->sc_handlers[gh->gh_gpio] = NULL;
351
352 if (gh->gh_gpio == 0) {
353 #if 0
354 pxa2x0_intr_disestablish(sc->sc_irqcookie[0]);
355 sc->sc_irqcookie[0] = NULL;
356 #else
357 panic("pxa2x0_gpio_intr_disestablish: can't unhook GPIO#0");
358 #endif
359 } else
360 if (gh->gh_gpio == 1) {
361 #if 0
362 pxa2x0_intr_disestablish(sc->sc_irqcookie[1]);
363 sc->sc_irqcookie[1] = NULL;
364 #else
365 panic("pxa2x0_gpio_intr_disestablish: can't unhook GPIO#1");
366 #endif
367 }
368
369 free(gh, M_DEVBUF);
370 }
371
372 static int
373 gpio_intr0(void *arg)
374 {
375 struct pxagpio_softc *sc = arg;
376
377 #ifdef DIAGNOSTIC
378 if (sc->sc_handlers[0] == NULL) {
379 aprint_error_dev(sc->sc_dev, "stray GPIO#0 edge interrupt\n");
380 return (0);
381 }
382 #endif
383
384 bus_space_write_4(sc->sc_bust, sc->sc_bush, GPIO_REG(GPIO_GEDR0, 0),
385 GPIO_BIT(0));
386
387 return ((sc->sc_handlers[0]->gh_func)(sc->sc_handlers[0]->gh_arg));
388 }
389
390 static int
391 gpio_intr1(void *arg)
392 {
393 struct pxagpio_softc *sc = arg;
394
395 #ifdef DIAGNOSTIC
396 if (sc->sc_handlers[1] == NULL) {
397 aprint_error_dev(sc->sc_dev, "stray GPIO#1 edge interrupt\n");
398 return (0);
399 }
400 #endif
401
402 bus_space_write_4(sc->sc_bust, sc->sc_bush, GPIO_REG(GPIO_GEDR0, 1),
403 GPIO_BIT(1));
404
405 return ((sc->sc_handlers[1]->gh_func)(sc->sc_handlers[1]->gh_arg));
406 }
407
408 #ifdef PXAGPIO_HAS_GPION_INTRS
409 static int
410 gpio_dispatch(struct pxagpio_softc *sc, int gpio_base)
411 {
412 struct gpio_irq_handler **ghp, *gh;
413 int i, s, nhandled, handled, pins;
414 uint32_t gedr, mask;
415 int bank;
416
417 /* Fetch bitmap of pending interrupts on this GPIO bank */
418 gedr = pxagpio_reg_read(sc, GPIO_REG(GPIO_GEDR0, gpio_base));
419
420 /* Don't handle GPIO 0/1 here */
421 if (gpio_base == 0)
422 gedr &= ~(GPIO_BIT(0) | GPIO_BIT(1));
423
424 /* Bail early if there are no pending interrupts in this bank */
425 if (gedr == 0)
426 return (0);
427
428 /* Acknowledge pending interrupts. */
429 pxagpio_reg_write(sc, GPIO_REG(GPIO_GEDR0, gpio_base), gedr);
430
431 bank = GPIO_BANK(gpio_base);
432
433 /*
434 * We're only interested in those for which we have a handler
435 * registered
436 */
437 #ifdef DEBUG
438 if ((gedr & sc->sc_mask[bank]) == 0) {
439 aprint_error_dev(sc->sc_dev,
440 "stray GPIO interrupt. Bank %d, GEDR 0x%08x, mask 0x%08x\n",
441 bank, gedr, sc->sc_mask[bank]);
442 return (1); /* XXX: Pretend we dealt with it */
443 }
444 #endif
445
446 gedr &= sc->sc_mask[bank];
447 ghp = &sc->sc_handlers[gpio_base];
448 if (CPU_IS_PXA270)
449 pins = (gpio_base < 96) ? 32 : 25;
450 else
451 pins = (gpio_base < 64) ? 32 : 17;
452 handled = 0;
453
454 for (i = 0, mask = 1; i < pins && gedr; i++, ghp++, mask <<= 1) {
455 if ((gedr & mask) == 0)
456 continue;
457 gedr &= ~mask;
458
459 if ((gh = *ghp) == NULL) {
460 aprint_error_dev(sc->sc_dev,
461 "unhandled GPIO interrupt. GPIO#%d\n",
462 gpio_base + i);
463 continue;
464 }
465
466 s = _splraise(gh->gh_spl);
467 do {
468 nhandled = (gh->gh_func)(gh->gh_arg);
469 handled |= nhandled;
470 gh = gh->gh_next;
471 } while (gh != NULL);
472 splx(s);
473 }
474
475 return (handled);
476 }
477
478 static int
479 gpio_intrN(void *arg)
480 {
481 struct pxagpio_softc *sc = arg;
482 int handled;
483
484 handled = gpio_dispatch(sc, 0);
485 handled |= gpio_dispatch(sc, 32);
486 handled |= gpio_dispatch(sc, 64);
487 if (CPU_IS_PXA270)
488 handled |= gpio_dispatch(sc, 96);
489 return (handled);
490 }
491 #endif /* PXAGPIO_HAS_GPION_INTRS */
492
493 u_int
494 pxa2x0_gpio_get_function(u_int gpio)
495 {
496 struct pxagpio_softc *sc = pxagpio_softc;
497 uint32_t rv, io;
498
499 KDASSERT(gpio < GPIO_NPINS);
500
501 rv = pxagpio_reg_read(sc, GPIO_FN_REG(gpio)) >> GPIO_FN_SHIFT(gpio);
502 rv = GPIO_FN(rv);
503
504 io = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPDR0, gpio));
505 if (io & GPIO_BIT(gpio))
506 rv |= GPIO_OUT;
507
508 io = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPLR0, gpio));
509 if (io & GPIO_BIT(gpio))
510 rv |= GPIO_SET;
511
512 return (rv);
513 }
514
515 u_int
516 pxa2x0_gpio_set_function(u_int gpio, u_int fn)
517 {
518 struct pxagpio_softc *sc = pxagpio_softc;
519 uint32_t rv, bit;
520 u_int oldfn;
521
522 KDASSERT(gpio < GPIO_NPINS);
523
524 oldfn = pxa2x0_gpio_get_function(gpio);
525
526 if (GPIO_FN(fn) == GPIO_FN(oldfn) &&
527 GPIO_FN_IS_OUT(fn) == GPIO_FN_IS_OUT(oldfn)) {
528 /*
529 * The pin's function is not changing.
530 * For Alternate Functions and GPIO input, we can just
531 * return now.
532 * For GPIO output pins, check the initial state is
533 * the same.
534 *
535 * Return 'fn' instead of 'oldfn' so the caller can
536 * reliably detect that we didn't change anything.
537 * (The initial state might be different for non-
538 * GPIO output pins).
539 */
540 if (!GPIO_IS_GPIO_OUT(fn) ||
541 GPIO_FN_IS_SET(fn) == GPIO_FN_IS_SET(oldfn))
542 return (fn);
543 }
544
545 /*
546 * See section 4.1.3.7 of the PXA2x0 Developer's Manual for
547 * the correct procedure for changing GPIO pin functions.
548 */
549
550 bit = GPIO_BIT(gpio);
551
552 /*
553 * 1. Configure the correct set/clear state of the pin
554 */
555 if (GPIO_FN_IS_SET(fn))
556 pxagpio_reg_write(sc, GPIO_REG(GPIO_GPSR0, gpio), bit);
557 else
558 pxagpio_reg_write(sc, GPIO_REG(GPIO_GPCR0, gpio), bit);
559
560 /*
561 * 2. Configure the pin as an input or output as appropriate
562 */
563 rv = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPDR0, gpio)) & ~bit;
564 if (GPIO_FN_IS_OUT(fn))
565 rv |= bit;
566 pxagpio_reg_write(sc, GPIO_REG(GPIO_GPDR0, gpio), rv);
567
568 /*
569 * 3. Configure the pin's function
570 */
571 bit = GPIO_FN_MASK << GPIO_FN_SHIFT(gpio);
572 fn = GPIO_FN(fn) << GPIO_FN_SHIFT(gpio);
573 rv = pxagpio_reg_read(sc, GPIO_FN_REG(gpio)) & ~bit;
574 pxagpio_reg_write(sc, GPIO_FN_REG(gpio), rv | fn);
575
576 return (oldfn);
577 }
578
579 /*
580 * Quick function to read pin value
581 */
582 int
583 pxa2x0_gpio_get_bit(u_int gpio)
584 {
585 struct pxagpio_softc *sc = pxagpio_softc;
586 int bit;
587
588 bit = GPIO_BIT(gpio);
589 if (pxagpio_reg_read(sc, GPIO_REG(GPIO_GPLR0, gpio)) & bit)
590 return 1;
591 else
592 return 0;
593 }
594
595 /*
596 * Quick function to set pin to 1
597 */
598 void
599 pxa2x0_gpio_set_bit(u_int gpio)
600 {
601 struct pxagpio_softc *sc = pxagpio_softc;
602 int bit;
603
604 bit = GPIO_BIT(gpio);
605 pxagpio_reg_write(sc, GPIO_REG(GPIO_GPSR0, gpio), bit);
606 }
607
608 /*
609 * Quick function to set pin to 0
610 */
611 void
612 pxa2x0_gpio_clear_bit(u_int gpio)
613 {
614 struct pxagpio_softc *sc = pxagpio_softc;
615 int bit;
616
617 bit = GPIO_BIT(gpio);
618 pxagpio_reg_write(sc, GPIO_REG(GPIO_GPCR0, gpio), bit);
619 }
620
621 /*
622 * Quick function to change pin direction
623 */
624 void
625 pxa2x0_gpio_set_dir(u_int gpio, int dir)
626 {
627 struct pxagpio_softc *sc = pxagpio_softc;
628 int bit;
629 uint32_t reg;
630
631 bit = GPIO_BIT(gpio);
632
633 reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPDR0, gpio)) & ~bit;
634 if (GPIO_FN_IS_OUT(dir))
635 reg |= bit;
636 pxagpio_reg_write(sc, GPIO_REG(GPIO_GPDR0, gpio), reg);
637 }
638
639 /*
640 * Quick function to clear interrupt status on a pin
641 * GPIO pins may be toggle in an interrupt and we dont want
642 * extra spurious interrupts to occur.
643 * Suppose this causes a slight race if a key is pressed while
644 * the interrupt handler is running. (yes this is for the keyboard driver)
645 */
646 void
647 pxa2x0_gpio_clear_intr(u_int gpio)
648 {
649 struct pxagpio_softc *sc = pxagpio_softc;
650 int bit;
651
652 bit = GPIO_BIT(gpio);
653 pxagpio_reg_write(sc, GPIO_REG(GPIO_GEDR0, gpio), bit);
654 }
655
656 /*
657 * Quick function to mask (disable) a GPIO interrupt
658 */
659 void
660 pxa2x0_gpio_intr_mask(void *v)
661 {
662 struct gpio_irq_handler *gh = (struct gpio_irq_handler *)v;
663
664 pxa2x0_gpio_set_intr_level(gh->gh_gpio, IPL_NONE);
665 }
666
667 /*
668 * Quick function to unmask (enable) a GPIO interrupt
669 */
670 void
671 pxa2x0_gpio_intr_unmask(void *v)
672 {
673 struct gpio_irq_handler *gh = (struct gpio_irq_handler *)v;
674
675 pxa2x0_gpio_set_intr_level(gh->gh_gpio, gh->gh_level);
676 }
677
678 /*
679 * Configure the edge sensitivity of interrupt pins
680 */
681 void
682 pxa2x0_gpio_set_intr_level(u_int gpio, int level)
683 {
684 struct pxagpio_softc *sc = pxagpio_softc;
685 uint32_t bit;
686 uint32_t gfer;
687 uint32_t grer;
688 int s;
689
690 s = splhigh();
691
692 bit = GPIO_BIT(gpio);
693 gfer = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gpio));
694 grer = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gpio));
695
696 switch (level) {
697 case IST_NONE:
698 gfer &= ~bit;
699 grer &= ~bit;
700 break;
701 case IST_EDGE_FALLING:
702 gfer |= bit;
703 grer &= ~bit;
704 break;
705 case IST_EDGE_RISING:
706 gfer &= ~bit;
707 grer |= bit;
708 break;
709 case IST_EDGE_BOTH:
710 gfer |= bit;
711 grer |= bit;
712 break;
713 default:
714 panic("pxa2x0_gpio_set_intr_level: bad level: %d", level);
715 break;
716 }
717
718 pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gpio), gfer);
719 pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gpio), grer);
720
721 splx(s);
722 }
723
724 #if NGPIO > 0
725 /* GPIO support functions */
726 static int
727 pxa2x0_gpio_pin_read(void *arg, int pin)
728 {
729 return pxa2x0_gpio_get_bit(pin);
730 }
731
732 static void
733 pxa2x0_gpio_pin_write(void *arg, int pin, int value)
734 {
735 if (value == GPIO_PIN_HIGH) {
736 pxa2x0_gpio_set_bit(pin);
737 } else {
738 pxa2x0_gpio_clear_bit(pin);
739 }
740 }
741
742 static void
743 pxa2x0_gpio_pin_ctl(void *arg, int pin, int flags)
744 {
745 if (flags & GPIO_PIN_OUTPUT) {
746 pxa2x0_gpio_set_function(pin, GPIO_OUT);
747 } else if (flags & GPIO_PIN_INPUT) {
748 pxa2x0_gpio_set_function(pin, GPIO_IN);
749 }
750 }
751 #endif
752
753 #if defined(CPU_XSCALE_PXA250)
754 /*
755 * Configurations of GPIO for PXA25x
756 */
757 struct pxa2x0_gpioconf pxa25x_com_btuart_gpioconf[] = {
758 { 42, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* BTRXD */
759 { 43, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* BTTXD */
760
761 #if 0 /* optional */
762 { 44, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* BTCTS */
763 { 45, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* BTRTS */
764 #endif
765
766 { -1 }
767 };
768
769 struct pxa2x0_gpioconf pxa25x_com_ffuart_gpioconf[] = {
770 { 34, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFRXD */
771
772 #if 0 /* optional */
773 { 35, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* CTS */
774 { 36, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* DCD */
775 { 37, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* DSR */
776 { 38, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* RI */
777 #endif
778
779 { 39, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* FFTXD */
780
781 #if 0 /* optional */
782 { 40, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* DTR */
783 { 41, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* RTS */
784 #endif
785
786 { -1 }
787 };
788
789 struct pxa2x0_gpioconf pxa25x_com_hwuart_gpioconf[] = {
790 #if 0 /* We can select and/or. */
791 { 42, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* HWRXD */
792 { 49, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* HWRXD */
793
794 { 43, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* HWTXD */
795 { 48, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* HWTXD */
796
797 #if 0 /* optional */
798 { 44, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* HWCST */
799 { 51, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* HWCST */
800
801 { 45, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* HWRST */
802 { 52, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* HWRST */
803 #endif
804 #endif
805
806 { -1 }
807 };
808
809 struct pxa2x0_gpioconf pxa25x_com_stuart_gpioconf[] = {
810 { 46, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* RXD */
811 { 47, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* TXD */
812 { -1 }
813 };
814
815 struct pxa2x0_gpioconf pxa25x_i2c_gpioconf[] = {
816 { -1 }
817 };
818
819 struct pxa2x0_gpioconf pxa25x_i2s_gpioconf[] = {
820 { 28, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* BITCLK */
821 { 29, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* SDATA_IN */
822 { 30, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* SDATA_OUT */
823 { 31, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* SYNC */
824 { 32, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* SYSCLK */
825 { -1 }
826 };
827
828 struct pxa2x0_gpioconf pxa25x_pcic_gpioconf[] = {
829 { 48, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPOE */
830 { 49, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPWE */
831 { 50, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPIOR */
832 { 51, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPIOW */
833
834 #if 0 /* We can select and/or. */
835 { 52, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPCE1 */
836 { 53, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPCE2 */
837 #endif
838
839 { 54, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* pSKTSEL */
840 { 55, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPREG */
841 { 56, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* nPWAIT */
842 { 57, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* nIOIS16 */
843 { -1 }
844 };
845
846 struct pxa2x0_gpioconf pxa25x_pxaacu_gpioconf[] = {
847 { 28, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* BITCLK */
848 { 30, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* SDATA_OUT */
849 { 31, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* SYNC */
850
851 #if 0 /* We can select and/or. */
852 { 29, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* SDATA_IN0 */
853 { 32, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* SDATA_IN1 */
854 #endif
855
856 { -1 }
857 };
858
859 struct pxa2x0_gpioconf pxa25x_pxamci_gpioconf[] = {
860 #if 0 /* We can select and/or. */
861 { 6, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCLK */
862 { 53, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCLK */
863 { 54, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCLK */
864
865 { 8, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCS0 */
866 { 34, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* MMCCS0 */
867 { 67, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCS0 */
868
869 { 9, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCS1 */
870 { 39, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCS1 */
871 { 68, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* MMCCS1 */
872 #endif
873
874 { -1 }
875 };
876 #endif
877
878 #if defined(CPU_XSCALE_PXA270)
879 /*
880 * Configurations of GPIO for PXA27x
881 */
882 struct pxa2x0_gpioconf pxa27x_com_btuart_gpioconf[] = {
883 { 42, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* BTRXD */
884 { 43, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* BTTXD */
885
886 #if 0 /* optional */
887 { 44, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* BTCTS */
888 { 45, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* BTRTS */
889 #endif
890
891 { -1 }
892 };
893
894 struct pxa2x0_gpioconf pxa27x_com_ffuart_gpioconf[] = {
895 #if 0 /* We can select and/or. */
896 { 16, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* FFTXD */
897 { 37, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* FFTXD */
898 { 39, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* FFTXD */
899 { 83, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* FFTXD */
900 { 99, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* FFTXD */
901
902 { 19, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* FFRXD */
903 { 33, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFRXD */
904 { 34, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFRXD */
905 { 41, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFRXD */
906 { 53, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFRXD */
907 { 85, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFRXD */
908 { 96, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* FFRXD */
909 { 102, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* FFRXD */
910
911 { 9, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* FFCTS */
912 { 26, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* FFCTS */
913 { 35, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFCTS */
914 { 100, GPIO_CLR | GPIO_ALT_FN_3_IN }, /* FFCTS */
915
916 { 27, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* FFRTS */
917 { 41, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* FFRTS */
918 { 83, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* FFRTS */
919 { 98, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* FFRTS */
920
921 { 40, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* FFDTR */
922 { 82, GPIO_CLR | GPIO_ALT_FN_3_OUT }, /* FFDTR */
923
924 { 36, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFDCD */
925
926 { 33, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* FFDSR */
927 { 37, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFDSR */
928
929 { 38, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* FFRI */
930 #endif
931 { -1 }
932 };
933
934 struct pxa2x0_gpioconf pxa27x_com_stuart_gpioconf[] = {
935 { 46, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* STD_RXD */
936 { 47, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* STD_TXD */
937 { -1 }
938 };
939
940 struct pxa2x0_gpioconf pxa27x_i2c_gpioconf[] = {
941 { 117, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* SCL */
942 { 118, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* SDA */
943 { -1 }
944 };
945
946 struct pxa2x0_gpioconf pxa27x_i2s_gpioconf[] = {
947 { 28, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* I2S_BITCLK */
948 { 29, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* I2S_SDATA_IN */
949 { 30, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* I2S_SDATA_OUT */
950 { 31, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* I2S_SYNC */
951 { 113, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* I2S_SYSCLK */
952 { -1 }
953 };
954
955 struct pxa2x0_gpioconf pxa27x_ohci_gpioconf[] = {
956 #if 0 /* We can select and/or. */
957 { 88, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* USBHPWR1 */
958 { 89, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* USBHPEN1 */
959 { 119, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* USBHPWR2 */
960 { 120, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* USBHPEN2 */
961 #endif
962 { -1 }
963 };
964
965 struct pxa2x0_gpioconf pxa27x_pcic_gpioconf[] = {
966 { 48, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPOE */
967 { 49, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPWE */
968 { 50, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPIOR */
969 { 51, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPIOW */
970 { 55, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPREG */
971 { 56, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* nPWAIT */
972 { 57, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* nIOIS16 */
973
974 #if 0 /* We can select and/or. */
975 { 85, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* nPCE1 */
976 { 86, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* nPCE1 */
977 { 102, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* nPCE1 */
978
979 { 54, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* nPCE2 */
980 { 78, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* nPCE2 */
981 { 105, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* nPCE2 */
982
983 { 79, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* pSKTSEL */
984 { 104, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* pSKTSEL */
985 #endif
986
987 { -1 }
988 };
989
990 struct pxa2x0_gpioconf pxa27x_pxaacu_gpioconf[] = {
991 { 28, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* BITCLK */
992 { 30, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* SDATA_OUT */
993
994 #if 0 /* We can select and/or. */
995 { 31, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* SYNC */
996 { 94, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* SYNC */
997
998 { 29, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* SDATA_IN0 */
999 { 116, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* SDATA_IN0 */
1000
1001 { 32, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* SDATA_IN1 */
1002 { 99, GPIO_CLR | GPIO_ALT_FN_2_IN }, /* SDATA_IN1 */
1003
1004 { 95, GPIO_CLR | GPIO_ALT_FN_1_OUT }, /* RESET_n */
1005 { 113, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* RESET_n */
1006 #endif
1007
1008 { -1 }
1009 };
1010
1011 struct pxa2x0_gpioconf pxa27x_pxamci_gpioconf[] = {
1012 { 32, GPIO_CLR | GPIO_ALT_FN_2_OUT }, /* MMCLK */
1013 { 92, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* MMDAT<0> */
1014 { 109, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* MMDAT<1> */
1015 { 110, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* MMDAT<2>/MMCCS<0> */
1016 { 111, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* MMDAT<3>/MMCCS<1> */
1017 { 112, GPIO_CLR | GPIO_ALT_FN_1_IN }, /* MMCMD */
1018
1019 { -1 }
1020 };
1021 #endif
1022
1023 void
1024 pxa2x0_gpio_config(struct pxa2x0_gpioconf **conflist)
1025 {
1026 int i, j;
1027
1028 for (i = 0; conflist[i] != NULL; i++)
1029 for (j = 0; conflist[i][j].pin != -1; j++)
1030 pxa2x0_gpio_set_function(conflist[i][j].pin,
1031 conflist[i][j].value);
1032 }
1033