xref: /netbsd-src/sys/dev/isa/ess.c (revision 8a8f936f250a330d54f8a24ed0e92aadf9743a7b)
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