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