1 /* $NetBSD: eso.c,v 1.62 2012/10/27 17:18:31 chs Exp $ */ 2 3 /*- 4 * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software developed for The NetBSD Foundation 8 * by Andrew Doran. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 /* 33 * Copyright (c) 1999, 2000, 2004 Klaus J. Klein 34 * All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. The name of the author may not be used to endorse or promote products 45 * derived from this software without specific prior written permission. 46 * 47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 48 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 50 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 51 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 52 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 53 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 54 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 55 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 56 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 57 * SUCH DAMAGE. 58 */ 59 60 /* 61 * ESS Technology Inc. Solo-1 PCI AudioDrive (ES1938/1946) device driver. 62 */ 63 64 #include <sys/cdefs.h> 65 __KERNEL_RCSID(0, "$NetBSD: eso.c,v 1.62 2012/10/27 17:18:31 chs Exp $"); 66 67 #include "mpu.h" 68 69 #include <sys/param.h> 70 #include <sys/systm.h> 71 #include <sys/kernel.h> 72 #include <sys/kmem.h> 73 #include <sys/device.h> 74 #include <sys/queue.h> 75 #include <sys/proc.h> 76 77 #include <dev/pci/pcidevs.h> 78 #include <dev/pci/pcivar.h> 79 80 #include <sys/audioio.h> 81 #include <dev/audio_if.h> 82 83 #include <dev/mulaw.h> 84 #include <dev/auconv.h> 85 86 #include <dev/ic/mpuvar.h> 87 #include <dev/ic/i8237reg.h> 88 #include <dev/pci/esoreg.h> 89 #include <dev/pci/esovar.h> 90 91 #include <sys/bus.h> 92 #include <sys/intr.h> 93 94 /* 95 * XXX Work around the 24-bit implementation limit of the Audio 1 DMA 96 * XXX engine by allocating through the ISA DMA tag. 97 */ 98 #if defined(amd64) || defined(i386) 99 #include "isa.h" 100 #if NISA > 0 101 #include <dev/isa/isavar.h> 102 #endif 103 #endif 104 105 #if defined(AUDIO_DEBUG) || defined(DEBUG) 106 #define DPRINTF(x) printf x 107 #else 108 #define DPRINTF(x) 109 #endif 110 111 struct eso_dma { 112 bus_dma_tag_t ed_dmat; 113 bus_dmamap_t ed_map; 114 void * ed_kva; 115 bus_dma_segment_t ed_segs[1]; 116 int ed_nsegs; 117 size_t ed_size; 118 SLIST_ENTRY(eso_dma) ed_slist; 119 }; 120 121 #define KVADDR(dma) ((void *)(dma)->ed_kva) 122 #define DMAADDR(dma) ((dma)->ed_map->dm_segs[0].ds_addr) 123 124 /* Autoconfiguration interface */ 125 static int eso_match(device_t, cfdata_t, void *); 126 static void eso_attach(device_t, device_t, void *); 127 static void eso_defer(device_t); 128 static int eso_print(void *, const char *); 129 130 CFATTACH_DECL_NEW(eso, sizeof (struct eso_softc), 131 eso_match, eso_attach, NULL, NULL); 132 133 /* PCI interface */ 134 static int eso_intr(void *); 135 136 /* MI audio layer interface */ 137 static int eso_query_encoding(void *, struct audio_encoding *); 138 static int eso_set_params(void *, int, int, audio_params_t *, 139 audio_params_t *, stream_filter_list_t *, 140 stream_filter_list_t *); 141 static int eso_round_blocksize(void *, int, int, const audio_params_t *); 142 static int eso_halt_output(void *); 143 static int eso_halt_input(void *); 144 static int eso_getdev(void *, struct audio_device *); 145 static int eso_set_port(void *, mixer_ctrl_t *); 146 static int eso_get_port(void *, mixer_ctrl_t *); 147 static int eso_query_devinfo(void *, mixer_devinfo_t *); 148 static void * eso_allocm(void *, int, size_t); 149 static void eso_freem(void *, void *, size_t); 150 static size_t eso_round_buffersize(void *, int, size_t); 151 static paddr_t eso_mappage(void *, void *, off_t, int); 152 static int eso_get_props(void *); 153 static int eso_trigger_output(void *, void *, void *, int, 154 void (*)(void *), void *, const audio_params_t *); 155 static int eso_trigger_input(void *, void *, void *, int, 156 void (*)(void *), void *, const audio_params_t *); 157 static void eso_get_locks(void *, kmutex_t **, kmutex_t **); 158 159 static const struct audio_hw_if eso_hw_if = { 160 NULL, /* open */ 161 NULL, /* close */ 162 NULL, /* drain */ 163 eso_query_encoding, 164 eso_set_params, 165 eso_round_blocksize, 166 NULL, /* commit_settings */ 167 NULL, /* init_output */ 168 NULL, /* init_input */ 169 NULL, /* start_output */ 170 NULL, /* start_input */ 171 eso_halt_output, 172 eso_halt_input, 173 NULL, /* speaker_ctl */ 174 eso_getdev, 175 NULL, /* setfd */ 176 eso_set_port, 177 eso_get_port, 178 eso_query_devinfo, 179 eso_allocm, 180 eso_freem, 181 eso_round_buffersize, 182 eso_mappage, 183 eso_get_props, 184 eso_trigger_output, 185 eso_trigger_input, 186 NULL, /* dev_ioctl */ 187 eso_get_locks, 188 }; 189 190 static const char * const eso_rev2model[] = { 191 "ES1938", 192 "ES1946", 193 "ES1946 Revision E" 194 }; 195 196 #define ESO_NFORMATS 8 197 static const struct audio_format eso_formats[ESO_NFORMATS] = { 198 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 199 2, AUFMT_STEREO, 0, {ESO_MINRATE, ESO_MAXRATE}}, 200 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16, 201 1, AUFMT_MONAURAL, 0, {ESO_MINRATE, ESO_MAXRATE}}, 202 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 16, 16, 203 2, AUFMT_STEREO, 0, {ESO_MINRATE, ESO_MAXRATE}}, 204 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 16, 16, 205 1, AUFMT_MONAURAL, 0, {ESO_MINRATE, ESO_MAXRATE}}, 206 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 8, 8, 207 2, AUFMT_STEREO, 0, {ESO_MINRATE, ESO_MAXRATE}}, 208 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 8, 8, 209 1, AUFMT_MONAURAL, 0, {ESO_MINRATE, ESO_MAXRATE}}, 210 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 211 2, AUFMT_STEREO, 0, {ESO_MINRATE, ESO_MAXRATE}}, 212 {NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_ULINEAR_LE, 8, 8, 213 1, AUFMT_MONAURAL, 0, {ESO_MINRATE, ESO_MAXRATE}} 214 }; 215 216 217 /* 218 * Utility routines 219 */ 220 /* Register access etc. */ 221 static uint8_t eso_read_ctlreg(struct eso_softc *, uint8_t); 222 static uint8_t eso_read_mixreg(struct eso_softc *, uint8_t); 223 static uint8_t eso_read_rdr(struct eso_softc *); 224 static void eso_reload_master_vol(struct eso_softc *); 225 static int eso_reset(struct eso_softc *); 226 static void eso_set_gain(struct eso_softc *, unsigned int); 227 static int eso_set_recsrc(struct eso_softc *, unsigned int); 228 static int eso_set_monooutsrc(struct eso_softc *, unsigned int); 229 static int eso_set_monoinbypass(struct eso_softc *, unsigned int); 230 static int eso_set_preamp(struct eso_softc *, unsigned int); 231 static void eso_write_cmd(struct eso_softc *, uint8_t); 232 static void eso_write_ctlreg(struct eso_softc *, uint8_t, uint8_t); 233 static void eso_write_mixreg(struct eso_softc *, uint8_t, uint8_t); 234 /* DMA memory allocation */ 235 static int eso_allocmem(struct eso_softc *, size_t, size_t, size_t, 236 int, struct eso_dma *); 237 static void eso_freemem(struct eso_dma *); 238 static struct eso_dma * eso_kva2dma(const struct eso_softc *, const void *); 239 240 241 static int 242 eso_match(device_t parent, cfdata_t match, void *aux) 243 { 244 struct pci_attach_args *pa; 245 246 pa = aux; 247 if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ESSTECH && 248 PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ESSTECH_SOLO1) 249 return 1; 250 251 return 0; 252 } 253 254 static void 255 eso_attach(device_t parent, device_t self, void *aux) 256 { 257 struct eso_softc *sc; 258 struct pci_attach_args *pa; 259 struct audio_attach_args aa; 260 pci_intr_handle_t ih; 261 bus_addr_t vcbase; 262 const char *intrstring; 263 int idx, error; 264 uint8_t a2mode, mvctl; 265 266 sc = device_private(self); 267 sc->sc_dev = self; 268 pa = aux; 269 aprint_naive(": Audio controller\n"); 270 271 mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_NONE); 272 mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_AUDIO); 273 274 sc->sc_revision = PCI_REVISION(pa->pa_class); 275 aprint_normal(": ESS Solo-1 PCI AudioDrive "); 276 if (sc->sc_revision < 277 sizeof (eso_rev2model) / sizeof (eso_rev2model[0])) 278 aprint_normal("%s\n", eso_rev2model[sc->sc_revision]); 279 else 280 aprint_normal("(unknown rev. 0x%02x)\n", sc->sc_revision); 281 282 /* Map I/O registers. */ 283 if (pci_mapreg_map(pa, ESO_PCI_BAR_IO, PCI_MAPREG_TYPE_IO, 0, 284 &sc->sc_iot, &sc->sc_ioh, NULL, NULL)) { 285 aprint_error_dev(sc->sc_dev, "can't map I/O space\n"); 286 return; 287 } 288 if (pci_mapreg_map(pa, ESO_PCI_BAR_SB, PCI_MAPREG_TYPE_IO, 0, 289 &sc->sc_sb_iot, &sc->sc_sb_ioh, NULL, NULL)) { 290 aprint_error_dev(sc->sc_dev, "can't map SB I/O space\n"); 291 return; 292 } 293 if (pci_mapreg_map(pa, ESO_PCI_BAR_VC, PCI_MAPREG_TYPE_IO, 0, 294 &sc->sc_dmac_iot, &sc->sc_dmac_ioh, &vcbase, &sc->sc_vcsize)) { 295 aprint_error_dev(sc->sc_dev, "can't map VC I/O space\n"); 296 /* Don't bail out yet: we can map it later, see below. */ 297 vcbase = 0; 298 sc->sc_vcsize = 0x10; /* From the data sheet. */ 299 } 300 if (pci_mapreg_map(pa, ESO_PCI_BAR_MPU, PCI_MAPREG_TYPE_IO, 0, 301 &sc->sc_mpu_iot, &sc->sc_mpu_ioh, NULL, NULL)) { 302 aprint_error_dev(sc->sc_dev, "can't map MPU I/O space\n"); 303 return; 304 } 305 if (pci_mapreg_map(pa, ESO_PCI_BAR_GAME, PCI_MAPREG_TYPE_IO, 0, 306 &sc->sc_game_iot, &sc->sc_game_ioh, NULL, NULL)) { 307 aprint_error_dev(sc->sc_dev, "can't map Game I/O space\n"); 308 return; 309 } 310 311 sc->sc_dmat = pa->pa_dmat; 312 SLIST_INIT(&sc->sc_dmas); 313 sc->sc_dmac_configured = 0; 314 315 /* Enable bus mastering. */ 316 pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, 317 pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG) | 318 PCI_COMMAND_MASTER_ENABLE); 319 320 /* Reset the device; bail out upon failure. */ 321 mutex_spin_enter(&sc->sc_intr_lock); 322 error = eso_reset(sc); 323 mutex_spin_exit(&sc->sc_intr_lock); 324 if (error != 0) { 325 aprint_error_dev(sc->sc_dev, "can't reset\n"); 326 return; 327 } 328 329 /* Select the DMA/IRQ policy: DDMA, ISA IRQ emulation disabled. */ 330 pci_conf_write(pa->pa_pc, pa->pa_tag, ESO_PCI_S1C, 331 pci_conf_read(pa->pa_pc, pa->pa_tag, ESO_PCI_S1C) & 332 ~(ESO_PCI_S1C_IRQP_MASK | ESO_PCI_S1C_DMAP_MASK)); 333 334 /* Enable the relevant (DMA) interrupts. */ 335 bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_IRQCTL, 336 ESO_IO_IRQCTL_A1IRQ | ESO_IO_IRQCTL_A2IRQ | ESO_IO_IRQCTL_HVIRQ | 337 ESO_IO_IRQCTL_MPUIRQ); 338 339 mutex_spin_enter(&sc->sc_intr_lock); 340 341 /* Set up A1's sample rate generator for new-style parameters. */ 342 a2mode = eso_read_mixreg(sc, ESO_MIXREG_A2MODE); 343 a2mode |= ESO_MIXREG_A2MODE_NEWA1 | ESO_MIXREG_A2MODE_ASYNC; 344 eso_write_mixreg(sc, ESO_MIXREG_A2MODE, a2mode); 345 346 /* Slave Master Volume to Hardware Volume Control Counter, unmask IRQ.*/ 347 mvctl = eso_read_mixreg(sc, ESO_MIXREG_MVCTL); 348 mvctl &= ~ESO_MIXREG_MVCTL_SPLIT; 349 mvctl |= ESO_MIXREG_MVCTL_HVIRQM; 350 eso_write_mixreg(sc, ESO_MIXREG_MVCTL, mvctl); 351 352 /* Set mixer regs to something reasonable, needs work. */ 353 sc->sc_recmon = sc->sc_spatializer = sc->sc_mvmute = 0; 354 eso_set_monooutsrc(sc, ESO_MIXREG_MPM_MOMUTE); 355 eso_set_monoinbypass(sc, 0); 356 eso_set_preamp(sc, 1); 357 for (idx = 0; idx < ESO_NGAINDEVS; idx++) { 358 int v; 359 360 switch (idx) { 361 case ESO_MIC_PLAY_VOL: 362 case ESO_LINE_PLAY_VOL: 363 case ESO_CD_PLAY_VOL: 364 case ESO_MONO_PLAY_VOL: 365 case ESO_AUXB_PLAY_VOL: 366 case ESO_DAC_REC_VOL: 367 case ESO_LINE_REC_VOL: 368 case ESO_SYNTH_REC_VOL: 369 case ESO_CD_REC_VOL: 370 case ESO_MONO_REC_VOL: 371 case ESO_AUXB_REC_VOL: 372 case ESO_SPATIALIZER: 373 v = 0; 374 break; 375 case ESO_MASTER_VOL: 376 v = ESO_GAIN_TO_6BIT(AUDIO_MAX_GAIN / 2); 377 break; 378 default: 379 v = ESO_GAIN_TO_4BIT(AUDIO_MAX_GAIN / 2); 380 break; 381 } 382 sc->sc_gain[idx][ESO_LEFT] = sc->sc_gain[idx][ESO_RIGHT] = v; 383 eso_set_gain(sc, idx); 384 } 385 386 eso_set_recsrc(sc, ESO_MIXREG_ERS_MIC); 387 388 mutex_spin_exit(&sc->sc_intr_lock); 389 390 /* Map and establish the interrupt. */ 391 if (pci_intr_map(pa, &ih)) { 392 aprint_error_dev(sc->sc_dev, "couldn't map interrupt\n"); 393 return; 394 } 395 396 intrstring = pci_intr_string(pa->pa_pc, ih); 397 sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_AUDIO, eso_intr, sc); 398 if (sc->sc_ih == NULL) { 399 aprint_error_dev(sc->sc_dev, "couldn't establish interrupt"); 400 if (intrstring != NULL) 401 aprint_error(" at %s", intrstring); 402 aprint_error("\n"); 403 mutex_destroy(&sc->sc_lock); 404 mutex_destroy(&sc->sc_intr_lock); 405 return; 406 } 407 aprint_normal_dev(sc->sc_dev, "interrupting at %s\n", 408 intrstring); 409 410 cv_init(&sc->sc_pcv, "esoho"); 411 cv_init(&sc->sc_rcv, "esohi"); 412 413 /* 414 * Set up the DDMA Control register; a suitable I/O region has been 415 * supposedly mapped in the VC base address register. 416 * 417 * The Solo-1 has an ... interesting silicon bug that causes it to 418 * not respond to I/O space accesses to the Audio 1 DMA controller 419 * if the latter's mapping base address is aligned on a 1K boundary. 420 * As a consequence, it is quite possible for the mapping provided 421 * in the VC BAR to be useless. To work around this, we defer this 422 * part until all autoconfiguration on our parent bus is completed 423 * and then try to map it ourselves in fulfillment of the constraint. 424 * 425 * According to the register map we may write to the low 16 bits 426 * only, but experimenting has shown we're safe. 427 * -kjk 428 */ 429 if (ESO_VALID_DDMAC_BASE(vcbase)) { 430 pci_conf_write(pa->pa_pc, pa->pa_tag, ESO_PCI_DDMAC, 431 vcbase | ESO_PCI_DDMAC_DE); 432 sc->sc_dmac_configured = 1; 433 434 aprint_normal_dev(sc->sc_dev, 435 "mapping Audio 1 DMA using VC I/O space at 0x%lx\n", 436 (unsigned long)vcbase); 437 } else { 438 DPRINTF(("%s: VC I/O space at 0x%lx not suitable, deferring\n", 439 device_xname(sc->sc_dev), (unsigned long)vcbase)); 440 sc->sc_pa = *pa; 441 config_defer(self, eso_defer); 442 } 443 444 audio_attach_mi(&eso_hw_if, sc, sc->sc_dev); 445 446 aa.type = AUDIODEV_TYPE_OPL; 447 aa.hwif = NULL; 448 aa.hdl = NULL; 449 (void)config_found(sc->sc_dev, &aa, audioprint); 450 451 aa.type = AUDIODEV_TYPE_MPU; 452 aa.hwif = NULL; 453 aa.hdl = NULL; 454 sc->sc_mpudev = config_found(sc->sc_dev, &aa, audioprint); 455 if (sc->sc_mpudev != NULL) { 456 /* Unmask the MPU irq. */ 457 mutex_spin_enter(&sc->sc_intr_lock); 458 mvctl = eso_read_mixreg(sc, ESO_MIXREG_MVCTL); 459 mvctl |= ESO_MIXREG_MVCTL_MPUIRQM; 460 eso_write_mixreg(sc, ESO_MIXREG_MVCTL, mvctl); 461 mutex_spin_exit(&sc->sc_intr_lock); 462 } 463 464 aa.type = AUDIODEV_TYPE_AUX; 465 aa.hwif = NULL; 466 aa.hdl = NULL; 467 (void)config_found(sc->sc_dev, &aa, eso_print); 468 } 469 470 static void 471 eso_defer(device_t self) 472 { 473 struct eso_softc *sc; 474 struct pci_attach_args *pa; 475 bus_addr_t addr, start; 476 477 sc = device_private(self); 478 pa = &sc->sc_pa; 479 aprint_normal_dev(sc->sc_dev, ""); 480 481 /* 482 * This is outright ugly, but since we must not make assumptions 483 * on the underlying allocator's behaviour it's the most straight- 484 * forward way to implement it. Note that we skip over the first 485 * 1K region, which is typically occupied by an attached ISA bus. 486 */ 487 mutex_enter(&sc->sc_lock); 488 for (start = 0x0400; start < 0xffff; start += 0x0400) { 489 if (bus_space_alloc(sc->sc_iot, 490 start + sc->sc_vcsize, start + 0x0400 - 1, 491 sc->sc_vcsize, sc->sc_vcsize, 0, 0, &addr, 492 &sc->sc_dmac_ioh) != 0) 493 continue; 494 495 mutex_spin_enter(&sc->sc_intr_lock); 496 pci_conf_write(pa->pa_pc, pa->pa_tag, ESO_PCI_DDMAC, 497 addr | ESO_PCI_DDMAC_DE); 498 mutex_spin_exit(&sc->sc_intr_lock); 499 sc->sc_dmac_iot = sc->sc_iot; 500 sc->sc_dmac_configured = 1; 501 aprint_normal("mapping Audio 1 DMA using I/O space at 0x%lx\n", 502 (unsigned long)addr); 503 504 mutex_exit(&sc->sc_lock); 505 return; 506 } 507 mutex_exit(&sc->sc_lock); 508 509 aprint_error("can't map Audio 1 DMA into I/O space\n"); 510 } 511 512 /* ARGSUSED */ 513 static int 514 eso_print(void *aux, const char *pnp) 515 { 516 517 /* Only joys can attach via this; easy. */ 518 if (pnp) 519 aprint_normal("joy at %s:", pnp); 520 521 return UNCONF; 522 } 523 524 static void 525 eso_write_cmd(struct eso_softc *sc, uint8_t cmd) 526 { 527 int i; 528 529 /* Poll for busy indicator to become clear. */ 530 for (i = 0; i < ESO_WDR_TIMEOUT; i++) { 531 if ((bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_RSR) 532 & ESO_SB_RSR_BUSY) == 0) { 533 bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, 534 ESO_SB_WDR, cmd); 535 return; 536 } else { 537 delay(10); 538 } 539 } 540 541 printf("%s: WDR timeout\n", device_xname(sc->sc_dev)); 542 return; 543 } 544 545 /* Write to a controller register */ 546 static void 547 eso_write_ctlreg(struct eso_softc *sc, uint8_t reg, uint8_t val) 548 { 549 550 /* DPRINTF(("ctlreg 0x%02x = 0x%02x\n", reg, val)); */ 551 552 eso_write_cmd(sc, reg); 553 eso_write_cmd(sc, val); 554 } 555 556 /* Read out the Read Data Register */ 557 static uint8_t 558 eso_read_rdr(struct eso_softc *sc) 559 { 560 int i; 561 562 for (i = 0; i < ESO_RDR_TIMEOUT; i++) { 563 if (bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, 564 ESO_SB_RBSR) & ESO_SB_RBSR_RDAV) { 565 return (bus_space_read_1(sc->sc_sb_iot, 566 sc->sc_sb_ioh, ESO_SB_RDR)); 567 } else { 568 delay(10); 569 } 570 } 571 572 printf("%s: RDR timeout\n", device_xname(sc->sc_dev)); 573 return (-1); 574 } 575 576 static uint8_t 577 eso_read_ctlreg(struct eso_softc *sc, uint8_t reg) 578 { 579 580 eso_write_cmd(sc, ESO_CMD_RCR); 581 eso_write_cmd(sc, reg); 582 return eso_read_rdr(sc); 583 } 584 585 static void 586 eso_write_mixreg(struct eso_softc *sc, uint8_t reg, uint8_t val) 587 { 588 589 KASSERT(mutex_owned(&sc->sc_intr_lock)); 590 591 /* DPRINTF(("mixreg 0x%02x = 0x%02x\n", reg, val)); */ 592 593 bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERADDR, reg); 594 bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERDATA, val); 595 } 596 597 static uint8_t 598 eso_read_mixreg(struct eso_softc *sc, uint8_t reg) 599 { 600 uint8_t val; 601 602 KASSERT(mutex_owned(&sc->sc_intr_lock)); 603 604 bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERADDR, reg); 605 val = bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERDATA); 606 607 return val; 608 } 609 610 static int 611 eso_intr(void *hdl) 612 { 613 struct eso_softc *sc = hdl; 614 #if NMPU > 0 615 struct mpu_softc *sc_mpu = device_private(sc->sc_mpudev); 616 #endif 617 uint8_t irqctl; 618 619 mutex_spin_enter(&sc->sc_intr_lock); 620 621 irqctl = bus_space_read_1(sc->sc_iot, sc->sc_ioh, ESO_IO_IRQCTL); 622 623 /* If it wasn't ours, that's all she wrote. */ 624 if ((irqctl & (ESO_IO_IRQCTL_A1IRQ | ESO_IO_IRQCTL_A2IRQ | 625 ESO_IO_IRQCTL_HVIRQ | ESO_IO_IRQCTL_MPUIRQ)) == 0) { 626 mutex_spin_exit(&sc->sc_intr_lock); 627 return 0; 628 } 629 630 if (irqctl & ESO_IO_IRQCTL_A1IRQ) { 631 /* Clear interrupt. */ 632 (void)bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, 633 ESO_SB_RBSR); 634 635 if (sc->sc_rintr) 636 sc->sc_rintr(sc->sc_rarg); 637 else 638 cv_broadcast(&sc->sc_rcv); 639 } 640 641 if (irqctl & ESO_IO_IRQCTL_A2IRQ) { 642 /* 643 * Clear the A2 IRQ latch: the cached value reflects the 644 * current DAC settings with the IRQ latch bit not set. 645 */ 646 eso_write_mixreg(sc, ESO_MIXREG_A2C2, sc->sc_a2c2); 647 648 if (sc->sc_pintr) 649 sc->sc_pintr(sc->sc_parg); 650 else 651 cv_broadcast(&sc->sc_pcv); 652 } 653 654 if (irqctl & ESO_IO_IRQCTL_HVIRQ) { 655 /* Clear interrupt. */ 656 eso_write_mixreg(sc, ESO_MIXREG_CHVIR, ESO_MIXREG_CHVIR_CHVIR); 657 658 /* 659 * Raise a flag to cause a lazy update of the in-softc gain 660 * values the next time the software mixer is read to keep 661 * interrupt service cost low. ~0 cannot occur otherwise 662 * as the master volume has a precision of 6 bits only. 663 */ 664 sc->sc_gain[ESO_MASTER_VOL][ESO_LEFT] = (uint8_t)~0; 665 } 666 667 #if NMPU > 0 668 if ((irqctl & ESO_IO_IRQCTL_MPUIRQ) && sc_mpu != NULL) 669 mpu_intr(sc_mpu); 670 #endif 671 672 mutex_spin_exit(&sc->sc_intr_lock); 673 return 1; 674 } 675 676 /* Perform a software reset, including DMA FIFOs. */ 677 static int 678 eso_reset(struct eso_softc *sc) 679 { 680 int i; 681 682 bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_RESET, 683 ESO_SB_RESET_SW | ESO_SB_RESET_FIFO); 684 /* `Delay' suggested in the data sheet. */ 685 (void)bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_STATUS); 686 bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_RESET, 0); 687 688 /* Wait for reset to take effect. */ 689 for (i = 0; i < ESO_RESET_TIMEOUT; i++) { 690 /* Poll for data to become available. */ 691 if ((bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, 692 ESO_SB_RBSR) & ESO_SB_RBSR_RDAV) != 0 && 693 bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, 694 ESO_SB_RDR) == ESO_SB_RDR_RESETMAGIC) { 695 696 /* Activate Solo-1 extension commands. */ 697 eso_write_cmd(sc, ESO_CMD_EXTENB); 698 /* Reset mixer registers. */ 699 eso_write_mixreg(sc, ESO_MIXREG_RESET, 700 ESO_MIXREG_RESET_RESET); 701 702 return 0; 703 } else { 704 delay(1000); 705 } 706 } 707 708 printf("%s: reset timeout\n", device_xname(sc->sc_dev)); 709 return -1; 710 } 711 712 static int 713 eso_query_encoding(void *hdl, struct audio_encoding *fp) 714 { 715 716 switch (fp->index) { 717 case 0: 718 strcpy(fp->name, AudioEulinear); 719 fp->encoding = AUDIO_ENCODING_ULINEAR; 720 fp->precision = 8; 721 fp->flags = 0; 722 break; 723 case 1: 724 strcpy(fp->name, AudioEmulaw); 725 fp->encoding = AUDIO_ENCODING_ULAW; 726 fp->precision = 8; 727 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 728 break; 729 case 2: 730 strcpy(fp->name, AudioEalaw); 731 fp->encoding = AUDIO_ENCODING_ALAW; 732 fp->precision = 8; 733 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 734 break; 735 case 3: 736 strcpy(fp->name, AudioEslinear); 737 fp->encoding = AUDIO_ENCODING_SLINEAR; 738 fp->precision = 8; 739 fp->flags = 0; 740 break; 741 case 4: 742 strcpy(fp->name, AudioEslinear_le); 743 fp->encoding = AUDIO_ENCODING_SLINEAR_LE; 744 fp->precision = 16; 745 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 746 break; 747 case 5: 748 strcpy(fp->name, AudioEulinear_le); 749 fp->encoding = AUDIO_ENCODING_ULINEAR_LE; 750 fp->precision = 16; 751 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 752 break; 753 case 6: 754 strcpy(fp->name, AudioEslinear_be); 755 fp->encoding = AUDIO_ENCODING_SLINEAR_BE; 756 fp->precision = 16; 757 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 758 break; 759 case 7: 760 strcpy(fp->name, AudioEulinear_be); 761 fp->encoding = AUDIO_ENCODING_ULINEAR_BE; 762 fp->precision = 16; 763 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 764 break; 765 default: 766 return EINVAL; 767 } 768 769 return 0; 770 } 771 772 static int 773 eso_set_params(void *hdl, int setmode, int usemode, 774 audio_params_t *play, audio_params_t *rec, stream_filter_list_t *pfil, 775 stream_filter_list_t *rfil) 776 { 777 struct eso_softc *sc; 778 struct audio_params *p; 779 stream_filter_list_t *fil; 780 int mode, r[2], rd[2], ar[2], clk; 781 unsigned int srg, fltdiv; 782 int i; 783 784 sc = hdl; 785 for (mode = AUMODE_RECORD; mode != -1; 786 mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) { 787 if ((setmode & mode) == 0) 788 continue; 789 790 p = (mode == AUMODE_PLAY) ? play : rec; 791 792 if (p->sample_rate < ESO_MINRATE || 793 p->sample_rate > ESO_MAXRATE || 794 (p->precision != 8 && p->precision != 16) || 795 (p->channels != 1 && p->channels != 2)) 796 return EINVAL; 797 798 /* 799 * We'll compute both possible sample rate dividers and pick 800 * the one with the least error. 801 */ 802 #define ABS(x) ((x) < 0 ? -(x) : (x)) 803 r[0] = ESO_CLK0 / 804 (128 - (rd[0] = 128 - ESO_CLK0 / p->sample_rate)); 805 r[1] = ESO_CLK1 / 806 (128 - (rd[1] = 128 - ESO_CLK1 / p->sample_rate)); 807 808 ar[0] = p->sample_rate - r[0]; 809 ar[1] = p->sample_rate - r[1]; 810 clk = ABS(ar[0]) > ABS(ar[1]) ? 1 : 0; 811 srg = rd[clk] | (clk == 1 ? ESO_CLK1_SELECT : 0x00); 812 813 /* Roll-off frequency of 87%, as in the ES1888 driver. */ 814 fltdiv = 256 - 200279L / r[clk]; 815 816 /* Update to reflect the possibly inexact rate. */ 817 p->sample_rate = r[clk]; 818 819 fil = (mode == AUMODE_PLAY) ? pfil : rfil; 820 i = auconv_set_converter(eso_formats, ESO_NFORMATS, 821 mode, p, FALSE, fil); 822 if (i < 0) 823 return EINVAL; 824 825 mutex_spin_enter(&sc->sc_intr_lock); 826 if (mode == AUMODE_RECORD) { 827 /* Audio 1 */ 828 DPRINTF(("A1 srg 0x%02x fdiv 0x%02x\n", srg, fltdiv)); 829 eso_write_ctlreg(sc, ESO_CTLREG_SRG, srg); 830 eso_write_ctlreg(sc, ESO_CTLREG_FLTDIV, fltdiv); 831 } else { 832 /* Audio 2 */ 833 DPRINTF(("A2 srg 0x%02x fdiv 0x%02x\n", srg, fltdiv)); 834 eso_write_mixreg(sc, ESO_MIXREG_A2SRG, srg); 835 eso_write_mixreg(sc, ESO_MIXREG_A2FLTDIV, fltdiv); 836 } 837 mutex_spin_exit(&sc->sc_intr_lock); 838 #undef ABS 839 840 } 841 842 return 0; 843 } 844 845 static int 846 eso_round_blocksize(void *hdl, int blk, int mode, 847 const audio_params_t *param) 848 { 849 850 return blk & -32; /* keep good alignment; at least 16 req'd */ 851 } 852 853 static int 854 eso_halt_output(void *hdl) 855 { 856 struct eso_softc *sc; 857 int error; 858 859 sc = hdl; 860 DPRINTF(("%s: halt_output\n", device_xname(sc->sc_dev))); 861 862 /* 863 * Disable auto-initialize DMA, allowing the FIFO to drain and then 864 * stop. The interrupt callback pointer is cleared at this 865 * point so that an outstanding FIFO interrupt for the remaining data 866 * will be acknowledged without further processing. 867 * 868 * This does not immediately `abort' an operation in progress (c.f. 869 * audio(9)) but is the method to leave the FIFO behind in a clean 870 * state with the least hair. (Besides, that item needs to be 871 * rephrased for trigger_*()-based DMA environments.) 872 */ 873 eso_write_mixreg(sc, ESO_MIXREG_A2C1, 874 ESO_MIXREG_A2C1_FIFOENB | ESO_MIXREG_A2C1_DMAENB); 875 bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAM, 876 ESO_IO_A2DMAM_DMAENB); 877 878 sc->sc_pintr = NULL; 879 mutex_exit(&sc->sc_lock); 880 error = cv_timedwait_sig(&sc->sc_pcv, &sc->sc_intr_lock, sc->sc_pdrain); 881 if (!mutex_tryenter(&sc->sc_lock)) { 882 mutex_spin_exit(&sc->sc_intr_lock); 883 mutex_enter(&sc->sc_lock); 884 mutex_spin_enter(&sc->sc_intr_lock); 885 } 886 887 /* Shut down DMA completely. */ 888 eso_write_mixreg(sc, ESO_MIXREG_A2C1, 0); 889 bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAM, 0); 890 891 return error == EWOULDBLOCK ? 0 : error; 892 } 893 894 static int 895 eso_halt_input(void *hdl) 896 { 897 struct eso_softc *sc; 898 int error; 899 900 sc = hdl; 901 DPRINTF(("%s: halt_input\n", device_xname(sc->sc_dev))); 902 903 /* Just like eso_halt_output(), but for Audio 1. */ 904 eso_write_ctlreg(sc, ESO_CTLREG_A1C2, 905 ESO_CTLREG_A1C2_READ | ESO_CTLREG_A1C2_ADC | 906 ESO_CTLREG_A1C2_DMAENB); 907 bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MODE, 908 DMA37MD_WRITE | DMA37MD_DEMAND); 909 910 sc->sc_rintr = NULL; 911 mutex_exit(&sc->sc_lock); 912 error = cv_timedwait_sig(&sc->sc_rcv, &sc->sc_intr_lock, sc->sc_rdrain); 913 if (!mutex_tryenter(&sc->sc_lock)) { 914 mutex_spin_exit(&sc->sc_intr_lock); 915 mutex_enter(&sc->sc_lock); 916 mutex_spin_enter(&sc->sc_intr_lock); 917 } 918 919 /* Shut down DMA completely. */ 920 eso_write_ctlreg(sc, ESO_CTLREG_A1C2, 921 ESO_CTLREG_A1C2_READ | ESO_CTLREG_A1C2_ADC); 922 bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MASK, 923 ESO_DMAC_MASK_MASK); 924 925 return error == EWOULDBLOCK ? 0 : error; 926 } 927 928 static int 929 eso_getdev(void *hdl, struct audio_device *retp) 930 { 931 struct eso_softc *sc; 932 933 sc = hdl; 934 strncpy(retp->name, "ESS Solo-1", sizeof (retp->name)); 935 snprintf(retp->version, sizeof (retp->version), "0x%02x", 936 sc->sc_revision); 937 if (sc->sc_revision < 938 sizeof (eso_rev2model) / sizeof (eso_rev2model[0])) 939 strncpy(retp->config, eso_rev2model[sc->sc_revision], 940 sizeof (retp->config)); 941 else 942 strncpy(retp->config, "unknown", sizeof (retp->config)); 943 944 return 0; 945 } 946 947 static int 948 eso_set_port(void *hdl, mixer_ctrl_t *cp) 949 { 950 struct eso_softc *sc; 951 unsigned int lgain, rgain; 952 uint8_t tmp; 953 int error; 954 955 sc = hdl; 956 error = 0; 957 958 mutex_spin_enter(&sc->sc_intr_lock); 959 960 switch (cp->dev) { 961 case ESO_DAC_PLAY_VOL: 962 case ESO_MIC_PLAY_VOL: 963 case ESO_LINE_PLAY_VOL: 964 case ESO_SYNTH_PLAY_VOL: 965 case ESO_CD_PLAY_VOL: 966 case ESO_AUXB_PLAY_VOL: 967 case ESO_RECORD_VOL: 968 case ESO_DAC_REC_VOL: 969 case ESO_MIC_REC_VOL: 970 case ESO_LINE_REC_VOL: 971 case ESO_SYNTH_REC_VOL: 972 case ESO_CD_REC_VOL: 973 case ESO_AUXB_REC_VOL: 974 if (cp->type != AUDIO_MIXER_VALUE) { 975 error = EINVAL; 976 break; 977 } 978 979 /* 980 * Stereo-capable mixer ports: if we get a single-channel 981 * gain value passed in, then we duplicate it to both left 982 * and right channels. 983 */ 984 switch (cp->un.value.num_channels) { 985 case 1: 986 lgain = rgain = ESO_GAIN_TO_4BIT( 987 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 988 break; 989 case 2: 990 lgain = ESO_GAIN_TO_4BIT( 991 cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT]); 992 rgain = ESO_GAIN_TO_4BIT( 993 cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]); 994 break; 995 default: 996 error = EINVAL; 997 break; 998 } 999 1000 if (!error) { 1001 sc->sc_gain[cp->dev][ESO_LEFT] = lgain; 1002 sc->sc_gain[cp->dev][ESO_RIGHT] = rgain; 1003 eso_set_gain(sc, cp->dev); 1004 } 1005 break; 1006 1007 case ESO_MASTER_VOL: 1008 if (cp->type != AUDIO_MIXER_VALUE) { 1009 error = EINVAL; 1010 break; 1011 } 1012 1013 /* Like above, but a precision of 6 bits. */ 1014 switch (cp->un.value.num_channels) { 1015 case 1: 1016 lgain = rgain = ESO_GAIN_TO_6BIT( 1017 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 1018 break; 1019 case 2: 1020 lgain = ESO_GAIN_TO_6BIT( 1021 cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT]); 1022 rgain = ESO_GAIN_TO_6BIT( 1023 cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]); 1024 break; 1025 default: 1026 error = EINVAL; 1027 break; 1028 } 1029 1030 if (!error) { 1031 sc->sc_gain[cp->dev][ESO_LEFT] = lgain; 1032 sc->sc_gain[cp->dev][ESO_RIGHT] = rgain; 1033 eso_set_gain(sc, cp->dev); 1034 } 1035 break; 1036 1037 case ESO_SPATIALIZER: 1038 if (cp->type != AUDIO_MIXER_VALUE || 1039 cp->un.value.num_channels != 1) { 1040 error = EINVAL; 1041 break; 1042 } 1043 1044 sc->sc_gain[cp->dev][ESO_LEFT] = 1045 sc->sc_gain[cp->dev][ESO_RIGHT] = 1046 ESO_GAIN_TO_6BIT( 1047 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 1048 eso_set_gain(sc, cp->dev); 1049 break; 1050 1051 case ESO_MONO_PLAY_VOL: 1052 case ESO_MONO_REC_VOL: 1053 if (cp->type != AUDIO_MIXER_VALUE || 1054 cp->un.value.num_channels != 1) { 1055 error = EINVAL; 1056 break; 1057 } 1058 1059 sc->sc_gain[cp->dev][ESO_LEFT] = 1060 sc->sc_gain[cp->dev][ESO_RIGHT] = 1061 ESO_GAIN_TO_4BIT( 1062 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 1063 eso_set_gain(sc, cp->dev); 1064 break; 1065 1066 case ESO_PCSPEAKER_VOL: 1067 if (cp->type != AUDIO_MIXER_VALUE || 1068 cp->un.value.num_channels != 1) { 1069 error = EINVAL; 1070 break; 1071 } 1072 1073 sc->sc_gain[cp->dev][ESO_LEFT] = 1074 sc->sc_gain[cp->dev][ESO_RIGHT] = 1075 ESO_GAIN_TO_3BIT( 1076 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 1077 eso_set_gain(sc, cp->dev); 1078 break; 1079 1080 case ESO_SPATIALIZER_ENABLE: 1081 if (cp->type != AUDIO_MIXER_ENUM) { 1082 error = EINVAL; 1083 break; 1084 } 1085 1086 sc->sc_spatializer = (cp->un.ord != 0); 1087 1088 tmp = eso_read_mixreg(sc, ESO_MIXREG_SPAT); 1089 if (sc->sc_spatializer) 1090 tmp |= ESO_MIXREG_SPAT_ENB; 1091 else 1092 tmp &= ~ESO_MIXREG_SPAT_ENB; 1093 eso_write_mixreg(sc, ESO_MIXREG_SPAT, 1094 tmp | ESO_MIXREG_SPAT_RSTREL); 1095 break; 1096 1097 case ESO_MASTER_MUTE: 1098 if (cp->type != AUDIO_MIXER_ENUM) { 1099 error = EINVAL; 1100 break; 1101 } 1102 1103 sc->sc_mvmute = (cp->un.ord != 0); 1104 1105 if (sc->sc_mvmute) { 1106 eso_write_mixreg(sc, ESO_MIXREG_LMVM, 1107 eso_read_mixreg(sc, ESO_MIXREG_LMVM) | 1108 ESO_MIXREG_LMVM_MUTE); 1109 eso_write_mixreg(sc, ESO_MIXREG_RMVM, 1110 eso_read_mixreg(sc, ESO_MIXREG_RMVM) | 1111 ESO_MIXREG_RMVM_MUTE); 1112 } else { 1113 eso_write_mixreg(sc, ESO_MIXREG_LMVM, 1114 eso_read_mixreg(sc, ESO_MIXREG_LMVM) & 1115 ~ESO_MIXREG_LMVM_MUTE); 1116 eso_write_mixreg(sc, ESO_MIXREG_RMVM, 1117 eso_read_mixreg(sc, ESO_MIXREG_RMVM) & 1118 ~ESO_MIXREG_RMVM_MUTE); 1119 } 1120 break; 1121 1122 case ESO_MONOOUT_SOURCE: 1123 if (cp->type != AUDIO_MIXER_ENUM) { 1124 error = EINVAL; 1125 break; 1126 } 1127 1128 error = eso_set_monooutsrc(sc, cp->un.ord); 1129 break; 1130 1131 case ESO_MONOIN_BYPASS: 1132 if (cp->type != AUDIO_MIXER_ENUM) { 1133 error = EINVAL; 1134 break; 1135 } 1136 1137 error = (eso_set_monoinbypass(sc, cp->un.ord)); 1138 break; 1139 1140 case ESO_RECORD_MONITOR: 1141 if (cp->type != AUDIO_MIXER_ENUM) { 1142 error = EINVAL; 1143 break; 1144 } 1145 1146 sc->sc_recmon = (cp->un.ord != 0); 1147 1148 tmp = eso_read_ctlreg(sc, ESO_CTLREG_ACTL); 1149 if (sc->sc_recmon) 1150 tmp |= ESO_CTLREG_ACTL_RECMON; 1151 else 1152 tmp &= ~ESO_CTLREG_ACTL_RECMON; 1153 eso_write_ctlreg(sc, ESO_CTLREG_ACTL, tmp); 1154 break; 1155 1156 case ESO_RECORD_SOURCE: 1157 if (cp->type != AUDIO_MIXER_ENUM) { 1158 error = EINVAL; 1159 break; 1160 } 1161 1162 error = eso_set_recsrc(sc, cp->un.ord); 1163 break; 1164 1165 case ESO_MIC_PREAMP: 1166 if (cp->type != AUDIO_MIXER_ENUM) { 1167 error = EINVAL; 1168 break; 1169 } 1170 1171 error = eso_set_preamp(sc, cp->un.ord); 1172 break; 1173 1174 default: 1175 error = EINVAL; 1176 break; 1177 } 1178 1179 mutex_spin_exit(&sc->sc_intr_lock); 1180 return error; 1181 } 1182 1183 static int 1184 eso_get_port(void *hdl, mixer_ctrl_t *cp) 1185 { 1186 struct eso_softc *sc; 1187 int error; 1188 1189 sc = hdl; 1190 error = 0; 1191 1192 mutex_spin_enter(&sc->sc_intr_lock); 1193 1194 switch (cp->dev) { 1195 case ESO_MASTER_VOL: 1196 /* Reload from mixer after hardware volume control use. */ 1197 if (sc->sc_gain[cp->dev][ESO_LEFT] == (uint8_t)~0) 1198 eso_reload_master_vol(sc); 1199 /* FALLTHROUGH */ 1200 case ESO_DAC_PLAY_VOL: 1201 case ESO_MIC_PLAY_VOL: 1202 case ESO_LINE_PLAY_VOL: 1203 case ESO_SYNTH_PLAY_VOL: 1204 case ESO_CD_PLAY_VOL: 1205 case ESO_AUXB_PLAY_VOL: 1206 case ESO_RECORD_VOL: 1207 case ESO_DAC_REC_VOL: 1208 case ESO_MIC_REC_VOL: 1209 case ESO_LINE_REC_VOL: 1210 case ESO_SYNTH_REC_VOL: 1211 case ESO_CD_REC_VOL: 1212 case ESO_AUXB_REC_VOL: 1213 /* 1214 * Stereo-capable ports: if a single-channel query is made, 1215 * just return the left channel's value (since single-channel 1216 * settings themselves are applied to both channels). 1217 */ 1218 switch (cp->un.value.num_channels) { 1219 case 1: 1220 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] = 1221 sc->sc_gain[cp->dev][ESO_LEFT]; 1222 break; 1223 case 2: 1224 cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = 1225 sc->sc_gain[cp->dev][ESO_LEFT]; 1226 cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = 1227 sc->sc_gain[cp->dev][ESO_RIGHT]; 1228 break; 1229 default: 1230 error = EINVAL; 1231 break; 1232 } 1233 break; 1234 1235 case ESO_MONO_PLAY_VOL: 1236 case ESO_PCSPEAKER_VOL: 1237 case ESO_MONO_REC_VOL: 1238 case ESO_SPATIALIZER: 1239 if (cp->un.value.num_channels != 1) { 1240 error = EINVAL; 1241 break; 1242 } 1243 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] = 1244 sc->sc_gain[cp->dev][ESO_LEFT]; 1245 break; 1246 1247 case ESO_RECORD_MONITOR: 1248 cp->un.ord = sc->sc_recmon; 1249 break; 1250 1251 case ESO_RECORD_SOURCE: 1252 cp->un.ord = sc->sc_recsrc; 1253 break; 1254 1255 case ESO_MONOOUT_SOURCE: 1256 cp->un.ord = sc->sc_monooutsrc; 1257 break; 1258 1259 case ESO_MONOIN_BYPASS: 1260 cp->un.ord = sc->sc_monoinbypass; 1261 break; 1262 1263 case ESO_SPATIALIZER_ENABLE: 1264 cp->un.ord = sc->sc_spatializer; 1265 break; 1266 1267 case ESO_MIC_PREAMP: 1268 cp->un.ord = sc->sc_preamp; 1269 break; 1270 1271 case ESO_MASTER_MUTE: 1272 /* Reload from mixer after hardware volume control use. */ 1273 if (sc->sc_gain[ESO_MASTER_VOL][ESO_LEFT] == (uint8_t)~0) 1274 eso_reload_master_vol(sc); 1275 cp->un.ord = sc->sc_mvmute; 1276 break; 1277 1278 default: 1279 error = EINVAL; 1280 break; 1281 } 1282 1283 mutex_spin_exit(&sc->sc_intr_lock); 1284 return 0; 1285 } 1286 1287 static int 1288 eso_query_devinfo(void *hdl, mixer_devinfo_t *dip) 1289 { 1290 1291 switch (dip->index) { 1292 case ESO_DAC_PLAY_VOL: 1293 dip->mixer_class = ESO_INPUT_CLASS; 1294 dip->next = dip->prev = AUDIO_MIXER_LAST; 1295 strcpy(dip->label.name, AudioNdac); 1296 dip->type = AUDIO_MIXER_VALUE; 1297 dip->un.v.num_channels = 2; 1298 strcpy(dip->un.v.units.name, AudioNvolume); 1299 break; 1300 case ESO_MIC_PLAY_VOL: 1301 dip->mixer_class = ESO_INPUT_CLASS; 1302 dip->next = dip->prev = AUDIO_MIXER_LAST; 1303 strcpy(dip->label.name, AudioNmicrophone); 1304 dip->type = AUDIO_MIXER_VALUE; 1305 dip->un.v.num_channels = 2; 1306 strcpy(dip->un.v.units.name, AudioNvolume); 1307 break; 1308 case ESO_LINE_PLAY_VOL: 1309 dip->mixer_class = ESO_INPUT_CLASS; 1310 dip->next = dip->prev = AUDIO_MIXER_LAST; 1311 strcpy(dip->label.name, AudioNline); 1312 dip->type = AUDIO_MIXER_VALUE; 1313 dip->un.v.num_channels = 2; 1314 strcpy(dip->un.v.units.name, AudioNvolume); 1315 break; 1316 case ESO_SYNTH_PLAY_VOL: 1317 dip->mixer_class = ESO_INPUT_CLASS; 1318 dip->next = dip->prev = AUDIO_MIXER_LAST; 1319 strcpy(dip->label.name, AudioNfmsynth); 1320 dip->type = AUDIO_MIXER_VALUE; 1321 dip->un.v.num_channels = 2; 1322 strcpy(dip->un.v.units.name, AudioNvolume); 1323 break; 1324 case ESO_MONO_PLAY_VOL: 1325 dip->mixer_class = ESO_INPUT_CLASS; 1326 dip->next = dip->prev = AUDIO_MIXER_LAST; 1327 strcpy(dip->label.name, "mono_in"); 1328 dip->type = AUDIO_MIXER_VALUE; 1329 dip->un.v.num_channels = 1; 1330 strcpy(dip->un.v.units.name, AudioNvolume); 1331 break; 1332 case ESO_CD_PLAY_VOL: 1333 dip->mixer_class = ESO_INPUT_CLASS; 1334 dip->next = dip->prev = AUDIO_MIXER_LAST; 1335 strcpy(dip->label.name, AudioNcd); 1336 dip->type = AUDIO_MIXER_VALUE; 1337 dip->un.v.num_channels = 2; 1338 strcpy(dip->un.v.units.name, AudioNvolume); 1339 break; 1340 case ESO_AUXB_PLAY_VOL: 1341 dip->mixer_class = ESO_INPUT_CLASS; 1342 dip->next = dip->prev = AUDIO_MIXER_LAST; 1343 strcpy(dip->label.name, "auxb"); 1344 dip->type = AUDIO_MIXER_VALUE; 1345 dip->un.v.num_channels = 2; 1346 strcpy(dip->un.v.units.name, AudioNvolume); 1347 break; 1348 1349 case ESO_MIC_PREAMP: 1350 dip->mixer_class = ESO_MICROPHONE_CLASS; 1351 dip->next = dip->prev = AUDIO_MIXER_LAST; 1352 strcpy(dip->label.name, AudioNpreamp); 1353 dip->type = AUDIO_MIXER_ENUM; 1354 dip->un.e.num_mem = 2; 1355 strcpy(dip->un.e.member[0].label.name, AudioNoff); 1356 dip->un.e.member[0].ord = 0; 1357 strcpy(dip->un.e.member[1].label.name, AudioNon); 1358 dip->un.e.member[1].ord = 1; 1359 break; 1360 case ESO_MICROPHONE_CLASS: 1361 dip->mixer_class = ESO_MICROPHONE_CLASS; 1362 dip->next = dip->prev = AUDIO_MIXER_LAST; 1363 strcpy(dip->label.name, AudioNmicrophone); 1364 dip->type = AUDIO_MIXER_CLASS; 1365 break; 1366 1367 case ESO_INPUT_CLASS: 1368 dip->mixer_class = ESO_INPUT_CLASS; 1369 dip->next = dip->prev = AUDIO_MIXER_LAST; 1370 strcpy(dip->label.name, AudioCinputs); 1371 dip->type = AUDIO_MIXER_CLASS; 1372 break; 1373 1374 case ESO_MASTER_VOL: 1375 dip->mixer_class = ESO_OUTPUT_CLASS; 1376 dip->prev = AUDIO_MIXER_LAST; 1377 dip->next = ESO_MASTER_MUTE; 1378 strcpy(dip->label.name, AudioNmaster); 1379 dip->type = AUDIO_MIXER_VALUE; 1380 dip->un.v.num_channels = 2; 1381 strcpy(dip->un.v.units.name, AudioNvolume); 1382 break; 1383 case ESO_MASTER_MUTE: 1384 dip->mixer_class = ESO_OUTPUT_CLASS; 1385 dip->prev = ESO_MASTER_VOL; 1386 dip->next = AUDIO_MIXER_LAST; 1387 strcpy(dip->label.name, AudioNmute); 1388 dip->type = AUDIO_MIXER_ENUM; 1389 dip->un.e.num_mem = 2; 1390 strcpy(dip->un.e.member[0].label.name, AudioNoff); 1391 dip->un.e.member[0].ord = 0; 1392 strcpy(dip->un.e.member[1].label.name, AudioNon); 1393 dip->un.e.member[1].ord = 1; 1394 break; 1395 1396 case ESO_PCSPEAKER_VOL: 1397 dip->mixer_class = ESO_OUTPUT_CLASS; 1398 dip->next = dip->prev = AUDIO_MIXER_LAST; 1399 strcpy(dip->label.name, "pc_speaker"); 1400 dip->type = AUDIO_MIXER_VALUE; 1401 dip->un.v.num_channels = 1; 1402 strcpy(dip->un.v.units.name, AudioNvolume); 1403 break; 1404 case ESO_MONOOUT_SOURCE: 1405 dip->mixer_class = ESO_OUTPUT_CLASS; 1406 dip->next = dip->prev = AUDIO_MIXER_LAST; 1407 strcpy(dip->label.name, "mono_out"); 1408 dip->type = AUDIO_MIXER_ENUM; 1409 dip->un.e.num_mem = 3; 1410 strcpy(dip->un.e.member[0].label.name, AudioNmute); 1411 dip->un.e.member[0].ord = ESO_MIXREG_MPM_MOMUTE; 1412 strcpy(dip->un.e.member[1].label.name, AudioNdac); 1413 dip->un.e.member[1].ord = ESO_MIXREG_MPM_MOA2R; 1414 strcpy(dip->un.e.member[2].label.name, AudioNmixerout); 1415 dip->un.e.member[2].ord = ESO_MIXREG_MPM_MOREC; 1416 break; 1417 1418 case ESO_MONOIN_BYPASS: 1419 dip->mixer_class = ESO_MONOIN_CLASS; 1420 dip->next = dip->prev = AUDIO_MIXER_LAST; 1421 strcpy(dip->label.name, "bypass"); 1422 dip->type = AUDIO_MIXER_ENUM; 1423 dip->un.e.num_mem = 2; 1424 strcpy(dip->un.e.member[0].label.name, AudioNoff); 1425 dip->un.e.member[0].ord = 0; 1426 strcpy(dip->un.e.member[1].label.name, AudioNon); 1427 dip->un.e.member[1].ord = 1; 1428 break; 1429 case ESO_MONOIN_CLASS: 1430 dip->mixer_class = ESO_MONOIN_CLASS; 1431 dip->next = dip->prev = AUDIO_MIXER_LAST; 1432 strcpy(dip->label.name, "mono_in"); 1433 dip->type = AUDIO_MIXER_CLASS; 1434 break; 1435 1436 case ESO_SPATIALIZER: 1437 dip->mixer_class = ESO_OUTPUT_CLASS; 1438 dip->prev = AUDIO_MIXER_LAST; 1439 dip->next = ESO_SPATIALIZER_ENABLE; 1440 strcpy(dip->label.name, AudioNspatial); 1441 dip->type = AUDIO_MIXER_VALUE; 1442 dip->un.v.num_channels = 1; 1443 strcpy(dip->un.v.units.name, "level"); 1444 break; 1445 case ESO_SPATIALIZER_ENABLE: 1446 dip->mixer_class = ESO_OUTPUT_CLASS; 1447 dip->prev = ESO_SPATIALIZER; 1448 dip->next = AUDIO_MIXER_LAST; 1449 strcpy(dip->label.name, "enable"); 1450 dip->type = AUDIO_MIXER_ENUM; 1451 dip->un.e.num_mem = 2; 1452 strcpy(dip->un.e.member[0].label.name, AudioNoff); 1453 dip->un.e.member[0].ord = 0; 1454 strcpy(dip->un.e.member[1].label.name, AudioNon); 1455 dip->un.e.member[1].ord = 1; 1456 break; 1457 1458 case ESO_OUTPUT_CLASS: 1459 dip->mixer_class = ESO_OUTPUT_CLASS; 1460 dip->next = dip->prev = AUDIO_MIXER_LAST; 1461 strcpy(dip->label.name, AudioCoutputs); 1462 dip->type = AUDIO_MIXER_CLASS; 1463 break; 1464 1465 case ESO_RECORD_MONITOR: 1466 dip->mixer_class = ESO_MONITOR_CLASS; 1467 dip->next = dip->prev = AUDIO_MIXER_LAST; 1468 strcpy(dip->label.name, AudioNmute); 1469 dip->type = AUDIO_MIXER_ENUM; 1470 dip->un.e.num_mem = 2; 1471 strcpy(dip->un.e.member[0].label.name, AudioNoff); 1472 dip->un.e.member[0].ord = 0; 1473 strcpy(dip->un.e.member[1].label.name, AudioNon); 1474 dip->un.e.member[1].ord = 1; 1475 break; 1476 case ESO_MONITOR_CLASS: 1477 dip->mixer_class = ESO_MONITOR_CLASS; 1478 dip->next = dip->prev = AUDIO_MIXER_LAST; 1479 strcpy(dip->label.name, AudioCmonitor); 1480 dip->type = AUDIO_MIXER_CLASS; 1481 break; 1482 1483 case ESO_RECORD_VOL: 1484 dip->mixer_class = ESO_RECORD_CLASS; 1485 dip->next = dip->prev = AUDIO_MIXER_LAST; 1486 strcpy(dip->label.name, AudioNrecord); 1487 dip->type = AUDIO_MIXER_VALUE; 1488 strcpy(dip->un.v.units.name, AudioNvolume); 1489 break; 1490 case ESO_RECORD_SOURCE: 1491 dip->mixer_class = ESO_RECORD_CLASS; 1492 dip->next = dip->prev = AUDIO_MIXER_LAST; 1493 strcpy(dip->label.name, AudioNsource); 1494 dip->type = AUDIO_MIXER_ENUM; 1495 dip->un.e.num_mem = 4; 1496 strcpy(dip->un.e.member[0].label.name, AudioNmicrophone); 1497 dip->un.e.member[0].ord = ESO_MIXREG_ERS_MIC; 1498 strcpy(dip->un.e.member[1].label.name, AudioNline); 1499 dip->un.e.member[1].ord = ESO_MIXREG_ERS_LINE; 1500 strcpy(dip->un.e.member[2].label.name, AudioNcd); 1501 dip->un.e.member[2].ord = ESO_MIXREG_ERS_CD; 1502 strcpy(dip->un.e.member[3].label.name, AudioNmixerout); 1503 dip->un.e.member[3].ord = ESO_MIXREG_ERS_MIXER; 1504 break; 1505 case ESO_DAC_REC_VOL: 1506 dip->mixer_class = ESO_RECORD_CLASS; 1507 dip->next = dip->prev = AUDIO_MIXER_LAST; 1508 strcpy(dip->label.name, AudioNdac); 1509 dip->type = AUDIO_MIXER_VALUE; 1510 dip->un.v.num_channels = 2; 1511 strcpy(dip->un.v.units.name, AudioNvolume); 1512 break; 1513 case ESO_MIC_REC_VOL: 1514 dip->mixer_class = ESO_RECORD_CLASS; 1515 dip->next = dip->prev = AUDIO_MIXER_LAST; 1516 strcpy(dip->label.name, AudioNmicrophone); 1517 dip->type = AUDIO_MIXER_VALUE; 1518 dip->un.v.num_channels = 2; 1519 strcpy(dip->un.v.units.name, AudioNvolume); 1520 break; 1521 case ESO_LINE_REC_VOL: 1522 dip->mixer_class = ESO_RECORD_CLASS; 1523 dip->next = dip->prev = AUDIO_MIXER_LAST; 1524 strcpy(dip->label.name, AudioNline); 1525 dip->type = AUDIO_MIXER_VALUE; 1526 dip->un.v.num_channels = 2; 1527 strcpy(dip->un.v.units.name, AudioNvolume); 1528 break; 1529 case ESO_SYNTH_REC_VOL: 1530 dip->mixer_class = ESO_RECORD_CLASS; 1531 dip->next = dip->prev = AUDIO_MIXER_LAST; 1532 strcpy(dip->label.name, AudioNfmsynth); 1533 dip->type = AUDIO_MIXER_VALUE; 1534 dip->un.v.num_channels = 2; 1535 strcpy(dip->un.v.units.name, AudioNvolume); 1536 break; 1537 case ESO_MONO_REC_VOL: 1538 dip->mixer_class = ESO_RECORD_CLASS; 1539 dip->next = dip->prev = AUDIO_MIXER_LAST; 1540 strcpy(dip->label.name, "mono_in"); 1541 dip->type = AUDIO_MIXER_VALUE; 1542 dip->un.v.num_channels = 1; /* No lies */ 1543 strcpy(dip->un.v.units.name, AudioNvolume); 1544 break; 1545 case ESO_CD_REC_VOL: 1546 dip->mixer_class = ESO_RECORD_CLASS; 1547 dip->next = dip->prev = AUDIO_MIXER_LAST; 1548 strcpy(dip->label.name, AudioNcd); 1549 dip->type = AUDIO_MIXER_VALUE; 1550 dip->un.v.num_channels = 2; 1551 strcpy(dip->un.v.units.name, AudioNvolume); 1552 break; 1553 case ESO_AUXB_REC_VOL: 1554 dip->mixer_class = ESO_RECORD_CLASS; 1555 dip->next = dip->prev = AUDIO_MIXER_LAST; 1556 strcpy(dip->label.name, "auxb"); 1557 dip->type = AUDIO_MIXER_VALUE; 1558 dip->un.v.num_channels = 2; 1559 strcpy(dip->un.v.units.name, AudioNvolume); 1560 break; 1561 case ESO_RECORD_CLASS: 1562 dip->mixer_class = ESO_RECORD_CLASS; 1563 dip->next = dip->prev = AUDIO_MIXER_LAST; 1564 strcpy(dip->label.name, AudioCrecord); 1565 dip->type = AUDIO_MIXER_CLASS; 1566 break; 1567 1568 default: 1569 return ENXIO; 1570 } 1571 1572 return 0; 1573 } 1574 1575 static int 1576 eso_allocmem(struct eso_softc *sc, size_t size, size_t align, 1577 size_t boundary, int direction, struct eso_dma *ed) 1578 { 1579 int error; 1580 1581 ed->ed_size = size; 1582 1583 error = bus_dmamem_alloc(ed->ed_dmat, ed->ed_size, align, boundary, 1584 ed->ed_segs, sizeof (ed->ed_segs) / sizeof (ed->ed_segs[0]), 1585 &ed->ed_nsegs, BUS_DMA_WAITOK); 1586 if (error) 1587 goto out; 1588 1589 error = bus_dmamem_map(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs, 1590 ed->ed_size, &ed->ed_kva, BUS_DMA_WAITOK | BUS_DMA_COHERENT); 1591 if (error) 1592 goto free; 1593 1594 error = bus_dmamap_create(ed->ed_dmat, ed->ed_size, 1, ed->ed_size, 0, 1595 BUS_DMA_WAITOK, &ed->ed_map); 1596 if (error) 1597 goto unmap; 1598 1599 error = bus_dmamap_load(ed->ed_dmat, ed->ed_map, ed->ed_kva, 1600 ed->ed_size, NULL, BUS_DMA_WAITOK | 1601 (direction == AUMODE_RECORD) ? BUS_DMA_READ : BUS_DMA_WRITE); 1602 if (error) 1603 goto destroy; 1604 1605 return 0; 1606 1607 destroy: 1608 bus_dmamap_destroy(ed->ed_dmat, ed->ed_map); 1609 unmap: 1610 bus_dmamem_unmap(ed->ed_dmat, ed->ed_kva, ed->ed_size); 1611 free: 1612 bus_dmamem_free(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs); 1613 out: 1614 return error; 1615 } 1616 1617 static void 1618 eso_freemem(struct eso_dma *ed) 1619 { 1620 1621 bus_dmamap_unload(ed->ed_dmat, ed->ed_map); 1622 bus_dmamap_destroy(ed->ed_dmat, ed->ed_map); 1623 bus_dmamem_unmap(ed->ed_dmat, ed->ed_kva, ed->ed_size); 1624 bus_dmamem_free(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs); 1625 } 1626 1627 static struct eso_dma * 1628 eso_kva2dma(const struct eso_softc *sc, const void *kva) 1629 { 1630 struct eso_dma *p; 1631 1632 SLIST_FOREACH(p, &sc->sc_dmas, ed_slist) { 1633 if (KVADDR(p) == kva) 1634 return p; 1635 } 1636 1637 panic("%s: kva2dma: bad kva: %p", device_xname(sc->sc_dev), kva); 1638 /* NOTREACHED */ 1639 } 1640 1641 static void * 1642 eso_allocm(void *hdl, int direction, size_t size) 1643 { 1644 struct eso_softc *sc; 1645 struct eso_dma *ed; 1646 size_t boundary; 1647 int error; 1648 1649 sc = hdl; 1650 if ((ed = kmem_alloc(sizeof (*ed), KM_SLEEP)) == NULL) 1651 return NULL; 1652 1653 /* 1654 * Apparently the Audio 1 DMA controller's current address 1655 * register can't roll over a 64K address boundary, so we have to 1656 * take care of that ourselves. Similarly, the Audio 2 DMA 1657 * controller needs a 1M address boundary. 1658 */ 1659 if (direction == AUMODE_RECORD) 1660 boundary = 0x10000; 1661 else 1662 boundary = 0x100000; 1663 1664 /* 1665 * XXX Work around allocation problems for Audio 1, which 1666 * XXX implements the 24 low address bits only, with 1667 * XXX machine-specific DMA tag use. 1668 */ 1669 #ifdef alpha 1670 /* 1671 * XXX Force allocation through the (ISA) SGMAP. 1672 */ 1673 if (direction == AUMODE_RECORD) 1674 ed->ed_dmat = alphabus_dma_get_tag(sc->sc_dmat, ALPHA_BUS_ISA); 1675 else 1676 #elif defined(amd64) || defined(i386) 1677 /* 1678 * XXX Force allocation through the ISA DMA tag. 1679 */ 1680 if (direction == AUMODE_RECORD) 1681 ed->ed_dmat = &isa_bus_dma_tag; 1682 else 1683 #endif 1684 ed->ed_dmat = sc->sc_dmat; 1685 1686 error = eso_allocmem(sc, size, 32, boundary, direction, ed); 1687 if (error) { 1688 kmem_free(ed, sizeof(*ed)); 1689 return NULL; 1690 } 1691 SLIST_INSERT_HEAD(&sc->sc_dmas, ed, ed_slist); 1692 1693 return KVADDR(ed); 1694 } 1695 1696 static void 1697 eso_freem(void *hdl, void *addr, size_t size) 1698 { 1699 struct eso_softc *sc; 1700 struct eso_dma *p; 1701 1702 sc = hdl; 1703 p = eso_kva2dma(sc, addr); 1704 1705 SLIST_REMOVE(&sc->sc_dmas, p, eso_dma, ed_slist); 1706 eso_freemem(p); 1707 kmem_free(p, sizeof(*p)); 1708 } 1709 1710 static size_t 1711 eso_round_buffersize(void *hdl, int direction, size_t bufsize) 1712 { 1713 size_t maxsize; 1714 1715 /* 1716 * The playback DMA buffer size on the Solo-1 is limited to 0xfff0 1717 * bytes. This is because IO_A2DMAC is a two byte value 1718 * indicating the literal byte count, and the 4 least significant 1719 * bits are read-only. Zero is not used as a special case for 1720 * 0x10000. 1721 * 1722 * For recording, DMAC_DMAC is the byte count - 1, so 0x10000 can 1723 * be represented. 1724 */ 1725 maxsize = (direction == AUMODE_PLAY) ? 0xfff0 : 0x10000; 1726 1727 if (bufsize > maxsize) 1728 bufsize = maxsize; 1729 1730 return bufsize; 1731 } 1732 1733 static paddr_t 1734 eso_mappage(void *hdl, void *addr, off_t offs, int prot) 1735 { 1736 struct eso_softc *sc; 1737 struct eso_dma *ed; 1738 1739 sc = hdl; 1740 if (offs < 0) 1741 return -1; 1742 ed = eso_kva2dma(sc, addr); 1743 1744 return bus_dmamem_mmap(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs, 1745 offs, prot, BUS_DMA_WAITOK); 1746 } 1747 1748 /* ARGSUSED */ 1749 static int 1750 eso_get_props(void *hdl) 1751 { 1752 1753 return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT | 1754 AUDIO_PROP_FULLDUPLEX; 1755 } 1756 1757 static int 1758 eso_trigger_output(void *hdl, void *start, void *end, int blksize, 1759 void (*intr)(void *), void *arg, const audio_params_t *param) 1760 { 1761 struct eso_softc *sc; 1762 struct eso_dma *ed; 1763 uint8_t a2c1; 1764 1765 sc = hdl; 1766 DPRINTF(( 1767 "%s: trigger_output: start %p, end %p, blksize %d, intr %p(%p)\n", 1768 device_xname(sc->sc_dev), start, end, blksize, intr, arg)); 1769 DPRINTF(("%s: param: rate %u, encoding %u, precision %u, channels %u\n", 1770 device_xname(sc->sc_dev), param->sample_rate, param->encoding, 1771 param->precision, param->channels)); 1772 1773 /* Find DMA buffer. */ 1774 ed = eso_kva2dma(sc, start); 1775 DPRINTF(("%s: dmaaddr %lx\n", 1776 device_xname(sc->sc_dev), (unsigned long)DMAADDR(ed))); 1777 1778 sc->sc_pintr = intr; 1779 sc->sc_parg = arg; 1780 1781 /* Compute drain timeout. */ 1782 sc->sc_pdrain = (blksize * NBBY * hz) / 1783 (param->sample_rate * param->channels * 1784 param->precision) + 2; /* slop */ 1785 1786 /* DMA transfer count (in `words'!) reload using 2's complement. */ 1787 blksize = -(blksize >> 1); 1788 eso_write_mixreg(sc, ESO_MIXREG_A2TCRLO, blksize & 0xff); 1789 eso_write_mixreg(sc, ESO_MIXREG_A2TCRHI, blksize >> 8); 1790 1791 /* Update DAC to reflect DMA count and audio parameters. */ 1792 /* Note: we cache A2C2 in order to avoid r/m/w at interrupt time. */ 1793 if (param->precision == 16) 1794 sc->sc_a2c2 |= ESO_MIXREG_A2C2_16BIT; 1795 else 1796 sc->sc_a2c2 &= ~ESO_MIXREG_A2C2_16BIT; 1797 if (param->channels == 2) 1798 sc->sc_a2c2 |= ESO_MIXREG_A2C2_STEREO; 1799 else 1800 sc->sc_a2c2 &= ~ESO_MIXREG_A2C2_STEREO; 1801 if (param->encoding == AUDIO_ENCODING_SLINEAR_BE || 1802 param->encoding == AUDIO_ENCODING_SLINEAR_LE) 1803 sc->sc_a2c2 |= ESO_MIXREG_A2C2_SIGNED; 1804 else 1805 sc->sc_a2c2 &= ~ESO_MIXREG_A2C2_SIGNED; 1806 /* Unmask IRQ. */ 1807 sc->sc_a2c2 |= ESO_MIXREG_A2C2_IRQM; 1808 eso_write_mixreg(sc, ESO_MIXREG_A2C2, sc->sc_a2c2); 1809 1810 /* Set up DMA controller. */ 1811 bus_space_write_4(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAA, 1812 DMAADDR(ed)); 1813 bus_space_write_2(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAC, 1814 (uint8_t *)end - (uint8_t *)start); 1815 bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAM, 1816 ESO_IO_A2DMAM_DMAENB | ESO_IO_A2DMAM_AUTO); 1817 1818 /* Start DMA. */ 1819 a2c1 = eso_read_mixreg(sc, ESO_MIXREG_A2C1); 1820 a2c1 &= ~ESO_MIXREG_A2C1_RESV0; /* Paranoia? XXX bit 5 */ 1821 a2c1 |= ESO_MIXREG_A2C1_FIFOENB | ESO_MIXREG_A2C1_DMAENB | 1822 ESO_MIXREG_A2C1_AUTO; 1823 eso_write_mixreg(sc, ESO_MIXREG_A2C1, a2c1); 1824 1825 return 0; 1826 } 1827 1828 static int 1829 eso_trigger_input(void *hdl, void *start, void *end, int blksize, 1830 void (*intr)(void *), void *arg, const audio_params_t *param) 1831 { 1832 struct eso_softc *sc; 1833 struct eso_dma *ed; 1834 uint8_t actl, a1c1; 1835 1836 sc = hdl; 1837 DPRINTF(( 1838 "%s: trigger_input: start %p, end %p, blksize %d, intr %p(%p)\n", 1839 device_xname(sc->sc_dev), start, end, blksize, intr, arg)); 1840 DPRINTF(("%s: param: rate %u, encoding %u, precision %u, channels %u\n", 1841 device_xname(sc->sc_dev), param->sample_rate, param->encoding, 1842 param->precision, param->channels)); 1843 1844 /* 1845 * If we failed to configure the Audio 1 DMA controller, bail here 1846 * while retaining availability of the DAC direction (in Audio 2). 1847 */ 1848 if (!sc->sc_dmac_configured) 1849 return EIO; 1850 1851 /* Find DMA buffer. */ 1852 ed = eso_kva2dma(sc, start); 1853 DPRINTF(("%s: dmaaddr %lx\n", 1854 device_xname(sc->sc_dev), (unsigned long)DMAADDR(ed))); 1855 1856 sc->sc_rintr = intr; 1857 sc->sc_rarg = arg; 1858 1859 /* Compute drain timeout. */ 1860 sc->sc_rdrain = (blksize * NBBY * hz) / 1861 (param->sample_rate * param->channels * 1862 param->precision) + 2; /* slop */ 1863 1864 /* Set up ADC DMA converter parameters. */ 1865 actl = eso_read_ctlreg(sc, ESO_CTLREG_ACTL); 1866 if (param->channels == 2) { 1867 actl &= ~ESO_CTLREG_ACTL_MONO; 1868 actl |= ESO_CTLREG_ACTL_STEREO; 1869 } else { 1870 actl &= ~ESO_CTLREG_ACTL_STEREO; 1871 actl |= ESO_CTLREG_ACTL_MONO; 1872 } 1873 eso_write_ctlreg(sc, ESO_CTLREG_ACTL, actl); 1874 1875 /* Set up Transfer Type: maybe move to attach time? */ 1876 eso_write_ctlreg(sc, ESO_CTLREG_A1TT, ESO_CTLREG_A1TT_DEMAND4); 1877 1878 /* DMA transfer count reload using 2's complement. */ 1879 blksize = -blksize; 1880 eso_write_ctlreg(sc, ESO_CTLREG_A1TCRLO, blksize & 0xff); 1881 eso_write_ctlreg(sc, ESO_CTLREG_A1TCRHI, blksize >> 8); 1882 1883 /* Set up and enable Audio 1 DMA FIFO. */ 1884 a1c1 = ESO_CTLREG_A1C1_RESV1 | ESO_CTLREG_A1C1_FIFOENB; 1885 if (param->precision == 16) 1886 a1c1 |= ESO_CTLREG_A1C1_16BIT; 1887 if (param->channels == 2) 1888 a1c1 |= ESO_CTLREG_A1C1_STEREO; 1889 else 1890 a1c1 |= ESO_CTLREG_A1C1_MONO; 1891 if (param->encoding == AUDIO_ENCODING_SLINEAR_BE || 1892 param->encoding == AUDIO_ENCODING_SLINEAR_LE) 1893 a1c1 |= ESO_CTLREG_A1C1_SIGNED; 1894 eso_write_ctlreg(sc, ESO_CTLREG_A1C1, a1c1); 1895 1896 /* Set up ADC IRQ/DRQ parameters. */ 1897 eso_write_ctlreg(sc, ESO_CTLREG_LAIC, 1898 ESO_CTLREG_LAIC_PINENB | ESO_CTLREG_LAIC_EXTENB); 1899 eso_write_ctlreg(sc, ESO_CTLREG_DRQCTL, 1900 ESO_CTLREG_DRQCTL_ENB1 | ESO_CTLREG_DRQCTL_EXTENB); 1901 1902 /* Set up and enable DMA controller. */ 1903 bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_CLEAR, 0); 1904 bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MASK, 1905 ESO_DMAC_MASK_MASK); 1906 bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MODE, 1907 DMA37MD_WRITE | DMA37MD_LOOP | DMA37MD_DEMAND); 1908 bus_space_write_4(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_DMAA, 1909 DMAADDR(ed)); 1910 bus_space_write_2(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_DMAC, 1911 (uint8_t *)end - (uint8_t *)start - 1); 1912 bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MASK, 0); 1913 1914 /* Start DMA. */ 1915 eso_write_ctlreg(sc, ESO_CTLREG_A1C2, 1916 ESO_CTLREG_A1C2_DMAENB | ESO_CTLREG_A1C2_READ | 1917 ESO_CTLREG_A1C2_AUTO | ESO_CTLREG_A1C2_ADC); 1918 1919 return 0; 1920 } 1921 1922 1923 static void 1924 eso_get_locks(void *addr, kmutex_t **intr, kmutex_t **thread) 1925 { 1926 struct eso_softc *sc; 1927 1928 sc = addr; 1929 *intr = &sc->sc_intr_lock; 1930 *thread = &sc->sc_lock; 1931 } 1932 1933 /* 1934 * Mixer utility functions. 1935 */ 1936 static int 1937 eso_set_recsrc(struct eso_softc *sc, unsigned int recsrc) 1938 { 1939 mixer_devinfo_t di; 1940 int i; 1941 1942 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1943 1944 di.index = ESO_RECORD_SOURCE; 1945 if (eso_query_devinfo(sc, &di) != 0) 1946 panic("eso_set_recsrc: eso_query_devinfo failed"); 1947 1948 for (i = 0; i < di.un.e.num_mem; i++) { 1949 if (recsrc == di.un.e.member[i].ord) { 1950 eso_write_mixreg(sc, ESO_MIXREG_ERS, recsrc); 1951 sc->sc_recsrc = recsrc; 1952 return 0; 1953 } 1954 } 1955 1956 return EINVAL; 1957 } 1958 1959 static int 1960 eso_set_monooutsrc(struct eso_softc *sc, unsigned int monooutsrc) 1961 { 1962 mixer_devinfo_t di; 1963 int i; 1964 uint8_t mpm; 1965 1966 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1967 1968 di.index = ESO_MONOOUT_SOURCE; 1969 if (eso_query_devinfo(sc, &di) != 0) 1970 panic("eso_set_monooutsrc: eso_query_devinfo failed"); 1971 1972 for (i = 0; i < di.un.e.num_mem; i++) { 1973 if (monooutsrc == di.un.e.member[i].ord) { 1974 mpm = eso_read_mixreg(sc, ESO_MIXREG_MPM); 1975 mpm &= ~ESO_MIXREG_MPM_MOMASK; 1976 mpm |= monooutsrc; 1977 eso_write_mixreg(sc, ESO_MIXREG_MPM, mpm); 1978 sc->sc_monooutsrc = monooutsrc; 1979 return 0; 1980 } 1981 } 1982 1983 return EINVAL; 1984 } 1985 1986 static int 1987 eso_set_monoinbypass(struct eso_softc *sc, unsigned int monoinbypass) 1988 { 1989 mixer_devinfo_t di; 1990 int i; 1991 uint8_t mpm; 1992 1993 KASSERT(mutex_owned(&sc->sc_intr_lock)); 1994 1995 di.index = ESO_MONOIN_BYPASS; 1996 if (eso_query_devinfo(sc, &di) != 0) 1997 panic("eso_set_monoinbypass: eso_query_devinfo failed"); 1998 1999 for (i = 0; i < di.un.e.num_mem; i++) { 2000 if (monoinbypass == di.un.e.member[i].ord) { 2001 mpm = eso_read_mixreg(sc, ESO_MIXREG_MPM); 2002 mpm &= ~(ESO_MIXREG_MPM_MOMASK | ESO_MIXREG_MPM_RESV0); 2003 mpm |= (monoinbypass ? ESO_MIXREG_MPM_MIBYPASS : 0); 2004 eso_write_mixreg(sc, ESO_MIXREG_MPM, mpm); 2005 sc->sc_monoinbypass = monoinbypass; 2006 return 0; 2007 } 2008 } 2009 2010 return EINVAL; 2011 } 2012 2013 static int 2014 eso_set_preamp(struct eso_softc *sc, unsigned int preamp) 2015 { 2016 mixer_devinfo_t di; 2017 int i; 2018 uint8_t mpm; 2019 2020 KASSERT(mutex_owned(&sc->sc_intr_lock)); 2021 2022 di.index = ESO_MIC_PREAMP; 2023 if (eso_query_devinfo(sc, &di) != 0) 2024 panic("eso_set_preamp: eso_query_devinfo failed"); 2025 2026 for (i = 0; i < di.un.e.num_mem; i++) { 2027 if (preamp == di.un.e.member[i].ord) { 2028 mpm = eso_read_mixreg(sc, ESO_MIXREG_MPM); 2029 mpm &= ~(ESO_MIXREG_MPM_PREAMP | ESO_MIXREG_MPM_RESV0); 2030 mpm |= (preamp ? ESO_MIXREG_MPM_PREAMP : 0); 2031 eso_write_mixreg(sc, ESO_MIXREG_MPM, mpm); 2032 sc->sc_preamp = preamp; 2033 return 0; 2034 } 2035 } 2036 2037 return EINVAL; 2038 } 2039 2040 /* 2041 * Reload Master Volume and Mute values in softc from mixer; used when 2042 * those have previously been invalidated by use of hardware volume controls. 2043 */ 2044 static void 2045 eso_reload_master_vol(struct eso_softc *sc) 2046 { 2047 uint8_t mv; 2048 2049 KASSERT(mutex_owned(&sc->sc_intr_lock)); 2050 2051 mv = eso_read_mixreg(sc, ESO_MIXREG_LMVM); 2052 sc->sc_gain[ESO_MASTER_VOL][ESO_LEFT] = 2053 (mv & ~ESO_MIXREG_LMVM_MUTE) << 2; 2054 mv = eso_read_mixreg(sc, ESO_MIXREG_LMVM); 2055 sc->sc_gain[ESO_MASTER_VOL][ESO_RIGHT] = 2056 (mv & ~ESO_MIXREG_RMVM_MUTE) << 2; 2057 /* Currently both channels are muted simultaneously; either is OK. */ 2058 sc->sc_mvmute = (mv & ESO_MIXREG_RMVM_MUTE) != 0; 2059 } 2060 2061 static void 2062 eso_set_gain(struct eso_softc *sc, unsigned int port) 2063 { 2064 uint8_t mixreg, tmp; 2065 2066 KASSERT(mutex_owned(&sc->sc_intr_lock)); 2067 2068 switch (port) { 2069 case ESO_DAC_PLAY_VOL: 2070 mixreg = ESO_MIXREG_PVR_A2; 2071 break; 2072 case ESO_MIC_PLAY_VOL: 2073 mixreg = ESO_MIXREG_PVR_MIC; 2074 break; 2075 case ESO_LINE_PLAY_VOL: 2076 mixreg = ESO_MIXREG_PVR_LINE; 2077 break; 2078 case ESO_SYNTH_PLAY_VOL: 2079 mixreg = ESO_MIXREG_PVR_SYNTH; 2080 break; 2081 case ESO_CD_PLAY_VOL: 2082 mixreg = ESO_MIXREG_PVR_CD; 2083 break; 2084 case ESO_AUXB_PLAY_VOL: 2085 mixreg = ESO_MIXREG_PVR_AUXB; 2086 break; 2087 2088 case ESO_DAC_REC_VOL: 2089 mixreg = ESO_MIXREG_RVR_A2; 2090 break; 2091 case ESO_MIC_REC_VOL: 2092 mixreg = ESO_MIXREG_RVR_MIC; 2093 break; 2094 case ESO_LINE_REC_VOL: 2095 mixreg = ESO_MIXREG_RVR_LINE; 2096 break; 2097 case ESO_SYNTH_REC_VOL: 2098 mixreg = ESO_MIXREG_RVR_SYNTH; 2099 break; 2100 case ESO_CD_REC_VOL: 2101 mixreg = ESO_MIXREG_RVR_CD; 2102 break; 2103 case ESO_AUXB_REC_VOL: 2104 mixreg = ESO_MIXREG_RVR_AUXB; 2105 break; 2106 case ESO_MONO_PLAY_VOL: 2107 mixreg = ESO_MIXREG_PVR_MONO; 2108 break; 2109 case ESO_MONO_REC_VOL: 2110 mixreg = ESO_MIXREG_RVR_MONO; 2111 break; 2112 2113 case ESO_PCSPEAKER_VOL: 2114 /* Special case - only 3-bit, mono, and reserved bits. */ 2115 tmp = eso_read_mixreg(sc, ESO_MIXREG_PCSVR); 2116 tmp &= ESO_MIXREG_PCSVR_RESV; 2117 /* Map bits 7:5 -> 2:0. */ 2118 tmp |= (sc->sc_gain[port][ESO_LEFT] >> 5); 2119 eso_write_mixreg(sc, ESO_MIXREG_PCSVR, tmp); 2120 return; 2121 2122 case ESO_MASTER_VOL: 2123 /* Special case - separate regs, and 6-bit precision. */ 2124 /* Map bits 7:2 -> 5:0, reflect mute settings. */ 2125 eso_write_mixreg(sc, ESO_MIXREG_LMVM, 2126 (sc->sc_gain[port][ESO_LEFT] >> 2) | 2127 (sc->sc_mvmute ? ESO_MIXREG_LMVM_MUTE : 0x00)); 2128 eso_write_mixreg(sc, ESO_MIXREG_RMVM, 2129 (sc->sc_gain[port][ESO_RIGHT] >> 2) | 2130 (sc->sc_mvmute ? ESO_MIXREG_RMVM_MUTE : 0x00)); 2131 return; 2132 2133 case ESO_SPATIALIZER: 2134 /* Special case - only `mono', and higher precision. */ 2135 eso_write_mixreg(sc, ESO_MIXREG_SPATLVL, 2136 sc->sc_gain[port][ESO_LEFT]); 2137 return; 2138 2139 case ESO_RECORD_VOL: 2140 /* Very Special case, controller register. */ 2141 eso_write_ctlreg(sc, ESO_CTLREG_RECLVL,ESO_4BIT_GAIN_TO_STEREO( 2142 sc->sc_gain[port][ESO_LEFT], sc->sc_gain[port][ESO_RIGHT])); 2143 return; 2144 2145 default: 2146 #ifdef DIAGNOSTIC 2147 panic("eso_set_gain: bad port %u", port); 2148 /* NOTREACHED */ 2149 #else 2150 return; 2151 #endif 2152 } 2153 2154 eso_write_mixreg(sc, mixreg, ESO_4BIT_GAIN_TO_STEREO( 2155 sc->sc_gain[port][ESO_LEFT], sc->sc_gain[port][ESO_RIGHT])); 2156 } 2157