Home | History | Annotate | Line # | Download | only in gumstix
gxio.c revision 1.18.18.1
      1  1.18.18.1       tls /*	$NetBSD: gxio.c,v 1.18.18.1 2013/02/25 00:28:36 tls Exp $ */
      2        1.1  kiyohara /*
      3        1.3  kiyohara  * Copyright (C) 2005, 2006, 2007 WIDE Project and SOUM Corporation.
      4        1.1  kiyohara  * All rights reserved.
      5        1.1  kiyohara  *
      6        1.1  kiyohara  * Written by Takashi Kiyohara and Susumu Miki for WIDE Project and SOUM
      7        1.1  kiyohara  * Corporation.
      8        1.1  kiyohara  *
      9        1.1  kiyohara  * Redistribution and use in source and binary forms, with or without
     10        1.1  kiyohara  * modification, are permitted provided that the following conditions
     11        1.1  kiyohara  * are met:
     12        1.1  kiyohara  * 1. Redistributions of source code must retain the above copyright
     13        1.1  kiyohara  *    notice, this list of conditions and the following disclaimer.
     14        1.1  kiyohara  * 2. Redistributions in binary form must reproduce the above copyright
     15        1.1  kiyohara  *    notice, this list of conditions and the following disclaimer in the
     16        1.1  kiyohara  *    documentation and/or other materials provided with the distribution.
     17        1.1  kiyohara  * 3. Neither the name of the project nor the name of SOUM Corporation
     18        1.1  kiyohara  *    may be used to endorse or promote products derived from this software
     19        1.1  kiyohara  *    without specific prior written permission.
     20        1.1  kiyohara  *
     21        1.1  kiyohara  * THIS SOFTWARE IS PROVIDED BY THE PROJECT and SOUM CORPORATION ``AS IS''
     22        1.1  kiyohara  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     23        1.1  kiyohara  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     24        1.1  kiyohara  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT AND SOUM CORPORATION
     25        1.1  kiyohara  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26        1.1  kiyohara  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     27        1.1  kiyohara  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     28        1.1  kiyohara  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     29        1.1  kiyohara  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30        1.1  kiyohara  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     31        1.1  kiyohara  * POSSIBILITY OF SUCH DAMAGE.
     32        1.1  kiyohara  */
     33        1.1  kiyohara #include <sys/cdefs.h>
     34  1.18.18.1       tls __KERNEL_RCSID(0, "$NetBSD: gxio.c,v 1.18.18.1 2013/02/25 00:28:36 tls Exp $");
     35        1.3  kiyohara 
     36       1.15  kiyohara #include "opt_cputypes.h"
     37       1.15  kiyohara #include "opt_gumstix.h"
     38        1.3  kiyohara #include "opt_gxio.h"
     39       1.17  kiyohara #if defined(OVERO)
     40       1.17  kiyohara #include "opt_omap.h"
     41       1.17  kiyohara #endif
     42        1.1  kiyohara 
     43        1.1  kiyohara #include <sys/param.h>
     44        1.1  kiyohara #include <sys/device.h>
     45        1.1  kiyohara #include <sys/errno.h>
     46       1.10  kiyohara #include <sys/kernel.h>
     47        1.1  kiyohara 
     48        1.1  kiyohara #include <sys/systm.h>
     49        1.1  kiyohara 
     50        1.1  kiyohara #include <machine/bootconfig.h>
     51        1.1  kiyohara 
     52  1.18.18.1       tls #if defined(OVERO)
     53       1.16  kiyohara #include <arm/omap/omap2_gpmcreg.h>
     54       1.15  kiyohara #include <arm/omap/omap2_reg.h>
     55       1.17  kiyohara #if defined(OMAP3530)
     56       1.16  kiyohara #include <arm/omap/omap2_intr.h>
     57       1.17  kiyohara #endif
     58       1.15  kiyohara #include <arm/omap/omap_var.h>
     59  1.18.18.1       tls #endif
     60       1.15  kiyohara #if defined(CPU_XSCALE_PXA270) || defined(CPU_XSCALE_PXA250)
     61        1.1  kiyohara #include <arm/xscale/pxa2x0cpu.h>
     62       1.15  kiyohara #endif
     63        1.1  kiyohara #include <arm/xscale/pxa2x0reg.h>
     64        1.1  kiyohara #include <arm/xscale/pxa2x0var.h>
     65        1.1  kiyohara #include <arm/xscale/pxa2x0_gpio.h>
     66       1.16  kiyohara #include <evbarm/gumstix/gumstixreg.h>
     67        1.1  kiyohara #include <evbarm/gumstix/gumstixvar.h>
     68        1.1  kiyohara 
     69       1.16  kiyohara #include "ioconf.h"
     70        1.1  kiyohara #include "locators.h"
     71        1.1  kiyohara 
     72        1.1  kiyohara 
     73        1.3  kiyohara struct gxioconf {
     74        1.3  kiyohara 	const char *name;
     75        1.4  kiyohara 	void (*config)(void);
     76        1.3  kiyohara };
     77        1.3  kiyohara 
     78       1.16  kiyohara #if defined(GUMSTIX)
     79       1.10  kiyohara static int gxiomatch(device_t, cfdata_t, void *);
     80        1.8  kiyohara static void gxioattach(device_t, device_t, void *);
     81       1.10  kiyohara static int gxiosearch(device_t, cfdata_t, const int *, void *);
     82        1.1  kiyohara static int gxioprint(void *, const char *);
     83       1.16  kiyohara 
     84       1.16  kiyohara CFATTACH_DECL_NEW(gxio, sizeof(struct gxio_softc),
     85       1.16  kiyohara     gxiomatch, gxioattach, NULL, NULL);
     86       1.15  kiyohara #endif
     87        1.1  kiyohara 
     88        1.3  kiyohara void gxio_config_pin(void);
     89        1.6  kiyohara void gxio_config_expansion(char *);
     90        1.4  kiyohara static void gxio_config_gpio(const struct gxioconf *, char *);
     91       1.16  kiyohara #if defined(GUMSTIX)
     92        1.6  kiyohara static void basix_config(void);
     93        1.4  kiyohara static void cfstix_config(void);
     94        1.4  kiyohara static void etherstix_config(void);
     95        1.4  kiyohara static void netcf_config(void);
     96       1.14  kiyohara static void netcf_vx_config(void);
     97        1.4  kiyohara static void netduommc_config(void);
     98        1.4  kiyohara static void netduo_config(void);
     99       1.10  kiyohara static void netmicrosd_config(void);
    100       1.10  kiyohara static void netwifimicrosd_config(void);
    101        1.4  kiyohara static void netmmc_config(void);
    102       1.10  kiyohara static void wifistix_config(void);
    103        1.4  kiyohara static void wifistix_cf_config(void);
    104       1.16  kiyohara #elif defined(OVERO)
    105       1.16  kiyohara static void eth0_config(void);
    106       1.16  kiyohara static void eth1_config(void);
    107       1.16  kiyohara static void chestnut_config(void);
    108       1.16  kiyohara static void tobi_config(void);
    109       1.16  kiyohara static void tobiduo_config(void);
    110       1.15  kiyohara #endif
    111        1.1  kiyohara 
    112       1.10  kiyohara #if defined(CPU_XSCALE_PXA250)
    113       1.10  kiyohara static struct pxa2x0_gpioconf pxa255dep_gpioconf[] = {
    114        1.3  kiyohara 	/* Bluetooth module configuration */
    115        1.3  kiyohara 	{  7, GPIO_OUT | GPIO_SET },	/* power on */
    116        1.3  kiyohara 	{ 12, GPIO_ALT_FN_1_OUT },	/* 32kHz out. required by SingleStone */
    117        1.3  kiyohara 
    118        1.3  kiyohara 	/* AC97 configuration */
    119       1.10  kiyohara 	{ 29, GPIO_ALT_FN_1_IN },	/* SDATA_IN0 */
    120       1.10  kiyohara 
    121       1.10  kiyohara 	/* FFUART configuration */
    122       1.10  kiyohara 	{ 35, GPIO_ALT_FN_1_IN },	/* CTS */
    123       1.10  kiyohara 	{ 41, GPIO_ALT_FN_2_OUT },	/* RTS */
    124        1.3  kiyohara 
    125        1.3  kiyohara #ifndef GXIO_BLUETOOTH_ON_HWUART
    126        1.3  kiyohara 	/* BTUART configuration */
    127       1.10  kiyohara 	{ 44, GPIO_ALT_FN_1_IN },	/* BTCTS */
    128       1.10  kiyohara 	{ 45, GPIO_ALT_FN_2_OUT },	/* BTRTS */
    129        1.3  kiyohara #else
    130        1.3  kiyohara 	/* HWUART configuration */
    131        1.3  kiyohara 	{ 42, GPIO_ALT_FN_3_IN },	/* HWRXD */
    132        1.3  kiyohara 	{ 43, GPIO_ALT_FN_3_OUT },	/* HWTXD */
    133       1.10  kiyohara 	{ 44, GPIO_ALT_FN_3_IN },	/* HWCTS */
    134       1.10  kiyohara 	{ 45, GPIO_ALT_FN_3_OUT },	/* HWRTS */
    135        1.3  kiyohara #endif
    136        1.3  kiyohara 
    137        1.3  kiyohara #ifndef GXIO_BLUETOOTH_ON_HWUART
    138        1.3  kiyohara 	/* HWUART configuration */
    139        1.3  kiyohara 	{ 48, GPIO_ALT_FN_1_OUT },	/* HWTXD */
    140        1.3  kiyohara 	{ 49, GPIO_ALT_FN_1_IN },	/* HWRXD */
    141        1.3  kiyohara 	{ 50, GPIO_ALT_FN_1_IN },	/* HWCTS */
    142        1.3  kiyohara 	{ 51, GPIO_ALT_FN_1_OUT },	/* HWRTS */
    143        1.3  kiyohara #endif
    144        1.3  kiyohara 
    145        1.3  kiyohara 	{ -1 }
    146        1.1  kiyohara };
    147       1.10  kiyohara #endif
    148       1.10  kiyohara #if defined(CPU_XSCALE_PXA270)
    149       1.10  kiyohara static struct pxa2x0_gpioconf verdexdep_gpioconf[] = {
    150       1.10  kiyohara 	/* Bluetooth module configuration */
    151       1.10  kiyohara 	{   9, GPIO_ALT_FN_3_OUT },	/* CHOUT<0> */
    152       1.13  kiyohara 	{  12, GPIO_OUT | GPIO_SET },
    153       1.10  kiyohara 
    154       1.12  kiyohara 	/* LCD configuration */
    155       1.12  kiyohara 	{  17, GPIO_IN },		/* backlight on */
    156       1.12  kiyohara 
    157       1.10  kiyohara 	/* FFUART configuration */
    158       1.10  kiyohara 	{  34, GPIO_ALT_FN_1_IN },	/* FFRXD */
    159       1.10  kiyohara 	{  39, GPIO_ALT_FN_2_OUT },	/* FFTXD */
    160       1.10  kiyohara 
    161       1.10  kiyohara 	/* BTUART configuration */
    162       1.10  kiyohara 	{  42, GPIO_ALT_FN_1_IN },	/* BTRXD */
    163       1.10  kiyohara 	{  43, GPIO_ALT_FN_2_OUT },	/* BTTXD */
    164       1.10  kiyohara 	{  44, GPIO_ALT_FN_1_IN },	/* BTCTS */
    165       1.10  kiyohara 	{  45, GPIO_ALT_FN_2_OUT },	/* BTRTS */
    166       1.10  kiyohara 
    167       1.10  kiyohara 	/* AC97 configuration */
    168       1.10  kiyohara 	{  29, GPIO_ALT_FN_1_IN },	/* SDATA_IN0 */
    169       1.10  kiyohara 
    170       1.10  kiyohara 	{ -1 }
    171       1.10  kiyohara };
    172       1.10  kiyohara #endif
    173        1.1  kiyohara 
    174        1.1  kiyohara static const struct gxioconf busheader_conf[] = {
    175       1.16  kiyohara #if defined(GUMSTIX)
    176        1.6  kiyohara 	{ "basix",		basix_config },
    177        1.1  kiyohara 	{ "cfstix",		cfstix_config },
    178        1.1  kiyohara 	{ "etherstix",		etherstix_config },
    179        1.1  kiyohara 	{ "netcf",		netcf_config },
    180       1.14  kiyohara 	{ "netcf-vx",		netcf_vx_config },
    181        1.3  kiyohara 	{ "netduo-mmc",		netduommc_config },
    182        1.1  kiyohara 	{ "netduo",		netduo_config },
    183       1.10  kiyohara 	{ "netmicrosd",		netmicrosd_config },
    184       1.10  kiyohara 	{ "netmicrosd-vx",	netmicrosd_config },
    185       1.10  kiyohara 	{ "netwifimicrosd",	netwifimicrosd_config },
    186        1.1  kiyohara 	{ "netmmc",		netmmc_config },
    187       1.10  kiyohara 	{ "netpro-vx",		netwifimicrosd_config },
    188        1.4  kiyohara 	{ "wifistix-cf",	wifistix_cf_config },
    189       1.10  kiyohara 	{ "wifistix",		wifistix_config },
    190       1.16  kiyohara #elif defined(OVERO)
    191       1.16  kiyohara 	{ "chestnut43",		chestnut_config },
    192       1.16  kiyohara 	{ "tobi",		tobi_config },
    193       1.16  kiyohara 	{ "tobi-duo",		tobiduo_config },
    194       1.15  kiyohara #endif
    195        1.1  kiyohara 	{ NULL }
    196        1.1  kiyohara };
    197        1.1  kiyohara 
    198       1.10  kiyohara int gxpcic_gpio_reset;
    199       1.10  kiyohara struct gxpcic_slot_irqs gxpcic_slot_irqs[2] = { { 0, -1, -1 }, { 0, -1, -1 } };
    200       1.10  kiyohara 
    201        1.1  kiyohara 
    202       1.16  kiyohara #if defined(GUMSTIX)
    203        1.1  kiyohara /* ARGSUSED */
    204        1.1  kiyohara static int
    205       1.10  kiyohara gxiomatch(device_t parent, cfdata_t match, void *aux)
    206        1.1  kiyohara {
    207       1.16  kiyohara 
    208       1.10  kiyohara 	struct pxaip_attach_args *pxa = aux;
    209        1.1  kiyohara 	bus_space_tag_t iot = &pxa2x0_bs_tag;
    210        1.1  kiyohara 	bus_space_handle_t ioh;
    211        1.1  kiyohara 
    212       1.10  kiyohara 	if (strcmp(pxa->pxa_name, match->cf_name) != 0 ||
    213       1.10  kiyohara 	    pxa->pxa_addr != PXAIPCF_ADDR_DEFAULT)
    214       1.10  kiyohara 		 return 0;
    215       1.10  kiyohara 
    216        1.1  kiyohara 	if (bus_space_map(iot,
    217        1.1  kiyohara 	    PXA2X0_MEMCTL_BASE, PXA2X0_MEMCTL_SIZE, 0, &ioh))
    218       1.16  kiyohara 		return 0;
    219        1.1  kiyohara 	bus_space_unmap(iot, ioh, PXA2X0_MEMCTL_SIZE);
    220        1.1  kiyohara 
    221        1.1  kiyohara 	/* nothing */
    222       1.16  kiyohara 	return 1;
    223        1.1  kiyohara }
    224        1.1  kiyohara 
    225        1.1  kiyohara /* ARGSUSED */
    226        1.1  kiyohara static void
    227        1.8  kiyohara gxioattach(device_t parent, device_t self, void *aux)
    228        1.1  kiyohara {
    229        1.3  kiyohara 	struct gxio_softc *sc = device_private(self);
    230        1.1  kiyohara 
    231        1.3  kiyohara 	aprint_normal("\n");
    232        1.3  kiyohara 	aprint_naive("\n");
    233        1.1  kiyohara 
    234        1.8  kiyohara 	sc->sc_dev = self;
    235        1.1  kiyohara 	sc->sc_iot = &pxa2x0_bs_tag;
    236        1.1  kiyohara 
    237        1.1  kiyohara 	if (bus_space_map(sc->sc_iot,
    238        1.1  kiyohara 	    PXA2X0_MEMCTL_BASE, PXA2X0_MEMCTL_SIZE, 0, &sc->sc_ioh))
    239        1.1  kiyohara 		return;
    240        1.1  kiyohara 
    241        1.1  kiyohara 	/*
    242       1.16  kiyohara 	 *  Attach each gumstix(busheader)/overo expansion board devices.
    243        1.1  kiyohara 	 */
    244        1.1  kiyohara 	config_search_ia(gxiosearch, self, "gxio", NULL);
    245        1.1  kiyohara }
    246        1.1  kiyohara 
    247        1.1  kiyohara /* ARGSUSED */
    248        1.1  kiyohara static int
    249       1.10  kiyohara gxiosearch(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
    250        1.1  kiyohara {
    251        1.3  kiyohara 	struct gxio_softc *sc = device_private(parent);
    252        1.1  kiyohara 	struct gxio_attach_args gxa;
    253        1.1  kiyohara 
    254        1.1  kiyohara 	gxa.gxa_sc = sc;
    255        1.1  kiyohara 	gxa.gxa_iot = sc->sc_iot;
    256        1.1  kiyohara 	gxa.gxa_addr = cf->cf_loc[GXIOCF_ADDR];
    257        1.1  kiyohara 	gxa.gxa_gpirq = cf->cf_loc[GXIOCF_GPIRQ];
    258        1.1  kiyohara 
    259        1.1  kiyohara 	if (config_match(parent, cf, &gxa))
    260        1.1  kiyohara 		config_attach(parent, cf, &gxa, gxioprint);
    261        1.1  kiyohara 
    262       1.16  kiyohara 	return 0;
    263        1.1  kiyohara }
    264        1.1  kiyohara 
    265        1.1  kiyohara /* ARGSUSED */
    266        1.1  kiyohara static int
    267        1.1  kiyohara gxioprint(void *aux, const char *name)
    268        1.1  kiyohara {
    269        1.1  kiyohara 	struct gxio_attach_args *gxa = (struct gxio_attach_args *)aux;
    270        1.1  kiyohara 
    271        1.1  kiyohara 	if (gxa->gxa_addr != GXIOCF_ADDR_DEFAULT)
    272        1.1  kiyohara 		printf(" addr 0x%lx", gxa->gxa_addr);
    273        1.1  kiyohara 	if (gxa->gxa_gpirq > 0)
    274        1.1  kiyohara 		printf(" gpirq %d", gxa->gxa_gpirq);
    275       1.16  kiyohara 	return UNCONF;
    276        1.1  kiyohara }
    277       1.15  kiyohara #endif
    278        1.1  kiyohara 
    279        1.1  kiyohara 
    280        1.1  kiyohara /*
    281        1.3  kiyohara  * configure for GPIO pin and expansion boards.
    282        1.1  kiyohara  */
    283        1.1  kiyohara void
    284        1.9    cegger gxio_config_pin(void)
    285        1.3  kiyohara {
    286       1.10  kiyohara #if defined(CPU_XSCALE_PXA250)
    287        1.5  kiyohara 	struct pxa2x0_gpioconf *gumstix_gpioconf[] = {
    288        1.5  kiyohara 		pxa25x_com_ffuart_gpioconf,
    289        1.5  kiyohara 		pxa25x_com_stuart_gpioconf,
    290        1.5  kiyohara #ifndef GXIO_BLUETOOTH_ON_HWUART
    291        1.5  kiyohara 		pxa25x_com_btuart_gpioconf,
    292        1.5  kiyohara #endif
    293        1.5  kiyohara 		pxa25x_com_hwuart_gpioconf,
    294        1.5  kiyohara 		pxa25x_i2c_gpioconf,
    295        1.5  kiyohara 		pxa25x_pxaacu_gpioconf,
    296       1.10  kiyohara 		pxa255dep_gpioconf,
    297       1.10  kiyohara 		NULL
    298       1.10  kiyohara 	};
    299       1.10  kiyohara #endif
    300       1.10  kiyohara #if defined(CPU_XSCALE_PXA270)
    301       1.10  kiyohara 	struct pxa2x0_gpioconf *verdex_gpioconf[] = {
    302       1.10  kiyohara 		pxa27x_com_ffuart_gpioconf,
    303       1.10  kiyohara 		pxa27x_com_stuart_gpioconf,
    304       1.10  kiyohara 		pxa27x_com_btuart_gpioconf,
    305       1.10  kiyohara 		pxa27x_i2c_gpioconf,
    306       1.10  kiyohara 		pxa27x_pxaacu_gpioconf,
    307       1.10  kiyohara 		pxa27x_pxamci_gpioconf,
    308       1.10  kiyohara 		pxa27x_ohci_gpioconf,
    309       1.10  kiyohara 		verdexdep_gpioconf,
    310        1.5  kiyohara 		NULL
    311        1.5  kiyohara 	};
    312       1.10  kiyohara #endif
    313        1.3  kiyohara 
    314        1.3  kiyohara 	/* XXX: turn off for power of bluetooth module */
    315       1.13  kiyohara #if defined(CPU_XSCALE_PXA250)
    316        1.3  kiyohara 	pxa2x0_gpio_set_function(7, GPIO_OUT | GPIO_CLR);
    317       1.13  kiyohara #elif defined(CPU_XSCALE_PXA270)
    318       1.13  kiyohara 	pxa2x0_gpio_set_function(12, GPIO_OUT | GPIO_CLR);
    319       1.13  kiyohara #endif
    320        1.3  kiyohara 	delay(100);
    321        1.3  kiyohara 
    322       1.10  kiyohara #if defined(CPU_XSCALE_PXA270) && defined(CPU_XSCALE_PXA250)
    323       1.10  kiyohara 	pxa2x0_gpio_config(
    324       1.10  kiyohara 	    (CPU_IS_PXA250) ? gumstix_gpioconf : verdex_gpioconf);
    325       1.15  kiyohara #elif defined(CPU_XSCALE_PXA270) || defined(CPU_XSCALE_PXA250)
    326       1.10  kiyohara #if defined(CPU_XSCALE_PXA270)
    327       1.10  kiyohara 	pxa2x0_gpio_config(verdex_gpioconf);
    328       1.10  kiyohara #else
    329        1.5  kiyohara 	pxa2x0_gpio_config(gumstix_gpioconf);
    330       1.10  kiyohara #endif
    331       1.10  kiyohara #endif
    332        1.3  kiyohara }
    333        1.3  kiyohara 
    334        1.4  kiyohara void
    335        1.6  kiyohara gxio_config_expansion(char *expansion)
    336        1.4  kiyohara {
    337        1.4  kiyohara 
    338        1.6  kiyohara 	if (expansion == NULL) {
    339       1.16  kiyohara 		printf("not specified 'expansion=' in the boot args.\n");
    340       1.10  kiyohara #ifdef GXIO_DEFAULT_EXPANSION
    341        1.6  kiyohara 		printf("configure default expansion (%s)\n",
    342        1.6  kiyohara 		    GXIO_DEFAULT_EXPANSION);
    343       1.11  kiyohara 		expansion = __UNCONST(GXIO_DEFAULT_EXPANSION);
    344       1.10  kiyohara #else
    345       1.10  kiyohara 		return;
    346        1.6  kiyohara #endif
    347        1.6  kiyohara 	}
    348        1.4  kiyohara 	gxio_config_gpio(busheader_conf, expansion);
    349        1.4  kiyohara }
    350        1.4  kiyohara 
    351        1.3  kiyohara static void
    352        1.4  kiyohara gxio_config_gpio(const struct gxioconf *gxioconflist, char *expansion)
    353        1.1  kiyohara {
    354        1.1  kiyohara 	int i, rv;
    355        1.1  kiyohara 
    356        1.3  kiyohara 	for (i = 0; i < strlen(expansion); i++)
    357        1.3  kiyohara 		expansion[i] = tolower(expansion[i]);
    358        1.3  kiyohara 	for (i = 0; gxioconflist[i].name != NULL; i++) {
    359        1.3  kiyohara 		rv = strncmp(expansion, gxioconflist[i].name,
    360        1.3  kiyohara 		    strlen(gxioconflist[i].name) + 1);
    361        1.1  kiyohara 		if (rv == 0) {
    362        1.4  kiyohara 			gxioconflist[i].config();
    363        1.1  kiyohara 			break;
    364        1.1  kiyohara 		}
    365        1.1  kiyohara 	}
    366        1.3  kiyohara }
    367        1.1  kiyohara 
    368        1.1  kiyohara 
    369       1.16  kiyohara #if defined(GUMSTIX)
    370       1.16  kiyohara 
    371        1.1  kiyohara static void
    372        1.9    cegger basix_config(void)
    373        1.6  kiyohara {
    374        1.6  kiyohara 
    375        1.6  kiyohara 	pxa2x0_gpio_set_function(8, GPIO_ALT_FN_1_OUT);		/* MMCCS0 */
    376        1.6  kiyohara 	pxa2x0_gpio_set_function(53, GPIO_ALT_FN_1_OUT);	/* MMCCLK */
    377        1.6  kiyohara #if 0
    378        1.6  kiyohara 	/* this configuration set by gxmci.c::pxamci_attach() */
    379        1.6  kiyohara 	pxa2x0_gpio_set_function(11, GPIO_IN);			/* nSD_DETECT */
    380        1.6  kiyohara 	pxa2x0_gpio_set_function(22, GPIO_IN);			/* nSD_WP */
    381        1.6  kiyohara #endif
    382        1.6  kiyohara }
    383        1.6  kiyohara 
    384        1.6  kiyohara static void
    385        1.9    cegger cfstix_config(void)
    386        1.1  kiyohara {
    387        1.1  kiyohara 	u_int gpio, npoe_fn;
    388       1.10  kiyohara #if defined(CPU_XSCALE_PXA270) && defined(CPU_XSCALE_PXA250)
    389       1.10  kiyohara 	int bvd = (CPU_IS_PXA250) ? 4 : 111;
    390       1.10  kiyohara #else
    391       1.10  kiyohara #if defined(CPU_XSCALE_PXA270)
    392       1.10  kiyohara 	const int bvd = 111;
    393       1.10  kiyohara #else
    394       1.10  kiyohara 	const int bvd = 4;
    395       1.10  kiyohara #endif
    396       1.10  kiyohara #endif
    397       1.10  kiyohara 
    398       1.10  kiyohara 	if (CPU_IS_PXA250) {
    399       1.10  kiyohara 		gxpcic_slot_irqs[0].valid = 1;
    400       1.10  kiyohara 		gxpcic_slot_irqs[0].cd = 11;
    401       1.10  kiyohara 		gxpcic_slot_irqs[0].prdy = 26;
    402       1.10  kiyohara 		gxpcic_gpio_reset = 8;
    403       1.10  kiyohara 	} else {
    404       1.10  kiyohara 		gxpcic_slot_irqs[0].valid = 1;
    405       1.10  kiyohara 		gxpcic_slot_irqs[0].cd = 104;
    406       1.10  kiyohara 		gxpcic_slot_irqs[0].prdy = 96;
    407       1.10  kiyohara 		gxpcic_gpio_reset = 97;
    408       1.10  kiyohara 	}
    409        1.1  kiyohara 
    410        1.4  kiyohara #if 1
    411       1.10  kiyohara 	/* PCD/PRDY set by pxa2x0_pcic.c::pxapcic_attach_common() */
    412        1.4  kiyohara #else
    413        1.4  kiyohara 	pxa2x0_gpio_set_function(11, GPIO_IN);		/* PCD1 */
    414        1.4  kiyohara 	pxa2x0_gpio_set_function(26, GPIO_IN);		/* PRDY1/~IRQ1 */
    415        1.4  kiyohara #endif
    416       1.10  kiyohara 	pxa2x0_gpio_set_function(bvd, GPIO_IN); 	/* BVD1/~STSCHG1 */
    417        1.1  kiyohara 
    418        1.1  kiyohara 	for (gpio = 48, npoe_fn = 0; gpio <= 53 ; gpio++)
    419        1.1  kiyohara 		npoe_fn |= pxa2x0_gpio_get_function(gpio);
    420        1.1  kiyohara 	npoe_fn &= GPIO_SET;
    421        1.1  kiyohara 
    422        1.1  kiyohara 	pxa2x0_gpio_set_function(48, GPIO_ALT_FN_2_OUT | npoe_fn); /* nPOE */
    423        1.1  kiyohara 	pxa2x0_gpio_set_function(49, GPIO_ALT_FN_2_OUT);	/* nPWE */
    424        1.1  kiyohara 	pxa2x0_gpio_set_function(50, GPIO_ALT_FN_2_OUT);	/* nPIOR */
    425        1.1  kiyohara 	pxa2x0_gpio_set_function(51, GPIO_ALT_FN_2_OUT);	/* nPIOW */
    426       1.10  kiyohara 	if (CPU_IS_PXA250) {
    427       1.10  kiyohara 		pxa2x0_gpio_set_function(52, GPIO_ALT_FN_2_OUT); /* nPCE1 */
    428       1.10  kiyohara 		pxa2x0_gpio_set_function(53, GPIO_ALT_FN_2_OUT); /* nPCE2 */
    429       1.10  kiyohara 		pxa2x0_gpio_set_function(54, GPIO_ALT_FN_2_OUT); /* pSKTSEL */
    430       1.10  kiyohara 	} else {
    431       1.10  kiyohara 		pxa2x0_gpio_set_function(102, GPIO_ALT_FN_1_OUT); /* nPCE1 */
    432       1.10  kiyohara 		pxa2x0_gpio_set_function(105, GPIO_ALT_FN_1_OUT); /* nPCE2 */
    433       1.10  kiyohara 		pxa2x0_gpio_set_function(79, GPIO_ALT_FN_1_OUT);  /* pSKTSEL */
    434       1.10  kiyohara 	}
    435        1.1  kiyohara 	pxa2x0_gpio_set_function(55, GPIO_ALT_FN_2_OUT);	/* nPREG */
    436        1.1  kiyohara 	pxa2x0_gpio_set_function(56, GPIO_ALT_FN_1_IN);		/* nPWAIT */
    437        1.1  kiyohara 	pxa2x0_gpio_set_function(57, GPIO_ALT_FN_1_IN);		/* nIOIS16 */
    438        1.1  kiyohara }
    439        1.1  kiyohara 
    440        1.1  kiyohara static void
    441        1.9    cegger etherstix_config(void)
    442        1.1  kiyohara {
    443       1.10  kiyohara 	extern struct cfdata cfdata[];
    444       1.10  kiyohara #if defined(CPU_XSCALE_PXA270) && defined(CPU_XSCALE_PXA250)
    445       1.10  kiyohara 	int rst = (CPU_IS_PXA250) ? 80 : 32;
    446       1.10  kiyohara 	int irq = (CPU_IS_PXA250) ? 36 : 99;
    447       1.10  kiyohara #else
    448       1.10  kiyohara #if defined(CPU_XSCALE_PXA270)
    449       1.10  kiyohara 	const int rst = 32, irq = 99;
    450       1.10  kiyohara #else
    451       1.10  kiyohara 	const int rst = 80, irq = 36;
    452       1.10  kiyohara #endif
    453       1.10  kiyohara #endif
    454       1.10  kiyohara 	int i;
    455        1.1  kiyohara 
    456        1.1  kiyohara 	pxa2x0_gpio_set_function(49, GPIO_ALT_FN_2_OUT);	/* nPWE */
    457        1.1  kiyohara 	pxa2x0_gpio_set_function(15, GPIO_ALT_FN_2_OUT);	/* nCS 1 */
    458       1.10  kiyohara 	pxa2x0_gpio_set_function(rst, GPIO_OUT | GPIO_SET);	/* RESET 1 */
    459        1.1  kiyohara 	delay(1);
    460       1.10  kiyohara 	pxa2x0_gpio_set_function(rst, GPIO_OUT | GPIO_CLR);
    461        1.1  kiyohara 	delay(50000);
    462       1.10  kiyohara 
    463       1.10  kiyohara 	for (i = 0; cfdata[i].cf_name != NULL; i++)
    464       1.10  kiyohara 		if (strcmp(cfdata[i].cf_name, "sm") == 0 &&
    465       1.10  kiyohara 		    strcmp(cfdata[i].cf_atname, "sm_gxio") == 0 &&
    466       1.10  kiyohara 		    cfdata[i].cf_loc[GXIOCF_ADDR] == 0x04000300 &&
    467       1.10  kiyohara 		    cfdata[i].cf_loc[GXIOCF_GPIRQ] == GXIOCF_GPIRQ_DEFAULT)
    468       1.10  kiyohara 			cfdata[i].cf_loc[GXIOCF_GPIRQ] = irq;
    469        1.1  kiyohara }
    470        1.1  kiyohara 
    471        1.1  kiyohara static void
    472        1.9    cegger netcf_config(void)
    473        1.1  kiyohara {
    474        1.1  kiyohara 
    475        1.4  kiyohara 	etherstix_config();
    476        1.4  kiyohara 	cfstix_config();
    477       1.14  kiyohara }
    478       1.14  kiyohara 
    479       1.14  kiyohara static void
    480       1.14  kiyohara netcf_vx_config(void)
    481       1.14  kiyohara {
    482       1.14  kiyohara 
    483       1.14  kiyohara 	/*
    484       1.14  kiyohara 	 * XXXX: More power is necessary for NIC and USB???
    485       1.14  kiyohara 	 * (no document.  from Linux)
    486       1.14  kiyohara 	 */
    487       1.14  kiyohara 
    488       1.14  kiyohara 	pxa2x0_gpio_set_function(27, GPIO_IN);
    489       1.14  kiyohara 	pxa2x0_gpio_set_function(107, GPIO_OUT | GPIO_CLR);
    490       1.14  kiyohara 	pxa2x0_gpio_set_function(118, GPIO_ALT_FN_1_IN | GPIO_CLR);
    491       1.14  kiyohara 
    492       1.14  kiyohara 	etherstix_config();
    493       1.14  kiyohara 	cfstix_config();
    494       1.10  kiyohara 	if (CPU_IS_PXA270) {
    495       1.10  kiyohara 		/* Overwrite */
    496       1.10  kiyohara 		gxpcic_slot_irqs[0].cd = 104;
    497       1.10  kiyohara 		gxpcic_slot_irqs[0].prdy = 109;
    498       1.10  kiyohara 		gxpcic_gpio_reset = 110;
    499       1.10  kiyohara 	};
    500        1.1  kiyohara }
    501        1.1  kiyohara 
    502        1.1  kiyohara static void
    503        1.9    cegger netduommc_config(void)
    504        1.3  kiyohara {
    505        1.3  kiyohara 
    506        1.4  kiyohara 	netduo_config();
    507        1.6  kiyohara 	basix_config();
    508        1.3  kiyohara }
    509        1.3  kiyohara 
    510        1.3  kiyohara static void
    511        1.9    cegger netduo_config(void)
    512        1.1  kiyohara {
    513        1.1  kiyohara 
    514        1.4  kiyohara 	etherstix_config();
    515        1.1  kiyohara 
    516        1.1  kiyohara 	pxa2x0_gpio_set_function(78, GPIO_ALT_FN_2_OUT);	/* nCS 2 */
    517        1.1  kiyohara 	pxa2x0_gpio_set_function(52, GPIO_OUT | GPIO_SET);	/* RESET 2 */
    518        1.1  kiyohara 	delay(1);
    519        1.1  kiyohara 	pxa2x0_gpio_set_function(52, GPIO_OUT | GPIO_CLR);
    520        1.1  kiyohara 	delay(50000);
    521        1.1  kiyohara }
    522        1.1  kiyohara 
    523        1.1  kiyohara static void
    524       1.10  kiyohara netmicrosd_config(void)
    525       1.10  kiyohara {
    526       1.10  kiyohara 
    527       1.10  kiyohara 	/* MicroSD(mci) always configure on PXA270 */
    528       1.10  kiyohara 
    529       1.10  kiyohara 	pxa2x0_gpio_set_function(49, GPIO_ALT_FN_2_OUT);	/* nPWE */
    530       1.10  kiyohara 	pxa2x0_gpio_set_function(15, GPIO_ALT_FN_2_OUT);	/* nCS 1 */
    531       1.10  kiyohara 	pxa2x0_gpio_set_function(107, GPIO_OUT | GPIO_CLR);	/* RESET 1 */
    532       1.10  kiyohara 	delay(hz / 2);
    533       1.10  kiyohara 	pxa2x0_gpio_set_function(107, GPIO_OUT | GPIO_SET);
    534       1.10  kiyohara 	delay(50000);
    535       1.10  kiyohara }
    536       1.10  kiyohara 
    537       1.10  kiyohara static void
    538       1.10  kiyohara netwifimicrosd_config(void)
    539       1.10  kiyohara {
    540       1.10  kiyohara 
    541       1.10  kiyohara 	netmicrosd_config();
    542       1.10  kiyohara 
    543       1.10  kiyohara 	cfstix_config();
    544       1.10  kiyohara 	/* However use pxamci. */
    545       1.10  kiyohara 	pxa2x0_gpio_set_function(111, GPIO_CLR | GPIO_ALT_FN_1_IN);
    546       1.12  kiyohara 	/* Power to Marvell 88W8385 */
    547       1.10  kiyohara 	pxa2x0_gpio_set_function(80, GPIO_OUT | GPIO_SET);
    548       1.10  kiyohara }
    549       1.10  kiyohara 
    550       1.10  kiyohara static void
    551        1.9    cegger netmmc_config(void)
    552        1.1  kiyohara {
    553        1.1  kiyohara 
    554        1.4  kiyohara 	etherstix_config();
    555        1.6  kiyohara 	basix_config();
    556        1.1  kiyohara }
    557        1.4  kiyohara 
    558        1.4  kiyohara static void
    559       1.10  kiyohara wifistix_config(void)
    560       1.10  kiyohara {
    561       1.10  kiyohara 
    562       1.10  kiyohara 	cfstix_config();
    563       1.10  kiyohara 
    564       1.12  kiyohara 	/* Power to Marvell 88W8385 */
    565       1.10  kiyohara 	pxa2x0_gpio_set_function(80, GPIO_OUT | GPIO_SET);
    566       1.10  kiyohara }
    567       1.10  kiyohara 
    568       1.10  kiyohara static void
    569        1.9    cegger wifistix_cf_config(void)
    570        1.4  kiyohara {
    571        1.4  kiyohara 
    572       1.10  kiyohara 	gxpcic_slot_irqs[1].valid = 1;
    573       1.10  kiyohara 	gxpcic_slot_irqs[1].cd = 36;
    574       1.10  kiyohara 	gxpcic_slot_irqs[1].prdy = 27;
    575       1.10  kiyohara 
    576        1.4  kiyohara #if 1
    577        1.6  kiyohara 	/* this configuration set by pxa2x0_pcic.c::pxapcic_attach_common() */
    578        1.4  kiyohara #else
    579        1.4  kiyohara 	pxa2x0_gpio_set_function(36, GPIO_IN);		/* PCD2 */
    580        1.4  kiyohara 	pxa2x0_gpio_set_function(27, GPIO_IN);		/* PRDY2/~IRQ2 */
    581        1.4  kiyohara #endif
    582        1.4  kiyohara 	pxa2x0_gpio_set_function(18, GPIO_IN); 		/* BVD2/~STSCHG2 */
    583        1.4  kiyohara 
    584        1.4  kiyohara 	cfstix_config();
    585       1.10  kiyohara 
    586       1.12  kiyohara 	/* Power to Marvell 88W8385 */
    587       1.10  kiyohara 	pxa2x0_gpio_set_function(80, GPIO_OUT | GPIO_SET);
    588        1.4  kiyohara }
    589       1.16  kiyohara 
    590       1.16  kiyohara #elif defined(OVERO)
    591       1.16  kiyohara 
    592       1.16  kiyohara static void
    593       1.16  kiyohara eth0_config(void)
    594       1.16  kiyohara {
    595       1.16  kiyohara 	extern struct cfdata cfdata[];
    596       1.16  kiyohara 	cfdata_t cf = &cfdata[0];
    597       1.16  kiyohara 
    598       1.16  kiyohara 	/*
    599       1.16  kiyohara 	 * ETH0 connects via CS5.  It use GPIO 176 for IRQ.
    600  1.18.18.1       tls 	 * Also GPIO 64 is NRESET.
    601  1.18.18.1       tls 	 *
    602  1.18.18.1       tls 	 * Basically use current settings by U-Boot.
    603  1.18.18.1       tls 	 * However remap physical address to configured address.
    604       1.16  kiyohara 	 */
    605       1.16  kiyohara 
    606       1.16  kiyohara 	while (cf->cf_name != NULL) {
    607       1.16  kiyohara 		if (strcmp(cf->cf_name, "smsh") == 0 &&
    608       1.16  kiyohara 		    cf->cf_loc[GPMCCF_INTR] == PIC_MAXSOURCES + 176)
    609       1.16  kiyohara 			break;
    610       1.16  kiyohara 		cf++;
    611       1.16  kiyohara 	}
    612       1.16  kiyohara 	if (cf->cf_name == NULL ||
    613       1.16  kiyohara 	    cf->cf_loc[GPMCCF_ADDR] == GPMCCF_ADDR_DEFAULT)
    614       1.16  kiyohara 		return;
    615       1.16  kiyohara 
    616       1.16  kiyohara 	ioreg_write(OVERO_GPMC_VBASE + GPMC_CONFIG7_5,
    617       1.16  kiyohara 	    GPMC_CONFIG7_CSVALID |
    618       1.16  kiyohara 	    GPMC_CONFIG7(GPMC_CONFIG7_MASK_16M, cf->cf_loc[GPMCCF_ADDR]));
    619       1.16  kiyohara 
    620       1.16  kiyohara 	/*
    621       1.16  kiyohara 	 * Maybe need NRESET and delay(9).
    622       1.16  kiyohara 	 * However delay(9) needs to attach mputmr.
    623       1.16  kiyohara 	 */
    624       1.16  kiyohara }
    625       1.16  kiyohara 
    626       1.16  kiyohara static void
    627       1.16  kiyohara eth1_config(void)
    628       1.16  kiyohara {
    629       1.16  kiyohara 	extern struct cfdata cfdata[];
    630       1.16  kiyohara 	cfdata_t cf = &cfdata[0];
    631       1.16  kiyohara 
    632       1.16  kiyohara 	/*
    633       1.16  kiyohara 	 * ETH1 connects via CS4.  It use GPIO 65 for IRQ.
    634  1.18.18.1       tls 	 *
    635  1.18.18.1       tls 	 * Basically use current settings by U-Boot.
    636  1.18.18.1       tls 	 * However remap physical address to configured address.
    637       1.16  kiyohara 	 */
    638       1.16  kiyohara 
    639       1.16  kiyohara 	while (cf->cf_name != NULL) {
    640       1.16  kiyohara 		if (strcmp(cf->cf_name, "smsh") == 0 &&
    641       1.16  kiyohara 		    cf->cf_loc[GPMCCF_INTR] == PIC_MAXSOURCES + 65)
    642       1.16  kiyohara 			break;
    643       1.16  kiyohara 		cf++;
    644       1.16  kiyohara 	}
    645       1.16  kiyohara 	if (cf->cf_name == NULL ||
    646       1.16  kiyohara 	    cf->cf_loc[GPMCCF_ADDR] == GPMCCF_ADDR_DEFAULT)
    647       1.16  kiyohara 		return;
    648       1.16  kiyohara 
    649       1.16  kiyohara 	ioreg_write(OVERO_GPMC_VBASE + GPMC_CONFIG7_4,
    650       1.16  kiyohara 	    GPMC_CONFIG7_CSVALID |
    651       1.16  kiyohara 	    GPMC_CONFIG7(GPMC_CONFIG7_MASK_16M, cf->cf_loc[GPMCCF_ADDR]));
    652       1.16  kiyohara 
    653       1.16  kiyohara 	/* ETH1 is sure to be reset with ETH0. */
    654       1.16  kiyohara }
    655       1.16  kiyohara 
    656       1.16  kiyohara static void
    657       1.16  kiyohara chestnut_config(void)
    658       1.16  kiyohara {
    659       1.16  kiyohara 
    660       1.16  kiyohara 	eth0_config();
    661       1.16  kiyohara }
    662       1.16  kiyohara 
    663       1.16  kiyohara static void
    664       1.16  kiyohara tobi_config(void)
    665       1.16  kiyohara {
    666       1.16  kiyohara 
    667       1.16  kiyohara 	eth0_config();
    668       1.16  kiyohara }
    669       1.16  kiyohara 
    670       1.16  kiyohara static void
    671       1.16  kiyohara tobiduo_config(void)
    672       1.16  kiyohara {
    673       1.16  kiyohara 
    674       1.16  kiyohara 	eth0_config();
    675       1.16  kiyohara 	eth1_config();
    676       1.16  kiyohara }
    677       1.15  kiyohara #endif
    678