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