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