eso.c revision 1.41
1/*	$OpenBSD: eso.c,v 1.41 2016/01/14 00:07:32 jsg Exp $	*/
2/*	$NetBSD: eso.c,v 1.48 2006/12/18 23:13:39 kleink Exp $	*/
3
4/*
5 * Copyright (c) 1999, 2000, 2004 Klaus J. Klein
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 *    derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32/*
33 * ESS Technology Inc. Solo-1 PCI AudioDrive (ES1938/1946) device driver.
34 */
35
36#include <sys/param.h>
37#include <sys/systm.h>
38#include <sys/kernel.h>
39#include <sys/malloc.h>
40#include <sys/device.h>
41
42#include <dev/pci/pcidevs.h>
43#include <dev/pci/pcivar.h>
44
45#include <sys/audioio.h>
46#include <dev/audio_if.h>
47#include <dev/midi_if.h>
48
49#include <dev/ic/mpuvar.h>
50#include <dev/ic/i8237reg.h>
51#include <dev/pci/esoreg.h>
52#include <dev/pci/esovar.h>
53
54#include <machine/bus.h>
55#include <machine/intr.h>
56
57/*
58 * XXX Work around the 24-bit implementation limit of the Audio 1 DMA
59 * XXX engine by allocating through the ISA DMA tag.
60 */
61#if defined(__amd64__) || defined(__i386__)
62#include "isa.h"
63#if NISA > 0
64#include <dev/isa/isavar.h>
65#endif
66#endif
67
68#if defined(AUDIO_DEBUG) || defined(DEBUG)
69#define	DPRINTF(x)	if (esodebug) printf x
70int	esodebug = 0;
71#else
72#define	DPRINTF(x)
73#endif
74
75struct eso_dma {
76	bus_dma_tag_t		ed_dmat;
77	bus_dmamap_t		ed_map;
78	caddr_t			ed_addr;
79	bus_dma_segment_t	ed_segs[1];
80	int			ed_nsegs;
81	size_t			ed_size;
82	struct eso_dma *	ed_next;
83};
84
85#define KVADDR(dma)	((void *)(dma)->ed_addr)
86#define DMAADDR(dma)	((dma)->ed_map->dm_segs[0].ds_addr)
87
88int eso_match(struct device *, void *, void *);
89void eso_attach(struct device *, struct device *, void *);
90int eso_activate(struct device *, int);
91void eso_defer(struct device *);
92
93struct cfattach eso_ca = {
94	sizeof (struct eso_softc), eso_match, eso_attach, NULL,
95	eso_activate
96};
97
98struct cfdriver eso_cd = {
99	NULL, "eso", DV_DULL
100};
101
102/* PCI interface */
103int eso_intr(void *);
104
105/* MI audio layer interface */
106int	eso_open(void *, int);
107void	eso_close(void *);
108int	eso_query_encoding(void *, struct audio_encoding *);
109int	eso_set_params(void *, int, int, struct audio_params *,
110		    struct audio_params *);
111void	eso_get_default_params(void *, int, struct audio_params *);
112int	eso_round_blocksize(void *, int);
113int	eso_halt_output(void *);
114int	eso_halt_input(void *);
115int	eso_getdev(void *, struct audio_device *);
116int	eso_set_port(void *, mixer_ctrl_t *);
117int	eso_get_port(void *, mixer_ctrl_t *);
118int	eso_query_devinfo(void *, mixer_devinfo_t *);
119void *	eso_allocm(void *, int, size_t, int, int);
120void	eso_freem(void *, void *, int);
121size_t	eso_round_buffersize(void *, int, size_t);
122paddr_t	eso_mappage(void *, void *, off_t, int);
123int	eso_get_props(void *);
124int	eso_trigger_output(void *, void *, void *, int,
125		    void (*)(void *), void *, struct audio_params *);
126int	eso_trigger_input(void *, void *, void *, int,
127		    void (*)(void *), void *, struct audio_params *);
128void	eso_setup(struct eso_softc *, int, int);
129
130struct audio_hw_if eso_hw_if = {
131	eso_open,
132	eso_close,
133	NULL,			/* drain */
134	eso_query_encoding,
135	eso_set_params,
136	eso_round_blocksize,
137	NULL,			/* commit_settings */
138	NULL,			/* init_output */
139	NULL,			/* init_input */
140	NULL,			/* start_output */
141	NULL,			/* start_input */
142	eso_halt_output,
143	eso_halt_input,
144	NULL,			/* speaker_ctl */
145	eso_getdev,
146	NULL,			/* setfd */
147	eso_set_port,
148	eso_get_port,
149	eso_query_devinfo,
150	eso_allocm,
151	eso_freem,
152	eso_round_buffersize,
153	eso_mappage,
154	eso_get_props,
155	eso_trigger_output,
156	eso_trigger_input,
157	eso_get_default_params
158};
159
160const char * const eso_rev2model[] = {
161	"ES1938",
162	"ES1946",
163	"ES1946 rev E"
164};
165
166
167/*
168 * Utility routines
169 */
170
171/* Register access etc. */
172uint8_t	eso_read_ctlreg(struct eso_softc *, uint8_t);
173uint8_t	eso_read_mixreg(struct eso_softc *, uint8_t);
174uint8_t	eso_read_rdr(struct eso_softc *);
175void	eso_reload_master_vol(struct eso_softc *);
176int	eso_reset(struct eso_softc *);
177void	eso_set_gain(struct eso_softc *, uint);
178int	eso_set_recsrc(struct eso_softc *, uint);
179int	eso_set_monooutsrc(struct eso_softc *, uint);
180int	eso_set_monoinbypass(struct eso_softc *, uint);
181int	eso_set_preamp(struct eso_softc *, uint);
182void	eso_write_cmd(struct eso_softc *, uint8_t);
183void	eso_write_ctlreg(struct eso_softc *, uint8_t, uint8_t);
184void	eso_write_mixreg(struct eso_softc *, uint8_t, uint8_t);
185
186/* DMA memory allocation */
187int	eso_allocmem(struct eso_softc *, size_t, size_t, size_t,
188		    int, int, struct eso_dma *);
189void	eso_freemem(struct eso_dma *);
190
191
192int
193eso_match(struct device *parent, void *match, void *aux)
194{
195	struct pci_attach_args *pa = aux;
196
197	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ESSTECH &&
198	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ESSTECH_SOLO1)
199		return (1);
200
201	return (0);
202}
203
204void
205eso_attach(struct device *parent, struct device *self, void *aux)
206{
207	struct eso_softc *sc = (struct eso_softc *)self;
208	struct pci_attach_args *pa = aux;
209	struct audio_attach_args aa;
210	pci_intr_handle_t ih;
211	bus_addr_t vcbase;
212	const char *intrstring;
213	uint8_t mvctl;
214
215	sc->sc_revision = PCI_REVISION(pa->pa_class);
216
217	if (sc->sc_revision <
218	    sizeof (eso_rev2model) / sizeof (eso_rev2model[0]))
219		printf(": %s", eso_rev2model[sc->sc_revision]);
220	else
221		printf(": (unknown rev. 0x%02x)", sc->sc_revision);
222
223	/* Map I/O registers. */
224	if (pci_mapreg_map(pa, ESO_PCI_BAR_IO, PCI_MAPREG_TYPE_IO, 0,
225	    &sc->sc_iot, &sc->sc_ioh, NULL, NULL, 0)) {
226		printf(": can't map i/o space\n");
227		return;
228	}
229	if (pci_mapreg_map(pa, ESO_PCI_BAR_SB, PCI_MAPREG_TYPE_IO, 0,
230	    &sc->sc_sb_iot, &sc->sc_sb_ioh, NULL, NULL, 0)) {
231		printf(": can't map SB I/O space\n");
232		return;
233	}
234	if (pci_mapreg_map(pa, ESO_PCI_BAR_VC, PCI_MAPREG_TYPE_IO, 0,
235	    &sc->sc_dmac_iot, &sc->sc_dmac_ioh, &vcbase, &sc->sc_vcsize, 0)) {
236		vcbase = 0;
237		sc->sc_vcsize = 0x10; /* From the data sheet. */
238	}
239	if (pci_mapreg_map(pa, ESO_PCI_BAR_MPU, PCI_MAPREG_TYPE_IO, 0,
240	    &sc->sc_mpu_iot, &sc->sc_mpu_ioh, NULL, NULL, 0)) {
241		printf(": can't map MPU I/O space\n");
242		return;
243	}
244
245	sc->sc_dmat = pa->pa_dmat;
246	sc->sc_dmas = NULL;
247	sc->sc_dmac_configured = 0;
248
249	sc->sc_pa = *pa;
250
251	eso_setup(sc, 1, 0);
252
253	/* map and establish the interrupt. */
254	if (pci_intr_map(pa, &ih)) {
255		printf(", couldn't map interrupt\n");
256		return;
257	}
258	intrstring = pci_intr_string(pa->pa_pc, ih);
259	sc->sc_ih  = pci_intr_establish(pa->pa_pc, ih, IPL_AUDIO | IPL_MPSAFE,
260	    eso_intr, sc, sc->sc_dev.dv_xname);
261	if (sc->sc_ih == NULL) {
262		printf(", couldn't establish interrupt");
263		if (intrstring != NULL)
264			printf(" at %s", intrstring);
265		printf("\n");
266		return;
267	}
268	printf(", %s\n", intrstring);
269
270	/*
271	 * Set up the DDMA Control register; a suitable I/O region has been
272	 * supposedly mapped in the VC base address register.
273	 *
274	 * The Solo-1 has an ... interesting silicon bug that causes it to
275	 * not respond to I/O space accesses to the Audio 1 DMA controller
276	 * if the latter's mapping base address is aligned on a 1K boundary.
277	 * As a consequence, it is quite possible for the mapping provided
278	 * in the VC BAR to be useless.  To work around this, we defer this
279	 * part until all autoconfiguration on our parent bus is completed
280	 * and then try to map it ourselves in fulfillment of the constraint.
281	 *
282	 * According to the register map we may write to the low 16 bits
283	 * only, but experimenting has shown we're safe.
284	 * -kjk
285	 */
286
287	if (ESO_VALID_DDMAC_BASE(vcbase)) {
288		pci_conf_write(pa->pa_pc, pa->pa_tag, ESO_PCI_DDMAC,
289			       vcbase | ESO_PCI_DDMAC_DE);
290		sc->sc_dmac_configured = 1;
291		sc->sc_dmac_addr = vcbase;
292
293		printf("%s: mapping Audio 1 DMA using VC I/O space at 0x%lx\n",
294		       sc->sc_dev.dv_xname, (unsigned long)vcbase);
295	} else {
296		DPRINTF(("%s: VC I/O space at 0x%lx not suitable, deferring\n",
297			 sc->sc_dev.dv_xname, (unsigned long)vcbase));
298		config_defer((struct device *)sc, eso_defer);
299	}
300
301	audio_attach_mi(&eso_hw_if, sc, &sc->sc_dev);
302
303	aa.type = AUDIODEV_TYPE_OPL;
304	aa.hwif = NULL;
305	aa.hdl = NULL;
306	(void)config_found(&sc->sc_dev, &aa, audioprint);
307
308	aa.type = AUDIODEV_TYPE_MPU;
309	aa.hwif = NULL;
310	aa.hdl = NULL;
311	sc->sc_mpudev = config_found(&sc->sc_dev, &aa, audioprint);
312	if (sc->sc_mpudev != NULL) {
313		/* Unmask the MPU irq. */
314		mvctl = eso_read_mixreg(sc, ESO_MIXREG_MVCTL);
315		mvctl |= ESO_MIXREG_MVCTL_MPUIRQM;
316		eso_write_mixreg(sc, ESO_MIXREG_MVCTL, mvctl);
317	}
318}
319
320void
321eso_setup(struct eso_softc *sc, int verbose, int resuming)
322{
323	struct pci_attach_args *pa = &sc->sc_pa;
324	uint8_t a2mode, tmp;
325	int idx;
326
327	/* Reset the device; bail out upon failure. */
328	if (eso_reset(sc) != 0) {
329		if (verbose) printf(", can't reset\n");
330		return;
331	}
332
333	/* Select the DMA/IRQ policy: DDMA, ISA IRQ emulation disabled. */
334	pci_conf_write(pa->pa_pc, pa->pa_tag, ESO_PCI_S1C,
335		       pci_conf_read(pa->pa_pc, pa->pa_tag, ESO_PCI_S1C) &
336		       ~(ESO_PCI_S1C_IRQP_MASK | ESO_PCI_S1C_DMAP_MASK));
337
338	/* Enable the relevant DMA interrupts. */
339	bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_IRQCTL,
340	    ESO_IO_IRQCTL_A1IRQ | ESO_IO_IRQCTL_A2IRQ | ESO_IO_IRQCTL_HVIRQ |
341	    ESO_IO_IRQCTL_MPUIRQ);
342
343	/* Set up A1's sample rate generator for new-style parameters. */
344	a2mode = eso_read_mixreg(sc, ESO_MIXREG_A2MODE);
345	a2mode |= ESO_MIXREG_A2MODE_NEWA1 | ESO_MIXREG_A2MODE_ASYNC;
346	eso_write_mixreg(sc, ESO_MIXREG_A2MODE, a2mode);
347
348	/* Slave Master Volume to Hardware Volume Control Counter, unmask IRQ. */
349	tmp = eso_read_mixreg(sc, ESO_MIXREG_MVCTL);
350	tmp &= ~ESO_MIXREG_MVCTL_SPLIT;
351	tmp |= ESO_MIXREG_MVCTL_HVIRQM;
352	eso_write_mixreg(sc, ESO_MIXREG_MVCTL, tmp);
353
354	if (!resuming) {
355		/* Set mixer regs to something reasonable, needs work. */
356		sc->sc_recmon = sc->sc_spatializer = sc->sc_mvmute = 0;
357		eso_set_monooutsrc(sc, ESO_MIXREG_MPM_MOMUTE);
358		eso_set_monoinbypass(sc, 0);
359		eso_set_preamp(sc, 1);
360		for (idx = 0; idx < ESO_NGAINDEVS; idx++) {
361			int v;
362
363			switch (idx) {
364 			case ESO_MIC_PLAY_VOL:
365			case ESO_LINE_PLAY_VOL:
366			case ESO_CD_PLAY_VOL:
367			case ESO_MONO_PLAY_VOL:
368			case ESO_AUXB_PLAY_VOL:
369			case ESO_DAC_REC_VOL:
370			case ESO_LINE_REC_VOL:
371			case ESO_SYNTH_REC_VOL:
372			case ESO_CD_REC_VOL:
373			case ESO_MONO_REC_VOL:
374			case ESO_AUXB_REC_VOL:
375			case ESO_SPATIALIZER:
376				v = 0;
377				break;
378			case ESO_MASTER_VOL:
379				v = ESO_GAIN_TO_6BIT(AUDIO_MAX_GAIN / 2);
380				break;
381			default:
382				v = ESO_GAIN_TO_4BIT(AUDIO_MAX_GAIN / 2);
383				break;
384			}
385			sc->sc_gain[idx][ESO_LEFT] =
386			    sc->sc_gain[idx][ESO_RIGHT] = v;
387			eso_set_gain(sc, idx);
388		}
389		eso_set_recsrc(sc, ESO_MIXREG_ERS_MIC);
390	} else {
391		eso_set_monooutsrc(sc, sc->sc_monooutsrc);
392		eso_set_monoinbypass(sc, sc->sc_monoinbypass);
393		eso_set_preamp(sc, sc->sc_preamp);
394		eso_set_recsrc(sc, sc->sc_recsrc);
395
396		/* recmon */
397		tmp = eso_read_ctlreg(sc, ESO_CTLREG_ACTL);
398		if (sc->sc_recmon)
399			tmp |= ESO_CTLREG_ACTL_RECMON;
400		else
401			tmp &= ~ESO_CTLREG_ACTL_RECMON;
402		eso_write_ctlreg(sc, ESO_CTLREG_ACTL, tmp);
403
404		/* spatializer enable */
405		tmp = eso_read_mixreg(sc, ESO_MIXREG_SPAT);
406		if (sc->sc_spatializer)
407			tmp |= ESO_MIXREG_SPAT_ENB;
408		else
409			tmp &= ~ESO_MIXREG_SPAT_ENB;
410		eso_write_mixreg(sc, ESO_MIXREG_SPAT,
411		    tmp | ESO_MIXREG_SPAT_RSTREL);
412
413		/* master volume mute */
414		if (sc->sc_mvmute) {
415			eso_write_mixreg(sc, ESO_MIXREG_LMVM,
416			    eso_read_mixreg(sc, ESO_MIXREG_LMVM) |
417			    ESO_MIXREG_LMVM_MUTE);
418			eso_write_mixreg(sc, ESO_MIXREG_RMVM,
419			    eso_read_mixreg(sc, ESO_MIXREG_RMVM) |
420			    ESO_MIXREG_RMVM_MUTE);
421		} else {
422			eso_write_mixreg(sc, ESO_MIXREG_LMVM,
423			    eso_read_mixreg(sc, ESO_MIXREG_LMVM) &
424			    ~ESO_MIXREG_LMVM_MUTE);
425			eso_write_mixreg(sc, ESO_MIXREG_RMVM,
426			    eso_read_mixreg(sc, ESO_MIXREG_RMVM) &
427			    ~ESO_MIXREG_RMVM_MUTE);
428		}
429
430		for (idx = 0; idx < ESO_NGAINDEVS; idx++)
431			eso_set_gain(sc, idx);
432	}
433}
434
435void
436eso_defer(struct device *self)
437{
438	struct eso_softc *sc = (struct eso_softc *)self;
439	struct pci_attach_args *pa = &sc->sc_pa;
440	bus_addr_t addr, start;
441
442	printf("%s: ", sc->sc_dev.dv_xname);
443
444	/*
445	 * This is outright ugly, but since we must not make assumptions
446	 * on the underlying allocator's behaviour it's the most straight-
447	 * forward way to implement it.  Note that we skip over the first
448	 * 1K region, which is typically occupied by an attached ISA bus.
449	 */
450	for (start = 0x0400; start < 0xffff; start += 0x0400) {
451		if (bus_space_alloc(sc->sc_iot,
452		    start + sc->sc_vcsize, start + 0x0400 - 1,
453		    sc->sc_vcsize, sc->sc_vcsize, 0, 0, &addr,
454		    &sc->sc_dmac_ioh) != 0)
455			continue;
456
457		pci_conf_write(pa->pa_pc, pa->pa_tag, ESO_PCI_DDMAC,
458		    addr | ESO_PCI_DDMAC_DE);
459		sc->sc_dmac_iot = sc->sc_iot;
460		sc->sc_dmac_configured = 1;
461		sc->sc_dmac_addr = addr;
462		printf("mapping Audio 1 DMA using I/O space at 0x%lx\n",
463		    (unsigned long)addr);
464
465		return;
466	}
467
468	printf("can't map Audio 1 DMA into I/O space\n");
469}
470
471void
472eso_write_cmd(struct eso_softc *sc, uint8_t cmd)
473{
474	int i;
475
476	/* Poll for busy indicator to become clear. */
477	for (i = 0; i < ESO_WDR_TIMEOUT; i++) {
478		if ((bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_RSR)
479		    & ESO_SB_RSR_BUSY) == 0) {
480			bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh,
481			    ESO_SB_WDR, cmd);
482			return;
483		} else {
484			delay(10);
485		}
486	}
487
488	printf("%s: WDR timeout\n", sc->sc_dev.dv_xname);
489}
490
491/* Write to a controller register */
492void
493eso_write_ctlreg(struct eso_softc *sc, uint8_t reg, uint8_t val)
494{
495
496	/* DPRINTF(("ctlreg 0x%02x = 0x%02x\n", reg, val)); */
497
498	eso_write_cmd(sc, reg);
499	eso_write_cmd(sc, val);
500}
501
502/* Read out the Read Data Register */
503uint8_t
504eso_read_rdr(struct eso_softc *sc)
505{
506	int i;
507
508	for (i = 0; i < ESO_RDR_TIMEOUT; i++) {
509		if (bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh,
510		    ESO_SB_RBSR) & ESO_SB_RBSR_RDAV) {
511			return (bus_space_read_1(sc->sc_sb_iot,
512			    sc->sc_sb_ioh, ESO_SB_RDR));
513		} else {
514			delay(10);
515		}
516	}
517
518	printf("%s: RDR timeout\n", sc->sc_dev.dv_xname);
519	return (-1);
520}
521
522
523uint8_t
524eso_read_ctlreg(struct eso_softc *sc, uint8_t reg)
525{
526	eso_write_cmd(sc, ESO_CMD_RCR);
527	eso_write_cmd(sc, reg);
528	return (eso_read_rdr(sc));
529}
530
531void
532eso_write_mixreg(struct eso_softc *sc, uint8_t reg, uint8_t val)
533{
534	/* DPRINTF(("mixreg 0x%02x = 0x%02x\n", reg, val)); */
535
536	bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERADDR, reg);
537	bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERDATA, val);
538}
539
540uint8_t
541eso_read_mixreg(struct eso_softc *sc, uint8_t reg)
542{
543	uint8_t val;
544
545	bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERADDR, reg);
546	val = bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_MIXERDATA);
547	return (val);
548}
549
550int
551eso_intr(void *hdl)
552{
553	struct eso_softc *sc = hdl;
554	uint8_t irqctl;
555
556	mtx_enter(&audio_lock);
557	irqctl = bus_space_read_1(sc->sc_iot, sc->sc_ioh, ESO_IO_IRQCTL);
558
559	/* If it wasn't ours, that's all she wrote. */
560	if ((irqctl & (ESO_IO_IRQCTL_A1IRQ | ESO_IO_IRQCTL_A2IRQ |
561	    ESO_IO_IRQCTL_HVIRQ | ESO_IO_IRQCTL_MPUIRQ)) == 0) {
562		mtx_leave(&audio_lock);
563		return (0);
564	}
565
566	if (irqctl & ESO_IO_IRQCTL_A1IRQ) {
567		/* Clear interrupt. */
568		(void)bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh,
569		    ESO_SB_RBSR);
570
571		if (sc->sc_rintr)
572			sc->sc_rintr(sc->sc_rarg);
573		else
574			wakeup(&sc->sc_rintr);
575	}
576
577	if (irqctl & ESO_IO_IRQCTL_A2IRQ) {
578		/*
579		 * Clear the A2 IRQ latch: the cached value reflects the
580		 * current DAC settings with the IRQ latch bit not set.
581		 */
582		eso_write_mixreg(sc, ESO_MIXREG_A2C2, sc->sc_a2c2);
583
584		if (sc->sc_pintr)
585			sc->sc_pintr(sc->sc_parg);
586		else
587			wakeup(&sc->sc_pintr);
588	}
589
590	if (irqctl & ESO_IO_IRQCTL_HVIRQ) {
591		/* Clear interrupt. */
592		eso_write_mixreg(sc, ESO_MIXREG_CHVIR, ESO_MIXREG_CHVIR_CHVIR);
593
594		/*
595		 * Raise a flag to cause a lazy update of the in-softc gain
596		 * values the next time the software mixer is read to keep
597		 * interrupt service cost low.  ~0 cannot occur otherwise
598		 * as the master volume has a precision of 6 bits only.
599		 */
600		sc->sc_gain[ESO_MASTER_VOL][ESO_LEFT] = (uint8_t)~0;
601	}
602
603#if NMPU > 0
604	if ((irqctl & ESO_IO_IRQCTL_MPUIRQ) && sc->sc_mpudev != NULL)
605		mpu_intr(sc->sc_mpudev);
606#endif
607
608	mtx_leave(&audio_lock);
609	return (1);
610}
611
612/* Perform a software reset, including DMA FIFOs. */
613int
614eso_reset(struct eso_softc *sc)
615{
616	int i;
617
618	bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_RESET,
619	    ESO_SB_RESET_SW | ESO_SB_RESET_FIFO);
620	/* `Delay' suggested in the data sheet. */
621	(void)bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_STATUS);
622	bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh, ESO_SB_RESET, 0);
623
624	/* Wait for reset to take effect. */
625	for (i = 0; i < ESO_RESET_TIMEOUT; i++) {
626		/* Poll for data to become available. */
627		if ((bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh,
628		    ESO_SB_RBSR) & ESO_SB_RBSR_RDAV) != 0 &&
629		    bus_space_read_1(sc->sc_sb_iot, sc->sc_sb_ioh,
630			ESO_SB_RDR) == ESO_SB_RDR_RESETMAGIC) {
631
632			/* Activate Solo-1 extension commands. */
633			eso_write_cmd(sc, ESO_CMD_EXTENB);
634			/* Reset mixer registers. */
635			eso_write_mixreg(sc, ESO_MIXREG_RESET,
636			    ESO_MIXREG_RESET_RESET);
637
638			return (0);
639		} else {
640			delay(1000);
641		}
642	}
643
644	printf("%s: reset timeout\n", sc->sc_dev.dv_xname);
645	return (-1);
646}
647
648
649/* ARGSUSED */
650int
651eso_open(void *hdl, int flags)
652{
653	return (0);
654}
655
656void
657eso_close(void *hdl)
658{
659}
660
661int
662eso_query_encoding(void *hdl, struct audio_encoding *fp)
663{
664	switch (fp->index) {
665	case 0:
666		strlcpy(fp->name, AudioEulinear, sizeof fp->name);
667		fp->encoding = AUDIO_ENCODING_ULINEAR;
668		fp->precision = 8;
669		fp->flags = 0;
670		break;
671	case 1:
672		strlcpy(fp->name, AudioEslinear, sizeof fp->name);
673		fp->encoding = AUDIO_ENCODING_SLINEAR;
674		fp->precision = 8;
675		fp->flags = 0;
676		break;
677	case 2:
678		strlcpy(fp->name, AudioEslinear_le, sizeof fp->name);
679		fp->encoding = AUDIO_ENCODING_SLINEAR_LE;
680		fp->precision = 16;
681		fp->flags = 0;
682		break;
683	case 3:
684		strlcpy(fp->name, AudioEulinear_le, sizeof fp->name);
685		fp->encoding = AUDIO_ENCODING_ULINEAR_LE;
686		fp->precision = 16;
687		fp->flags = 0;
688		break;
689	default:
690		return (EINVAL);
691	}
692	fp->bps = AUDIO_BPS(fp->precision);
693	fp->msb = 1;
694
695	return (0);
696}
697
698void
699eso_get_default_params(void *addr, int mode, struct audio_params *params)
700{
701	params->sample_rate = 48000;
702	params->encoding = AUDIO_ENCODING_ULINEAR_LE;
703	params->precision = 16;
704	params->bps = 2;
705	params->msb = 1;
706	params->channels = 2;
707}
708
709int
710eso_set_params(void *hdl, int setmode, int usemode,
711    struct audio_params *play, struct audio_params *rec)
712{
713	struct eso_softc *sc = hdl;
714	struct audio_params *p;
715	int mode, r[2], rd[2], ar[2], clk;
716	uint srg, fltdiv;
717
718	for (mode = AUMODE_RECORD; mode != -1;
719	     mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) {
720		if ((setmode & mode) == 0)
721			continue;
722
723		p = (mode == AUMODE_PLAY) ? play : rec;
724
725		if (p->sample_rate < ESO_MINRATE)
726			p->sample_rate = ESO_MINRATE;
727		if (p->sample_rate > ESO_MAXRATE)
728			p->sample_rate = ESO_MAXRATE;
729		if (p->precision > 16)
730			p->precision = 16;
731		if (p->channels > 2)
732			p->channels = 2;
733
734		switch (p->encoding) {
735		case AUDIO_ENCODING_SLINEAR_BE:
736		case AUDIO_ENCODING_ULINEAR_BE:
737			if (p->precision != 8)
738				return EINVAL;
739			break;
740		case AUDIO_ENCODING_SLINEAR_LE:
741		case AUDIO_ENCODING_ULINEAR_LE:
742			break;
743		default:
744			return (EINVAL);
745		}
746		p->bps = AUDIO_BPS(p->precision);
747		p->msb = 1;
748
749		/*
750		 * We'll compute both possible sample rate dividers and pick
751		 * the one with the least error.
752		 */
753#define ABS(x) ((x) < 0 ? -(x) : (x))
754		r[0] = ESO_CLK0 /
755		    (128 - (rd[0] = 128 - ESO_CLK0 / p->sample_rate));
756		r[1] = ESO_CLK1 /
757		    (128 - (rd[1] = 128 - ESO_CLK1 / p->sample_rate));
758
759		ar[0] = p->sample_rate - r[0];
760		ar[1] = p->sample_rate - r[1];
761		clk = ABS(ar[0]) > ABS(ar[1]) ? 1 : 0;
762		srg = rd[clk] | (clk == 1 ? ESO_CLK1_SELECT : 0x00);
763
764		/* Roll-off frequency of 87%, as in the ES1888 driver. */
765		fltdiv = 256 - 200279L / r[clk];
766
767		/* Update to reflect the possibly inexact rate. */
768		p->sample_rate = r[clk];
769
770		if (mode == AUMODE_RECORD) {
771			/* Audio 1 */
772			DPRINTF(("A1 srg 0x%02x fdiv 0x%02x\n", srg, fltdiv));
773			eso_write_ctlreg(sc, ESO_CTLREG_SRG, srg);
774			eso_write_ctlreg(sc, ESO_CTLREG_FLTDIV, fltdiv);
775		} else {
776			/* Audio 2 */
777			DPRINTF(("A2 srg 0x%02x fdiv 0x%02x\n", srg, fltdiv));
778			eso_write_mixreg(sc, ESO_MIXREG_A2SRG, srg);
779			eso_write_mixreg(sc, ESO_MIXREG_A2FLTDIV, fltdiv);
780		}
781#undef ABS
782
783	}
784
785	return (0);
786}
787
788int
789eso_round_blocksize(void *hdl, int blk)
790{
791	return ((blk + 31) & -32); /* keep good alignment; at least 16 req'd */
792}
793
794int
795eso_halt_output(void *hdl)
796{
797	struct eso_softc *sc = hdl;
798	int error;
799
800	DPRINTF(("%s: halt_output\n", sc->sc_dev.dv_xname));
801
802	/*
803	 * Disable auto-initialize DMA, allowing the FIFO to drain and then
804	 * stop.  The interrupt callback pointer is cleared at this
805	 * point so that an outstanding FIFO interrupt for the remaining data
806	 * will be acknowledged without further processing.
807	 *
808	 * This does not immediately `abort' an operation in progress (c.f.
809	 * audio(9)) but is the method to leave the FIFO behind in a clean
810	 * state with the least hair.  (Besides, that item needs to be
811	 * rephrased for trigger_*()-based DMA environments.)
812	 */
813	mtx_enter(&audio_lock);
814	eso_write_mixreg(sc, ESO_MIXREG_A2C1,
815	    ESO_MIXREG_A2C1_FIFOENB | ESO_MIXREG_A2C1_DMAENB);
816	bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAM,
817	    ESO_IO_A2DMAM_DMAENB);
818
819	sc->sc_pintr = NULL;
820	error = msleep(&sc->sc_pintr, &audio_lock, PWAIT, "esoho", sc->sc_pdrain);
821	mtx_leave(&audio_lock);
822
823	/* Shut down DMA completely. */
824	eso_write_mixreg(sc, ESO_MIXREG_A2C1, 0);
825	bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAM, 0);
826
827	return (error == EWOULDBLOCK ? 0 : error);
828}
829
830int
831eso_halt_input(void *hdl)
832{
833	struct eso_softc *sc = hdl;
834	int error;
835
836	DPRINTF(("%s: halt_input\n", sc->sc_dev.dv_xname));
837
838	/* Just like eso_halt_output(), but for Audio 1. */
839	mtx_enter(&audio_lock);
840	eso_write_ctlreg(sc, ESO_CTLREG_A1C2,
841	    ESO_CTLREG_A1C2_READ | ESO_CTLREG_A1C2_ADC |
842	    ESO_CTLREG_A1C2_DMAENB);
843	bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MODE,
844	    DMA37MD_WRITE | DMA37MD_DEMAND);
845
846	sc->sc_rintr = NULL;
847	error = msleep(&sc->sc_rintr, &audio_lock, PWAIT, "esohi", sc->sc_rdrain);
848	mtx_leave(&audio_lock);
849
850	/* Shut down DMA completely. */
851	eso_write_ctlreg(sc, ESO_CTLREG_A1C2,
852	    ESO_CTLREG_A1C2_READ | ESO_CTLREG_A1C2_ADC);
853	bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MASK,
854	    ESO_DMAC_MASK_MASK);
855
856	return (error == EWOULDBLOCK ? 0 : error);
857}
858
859int
860eso_getdev(void *hdl, struct audio_device *retp)
861{
862	struct eso_softc *sc = hdl;
863
864	strlcpy(retp->name, "ESS Solo-1", sizeof retp->name);
865	snprintf(retp->version, sizeof retp->version, "0x%02x",
866	    sc->sc_revision);
867	if (sc->sc_revision <
868	    sizeof (eso_rev2model) / sizeof (eso_rev2model[0]))
869		strlcpy(retp->config, eso_rev2model[sc->sc_revision],
870		    sizeof retp->config);
871	else
872		strlcpy(retp->config, "unknown", sizeof retp->config);
873
874	return (0);
875}
876
877int
878eso_set_port(void *hdl, mixer_ctrl_t *cp)
879{
880	struct eso_softc *sc = hdl;
881	uint lgain, rgain;
882	uint8_t tmp;
883	int rc = 0;
884
885	mtx_enter(&audio_lock);
886	switch (cp->dev) {
887	case ESO_DAC_PLAY_VOL:
888	case ESO_MIC_PLAY_VOL:
889	case ESO_LINE_PLAY_VOL:
890	case ESO_SYNTH_PLAY_VOL:
891	case ESO_CD_PLAY_VOL:
892	case ESO_AUXB_PLAY_VOL:
893	case ESO_RECORD_VOL:
894	case ESO_DAC_REC_VOL:
895	case ESO_MIC_REC_VOL:
896	case ESO_LINE_REC_VOL:
897	case ESO_SYNTH_REC_VOL:
898	case ESO_CD_REC_VOL:
899	case ESO_AUXB_REC_VOL:
900		if (cp->type != AUDIO_MIXER_VALUE)
901			goto error;
902
903		/*
904		 * Stereo-capable mixer ports: if we get a single-channel
905		 * gain value passed in, then we duplicate it to both left
906		 * and right channels.
907		 */
908		switch (cp->un.value.num_channels) {
909		case 1:
910			lgain = rgain = ESO_GAIN_TO_4BIT(
911			    cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]);
912			break;
913		case 2:
914			lgain = ESO_GAIN_TO_4BIT(
915			    cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT]);
916			rgain = ESO_GAIN_TO_4BIT(
917			    cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]);
918			break;
919		default:
920			goto error;
921		}
922
923		sc->sc_gain[cp->dev][ESO_LEFT] = lgain;
924		sc->sc_gain[cp->dev][ESO_RIGHT] = rgain;
925		eso_set_gain(sc, cp->dev);
926		break;
927
928	case ESO_MASTER_VOL:
929		if (cp->type != AUDIO_MIXER_VALUE)
930			goto error;
931
932		/* Like above, but a precision of 6 bits. */
933		switch (cp->un.value.num_channels) {
934		case 1:
935			lgain = rgain = ESO_GAIN_TO_6BIT(
936			    cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]);
937			break;
938		case 2:
939			lgain = ESO_GAIN_TO_6BIT(
940			    cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT]);
941			rgain = ESO_GAIN_TO_6BIT(
942			    cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT]);
943			break;
944		default:
945			goto error;
946		}
947
948		sc->sc_gain[cp->dev][ESO_LEFT] = lgain;
949		sc->sc_gain[cp->dev][ESO_RIGHT] = rgain;
950		eso_set_gain(sc, cp->dev);
951		break;
952
953	case ESO_SPATIALIZER:
954		if (cp->type != AUDIO_MIXER_VALUE ||
955		    cp->un.value.num_channels != 1)
956			goto error;
957
958		sc->sc_gain[cp->dev][ESO_LEFT] =
959		    sc->sc_gain[cp->dev][ESO_RIGHT] =
960		    ESO_GAIN_TO_6BIT(
961			cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]);
962		eso_set_gain(sc, cp->dev);
963		break;
964
965	case ESO_MONO_PLAY_VOL:
966	case ESO_MONO_REC_VOL:
967		if (cp->type != AUDIO_MIXER_VALUE ||
968		    cp->un.value.num_channels != 1)
969			goto error;
970
971		sc->sc_gain[cp->dev][ESO_LEFT] =
972		    sc->sc_gain[cp->dev][ESO_RIGHT] =
973		    ESO_GAIN_TO_4BIT(
974			cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]);
975		eso_set_gain(sc, cp->dev);
976		break;
977
978	case ESO_PCSPEAKER_VOL:
979		if (cp->type != AUDIO_MIXER_VALUE ||
980		    cp->un.value.num_channels != 1)
981			goto error;
982
983		sc->sc_gain[cp->dev][ESO_LEFT] =
984		    sc->sc_gain[cp->dev][ESO_RIGHT] =
985		    ESO_GAIN_TO_3BIT(
986			cp->un.value.level[AUDIO_MIXER_LEVEL_MONO]);
987		eso_set_gain(sc, cp->dev);
988		break;
989
990	case ESO_SPATIALIZER_ENABLE:
991		if (cp->type != AUDIO_MIXER_ENUM)
992			goto error;
993
994		sc->sc_spatializer = (cp->un.ord != 0);
995
996		tmp = eso_read_mixreg(sc, ESO_MIXREG_SPAT);
997		if (sc->sc_spatializer)
998			tmp |= ESO_MIXREG_SPAT_ENB;
999		else
1000			tmp &= ~ESO_MIXREG_SPAT_ENB;
1001		eso_write_mixreg(sc, ESO_MIXREG_SPAT,
1002		    tmp | ESO_MIXREG_SPAT_RSTREL);
1003		break;
1004
1005	case ESO_MASTER_MUTE:
1006		if (cp->type != AUDIO_MIXER_ENUM)
1007			goto error;
1008
1009		sc->sc_mvmute = (cp->un.ord != 0);
1010
1011		if (sc->sc_mvmute) {
1012			eso_write_mixreg(sc, ESO_MIXREG_LMVM,
1013			    eso_read_mixreg(sc, ESO_MIXREG_LMVM) |
1014			    ESO_MIXREG_LMVM_MUTE);
1015			eso_write_mixreg(sc, ESO_MIXREG_RMVM,
1016			    eso_read_mixreg(sc, ESO_MIXREG_RMVM) |
1017			    ESO_MIXREG_RMVM_MUTE);
1018		} else {
1019			eso_write_mixreg(sc, ESO_MIXREG_LMVM,
1020			    eso_read_mixreg(sc, ESO_MIXREG_LMVM) &
1021			    ~ESO_MIXREG_LMVM_MUTE);
1022			eso_write_mixreg(sc, ESO_MIXREG_RMVM,
1023			    eso_read_mixreg(sc, ESO_MIXREG_RMVM) &
1024			    ~ESO_MIXREG_RMVM_MUTE);
1025		}
1026		break;
1027
1028	case ESO_MONOOUT_SOURCE:
1029		if (cp->type != AUDIO_MIXER_ENUM)
1030			goto error;
1031
1032		rc = eso_set_monooutsrc(sc, cp->un.ord);
1033		break;
1034
1035	case ESO_MONOIN_BYPASS:
1036		if (cp->type != AUDIO_MIXER_ENUM)
1037			goto error;
1038
1039		rc = eso_set_monoinbypass(sc, cp->un.ord);
1040		break;
1041
1042	case ESO_RECORD_MONITOR:
1043		if (cp->type != AUDIO_MIXER_ENUM)
1044			goto error;
1045
1046		sc->sc_recmon = (cp->un.ord != 0);
1047
1048		tmp = eso_read_ctlreg(sc, ESO_CTLREG_ACTL);
1049		if (sc->sc_recmon)
1050			tmp |= ESO_CTLREG_ACTL_RECMON;
1051		else
1052			tmp &= ~ESO_CTLREG_ACTL_RECMON;
1053		eso_write_ctlreg(sc, ESO_CTLREG_ACTL, tmp);
1054		break;
1055
1056	case ESO_RECORD_SOURCE:
1057		if (cp->type != AUDIO_MIXER_ENUM)
1058			goto error;
1059
1060		rc = eso_set_recsrc(sc, cp->un.ord);
1061		break;
1062
1063	case ESO_MIC_PREAMP:
1064		if (cp->type != AUDIO_MIXER_ENUM)
1065			goto error;
1066
1067		rc = eso_set_preamp(sc, cp->un.ord);
1068		break;
1069
1070	default:
1071		goto error;
1072	}
1073
1074	mtx_leave(&audio_lock);
1075	return rc;
1076error:
1077	mtx_leave(&audio_lock);
1078	return EINVAL;
1079}
1080
1081int
1082eso_get_port(void *hdl, mixer_ctrl_t *cp)
1083{
1084	struct eso_softc *sc = hdl;
1085
1086	mtx_enter(&audio_lock);
1087	switch (cp->dev) {
1088	case ESO_MASTER_VOL:
1089		/* Reload from mixer after hardware volume control use. */
1090		if (sc->sc_gain[cp->dev][ESO_LEFT] == (uint8_t)~0)
1091			eso_reload_master_vol(sc);
1092		/* FALLTHROUGH */
1093	case ESO_DAC_PLAY_VOL:
1094	case ESO_MIC_PLAY_VOL:
1095	case ESO_LINE_PLAY_VOL:
1096	case ESO_SYNTH_PLAY_VOL:
1097	case ESO_CD_PLAY_VOL:
1098	case ESO_AUXB_PLAY_VOL:
1099	case ESO_RECORD_VOL:
1100	case ESO_DAC_REC_VOL:
1101	case ESO_MIC_REC_VOL:
1102	case ESO_LINE_REC_VOL:
1103	case ESO_SYNTH_REC_VOL:
1104	case ESO_CD_REC_VOL:
1105	case ESO_AUXB_REC_VOL:
1106		/*
1107		 * Stereo-capable ports: if a single-channel query is made,
1108		 * just return the left channel's value (since single-channel
1109		 * settings themselves are applied to both channels).
1110		 */
1111		switch (cp->un.value.num_channels) {
1112		case 1:
1113			cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
1114			    sc->sc_gain[cp->dev][ESO_LEFT];
1115			break;
1116		case 2:
1117			cp->un.value.level[AUDIO_MIXER_LEVEL_LEFT] =
1118			    sc->sc_gain[cp->dev][ESO_LEFT];
1119			cp->un.value.level[AUDIO_MIXER_LEVEL_RIGHT] =
1120			    sc->sc_gain[cp->dev][ESO_RIGHT];
1121			break;
1122		default:
1123			goto error;
1124		}
1125		break;
1126
1127	case ESO_MONO_PLAY_VOL:
1128	case ESO_PCSPEAKER_VOL:
1129	case ESO_MONO_REC_VOL:
1130	case ESO_SPATIALIZER:
1131		if (cp->un.value.num_channels != 1)
1132			goto error;
1133		cp->un.value.level[AUDIO_MIXER_LEVEL_MONO] =
1134		    sc->sc_gain[cp->dev][ESO_LEFT];
1135		break;
1136
1137	case ESO_RECORD_MONITOR:
1138		cp->un.ord = sc->sc_recmon;
1139		break;
1140
1141	case ESO_RECORD_SOURCE:
1142		cp->un.ord = sc->sc_recsrc;
1143		break;
1144
1145	case ESO_MONOOUT_SOURCE:
1146		cp->un.ord = sc->sc_monooutsrc;
1147		break;
1148
1149	case ESO_MONOIN_BYPASS:
1150		cp->un.ord = sc->sc_monoinbypass;
1151		break;
1152
1153	case ESO_SPATIALIZER_ENABLE:
1154		cp->un.ord = sc->sc_spatializer;
1155		break;
1156
1157	case ESO_MIC_PREAMP:
1158		cp->un.ord = sc->sc_preamp;
1159		break;
1160
1161	case ESO_MASTER_MUTE:
1162		/* Reload from mixer after hardware volume control use. */
1163		if (sc->sc_gain[ESO_MASTER_VOL][ESO_LEFT] == (uint8_t)~0)
1164			eso_reload_master_vol(sc);
1165		cp->un.ord = sc->sc_mvmute;
1166		break;
1167
1168	default:
1169		goto error;
1170	}
1171
1172	mtx_leave(&audio_lock);
1173	return 0;
1174error:
1175	mtx_leave(&audio_lock);
1176	return EINVAL;
1177}
1178
1179int
1180eso_query_devinfo(void *hdl, mixer_devinfo_t *dip)
1181{
1182	switch (dip->index) {
1183	case ESO_DAC_PLAY_VOL:
1184		dip->mixer_class = ESO_INPUT_CLASS;
1185		dip->next = dip->prev = AUDIO_MIXER_LAST;
1186		strlcpy(dip->label.name, AudioNdac, sizeof dip->label.name);
1187		dip->type = AUDIO_MIXER_VALUE;
1188		dip->un.v.num_channels = 2;
1189		strlcpy(dip->un.v.units.name, AudioNvolume,
1190		    sizeof dip->un.v.units.name);
1191		break;
1192	case ESO_MIC_PLAY_VOL:
1193		dip->mixer_class = ESO_INPUT_CLASS;
1194		dip->next = dip->prev = AUDIO_MIXER_LAST;
1195		strlcpy(dip->label.name, AudioNmicrophone,
1196		    sizeof dip->label.name);
1197		dip->type = AUDIO_MIXER_VALUE;
1198		dip->un.v.num_channels = 2;
1199		strlcpy(dip->un.v.units.name, AudioNvolume,
1200		    sizeof dip->un.v.units.name);
1201		break;
1202	case ESO_LINE_PLAY_VOL:
1203		dip->mixer_class = ESO_INPUT_CLASS;
1204		dip->next = dip->prev = AUDIO_MIXER_LAST;
1205		strlcpy(dip->label.name, AudioNline, sizeof dip->label.name);
1206		dip->type = AUDIO_MIXER_VALUE;
1207		dip->un.v.num_channels = 2;
1208		strlcpy(dip->un.v.units.name, AudioNvolume,
1209		    sizeof dip->un.v.units.name);
1210		break;
1211	case ESO_SYNTH_PLAY_VOL:
1212		dip->mixer_class = ESO_INPUT_CLASS;
1213		dip->next = dip->prev = AUDIO_MIXER_LAST;
1214		strlcpy(dip->label.name, AudioNfmsynth,
1215		    sizeof dip->label.name);
1216		dip->type = AUDIO_MIXER_VALUE;
1217		dip->un.v.num_channels = 2;
1218		strlcpy(dip->un.v.units.name, AudioNvolume,
1219		    sizeof dip->un.v.units.name);
1220		break;
1221	case ESO_MONO_PLAY_VOL:
1222		dip->mixer_class = ESO_INPUT_CLASS;
1223		dip->next = dip->prev = AUDIO_MIXER_LAST;
1224		strlcpy(dip->label.name, "mono_in", sizeof dip->label.name);
1225		dip->type = AUDIO_MIXER_VALUE;
1226		dip->un.v.num_channels = 1;
1227		strlcpy(dip->un.v.units.name, AudioNvolume,
1228		    sizeof dip->un.v.units.name);
1229		break;
1230	case ESO_CD_PLAY_VOL:
1231		dip->mixer_class = ESO_INPUT_CLASS;
1232		dip->next = dip->prev = AUDIO_MIXER_LAST;
1233		strlcpy(dip->label.name, AudioNcd, sizeof dip->label.name);
1234		dip->type = AUDIO_MIXER_VALUE;
1235		dip->un.v.num_channels = 2;
1236		strlcpy(dip->un.v.units.name, AudioNvolume,
1237		    sizeof dip->un.v.units.name);
1238		break;
1239	case ESO_AUXB_PLAY_VOL:
1240		dip->mixer_class = ESO_INPUT_CLASS;
1241		dip->next = dip->prev = AUDIO_MIXER_LAST;
1242		strlcpy(dip->label.name, "auxb", sizeof dip->label.name);
1243		dip->type = AUDIO_MIXER_VALUE;
1244		dip->un.v.num_channels = 2;
1245		strlcpy(dip->un.v.units.name, AudioNvolume,
1246		    sizeof dip->un.v.units.name);
1247		break;
1248	case ESO_MIC_PREAMP:
1249		dip->mixer_class = ESO_MICROPHONE_CLASS;
1250		dip->next = dip->prev = AUDIO_MIXER_LAST;
1251		strlcpy(dip->label.name, AudioNpreamp, sizeof dip->label.name);
1252		dip->type = AUDIO_MIXER_ENUM;
1253		dip->un.e.num_mem = 2;
1254		strlcpy(dip->un.e.member[0].label.name, AudioNoff,
1255		    sizeof dip->un.e.member[0].label.name);
1256		dip->un.e.member[0].ord = 0;
1257		strlcpy(dip->un.e.member[1].label.name, AudioNon,
1258		    sizeof dip->un.e.member[1].label.name);
1259		dip->un.e.member[1].ord = 1;
1260		break;
1261	case ESO_MICROPHONE_CLASS:
1262		dip->mixer_class = ESO_MICROPHONE_CLASS;
1263		dip->next = dip->prev = AUDIO_MIXER_LAST;
1264		strlcpy(dip->label.name, AudioNmicrophone,
1265		    sizeof dip->label.name);
1266		dip->type = AUDIO_MIXER_CLASS;
1267		break;
1268	case ESO_INPUT_CLASS:
1269		dip->mixer_class = ESO_INPUT_CLASS;
1270		dip->next = dip->prev = AUDIO_MIXER_LAST;
1271		strlcpy(dip->label.name, AudioCinputs, sizeof dip->label.name);
1272		dip->type = AUDIO_MIXER_CLASS;
1273		break;
1274	case ESO_MASTER_VOL:
1275		dip->mixer_class = ESO_OUTPUT_CLASS;
1276		dip->prev = AUDIO_MIXER_LAST;
1277		dip->next = ESO_MASTER_MUTE;
1278		strlcpy(dip->label.name, AudioNmaster, sizeof dip->label.name);
1279		dip->type = AUDIO_MIXER_VALUE;
1280		dip->un.v.num_channels = 2;
1281		strlcpy(dip->un.v.units.name, AudioNvolume,
1282		    sizeof dip->un.v.units.name);
1283		break;
1284	case ESO_MASTER_MUTE:
1285		dip->mixer_class = ESO_OUTPUT_CLASS;
1286		dip->prev = ESO_MASTER_VOL;
1287		dip->next = AUDIO_MIXER_LAST;
1288		strlcpy(dip->label.name, AudioNmute, sizeof dip->label.name);
1289		dip->type = AUDIO_MIXER_ENUM;
1290		dip->un.e.num_mem = 2;
1291		strlcpy(dip->un.e.member[0].label.name, AudioNoff,
1292		    sizeof dip->un.e.member[0].label.name);
1293		dip->un.e.member[0].ord = 0;
1294		strlcpy(dip->un.e.member[1].label.name, AudioNon,
1295		    sizeof dip->un.e.member[1].label.name);
1296		dip->un.e.member[1].ord = 1;
1297		break;
1298	case ESO_PCSPEAKER_VOL:
1299		dip->mixer_class = ESO_OUTPUT_CLASS;
1300		dip->next = dip->prev = AUDIO_MIXER_LAST;
1301		strlcpy(dip->label.name, "pc_speaker", sizeof dip->label.name);
1302		dip->type = AUDIO_MIXER_VALUE;
1303		dip->un.v.num_channels = 1;
1304		strlcpy(dip->un.v.units.name, AudioNvolume,
1305		    sizeof dip->un.v.units.name);
1306		break;
1307	case ESO_MONOOUT_SOURCE:
1308		dip->mixer_class = ESO_OUTPUT_CLASS;
1309		dip->next = dip->prev = AUDIO_MIXER_LAST;
1310		strlcpy(dip->label.name, "mono_out", sizeof dip->label.name);
1311		dip->type = AUDIO_MIXER_ENUM;
1312		dip->un.e.num_mem = 3;
1313		strlcpy(dip->un.e.member[0].label.name, AudioNmute,
1314		    sizeof dip->un.e.member[0].label.name);
1315		dip->un.e.member[0].ord = ESO_MIXREG_MPM_MOMUTE;
1316		strlcpy(dip->un.e.member[1].label.name, AudioNdac,
1317		    sizeof dip->un.e.member[1].label.name);
1318		dip->un.e.member[1].ord = ESO_MIXREG_MPM_MOA2R;
1319		strlcpy(dip->un.e.member[2].label.name, AudioNmixerout,
1320		    sizeof dip->un.e.member[2].label.name);
1321		dip->un.e.member[2].ord = ESO_MIXREG_MPM_MOREC;
1322		break;
1323	case ESO_MONOIN_BYPASS:
1324		dip->mixer_class = ESO_MONOIN_CLASS;
1325		dip->next = dip->prev = AUDIO_MIXER_LAST;
1326		strlcpy(dip->label.name, "bypass", sizeof dip->label.name);
1327		dip->type = AUDIO_MIXER_ENUM;
1328		dip->un.e.num_mem = 2;
1329		strlcpy(dip->un.e.member[0].label.name, AudioNoff,
1330		    sizeof dip->un.e.member[0].label.name);
1331		dip->un.e.member[0].ord = 0;
1332		strlcpy(dip->un.e.member[1].label.name, AudioNon,
1333		    sizeof dip->un.e.member[1].label.name);
1334		dip->un.e.member[1].ord = 1;
1335		break;
1336	case ESO_MONOIN_CLASS:
1337		dip->mixer_class = ESO_MONOIN_CLASS;
1338		dip->next = dip->prev = AUDIO_MIXER_LAST;
1339		strlcpy(dip->label.name, "mono_in", sizeof dip->label.name);
1340		dip->type = AUDIO_MIXER_CLASS;
1341		break;
1342	case ESO_SPATIALIZER:
1343		dip->mixer_class = ESO_OUTPUT_CLASS;
1344		dip->prev = AUDIO_MIXER_LAST;
1345		dip->next = ESO_SPATIALIZER_ENABLE;
1346		strlcpy(dip->label.name, AudioNspatial,
1347		    sizeof dip->label.name);
1348		dip->type = AUDIO_MIXER_VALUE;
1349		dip->un.v.num_channels = 1;
1350		strlcpy(dip->un.v.units.name, "level",
1351		    sizeof dip->un.v.units.name);
1352		break;
1353	case ESO_SPATIALIZER_ENABLE:
1354		dip->mixer_class = ESO_OUTPUT_CLASS;
1355		dip->prev = ESO_SPATIALIZER;
1356		dip->next = AUDIO_MIXER_LAST;
1357		strlcpy(dip->label.name, "enable", sizeof dip->label.name);
1358		dip->type = AUDIO_MIXER_ENUM;
1359		dip->un.e.num_mem = 2;
1360		strlcpy(dip->un.e.member[0].label.name, AudioNoff,
1361		    sizeof dip->un.e.member[0].label.name);
1362		dip->un.e.member[0].ord = 0;
1363		strlcpy(dip->un.e.member[1].label.name, AudioNon,
1364		    sizeof dip->un.e.member[1].label.name);
1365		dip->un.e.member[1].ord = 1;
1366		break;
1367	case ESO_OUTPUT_CLASS:
1368		dip->mixer_class = ESO_OUTPUT_CLASS;
1369		dip->next = dip->prev = AUDIO_MIXER_LAST;
1370		strlcpy(dip->label.name, AudioCoutputs,
1371		    sizeof dip->label.name);
1372		dip->type = AUDIO_MIXER_CLASS;
1373		break;
1374	case ESO_RECORD_MONITOR:
1375		dip->mixer_class = ESO_MONITOR_CLASS;
1376		dip->next = dip->prev = AUDIO_MIXER_LAST;
1377		strlcpy(dip->label.name, AudioNmute, sizeof dip->label.name);
1378		dip->type = AUDIO_MIXER_ENUM;
1379		dip->un.e.num_mem = 2;
1380		strlcpy(dip->un.e.member[0].label.name, AudioNoff,
1381		    sizeof dip->un.e.member[0].label.name);
1382		dip->un.e.member[0].ord = 0;
1383		strlcpy(dip->un.e.member[1].label.name, AudioNon,
1384		    sizeof dip->un.e.member[1].label.name);
1385		dip->un.e.member[1].ord = 1;
1386		break;
1387	case ESO_MONITOR_CLASS:
1388		dip->mixer_class = ESO_MONITOR_CLASS;
1389		dip->next = dip->prev = AUDIO_MIXER_LAST;
1390		strlcpy(dip->label.name, AudioCmonitor,
1391		    sizeof dip->label.name);
1392		dip->type = AUDIO_MIXER_CLASS;
1393		break;
1394	case ESO_RECORD_VOL:
1395		dip->mixer_class = ESO_RECORD_CLASS;
1396		dip->next = dip->prev = AUDIO_MIXER_LAST;
1397		strlcpy(dip->label.name, AudioNrecord, sizeof dip->label.name);
1398		dip->type = AUDIO_MIXER_VALUE;
1399		strlcpy(dip->un.v.units.name, AudioNvolume,
1400		    sizeof dip->un.v.units.name);
1401		break;
1402	case ESO_RECORD_SOURCE:
1403		dip->mixer_class = ESO_RECORD_CLASS;
1404		dip->next = dip->prev = AUDIO_MIXER_LAST;
1405		strlcpy(dip->label.name, AudioNsource, sizeof dip->label.name);
1406		dip->type = AUDIO_MIXER_ENUM;
1407		dip->un.e.num_mem = 4;
1408		strlcpy(dip->un.e.member[0].label.name, AudioNmicrophone,
1409		    sizeof dip->un.e.member[0].label.name);
1410		dip->un.e.member[0].ord = ESO_MIXREG_ERS_MIC;
1411		strlcpy(dip->un.e.member[1].label.name, AudioNline,
1412		    sizeof dip->un.e.member[1].label.name);
1413		dip->un.e.member[1].ord = ESO_MIXREG_ERS_LINE;
1414		strlcpy(dip->un.e.member[2].label.name, AudioNcd,
1415		    sizeof dip->un.e.member[2].label.name);
1416		dip->un.e.member[2].ord = ESO_MIXREG_ERS_CD;
1417		strlcpy(dip->un.e.member[3].label.name, AudioNmixerout,
1418		    sizeof dip->un.e.member[3].label.name);
1419		dip->un.e.member[3].ord = ESO_MIXREG_ERS_MIXER;
1420		break;
1421	case ESO_DAC_REC_VOL:
1422		dip->mixer_class = ESO_RECORD_CLASS;
1423		dip->next = dip->prev = AUDIO_MIXER_LAST;
1424		strlcpy(dip->label.name, AudioNdac, sizeof dip->label.name);
1425		dip->type = AUDIO_MIXER_VALUE;
1426		dip->un.v.num_channels = 2;
1427		strlcpy(dip->un.v.units.name, AudioNvolume,
1428		    sizeof dip->un.v.units.name);
1429		break;
1430	case ESO_MIC_REC_VOL:
1431		dip->mixer_class = ESO_RECORD_CLASS;
1432		dip->next = dip->prev = AUDIO_MIXER_LAST;
1433		strlcpy(dip->label.name, AudioNmicrophone,
1434		    sizeof dip->label.name);
1435		dip->type = AUDIO_MIXER_VALUE;
1436		dip->un.v.num_channels = 2;
1437		strlcpy(dip->un.v.units.name, AudioNvolume,
1438		    sizeof dip->un.v.units.name);
1439		break;
1440	case ESO_LINE_REC_VOL:
1441		dip->mixer_class = ESO_RECORD_CLASS;
1442		dip->next = dip->prev = AUDIO_MIXER_LAST;
1443		strlcpy(dip->label.name, AudioNline, sizeof dip->label.name);
1444		dip->type = AUDIO_MIXER_VALUE;
1445		dip->un.v.num_channels = 2;
1446		strlcpy(dip->un.v.units.name, AudioNvolume,
1447		    sizeof dip->un.v.units.name);
1448		break;
1449	case ESO_SYNTH_REC_VOL:
1450		dip->mixer_class = ESO_RECORD_CLASS;
1451		dip->next = dip->prev = AUDIO_MIXER_LAST;
1452		strlcpy(dip->label.name, AudioNfmsynth,
1453		    sizeof dip->label.name);
1454		dip->type = AUDIO_MIXER_VALUE;
1455		dip->un.v.num_channels = 2;
1456		strlcpy(dip->un.v.units.name, AudioNvolume,
1457		    sizeof dip->un.v.units.name);
1458		break;
1459	case ESO_MONO_REC_VOL:
1460		dip->mixer_class = ESO_RECORD_CLASS;
1461		dip->next = dip->prev = AUDIO_MIXER_LAST;
1462		strlcpy(dip->label.name, "mono_in", sizeof dip->label.name);
1463		dip->type = AUDIO_MIXER_VALUE;
1464		dip->un.v.num_channels = 1; /* No lies */
1465		strlcpy(dip->un.v.units.name, AudioNvolume,
1466		    sizeof dip->un.v.units.name);
1467		break;
1468	case ESO_CD_REC_VOL:
1469		dip->mixer_class = ESO_RECORD_CLASS;
1470		dip->next = dip->prev = AUDIO_MIXER_LAST;
1471		strlcpy(dip->label.name, AudioNcd, sizeof dip->label.name);
1472		dip->type = AUDIO_MIXER_VALUE;
1473		dip->un.v.num_channels = 2;
1474		strlcpy(dip->un.v.units.name, AudioNvolume,
1475		    sizeof dip->un.v.units.name);
1476		break;
1477	case ESO_AUXB_REC_VOL:
1478		dip->mixer_class = ESO_RECORD_CLASS;
1479		dip->next = dip->prev = AUDIO_MIXER_LAST;
1480		strlcpy(dip->label.name, "auxb", sizeof dip->label.name);
1481		dip->type = AUDIO_MIXER_VALUE;
1482		dip->un.v.num_channels = 2;
1483		strlcpy(dip->un.v.units.name, AudioNvolume,
1484		    sizeof dip->un.v.units.name);
1485		break;
1486	case ESO_RECORD_CLASS:
1487		dip->mixer_class = ESO_RECORD_CLASS;
1488		dip->next = dip->prev = AUDIO_MIXER_LAST;
1489		strlcpy(dip->label.name, AudioCrecord, sizeof dip->label.name);
1490		dip->type = AUDIO_MIXER_CLASS;
1491		break;
1492	default:
1493		return (ENXIO);
1494	}
1495
1496	return (0);
1497}
1498
1499int
1500eso_allocmem(struct eso_softc *sc, size_t size, size_t align,
1501    size_t boundary, int flags, int direction, struct eso_dma *ed)
1502{
1503	int error, wait;
1504
1505	wait = (flags & M_NOWAIT) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK;
1506	ed->ed_size = size;
1507
1508	error = bus_dmamem_alloc(ed->ed_dmat, ed->ed_size, align, boundary,
1509	    ed->ed_segs, sizeof (ed->ed_segs) / sizeof (ed->ed_segs[0]),
1510	    &ed->ed_nsegs, wait);
1511	if (error)
1512		goto out;
1513
1514	error = bus_dmamem_map(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs,
1515	    ed->ed_size, &ed->ed_addr, wait | BUS_DMA_COHERENT);
1516	if (error)
1517		goto free;
1518
1519	error = bus_dmamap_create(ed->ed_dmat, ed->ed_size, 1, ed->ed_size,
1520	    boundary,  wait, &ed->ed_map);
1521	if (error)
1522		goto unmap;
1523
1524	error = bus_dmamap_load(ed->ed_dmat, ed->ed_map, ed->ed_addr,
1525	    ed->ed_size, NULL, wait |
1526	    ((direction == AUMODE_RECORD) ? BUS_DMA_READ : BUS_DMA_WRITE));
1527	if (error)
1528		goto destroy;
1529
1530	return (0);
1531
1532 destroy:
1533	bus_dmamap_destroy(ed->ed_dmat, ed->ed_map);
1534 unmap:
1535	bus_dmamem_unmap(ed->ed_dmat, ed->ed_addr, ed->ed_size);
1536 free:
1537	bus_dmamem_free(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs);
1538 out:
1539	return (error);
1540}
1541
1542void
1543eso_freemem(struct eso_dma *ed)
1544{
1545	bus_dmamap_unload(ed->ed_dmat, ed->ed_map);
1546	bus_dmamap_destroy(ed->ed_dmat, ed->ed_map);
1547	bus_dmamem_unmap(ed->ed_dmat, ed->ed_addr, ed->ed_size);
1548	bus_dmamem_free(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs);
1549}
1550
1551void *
1552eso_allocm(void *hdl, int direction, size_t size, int type, int flags)
1553{
1554	struct eso_softc *sc = hdl;
1555	struct eso_dma *ed;
1556	size_t boundary;
1557	int error;
1558
1559	if ((ed = malloc(sizeof (*ed), type, flags)) == NULL)
1560		return (NULL);
1561
1562	/*
1563	 * Apparently the Audio 1 DMA controller's current address
1564	 * register can't roll over a 64K address boundary, so we have to
1565	 * take care of that ourselves.  Similarly, the Audio 2 DMA
1566	 * controller needs a 1M address boundary.
1567	 */
1568	if (direction == AUMODE_RECORD)
1569		boundary = 0x10000;
1570	else
1571		boundary = 0x100000;
1572
1573	/*
1574	 * XXX Work around allocation problems for Audio 1, which
1575	 * XXX implements the 24 low address bits only, with
1576	 * XXX machine-specific DMA tag use.
1577	 */
1578#if defined(__alpha__)
1579	/*
1580	 * XXX Force allocation through the (ISA) SGMAP.
1581	 */
1582	if (direction == AUMODE_RECORD)
1583		ed->ed_dmat = alphabus_dma_get_tag(sc->sc_dmat, ALPHA_BUS_ISA);
1584	else
1585#elif defined(__amd64__) || defined(__i386__)
1586	/*
1587	 * XXX Force allocation through the ISA DMA tag.
1588	 */
1589	if (direction == AUMODE_RECORD)
1590		ed->ed_dmat = &isa_bus_dma_tag;
1591	else
1592#endif
1593		ed->ed_dmat = sc->sc_dmat;
1594
1595	error = eso_allocmem(sc, size, 32, boundary, flags, direction, ed);
1596	if (error) {
1597		free(ed, type, 0);
1598		return (NULL);
1599	}
1600	ed->ed_next = sc->sc_dmas;
1601	sc->sc_dmas = ed;
1602
1603	return (KVADDR(ed));
1604}
1605
1606void
1607eso_freem(void *hdl, void *addr, int type)
1608{
1609	struct eso_softc *sc = hdl;
1610	struct eso_dma *p, **pp;
1611
1612	for (pp = &sc->sc_dmas; (p = *pp) != NULL; pp = &p->ed_next) {
1613		if (KVADDR(p) == addr) {
1614			eso_freemem(p);
1615			*pp = p->ed_next;
1616			free(p, type, 0);
1617			return;
1618		}
1619	}
1620}
1621
1622size_t
1623eso_round_buffersize(void *hdl, int direction, size_t bufsize)
1624{
1625	size_t maxsize;
1626
1627	/*
1628	 * The playback DMA buffer size on the Solo-1 is limited to 0xfff0
1629	 * bytes.  This is because IO_A2DMAC is a two byte value
1630	 * indicating the literal byte count, and the 4 least significant
1631	 * bits are read-only.  Zero is not used as a special case for
1632	 * 0x10000.
1633	 *
1634	 * For recording, DMAC_DMAC is the byte count - 1, so 0x10000 can
1635	 * be represented.
1636	 */
1637	maxsize = (direction == AUMODE_PLAY) ? 0xfff0 : 0x10000;
1638
1639	if (bufsize > maxsize)
1640		bufsize = maxsize;
1641
1642	return (bufsize);
1643}
1644
1645paddr_t
1646eso_mappage(void *hdl, void *addr, off_t offs, int prot)
1647{
1648	struct eso_softc *sc = hdl;
1649	struct eso_dma *ed;
1650
1651	if (offs < 0)
1652		return (-1);
1653	for (ed = sc->sc_dmas; ed != NULL && KVADDR(ed) != addr;
1654	     ed = ed->ed_next)
1655		;
1656	if (ed == NULL)
1657		return (-1);
1658
1659	return (bus_dmamem_mmap(ed->ed_dmat, ed->ed_segs, ed->ed_nsegs,
1660	    offs, prot, BUS_DMA_WAITOK));
1661}
1662
1663/* ARGSUSED */
1664int
1665eso_get_props(void *hdl)
1666{
1667	return (AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT |
1668	    AUDIO_PROP_FULLDUPLEX);
1669}
1670
1671int
1672eso_trigger_output(void *hdl, void *start, void *end, int blksize,
1673    void (*intr)(void *), void *arg, struct audio_params *param)
1674{
1675	struct eso_softc *sc = hdl;
1676	struct eso_dma *ed;
1677	uint8_t a2c1;
1678
1679	DPRINTF((
1680	    "%s: trigger_output: start %p, end %p, blksize %d, intr %p(%p)\n",
1681	    sc->sc_dev.dv_xname, start, end, blksize, intr, arg));
1682	DPRINTF(("%s: param: rate %lu, encoding %u, precision %u, channels %u\n",
1683	    sc->sc_dev.dv_xname, param->sample_rate, param->encoding,
1684	    param->precision, param->channels));
1685
1686	/* Find DMA buffer. */
1687	for (ed = sc->sc_dmas; ed != NULL && KVADDR(ed) != start;
1688	     ed = ed->ed_next)
1689		;
1690	if (ed == NULL) {
1691		printf("%s: trigger_output: bad addr %p\n",
1692		    sc->sc_dev.dv_xname, start);
1693		return (EINVAL);
1694	}
1695	DPRINTF(("%s: output dmaaddr %lx\n",
1696	    sc->sc_dev.dv_xname, (unsigned long)DMAADDR(ed)));
1697
1698	sc->sc_pintr = intr;
1699	sc->sc_parg = arg;
1700
1701	/* Compute drain timeout. */
1702	sc->sc_pdrain = hz * (blksize * 3 / 2) /
1703	    (param->sample_rate * param->channels * param->bps);
1704
1705	/* DMA transfer count (in `words'!) reload using 2's complement. */
1706	blksize = -(blksize >> 1);
1707	eso_write_mixreg(sc, ESO_MIXREG_A2TCRLO, blksize & 0xff);
1708	eso_write_mixreg(sc, ESO_MIXREG_A2TCRHI, blksize >> 8);
1709
1710	/* Update DAC to reflect DMA count and audio parameters. */
1711	/* Note: we cache A2C2 in order to avoid r/m/w at interrupt time. */
1712	if (param->precision == 16)
1713		sc->sc_a2c2 |= ESO_MIXREG_A2C2_16BIT;
1714	else
1715		sc->sc_a2c2 &= ~ESO_MIXREG_A2C2_16BIT;
1716	if (param->channels == 2)
1717		sc->sc_a2c2 |= ESO_MIXREG_A2C2_STEREO;
1718	else
1719		sc->sc_a2c2 &= ~ESO_MIXREG_A2C2_STEREO;
1720	if (param->encoding == AUDIO_ENCODING_SLINEAR_BE ||
1721	    param->encoding == AUDIO_ENCODING_SLINEAR_LE)
1722		sc->sc_a2c2 |= ESO_MIXREG_A2C2_SIGNED;
1723	else
1724		sc->sc_a2c2 &= ~ESO_MIXREG_A2C2_SIGNED;
1725	/* Unmask IRQ. */
1726	sc->sc_a2c2 |= ESO_MIXREG_A2C2_IRQM;
1727	eso_write_mixreg(sc, ESO_MIXREG_A2C2, sc->sc_a2c2);
1728
1729	/* Set up DMA controller. */
1730	bus_space_write_4(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAA, DMAADDR(ed));
1731	bus_space_write_2(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAC,
1732	    (uint8_t *)end - (uint8_t *)start);
1733	bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAM,
1734	    ESO_IO_A2DMAM_DMAENB | ESO_IO_A2DMAM_AUTO);
1735
1736	/* Start DMA. */
1737	mtx_enter(&audio_lock);
1738	a2c1 = eso_read_mixreg(sc, ESO_MIXREG_A2C1);
1739	a2c1 &= ~ESO_MIXREG_A2C1_RESV0; /* Paranoia? XXX bit 5 */
1740	a2c1 |= ESO_MIXREG_A2C1_FIFOENB | ESO_MIXREG_A2C1_DMAENB |
1741	    ESO_MIXREG_A2C1_AUTO;
1742	eso_write_mixreg(sc, ESO_MIXREG_A2C1, a2c1);
1743	mtx_leave(&audio_lock);
1744	return (0);
1745}
1746
1747int
1748eso_trigger_input(void *hdl, void *start, void *end, int blksize,
1749    void (*intr)(void *), void *arg, struct audio_params *param)
1750{
1751	struct eso_softc *sc = hdl;
1752	struct eso_dma *ed;
1753	uint8_t actl, a1c1;
1754
1755	DPRINTF((
1756	    "%s: trigger_input: start %p, end %p, blksize %d, intr %p(%p)\n",
1757	    sc->sc_dev.dv_xname, start, end, blksize, intr, arg));
1758	DPRINTF(("%s: param: rate %lu, encoding %u, precision %u, channels %u\n",
1759	    sc->sc_dev.dv_xname, param->sample_rate, param->encoding,
1760	    param->precision, param->channels));
1761
1762	/*
1763	 * If we failed to configure the Audio 1 DMA controller, bail here
1764	 * while retaining availability of the DAC direction (in Audio 2).
1765	 */
1766	if (!sc->sc_dmac_configured)
1767		return (EIO);
1768
1769	/* Find DMA buffer. */
1770	for (ed = sc->sc_dmas; ed != NULL && KVADDR(ed) != start;
1771	     ed = ed->ed_next)
1772		;
1773	if (ed == NULL) {
1774		printf("%s: trigger_input: bad addr %p\n",
1775		    sc->sc_dev.dv_xname, start);
1776		return (EINVAL);
1777	}
1778	DPRINTF(("%s: input dmaaddr %lx\n",
1779	    sc->sc_dev.dv_xname, (unsigned long)DMAADDR(ed)));
1780
1781	sc->sc_rintr = intr;
1782	sc->sc_rarg = arg;
1783
1784	/* Compute drain timeout. */
1785	sc->sc_rdrain = hz * (blksize * 3 / 2) /
1786	    (param->sample_rate * param->channels * param->bps);
1787
1788	/* Set up ADC DMA converter parameters. */
1789	actl = eso_read_ctlreg(sc, ESO_CTLREG_ACTL);
1790	if (param->channels == 2) {
1791		actl &= ~ESO_CTLREG_ACTL_MONO;
1792		actl |= ESO_CTLREG_ACTL_STEREO;
1793	} else {
1794		actl &= ~ESO_CTLREG_ACTL_STEREO;
1795		actl |= ESO_CTLREG_ACTL_MONO;
1796	}
1797	eso_write_ctlreg(sc, ESO_CTLREG_ACTL, actl);
1798
1799	/* Set up Transfer Type: maybe move to attach time? */
1800	eso_write_ctlreg(sc, ESO_CTLREG_A1TT, ESO_CTLREG_A1TT_DEMAND4);
1801
1802	/* DMA transfer count reload using 2's complement. */
1803	blksize = -blksize;
1804	eso_write_ctlreg(sc, ESO_CTLREG_A1TCRLO, blksize & 0xff);
1805	eso_write_ctlreg(sc, ESO_CTLREG_A1TCRHI, blksize >> 8);
1806
1807	/* Set up and enable Audio 1 DMA FIFO. */
1808	a1c1 = ESO_CTLREG_A1C1_RESV1 | ESO_CTLREG_A1C1_FIFOENB;
1809	if (param->precision == 16)
1810		a1c1 |= ESO_CTLREG_A1C1_16BIT;
1811	if (param->channels == 2)
1812		a1c1 |= ESO_CTLREG_A1C1_STEREO;
1813	else
1814		a1c1 |= ESO_CTLREG_A1C1_MONO;
1815	if (param->encoding == AUDIO_ENCODING_SLINEAR_BE ||
1816	    param->encoding == AUDIO_ENCODING_SLINEAR_LE)
1817		a1c1 |= ESO_CTLREG_A1C1_SIGNED;
1818	eso_write_ctlreg(sc, ESO_CTLREG_A1C1, a1c1);
1819
1820	/* Set up ADC IRQ/DRQ parameters. */
1821	eso_write_ctlreg(sc, ESO_CTLREG_LAIC,
1822	    ESO_CTLREG_LAIC_PINENB | ESO_CTLREG_LAIC_EXTENB);
1823	eso_write_ctlreg(sc, ESO_CTLREG_DRQCTL,
1824	    ESO_CTLREG_DRQCTL_ENB1 | ESO_CTLREG_DRQCTL_EXTENB);
1825
1826	/* Set up and enable DMA controller. */
1827	bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_CLEAR, 0);
1828	bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MASK,
1829	    ESO_DMAC_MASK_MASK);
1830	bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MODE,
1831	    DMA37MD_WRITE | DMA37MD_LOOP | DMA37MD_DEMAND);
1832	bus_space_write_4(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_DMAA,
1833	    DMAADDR(ed));
1834	bus_space_write_2(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_DMAC,
1835	    (uint8_t *)end - (uint8_t *)start - 1);
1836	bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh, ESO_DMAC_MASK, 0);
1837
1838	/* Start DMA. */
1839	mtx_enter(&audio_lock);
1840	eso_write_ctlreg(sc, ESO_CTLREG_A1C2,
1841	    ESO_CTLREG_A1C2_DMAENB | ESO_CTLREG_A1C2_READ |
1842	    ESO_CTLREG_A1C2_AUTO | ESO_CTLREG_A1C2_ADC);
1843	mtx_leave(&audio_lock);
1844	return (0);
1845}
1846
1847/*
1848 * Mixer utility functions.
1849 */
1850int
1851eso_set_recsrc(struct eso_softc *sc, u_int recsrc)
1852{
1853	mixer_devinfo_t di;
1854	int i, error;
1855
1856	di.index = ESO_RECORD_SOURCE;
1857	error = eso_query_devinfo(sc, &di);
1858	if (error != 0) {
1859		printf("eso_set_recsrc: eso_query_devinfo failed");
1860		return (error);
1861	}
1862
1863	for (i = 0; i < di.un.e.num_mem; i++) {
1864		if (recsrc == di.un.e.member[i].ord) {
1865			eso_write_mixreg(sc, ESO_MIXREG_ERS, recsrc);
1866			sc->sc_recsrc = recsrc;
1867			return (0);
1868		}
1869	}
1870
1871	return (EINVAL);
1872}
1873
1874int
1875eso_set_monooutsrc(struct eso_softc *sc, uint monooutsrc)
1876{
1877	mixer_devinfo_t di;
1878	int i, error;
1879	uint8_t mpm;
1880
1881	di.index = ESO_MONOOUT_SOURCE;
1882	error = eso_query_devinfo(sc, &di);
1883	if (error != 0) {
1884		printf("eso_set_monooutsrc: eso_query_devinfo failed");
1885		return (error);
1886	}
1887
1888	for (i = 0; i < di.un.e.num_mem; i++) {
1889		if (monooutsrc == di.un.e.member[i].ord) {
1890			mpm = eso_read_mixreg(sc, ESO_MIXREG_MPM);
1891			mpm &= ~ESO_MIXREG_MPM_MOMASK;
1892			mpm |= monooutsrc;
1893			eso_write_mixreg(sc, ESO_MIXREG_MPM, mpm);
1894			sc->sc_monooutsrc = monooutsrc;
1895			return (0);
1896		}
1897	}
1898
1899	return (EINVAL);
1900}
1901
1902int
1903eso_set_monoinbypass(struct eso_softc *sc, uint monoinbypass)
1904{
1905	mixer_devinfo_t di;
1906	int i, error;
1907	uint8_t mpm;
1908
1909	di.index = ESO_MONOIN_BYPASS;
1910	error = eso_query_devinfo(sc, &di);
1911	if (error != 0) {
1912		printf("eso_set_monoinbypass: eso_query_devinfo failed");
1913		return (error);
1914	}
1915
1916	for (i = 0; i < di.un.e.num_mem; i++) {
1917		if (monoinbypass == di.un.e.member[i].ord) {
1918			mpm = eso_read_mixreg(sc, ESO_MIXREG_MPM);
1919			mpm &= ~(ESO_MIXREG_MPM_MOMASK | ESO_MIXREG_MPM_RESV0);
1920			mpm |= (monoinbypass ? ESO_MIXREG_MPM_MIBYPASS : 0);
1921			eso_write_mixreg(sc, ESO_MIXREG_MPM, mpm);
1922			sc->sc_monoinbypass = monoinbypass;
1923			return (0);
1924		}
1925	}
1926
1927	return (EINVAL);
1928}
1929
1930int
1931eso_set_preamp(struct eso_softc *sc, uint preamp)
1932{
1933	mixer_devinfo_t di;
1934	int i, error;
1935	uint8_t mpm;
1936
1937	di.index = ESO_MIC_PREAMP;
1938	error = eso_query_devinfo(sc, &di);
1939	if (error != 0) {
1940		printf("eso_set_preamp: eso_query_devinfo failed");
1941		return (error);
1942	}
1943
1944	for (i = 0; i < di.un.e.num_mem; i++) {
1945		if (preamp == di.un.e.member[i].ord) {
1946			mpm = eso_read_mixreg(sc, ESO_MIXREG_MPM);
1947			mpm &= ~(ESO_MIXREG_MPM_PREAMP | ESO_MIXREG_MPM_RESV0);
1948			mpm |= (preamp ? ESO_MIXREG_MPM_PREAMP : 0);
1949			eso_write_mixreg(sc, ESO_MIXREG_MPM, mpm);
1950			sc->sc_preamp = preamp;
1951			return (0);
1952		}
1953	}
1954
1955	return (EINVAL);
1956}
1957
1958/*
1959 * Reload Master Volume and Mute values in softc from mixer; used when
1960 * those have previously been invalidated by use of hardware volume controls.
1961 */
1962void
1963eso_reload_master_vol(struct eso_softc *sc)
1964{
1965	uint8_t mv;
1966
1967	mv = eso_read_mixreg(sc, ESO_MIXREG_LMVM);
1968	sc->sc_gain[ESO_MASTER_VOL][ESO_LEFT] =
1969	    (mv & ~ESO_MIXREG_LMVM_MUTE) << 2;
1970	mv = eso_read_mixreg(sc, ESO_MIXREG_LMVM);
1971	sc->sc_gain[ESO_MASTER_VOL][ESO_RIGHT] =
1972	    (mv & ~ESO_MIXREG_RMVM_MUTE) << 2;
1973	/* Currently both channels are muted simultaneously; either is OK. */
1974	sc->sc_mvmute = (mv & ESO_MIXREG_RMVM_MUTE) != 0;
1975}
1976
1977void
1978eso_set_gain(struct eso_softc *sc, uint port)
1979{
1980	uint8_t mixreg, tmp;
1981
1982	switch (port) {
1983	case ESO_DAC_PLAY_VOL:
1984		mixreg = ESO_MIXREG_PVR_A2;
1985		break;
1986	case ESO_MIC_PLAY_VOL:
1987		mixreg = ESO_MIXREG_PVR_MIC;
1988		break;
1989	case ESO_LINE_PLAY_VOL:
1990		mixreg = ESO_MIXREG_PVR_LINE;
1991		break;
1992	case ESO_SYNTH_PLAY_VOL:
1993		mixreg = ESO_MIXREG_PVR_SYNTH;
1994		break;
1995	case ESO_CD_PLAY_VOL:
1996		mixreg = ESO_MIXREG_PVR_CD;
1997		break;
1998	case ESO_AUXB_PLAY_VOL:
1999		mixreg = ESO_MIXREG_PVR_AUXB;
2000		break;
2001	case ESO_DAC_REC_VOL:
2002		mixreg = ESO_MIXREG_RVR_A2;
2003		break;
2004	case ESO_MIC_REC_VOL:
2005		mixreg = ESO_MIXREG_RVR_MIC;
2006		break;
2007	case ESO_LINE_REC_VOL:
2008		mixreg = ESO_MIXREG_RVR_LINE;
2009		break;
2010	case ESO_SYNTH_REC_VOL:
2011		mixreg = ESO_MIXREG_RVR_SYNTH;
2012		break;
2013	case ESO_CD_REC_VOL:
2014		mixreg = ESO_MIXREG_RVR_CD;
2015		break;
2016	case ESO_AUXB_REC_VOL:
2017		mixreg = ESO_MIXREG_RVR_AUXB;
2018		break;
2019	case ESO_MONO_PLAY_VOL:
2020		mixreg = ESO_MIXREG_PVR_MONO;
2021		break;
2022	case ESO_MONO_REC_VOL:
2023		mixreg = ESO_MIXREG_RVR_MONO;
2024		break;
2025	case ESO_PCSPEAKER_VOL:
2026		/* Special case - only 3-bit, mono, and reserved bits. */
2027		tmp = eso_read_mixreg(sc, ESO_MIXREG_PCSVR);
2028		tmp &= ESO_MIXREG_PCSVR_RESV;
2029		/* Map bits 7:5 -> 2:0. */
2030		tmp |= (sc->sc_gain[port][ESO_LEFT] >> 5);
2031		eso_write_mixreg(sc, ESO_MIXREG_PCSVR, tmp);
2032		return;
2033	case ESO_MASTER_VOL:
2034		/* Special case - separate regs, and 6-bit precision. */
2035		/* Map bits 7:2 -> 5:0, reflect mute settings. */
2036		eso_write_mixreg(sc, ESO_MIXREG_LMVM,
2037		    (sc->sc_gain[port][ESO_LEFT] >> 2) |
2038		    (sc->sc_mvmute ? ESO_MIXREG_LMVM_MUTE : 0x00));
2039		eso_write_mixreg(sc, ESO_MIXREG_RMVM,
2040		    (sc->sc_gain[port][ESO_RIGHT] >> 2) |
2041		    (sc->sc_mvmute ? ESO_MIXREG_RMVM_MUTE : 0x00));
2042		return;
2043	case ESO_SPATIALIZER:
2044		/* Special case - only `mono', and higher precision. */
2045		eso_write_mixreg(sc, ESO_MIXREG_SPATLVL,
2046		    sc->sc_gain[port][ESO_LEFT]);
2047		return;
2048	case ESO_RECORD_VOL:
2049		/* Very Special case, controller register. */
2050		eso_write_ctlreg(sc, ESO_CTLREG_RECLVL,ESO_4BIT_GAIN_TO_STEREO(
2051		   sc->sc_gain[port][ESO_LEFT], sc->sc_gain[port][ESO_RIGHT]));
2052		return;
2053	default:
2054#ifdef DIAGNOSTIC
2055		printf("eso_set_gain: bad port %u", port);
2056		return;
2057		/* NOTREACHED */
2058#else
2059		return;
2060#endif
2061		}
2062
2063	eso_write_mixreg(sc, mixreg, ESO_4BIT_GAIN_TO_STEREO(
2064	    sc->sc_gain[port][ESO_LEFT], sc->sc_gain[port][ESO_RIGHT]));
2065}
2066
2067int
2068eso_activate(struct device *self, int act)
2069{
2070	struct eso_softc *sc = (struct eso_softc *)self;
2071	uint8_t tmp;
2072	int rv = 0;
2073
2074	switch (act) {
2075	case DVACT_QUIESCE:
2076		rv = config_activate_children(self, act);
2077		tmp = bus_space_read_1(sc->sc_iot, sc->sc_ioh, ESO_IO_IRQCTL);
2078		tmp &= ~(ESO_IO_IRQCTL_MASK);
2079		bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_IRQCTL, tmp);
2080		break;
2081	case DVACT_SUSPEND:
2082		bus_space_write_1(sc->sc_iot, sc->sc_ioh, ESO_IO_A2DMAM, 0);
2083		bus_space_write_1(sc->sc_dmac_iot, sc->sc_dmac_ioh,
2084		    ESO_DMAC_CLEAR, 0);
2085		bus_space_write_1(sc->sc_sb_iot, sc->sc_sb_ioh,
2086		    ESO_SB_STATUSFLAGS, 3);
2087		/* shut down dma */
2088		pci_conf_write(sc->sc_pa.pa_pc, sc->sc_pa.pa_tag,
2089		    ESO_PCI_DDMAC, 0);
2090		break;
2091	case DVACT_RESUME:
2092		eso_setup(sc, 1, 1);
2093		pci_conf_write(sc->sc_pa.pa_pc, sc->sc_pa.pa_tag,
2094		    ESO_PCI_DDMAC, sc->sc_dmac_addr | ESO_PCI_DDMAC_DE);
2095		rv = config_activate_children(self, act);
2096		break;
2097	default:
2098		rv = config_activate_children(self, act);
2099		break;
2100	}
2101	return (rv);
2102}
2103