1 /* $NetBSD: ess_ofisa.c,v 1.7 2001/11/13 07:29:45 lukem Exp $ */ 2 3 /*- 4 * Copyright (c) 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility, 9 * NASA Ames Research Center. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. All advertising materials mentioning features or use of this software 20 * must display the following acknowledgement: 21 * This product includes software developed by the NetBSD 22 * Foundation, Inc. and its contributors. 23 * 4. Neither the name of The NetBSD Foundation nor the names of its 24 * contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 28 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 29 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 30 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 31 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 37 * POSSIBILITY OF SUCH DAMAGE. 38 */ 39 40 #include <sys/cdefs.h> 41 __KERNEL_RCSID(0, "$NetBSD: ess_ofisa.c,v 1.7 2001/11/13 07:29:45 lukem Exp $"); 42 43 #include <sys/param.h> 44 #include <sys/systm.h> 45 #include <sys/device.h> 46 47 #include <machine/bus.h> 48 #include <machine/intr.h> 49 50 #include <sys/audioio.h> 51 #include <dev/audio_if.h> 52 #include <dev/mulaw.h> 53 54 #include <dev/ofw/openfirm.h> 55 #include <dev/isa/isavar.h> 56 #include <dev/ofisa/ofisavar.h> 57 58 #include <dev/isa/essreg.h> 59 #include <dev/isa/essvar.h> 60 61 int ess_ofisa_match __P((struct device *, struct cfdata *, void *)); 62 void ess_ofisa_attach __P((struct device *, struct device *, void *)); 63 64 struct cfattach ess_ofisa_ca = { 65 sizeof(struct ess_softc), ess_ofisa_match, ess_ofisa_attach 66 }; 67 68 int 69 ess_ofisa_match(parent, cf, aux) 70 struct device *parent; 71 struct cfdata *cf; 72 void *aux; 73 { 74 struct ofisa_attach_args *aa = aux; 75 const char *compatible_strings[] = { 76 "ESST,es1887-codec", /* ESS 1887 */ 77 "ESST,es1888-codec", /* ESS 1888 */ 78 "ESST,es888-codec", /* ESS 888 */ 79 NULL, 80 }; 81 int rv = 0; 82 83 /* XXX table */ 84 if (of_compatible(aa->oba.oba_phandle, compatible_strings) != -1) { 85 rv = 10; 86 } 87 88 return (rv); 89 } 90 91 void 92 ess_ofisa_attach(parent, self, aux) 93 struct device *parent, *self; 94 void *aux; 95 { 96 struct ess_softc *sc = (void *)self; 97 struct ofisa_attach_args *aa = aux; 98 struct ofisa_reg_desc reg; 99 struct ofisa_intr_desc intr[2]; 100 struct ofisa_dma_desc dma[2]; 101 int n, ndrq; 102 char *model; 103 104 /* 105 * We're living on an OFW. We have to ask the OFW what our 106 * registers and interrupts properties look like. 107 * 108 * We expect: 109 * 110 * 1 i/o register region 111 * 1 or 2 interrupts 112 * 2 dma channels 113 */ 114 115 n = ofisa_reg_get(aa->oba.oba_phandle, ®, 1); 116 if (n != 1) { 117 printf(": error getting register data\n"); 118 return; 119 } 120 if (reg.type != OFISA_REG_TYPE_IO) { 121 printf(": register type not i/o\n"); 122 return; 123 } 124 if (reg.len != ESS_NPORT) { 125 printf(": weird register size (%lu, expected %d)\n", 126 (unsigned long)reg.len, ESS_NPORT); 127 return; 128 } 129 130 n = ofisa_intr_get(aa->oba.oba_phandle, intr, 2); 131 if (n == 1) { 132 sc->sc_audio1.irq = intr[0].irq; 133 sc->sc_audio1.ist = intr[0].share; 134 sc->sc_audio2.irq = intr[0].irq; 135 sc->sc_audio2.ist = intr[0].share; 136 } else if (n == 2) { 137 sc->sc_audio1.irq = intr[0].irq; 138 sc->sc_audio1.ist = intr[0].share; 139 sc->sc_audio2.irq = intr[1].irq; 140 sc->sc_audio2.ist = intr[1].share; 141 } else { 142 printf(": error getting interrupt data\n"); 143 return; 144 } 145 146 ndrq = ofisa_dma_get(aa->oba.oba_phandle, dma, 2); 147 if (ndrq != 2) { 148 printf(": error getting DMA data\n"); 149 return; 150 } 151 sc->sc_audio1.drq = dma[0].drq; 152 sc->sc_audio2.drq = dma[1].drq; 153 154 sc->sc_ic = aa->ic; 155 156 sc->sc_iot = aa->iot; 157 sc->sc_iobase = reg.addr; 158 if (bus_space_map(sc->sc_iot, sc->sc_iobase, reg.len, 0, 159 &sc->sc_ioh)) { 160 printf(": unable to map register space\n"); 161 return; 162 } 163 164 /* 165 * The Shark firmware doesn't program the ESS ISA address registers. 166 * Do that here instead of inside essmatch() since we want to defer 167 * to the firmware on other platforms. 168 */ 169 if (ess_config_addr(sc)) 170 return; 171 if (essmatch(sc) == 0) { 172 printf(": essmatch failed\n"); 173 return; 174 } 175 176 n = OF_getproplen(aa->oba.oba_phandle, "model"); 177 if (n > 0) { 178 model = alloca(n); 179 if (OF_getprop(aa->oba.oba_phandle, "model", model, n) == n) 180 printf(": %s\n%s", model, sc->sc_dev.dv_xname); 181 } 182 183 essattach(sc); 184 } 185