Home | History | Annotate | Line # | Download | only in xscale
      1 /*	$NetBSD: pxa2x0_gpio.c,v 1.21 2021/08/07 16:18:46 thorpej 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.21 2021/08/07 16:18:46 thorpej 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/kmem.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(self, &gba, gpiobus_print, CFARGS_NONE);
    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 = kmem_alloc(sizeof(*gh), KM_SLEEP);
    284 	gh->gh_func = func;
    285 	gh->gh_arg = arg;
    286 	gh->gh_spl = spl;
    287 	gh->gh_gpio = gpio;
    288 	gh->gh_level = level;
    289 	gh->gh_next = sc->sc_handlers[gpio];
    290 	sc->sc_handlers[gpio] = gh;
    291 
    292 	if (gpio == 0) {
    293 		KDASSERT(sc->sc_irqcookie[0] == NULL);
    294 		sc->sc_irqcookie[0] = pxa2x0_intr_establish(PXA2X0_INT_GPIO0,
    295 		    spl, gpio_intr0, sc);
    296 		KDASSERT(sc->sc_irqcookie[0]);
    297 	} else
    298 	if (gpio == 1) {
    299 		KDASSERT(sc->sc_irqcookie[1] == NULL);
    300 		sc->sc_irqcookie[1] = pxa2x0_intr_establish(PXA2X0_INT_GPIO1,
    301 		    spl, gpio_intr1, sc);
    302 		KDASSERT(sc->sc_irqcookie[1]);
    303 	}
    304 
    305 	bit = GPIO_BIT(gpio);
    306 	sc->sc_mask[GPIO_BANK(gpio)] |= bit;
    307 
    308 	switch (level) {
    309 	case IST_EDGE_FALLING:
    310 		reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gpio));
    311 		pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gpio), reg | bit);
    312 		break;
    313 
    314 	case IST_EDGE_RISING:
    315 		reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gpio));
    316 		pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gpio), reg | bit);
    317 		break;
    318 
    319 	case IST_EDGE_BOTH:
    320 		reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gpio));
    321 		pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gpio), reg | bit);
    322 		reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gpio));
    323 		pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gpio), reg | bit);
    324 		break;
    325 	}
    326 
    327 	return (gh);
    328 }
    329 
    330 void
    331 pxa2x0_gpio_intr_disestablish(void *cookie)
    332 {
    333 	struct pxagpio_softc *sc = pxagpio_softc;
    334 	struct gpio_irq_handler *gh = cookie;
    335 	uint32_t bit, reg;
    336 
    337 	bit = GPIO_BIT(gh->gh_gpio);
    338 
    339 	reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gh->gh_gpio));
    340 	reg &= ~bit;
    341 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gh->gh_gpio), reg);
    342 	reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gh->gh_gpio));
    343 	reg &= ~bit;
    344 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gh->gh_gpio), reg);
    345 
    346 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GEDR0, gh->gh_gpio), bit);
    347 
    348 	sc->sc_mask[GPIO_BANK(gh->gh_gpio)] &= ~bit;
    349 	sc->sc_handlers[gh->gh_gpio] = NULL;
    350 
    351 	if (gh->gh_gpio == 0) {
    352 #if 0
    353 		pxa2x0_intr_disestablish(sc->sc_irqcookie[0]);
    354 		sc->sc_irqcookie[0] = NULL;
    355 #else
    356 		panic("pxa2x0_gpio_intr_disestablish: can't unhook GPIO#0");
    357 #endif
    358 	} else
    359 	if (gh->gh_gpio == 1) {
    360 #if 0
    361 		pxa2x0_intr_disestablish(sc->sc_irqcookie[1]);
    362 		sc->sc_irqcookie[1] = NULL;
    363 #else
    364 		panic("pxa2x0_gpio_intr_disestablish: can't unhook GPIO#1");
    365 #endif
    366 	}
    367 
    368 	kmem_free(gh, sizeof(*gh));
    369 }
    370 
    371 static int
    372 gpio_intr0(void *arg)
    373 {
    374 	struct pxagpio_softc *sc = arg;
    375 
    376 #ifdef DIAGNOSTIC
    377 	if (sc->sc_handlers[0] == NULL) {
    378 		aprint_error_dev(sc->sc_dev, "stray GPIO#0 edge interrupt\n");
    379 		return (0);
    380 	}
    381 #endif
    382 
    383 	bus_space_write_4(sc->sc_bust, sc->sc_bush, GPIO_REG(GPIO_GEDR0, 0),
    384 	    GPIO_BIT(0));
    385 
    386 	return ((sc->sc_handlers[0]->gh_func)(sc->sc_handlers[0]->gh_arg));
    387 }
    388 
    389 static int
    390 gpio_intr1(void *arg)
    391 {
    392 	struct pxagpio_softc *sc = arg;
    393 
    394 #ifdef DIAGNOSTIC
    395 	if (sc->sc_handlers[1] == NULL) {
    396 		aprint_error_dev(sc->sc_dev, "stray GPIO#1 edge interrupt\n");
    397 		return (0);
    398 	}
    399 #endif
    400 
    401 	bus_space_write_4(sc->sc_bust, sc->sc_bush, GPIO_REG(GPIO_GEDR0, 1),
    402 	    GPIO_BIT(1));
    403 
    404 	return ((sc->sc_handlers[1]->gh_func)(sc->sc_handlers[1]->gh_arg));
    405 }
    406 
    407 #ifdef PXAGPIO_HAS_GPION_INTRS
    408 static int
    409 gpio_dispatch(struct pxagpio_softc *sc, int gpio_base)
    410 {
    411 	struct gpio_irq_handler **ghp, *gh;
    412 	int i, s, nhandled, handled, pins;
    413 	uint32_t gedr, mask;
    414 	int bank;
    415 
    416 	/* Fetch bitmap of pending interrupts on this GPIO bank */
    417 	gedr = pxagpio_reg_read(sc, GPIO_REG(GPIO_GEDR0, gpio_base));
    418 
    419 	/* Don't handle GPIO 0/1 here */
    420 	if (gpio_base == 0)
    421 		gedr &= ~(GPIO_BIT(0) | GPIO_BIT(1));
    422 
    423 	/* Bail early if there are no pending interrupts in this bank */
    424 	if (gedr == 0)
    425 		return (0);
    426 
    427 	/* Acknowledge pending interrupts. */
    428 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GEDR0, gpio_base), gedr);
    429 
    430 	bank = GPIO_BANK(gpio_base);
    431 
    432 	/*
    433 	 * We're only interested in those for which we have a handler
    434 	 * registered
    435 	 */
    436 #ifdef DEBUG
    437 	if ((gedr & sc->sc_mask[bank]) == 0) {
    438 		aprint_error_dev(sc->sc_dev,
    439 		    "stray GPIO interrupt. Bank %d, GEDR 0x%08x, mask 0x%08x\n",
    440 		    bank, gedr, sc->sc_mask[bank]);
    441 		return (1);	/* XXX: Pretend we dealt with it */
    442 	}
    443 #endif
    444 
    445 	gedr &= sc->sc_mask[bank];
    446 	ghp = &sc->sc_handlers[gpio_base];
    447 	if (CPU_IS_PXA270)
    448 		pins = (gpio_base < 96) ? 32 : 25;
    449 	else
    450 		pins = (gpio_base < 64) ? 32 : 17;
    451 	handled = 0;
    452 
    453 	for (i = 0, mask = 1; i < pins && gedr; i++, ghp++, mask <<= 1) {
    454 		if ((gedr & mask) == 0)
    455 			continue;
    456 		gedr &= ~mask;
    457 
    458 		if ((gh = *ghp) == NULL) {
    459 			aprint_error_dev(sc->sc_dev,
    460 			    "unhandled GPIO interrupt. GPIO#%d\n",
    461 			    gpio_base + i);
    462 			continue;
    463 		}
    464 
    465 		s = _splraise(gh->gh_spl);
    466 		do {
    467 			nhandled = (gh->gh_func)(gh->gh_arg);
    468 			handled |= nhandled;
    469 			gh = gh->gh_next;
    470 		} while (gh != NULL);
    471 		splx(s);
    472 	}
    473 
    474 	return (handled);
    475 }
    476 
    477 static int
    478 gpio_intrN(void *arg)
    479 {
    480 	struct pxagpio_softc *sc = arg;
    481 	int handled;
    482 
    483 	handled = gpio_dispatch(sc, 0);
    484 	handled |= gpio_dispatch(sc, 32);
    485 	handled |= gpio_dispatch(sc, 64);
    486 	if (CPU_IS_PXA270)
    487 		handled |= gpio_dispatch(sc, 96);
    488 	return (handled);
    489 }
    490 #endif	/* PXAGPIO_HAS_GPION_INTRS */
    491 
    492 u_int
    493 pxa2x0_gpio_get_function(u_int gpio)
    494 {
    495 	struct pxagpio_softc *sc = pxagpio_softc;
    496 	uint32_t rv, io;
    497 
    498 	KDASSERT(gpio < GPIO_NPINS);
    499 
    500 	rv = pxagpio_reg_read(sc, GPIO_FN_REG(gpio)) >> GPIO_FN_SHIFT(gpio);
    501 	rv = GPIO_FN(rv);
    502 
    503 	io = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPDR0, gpio));
    504 	if (io & GPIO_BIT(gpio))
    505 		rv |= GPIO_OUT;
    506 
    507 	io = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPLR0, gpio));
    508 	if (io & GPIO_BIT(gpio))
    509 		rv |= GPIO_SET;
    510 
    511 	return (rv);
    512 }
    513 
    514 u_int
    515 pxa2x0_gpio_set_function(u_int gpio, u_int fn)
    516 {
    517 	struct pxagpio_softc *sc = pxagpio_softc;
    518 	uint32_t rv, bit;
    519 	u_int oldfn;
    520 
    521 	KDASSERT(gpio < GPIO_NPINS);
    522 
    523 	oldfn = pxa2x0_gpio_get_function(gpio);
    524 
    525 	if (GPIO_FN(fn) == GPIO_FN(oldfn) &&
    526 	    GPIO_FN_IS_OUT(fn) == GPIO_FN_IS_OUT(oldfn)) {
    527 		/*
    528 		 * The pin's function is not changing.
    529 		 * For Alternate Functions and GPIO input, we can just
    530 		 * return now.
    531 		 * For GPIO output pins, check the initial state is
    532 		 * the same.
    533 		 *
    534 		 * Return 'fn' instead of 'oldfn' so the caller can
    535 		 * reliably detect that we didn't change anything.
    536 		 * (The initial state might be different for non-
    537 		 * GPIO output pins).
    538 		 */
    539 		if (!GPIO_IS_GPIO_OUT(fn) ||
    540 		    GPIO_FN_IS_SET(fn) == GPIO_FN_IS_SET(oldfn))
    541 			return (fn);
    542 	}
    543 
    544 	/*
    545 	 * See section 4.1.3.7 of the PXA2x0 Developer's Manual for
    546 	 * the correct procedure for changing GPIO pin functions.
    547 	 */
    548 
    549 	bit = GPIO_BIT(gpio);
    550 
    551 	/*
    552 	 * 1. Configure the correct set/clear state of the pin
    553 	 */
    554 	if (GPIO_FN_IS_SET(fn))
    555 		pxagpio_reg_write(sc, GPIO_REG(GPIO_GPSR0, gpio), bit);
    556 	else
    557 		pxagpio_reg_write(sc, GPIO_REG(GPIO_GPCR0, gpio), bit);
    558 
    559 	/*
    560 	 * 2. Configure the pin as an input or output as appropriate
    561 	 */
    562 	rv = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPDR0, gpio)) & ~bit;
    563 	if (GPIO_FN_IS_OUT(fn))
    564 		rv |= bit;
    565 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GPDR0, gpio), rv);
    566 
    567 	/*
    568 	 * 3. Configure the pin's function
    569 	 */
    570 	bit = GPIO_FN_MASK << GPIO_FN_SHIFT(gpio);
    571 	fn = GPIO_FN(fn) << GPIO_FN_SHIFT(gpio);
    572 	rv = pxagpio_reg_read(sc, GPIO_FN_REG(gpio)) & ~bit;
    573 	pxagpio_reg_write(sc, GPIO_FN_REG(gpio), rv | fn);
    574 
    575 	return (oldfn);
    576 }
    577 
    578 /*
    579  * Quick function to read pin value
    580  */
    581 int
    582 pxa2x0_gpio_get_bit(u_int gpio)
    583 {
    584 	struct pxagpio_softc *sc = pxagpio_softc;
    585 	int bit;
    586 
    587 	bit = GPIO_BIT(gpio);
    588 	if (pxagpio_reg_read(sc, GPIO_REG(GPIO_GPLR0, gpio)) & bit)
    589 		return 1;
    590 	else
    591 		return 0;
    592 }
    593 
    594 /*
    595  * Quick function to set pin to 1
    596  */
    597 void
    598 pxa2x0_gpio_set_bit(u_int gpio)
    599 {
    600 	struct pxagpio_softc *sc = pxagpio_softc;
    601 	int bit;
    602 
    603 	bit = GPIO_BIT(gpio);
    604 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GPSR0, gpio), bit);
    605 }
    606 
    607 /*
    608  * Quick function to set pin to 0
    609  */
    610 void
    611 pxa2x0_gpio_clear_bit(u_int gpio)
    612 {
    613 	struct pxagpio_softc *sc = pxagpio_softc;
    614 	int bit;
    615 
    616 	bit = GPIO_BIT(gpio);
    617 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GPCR0, gpio), bit);
    618 }
    619 
    620 /*
    621  * Quick function to change pin direction
    622  */
    623 void
    624 pxa2x0_gpio_set_dir(u_int gpio, int dir)
    625 {
    626 	struct pxagpio_softc *sc = pxagpio_softc;
    627 	int bit;
    628 	uint32_t reg;
    629 
    630 	bit = GPIO_BIT(gpio);
    631 
    632 	reg = pxagpio_reg_read(sc, GPIO_REG(GPIO_GPDR0, gpio)) & ~bit;
    633 	if (GPIO_FN_IS_OUT(dir))
    634 		reg |= bit;
    635 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GPDR0, gpio), reg);
    636 }
    637 
    638 /*
    639  * Quick function to clear interrupt status on a pin
    640  * GPIO pins may be toggle in an interrupt and we dont want
    641  * extra spurious interrupts to occur.
    642  * Suppose this causes a slight race if a key is pressed while
    643  * the interrupt handler is running. (yes this is for the keyboard driver)
    644  */
    645 void
    646 pxa2x0_gpio_clear_intr(u_int gpio)
    647 {
    648 	struct pxagpio_softc *sc = pxagpio_softc;
    649 	int bit;
    650 
    651 	bit = GPIO_BIT(gpio);
    652 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GEDR0, gpio), bit);
    653 }
    654 
    655 /*
    656  * Quick function to mask (disable) a GPIO interrupt
    657  */
    658 void
    659 pxa2x0_gpio_intr_mask(void *v)
    660 {
    661 	struct gpio_irq_handler *gh = (struct gpio_irq_handler *)v;
    662 
    663 	pxa2x0_gpio_set_intr_level(gh->gh_gpio, IPL_NONE);
    664 }
    665 
    666 /*
    667  * Quick function to unmask (enable) a GPIO interrupt
    668  */
    669 void
    670 pxa2x0_gpio_intr_unmask(void *v)
    671 {
    672 	struct gpio_irq_handler *gh = (struct gpio_irq_handler *)v;
    673 
    674 	pxa2x0_gpio_set_intr_level(gh->gh_gpio, gh->gh_level);
    675 }
    676 
    677 /*
    678  * Configure the edge sensitivity of interrupt pins
    679  */
    680 void
    681 pxa2x0_gpio_set_intr_level(u_int gpio, int level)
    682 {
    683 	struct pxagpio_softc *sc = pxagpio_softc;
    684 	uint32_t bit;
    685 	uint32_t gfer;
    686 	uint32_t grer;
    687 	int s;
    688 
    689 	s = splhigh();
    690 
    691 	bit = GPIO_BIT(gpio);
    692 	gfer = pxagpio_reg_read(sc, GPIO_REG(GPIO_GFER0, gpio));
    693 	grer = pxagpio_reg_read(sc, GPIO_REG(GPIO_GRER0, gpio));
    694 
    695 	switch (level) {
    696 	case IST_NONE:
    697 		gfer &= ~bit;
    698 		grer &= ~bit;
    699 		break;
    700 	case IST_EDGE_FALLING:
    701 		gfer |= bit;
    702 		grer &= ~bit;
    703 		break;
    704 	case IST_EDGE_RISING:
    705 		gfer &= ~bit;
    706 		grer |= bit;
    707 		break;
    708 	case IST_EDGE_BOTH:
    709 		gfer |= bit;
    710 		grer |= bit;
    711 		break;
    712 	default:
    713 		panic("pxa2x0_gpio_set_intr_level: bad level: %d", level);
    714 		break;
    715 	}
    716 
    717 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GFER0, gpio), gfer);
    718 	pxagpio_reg_write(sc, GPIO_REG(GPIO_GRER0, gpio), grer);
    719 
    720 	splx(s);
    721 }
    722 
    723 #if NGPIO > 0
    724 /* GPIO support functions */
    725 static int
    726 pxa2x0_gpio_pin_read(void *arg, int pin)
    727 {
    728 	return pxa2x0_gpio_get_bit(pin);
    729 }
    730 
    731 static void
    732 pxa2x0_gpio_pin_write(void *arg, int pin, int value)
    733 {
    734 	if (value == GPIO_PIN_HIGH) {
    735 		pxa2x0_gpio_set_bit(pin);
    736 	} else {
    737 		pxa2x0_gpio_clear_bit(pin);
    738 	}
    739 }
    740 
    741 static void
    742 pxa2x0_gpio_pin_ctl(void *arg, int pin, int flags)
    743 {
    744 	if (flags & GPIO_PIN_OUTPUT) {
    745 		pxa2x0_gpio_set_function(pin, GPIO_OUT);
    746 	} else if (flags & GPIO_PIN_INPUT) {
    747 		pxa2x0_gpio_set_function(pin, GPIO_IN);
    748 	}
    749 }
    750 #endif
    751 
    752 #if defined(CPU_XSCALE_PXA250)
    753 /*
    754  * Configurations of GPIO for PXA25x
    755  */
    756 struct pxa2x0_gpioconf pxa25x_com_btuart_gpioconf[] = {
    757 	{ 42, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* BTRXD */
    758 	{ 43, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* BTTXD */
    759 
    760 #if 0	/* optional */
    761 	{ 44, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* BTCTS */
    762 	{ 45, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* BTRTS */
    763 #endif
    764 
    765 	{ -1 }
    766 };
    767 
    768 struct pxa2x0_gpioconf pxa25x_com_ffuart_gpioconf[] = {
    769 	{ 34, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFRXD */
    770 
    771 #if 0	/* optional */
    772 	{ 35, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* CTS */
    773 	{ 36, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* DCD */
    774 	{ 37, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* DSR */
    775 	{ 38, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* RI */
    776 #endif
    777 
    778 	{ 39, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* FFTXD */
    779 
    780 #if 0	/* optional */
    781 	{ 40, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* DTR */
    782 	{ 41, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* RTS */
    783 #endif
    784 
    785 	{ -1 }
    786 };
    787 
    788 struct pxa2x0_gpioconf pxa25x_com_hwuart_gpioconf[] = {
    789 #if 0	/* We can select and/or. */
    790 	{ 42, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* HWRXD */
    791 	{ 49, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* HWRXD */
    792 
    793 	{ 43, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* HWTXD */
    794 	{ 48, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* HWTXD */
    795 
    796 #if 0	/* optional */
    797 	{ 44, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* HWCST */
    798 	{ 51, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* HWCST */
    799 
    800 	{ 45, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* HWRST */
    801 	{ 52, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* HWRST */
    802 #endif
    803 #endif
    804 
    805 	{ -1 }
    806 };
    807 
    808 struct pxa2x0_gpioconf pxa25x_com_stuart_gpioconf[] = {
    809 	{ 46, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* RXD */
    810 	{ 47, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* TXD */
    811 	{ -1 }
    812 };
    813 
    814 struct pxa2x0_gpioconf pxa25x_i2c_gpioconf[] = {
    815 	{ -1 }
    816 };
    817 
    818 struct pxa2x0_gpioconf pxa25x_i2s_gpioconf[] = {
    819 	{ 28, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* BITCLK */
    820 	{ 29, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* SDATA_IN */
    821 	{ 30, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* SDATA_OUT */
    822 	{ 31, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* SYNC */
    823 	{ 32, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* SYSCLK */
    824 	{ -1 }
    825 };
    826 
    827 struct pxa2x0_gpioconf pxa25x_pcic_gpioconf[] = {
    828 	{ 48, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPOE */
    829 	{ 49, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPWE */
    830 	{ 50, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPIOR */
    831 	{ 51, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPIOW */
    832 
    833 #if 0	/* We can select and/or. */
    834 	{ 52, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPCE1 */
    835 	{ 53, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPCE2 */
    836 #endif
    837 
    838 	{ 54, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* pSKTSEL */
    839 	{ 55, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPREG */
    840 	{ 56, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* nPWAIT */
    841 	{ 57, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* nIOIS16 */
    842 	{ -1 }
    843 };
    844 
    845 struct pxa2x0_gpioconf pxa25x_pxaacu_gpioconf[] = {
    846 	{ 28, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* BITCLK */
    847 	{ 30, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* SDATA_OUT */
    848 	{ 31, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* SYNC */
    849 
    850 #if 0	/* We can select and/or. */
    851 	{ 29, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* SDATA_IN0 */
    852 	{ 32, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* SDATA_IN1 */
    853 #endif
    854 
    855 	{ -1 }
    856 };
    857 
    858 struct pxa2x0_gpioconf pxa25x_pxamci_gpioconf[] = {
    859 #if 0	/* We can select and/or. */
    860 	{  6, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCLK */
    861 	{ 53, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCLK */
    862 	{ 54, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCLK */
    863 
    864 	{  8, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCS0 */
    865 	{ 34, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* MMCCS0 */
    866 	{ 67, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCS0 */
    867 
    868 	{  9, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCS1 */
    869 	{ 39, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCS1 */
    870 	{ 68, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* MMCCS1 */
    871 #endif
    872 
    873 	{  -1 }
    874 };
    875 #endif
    876 
    877 #if defined(CPU_XSCALE_PXA270)
    878 /*
    879  * Configurations of GPIO for PXA27x
    880  */
    881 struct pxa2x0_gpioconf pxa27x_com_btuart_gpioconf[] = {
    882 	{  42, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* BTRXD */
    883 	{  43, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* BTTXD */
    884 
    885 #if 0	/* optional */
    886 	{  44, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* BTCTS */
    887 	{  45, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* BTRTS */
    888 #endif
    889 
    890 	{  -1 }
    891 };
    892 
    893 struct pxa2x0_gpioconf pxa27x_com_ffuart_gpioconf[] = {
    894 #if 0	/* We can select and/or. */
    895 	{  16, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* FFTXD */
    896 	{  37, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* FFTXD */
    897 	{  39, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* FFTXD */
    898 	{  83, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* FFTXD */
    899 	{  99, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* FFTXD */
    900 
    901 	{  19, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* FFRXD */
    902 	{  33, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFRXD */
    903 	{  34, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFRXD */
    904 	{  41, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFRXD */
    905 	{  53, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFRXD */
    906 	{  85, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFRXD */
    907 	{  96, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* FFRXD */
    908 	{ 102, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* FFRXD */
    909 
    910 	{   9, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* FFCTS */
    911 	{  26, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* FFCTS */
    912 	{  35, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFCTS */
    913 	{ 100, GPIO_CLR | GPIO_ALT_FN_3_IN },	/* FFCTS */
    914 
    915 	{  27, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* FFRTS */
    916 	{  41, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* FFRTS */
    917 	{  83, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* FFRTS */
    918 	{  98, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* FFRTS */
    919 
    920 	{  40, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* FFDTR */
    921 	{  82, GPIO_CLR | GPIO_ALT_FN_3_OUT },	/* FFDTR */
    922 
    923 	{  36, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFDCD */
    924 
    925 	{  33, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* FFDSR */
    926 	{  37, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFDSR */
    927 
    928 	{  38, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* FFRI */
    929 #endif
    930 	{  -1 }
    931 };
    932 
    933 struct pxa2x0_gpioconf pxa27x_com_stuart_gpioconf[] = {
    934 	{  46, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* STD_RXD */
    935 	{  47, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* STD_TXD */
    936 	{  -1 }
    937 };
    938 
    939 struct pxa2x0_gpioconf pxa27x_i2c_gpioconf[] = {
    940 	{ 117, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* SCL */
    941 	{ 118, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* SDA */
    942 	{  -1 }
    943 };
    944 
    945 struct pxa2x0_gpioconf pxa27x_i2s_gpioconf[] = {
    946 	{  28, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* I2S_BITCLK */
    947 	{  29, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* I2S_SDATA_IN */
    948 	{  30, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* I2S_SDATA_OUT */
    949 	{  31, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* I2S_SYNC */
    950 	{ 113, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* I2S_SYSCLK */
    951 	{  -1 }
    952 };
    953 
    954 struct pxa2x0_gpioconf pxa27x_ohci_gpioconf[] = {
    955 #if 0	/* We can select and/or. */
    956 	{  88, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* USBHPWR1 */
    957 	{  89, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* USBHPEN1 */
    958 	{ 119, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* USBHPWR2 */
    959 	{ 120, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* USBHPEN2 */
    960 #endif
    961 	{  -1 }
    962 };
    963 
    964 struct pxa2x0_gpioconf pxa27x_pcic_gpioconf[] = {
    965 	{  48, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPOE */
    966 	{  49, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPWE */
    967 	{  50, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPIOR */
    968 	{  51, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPIOW */
    969 	{  55, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPREG */
    970 	{  56, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* nPWAIT */
    971 	{  57, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* nIOIS16 */
    972 
    973 #if 0	/* We can select and/or. */
    974 	{  85, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* nPCE1 */
    975 	{  86, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* nPCE1 */
    976 	{ 102, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* nPCE1 */
    977 
    978 	{  54, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* nPCE2 */
    979 	{  78, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* nPCE2 */
    980 	{ 105, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* nPCE2 */
    981 
    982 	{  79, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* pSKTSEL */
    983 	{ 104, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* pSKTSEL */
    984 #endif
    985 
    986 	{  -1 }
    987 };
    988 
    989 struct pxa2x0_gpioconf pxa27x_pxaacu_gpioconf[] = {
    990 	{  28, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* BITCLK */
    991 	{  30, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* SDATA_OUT */
    992 
    993 #if 0	/* We can select and/or. */
    994 	{  31, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* SYNC */
    995 	{  94, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* SYNC */
    996 
    997 	{  29, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* SDATA_IN0 */
    998 	{ 116, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* SDATA_IN0 */
    999 
   1000 	{  32, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* SDATA_IN1 */
   1001 	{  99, GPIO_CLR | GPIO_ALT_FN_2_IN },	/* SDATA_IN1 */
   1002 
   1003 	{  95, GPIO_CLR | GPIO_ALT_FN_1_OUT },	/* RESET_n */
   1004 	{ 113, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* RESET_n */
   1005 #endif
   1006 
   1007 	{  -1 }
   1008 };
   1009 
   1010 struct pxa2x0_gpioconf pxa27x_pxamci_gpioconf[] = {
   1011 	{  32, GPIO_CLR | GPIO_ALT_FN_2_OUT },	/* MMCLK */
   1012 	{  92, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* MMDAT<0> */
   1013 	{ 109, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* MMDAT<1> */
   1014 	{ 110, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* MMDAT<2>/MMCCS<0> */
   1015 	{ 111, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* MMDAT<3>/MMCCS<1> */
   1016 	{ 112, GPIO_CLR | GPIO_ALT_FN_1_IN },	/* MMCMD */
   1017 
   1018 	{  -1 }
   1019 };
   1020 #endif
   1021 
   1022 void
   1023 pxa2x0_gpio_config(struct pxa2x0_gpioconf **conflist)
   1024 {
   1025 	int i, j;
   1026 
   1027 	for (i = 0; conflist[i] != NULL; i++)
   1028 		for (j = 0; conflist[i][j].pin != -1; j++)
   1029 			pxa2x0_gpio_set_function(conflist[i][j].pin,
   1030 			    conflist[i][j].value);
   1031 }
   1032