1 1.19 isaki /* $NetBSD: ym_pnpbios.c,v 1.19 2019/05/08 13:40:15 isaki Exp $ */ 2 1.1 drochner /* 3 1.1 drochner * Copyright (c) 1999 4 1.1 drochner * Matthias Drochner. All rights reserved. 5 1.1 drochner * Soren S. Jorvang. All rights reserved. 6 1.1 drochner * 7 1.1 drochner * Redistribution and use in source and binary forms, with or without 8 1.1 drochner * modification, are permitted provided that the following conditions 9 1.1 drochner * are met: 10 1.1 drochner * 1. Redistributions of source code must retain the above copyright 11 1.1 drochner * notice, this list of conditions, and the following disclaimer. 12 1.1 drochner * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 drochner * notice, this list of conditions and the following disclaimer in the 14 1.1 drochner * documentation and/or other materials provided with the distribution. 15 1.1 drochner * 16 1.1 drochner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 1.1 drochner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 1.1 drochner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.1 drochner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20 1.1 drochner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.1 drochner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.1 drochner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 drochner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.1 drochner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 drochner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 drochner * SUCH DAMAGE. 27 1.1 drochner */ 28 1.5 lukem 29 1.5 lukem #include <sys/cdefs.h> 30 1.19 isaki __KERNEL_RCSID(0, "$NetBSD: ym_pnpbios.c,v 1.19 2019/05/08 13:40:15 isaki Exp $"); 31 1.1 drochner 32 1.1 drochner #include "mpu_ym.h" 33 1.1 drochner 34 1.1 drochner #include <sys/param.h> 35 1.1 drochner #include <sys/systm.h> 36 1.1 drochner #include <sys/errno.h> 37 1.1 drochner #include <sys/ioctl.h> 38 1.1 drochner #include <sys/syslog.h> 39 1.1 drochner #include <sys/device.h> 40 1.1 drochner #include <sys/proc.h> 41 1.1 drochner 42 1.17 dyoung #include <sys/bus.h> 43 1.1 drochner 44 1.1 drochner #include <sys/audioio.h> 45 1.19 isaki #include <dev/audio/audio_if.h> 46 1.1 drochner #include <dev/midi_if.h> 47 1.1 drochner 48 1.1 drochner #include <dev/isa/isavar.h> 49 1.1 drochner #include <dev/isa/isadmavar.h> 50 1.1 drochner 51 1.1 drochner #include <i386/pnpbios/pnpbiosvar.h> 52 1.1 drochner 53 1.18 msaitoh #include <dev/ic/ad1848reg.h> 54 1.1 drochner #include <dev/isa/ad1848var.h> 55 1.18 msaitoh 56 1.1 drochner #include <dev/ic/cs4231reg.h> 57 1.1 drochner #include <dev/isa/cs4231var.h> 58 1.18 msaitoh 59 1.1 drochner #include <dev/ic/opl3sa3reg.h> 60 1.1 drochner #include <dev/isa/wssreg.h> 61 1.1 drochner #include <dev/isa/ymvar.h> 62 1.1 drochner 63 1.15 cegger int ym_pnpbios_match(device_t, cfdata_t, void *); 64 1.15 cegger void ym_pnpbios_attach(device_t, device_t, void *); 65 1.1 drochner 66 1.16 tsutsui CFATTACH_DECL_NEW(ym_pnpbios, sizeof(struct ym_softc), 67 1.9 thorpej ym_pnpbios_match, ym_pnpbios_attach, NULL, NULL); 68 1.1 drochner 69 1.1 drochner int 70 1.18 msaitoh ym_pnpbios_match(device_t parent, cfdata_t match, void *aux) 71 1.1 drochner { 72 1.1 drochner struct pnpbiosdev_attach_args *aa = aux; 73 1.1 drochner 74 1.1 drochner if (strcmp(aa->idstr, "YMH0021")) 75 1.1 drochner return 0; 76 1.1 drochner 77 1.1 drochner return 1; 78 1.1 drochner } 79 1.1 drochner 80 1.1 drochner void 81 1.18 msaitoh ym_pnpbios_attach(device_t parent, device_t self, void *aux) 82 1.1 drochner { 83 1.15 cegger struct ym_softc *sc = device_private(self); 84 1.1 drochner struct ad1848_softc *ac = &sc->sc_ad1848.sc_ad1848; 85 1.1 drochner struct pnpbiosdev_attach_args *aa = aux; 86 1.1 drochner 87 1.16 tsutsui ac->sc_dev = self; 88 1.16 tsutsui 89 1.18 msaitoh aprint_naive("\n"); 90 1.1 drochner if (pnpbios_io_map(aa->pbt, aa->resc, 0, 91 1.1 drochner &sc->sc_iot, &sc->sc_sb_ioh) != 0) { 92 1.18 msaitoh aprint_error(": can't map sb i/o space\n"); 93 1.1 drochner return; 94 1.1 drochner } 95 1.1 drochner if (pnpbios_io_map(aa->pbt, aa->resc, 1, 96 1.1 drochner &sc->sc_iot, &sc->sc_ioh) != 0) { 97 1.18 msaitoh aprint_error(": can't map sb i/o space\n"); 98 1.1 drochner return; 99 1.1 drochner } 100 1.1 drochner if (pnpbios_io_map(aa->pbt, aa->resc, 2, 101 1.1 drochner &sc->sc_iot, &sc->sc_opl_ioh) != 0) { 102 1.18 msaitoh aprint_error(": can't map opl i/o space\n"); 103 1.1 drochner return; 104 1.1 drochner } 105 1.1 drochner #if NMPU_YM > 0 106 1.1 drochner if (pnpbios_io_map(aa->pbt, aa->resc, 3, 107 1.1 drochner &sc->sc_iot, &sc->sc_mpu_ioh) != 0) { 108 1.18 msaitoh aprint_error(": can't map mpu i/o space\n"); 109 1.1 drochner return; 110 1.1 drochner } 111 1.1 drochner #endif 112 1.1 drochner if (pnpbios_io_map(aa->pbt, aa->resc, 4, 113 1.1 drochner &sc->sc_iot, &sc->sc_controlioh) != 0) { 114 1.18 msaitoh aprint_error(": can't map control i/o space\n"); 115 1.1 drochner return; 116 1.1 drochner } 117 1.1 drochner 118 1.1 drochner sc->sc_ic = aa->ic; 119 1.1 drochner 120 1.3 thorpej if (pnpbios_getirqnum(aa->pbt, aa->resc, 0, &sc->ym_irq, NULL)) { 121 1.18 msaitoh aprint_error(": can't get IRQ\n"); 122 1.1 drochner return; 123 1.1 drochner } 124 1.1 drochner 125 1.1 drochner if (pnpbios_getdmachan(aa->pbt, aa->resc, 0, &sc->ym_playdrq)) { 126 1.18 msaitoh aprint_error(": can't get DMA channel\n"); 127 1.1 drochner return; 128 1.1 drochner } 129 1.1 drochner if (pnpbios_getdmachan(aa->pbt, aa->resc, 1, &sc->ym_recdrq)) 130 1.4 itohy sc->ym_recdrq = sc->ym_playdrq; /* half-duplex mode */ 131 1.1 drochner 132 1.18 msaitoh aprint_normal("\n"); 133 1.2 thorpej pnpbios_print_devres(self, aa); 134 1.2 thorpej 135 1.18 msaitoh aprint_naive("%s", device_xname(self)); 136 1.18 msaitoh aprint_normal("%s", device_xname(self)); 137 1.1 drochner 138 1.1 drochner ac->sc_iot = sc->sc_iot; 139 1.18 msaitoh if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, WSS_CODEC, 140 1.18 msaitoh AD1848_NPORT, &ac->sc_ioh)) { 141 1.14 cegger aprint_error_dev(self, "bus_space_subregion failed\n"); 142 1.1 drochner return; 143 1.1 drochner } 144 1.1 drochner ac->mode = 2; 145 1.1 drochner ac->MCE_bit = MODE_CHANGE_ENABLE; 146 1.1 drochner 147 1.1 drochner sc->sc_ad1848.sc_ic = sc->sc_ic; 148 1.1 drochner 149 1.1 drochner ym_attach(sc); 150 1.1 drochner } 151