1 /* $NetBSD: obio.c,v 1.6 2002/02/08 02:30:12 thorpej Exp $ */ 2 3 /* 4 * Copyright (c) 2001, 2002 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Jason R. Thorpe 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 /* 39 * On-board device autoconfiguration support for Intel IQ80310 40 * evaluation boards. 41 * 42 * The "obio" device node handles all of the CPLD functions, 43 * as well ... timer, interrupts, etc. 44 */ 45 46 #include <sys/param.h> 47 #include <sys/systm.h> 48 #include <sys/device.h> 49 50 #include <machine/autoconf.h> 51 #include <machine/bus.h> 52 53 #include <evbarm/iq80310/iq80310reg.h> 54 #include <evbarm/iq80310/iq80310var.h> 55 #include <evbarm/iq80310/obiovar.h> 56 57 #include "locators.h" 58 59 int obio_match(struct device *, struct cfdata *, void *); 60 void obio_attach(struct device *, struct device *, void *); 61 62 struct cfattach obio_ca = { 63 sizeof(struct device), obio_match, obio_attach, 64 }; 65 66 int obio_print(void *, const char *); 67 int obio_submatch(struct device *, struct cfdata *, void *); 68 69 /* there can be only one */ 70 int obio_found; 71 72 struct { 73 const char *od_name; 74 bus_addr_t od_addr; 75 int od_irq; 76 } obio_devices[] = 77 #if defined(IOP310_TEAMASA_NPWR) 78 { 79 /* 80 * There is only one UART on the Npwr. 81 */ 82 { "com", IQ80310_UART2, XINT3_IRQ(XINT3_UART2) }, 83 84 { NULL, 0, 0 }, 85 }; 86 #else /* Default to stock IQ80310 */ 87 { 88 /* 89 * Order these so the first UART matched is the one at J9 90 * and the second is the one at J10. (This is the same 91 * ordering RedBoot uses.) 92 */ 93 { "com", IQ80310_UART2, XINT3_IRQ(XINT3_UART2) }, 94 { "com", IQ80310_UART1, XINT3_IRQ(XINT3_UART1) }, 95 96 { NULL, 0, 0 }, 97 }; 98 #endif /* list of IQ80310-based designs */ 99 100 int 101 obio_match(struct device *parent, struct cfdata *cf, void *aux) 102 { 103 #if 0 104 struct mainbus_attach_args *ma = aux; 105 #endif 106 107 if (obio_found) 108 return (0); 109 110 #if 1 111 /* XXX Shoot arch/arm/mainbus in the head. */ 112 return (1); 113 #else 114 if (strcmp(cf->cf_driver->cd_name, ma->ma_name) == 0) 115 return (1); 116 117 return (0); 118 #endif 119 } 120 121 void 122 obio_attach(struct device *parent, struct device *self, void *aux) 123 { 124 struct obio_attach_args oba; 125 int i; 126 127 obio_found = 1; 128 129 #if defined(IOP310_TEAMASA_NPWR) 130 /* 131 * These boards don't have revision/backplane detect registers. 132 * Just ignore it. 133 */ 134 printf("\n"); 135 #else /* Default to stock IQ80310 */ 136 { 137 /* 138 * Yes, we're using knowledge of the obio bus space internals, 139 * here. 140 */ 141 uint8_t board_rev = CPLD_READ(IQ80310_BOARD_REV); 142 uint8_t cpld_rev = CPLD_READ(IQ80310_CPLD_REV); 143 uint8_t backplane = CPLD_READ(IQ80310_BACKPLANE_DET); 144 145 printf(": board rev. %c, CPLD rev. %c, backplane %spresent\n", 146 BOARD_REV(board_rev), CPLD_REV(cpld_rev), 147 (backplane & 1) ? "" : "not "); 148 } 149 #endif /* list of IQ80310-based designs */ 150 151 for (i = 0; obio_devices[i].od_name != NULL; i++) { 152 oba.oba_name = obio_devices[i].od_name; 153 oba.oba_st = &obio_bs_tag; 154 oba.oba_addr = obio_devices[i].od_addr; 155 oba.oba_irq = obio_devices[i].od_irq; 156 (void) config_found_sm(self, &oba, obio_print, obio_submatch); 157 } 158 } 159 160 int 161 obio_print(void *aux, const char *pnp) 162 { 163 struct obio_attach_args *oba = aux; 164 165 if (pnp) 166 printf("%s at %s", oba->oba_name, pnp); 167 168 printf(" addr 0x%08lx", oba->oba_addr); 169 170 return (UNCONF); 171 } 172 173 int 174 obio_submatch(struct device *parent, struct cfdata *cf, void *aux) 175 { 176 struct obio_attach_args *oba = aux; 177 178 if (cf->cf_loc[OBIOCF_ADDR] != OBIOCF_ADDR_DEFAULT && 179 cf->cf_loc[OBIOCF_ADDR] != oba->oba_addr) 180 return (0); 181 182 return ((*cf->cf_attach->ca_match)(parent, cf, aux)); 183 } 184