1 1.16 martin /* $NetBSD: am79c930.c,v 1.16 2008/04/28 20:23:49 martin Exp $ */ 2 1.2 sommerfe 3 1.1 sommerfe /*- 4 1.1 sommerfe * Copyright (c) 1999 The NetBSD Foundation, Inc. 5 1.1 sommerfe * All rights reserved. 6 1.1 sommerfe * 7 1.1 sommerfe * This code is derived from software contributed to The NetBSD Foundation 8 1.1 sommerfe * by Bill Sommerfeld 9 1.1 sommerfe * 10 1.1 sommerfe * Redistribution and use in source and binary forms, with or without 11 1.1 sommerfe * modification, are permitted provided that the following conditions 12 1.1 sommerfe * are met: 13 1.1 sommerfe * 1. Redistributions of source code must retain the above copyright 14 1.1 sommerfe * notice, this list of conditions and the following disclaimer. 15 1.1 sommerfe * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 sommerfe * notice, this list of conditions and the following disclaimer in the 17 1.1 sommerfe * documentation and/or other materials provided with the distribution. 18 1.1 sommerfe * 19 1.1 sommerfe * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 sommerfe * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 sommerfe * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 sommerfe * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 sommerfe * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 sommerfe * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 sommerfe * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 sommerfe * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 sommerfe * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 sommerfe * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 sommerfe * POSSIBILITY OF SUCH DAMAGE. 30 1.1 sommerfe */ 31 1.1 sommerfe 32 1.1 sommerfe /* 33 1.1 sommerfe * Am79c930 chip driver. 34 1.1 sommerfe * 35 1.1 sommerfe * This is used by the awi driver to use the shared 36 1.1 sommerfe * memory attached to the 79c930 to communicate with the firmware running 37 1.1 sommerfe * in the 930's on-board 80188 core. 38 1.1 sommerfe * 39 1.1 sommerfe * The 79c930 can be mapped into just I/O space, or also have a 40 1.1 sommerfe * memory mapping; the mapping must be set up by the bus front-end 41 1.1 sommerfe * before am79c930_init is called. 42 1.1 sommerfe */ 43 1.1 sommerfe 44 1.1 sommerfe /* 45 1.1 sommerfe * operations: 46 1.1 sommerfe * 47 1.1 sommerfe * read_8, read_16, read_32, read_64, read_bytes 48 1.1 sommerfe * write_8, write_16, write_32, write_64, write_bytes 49 1.1 sommerfe * (two versions, depending on whether memory-space or i/o space is in use). 50 1.1 sommerfe * 51 1.1 sommerfe * interrupt E.C. 52 1.1 sommerfe * start isr 53 1.1 sommerfe * end isr 54 1.1 sommerfe */ 55 1.7 lukem 56 1.7 lukem #include <sys/cdefs.h> 57 1.9 onoe #ifdef __NetBSD__ 58 1.16 martin __KERNEL_RCSID(0, "$NetBSD: am79c930.c,v 1.16 2008/04/28 20:23:49 martin Exp $"); 59 1.9 onoe #endif 60 1.9 onoe #ifdef __FreeBSD__ 61 1.9 onoe __FBSDID("$FreeBSD$"); 62 1.9 onoe #endif 63 1.1 sommerfe 64 1.1 sommerfe #include <sys/param.h> 65 1.1 sommerfe #include <sys/systm.h> 66 1.9 onoe #include <sys/endian.h> 67 1.4 onoe #ifndef __FreeBSD__ 68 1.1 sommerfe #include <sys/device.h> 69 1.4 onoe #endif 70 1.1 sommerfe 71 1.15 ad #include <sys/cpu.h> 72 1.4 onoe #ifdef __FreeBSD__ 73 1.4 onoe #include <machine/bus_pio.h> 74 1.4 onoe #include <machine/bus_memio.h> 75 1.4 onoe #endif 76 1.15 ad #include <sys/bus.h> 77 1.4 onoe #ifdef __NetBSD__ 78 1.15 ad #include <sys/intr.h> 79 1.4 onoe #endif 80 1.1 sommerfe 81 1.4 onoe #ifdef __NetBSD__ 82 1.1 sommerfe #include <dev/ic/am79c930reg.h> 83 1.1 sommerfe #include <dev/ic/am79c930var.h> 84 1.4 onoe #endif 85 1.4 onoe #ifdef __FreeBSD__ 86 1.4 onoe #include <dev/awi/am79c930reg.h> 87 1.4 onoe #include <dev/awi/am79c930var.h> 88 1.4 onoe #endif 89 1.1 sommerfe 90 1.4 onoe #define AM930_DELAY(x) /*nothing*/ 91 1.1 sommerfe 92 1.12 jmc #ifndef __BUS_SPACE_HAS_STREAM_METHODS 93 1.12 jmc #define bus_space_read_stream_2 bus_space_read_2 94 1.12 jmc #define bus_space_read_stream_4 bus_space_read_4 95 1.12 jmc #define bus_space_write_stream_2 bus_space_write_2 96 1.12 jmc #define bus_space_write_stream_4 bus_space_write_4 97 1.12 jmc #endif /* __BUS_SPACE_HAS_STREAM_METHODS */ 98 1.12 jmc 99 1.9 onoe void am79c930_regdump(struct am79c930_softc *sc); 100 1.1 sommerfe 101 1.9 onoe static void io_write_1(struct am79c930_softc *, u_int32_t, u_int8_t); 102 1.9 onoe static void io_write_2(struct am79c930_softc *, u_int32_t, u_int16_t); 103 1.9 onoe static void io_write_4(struct am79c930_softc *, u_int32_t, u_int32_t); 104 1.9 onoe static void io_write_bytes(struct am79c930_softc *, u_int32_t, u_int8_t *, size_t); 105 1.9 onoe 106 1.9 onoe static u_int8_t io_read_1(struct am79c930_softc *, u_int32_t); 107 1.9 onoe static u_int16_t io_read_2(struct am79c930_softc *, u_int32_t); 108 1.9 onoe static u_int32_t io_read_4(struct am79c930_softc *, u_int32_t); 109 1.9 onoe static void io_read_bytes(struct am79c930_softc *, u_int32_t, u_int8_t *, size_t); 110 1.9 onoe 111 1.9 onoe static void mem_write_1(struct am79c930_softc *, u_int32_t, u_int8_t); 112 1.9 onoe static void mem_write_2(struct am79c930_softc *, u_int32_t, u_int16_t); 113 1.9 onoe static void mem_write_4(struct am79c930_softc *, u_int32_t, u_int32_t); 114 1.9 onoe static void mem_write_bytes(struct am79c930_softc *, u_int32_t, u_int8_t *, size_t); 115 1.9 onoe 116 1.9 onoe static u_int8_t mem_read_1(struct am79c930_softc *, u_int32_t); 117 1.9 onoe static u_int16_t mem_read_2(struct am79c930_softc *, u_int32_t); 118 1.9 onoe static u_int32_t mem_read_4(struct am79c930_softc *, u_int32_t); 119 1.9 onoe static void mem_read_bytes(struct am79c930_softc *, u_int32_t, u_int8_t *, size_t); 120 1.1 sommerfe 121 1.1 sommerfe static struct am79c930_ops iospace_ops = { 122 1.1 sommerfe io_write_1, 123 1.1 sommerfe io_write_2, 124 1.1 sommerfe io_write_4, 125 1.1 sommerfe io_write_bytes, 126 1.1 sommerfe io_read_1, 127 1.1 sommerfe io_read_2, 128 1.1 sommerfe io_read_4, 129 1.1 sommerfe io_read_bytes 130 1.1 sommerfe }; 131 1.1 sommerfe 132 1.1 sommerfe struct am79c930_ops memspace_ops = { 133 1.1 sommerfe mem_write_1, 134 1.1 sommerfe mem_write_2, 135 1.1 sommerfe mem_write_4, 136 1.1 sommerfe mem_write_bytes, 137 1.1 sommerfe mem_read_1, 138 1.1 sommerfe mem_read_2, 139 1.1 sommerfe mem_read_4, 140 1.1 sommerfe mem_read_bytes 141 1.1 sommerfe }; 142 1.1 sommerfe 143 1.9 onoe static void 144 1.9 onoe io_write_1( struct am79c930_softc *sc, u_int32_t off, u_int8_t val) 145 1.1 sommerfe { 146 1.1 sommerfe AM930_DELAY(1); 147 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 148 1.1 sommerfe ((off>>8)& 0x7f)); 149 1.1 sommerfe AM930_DELAY(1); 150 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_LO, (off&0xff)); 151 1.1 sommerfe AM930_DELAY(1); 152 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA, val); 153 1.1 sommerfe AM930_DELAY(1); 154 1.1 sommerfe } 155 1.1 sommerfe 156 1.9 onoe static void 157 1.9 onoe io_write_2(struct am79c930_softc *sc, u_int32_t off, u_int16_t val) 158 1.1 sommerfe { 159 1.3 sommerfe AM930_DELAY(1); 160 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 161 1.3 sommerfe ((off>>8)& 0x7f)); 162 1.3 sommerfe AM930_DELAY(1); 163 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_LMA_LO, (off&0xff)); 164 1.3 sommerfe AM930_DELAY(1); 165 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_IODPA, val & 0xff); 166 1.3 sommerfe AM930_DELAY(1); 167 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_IODPA, (val>>8)&0xff); 168 1.3 sommerfe AM930_DELAY(1); 169 1.1 sommerfe } 170 1.1 sommerfe 171 1.9 onoe static void 172 1.9 onoe io_write_4(struct am79c930_softc *sc, u_int32_t off, u_int32_t val) 173 1.1 sommerfe { 174 1.3 sommerfe AM930_DELAY(1); 175 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 176 1.3 sommerfe ((off>>8)& 0x7f)); 177 1.3 sommerfe AM930_DELAY(1); 178 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_LMA_LO, (off&0xff)); 179 1.3 sommerfe AM930_DELAY(1); 180 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_IODPA,val & 0xff); 181 1.3 sommerfe AM930_DELAY(1); 182 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_IODPA,(val>>8)&0xff); 183 1.3 sommerfe AM930_DELAY(1); 184 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_IODPA,(val>>16)&0xff); 185 1.3 sommerfe AM930_DELAY(1); 186 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_IODPA,(val>>24)&0xff); 187 1.3 sommerfe AM930_DELAY(1); 188 1.1 sommerfe } 189 1.1 sommerfe 190 1.9 onoe static void 191 1.9 onoe io_write_bytes(struct am79c930_softc *sc, u_int32_t off, u_int8_t *ptr, 192 1.9 onoe size_t len) 193 1.1 sommerfe { 194 1.1 sommerfe int i; 195 1.3 sommerfe 196 1.3 sommerfe AM930_DELAY(1); 197 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 198 1.3 sommerfe ((off>>8)& 0x7f)); 199 1.3 sommerfe AM930_DELAY(1); 200 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_LMA_LO, (off&0xff)); 201 1.3 sommerfe AM930_DELAY(1); 202 1.1 sommerfe for (i=0; i<len; i++) 203 1.3 sommerfe bus_space_write_1(sc->sc_iot,sc->sc_ioh,AM79C930_IODPA,ptr[i]); 204 1.1 sommerfe } 205 1.1 sommerfe 206 1.9 onoe static u_int8_t 207 1.9 onoe io_read_1(struct am79c930_softc *sc, u_int32_t off) 208 1.1 sommerfe { 209 1.1 sommerfe u_int8_t val; 210 1.9 onoe 211 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 212 1.1 sommerfe ((off>>8)& 0x7f)); 213 1.1 sommerfe AM930_DELAY(1); 214 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_LO, (off&0xff)); 215 1.1 sommerfe AM930_DELAY(1); 216 1.1 sommerfe val = bus_space_read_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA); 217 1.1 sommerfe AM930_DELAY(1); 218 1.1 sommerfe return val; 219 1.1 sommerfe } 220 1.1 sommerfe 221 1.9 onoe static u_int16_t 222 1.9 onoe io_read_2(struct am79c930_softc *sc, u_int32_t off) 223 1.1 sommerfe { 224 1.3 sommerfe u_int16_t val; 225 1.3 sommerfe 226 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 227 1.3 sommerfe ((off>>8)& 0x7f)); 228 1.3 sommerfe AM930_DELAY(1); 229 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_LO, (off&0xff)); 230 1.3 sommerfe AM930_DELAY(1); 231 1.3 sommerfe val = bus_space_read_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA); 232 1.3 sommerfe AM930_DELAY(1); 233 1.3 sommerfe val |= bus_space_read_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA) << 8; 234 1.13 perry AM930_DELAY(1); 235 1.3 sommerfe return val; 236 1.1 sommerfe } 237 1.1 sommerfe 238 1.9 onoe static u_int32_t 239 1.9 onoe io_read_4(struct am79c930_softc *sc, u_int32_t off) 240 1.1 sommerfe { 241 1.3 sommerfe u_int32_t val; 242 1.3 sommerfe 243 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 244 1.3 sommerfe ((off>>8)& 0x7f)); 245 1.3 sommerfe AM930_DELAY(1); 246 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_LO, (off&0xff)); 247 1.3 sommerfe AM930_DELAY(1); 248 1.3 sommerfe val = bus_space_read_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA); 249 1.3 sommerfe AM930_DELAY(1); 250 1.3 sommerfe val |= bus_space_read_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA) << 8; 251 1.13 perry AM930_DELAY(1); 252 1.3 sommerfe val |= bus_space_read_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA) << 16; 253 1.13 perry AM930_DELAY(1); 254 1.3 sommerfe val |= bus_space_read_1(sc->sc_iot, sc->sc_ioh, AM79C930_IODPA) << 24; 255 1.13 perry AM930_DELAY(1); 256 1.3 sommerfe return val; 257 1.1 sommerfe } 258 1.1 sommerfe 259 1.9 onoe static void 260 1.9 onoe io_read_bytes(struct am79c930_softc *sc, u_int32_t off, u_int8_t *ptr, 261 1.9 onoe size_t len) 262 1.1 sommerfe { 263 1.1 sommerfe int i; 264 1.13 perry 265 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_HI, 266 1.3 sommerfe ((off>>8)& 0x7f)); 267 1.3 sommerfe AM930_DELAY(1); 268 1.3 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_LMA_LO, (off&0xff)); 269 1.3 sommerfe AM930_DELAY(1); 270 1.13 perry for (i=0; i<len; i++) 271 1.3 sommerfe ptr[i] = bus_space_read_1(sc->sc_iot, sc->sc_ioh, 272 1.3 sommerfe AM79C930_IODPA); 273 1.1 sommerfe } 274 1.1 sommerfe 275 1.9 onoe static void 276 1.9 onoe mem_write_1(struct am79c930_softc *sc, u_int32_t off, u_int8_t val) 277 1.1 sommerfe { 278 1.1 sommerfe bus_space_write_1(sc->sc_memt, sc->sc_memh, off, val); 279 1.1 sommerfe } 280 1.1 sommerfe 281 1.10 dyoung static void 282 1.10 dyoung mem_write_2(struct am79c930_softc *sc, u_int32_t off, u_int16_t val) 283 1.1 sommerfe { 284 1.5 onoe bus_space_tag_t t = sc->sc_memt; 285 1.5 onoe bus_space_handle_t h = sc->sc_memh; 286 1.5 onoe 287 1.5 onoe /* could be unaligned */ 288 1.5 onoe if ((off & 0x1) == 0) 289 1.11 dyoung bus_space_write_stream_2(t, h, off, htole16(val)); 290 1.5 onoe else { 291 1.5 onoe bus_space_write_1(t, h, off, val & 0xff); 292 1.5 onoe bus_space_write_1(t, h, off+1, (val >> 8) & 0xff); 293 1.5 onoe } 294 1.1 sommerfe } 295 1.1 sommerfe 296 1.9 onoe static void 297 1.9 onoe mem_write_4(struct am79c930_softc *sc, u_int32_t off, u_int32_t val) 298 1.1 sommerfe { 299 1.5 onoe bus_space_tag_t t = sc->sc_memt; 300 1.5 onoe bus_space_handle_t h = sc->sc_memh; 301 1.5 onoe 302 1.5 onoe /* could be unaligned */ 303 1.5 onoe if ((off & 0x3) == 0) 304 1.11 dyoung bus_space_write_stream_4(t, h, off, htole32(val)); 305 1.5 onoe else { 306 1.5 onoe bus_space_write_1(t, h, off, val & 0xff); 307 1.5 onoe bus_space_write_1(t, h, off+1, (val >> 8) & 0xff); 308 1.5 onoe bus_space_write_1(t, h, off+2, (val >> 16) & 0xff); 309 1.5 onoe bus_space_write_1(t, h, off+3, (val >> 24) & 0xff); 310 1.5 onoe } 311 1.1 sommerfe } 312 1.1 sommerfe 313 1.9 onoe static void 314 1.9 onoe mem_write_bytes(struct am79c930_softc *sc, u_int32_t off, u_int8_t *ptr, 315 1.9 onoe size_t len) 316 1.1 sommerfe { 317 1.3 sommerfe bus_space_write_region_1 (sc->sc_memt, sc->sc_memh, off, ptr, len); 318 1.1 sommerfe } 319 1.1 sommerfe 320 1.9 onoe static u_int8_t 321 1.9 onoe mem_read_1(struct am79c930_softc *sc, u_int32_t off) 322 1.1 sommerfe { 323 1.1 sommerfe return bus_space_read_1(sc->sc_memt, sc->sc_memh, off); 324 1.1 sommerfe } 325 1.1 sommerfe 326 1.9 onoe static u_int16_t 327 1.9 onoe mem_read_2(struct am79c930_softc *sc, u_int32_t off) 328 1.1 sommerfe { 329 1.5 onoe /* could be unaligned */ 330 1.5 onoe if ((off & 0x1) == 0) 331 1.11 dyoung return le16toh(bus_space_read_stream_2(sc->sc_memt, 332 1.11 dyoung sc->sc_memh, off)); 333 1.5 onoe else 334 1.5 onoe return 335 1.5 onoe bus_space_read_1(sc->sc_memt, sc->sc_memh, off ) | 336 1.5 onoe (bus_space_read_1(sc->sc_memt, sc->sc_memh, off+1) << 8); 337 1.1 sommerfe } 338 1.1 sommerfe 339 1.9 onoe static u_int32_t 340 1.9 onoe mem_read_4(struct am79c930_softc *sc, u_int32_t off) 341 1.1 sommerfe { 342 1.5 onoe /* could be unaligned */ 343 1.5 onoe if ((off & 0x3) == 0) 344 1.11 dyoung return le32toh(bus_space_read_stream_4(sc->sc_memt, sc->sc_memh, 345 1.11 dyoung off)); 346 1.5 onoe else 347 1.5 onoe return 348 1.5 onoe bus_space_read_1(sc->sc_memt, sc->sc_memh, off ) | 349 1.5 onoe (bus_space_read_1(sc->sc_memt, sc->sc_memh, off+1) << 8) | 350 1.5 onoe (bus_space_read_1(sc->sc_memt, sc->sc_memh, off+2) <<16) | 351 1.5 onoe (bus_space_read_1(sc->sc_memt, sc->sc_memh, off+3) <<24); 352 1.1 sommerfe } 353 1.1 sommerfe 354 1.9 onoe static void 355 1.9 onoe mem_read_bytes(struct am79c930_softc *sc, u_int32_t off, u_int8_t *ptr, 356 1.9 onoe size_t len) 357 1.1 sommerfe { 358 1.3 sommerfe bus_space_read_region_1 (sc->sc_memt, sc->sc_memh, off, ptr, len); 359 1.1 sommerfe } 360 1.1 sommerfe 361 1.1 sommerfe 362 1.1 sommerfe /* 363 1.1 sommerfe * Set bits in GCR. 364 1.1 sommerfe */ 365 1.1 sommerfe 366 1.9 onoe void 367 1.9 onoe am79c930_gcr_setbits(struct am79c930_softc *sc, u_int8_t bits) 368 1.1 sommerfe { 369 1.1 sommerfe u_int8_t gcr = bus_space_read_1 (sc->sc_iot, sc->sc_ioh, AM79C930_GCR); 370 1.1 sommerfe 371 1.1 sommerfe gcr |= bits; 372 1.13 perry 373 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_GCR, gcr); 374 1.1 sommerfe } 375 1.1 sommerfe 376 1.1 sommerfe /* 377 1.1 sommerfe * Clear bits in GCR. 378 1.1 sommerfe */ 379 1.1 sommerfe 380 1.9 onoe void 381 1.9 onoe am79c930_gcr_clearbits(struct am79c930_softc *sc, u_int8_t bits) 382 1.1 sommerfe { 383 1.1 sommerfe u_int8_t gcr = bus_space_read_1 (sc->sc_iot, sc->sc_ioh, AM79C930_GCR); 384 1.1 sommerfe 385 1.1 sommerfe gcr &= ~bits; 386 1.13 perry 387 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_GCR, gcr); 388 1.1 sommerfe } 389 1.1 sommerfe 390 1.9 onoe u_int8_t 391 1.9 onoe am79c930_gcr_read(struct am79c930_softc *sc) 392 1.1 sommerfe { 393 1.1 sommerfe return bus_space_read_1 (sc->sc_iot, sc->sc_ioh, AM79C930_GCR); 394 1.1 sommerfe } 395 1.1 sommerfe 396 1.13 perry #if 0 397 1.9 onoe void 398 1.9 onoe am79c930_regdump(struct am79c930_softc *sc) 399 1.1 sommerfe { 400 1.1 sommerfe u_int8_t buf[8]; 401 1.1 sommerfe int i; 402 1.1 sommerfe 403 1.1 sommerfe AM930_DELAY(5); 404 1.1 sommerfe for (i=0; i<8; i++) { 405 1.1 sommerfe buf[i] = bus_space_read_1 (sc->sc_iot, sc->sc_ioh, i); 406 1.1 sommerfe AM930_DELAY(5); 407 1.1 sommerfe } 408 1.1 sommerfe printf("am79c930: regdump:"); 409 1.1 sommerfe for (i=0; i<8; i++) { 410 1.1 sommerfe printf(" %02x", buf[i]); 411 1.1 sommerfe } 412 1.1 sommerfe printf("\n"); 413 1.1 sommerfe } 414 1.1 sommerfe #endif 415 1.1 sommerfe 416 1.9 onoe void 417 1.9 onoe am79c930_chip_init(struct am79c930_softc *sc, int how) 418 1.1 sommerfe { 419 1.1 sommerfe /* zero the bank select register, and leave it that way.. */ 420 1.1 sommerfe bus_space_write_1(sc->sc_iot, sc->sc_ioh, AM79C930_BSS, 0); 421 1.1 sommerfe if (how) 422 1.1 sommerfe sc->sc_ops = &memspace_ops; 423 1.1 sommerfe else 424 1.1 sommerfe sc->sc_ops = &iospace_ops; 425 1.1 sommerfe } 426