1 /* $NetBSD: ess.c,v 1.46 1999/06/18 20:25:23 augustss Exp $ */ 2 3 /* 4 * Copyright 1997 5 * Digital Equipment Corporation. All rights reserved. 6 * 7 * This software is furnished under license and may be used and 8 * copied only in accordance with the following terms and conditions. 9 * Subject to these conditions, you may download, copy, install, 10 * use, modify and distribute this software in source and/or binary 11 * form. No title or ownership is transferred hereby. 12 * 13 * 1) Any source code used, modified or distributed must reproduce 14 * and retain this copyright notice and list of conditions as 15 * they appear in the source file. 16 * 17 * 2) No right is granted to use any trade name, trademark, or logo of 18 * Digital Equipment Corporation. Neither the "Digital Equipment 19 * Corporation" name nor any trademark or logo of Digital Equipment 20 * Corporation may be used to endorse or promote products derived 21 * from this software without the prior written permission of 22 * Digital Equipment Corporation. 23 * 24 * 3) This software is provided "AS-IS" and any express or implied 25 * warranties, including but not limited to, any implied warranties 26 * of merchantability, fitness for a particular purpose, or 27 * non-infringement are disclaimed. In no event shall DIGITAL be 28 * liable for any damages whatsoever, and in particular, DIGITAL 29 * shall not be liable for special, indirect, consequential, or 30 * incidental damages or damages for lost profits, loss of 31 * revenue or loss of use, whether such damages arise in contract, 32 * negligence, tort, under statute, in equity, at law or otherwise, 33 * even if advised of the possibility of such damage. 34 */ 35 36 /* 37 **++ 38 ** 39 ** ess.c 40 ** 41 ** FACILITY: 42 ** 43 ** DIGITAL Network Appliance Reference Design (DNARD) 44 ** 45 ** MODULE DESCRIPTION: 46 ** 47 ** This module contains the device driver for the ESS 48 ** Technologies 1888/1887/888 sound chip. The code in sbdsp.c was 49 ** used as a reference point when implementing this driver. 50 ** 51 ** AUTHORS: 52 ** 53 ** Blair Fidler Software Engineering Australia 54 ** Gold Coast, Australia. 55 ** 56 ** CREATION DATE: 57 ** 58 ** March 10, 1997. 59 ** 60 ** MODIFICATION HISTORY: 61 ** 62 ** Heavily modified by Lennart Augustsson and Charles M. Hannum for 63 ** bus_dma, changes to audio interface, and many bug fixes. 64 ** ESS1788 support by Nathan J. Williams and Charles M. Hannum. 65 **-- 66 */ 67 68 #include <sys/param.h> 69 #include <sys/systm.h> 70 #include <sys/errno.h> 71 #include <sys/ioctl.h> 72 #include <sys/syslog.h> 73 #include <sys/device.h> 74 #include <sys/proc.h> 75 #include <sys/kernel.h> 76 77 #include <machine/cpu.h> 78 #include <machine/intr.h> 79 #include <machine/bus.h> 80 81 #include <sys/audioio.h> 82 #include <dev/audio_if.h> 83 #include <dev/auconv.h> 84 #include <dev/mulaw.h> 85 86 #include <dev/isa/isavar.h> 87 #include <dev/isa/isadmavar.h> 88 89 #include <dev/isa/essvar.h> 90 #include <dev/isa/essreg.h> 91 92 #ifdef AUDIO_DEBUG 93 #define DPRINTF(x) if (essdebug) printf x 94 #define DPRINTFN(n,x) if (essdebug>(n)) printf x 95 int essdebug = 0; 96 #else 97 #define DPRINTF(x) 98 #define DPRINTFN(n,x) 99 #endif 100 101 #if 0 102 unsigned uuu; 103 #define EREAD1(t, h, a) (uuu=bus_space_read_1(t, h, a),printf("EREAD %02x=%02x\n", ((int)h&0xfff)+a, uuu),uuu) 104 #define EWRITE1(t, h, a, d) (printf("EWRITE %02x=%02x\n", ((int)h & 0xfff)+a, d), bus_space_write_1(t, h, a, d)) 105 #else 106 #define EREAD1(t, h, a) bus_space_read_1(t, h, a) 107 #define EWRITE1(t, h, a, d) bus_space_write_1(t, h, a, d) 108 #endif 109 110 111 int ess_setup_sc __P((struct ess_softc *, int)); 112 113 int ess_open __P((void *, int)); 114 void ess_1788_close __P((void *)); 115 void ess_1888_close __P((void *)); 116 int ess_getdev __P((void *, struct audio_device *)); 117 int ess_drain __P((void *)); 118 119 int ess_query_encoding __P((void *, struct audio_encoding *)); 120 121 int ess_set_params __P((void *, int, int, struct audio_params *, 122 struct audio_params *)); 123 124 int ess_round_blocksize __P((void *, int)); 125 126 int ess_audio1_trigger_output __P((void *, void *, void *, int, 127 void (*)(void *), void *, struct audio_params *)); 128 int ess_audio2_trigger_output __P((void *, void *, void *, int, 129 void (*)(void *), void *, struct audio_params *)); 130 int ess_audio1_trigger_input __P((void *, void *, void *, int, 131 void (*)(void *), void *, struct audio_params *)); 132 int ess_audio1_halt __P((void *)); 133 int ess_audio2_halt __P((void *)); 134 int ess_audio1_intr __P((void *)); 135 int ess_audio2_intr __P((void *)); 136 void ess_audio1_poll __P((void *)); 137 void ess_audio2_poll __P((void *)); 138 139 int ess_speaker_ctl __P((void *, int)); 140 141 int ess_getdev __P((void *, struct audio_device *)); 142 143 int ess_set_port __P((void *, mixer_ctrl_t *)); 144 int ess_get_port __P((void *, mixer_ctrl_t *)); 145 146 void *ess_malloc __P((void *, int, size_t, int, int)); 147 void ess_free __P((void *, void *, int)); 148 size_t ess_round_buffersize __P((void *, int, size_t)); 149 int ess_mappage __P((void *, void *, int, int)); 150 151 152 int ess_query_devinfo __P((void *, mixer_devinfo_t *)); 153 int ess_1788_get_props __P((void *)); 154 int ess_1888_get_props __P((void *)); 155 156 void ess_speaker_on __P((struct ess_softc *)); 157 void ess_speaker_off __P((struct ess_softc *)); 158 159 int ess_config_addr __P((struct ess_softc *)); 160 void ess_config_irq __P((struct ess_softc *)); 161 void ess_config_drq __P((struct ess_softc *)); 162 void ess_setup __P((struct ess_softc *)); 163 int ess_identify __P((struct ess_softc *)); 164 165 int ess_reset __P((struct ess_softc *)); 166 void ess_set_gain __P((struct ess_softc *, int, int)); 167 int ess_set_in_port __P((struct ess_softc *, int)); 168 int ess_set_in_ports __P((struct ess_softc *, int)); 169 u_int ess_srtotc __P((u_int)); 170 u_int ess_srtofc __P((u_int)); 171 u_char ess_get_dsp_status __P((struct ess_softc *)); 172 u_char ess_dsp_read_ready __P((struct ess_softc *)); 173 u_char ess_dsp_write_ready __P((struct ess_softc *)); 174 int ess_rdsp __P((struct ess_softc *)); 175 int ess_wdsp __P((struct ess_softc *, u_char)); 176 u_char ess_read_x_reg __P((struct ess_softc *, u_char)); 177 int ess_write_x_reg __P((struct ess_softc *, u_char, u_char)); 178 void ess_clear_xreg_bits __P((struct ess_softc *, u_char, u_char)); 179 void ess_set_xreg_bits __P((struct ess_softc *, u_char, u_char)); 180 u_char ess_read_mix_reg __P((struct ess_softc *, u_char)); 181 void ess_write_mix_reg __P((struct ess_softc *, u_char, u_char)); 182 void ess_clear_mreg_bits __P((struct ess_softc *, u_char, u_char)); 183 void ess_set_mreg_bits __P((struct ess_softc *, u_char, u_char)); 184 void ess_read_multi_mix_reg __P((struct ess_softc *, u_char, u_int8_t *, bus_size_t)); 185 186 static char *essmodel[] = { 187 "unsupported", 188 "1888", 189 "1887", 190 "888", 191 "1788", 192 "1869", 193 "1879", 194 "1868", 195 "1878", 196 }; 197 198 struct audio_device ess_device = { 199 "ESS Technology", 200 "x", 201 "ess" 202 }; 203 204 /* 205 * Define our interface to the higher level audio driver. 206 */ 207 208 struct audio_hw_if ess_1788_hw_if = { 209 ess_open, 210 ess_1788_close, 211 ess_drain, 212 ess_query_encoding, 213 ess_set_params, 214 ess_round_blocksize, 215 NULL, 216 NULL, 217 NULL, 218 NULL, 219 NULL, 220 ess_audio1_halt, 221 ess_audio1_halt, 222 ess_speaker_ctl, 223 ess_getdev, 224 NULL, 225 ess_set_port, 226 ess_get_port, 227 ess_query_devinfo, 228 ess_malloc, 229 ess_free, 230 ess_round_buffersize, 231 ess_mappage, 232 ess_1788_get_props, 233 ess_audio1_trigger_output, 234 ess_audio1_trigger_input, 235 }; 236 237 struct audio_hw_if ess_1888_hw_if = { 238 ess_open, 239 ess_1888_close, 240 ess_drain, 241 ess_query_encoding, 242 ess_set_params, 243 ess_round_blocksize, 244 NULL, 245 NULL, 246 NULL, 247 NULL, 248 NULL, 249 ess_audio2_halt, 250 ess_audio1_halt, 251 ess_speaker_ctl, 252 ess_getdev, 253 NULL, 254 ess_set_port, 255 ess_get_port, 256 ess_query_devinfo, 257 ess_malloc, 258 ess_free, 259 ess_round_buffersize, 260 ess_mappage, 261 ess_1888_get_props, 262 ess_audio2_trigger_output, 263 ess_audio1_trigger_input, 264 }; 265 266 #ifdef AUDIO_DEBUG 267 void ess_printsc __P((struct ess_softc *)); 268 void ess_dump_mixer __P((struct ess_softc *)); 269 270 void 271 ess_printsc(sc) 272 struct ess_softc *sc; 273 { 274 int i; 275 276 printf("open %d iobase 0x%x outport %u inport %u speaker %s\n", 277 (int)sc->sc_open, sc->sc_iobase, sc->out_port, 278 sc->in_port, sc->spkr_state ? "on" : "off"); 279 280 printf("audio1: dmachan %d irq %d nintr %lu intr %p arg %p\n", 281 sc->sc_audio1.drq, sc->sc_audio1.irq, sc->sc_audio1.nintr, 282 sc->sc_audio1.intr, sc->sc_audio1.arg); 283 284 if (!ESS_USE_AUDIO1(sc->sc_model)) { 285 printf("audio2: dmachan %d irq %d nintr %lu intr %p arg %p\n", 286 sc->sc_audio2.drq, sc->sc_audio2.irq, sc->sc_audio2.nintr, 287 sc->sc_audio2.intr, sc->sc_audio2.arg); 288 } 289 290 printf("gain:"); 291 for (i = 0; i < sc->ndevs; i++) 292 printf(" %u,%u", sc->gain[i][ESS_LEFT], sc->gain[i][ESS_RIGHT]); 293 printf("\n"); 294 } 295 296 void 297 ess_dump_mixer(sc) 298 struct ess_softc *sc; 299 { 300 printf("ESS_DAC_PLAY_VOL: mix reg 0x%02x=0x%02x\n", 301 0x7C, ess_read_mix_reg(sc, 0x7C)); 302 printf("ESS_MIC_PLAY_VOL: mix reg 0x%02x=0x%02x\n", 303 0x1A, ess_read_mix_reg(sc, 0x1A)); 304 printf("ESS_LINE_PLAY_VOL: mix reg 0x%02x=0x%02x\n", 305 0x3E, ess_read_mix_reg(sc, 0x3E)); 306 printf("ESS_SYNTH_PLAY_VOL: mix reg 0x%02x=0x%02x\n", 307 0x36, ess_read_mix_reg(sc, 0x36)); 308 printf("ESS_CD_PLAY_VOL: mix reg 0x%02x=0x%02x\n", 309 0x38, ess_read_mix_reg(sc, 0x38)); 310 printf("ESS_AUXB_PLAY_VOL: mix reg 0x%02x=0x%02x\n", 311 0x3A, ess_read_mix_reg(sc, 0x3A)); 312 printf("ESS_MASTER_VOL: mix reg 0x%02x=0x%02x\n", 313 0x32, ess_read_mix_reg(sc, 0x32)); 314 printf("ESS_PCSPEAKER_VOL: mix reg 0x%02x=0x%02x\n", 315 0x3C, ess_read_mix_reg(sc, 0x3C)); 316 printf("ESS_DAC_REC_VOL: mix reg 0x%02x=0x%02x\n", 317 0x69, ess_read_mix_reg(sc, 0x69)); 318 printf("ESS_MIC_REC_VOL: mix reg 0x%02x=0x%02x\n", 319 0x68, ess_read_mix_reg(sc, 0x68)); 320 printf("ESS_LINE_REC_VOL: mix reg 0x%02x=0x%02x\n", 321 0x6E, ess_read_mix_reg(sc, 0x6E)); 322 printf("ESS_SYNTH_REC_VOL: mix reg 0x%02x=0x%02x\n", 323 0x6B, ess_read_mix_reg(sc, 0x6B)); 324 printf("ESS_CD_REC_VOL: mix reg 0x%02x=0x%02x\n", 325 0x6A, ess_read_mix_reg(sc, 0x6A)); 326 printf("ESS_AUXB_REC_VOL: mix reg 0x%02x=0x%02x\n", 327 0x6C, ess_read_mix_reg(sc, 0x6C)); 328 printf("ESS_RECORD_VOL: x reg 0x%02x=0x%02x\n", 329 0xB4, ess_read_x_reg(sc, 0xB4)); 330 printf("Audio 1 play vol (unused): mix reg 0x%02x=0x%02x\n", 331 0x14, ess_read_mix_reg(sc, 0x14)); 332 333 printf("ESS_MIC_PREAMP: x reg 0x%02x=0x%02x\n", 334 ESS_XCMD_PREAMP_CTRL, ess_read_x_reg(sc, ESS_XCMD_PREAMP_CTRL)); 335 printf("ESS_RECORD_MONITOR: x reg 0x%02x=0x%02x\n", 336 ESS_XCMD_AUDIO_CTRL, ess_read_x_reg(sc, ESS_XCMD_AUDIO_CTRL)); 337 printf("Record source: mix reg 0x%02x=0x%02x, 0x%02x=0x%02x\n", 338 ESS_MREG_ADC_SOURCE, ess_read_mix_reg(sc, ESS_MREG_ADC_SOURCE), 339 ESS_MREG_AUDIO2_CTRL2, ess_read_mix_reg(sc, ESS_MREG_AUDIO2_CTRL2)); 340 } 341 342 #endif 343 344 /* 345 * Configure the ESS chip for the desired audio base address. 346 */ 347 int 348 ess_config_addr(sc) 349 struct ess_softc *sc; 350 { 351 int iobase = sc->sc_iobase; 352 bus_space_tag_t iot = sc->sc_iot; 353 354 /* 355 * Configure using the System Control Register method. This 356 * method is used when the AMODE line is tied high, which is 357 * the case for the Shark, but not for the evaluation board. 358 */ 359 360 bus_space_handle_t scr_access_ioh; 361 bus_space_handle_t scr_ioh; 362 u_short scr_value; 363 364 /* 365 * Set the SCR bit to enable audio. 366 */ 367 scr_value = ESS_SCR_AUDIO_ENABLE; 368 369 /* 370 * Set the SCR bits necessary to select the specified audio 371 * base address. 372 */ 373 switch(iobase) { 374 case 0x220: 375 scr_value |= ESS_SCR_AUDIO_220; 376 break; 377 case 0x230: 378 scr_value |= ESS_SCR_AUDIO_230; 379 break; 380 case 0x240: 381 scr_value |= ESS_SCR_AUDIO_240; 382 break; 383 case 0x250: 384 scr_value |= ESS_SCR_AUDIO_250; 385 break; 386 default: 387 printf("ess: configured iobase 0x%x invalid\n", iobase); 388 return (1); 389 break; 390 } 391 392 /* 393 * Get a mapping for the System Control Register (SCR) access 394 * registers and the SCR data registers. 395 */ 396 if (bus_space_map(iot, ESS_SCR_ACCESS_BASE, ESS_SCR_ACCESS_PORTS, 397 0, &scr_access_ioh)) { 398 printf("ess: can't map SCR access registers\n"); 399 return (1); 400 } 401 if (bus_space_map(iot, ESS_SCR_BASE, ESS_SCR_PORTS, 402 0, &scr_ioh)) { 403 printf("ess: can't map SCR registers\n"); 404 bus_space_unmap(iot, scr_access_ioh, ESS_SCR_ACCESS_PORTS); 405 return (1); 406 } 407 408 /* Unlock the SCR. */ 409 EWRITE1(iot, scr_access_ioh, ESS_SCR_UNLOCK, 0); 410 411 /* Write the base address information into SCR[0]. */ 412 EWRITE1(iot, scr_ioh, ESS_SCR_INDEX, 0); 413 EWRITE1(iot, scr_ioh, ESS_SCR_DATA, scr_value); 414 415 /* Lock the SCR. */ 416 EWRITE1(iot, scr_access_ioh, ESS_SCR_LOCK, 0); 417 418 /* Unmap the SCR access ports and the SCR data ports. */ 419 bus_space_unmap(iot, scr_access_ioh, ESS_SCR_ACCESS_PORTS); 420 bus_space_unmap(iot, scr_ioh, ESS_SCR_PORTS); 421 422 return 0; 423 } 424 425 426 /* 427 * Configure the ESS chip for the desired IRQ and DMA channels. 428 * ESS ISA 429 * -------- 430 * IRQA irq9 431 * IRQB irq5 432 * IRQC irq7 433 * IRQD irq10 434 * IRQE irq15 435 * 436 * DRQA drq0 437 * DRQB drq1 438 * DRQC drq3 439 * DRQD drq5 440 */ 441 void 442 ess_config_irq(sc) 443 struct ess_softc *sc; 444 { 445 int v; 446 447 DPRINTFN(2,("ess_config_irq\n")); 448 449 if (sc->sc_model == ESS_1887 && 450 sc->sc_audio1.irq == sc->sc_audio2.irq && 451 sc->sc_audio1.irq != -1) { 452 /* Use new method, both interrupts are the same. */ 453 v = ESS_IS_SELECT_IRQ; /* enable intrs */ 454 switch (sc->sc_audio1.irq) { 455 case 5: 456 v |= ESS_IS_INTRB; 457 break; 458 case 7: 459 v |= ESS_IS_INTRC; 460 break; 461 case 9: 462 v |= ESS_IS_INTRA; 463 break; 464 case 10: 465 v |= ESS_IS_INTRD; 466 break; 467 case 15: 468 v |= ESS_IS_INTRE; 469 break; 470 #ifdef DIAGNOSTIC 471 default: 472 printf("ess_config_irq: configured irq %d not supported for Audio 1\n", 473 sc->sc_audio1.irq); 474 return; 475 #endif 476 } 477 /* Set the IRQ */ 478 ess_write_mix_reg(sc, ESS_MREG_INTR_ST, v); 479 return; 480 } 481 482 if (sc->sc_model == ESS_1887) { 483 /* Tell the 1887 to use the old interrupt method. */ 484 ess_write_mix_reg(sc, ESS_MREG_INTR_ST, ESS_IS_ES1888); 485 } 486 487 if (sc->sc_audio1.polled) { 488 /* Turn off Audio1 interrupts. */ 489 v = 0; 490 } else { 491 /* Configure Audio 1 for the appropriate IRQ line. */ 492 v = ESS_IRQ_CTRL_MASK | ESS_IRQ_CTRL_EXT; /* All intrs on */ 493 switch (sc->sc_audio1.irq) { 494 case 5: 495 v |= ESS_IRQ_CTRL_INTRB; 496 break; 497 case 7: 498 v |= ESS_IRQ_CTRL_INTRC; 499 break; 500 case 9: 501 v |= ESS_IRQ_CTRL_INTRA; 502 break; 503 case 10: 504 v |= ESS_IRQ_CTRL_INTRD; 505 break; 506 #ifdef DIAGNOSTIC 507 default: 508 printf("ess: configured irq %d not supported for Audio 1\n", 509 sc->sc_audio1.irq); 510 return; 511 #endif 512 } 513 } 514 ess_write_x_reg(sc, ESS_XCMD_IRQ_CTRL, v); 515 516 if (ESS_USE_AUDIO1(sc->sc_model)) 517 return; 518 519 if (sc->sc_audio2.polled) { 520 /* Turn off Audio2 interrupts. */ 521 ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2, 522 ESS_AUDIO2_CTRL2_IRQ2_ENABLE); 523 } else { 524 /* Audio2 is hardwired to INTRE in this mode. */ 525 ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2, 526 ESS_AUDIO2_CTRL2_IRQ2_ENABLE); 527 } 528 } 529 530 531 void 532 ess_config_drq(sc) 533 struct ess_softc *sc; 534 { 535 int v; 536 537 DPRINTFN(2,("ess_config_drq\n")); 538 539 /* Configure Audio 1 (record) for DMA on the appropriate channel. */ 540 v = ESS_DRQ_CTRL_PU | ESS_DRQ_CTRL_EXT; 541 switch (sc->sc_audio1.drq) { 542 case 0: 543 v |= ESS_DRQ_CTRL_DRQA; 544 break; 545 case 1: 546 v |= ESS_DRQ_CTRL_DRQB; 547 break; 548 case 3: 549 v |= ESS_DRQ_CTRL_DRQC; 550 break; 551 #ifdef DIAGNOSTIC 552 default: 553 printf("ess_config_drq: configured dma chan %d not supported for Audio 1\n", 554 sc->sc_audio1.drq); 555 return; 556 #endif 557 } 558 /* Set DRQ1 */ 559 ess_write_x_reg(sc, ESS_XCMD_DRQ_CTRL, v); 560 561 if (ESS_USE_AUDIO1(sc->sc_model)) 562 return; 563 564 /* Configure DRQ2 */ 565 v = ESS_AUDIO2_CTRL3_DRQ_PD; 566 switch (sc->sc_audio2.drq) { 567 case 0: 568 v |= ESS_AUDIO2_CTRL3_DRQA; 569 break; 570 case 1: 571 v |= ESS_AUDIO2_CTRL3_DRQB; 572 break; 573 case 3: 574 v |= ESS_AUDIO2_CTRL3_DRQC; 575 break; 576 case 5: 577 v |= ESS_AUDIO2_CTRL3_DRQD; 578 break; 579 #ifdef DIAGNOSTIC 580 default: 581 printf("ess_config_drq: configured dma chan %d not supported for Audio 2\n", 582 sc->sc_audio2.drq); 583 return; 584 #endif 585 } 586 ess_write_mix_reg(sc, ESS_MREG_AUDIO2_CTRL3, v); 587 /* Enable DMA 2 */ 588 ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2, 589 ESS_AUDIO2_CTRL2_DMA_ENABLE); 590 } 591 592 /* 593 * Set up registers after a reset. 594 */ 595 void 596 ess_setup(sc) 597 struct ess_softc *sc; 598 { 599 600 ess_config_irq(sc); 601 ess_config_drq(sc); 602 603 DPRINTFN(2,("ess_setup: done\n")); 604 } 605 606 /* 607 * Determine the model of ESS chip we are talking to. Currently we 608 * only support ES1888, ES1887 and ES888. The method of determining 609 * the chip is based on the information on page 27 of the ES1887 data 610 * sheet. 611 * 612 * This routine sets the values of sc->sc_model and sc->sc_version. 613 */ 614 int 615 ess_identify(sc) 616 struct ess_softc *sc; 617 { 618 u_char reg1; 619 u_char reg2; 620 u_char reg3; 621 u_int8_t ident[4]; 622 623 sc->sc_model = ESS_UNSUPPORTED; 624 sc->sc_version = 0; 625 626 memset(ident, 0, sizeof(ident)); 627 628 /* 629 * 1. Check legacy ID bytes. These should be 0x68 0x8n, where 630 * n >= 8 for an ES1887 or an ES888. Other values indicate 631 * earlier (unsupported) chips. 632 */ 633 ess_wdsp(sc, ESS_ACMD_LEGACY_ID); 634 635 if ((reg1 = ess_rdsp(sc)) != 0x68) { 636 printf("ess: First ID byte wrong (0x%02x)\n", reg1); 637 return 1; 638 } 639 640 reg2 = ess_rdsp(sc); 641 if (((reg2 & 0xf0) != 0x80) || 642 ((reg2 & 0x0f) < 8)) { 643 printf("ess: Second ID byte wrong (0x%02x)\n", reg2); 644 return 1; 645 } 646 647 /* 648 * Store the ID bytes as the version. 649 */ 650 sc->sc_version = (reg1 << 8) + reg2; 651 652 653 /* 654 * 2. Verify we can change bit 2 in mixer register 0x64. This 655 * should be possible on all supported chips. 656 */ 657 reg1 = ess_read_mix_reg(sc, ESS_MREG_VOLUME_CTRL); 658 reg2 = reg1 ^ 0x04; /* toggle bit 2 */ 659 660 ess_write_mix_reg(sc, ESS_MREG_VOLUME_CTRL, reg2); 661 662 if (ess_read_mix_reg(sc, ESS_MREG_VOLUME_CTRL) != reg2) { 663 printf("ess: Hardware error (unable to toggle bit 2 of mixer register 0x64)\n"); 664 return 1; 665 } 666 667 /* 668 * Restore the original value of mixer register 0x64. 669 */ 670 ess_write_mix_reg(sc, ESS_MREG_VOLUME_CTRL, reg1); 671 672 673 /* 674 * 3. Verify we can change the value of mixer register 675 * ESS_MREG_SAMPLE_RATE. 676 * This is possible on the 1888/1887/888, but not on the 1788. 677 * It is not necessary to restore the value of this mixer register. 678 */ 679 reg1 = ess_read_mix_reg(sc, ESS_MREG_SAMPLE_RATE); 680 reg2 = reg1 ^ 0xff; /* toggle all bits */ 681 682 ess_write_mix_reg(sc, ESS_MREG_SAMPLE_RATE, reg2); 683 684 if (ess_read_mix_reg(sc, ESS_MREG_SAMPLE_RATE) != reg2) { 685 /* If we got this far before failing, it's a 1788. */ 686 sc->sc_model = ESS_1788; 687 688 /* 689 * Identify ESS model for ES18[67]8. 690 */ 691 ess_read_multi_mix_reg(sc, 0x40, ident, sizeof(ident)); 692 if(ident[0] == 0x18) { 693 switch(ident[1]) { 694 case 0x68: 695 sc->sc_model = ESS_1868; 696 break; 697 case 0x78: 698 sc->sc_model = ESS_1878; 699 break; 700 } 701 } 702 } else { 703 /* 704 * 4. Determine if we can change bit 5 in mixer register 0x64. 705 * This determines whether we have an ES1887: 706 * 707 * - can change indicates ES1887 708 * - can't change indicates ES1888 or ES888 709 */ 710 reg1 = ess_read_mix_reg(sc, ESS_MREG_VOLUME_CTRL); 711 reg2 = reg1 ^ 0x20; /* toggle bit 5 */ 712 713 ess_write_mix_reg(sc, ESS_MREG_VOLUME_CTRL, reg2); 714 715 if (ess_read_mix_reg(sc, ESS_MREG_VOLUME_CTRL) == reg2) { 716 sc->sc_model = ESS_1887; 717 718 /* 719 * Restore the original value of mixer register 0x64. 720 */ 721 ess_write_mix_reg(sc, ESS_MREG_VOLUME_CTRL, reg1); 722 723 /* 724 * Identify ESS model for ES18[67]9. 725 */ 726 ess_read_multi_mix_reg(sc, 0x40, ident, sizeof(ident)); 727 if(ident[0] == 0x18) { 728 switch(ident[1]) { 729 case 0x69: 730 sc->sc_model = ESS_1869; 731 break; 732 case 0x79: 733 sc->sc_model = ESS_1879; 734 break; 735 } 736 } 737 } else { 738 /* 739 * 5. Determine if we can change the value of mixer 740 * register 0x69 independently of mixer register 741 * 0x68. This determines which chip we have: 742 * 743 * - can modify idependently indicates ES888 744 * - register 0x69 is an alias of 0x68 indicates ES1888 745 */ 746 reg1 = ess_read_mix_reg(sc, 0x68); 747 reg2 = ess_read_mix_reg(sc, 0x69); 748 reg3 = reg2 ^ 0xff; /* toggle all bits */ 749 750 /* 751 * Write different values to each register. 752 */ 753 ess_write_mix_reg(sc, 0x68, reg2); 754 ess_write_mix_reg(sc, 0x69, reg3); 755 756 if (ess_read_mix_reg(sc, 0x68) == reg2 && 757 ess_read_mix_reg(sc, 0x69) == reg3) 758 sc->sc_model = ESS_888; 759 else 760 sc->sc_model = ESS_1888; 761 762 /* 763 * Restore the original value of the registers. 764 */ 765 ess_write_mix_reg(sc, 0x68, reg1); 766 ess_write_mix_reg(sc, 0x69, reg2); 767 } 768 } 769 770 return 0; 771 } 772 773 774 int 775 ess_setup_sc(sc, doinit) 776 struct ess_softc *sc; 777 int doinit; 778 { 779 /* Reset the chip. */ 780 if (ess_reset(sc) != 0) { 781 DPRINTF(("ess_setup_sc: couldn't reset chip\n")); 782 return (1); 783 } 784 785 /* Identify the ESS chip, and check that it is supported. */ 786 if (ess_identify(sc)) { 787 DPRINTF(("ess_setup_sc: couldn't identify\n")); 788 return (1); 789 } 790 791 return (0); 792 } 793 794 /* 795 * Probe for the ESS hardware. 796 */ 797 int 798 essmatch(sc) 799 struct ess_softc *sc; 800 { 801 if (!ESS_BASE_VALID(sc->sc_iobase)) { 802 printf("ess: configured iobase 0x%x invalid\n", sc->sc_iobase); 803 return (0); 804 } 805 806 /* Configure the ESS chip for the desired audio base address. */ 807 if (ess_config_addr(sc)) 808 return (0); 809 810 if (ess_setup_sc(sc, 1)) 811 return (0); 812 813 if (sc->sc_model == ESS_UNSUPPORTED) { 814 DPRINTF(("ess: Unsupported model\n")); 815 return (0); 816 } 817 818 /* Check that requested DMA channels are valid and different. */ 819 if (!ESS_DRQ1_VALID(sc->sc_audio1.drq)) { 820 printf("ess: record drq %d invalid\n", sc->sc_audio1.drq); 821 return (0); 822 } 823 if (!isa_drq_isfree(sc->sc_ic, sc->sc_audio1.drq)) 824 return (0); 825 if (!ESS_USE_AUDIO1(sc->sc_model)) { 826 if (!ESS_DRQ2_VALID(sc->sc_audio2.drq)) { 827 printf("ess: play drq %d invalid\n", sc->sc_audio2.drq); 828 return (0); 829 } 830 if (sc->sc_audio1.drq == sc->sc_audio2.drq) { 831 printf("ess: play and record drq both %d\n", 832 sc->sc_audio1.drq); 833 return (0); 834 } 835 if (!isa_drq_isfree(sc->sc_ic, sc->sc_audio2.drq)) 836 return (0); 837 } 838 839 /* 840 * The 1887 has an additional IRQ mode where both channels are mapped 841 * to the same IRQ. 842 */ 843 if (sc->sc_model == ESS_1887 && 844 sc->sc_audio1.irq == sc->sc_audio2.irq && 845 sc->sc_audio1.irq != -1 && 846 ESS_IRQ12_VALID(sc->sc_audio1.irq)) 847 goto irq_not1888; 848 849 /* Check that requested IRQ lines are valid and different. */ 850 if (sc->sc_audio1.irq != -1 && 851 !ESS_IRQ1_VALID(sc->sc_audio1.irq)) { 852 printf("ess: record irq %d invalid\n", sc->sc_audio1.irq); 853 return (0); 854 } 855 if (!ESS_USE_AUDIO1(sc->sc_model)) { 856 if (sc->sc_audio2.irq != -1 && 857 !ESS_IRQ2_VALID(sc->sc_audio2.irq)) { 858 printf("ess: play irq %d invalid\n", sc->sc_audio2.irq); 859 return (0); 860 } 861 if (sc->sc_audio1.irq == sc->sc_audio2.irq && 862 sc->sc_audio1.irq != -1) { 863 printf("ess: play and record irq both %d\n", 864 sc->sc_audio1.irq); 865 return (0); 866 } 867 } 868 869 irq_not1888: 870 /* XXX should we check IRQs as well? */ 871 872 return (1); 873 } 874 875 876 /* 877 * Attach hardware to driver, attach hardware driver to audio 878 * pseudo-device driver. 879 */ 880 void 881 essattach(sc) 882 struct ess_softc *sc; 883 { 884 struct audio_attach_args arg; 885 struct audio_params pparams, rparams; 886 int i; 887 u_int v; 888 889 if (ess_setup_sc(sc, 0)) { 890 printf(": setup failed\n"); 891 return; 892 } 893 894 printf(": ESS Technology ES%s [version 0x%04x]\n", 895 essmodel[sc->sc_model], sc->sc_version); 896 897 sc->sc_audio1.polled = sc->sc_audio1.irq == -1; 898 if (!sc->sc_audio1.polled) { 899 sc->sc_audio1.ih = isa_intr_establish(sc->sc_ic, 900 sc->sc_audio1.irq, sc->sc_audio1.ist, IPL_AUDIO, 901 ess_audio1_intr, sc); 902 printf("%s: audio1 interrupting at irq %d\n", 903 sc->sc_dev.dv_xname, sc->sc_audio1.irq); 904 } else 905 printf("%s: audio1 polled\n", sc->sc_dev.dv_xname); 906 if (isa_dmamap_create(sc->sc_ic, sc->sc_audio1.drq, 907 MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { 908 printf("%s: can't create map for drq %d\n", 909 sc->sc_dev.dv_xname, sc->sc_audio1.drq); 910 return; 911 } 912 913 if (!ESS_USE_AUDIO1(sc->sc_model)) { 914 sc->sc_audio2.polled = sc->sc_audio2.irq == -1; 915 if (!sc->sc_audio2.polled) { 916 sc->sc_audio2.ih = isa_intr_establish(sc->sc_ic, 917 sc->sc_audio2.irq, sc->sc_audio2.ist, IPL_AUDIO, 918 ess_audio2_intr, sc); 919 printf("%s: audio2 interrupting at irq %d\n", 920 sc->sc_dev.dv_xname, sc->sc_audio2.irq); 921 } else 922 printf("%s: audio2 polled\n", sc->sc_dev.dv_xname); 923 if (isa_dmamap_create(sc->sc_ic, sc->sc_audio2.drq, 924 MAX_ISADMA, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW)) { 925 printf("%s: can't create map for drq %d\n", 926 sc->sc_dev.dv_xname, sc->sc_audio2.drq); 927 return; 928 } 929 } 930 931 /* 932 * Set record and play parameters to default values defined in 933 * generic audio driver. 934 */ 935 pparams = audio_default; 936 rparams = audio_default; 937 ess_set_params(sc, AUMODE_RECORD|AUMODE_PLAY, 0, &pparams, &rparams); 938 939 /* Do a hardware reset on the mixer. */ 940 ess_write_mix_reg(sc, ESS_MIX_RESET, ESS_MIX_RESET); 941 942 /* 943 * Set volume of Audio 1 to zero and disable Audio 1 DAC input 944 * to playback mixer, since playback is always through Audio 2. 945 */ 946 if (!ESS_USE_AUDIO1(sc->sc_model)) 947 ess_write_mix_reg(sc, ESS_MREG_VOLUME_VOICE, 0); 948 ess_wdsp(sc, ESS_ACMD_DISABLE_SPKR); 949 950 if (ESS_USE_AUDIO1(sc->sc_model)) { 951 ess_write_mix_reg(sc, ESS_MREG_ADC_SOURCE, ESS_SOURCE_MIC); 952 sc->in_port = ESS_SOURCE_MIC; 953 sc->ndevs = ESS_1788_NDEVS; 954 } else { 955 /* 956 * Set hardware record source to use output of the record 957 * mixer. We do the selection of record source in software by 958 * setting the gain of the unused sources to zero. (See 959 * ess_set_in_ports.) 960 */ 961 ess_write_mix_reg(sc, ESS_MREG_ADC_SOURCE, ESS_SOURCE_MIXER); 962 sc->in_mask = 1 << ESS_MIC_REC_VOL; 963 sc->ndevs = ESS_1888_NDEVS; 964 ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2, 0x10); 965 ess_set_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL2, 0x08); 966 } 967 968 /* 969 * Set gain on each mixer device to a sensible value. 970 * Devices not normally used are turned off, and other devices 971 * are set to 50% volume. 972 */ 973 for (i = 0; i < sc->ndevs; i++) { 974 switch (i) { 975 case ESS_MIC_PLAY_VOL: 976 case ESS_LINE_PLAY_VOL: 977 case ESS_CD_PLAY_VOL: 978 case ESS_AUXB_PLAY_VOL: 979 case ESS_DAC_REC_VOL: 980 case ESS_LINE_REC_VOL: 981 case ESS_SYNTH_REC_VOL: 982 case ESS_CD_REC_VOL: 983 case ESS_AUXB_REC_VOL: 984 v = 0; 985 break; 986 default: 987 v = ESS_4BIT_GAIN(AUDIO_MAX_GAIN / 2); 988 break; 989 } 990 sc->gain[i][ESS_LEFT] = sc->gain[i][ESS_RIGHT] = v; 991 ess_set_gain(sc, i, 1); 992 } 993 994 ess_setup(sc); 995 996 /* Disable the speaker until the device is opened. */ 997 ess_speaker_off(sc); 998 sc->spkr_state = SPKR_OFF; 999 1000 sprintf(ess_device.name, "ES%s", essmodel[sc->sc_model]); 1001 sprintf(ess_device.version, "0x%04x", sc->sc_version); 1002 1003 if (ESS_USE_AUDIO1(sc->sc_model)) 1004 audio_attach_mi(&ess_1788_hw_if, sc, &sc->sc_dev); 1005 else 1006 audio_attach_mi(&ess_1888_hw_if, sc, &sc->sc_dev); 1007 1008 arg.type = AUDIODEV_TYPE_OPL; 1009 arg.hwif = 0; 1010 arg.hdl = 0; 1011 (void)config_found(&sc->sc_dev, &arg, audioprint); 1012 1013 #ifdef AUDIO_DEBUG 1014 if (essdebug > 0) 1015 ess_printsc(sc); 1016 #endif 1017 } 1018 1019 /* 1020 * Various routines to interface to higher level audio driver 1021 */ 1022 1023 int 1024 ess_open(addr, flags) 1025 void *addr; 1026 int flags; 1027 { 1028 struct ess_softc *sc = addr; 1029 1030 DPRINTF(("ess_open: sc=%p\n", sc)); 1031 1032 if (sc->sc_open != 0 || ess_reset(sc) != 0) 1033 return ENXIO; 1034 1035 ess_setup(sc); /* because we did a reset */ 1036 1037 sc->sc_open = 1; 1038 1039 DPRINTF(("ess_open: opened\n")); 1040 1041 return (0); 1042 } 1043 1044 void 1045 ess_1788_close(addr) 1046 void *addr; 1047 { 1048 struct ess_softc *sc = addr; 1049 1050 DPRINTF(("ess_1788_close: sc=%p\n", sc)); 1051 1052 ess_speaker_off(sc); 1053 sc->spkr_state = SPKR_OFF; 1054 1055 ess_audio1_halt(sc); 1056 1057 sc->sc_open = 0; 1058 DPRINTF(("ess_1788_close: closed\n")); 1059 } 1060 1061 void 1062 ess_1888_close(addr) 1063 void *addr; 1064 { 1065 struct ess_softc *sc = addr; 1066 1067 DPRINTF(("ess_1888_close: sc=%p\n", sc)); 1068 1069 ess_speaker_off(sc); 1070 sc->spkr_state = SPKR_OFF; 1071 1072 ess_audio1_halt(sc); 1073 ess_audio2_halt(sc); 1074 1075 sc->sc_open = 0; 1076 DPRINTF(("ess_1888_close: closed\n")); 1077 } 1078 1079 /* 1080 * Wait for FIFO to drain, and analog section to settle. 1081 * XXX should check FIFO empty bit. 1082 */ 1083 int 1084 ess_drain(addr) 1085 void *addr; 1086 { 1087 tsleep(addr, PWAIT | PCATCH, "essdr", hz/20); /* XXX */ 1088 return (0); 1089 } 1090 1091 /* XXX should use reference count */ 1092 int 1093 ess_speaker_ctl(addr, newstate) 1094 void *addr; 1095 int newstate; 1096 { 1097 struct ess_softc *sc = addr; 1098 1099 if ((newstate == SPKR_ON) && (sc->spkr_state == SPKR_OFF)) { 1100 ess_speaker_on(sc); 1101 sc->spkr_state = SPKR_ON; 1102 } 1103 if ((newstate == SPKR_OFF) && (sc->spkr_state == SPKR_ON)) { 1104 ess_speaker_off(sc); 1105 sc->spkr_state = SPKR_OFF; 1106 } 1107 return (0); 1108 } 1109 1110 int 1111 ess_getdev(addr, retp) 1112 void *addr; 1113 struct audio_device *retp; 1114 { 1115 *retp = ess_device; 1116 return (0); 1117 } 1118 1119 int 1120 ess_query_encoding(addr, fp) 1121 void *addr; 1122 struct audio_encoding *fp; 1123 { 1124 /*struct ess_softc *sc = addr;*/ 1125 1126 switch (fp->index) { 1127 case 0: 1128 strcpy(fp->name, AudioEulinear); 1129 fp->encoding = AUDIO_ENCODING_ULINEAR; 1130 fp->precision = 8; 1131 fp->flags = 0; 1132 return (0); 1133 case 1: 1134 strcpy(fp->name, AudioEmulaw); 1135 fp->encoding = AUDIO_ENCODING_ULAW; 1136 fp->precision = 8; 1137 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 1138 return (0); 1139 case 2: 1140 strcpy(fp->name, AudioEalaw); 1141 fp->encoding = AUDIO_ENCODING_ALAW; 1142 fp->precision = 8; 1143 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 1144 return (0); 1145 case 3: 1146 strcpy(fp->name, AudioEslinear); 1147 fp->encoding = AUDIO_ENCODING_SLINEAR; 1148 fp->precision = 8; 1149 fp->flags = 0; 1150 return (0); 1151 case 4: 1152 strcpy(fp->name, AudioEslinear_le); 1153 fp->encoding = AUDIO_ENCODING_SLINEAR_LE; 1154 fp->precision = 16; 1155 fp->flags = 0; 1156 return (0); 1157 case 5: 1158 strcpy(fp->name, AudioEulinear_le); 1159 fp->encoding = AUDIO_ENCODING_ULINEAR_LE; 1160 fp->precision = 16; 1161 fp->flags = 0; 1162 return (0); 1163 case 6: 1164 strcpy(fp->name, AudioEslinear_be); 1165 fp->encoding = AUDIO_ENCODING_SLINEAR_BE; 1166 fp->precision = 16; 1167 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 1168 return (0); 1169 case 7: 1170 strcpy(fp->name, AudioEulinear_be); 1171 fp->encoding = AUDIO_ENCODING_ULINEAR_BE; 1172 fp->precision = 16; 1173 fp->flags = AUDIO_ENCODINGFLAG_EMULATED; 1174 return (0); 1175 default: 1176 return EINVAL; 1177 } 1178 return (0); 1179 } 1180 1181 int 1182 ess_set_params(addr, setmode, usemode, play, rec) 1183 void *addr; 1184 int setmode, usemode; 1185 struct audio_params *play, *rec; 1186 { 1187 struct ess_softc *sc = addr; 1188 struct audio_params *p; 1189 int mode; 1190 int rate; 1191 1192 DPRINTF(("ess_set_params: set=%d use=%d\n", setmode, usemode)); 1193 1194 /* 1195 * The ES1887 manual (page 39, `Full-Duplex DMA Mode') claims that in 1196 * full-duplex operation the sample rates must be the same for both 1197 * channels. This appears to be false; the only bit in common is the 1198 * clock source selection. However, we'll be conservative here. 1199 * - mycroft 1200 */ 1201 if (play->sample_rate != rec->sample_rate && 1202 usemode == (AUMODE_PLAY | AUMODE_RECORD)) { 1203 if (setmode == AUMODE_PLAY) { 1204 rec->sample_rate = play->sample_rate; 1205 setmode |= AUMODE_RECORD; 1206 } else if (setmode == AUMODE_RECORD) { 1207 play->sample_rate = rec->sample_rate; 1208 setmode |= AUMODE_PLAY; 1209 } else 1210 return (EINVAL); 1211 } 1212 1213 for (mode = AUMODE_RECORD; mode != -1; 1214 mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) { 1215 if ((setmode & mode) == 0) 1216 continue; 1217 1218 p = mode == AUMODE_PLAY ? play : rec; 1219 1220 if (p->sample_rate < ESS_MINRATE || 1221 p->sample_rate > ESS_MAXRATE || 1222 (p->precision != 8 && p->precision != 16) || 1223 (p->channels != 1 && p->channels != 2)) 1224 return (EINVAL); 1225 1226 p->factor = 1; 1227 p->sw_code = 0; 1228 switch (p->encoding) { 1229 case AUDIO_ENCODING_SLINEAR_BE: 1230 case AUDIO_ENCODING_ULINEAR_BE: 1231 if (p->precision == 16) 1232 p->sw_code = swap_bytes; 1233 break; 1234 case AUDIO_ENCODING_SLINEAR_LE: 1235 case AUDIO_ENCODING_ULINEAR_LE: 1236 break; 1237 case AUDIO_ENCODING_ULAW: 1238 if (mode == AUMODE_PLAY) { 1239 p->factor = 2; 1240 p->sw_code = mulaw_to_ulinear16; 1241 } else 1242 p->sw_code = ulinear8_to_mulaw; 1243 break; 1244 case AUDIO_ENCODING_ALAW: 1245 if (mode == AUMODE_PLAY) { 1246 p->factor = 2; 1247 p->sw_code = alaw_to_ulinear16; 1248 } else 1249 p->sw_code = ulinear8_to_alaw; 1250 break; 1251 default: 1252 return (EINVAL); 1253 } 1254 } 1255 1256 if (usemode == AUMODE_RECORD) 1257 rate = rec->sample_rate; 1258 else 1259 rate = play->sample_rate; 1260 1261 ess_write_x_reg(sc, ESS_XCMD_SAMPLE_RATE, ess_srtotc(rate)); 1262 ess_write_x_reg(sc, ESS_XCMD_FILTER_CLOCK, ess_srtofc(rate)); 1263 1264 if (!ESS_USE_AUDIO1(sc->sc_model)) { 1265 ess_write_mix_reg(sc, ESS_MREG_SAMPLE_RATE, ess_srtotc(rate)); 1266 ess_write_mix_reg(sc, ESS_MREG_FILTER_CLOCK, ess_srtofc(rate)); 1267 } 1268 1269 return (0); 1270 } 1271 1272 int 1273 ess_audio1_trigger_output(addr, start, end, blksize, intr, arg, param) 1274 void *addr; 1275 void *start, *end; 1276 int blksize; 1277 void (*intr) __P((void *)); 1278 void *arg; 1279 struct audio_params *param; 1280 { 1281 struct ess_softc *sc = addr; 1282 u_int8_t reg; 1283 1284 DPRINTFN(1, ("ess_audio1_trigger_output: sc=%p start=%p end=%p blksize=%d intr=%p(%p)\n", 1285 addr, start, end, blksize, intr, arg)); 1286 1287 if (sc->sc_audio1.active) 1288 panic("ess_audio1_trigger_output: already running"); 1289 1290 sc->sc_audio1.active = 1; 1291 sc->sc_audio1.intr = intr; 1292 sc->sc_audio1.arg = arg; 1293 if (sc->sc_audio1.polled) { 1294 sc->sc_audio1.dmapos = 0; 1295 sc->sc_audio1.buffersize = (char *)end - (char *)start; 1296 sc->sc_audio1.dmacount = 0; 1297 sc->sc_audio1.blksize = blksize; 1298 timeout(ess_audio1_poll, sc, hz/30); 1299 } 1300 1301 reg = ess_read_x_reg(sc, ESS_XCMD_AUDIO_CTRL); 1302 if (param->channels == 2) { 1303 reg &= ~ESS_AUDIO_CTRL_MONO; 1304 reg |= ESS_AUDIO_CTRL_STEREO; 1305 } else { 1306 reg |= ESS_AUDIO_CTRL_MONO; 1307 reg &= ~ESS_AUDIO_CTRL_STEREO; 1308 } 1309 ess_write_x_reg(sc, ESS_XCMD_AUDIO_CTRL, reg); 1310 1311 reg = ess_read_x_reg(sc, ESS_XCMD_AUDIO1_CTRL1); 1312 if (param->precision * param->factor == 16) 1313 reg |= ESS_AUDIO1_CTRL1_FIFO_SIZE; 1314 else 1315 reg &= ~ESS_AUDIO1_CTRL1_FIFO_SIZE; 1316 if (param->channels == 2) 1317 reg |= ESS_AUDIO1_CTRL1_FIFO_STEREO; 1318 else 1319 reg &= ~ESS_AUDIO1_CTRL1_FIFO_STEREO; 1320 if (param->encoding == AUDIO_ENCODING_SLINEAR_BE || 1321 param->encoding == AUDIO_ENCODING_SLINEAR_LE) 1322 reg |= ESS_AUDIO1_CTRL1_FIFO_SIGNED; 1323 else 1324 reg &= ~ESS_AUDIO1_CTRL1_FIFO_SIGNED; 1325 reg |= ESS_AUDIO1_CTRL1_FIFO_CONNECT; 1326 ess_write_x_reg(sc, ESS_XCMD_AUDIO1_CTRL1, reg); 1327 1328 isa_dmastart(sc->sc_ic, sc->sc_audio1.drq, start, 1329 (char *)end - (char *)start, NULL, 1330 DMAMODE_WRITE | DMAMODE_LOOPDEMAND, BUS_DMA_NOWAIT); 1331 1332 /* Program transfer count registers with 2's complement of count. */ 1333 blksize = -blksize; 1334 ess_write_x_reg(sc, ESS_XCMD_XFER_COUNTLO, blksize); 1335 ess_write_x_reg(sc, ESS_XCMD_XFER_COUNTHI, blksize >> 8); 1336 1337 /* Use 4 bytes per output DMA. */ 1338 ess_set_xreg_bits(sc, ESS_XCMD_DEMAND_CTRL, ESS_DEMAND_CTRL_DEMAND_4); 1339 1340 /* Start auto-init DMA */ 1341 ess_wdsp(sc, ESS_ACMD_ENABLE_SPKR); 1342 reg = ess_read_x_reg(sc, ESS_XCMD_AUDIO1_CTRL2); 1343 reg &= ~(ESS_AUDIO1_CTRL2_DMA_READ | ESS_AUDIO1_CTRL2_ADC_ENABLE); 1344 reg |= ESS_AUDIO1_CTRL2_FIFO_ENABLE | ESS_AUDIO1_CTRL2_AUTO_INIT; 1345 ess_write_x_reg(sc, ESS_XCMD_AUDIO1_CTRL2, reg); 1346 1347 return (0); 1348 } 1349 1350 int 1351 ess_audio2_trigger_output(addr, start, end, blksize, intr, arg, param) 1352 void *addr; 1353 void *start, *end; 1354 int blksize; 1355 void (*intr) __P((void *)); 1356 void *arg; 1357 struct audio_params *param; 1358 { 1359 struct ess_softc *sc = addr; 1360 u_int8_t reg; 1361 1362 DPRINTFN(1, ("ess_audio2_trigger_output: sc=%p start=%p end=%p blksize=%d intr=%p(%p)\n", 1363 addr, start, end, blksize, intr, arg)); 1364 1365 if (sc->sc_audio2.active) 1366 panic("ess_audio2_trigger_output: already running"); 1367 1368 sc->sc_audio2.active = 1; 1369 sc->sc_audio2.intr = intr; 1370 sc->sc_audio2.arg = arg; 1371 if (sc->sc_audio2.polled) { 1372 sc->sc_audio2.dmapos = 0; 1373 sc->sc_audio2.buffersize = (char *)end - (char *)start; 1374 sc->sc_audio2.dmacount = 0; 1375 sc->sc_audio2.blksize = blksize; 1376 timeout(ess_audio2_poll, sc, hz/30); 1377 } 1378 1379 reg = ess_read_mix_reg(sc, ESS_MREG_AUDIO2_CTRL2); 1380 if (param->precision * param->factor == 16) 1381 reg |= ESS_AUDIO2_CTRL2_FIFO_SIZE; 1382 else 1383 reg &= ~ESS_AUDIO2_CTRL2_FIFO_SIZE; 1384 if (param->channels == 2) 1385 reg |= ESS_AUDIO2_CTRL2_CHANNELS; 1386 else 1387 reg &= ~ESS_AUDIO2_CTRL2_CHANNELS; 1388 if (param->encoding == AUDIO_ENCODING_SLINEAR_BE || 1389 param->encoding == AUDIO_ENCODING_SLINEAR_LE) 1390 reg |= ESS_AUDIO2_CTRL2_FIFO_SIGNED; 1391 else 1392 reg &= ~ESS_AUDIO2_CTRL2_FIFO_SIGNED; 1393 ess_write_mix_reg(sc, ESS_MREG_AUDIO2_CTRL2, reg); 1394 1395 isa_dmastart(sc->sc_ic, sc->sc_audio2.drq, start, 1396 (char *)end - (char *)start, NULL, 1397 DMAMODE_WRITE | DMAMODE_LOOPDEMAND, BUS_DMA_NOWAIT); 1398 1399 if (IS16BITDRQ(sc->sc_audio2.drq)) 1400 blksize >>= 1; /* use word count for 16 bit DMA */ 1401 /* Program transfer count registers with 2's complement of count. */ 1402 blksize = -blksize; 1403 ess_write_mix_reg(sc, ESS_MREG_XFER_COUNTLO, blksize); 1404 ess_write_mix_reg(sc, ESS_MREG_XFER_COUNTHI, blksize >> 8); 1405 1406 reg = ess_read_mix_reg(sc, ESS_MREG_AUDIO2_CTRL1); 1407 if (IS16BITDRQ(sc->sc_audio2.drq)) 1408 reg |= ESS_AUDIO2_CTRL1_XFER_SIZE; 1409 else 1410 reg &= ~ESS_AUDIO2_CTRL1_XFER_SIZE; 1411 reg |= ESS_AUDIO2_CTRL1_DEMAND_8; 1412 reg |= ESS_AUDIO2_CTRL1_DAC_ENABLE | ESS_AUDIO2_CTRL1_FIFO_ENABLE | 1413 ESS_AUDIO2_CTRL1_AUTO_INIT; 1414 ess_write_mix_reg(sc, ESS_MREG_AUDIO2_CTRL1, reg); 1415 1416 return (0); 1417 } 1418 1419 int 1420 ess_audio1_trigger_input(addr, start, end, blksize, intr, arg, param) 1421 void *addr; 1422 void *start, *end; 1423 int blksize; 1424 void (*intr) __P((void *)); 1425 void *arg; 1426 struct audio_params *param; 1427 { 1428 struct ess_softc *sc = addr; 1429 u_int8_t reg; 1430 1431 DPRINTFN(1, ("ess_audio1_trigger_input: sc=%p start=%p end=%p blksize=%d intr=%p(%p)\n", 1432 addr, start, end, blksize, intr, arg)); 1433 1434 if (sc->sc_audio1.active) 1435 panic("ess_audio1_trigger_input: already running"); 1436 1437 sc->sc_audio1.active = 1; 1438 sc->sc_audio1.intr = intr; 1439 sc->sc_audio1.arg = arg; 1440 if (sc->sc_audio1.polled) { 1441 sc->sc_audio1.dmapos = 0; 1442 sc->sc_audio1.buffersize = (char *)end - (char *)start; 1443 sc->sc_audio1.dmacount = 0; 1444 sc->sc_audio1.blksize = blksize; 1445 timeout(ess_audio1_poll, sc, hz/30); 1446 } 1447 1448 reg = ess_read_x_reg(sc, ESS_XCMD_AUDIO_CTRL); 1449 if (param->channels == 2) { 1450 reg &= ~ESS_AUDIO_CTRL_MONO; 1451 reg |= ESS_AUDIO_CTRL_STEREO; 1452 } else { 1453 reg |= ESS_AUDIO_CTRL_MONO; 1454 reg &= ~ESS_AUDIO_CTRL_STEREO; 1455 } 1456 ess_write_x_reg(sc, ESS_XCMD_AUDIO_CTRL, reg); 1457 1458 reg = ess_read_x_reg(sc, ESS_XCMD_AUDIO1_CTRL1); 1459 if (param->precision * param->factor == 16) 1460 reg |= ESS_AUDIO1_CTRL1_FIFO_SIZE; 1461 else 1462 reg &= ~ESS_AUDIO1_CTRL1_FIFO_SIZE; 1463 if (param->channels == 2) 1464 reg |= ESS_AUDIO1_CTRL1_FIFO_STEREO; 1465 else 1466 reg &= ~ESS_AUDIO1_CTRL1_FIFO_STEREO; 1467 if (param->encoding == AUDIO_ENCODING_SLINEAR_BE || 1468 param->encoding == AUDIO_ENCODING_SLINEAR_LE) 1469 reg |= ESS_AUDIO1_CTRL1_FIFO_SIGNED; 1470 else 1471 reg &= ~ESS_AUDIO1_CTRL1_FIFO_SIGNED; 1472 reg |= ESS_AUDIO1_CTRL1_FIFO_CONNECT; 1473 ess_write_x_reg(sc, ESS_XCMD_AUDIO1_CTRL1, reg); 1474 1475 isa_dmastart(sc->sc_ic, sc->sc_audio1.drq, start, 1476 (char *)end - (char *)start, NULL, 1477 DMAMODE_READ | DMAMODE_LOOPDEMAND, BUS_DMA_NOWAIT); 1478 1479 /* Program transfer count registers with 2's complement of count. */ 1480 blksize = -blksize; 1481 ess_write_x_reg(sc, ESS_XCMD_XFER_COUNTLO, blksize); 1482 ess_write_x_reg(sc, ESS_XCMD_XFER_COUNTHI, blksize >> 8); 1483 1484 /* Use 4 bytes per input DMA. */ 1485 ess_set_xreg_bits(sc, ESS_XCMD_DEMAND_CTRL, ESS_DEMAND_CTRL_DEMAND_4); 1486 1487 /* Start auto-init DMA */ 1488 ess_wdsp(sc, ESS_ACMD_DISABLE_SPKR); 1489 reg = ess_read_x_reg(sc, ESS_XCMD_AUDIO1_CTRL2); 1490 reg |= ESS_AUDIO1_CTRL2_DMA_READ | ESS_AUDIO1_CTRL2_ADC_ENABLE; 1491 reg |= ESS_AUDIO1_CTRL2_FIFO_ENABLE | ESS_AUDIO1_CTRL2_AUTO_INIT; 1492 ess_write_x_reg(sc, ESS_XCMD_AUDIO1_CTRL2, reg); 1493 1494 return (0); 1495 } 1496 1497 int 1498 ess_audio1_halt(addr) 1499 void *addr; 1500 { 1501 struct ess_softc *sc = addr; 1502 1503 DPRINTF(("ess_audio1_halt: sc=%p\n", sc)); 1504 1505 if (sc->sc_audio1.active) { 1506 ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO1_CTRL2, 1507 ESS_AUDIO1_CTRL2_FIFO_ENABLE); 1508 isa_dmaabort(sc->sc_ic, sc->sc_audio1.drq); 1509 if (sc->sc_audio1.polled) 1510 untimeout(ess_audio1_poll, sc); 1511 sc->sc_audio1.active = 0; 1512 } 1513 1514 return (0); 1515 } 1516 1517 int 1518 ess_audio2_halt(addr) 1519 void *addr; 1520 { 1521 struct ess_softc *sc = addr; 1522 1523 DPRINTF(("ess_audio2_halt: sc=%p\n", sc)); 1524 1525 if (sc->sc_audio2.active) { 1526 ess_clear_mreg_bits(sc, ESS_MREG_AUDIO2_CTRL1, 1527 ESS_AUDIO2_CTRL1_DAC_ENABLE | 1528 ESS_AUDIO2_CTRL1_FIFO_ENABLE); 1529 isa_dmaabort(sc->sc_ic, sc->sc_audio2.drq); 1530 if (sc->sc_audio2.polled) 1531 untimeout(ess_audio2_poll, sc); 1532 sc->sc_audio2.active = 0; 1533 } 1534 1535 return (0); 1536 } 1537 1538 int 1539 ess_audio1_intr(arg) 1540 void *arg; 1541 { 1542 struct ess_softc *sc = arg; 1543 u_int8_t reg; 1544 1545 DPRINTFN(1,("ess_audio1_intr: intr=%p\n", sc->sc_audio1.intr)); 1546 1547 /* Check and clear interrupt on Audio1. */ 1548 reg = EREAD1(sc->sc_iot, sc->sc_ioh, ESS_DSP_RW_STATUS); 1549 if ((reg & ESS_DSP_READ_OFLOW) == 0) 1550 return (0); 1551 reg = EREAD1(sc->sc_iot, sc->sc_ioh, ESS_CLEAR_INTR); 1552 1553 sc->sc_audio1.nintr++; 1554 1555 if (sc->sc_audio1.active) { 1556 (*sc->sc_audio1.intr)(sc->sc_audio1.arg); 1557 return (1); 1558 } else 1559 return (0); 1560 } 1561 1562 int 1563 ess_audio2_intr(arg) 1564 void *arg; 1565 { 1566 struct ess_softc *sc = arg; 1567 u_int8_t reg; 1568 1569 DPRINTFN(1,("ess_audio2_intr: intr=%p\n", sc->sc_audio2.intr)); 1570 1571 /* Check and clear interrupt on Audio2. */ 1572 reg = ess_read_mix_reg(sc, ESS_MREG_AUDIO2_CTRL2); 1573 if ((reg & ESS_AUDIO2_CTRL2_IRQ_LATCH) == 0) 1574 return (0); 1575 reg &= ~ESS_AUDIO2_CTRL2_IRQ_LATCH; 1576 ess_write_mix_reg(sc, ESS_MREG_AUDIO2_CTRL2, reg); 1577 1578 sc->sc_audio2.nintr++; 1579 1580 if (sc->sc_audio2.active) { 1581 (*sc->sc_audio2.intr)(sc->sc_audio2.arg); 1582 return (1); 1583 } else 1584 return (0); 1585 } 1586 1587 void 1588 ess_audio1_poll(addr) 1589 void *addr; 1590 { 1591 struct ess_softc *sc = addr; 1592 int dmapos, dmacount; 1593 1594 if (!sc->sc_audio1.active) 1595 return; 1596 1597 sc->sc_audio1.nintr++; 1598 1599 dmapos = isa_dmacount(sc->sc_ic, sc->sc_audio1.drq); 1600 dmacount = sc->sc_audio1.dmapos - dmapos; 1601 if (dmacount < 0) 1602 dmacount += sc->sc_audio1.buffersize; 1603 sc->sc_audio1.dmapos = dmapos; 1604 #if 1 1605 dmacount += sc->sc_audio1.dmacount; 1606 while (dmacount > sc->sc_audio1.blksize) { 1607 dmacount -= sc->sc_audio1.blksize; 1608 (*sc->sc_audio1.intr)(sc->sc_audio1.arg); 1609 } 1610 sc->sc_audio1.dmacount = dmacount; 1611 #else 1612 (*sc->sc_audio1.intr)(sc->sc_audio1.arg, dmacount); 1613 #endif 1614 1615 timeout(ess_audio1_poll, sc, hz/30); 1616 } 1617 1618 void 1619 ess_audio2_poll(addr) 1620 void *addr; 1621 { 1622 struct ess_softc *sc = addr; 1623 int dmapos, dmacount; 1624 1625 if (!sc->sc_audio2.active) 1626 return; 1627 1628 sc->sc_audio2.nintr++; 1629 1630 dmapos = isa_dmacount(sc->sc_ic, sc->sc_audio2.drq); 1631 dmacount = sc->sc_audio2.dmapos - dmapos; 1632 if (dmacount < 0) 1633 dmacount += sc->sc_audio2.buffersize; 1634 sc->sc_audio2.dmapos = dmapos; 1635 #if 1 1636 dmacount += sc->sc_audio2.dmacount; 1637 while (dmacount > sc->sc_audio2.blksize) { 1638 dmacount -= sc->sc_audio2.blksize; 1639 (*sc->sc_audio2.intr)(sc->sc_audio2.arg); 1640 } 1641 sc->sc_audio2.dmacount = dmacount; 1642 #else 1643 (*sc->sc_audio2.intr)(sc->sc_audio2.arg, dmacount); 1644 #endif 1645 1646 timeout(ess_audio2_poll, sc, hz/30); 1647 } 1648 1649 int 1650 ess_round_blocksize(addr, blk) 1651 void *addr; 1652 int blk; 1653 { 1654 return (blk & -8); /* round for max DMA size */ 1655 } 1656 1657 int 1658 ess_set_port(addr, cp) 1659 void *addr; 1660 mixer_ctrl_t *cp; 1661 { 1662 struct ess_softc *sc = addr; 1663 int lgain, rgain; 1664 1665 DPRINTFN(5,("ess_set_port: port=%d num_channels=%d\n", 1666 cp->dev, cp->un.value.num_channels)); 1667 1668 switch (cp->dev) { 1669 /* 1670 * The following mixer ports are all stereo. If we get a 1671 * single-channel gain value passed in, then we duplicate it 1672 * to both left and right channels. 1673 */ 1674 case ESS_MASTER_VOL: 1675 case ESS_DAC_PLAY_VOL: 1676 case ESS_MIC_PLAY_VOL: 1677 case ESS_LINE_PLAY_VOL: 1678 case ESS_SYNTH_PLAY_VOL: 1679 case ESS_CD_PLAY_VOL: 1680 case ESS_AUXB_PLAY_VOL: 1681 case ESS_RECORD_VOL: 1682 if (cp->type != AUDIO_MIXER_VALUE) 1683 return EINVAL; 1684 1685 switch (cp->un.value.num_channels) { 1686 case 1: 1687 lgain = rgain = ESS_4BIT_GAIN( 1688 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 1689 break; 1690 case 2: 1691 lgain = ESS_4BIT_GAIN( 1692 cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT]); 1693 rgain = ESS_4BIT_GAIN( 1694 cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]); 1695 break; 1696 default: 1697 return EINVAL; 1698 } 1699 1700 sc->gain[cp->dev][ESS_LEFT] = lgain; 1701 sc->gain[cp->dev][ESS_RIGHT] = rgain; 1702 ess_set_gain(sc, cp->dev, 1); 1703 return (0); 1704 1705 /* 1706 * The PC speaker port is mono. If we get a stereo gain value 1707 * passed in, then we return EINVAL. 1708 */ 1709 case ESS_PCSPEAKER_VOL: 1710 if (cp->un.value.num_channels != 1) 1711 return EINVAL; 1712 1713 sc->gain[cp->dev][ESS_LEFT] = sc->gain[cp->dev][ESS_RIGHT] = 1714 ESS_3BIT_GAIN(cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 1715 ess_set_gain(sc, cp->dev, 1); 1716 return (0); 1717 1718 case ESS_RECORD_SOURCE: 1719 if (ESS_USE_AUDIO1(sc->sc_model)) { 1720 if (cp->type == AUDIO_MIXER_ENUM) 1721 return (ess_set_in_port(sc, cp->un.ord)); 1722 else 1723 return (EINVAL); 1724 } else { 1725 if (cp->type == AUDIO_MIXER_SET) 1726 return (ess_set_in_ports(sc, cp->un.mask)); 1727 else 1728 return (EINVAL); 1729 } 1730 return (0); 1731 1732 case ESS_RECORD_MONITOR: 1733 if (cp->type != AUDIO_MIXER_ENUM) 1734 return EINVAL; 1735 1736 if (cp->un.ord) 1737 /* Enable monitor */ 1738 ess_set_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL, 1739 ESS_AUDIO_CTRL_MONITOR); 1740 else 1741 /* Disable monitor */ 1742 ess_clear_xreg_bits(sc, ESS_XCMD_AUDIO_CTRL, 1743 ESS_AUDIO_CTRL_MONITOR); 1744 return (0); 1745 } 1746 1747 if (ESS_USE_AUDIO1(sc->sc_model)) 1748 return (EINVAL); 1749 1750 switch (cp->dev) { 1751 case ESS_DAC_REC_VOL: 1752 case ESS_MIC_REC_VOL: 1753 case ESS_LINE_REC_VOL: 1754 case ESS_SYNTH_REC_VOL: 1755 case ESS_CD_REC_VOL: 1756 case ESS_AUXB_REC_VOL: 1757 if (cp->type != AUDIO_MIXER_VALUE) 1758 return EINVAL; 1759 1760 switch (cp->un.value.num_channels) { 1761 case 1: 1762 lgain = rgain = ESS_4BIT_GAIN( 1763 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]); 1764 break; 1765 case 2: 1766 lgain = ESS_4BIT_GAIN( 1767 cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT]); 1768 rgain = ESS_4BIT_GAIN( 1769 cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]); 1770 break; 1771 default: 1772 return EINVAL; 1773 } 1774 1775 sc->gain[cp->dev][ESS_LEFT] = lgain; 1776 sc->gain[cp->dev][ESS_RIGHT] = rgain; 1777 ess_set_gain(sc, cp->dev, 1); 1778 return (0); 1779 1780 case ESS_MIC_PREAMP: 1781 if (cp->type != AUDIO_MIXER_ENUM) 1782 return EINVAL; 1783 1784 if (cp->un.ord) 1785 /* Enable microphone preamp */ 1786 ess_set_xreg_bits(sc, ESS_XCMD_PREAMP_CTRL, 1787 ESS_PREAMP_CTRL_ENABLE); 1788 else 1789 /* Disable microphone preamp */ 1790 ess_clear_xreg_bits(sc, ESS_XCMD_PREAMP_CTRL, 1791 ESS_PREAMP_CTRL_ENABLE); 1792 return (0); 1793 } 1794 1795 return (EINVAL); 1796 } 1797 1798 int 1799 ess_get_port(addr, cp) 1800 void *addr; 1801 mixer_ctrl_t *cp; 1802 { 1803 struct ess_softc *sc = addr; 1804 1805 DPRINTFN(5,("ess_get_port: port=%d\n", cp->dev)); 1806 1807 switch (cp->dev) { 1808 case ESS_MASTER_VOL: 1809 case ESS_DAC_PLAY_VOL: 1810 case ESS_MIC_PLAY_VOL: 1811 case ESS_LINE_PLAY_VOL: 1812 case ESS_SYNTH_PLAY_VOL: 1813 case ESS_CD_PLAY_VOL: 1814 case ESS_AUXB_PLAY_VOL: 1815 case ESS_RECORD_VOL: 1816 switch (cp->un.value.num_channels) { 1817 case 1: 1818 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] = 1819 sc->gain[cp->dev][ESS_LEFT]; 1820 break; 1821 case 2: 1822 cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = 1823 sc->gain[cp->dev][ESS_LEFT]; 1824 cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = 1825 sc->gain[cp->dev][ESS_RIGHT]; 1826 break; 1827 default: 1828 return EINVAL; 1829 } 1830 return (0); 1831 1832 case ESS_PCSPEAKER_VOL: 1833 if (cp->un.value.num_channels != 1) 1834 return EINVAL; 1835 1836 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] = 1837 sc->gain[cp->dev][ESS_LEFT]; 1838 return (0); 1839 1840 case ESS_RECORD_SOURCE: 1841 if (ESS_USE_AUDIO1(sc->sc_model)) 1842 cp->un.ord = sc->in_port; 1843 else 1844 cp->un.mask = sc->in_mask; 1845 return (0); 1846 1847 case ESS_RECORD_MONITOR: 1848 cp->un.ord = (ess_read_x_reg(sc, ESS_XCMD_AUDIO_CTRL) & 1849 ESS_AUDIO_CTRL_MONITOR) ? 1 : 0; 1850 return (0); 1851 } 1852 1853 if (ESS_USE_AUDIO1(sc->sc_model)) 1854 return (EINVAL); 1855 1856 switch (cp->dev) { 1857 case ESS_DAC_REC_VOL: 1858 case ESS_MIC_REC_VOL: 1859 case ESS_LINE_REC_VOL: 1860 case ESS_SYNTH_REC_VOL: 1861 case ESS_CD_REC_VOL: 1862 case ESS_AUXB_REC_VOL: 1863 switch (cp->un.value.num_channels) { 1864 case 1: 1865 cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] = 1866 sc->gain[cp->dev][ESS_LEFT]; 1867 break; 1868 case 2: 1869 cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT] = 1870 sc->gain[cp->dev][ESS_LEFT]; 1871 cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = 1872 sc->gain[cp->dev][ESS_RIGHT]; 1873 break; 1874 default: 1875 return EINVAL; 1876 } 1877 return (0); 1878 1879 case ESS_MIC_PREAMP: 1880 cp->un.ord = (ess_read_x_reg(sc, ESS_XCMD_PREAMP_CTRL) & 1881 ESS_PREAMP_CTRL_ENABLE) ? 1 : 0; 1882 return (0); 1883 } 1884 1885 return (EINVAL); 1886 } 1887 1888 int 1889 ess_query_devinfo(addr, dip) 1890 void *addr; 1891 mixer_devinfo_t *dip; 1892 { 1893 struct ess_softc *sc = addr; 1894 1895 DPRINTFN(5,("ess_query_devinfo: model=%d index=%d\n", 1896 sc->sc_model, dip->index)); 1897 1898 /* 1899 * REVISIT: There are some slight differences between the 1900 * mixers on the different ESS chips, which can 1901 * be sorted out using the chip model rather than a 1902 * separate mixer model. 1903 * This is currently coded assuming an ES1887; we 1904 * need to work out which bits are not applicable to 1905 * the other models (1888 and 888). 1906 */ 1907 switch (dip->index) { 1908 case ESS_DAC_PLAY_VOL: 1909 dip->mixer_class = ESS_INPUT_CLASS; 1910 dip->next = dip->prev = AUDIO_MIXER_LAST; 1911 strcpy(dip->label.name, AudioNdac); 1912 dip->type = AUDIO_MIXER_VALUE; 1913 dip->un.v.num_channels = 2; 1914 strcpy(dip->un.v.units.name, AudioNvolume); 1915 return (0); 1916 1917 case ESS_MIC_PLAY_VOL: 1918 dip->mixer_class = ESS_INPUT_CLASS; 1919 dip->prev = AUDIO_MIXER_LAST; 1920 if (ESS_USE_AUDIO1(sc->sc_model)) 1921 dip->next = AUDIO_MIXER_LAST; 1922 else 1923 dip->next = ESS_MIC_PREAMP; 1924 strcpy(dip->label.name, AudioNmicrophone); 1925 dip->type = AUDIO_MIXER_VALUE; 1926 dip->un.v.num_channels = 2; 1927 strcpy(dip->un.v.units.name, AudioNvolume); 1928 return (0); 1929 1930 case ESS_LINE_PLAY_VOL: 1931 dip->mixer_class = ESS_INPUT_CLASS; 1932 dip->next = dip->prev = AUDIO_MIXER_LAST; 1933 strcpy(dip->label.name, AudioNline); 1934 dip->type = AUDIO_MIXER_VALUE; 1935 dip->un.v.num_channels = 2; 1936 strcpy(dip->un.v.units.name, AudioNvolume); 1937 return (0); 1938 1939 case ESS_SYNTH_PLAY_VOL: 1940 dip->mixer_class = ESS_INPUT_CLASS; 1941 dip->next = dip->prev = AUDIO_MIXER_LAST; 1942 strcpy(dip->label.name, AudioNfmsynth); 1943 dip->type = AUDIO_MIXER_VALUE; 1944 dip->un.v.num_channels = 2; 1945 strcpy(dip->un.v.units.name, AudioNvolume); 1946 return (0); 1947 1948 case ESS_CD_PLAY_VOL: 1949 dip->mixer_class = ESS_INPUT_CLASS; 1950 dip->next = dip->prev = AUDIO_MIXER_LAST; 1951 strcpy(dip->label.name, AudioNcd); 1952 dip->type = AUDIO_MIXER_VALUE; 1953 dip->un.v.num_channels = 2; 1954 strcpy(dip->un.v.units.name, AudioNvolume); 1955 return (0); 1956 1957 case ESS_AUXB_PLAY_VOL: 1958 dip->mixer_class = ESS_INPUT_CLASS; 1959 dip->next = dip->prev = AUDIO_MIXER_LAST; 1960 strcpy(dip->label.name, "auxb"); 1961 dip->type = AUDIO_MIXER_VALUE; 1962 dip->un.v.num_channels = 2; 1963 strcpy(dip->un.v.units.name, AudioNvolume); 1964 return (0); 1965 1966 case ESS_INPUT_CLASS: 1967 dip->mixer_class = ESS_INPUT_CLASS; 1968 dip->next = dip->prev = AUDIO_MIXER_LAST; 1969 strcpy(dip->label.name, AudioCinputs); 1970 dip->type = AUDIO_MIXER_CLASS; 1971 return (0); 1972 1973 case ESS_MASTER_VOL: 1974 dip->mixer_class = ESS_OUTPUT_CLASS; 1975 dip->next = dip->prev = AUDIO_MIXER_LAST; 1976 strcpy(dip->label.name, AudioNmaster); 1977 dip->type = AUDIO_MIXER_VALUE; 1978 dip->un.v.num_channels = 2; 1979 strcpy(dip->un.v.units.name, AudioNvolume); 1980 return (0); 1981 1982 case ESS_PCSPEAKER_VOL: 1983 dip->mixer_class = ESS_OUTPUT_CLASS; 1984 dip->next = dip->prev = AUDIO_MIXER_LAST; 1985 strcpy(dip->label.name, "pc_speaker"); 1986 dip->type = AUDIO_MIXER_VALUE; 1987 dip->un.v.num_channels = 1; 1988 strcpy(dip->un.v.units.name, AudioNvolume); 1989 return (0); 1990 1991 case ESS_OUTPUT_CLASS: 1992 dip->mixer_class = ESS_OUTPUT_CLASS; 1993 dip->next = dip->prev = AUDIO_MIXER_LAST; 1994 strcpy(dip->label.name, AudioCoutputs); 1995 dip->type = AUDIO_MIXER_CLASS; 1996 return (0); 1997 1998 case ESS_RECORD_VOL: 1999 dip->mixer_class = ESS_RECORD_CLASS; 2000 dip->next = dip->prev = AUDIO_MIXER_LAST; 2001 strcpy(dip->label.name, AudioNrecord); 2002 dip->type = AUDIO_MIXER_VALUE; 2003 dip->un.v.num_channels = 2; 2004 strcpy(dip->un.v.units.name, AudioNvolume); 2005 return (0); 2006 2007 case ESS_RECORD_SOURCE: 2008 dip->mixer_class = ESS_RECORD_CLASS; 2009 dip->next = dip->prev = AUDIO_MIXER_LAST; 2010 strcpy(dip->label.name, AudioNsource); 2011 if (ESS_USE_AUDIO1(sc->sc_model)) { 2012 /* 2013 * The 1788 doesn't use the input mixer control that 2014 * the 1888 uses, because it's a pain when you only 2015 * have one mixer. 2016 * Perhaps it could be emulated by keeping both sets of 2017 * gain values, and doing a `context switch' of the 2018 * mixer registers when shifting from playing to 2019 * recording. 2020 */ 2021 dip->type = AUDIO_MIXER_ENUM; 2022 dip->un.e.num_mem = 4; 2023 strcpy(dip->un.e.member[0].label.name, AudioNmicrophone); 2024 dip->un.e.member[0].ord = ESS_SOURCE_MIC; 2025 strcpy(dip->un.e.member[1].label.name, AudioNline); 2026 dip->un.e.member[1].ord = ESS_SOURCE_LINE; 2027 strcpy(dip->un.e.member[2].label.name, AudioNcd); 2028 dip->un.e.member[2].ord = ESS_SOURCE_CD; 2029 strcpy(dip->un.e.member[3].label.name, AudioNmixerout); 2030 dip->un.e.member[3].ord = ESS_SOURCE_MIXER; 2031 } else { 2032 dip->type = AUDIO_MIXER_SET; 2033 dip->un.s.num_mem = 6; 2034 strcpy(dip->un.s.member[0].label.name, AudioNdac); 2035 dip->un.s.member[0].mask = 1 << ESS_DAC_REC_VOL; 2036 strcpy(dip->un.s.member[1].label.name, AudioNmicrophone); 2037 dip->un.s.member[1].mask = 1 << ESS_MIC_REC_VOL; 2038 strcpy(dip->un.s.member[2].label.name, AudioNline); 2039 dip->un.s.member[2].mask = 1 << ESS_LINE_REC_VOL; 2040 strcpy(dip->un.s.member[3].label.name, AudioNfmsynth); 2041 dip->un.s.member[3].mask = 1 << ESS_SYNTH_REC_VOL; 2042 strcpy(dip->un.s.member[4].label.name, AudioNcd); 2043 dip->un.s.member[4].mask = 1 << ESS_CD_REC_VOL; 2044 strcpy(dip->un.s.member[5].label.name, "auxb"); 2045 dip->un.s.member[5].mask = 1 << ESS_AUXB_REC_VOL; 2046 } 2047 return (0); 2048 2049 case ESS_RECORD_CLASS: 2050 dip->mixer_class = ESS_RECORD_CLASS; 2051 dip->next = dip->prev = AUDIO_MIXER_LAST; 2052 strcpy(dip->label.name, AudioCrecord); 2053 dip->type = AUDIO_MIXER_CLASS; 2054 return (0); 2055 2056 case ESS_RECORD_MONITOR: 2057 dip->prev = dip->next = AUDIO_MIXER_LAST; 2058 strcpy(dip->label.name, AudioNmute); 2059 dip->type = AUDIO_MIXER_ENUM; 2060 dip->mixer_class = ESS_MONITOR_CLASS; 2061 dip->un.e.num_mem = 2; 2062 strcpy(dip->un.e.member[0].label.name, AudioNoff); 2063 dip->un.e.member[0].ord = 0; 2064 strcpy(dip->un.e.member[1].label.name, AudioNon); 2065 dip->un.e.member[1].ord = 1; 2066 return (0); 2067 2068 case ESS_MONITOR_CLASS: 2069 dip->mixer_class = ESS_MONITOR_CLASS; 2070 dip->next = dip->prev = AUDIO_MIXER_LAST; 2071 strcpy(dip->label.name, AudioCmonitor); 2072 dip->type = AUDIO_MIXER_CLASS; 2073 return (0); 2074 } 2075 2076 if (ESS_USE_AUDIO1(sc->sc_model)) 2077 return (ENXIO); 2078 2079 switch (dip->index) { 2080 case ESS_DAC_REC_VOL: 2081 dip->mixer_class = ESS_RECORD_CLASS; 2082 dip->next = dip->prev = AUDIO_MIXER_LAST; 2083 strcpy(dip->label.name, AudioNdac); 2084 dip->type = AUDIO_MIXER_VALUE; 2085 dip->un.v.num_channels = 2; 2086 strcpy(dip->un.v.units.name, AudioNvolume); 2087 return (0); 2088 2089 case ESS_MIC_REC_VOL: 2090 dip->mixer_class = ESS_RECORD_CLASS; 2091 dip->next = dip->prev = AUDIO_MIXER_LAST; 2092 strcpy(dip->label.name, AudioNmicrophone); 2093 dip->type = AUDIO_MIXER_VALUE; 2094 dip->un.v.num_channels = 2; 2095 strcpy(dip->un.v.units.name, AudioNvolume); 2096 return (0); 2097 2098 case ESS_LINE_REC_VOL: 2099 dip->mixer_class = ESS_RECORD_CLASS; 2100 dip->next = dip->prev = AUDIO_MIXER_LAST; 2101 strcpy(dip->label.name, AudioNline); 2102 dip->type = AUDIO_MIXER_VALUE; 2103 dip->un.v.num_channels = 2; 2104 strcpy(dip->un.v.units.name, AudioNvolume); 2105 return (0); 2106 2107 case ESS_SYNTH_REC_VOL: 2108 dip->mixer_class = ESS_RECORD_CLASS; 2109 dip->next = dip->prev = AUDIO_MIXER_LAST; 2110 strcpy(dip->label.name, AudioNfmsynth); 2111 dip->type = AUDIO_MIXER_VALUE; 2112 dip->un.v.num_channels = 2; 2113 strcpy(dip->un.v.units.name, AudioNvolume); 2114 return (0); 2115 2116 case ESS_CD_REC_VOL: 2117 dip->mixer_class = ESS_RECORD_CLASS; 2118 dip->next = dip->prev = AUDIO_MIXER_LAST; 2119 strcpy(dip->label.name, AudioNcd); 2120 dip->type = AUDIO_MIXER_VALUE; 2121 dip->un.v.num_channels = 2; 2122 strcpy(dip->un.v.units.name, AudioNvolume); 2123 return (0); 2124 2125 case ESS_AUXB_REC_VOL: 2126 dip->mixer_class = ESS_RECORD_CLASS; 2127 dip->next = dip->prev = AUDIO_MIXER_LAST; 2128 strcpy(dip->label.name, "auxb"); 2129 dip->type = AUDIO_MIXER_VALUE; 2130 dip->un.v.num_channels = 2; 2131 strcpy(dip->un.v.units.name, AudioNvolume); 2132 return (0); 2133 2134 case ESS_MIC_PREAMP: 2135 dip->mixer_class = ESS_INPUT_CLASS; 2136 dip->prev = ESS_MIC_PLAY_VOL; 2137 dip->next = AUDIO_MIXER_LAST; 2138 strcpy(dip->label.name, AudioNpreamp); 2139 dip->type = AUDIO_MIXER_ENUM; 2140 dip->un.e.num_mem = 2; 2141 strcpy(dip->un.e.member[0].label.name, AudioNoff); 2142 dip->un.e.member[0].ord = 0; 2143 strcpy(dip->un.e.member[1].label.name, AudioNon); 2144 dip->un.e.member[1].ord = 1; 2145 return (0); 2146 } 2147 2148 return (ENXIO); 2149 } 2150 2151 void * 2152 ess_malloc(addr, direction, size, pool, flags) 2153 void *addr; 2154 int direction; 2155 size_t size; 2156 int pool, flags; 2157 { 2158 struct ess_softc *sc = addr; 2159 int drq; 2160 2161 if ((!ESS_USE_AUDIO1(sc->sc_model)) && direction == AUMODE_PLAY) 2162 drq = sc->sc_audio2.drq; 2163 else 2164 drq = sc->sc_audio1.drq; 2165 return (isa_malloc(sc->sc_ic, drq, size, pool, flags)); 2166 } 2167 2168 void 2169 ess_free(addr, ptr, pool) 2170 void *addr; 2171 void *ptr; 2172 int pool; 2173 { 2174 isa_free(ptr, pool); 2175 } 2176 2177 size_t 2178 ess_round_buffersize(addr, direction, size) 2179 void *addr; 2180 int direction; 2181 size_t size; 2182 { 2183 if (size > MAX_ISADMA) 2184 size = MAX_ISADMA; 2185 return (size); 2186 } 2187 2188 int 2189 ess_mappage(addr, mem, off, prot) 2190 void *addr; 2191 void *mem; 2192 int off; 2193 int prot; 2194 { 2195 return (isa_mappage(mem, off, prot)); 2196 } 2197 2198 int 2199 ess_1788_get_props(addr) 2200 void *addr; 2201 { 2202 2203 return (AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT); 2204 } 2205 2206 int 2207 ess_1888_get_props(addr) 2208 void *addr; 2209 { 2210 2211 return (AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT | AUDIO_PROP_FULLDUPLEX); 2212 } 2213 2214 /* ============================================ 2215 * Generic functions for ess, not used by audio h/w i/f 2216 * ============================================= 2217 */ 2218 2219 /* 2220 * Reset the chip. 2221 * Return non-zero if the chip isn't detected. 2222 */ 2223 int 2224 ess_reset(sc) 2225 struct ess_softc *sc; 2226 { 2227 bus_space_tag_t iot = sc->sc_iot; 2228 bus_space_handle_t ioh = sc->sc_ioh; 2229 2230 sc->sc_audio1.active = 0; 2231 sc->sc_audio2.active = 0; 2232 2233 EWRITE1(iot, ioh, ESS_DSP_RESET, ESS_RESET_EXT); 2234 delay(10000); 2235 EWRITE1(iot, ioh, ESS_DSP_RESET, 0); 2236 if (ess_rdsp(sc) != ESS_MAGIC) 2237 return (1); 2238 2239 /* Enable access to the ESS extension commands. */ 2240 ess_wdsp(sc, ESS_ACMD_ENABLE_EXT); 2241 2242 return (0); 2243 } 2244 2245 void 2246 ess_set_gain(sc, port, on) 2247 struct ess_softc *sc; 2248 int port; 2249 int on; 2250 { 2251 int gain, left, right; 2252 int mix; 2253 int src; 2254 int stereo; 2255 2256 /* 2257 * Most gain controls are found in the mixer registers and 2258 * are stereo. Any that are not, must set mix and stereo as 2259 * required. 2260 */ 2261 mix = 1; 2262 stereo = 1; 2263 2264 switch (port) { 2265 case ESS_MASTER_VOL: 2266 src = ESS_MREG_VOLUME_MASTER; 2267 break; 2268 case ESS_DAC_PLAY_VOL: 2269 if (ESS_USE_AUDIO1(sc->sc_model)) 2270 src = ESS_MREG_VOLUME_VOICE; 2271 else 2272 src = 0x7C; 2273 break; 2274 case ESS_MIC_PLAY_VOL: 2275 src = ESS_MREG_VOLUME_MIC; 2276 break; 2277 case ESS_LINE_PLAY_VOL: 2278 src = ESS_MREG_VOLUME_LINE; 2279 break; 2280 case ESS_SYNTH_PLAY_VOL: 2281 src = ESS_MREG_VOLUME_SYNTH; 2282 break; 2283 case ESS_CD_PLAY_VOL: 2284 src = ESS_MREG_VOLUME_CD; 2285 break; 2286 case ESS_AUXB_PLAY_VOL: 2287 src = ESS_MREG_VOLUME_AUXB; 2288 break; 2289 case ESS_PCSPEAKER_VOL: 2290 src = ESS_MREG_VOLUME_PCSPKR; 2291 stereo = 0; 2292 break; 2293 case ESS_DAC_REC_VOL: 2294 src = 0x69; 2295 break; 2296 case ESS_MIC_REC_VOL: 2297 src = 0x68; 2298 break; 2299 case ESS_LINE_REC_VOL: 2300 src = 0x6E; 2301 break; 2302 case ESS_SYNTH_REC_VOL: 2303 src = 0x6B; 2304 break; 2305 case ESS_CD_REC_VOL: 2306 src = 0x6A; 2307 break; 2308 case ESS_AUXB_REC_VOL: 2309 src = 0x6C; 2310 break; 2311 case ESS_RECORD_VOL: 2312 src = ESS_XCMD_VOLIN_CTRL; 2313 mix = 0; 2314 break; 2315 default: 2316 return; 2317 } 2318 2319 /* 1788 doesn't have a separate recording mixer */ 2320 if (ESS_USE_AUDIO1(sc->sc_model) && mix && src > 0x62) 2321 return; 2322 2323 if (on) { 2324 left = sc->gain[port][ESS_LEFT]; 2325 right = sc->gain[port][ESS_RIGHT]; 2326 } else { 2327 left = right = 0; 2328 } 2329 2330 if (stereo) 2331 gain = ESS_STEREO_GAIN(left, right); 2332 else 2333 gain = ESS_MONO_GAIN(left); 2334 2335 if (mix) 2336 ess_write_mix_reg(sc, src, gain); 2337 else 2338 ess_write_x_reg(sc, src, gain); 2339 } 2340 2341 /* Set the input device on devices without an input mixer. */ 2342 int 2343 ess_set_in_port(sc, ord) 2344 struct ess_softc *sc; 2345 int ord; 2346 { 2347 mixer_devinfo_t di; 2348 int i; 2349 2350 DPRINTF(("ess_set_in_port: ord=0x%x\n", ord)); 2351 2352 /* 2353 * Get the device info for the record source control, 2354 * including the list of available sources. 2355 */ 2356 di.index = ESS_RECORD_SOURCE; 2357 if (ess_query_devinfo(sc, &di)) 2358 return EINVAL; 2359 2360 /* See if the given ord value was anywhere in the list. */ 2361 for (i = 0; i < di.un.e.num_mem; i++) { 2362 if (ord == di.un.e.member[i].ord) 2363 break; 2364 } 2365 if (i == di.un.e.num_mem) 2366 return EINVAL; 2367 2368 ess_write_mix_reg(sc, ESS_MREG_ADC_SOURCE, ord); 2369 2370 sc->in_port = ord; 2371 return (0); 2372 } 2373 2374 /* Set the input device levels on input-mixer-enabled devices. */ 2375 int 2376 ess_set_in_ports(sc, mask) 2377 struct ess_softc *sc; 2378 int mask; 2379 { 2380 mixer_devinfo_t di; 2381 int i, port; 2382 2383 DPRINTF(("ess_set_in_ports: mask=0x%x\n", mask)); 2384 2385 /* 2386 * Get the device info for the record source control, 2387 * including the list of available sources. 2388 */ 2389 di.index = ESS_RECORD_SOURCE; 2390 if (ess_query_devinfo(sc, &di)) 2391 return EINVAL; 2392 2393 /* 2394 * Set or disable the record volume control for each of the 2395 * possible sources. 2396 */ 2397 for (i = 0; i < di.un.s.num_mem; i++) { 2398 /* 2399 * Calculate the source port number from its mask. 2400 */ 2401 port = ffs(di.un.s.member[i].mask); 2402 2403 /* 2404 * Set the source gain: 2405 * to the current value if source is enabled 2406 * to zero if source is disabled 2407 */ 2408 ess_set_gain(sc, port, mask & di.un.s.member[i].mask); 2409 } 2410 2411 sc->in_mask = mask; 2412 return (0); 2413 } 2414 2415 void 2416 ess_speaker_on(sc) 2417 struct ess_softc *sc; 2418 { 2419 /* Disable mute on left- and right-master volume. */ 2420 ess_clear_mreg_bits(sc, ESS_MREG_VOLUME_LEFT, ESS_VOLUME_MUTE); 2421 ess_clear_mreg_bits(sc, ESS_MREG_VOLUME_RIGHT, ESS_VOLUME_MUTE); 2422 } 2423 2424 void 2425 ess_speaker_off(sc) 2426 struct ess_softc *sc; 2427 { 2428 /* Enable mute on left- and right-master volume. */ 2429 ess_set_mreg_bits(sc, ESS_MREG_VOLUME_LEFT, ESS_VOLUME_MUTE); 2430 ess_set_mreg_bits(sc, ESS_MREG_VOLUME_RIGHT, ESS_VOLUME_MUTE); 2431 } 2432 2433 /* 2434 * Calculate the time constant for the requested sampling rate. 2435 */ 2436 u_int 2437 ess_srtotc(rate) 2438 u_int rate; 2439 { 2440 u_int tc; 2441 2442 /* The following formulae are from the ESS data sheet. */ 2443 if (rate <= 22050) 2444 tc = 128 - 397700L / rate; 2445 else 2446 tc = 256 - 795500L / rate; 2447 2448 return (tc); 2449 } 2450 2451 2452 /* 2453 * Calculate the filter constant for the reuqested sampling rate. 2454 */ 2455 u_int 2456 ess_srtofc(rate) 2457 u_int rate; 2458 { 2459 /* 2460 * The following formula is derived from the information in 2461 * the ES1887 data sheet, based on a roll-off frequency of 2462 * 87%. 2463 */ 2464 return (256 - 200279L / rate); 2465 } 2466 2467 2468 /* 2469 * Return the status of the DSP. 2470 */ 2471 u_char 2472 ess_get_dsp_status(sc) 2473 struct ess_softc *sc; 2474 { 2475 return (EREAD1(sc->sc_iot, sc->sc_ioh, ESS_DSP_RW_STATUS)); 2476 } 2477 2478 2479 /* 2480 * Return the read status of the DSP: 1 -> DSP ready for reading 2481 * 0 -> DSP not ready for reading 2482 */ 2483 u_char 2484 ess_dsp_read_ready(sc) 2485 struct ess_softc *sc; 2486 { 2487 return ((ess_get_dsp_status(sc) & ESS_DSP_READ_READY) ? 1 : 0); 2488 } 2489 2490 2491 /* 2492 * Return the write status of the DSP: 1 -> DSP ready for writing 2493 * 0 -> DSP not ready for writing 2494 */ 2495 u_char 2496 ess_dsp_write_ready(sc) 2497 struct ess_softc *sc; 2498 { 2499 return ((ess_get_dsp_status(sc) & ESS_DSP_WRITE_BUSY) ? 0 : 1); 2500 } 2501 2502 2503 /* 2504 * Read a byte from the DSP. 2505 */ 2506 int 2507 ess_rdsp(sc) 2508 struct ess_softc *sc; 2509 { 2510 bus_space_tag_t iot = sc->sc_iot; 2511 bus_space_handle_t ioh = sc->sc_ioh; 2512 int i; 2513 2514 for (i = ESS_READ_TIMEOUT; i > 0; --i) { 2515 if (ess_dsp_read_ready(sc)) { 2516 i = EREAD1(iot, ioh, ESS_DSP_READ); 2517 DPRINTFN(8,("ess_rdsp() = 0x%02x\n", i)); 2518 return i; 2519 } else 2520 delay(10); 2521 } 2522 2523 DPRINTF(("ess_rdsp: timed out\n")); 2524 return (-1); 2525 } 2526 2527 /* 2528 * Write a byte to the DSP. 2529 */ 2530 int 2531 ess_wdsp(sc, v) 2532 struct ess_softc *sc; 2533 u_char v; 2534 { 2535 bus_space_tag_t iot = sc->sc_iot; 2536 bus_space_handle_t ioh = sc->sc_ioh; 2537 int i; 2538 2539 DPRINTFN(8,("ess_wdsp(0x%02x)\n", v)); 2540 2541 for (i = ESS_WRITE_TIMEOUT; i > 0; --i) { 2542 if (ess_dsp_write_ready(sc)) { 2543 EWRITE1(iot, ioh, ESS_DSP_WRITE, v); 2544 return (0); 2545 } else 2546 delay(10); 2547 } 2548 2549 DPRINTF(("ess_wdsp(0x%02x): timed out\n", v)); 2550 return (-1); 2551 } 2552 2553 /* 2554 * Write a value to one of the ESS extended registers. 2555 */ 2556 int 2557 ess_write_x_reg(sc, reg, val) 2558 struct ess_softc *sc; 2559 u_char reg; 2560 u_char val; 2561 { 2562 int error; 2563 2564 DPRINTFN(2,("ess_write_x_reg: %02x=%02x\n", reg, val)); 2565 if ((error = ess_wdsp(sc, reg)) == 0) 2566 error = ess_wdsp(sc, val); 2567 2568 return error; 2569 } 2570 2571 /* 2572 * Read the value of one of the ESS extended registers. 2573 */ 2574 u_char 2575 ess_read_x_reg(sc, reg) 2576 struct ess_softc *sc; 2577 u_char reg; 2578 { 2579 int error; 2580 int val; 2581 2582 if ((error = ess_wdsp(sc, 0xC0)) == 0) 2583 error = ess_wdsp(sc, reg); 2584 if (error) 2585 DPRINTF(("Error reading extended register 0x%02x\n", reg)); 2586 /* REVISIT: what if an error is returned above? */ 2587 val = ess_rdsp(sc); 2588 DPRINTFN(2,("ess_read_x_reg: %02x=%02x\n", reg, val)); 2589 return val; 2590 } 2591 2592 void 2593 ess_clear_xreg_bits(sc, reg, mask) 2594 struct ess_softc *sc; 2595 u_char reg; 2596 u_char mask; 2597 { 2598 if (ess_write_x_reg(sc, reg, ess_read_x_reg(sc, reg) & ~mask) == -1) 2599 DPRINTF(("Error clearing bits in extended register 0x%02x\n", 2600 reg)); 2601 } 2602 2603 void 2604 ess_set_xreg_bits(sc, reg, mask) 2605 struct ess_softc *sc; 2606 u_char reg; 2607 u_char mask; 2608 { 2609 if (ess_write_x_reg(sc, reg, ess_read_x_reg(sc, reg) | mask) == -1) 2610 DPRINTF(("Error setting bits in extended register 0x%02x\n", 2611 reg)); 2612 } 2613 2614 2615 /* 2616 * Write a value to one of the ESS mixer registers. 2617 */ 2618 void 2619 ess_write_mix_reg(sc, reg, val) 2620 struct ess_softc *sc; 2621 u_char reg; 2622 u_char val; 2623 { 2624 bus_space_tag_t iot = sc->sc_iot; 2625 bus_space_handle_t ioh = sc->sc_ioh; 2626 int s; 2627 2628 DPRINTFN(2,("ess_write_mix_reg: %x=%x\n", reg, val)); 2629 2630 s = splaudio(); 2631 EWRITE1(iot, ioh, ESS_MIX_REG_SELECT, reg); 2632 EWRITE1(iot, ioh, ESS_MIX_REG_DATA, val); 2633 splx(s); 2634 } 2635 2636 /* 2637 * Read the value of one of the ESS mixer registers. 2638 */ 2639 u_char 2640 ess_read_mix_reg(sc, reg) 2641 struct ess_softc *sc; 2642 u_char reg; 2643 { 2644 bus_space_tag_t iot = sc->sc_iot; 2645 bus_space_handle_t ioh = sc->sc_ioh; 2646 int s; 2647 u_char val; 2648 2649 s = splaudio(); 2650 EWRITE1(iot, ioh, ESS_MIX_REG_SELECT, reg); 2651 val = EREAD1(iot, ioh, ESS_MIX_REG_DATA); 2652 splx(s); 2653 2654 DPRINTFN(2,("ess_read_mix_reg: %x=%x\n", reg, val)); 2655 return val; 2656 } 2657 2658 void 2659 ess_clear_mreg_bits(sc, reg, mask) 2660 struct ess_softc *sc; 2661 u_char reg; 2662 u_char mask; 2663 { 2664 ess_write_mix_reg(sc, reg, ess_read_mix_reg(sc, reg) & ~mask); 2665 } 2666 2667 void 2668 ess_set_mreg_bits(sc, reg, mask) 2669 struct ess_softc *sc; 2670 u_char reg; 2671 u_char mask; 2672 { 2673 ess_write_mix_reg(sc, reg, ess_read_mix_reg(sc, reg) | mask); 2674 } 2675 2676 void 2677 ess_read_multi_mix_reg(sc, reg, datap, count) 2678 struct ess_softc *sc; 2679 u_char reg; 2680 u_int8_t *datap; 2681 bus_size_t count; 2682 { 2683 bus_space_tag_t iot = sc->sc_iot; 2684 bus_space_handle_t ioh = sc->sc_ioh; 2685 int s; 2686 2687 s = splaudio(); 2688 EWRITE1(iot, ioh, ESS_MIX_REG_SELECT, reg); 2689 bus_space_read_multi_1(iot, ioh, ESS_MIX_REG_DATA, datap, count); 2690 splx(s); 2691 } 2692