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