xref: /netbsd-src/sys/dev/pci/emuxki.c (revision 1ad9454efb13a65cd7535ccf867508cb14d9d30e)
1 /*	$NetBSD: emuxki.c,v 1.47 2006/09/23 01:19:18 jmcneill Exp $	*/
2 
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Yannick Montulet.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the NetBSD
21  *	Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 /*
40  * Driver for Creative Labs SBLive! series and probably PCI512.
41  *
42  * Known bugs:
43  * - inversed stereo at ac97 codec level
44  *   (XXX jdolecek - don't see the problem? maybe because auvia(4) has
45  *    it swapped too?)
46  * - bass disappear when you plug rear jack-in on Cambridge FPS2000 speakers
47  *   (and presumably all speakers that support front and rear jack-in)
48  *
49  * TODO:
50  * - Digital Outputs
51  * - (midi/mpu),joystick support
52  * - Multiple voices play (problem with /dev/audio architecture)
53  * - Multiple sources recording (Pb with audio(4))
54  * - Independent modification of each channel's parameters (via mixer ?)
55  * - DSP FX patches (to make fx like chipmunk)
56  */
57 
58 #include <sys/cdefs.h>
59 __KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.47 2006/09/23 01:19:18 jmcneill Exp $");
60 
61 #include <sys/param.h>
62 #include <sys/device.h>
63 #include <sys/errno.h>
64 #include <sys/malloc.h>
65 #include <sys/systm.h>
66 #include <sys/audioio.h>
67 #include <sys/select.h>
68 #include <dev/pci/pcireg.h>
69 #include <dev/pci/pcivar.h>
70 #include <dev/pci/pcidevs.h>
71 #include <dev/audio_if.h>
72 #include <dev/audiovar.h>
73 #include <dev/auconv.h>
74 #include <dev/mulaw.h>
75 #include <dev/ic/ac97reg.h>
76 #include <dev/ic/ac97var.h>
77 
78 #include <dev/pci/emuxkireg.h>
79 #include <dev/pci/emuxkivar.h>
80 
81 /* autoconf goo */
82 static int	emuxki_match(struct device *, struct cfdata *, void *);
83 static void	emuxki_attach(struct device *, struct device *, void *);
84 static int	emuxki_detach(struct device *, int);
85 
86 /* DMA mem mgmt */
87 static struct dmamem *dmamem_alloc(bus_dma_tag_t, size_t, bus_size_t,
88 		int, struct malloc_type *, int);
89 static void	dmamem_free(struct dmamem *, struct malloc_type *);
90 
91 /* Emu10k1 init & shutdown */
92 static int	emuxki_init(struct emuxki_softc *);
93 static void	emuxki_shutdown(struct emuxki_softc *);
94 
95 /* Emu10k1 mem mgmt */
96 static void	*emuxki_pmem_alloc(struct emuxki_softc *, size_t,
97 		struct malloc_type *,int);
98 static void	*emuxki_rmem_alloc(struct emuxki_softc *, size_t,
99 		struct malloc_type *,int);
100 
101 /*
102  * Emu10k1 channels funcs : There is no direct access to channels, everything
103  * is done through voices I will at least provide channel based fx params
104  * modification, later...
105  */
106 
107 /* Emu10k1 voice mgmt */
108 static struct emuxki_voice *emuxki_voice_new(struct emuxki_softc *,
109 		uint8_t);
110 static void	emuxki_voice_delete(struct emuxki_voice *);
111 static int	emuxki_voice_set_audioparms(struct emuxki_voice *, uint8_t,
112 		uint8_t, uint32_t);
113 /* emuxki_voice_set_fxparms will come later, it'll need channel distinction */
114 static int	emuxki_voice_set_bufparms(struct emuxki_voice *,
115 		void *, uint32_t, uint16_t);
116 static void	emuxki_voice_commit_parms(struct emuxki_voice *);
117 static int	emuxki_voice_adc_rate(struct emuxki_voice *);
118 static uint32_t	emuxki_voice_curaddr(struct emuxki_voice *);
119 static void	emuxki_voice_start(struct emuxki_voice *,
120 		void (*) (void *), void *);
121 static void	emuxki_voice_halt(struct emuxki_voice *);
122 
123 /*
124  * Emu10k1 stream mgmt : not done yet
125  */
126 #if 0
127 static struct emuxki_stream *emuxki_stream_new(struct emu10k1 *);
128 static void	emuxki_stream_delete(struct emuxki_stream *);
129 static int	emuxki_stream_set_audio_params(struct emuxki_stream *,
130 		uint8_t, uint8_t, uint8_t, uint16_t);
131 static void	emuxki_stream_start(struct emuxki_stream *);
132 static void	emuxki_stream_halt(struct emuxki_stream *);
133 #endif
134 
135 /* audio interface callbacks */
136 
137 static int	emuxki_open(void *, int);
138 static void	emuxki_close(void *);
139 
140 static int	emuxki_query_encoding(void *, struct audio_encoding *);
141 static int	emuxki_set_params(void *, int, int, audio_params_t *,
142 		audio_params_t *, stream_filter_list_t *,
143 		stream_filter_list_t *);
144 
145 static int	emuxki_round_blocksize(void *, int, int, const audio_params_t *);
146 static size_t	emuxki_round_buffersize(void *, int, size_t);
147 
148 static int	emuxki_trigger_output(void *, void *, void *, int,
149 		void (*)(void *), void *, const audio_params_t *);
150 static int	emuxki_trigger_input(void *, void *, void *, int,
151 		void (*) (void *), void *, const audio_params_t *);
152 static int	emuxki_halt_output(void *);
153 static int	emuxki_halt_input(void *);
154 
155 static int	emuxki_getdev(void *, struct audio_device *);
156 static int	emuxki_set_port(void *, mixer_ctrl_t *);
157 static int	emuxki_get_port(void *, mixer_ctrl_t *);
158 static int	emuxki_query_devinfo(void *, mixer_devinfo_t *);
159 
160 static void    *emuxki_allocm(void *, int, size_t, struct malloc_type *, int);
161 static void	emuxki_freem(void *, void *, struct malloc_type *);
162 
163 static paddr_t	emuxki_mappage(void *, void *, off_t, int);
164 static int	emuxki_get_props(void *);
165 
166 /* Interrupt handler */
167 static int	emuxki_intr(void *);
168 
169 /* Emu10k1 AC97 interface callbacks */
170 static int	emuxki_ac97_attach(void *, struct ac97_codec_if *);
171 static int	emuxki_ac97_read(void *, uint8_t, uint16_t *);
172 static int	emuxki_ac97_write(void *, uint8_t, uint16_t);
173 static int	emuxki_ac97_reset(void *);
174 static enum ac97_host_flags emuxki_ac97_flags(void *);
175 
176 /*
177  * Autoconfig goo.
178  */
179 CFATTACH_DECL(emuxki, sizeof(struct emuxki_softc),
180     emuxki_match, emuxki_attach, emuxki_detach, NULL);
181 
182 static const struct audio_hw_if emuxki_hw_if = {
183 	emuxki_open,
184 	emuxki_close,
185 	NULL,			/* drain */
186 	emuxki_query_encoding,
187 	emuxki_set_params,
188 	emuxki_round_blocksize,
189 	NULL,			/* commit settings */
190 	NULL,			/* init_output */
191 	NULL,			/* init_input */
192 	NULL,			/* start_output */
193 	NULL,			/* start_input */
194 	emuxki_halt_output,
195 	emuxki_halt_input,
196 	NULL,			/* speaker_ctl */
197 	emuxki_getdev,
198 	NULL,			/* setfd */
199 	emuxki_set_port,
200 	emuxki_get_port,
201 	emuxki_query_devinfo,
202 	emuxki_allocm,
203 	emuxki_freem,
204 	emuxki_round_buffersize,
205 	emuxki_mappage,
206 	emuxki_get_props,
207 	emuxki_trigger_output,
208 	emuxki_trigger_input,
209 	NULL,			/* dev_ioctl */
210 	NULL,			/* powerstate */
211 };
212 
213 #if 0
214 static const int emuxki_recsrc_intrmasks[EMU_NUMRECSRCS] =
215     { EMU_INTE_MICBUFENABLE, EMU_INTE_ADCBUFENABLE, EMU_INTE_EFXBUFENABLE };
216 #endif
217 static const uint32_t emuxki_recsrc_bufaddrreg[EMU_NUMRECSRCS] =
218     { EMU_MICBA, EMU_ADCBA, EMU_FXBA };
219 static const uint32_t emuxki_recsrc_szreg[EMU_NUMRECSRCS] =
220     { EMU_MICBS, EMU_ADCBS, EMU_FXBS };
221 static const int emuxki_recbuf_sz[] = {
222 	0, 384, 448, 512, 640, 768, 896, 1024, 1280, 1536, 1792,
223 	2048, 2560, 3072, 3584, 4096, 5120, 6144, 7168, 8192, 10240,
224 	12288, 14366, 16384, 20480, 24576, 28672, 32768, 40960, 49152,
225 	57344, 65536
226 };
227 
228 #define EMUXKI_NFORMATS	4
229 static const struct audio_format emuxki_formats[EMUXKI_NFORMATS] = {
230 	{NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16,
231 	 2, AUFMT_STEREO, 0, {4000, 48000}},
232 	{NULL, AUMODE_PLAY | AUMODE_RECORD, AUDIO_ENCODING_SLINEAR_LE, 16, 16,
233 	 1, AUFMT_MONAURAL, 0, {4000, 48000}},
234 	{NULL, AUMODE_PLAY, AUDIO_ENCODING_ULINEAR_LE, 8, 8,
235 	 2, AUFMT_STEREO, 0, {4000, 48000}},
236 	{NULL, AUMODE_PLAY, AUDIO_ENCODING_ULINEAR_LE, 8, 8,
237 	 1, AUFMT_MONAURAL, 0, {4000, 48000}},
238 };
239 
240 /*
241  * DMA memory mgmt
242  */
243 
244 static void
245 dmamem_delete(struct dmamem *mem, struct malloc_type *type)
246 {
247 
248 	free(mem->segs, type);
249 	free(mem, type);
250 }
251 
252 static struct dmamem *
253 dmamem_alloc(bus_dma_tag_t dmat, size_t size, bus_size_t align,
254 	     int nsegs, struct malloc_type *type, int flags)
255 {
256 	struct dmamem	*mem;
257 	int		bus_dma_flags;
258 
259 	/* Allocate memory for structure */
260 	if ((mem = malloc(sizeof(*mem), type, flags)) == NULL)
261 		return NULL;
262 	mem->dmat = dmat;
263 	mem->size = size;
264 	mem->align = align;
265 	mem->nsegs = nsegs;
266 	mem->bound = 0;
267 
268 	mem->segs = malloc(mem->nsegs * sizeof(*(mem->segs)), type, flags);
269 	if (mem->segs == NULL) {
270 		free(mem, type);
271 		return NULL;
272 	}
273 
274 	bus_dma_flags = (flags & M_NOWAIT) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK;
275 	if (bus_dmamem_alloc(dmat, mem->size, mem->align, mem->bound,
276 			     mem->segs, mem->nsegs, &(mem->rsegs),
277 			     bus_dma_flags)) {
278 		dmamem_delete(mem, type);
279 		return NULL;
280 	}
281 
282 	if (bus_dmamem_map(dmat, mem->segs, mem->nsegs, mem->size,
283 			   &(mem->kaddr), bus_dma_flags | BUS_DMA_COHERENT)) {
284 		bus_dmamem_free(dmat, mem->segs, mem->nsegs);
285 		dmamem_delete(mem, type);
286 		return NULL;
287 	}
288 
289 	if (bus_dmamap_create(dmat, mem->size, mem->nsegs, mem->size,
290 			      mem->bound, bus_dma_flags, &(mem->map))) {
291 		bus_dmamem_unmap(dmat, mem->kaddr, mem->size);
292 		bus_dmamem_free(dmat, mem->segs, mem->nsegs);
293 		dmamem_delete(mem, type);
294 		return NULL;
295 	}
296 
297 	if (bus_dmamap_load(dmat, mem->map, mem->kaddr,
298 			    mem->size, NULL, bus_dma_flags)) {
299 		bus_dmamap_destroy(dmat, mem->map);
300 		bus_dmamem_unmap(dmat, mem->kaddr, mem->size);
301 		bus_dmamem_free(dmat, mem->segs, mem->nsegs);
302 		dmamem_delete(mem, type);
303 		return NULL;
304 	}
305 
306 	return mem;
307 }
308 
309 static void
310 dmamem_free(struct dmamem *mem, struct malloc_type *type)
311 {
312 
313 	bus_dmamap_unload(mem->dmat, mem->map);
314 	bus_dmamap_destroy(mem->dmat, mem->map);
315 	bus_dmamem_unmap(mem->dmat, mem->kaddr, mem->size);
316 	bus_dmamem_free(mem->dmat, mem->segs, mem->nsegs);
317 	dmamem_delete(mem, type);
318 }
319 
320 
321 /*
322  * Autoconf device callbacks : attach and detach
323  */
324 
325 static void
326 emuxki_pci_shutdown(struct emuxki_softc *sc)
327 {
328 
329 	if (sc->sc_ih != NULL)
330 		pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
331 	if (sc->sc_ios)
332 		bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
333 }
334 
335 static int
336 emuxki_scinit(struct emuxki_softc *sc)
337 {
338 	int err;
339 
340 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
341 		EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK |
342 		EMU_HCFG_MUTEBUTTONENABLE);
343 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
344 		EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE);
345 
346 	if ((err = emuxki_init(sc)))
347 		return err;
348 
349 	if (sc->sc_type & EMUXKI_AUDIGY2) {
350 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
351 			EMU_HCFG_AUDIOENABLE | EMU_HCFG_AC3ENABLE_CDSPDIF |
352 			EMU_HCFG_AC3ENABLE_GPSPDIF | EMU_HCFG_AUTOMUTE);
353 	} else if (sc->sc_type & EMUXKI_AUDIGY) {
354 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
355 			EMU_HCFG_AUDIOENABLE | EMU_HCFG_AUTOMUTE);
356 	} else {
357 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
358 			EMU_HCFG_AUDIOENABLE | EMU_HCFG_JOYENABLE |
359 			EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_AUTOMUTE);
360 	}
361 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
362 		bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) |
363 		EMU_INTE_VOLINCRENABLE | EMU_INTE_VOLDECRENABLE |
364 		EMU_INTE_MUTEENABLE);
365 	if (sc->sc_type & EMUXKI_AUDIGY2) {
366 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A_IOCFG,
367 			EMU_A_IOCFG_GPOUT0 |
368 			bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_A_IOCFG));
369 	}
370 
371 	/* No multiple voice support for now */
372 	sc->pvoice = sc->rvoice = NULL;
373 
374 	return 0;
375 }
376 
377 static int
378 emuxki_ac97_init(struct emuxki_softc *sc)
379 {
380 	sc->hostif.arg = sc;
381 	sc->hostif.attach = emuxki_ac97_attach;
382 	sc->hostif.read = emuxki_ac97_read;
383 	sc->hostif.write = emuxki_ac97_write;
384 	sc->hostif.reset = emuxki_ac97_reset;
385 	sc->hostif.flags = emuxki_ac97_flags;
386 	return ac97_attach(&sc->hostif, &sc->sc_dev);
387 }
388 
389 static int
390 emuxki_match(struct device *parent, struct cfdata *match, void *aux)
391 {
392 	struct pci_attach_args *pa;
393 
394 	pa = aux;
395 	if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_CREATIVELABS)
396 		return 0;
397 
398 	switch (PCI_PRODUCT(pa->pa_id)) {
399 	case PCI_PRODUCT_CREATIVELABS_SBLIVE:
400 	case PCI_PRODUCT_CREATIVELABS_SBLIVE2:
401 	case PCI_PRODUCT_CREATIVELABS_AUDIGY:
402 		return 1;
403 	default:
404 		return 0;
405 	}
406 }
407 
408 static void
409 emuxki_attach(struct device *parent, struct device *self, void *aux)
410 {
411 	struct emuxki_softc *sc;
412 	struct pci_attach_args *pa;
413 	char devinfo[256];
414 	pci_intr_handle_t ih;
415 	const char *intrstr;
416 
417 	sc = (struct emuxki_softc *) self;
418 	pa = aux;
419 	aprint_naive(": Audio controller\n");
420 
421 	if (pci_mapreg_map(pa, EMU_PCI_CBIO, PCI_MAPREG_TYPE_IO, 0,
422 	    &(sc->sc_iot), &(sc->sc_ioh), &(sc->sc_iob),
423 			   &(sc->sc_ios))) {
424 		aprint_error(": can't map iospace\n");
425 		return;
426 	}
427 	pci_devinfo(pa->pa_id, pa->pa_class, 1, devinfo, sizeof(devinfo));
428 	aprint_normal(": %s\n", devinfo);
429 
430 	sc->sc_pc   = pa->pa_pc;
431 	sc->sc_dmat = pa->pa_dmat;
432 	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
433 		pci_conf_read(pa->pa_pc, pa->pa_tag,
434 		(PCI_COMMAND_STATUS_REG) | PCI_COMMAND_MASTER_ENABLE));
435 
436 	if (pci_intr_map(pa, &ih)) {
437 		aprint_error("%s: couldn't map interrupt\n",
438 			sc->sc_dev.dv_xname);
439 		bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
440 		return;
441 	}
442 
443 	intrstr = pci_intr_string(pa->pa_pc, ih);
444 	sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_AUDIO, emuxki_intr,
445 		sc);
446 	if (sc->sc_ih == NULL) {
447 		aprint_error("%s: couldn't establish interrupt",
448 		    sc->sc_dev.dv_xname);
449 		if (intrstr != NULL)
450 			aprint_normal(" at %s", intrstr);
451 		aprint_normal("\n");
452 		bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
453 		return;
454 	}
455 	aprint_normal("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
456 
457  /* XXX it's unknown whether APS is made from Audigy as well */
458 	if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CREATIVELABS_AUDIGY) {
459 		sc->sc_type = EMUXKI_AUDIGY;
460 		if (PCI_REVISION(pa->pa_class) == 0x04) {
461 			sc->sc_type |= EMUXKI_AUDIGY2;
462 			strlcpy(sc->sc_audv.name, "Audigy2", sizeof sc->sc_audv.name);
463 		} else {
464 			strlcpy(sc->sc_audv.name, "Audigy", sizeof sc->sc_audv.name);
465 		}
466 	} else if (pci_conf_read(pa->pa_pc, pa->pa_tag,
467 	    PCI_SUBSYS_ID_REG) == EMU_SUBSYS_APS) {
468 		sc->sc_type = EMUXKI_APS;
469 		strlcpy(sc->sc_audv.name, "E-mu APS", sizeof sc->sc_audv.name);
470 	} else {
471 		sc->sc_type = EMUXKI_SBLIVE;
472 		strlcpy(sc->sc_audv.name, "SB Live!", sizeof sc->sc_audv.name);
473 	}
474 	snprintf(sc->sc_audv.version, sizeof sc->sc_audv.version, "0x%02x",
475 		 PCI_REVISION(pa->pa_class));
476 	strlcpy(sc->sc_audv.config, "emuxki", sizeof sc->sc_audv.config);
477 
478 	if (emuxki_scinit(sc) || emuxki_ac97_init(sc) ||
479 	    (sc->sc_audev = audio_attach_mi(&emuxki_hw_if, sc, self)) == NULL) {
480 		emuxki_pci_shutdown(sc);
481 		return;
482 	}
483 #if 0
484 	sc->rsourcectl.dev =
485 	    sc->codecif->vtbl->get_portnum_by_name(sc->codec_if, AudioCrecord,
486 						   AudioNsource, NULL);
487 	sc->rsourcectl.cp = AUDIO_MIXER_ENUM;
488 #endif
489 }
490 
491 static int
492 emuxki_detach(struct device *self, int flags)
493 {
494 	struct emuxki_softc *sc;
495 
496 	sc = (struct emuxki_softc *)self;
497 	if (sc->sc_audev != NULL) /* Test in case audio didn't attach */
498 		config_detach(sc->sc_audev, 0);
499 
500 	/* All voices should be stopped now but add some code here if not */
501 
502 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
503 		EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK |
504 		EMU_HCFG_MUTEBUTTONENABLE);
505 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 0);
506 
507 	emuxki_shutdown(sc);
508 
509 	emuxki_pci_shutdown(sc);
510 
511 	return 0;
512 }
513 
514 
515 /* Misc stuff relative to emu10k1 */
516 
517 static uint32_t
518 emuxki_rate_to_pitch(uint32_t rate)
519 {
520 	static const uint32_t logMagTable[128] = {
521 		0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3,
522 		0x13aa2, 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a,
523 		0x2655d, 0x28ed5, 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb,
524 		0x381b6, 0x3a93d, 0x3d081, 0x3f782, 0x41e42, 0x444c1, 0x46b01,
525 		0x49101, 0x4b6c4, 0x4dc49, 0x50191, 0x5269e, 0x54b6f, 0x57006,
526 		0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7, 0x646ee, 0x66a00,
527 		0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829, 0x759d4,
528 		0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
529 		0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20,
530 		0x93d26, 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec,
531 		0xa11d8, 0xa2f9d, 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241,
532 		0xadf26, 0xafbe7, 0xb1885, 0xb3500, 0xb5157, 0xb6d8c, 0xb899f,
533 		0xba58f, 0xbc15e, 0xbdd0c, 0xbf899, 0xc1404, 0xc2f50, 0xc4a7b,
534 		0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c, 0xceaec, 0xd053f,
535 		0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3, 0xdba4a,
536 		0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
537 		0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a,
538 		0xf2c83, 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57,
539 		0xfd1a7, 0xfe8df
540 	};
541 	static const uint8_t logSlopeTable[128] = {
542 		0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
543 		0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
544 		0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
545 		0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
546 		0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
547 		0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
548 		0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
549 		0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
550 		0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
551 		0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
552 		0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
553 		0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
554 		0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
555 		0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
556 		0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
557 		0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
558 	};
559 	int8_t i;
560 
561 	if (rate == 0)
562 		return 0;	/* Bail out if no leading "1" */
563 	rate *= 11185;		/* Scale 48000 to 0x20002380 */
564 	for (i = 31; i > 0; i--) {
565 		if (rate & 0x80000000) {	/* Detect leading "1" */
566 			return (((uint32_t) (i - 15) << 20) +
567 				logMagTable[0x7f & (rate >> 24)] +
568 				(0x7f & (rate >> 17)) *
569 				logSlopeTable[0x7f & (rate >> 24)]);
570 		}
571 		rate <<= 1;
572 	}
573 
574 	return 0;		/* Should never reach this point */
575 }
576 
577 /* Emu10k1 Low level */
578 
579 static uint32_t
580 emuxki_read(struct emuxki_softc *sc, uint16_t chano, uint32_t reg)
581 {
582 	uint32_t ptr, mask;
583 	uint8_t  size, offset;
584 	int s;
585 
586 	mask = 0xffffffff;
587 	offset = 0;
588 	ptr = ((((u_int32_t) reg) << 16) &
589 		(sc->sc_type & EMUXKI_AUDIGY ?
590 			EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK)) |
591 		(chano & EMU_PTR_CHNO_MASK);
592 	if (reg & 0xff000000) {
593 		size = (reg >> 24) & 0x3f;
594 		offset = (reg >> 16) & 0x1f;
595 		mask = ((1 << size) - 1) << offset;
596 	}
597 
598 	s = splaudio();
599 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr);
600 	ptr = (bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_DATA) & mask)
601 		>> offset;
602 	splx(s);
603 
604 	return ptr;
605 }
606 
607 static void
608 emuxki_write(struct emuxki_softc *sc, uint16_t chano,
609 	      uint32_t reg, uint32_t data)
610 {
611 	uint32_t ptr, mask;
612 	uint8_t size, offset;
613 	int s;
614 
615 	ptr = ((((u_int32_t) reg) << 16) &
616 		(sc->sc_type & EMUXKI_AUDIGY ?
617 			EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK)) |
618 		(chano & EMU_PTR_CHNO_MASK);
619 	if (reg & 0xff000000) {
620 		size = (reg >> 24) & 0x3f;
621 		offset = (reg >> 16) & 0x1f;
622 		mask = ((1 << size) - 1) << offset;
623 		data = ((data << offset) & mask) |
624 			(emuxki_read(sc, chano, reg & 0xffff) & ~mask);
625 	}
626 
627 	s = splaudio();
628 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr);
629 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_DATA, data);
630 	splx(s);
631 }
632 
633 /* Microcode should this go in /sys/dev/microcode ? */
634 
635 static void
636 emuxki_write_micro(struct emuxki_softc *sc, uint32_t pc, uint32_t data)
637 {
638 
639 	emuxki_write(sc, 0,
640 		(sc->sc_type & EMUXKI_AUDIGY ?
641 			EMU_A_MICROCODEBASE : EMU_MICROCODEBASE) + pc,
642 		 data);
643 }
644 
645 static void
646 emuxki_dsp_addop(struct emuxki_softc *sc, uint16_t *pc, uint8_t op,
647 		  uint16_t r, uint16_t a, uint16_t x, uint16_t y)
648 {
649 
650 	if (sc->sc_type & EMUXKI_AUDIGY) {
651 		emuxki_write_micro(sc, *pc << 1,
652 			((x << 12) & EMU_A_DSP_LOWORD_OPX_MASK) |
653 			(y & EMU_A_DSP_LOWORD_OPY_MASK));
654 		emuxki_write_micro(sc, (*pc << 1) + 1,
655 			((op << 24) & EMU_A_DSP_HIWORD_OPCODE_MASK) |
656 			((r << 12) & EMU_A_DSP_HIWORD_RESULT_MASK) |
657 			(a & EMU_A_DSP_HIWORD_OPA_MASK));
658 	} else {
659 		emuxki_write_micro(sc, *pc << 1,
660 			((x << 10) & EMU_DSP_LOWORD_OPX_MASK) |
661 			(y & EMU_DSP_LOWORD_OPY_MASK));
662 		emuxki_write_micro(sc, (*pc << 1) + 1,
663 			((op << 20) & EMU_DSP_HIWORD_OPCODE_MASK) |
664 			((r << 10) & EMU_DSP_HIWORD_RESULT_MASK) |
665 			(a & EMU_DSP_HIWORD_OPA_MASK));
666 	}
667 	(*pc)++;
668 }
669 
670 /* init and shutdown */
671 
672 static void
673 emuxki_initfx(struct emuxki_softc *sc)
674 {
675 	uint16_t pc;
676 
677 	/* Set all GPRs to 0 */
678 	for (pc = 0; pc < 256; pc++)
679 		emuxki_write(sc, 0, EMU_DSP_GPR(pc), 0);
680 	for (pc = 0; pc < 160; pc++) {
681 		emuxki_write(sc, 0, EMU_TANKMEMDATAREGBASE + pc, 0);
682 		emuxki_write(sc, 0, EMU_TANKMEMADDRREGBASE + pc, 0);
683 	}
684 	pc = 0;
685 
686 	if (sc->sc_type & EMUXKI_AUDIGY) {
687 		/* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */
688 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
689 				  EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT),
690 				  EMU_A_DSP_CST(0),
691 				  EMU_DSP_FX(0), EMU_A_DSP_CST(4));
692 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
693 				  EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT),
694 				  EMU_A_DSP_CST(0),
695 				  EMU_DSP_FX(1), EMU_A_DSP_CST(4));
696 
697 		/* Rear channel OUT (l/r) = FX[2/3] * 4 */
698 #if 0
699 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
700 				  EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_REAR),
701 				  EMU_A_DSP_OUTL(EMU_A_DSP_OUT_A_FRONT),
702 				  EMU_DSP_FX(0), EMU_A_DSP_CST(4));
703 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
704 				  EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_REAR),
705 				  EMU_A_DSP_OUTR(EMU_A_DSP_OUT_A_FRONT),
706 				  EMU_DSP_FX(1), EMU_A_DSP_CST(4));
707 #endif
708 		/* ADC recording (l/r) = AC97 In (l/r) */
709 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3,
710 				  EMU_A_DSP_OUTL(EMU_A_DSP_OUT_ADC),
711 				  EMU_A_DSP_INL(EMU_DSP_IN_AC97),
712 				  EMU_A_DSP_CST(0), EMU_A_DSP_CST(0));
713 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3,
714 				  EMU_A_DSP_OUTR(EMU_A_DSP_OUT_ADC),
715 				  EMU_A_DSP_INR(EMU_DSP_IN_AC97),
716 				  EMU_A_DSP_CST(0), EMU_A_DSP_CST(0));
717 
718 		/* zero out the rest of the microcode */
719 		while (pc < 512)
720 			emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3,
721 					  EMU_A_DSP_CST(0), EMU_A_DSP_CST(0),
722 					  EMU_A_DSP_CST(0), EMU_A_DSP_CST(0));
723 
724 		emuxki_write(sc, 0, EMU_A_DBG, 0);	/* Is it really necessary ? */
725 	} else {
726 		/* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */
727 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
728 				  EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT),
729 				  EMU_DSP_CST(0),
730 				  EMU_DSP_FX(0), EMU_DSP_CST(4));
731 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
732 				  EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT),
733 				  EMU_DSP_CST(0),
734 				  EMU_DSP_FX(1), EMU_DSP_CST(4));
735 
736 		/* Rear channel OUT (l/r) = FX[2/3] * 4 */
737 #if 0
738 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
739 				  EMU_DSP_OUTL(EMU_DSP_OUT_AD_REAR),
740 				  EMU_DSP_OUTL(EMU_DSP_OUT_A_FRONT),
741 				  EMU_DSP_FX(0), EMU_DSP_CST(4));
742 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
743 				  EMU_DSP_OUTR(EMU_DSP_OUT_AD_REAR),
744 				  EMU_DSP_OUTR(EMU_DSP_OUT_A_FRONT),
745 				  EMU_DSP_FX(1), EMU_DSP_CST(4));
746 #endif
747 		/* ADC recording (l/r) = AC97 In (l/r) */
748 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3,
749 				  EMU_DSP_OUTL(EMU_DSP_OUT_ADC),
750 				  EMU_DSP_INL(EMU_DSP_IN_AC97),
751 				  EMU_DSP_CST(0), EMU_DSP_CST(0));
752 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3,
753 				  EMU_DSP_OUTR(EMU_DSP_OUT_ADC),
754 				  EMU_DSP_INR(EMU_DSP_IN_AC97),
755 				  EMU_DSP_CST(0), EMU_DSP_CST(0));
756 
757 		/* zero out the rest of the microcode */
758 		while (pc < 512)
759 			emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3,
760 					  EMU_DSP_CST(0), EMU_DSP_CST(0),
761 					  EMU_DSP_CST(0), EMU_DSP_CST(0));
762 
763 		emuxki_write(sc, 0, EMU_DBG, 0);	/* Is it really necessary ? */
764 	}
765 }
766 
767 static int
768 emuxki_init(struct emuxki_softc *sc)
769 {
770 	uint16_t i;
771 	uint32_t spcs, *ptb;
772 	bus_addr_t silentpage;
773 
774 	/* disable any channel interrupt */
775 	emuxki_write(sc, 0, EMU_CLIEL, 0);
776 	emuxki_write(sc, 0, EMU_CLIEH, 0);
777 	emuxki_write(sc, 0, EMU_SOLEL, 0);
778 	emuxki_write(sc, 0, EMU_SOLEH, 0);
779 
780 	/* Set recording buffers sizes to zero */
781 	emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
782 	emuxki_write(sc, 0, EMU_MICBA, 0);
783 	emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
784 	emuxki_write(sc, 0, EMU_FXBA, 0);
785 	emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
786 	emuxki_write(sc, 0, EMU_ADCBA, 0);
787 
788 	if(sc->sc_type & EMUXKI_AUDIGY) {
789 		emuxki_write(sc, 0, EMU_SPBYPASS, EMU_SPBYPASS_24_BITS);
790 		emuxki_write(sc, 0, EMU_AC97SLOT, EMU_AC97SLOT_CENTER | EMU_AC97SLOT_LFE);
791 	}
792 
793 	/* Initialize all channels to stopped and no effects */
794 	for (i = 0; i < EMU_NUMCHAN; i++) {
795 		emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0);
796 		emuxki_write(sc, i, EMU_CHAN_IP, 0);
797 		emuxki_write(sc, i, EMU_CHAN_VTFT, 0xffff);
798 		emuxki_write(sc, i, EMU_CHAN_CVCF, 0xffff);
799 		emuxki_write(sc, i, EMU_CHAN_PTRX, 0);
800 		emuxki_write(sc, i, EMU_CHAN_CPF, 0);
801 		emuxki_write(sc, i, EMU_CHAN_CCR, 0);
802 		emuxki_write(sc, i, EMU_CHAN_PSST, 0);
803 		emuxki_write(sc, i, EMU_CHAN_DSL, 0x10);	/* Why 16 ? */
804 		emuxki_write(sc, i, EMU_CHAN_CCCA, 0);
805 		emuxki_write(sc, i, EMU_CHAN_Z1, 0);
806 		emuxki_write(sc, i, EMU_CHAN_Z2, 0);
807 		emuxki_write(sc, i, EMU_CHAN_FXRT, 0x32100000);
808 		emuxki_write(sc, i, EMU_CHAN_ATKHLDM, 0);
809 		emuxki_write(sc, i, EMU_CHAN_DCYSUSM, 0);
810 		emuxki_write(sc, i, EMU_CHAN_IFATN, 0xffff);
811 		emuxki_write(sc, i, EMU_CHAN_PEFE, 0);
812 		emuxki_write(sc, i, EMU_CHAN_FMMOD, 0);
813 		emuxki_write(sc, i, EMU_CHAN_TREMFRQ, 24);
814 		emuxki_write(sc, i, EMU_CHAN_FM2FRQ2, 24);
815 		emuxki_write(sc, i, EMU_CHAN_TEMPENV, 0);
816 
817 		/* these are last so OFF prevents writing */
818 		emuxki_write(sc, i, EMU_CHAN_LFOVAL2, 0);
819 		emuxki_write(sc, i, EMU_CHAN_LFOVAL1, 0);
820 		emuxki_write(sc, i, EMU_CHAN_ATKHLDV, 0);
821 		emuxki_write(sc, i, EMU_CHAN_ENVVOL, 0);
822 		emuxki_write(sc, i, EMU_CHAN_ENVVAL, 0);
823 	}
824 
825 	/* set digital outputs format */
826 	spcs = (EMU_SPCS_CLKACCY_1000PPM | EMU_SPCS_SAMPLERATE_48 |
827 	      EMU_SPCS_CHANNELNUM_LEFT | EMU_SPCS_SOURCENUM_UNSPEC |
828 		EMU_SPCS_GENERATIONSTATUS | 0x00001200 /* Cat code. */ |
829 		0x00000000 /* IEC-958 Mode */ | EMU_SPCS_EMPHASIS_NONE |
830 		EMU_SPCS_COPYRIGHT);
831 	emuxki_write(sc, 0, EMU_SPCS0, spcs);
832 	emuxki_write(sc, 0, EMU_SPCS1, spcs);
833 	emuxki_write(sc, 0, EMU_SPCS2, spcs);
834 
835 	if(sc->sc_type & EMUXKI_AUDIGY2) {
836 		emuxki_write(sc, 0, EMU_A2_SPDIF_SAMPLERATE, EMU_A2_SPDIF_UNKNOWN);
837 
838 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_PTR, EMU_A2_SRCSEL);
839 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_DATA,
840 			EMU_A2_SRCSEL_ENABLE_SPDIF | EMU_A2_SRCSEL_ENABLE_SRCMULTI);
841 
842 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_PTR, EMU_A2_SRCMULTI);
843 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_A2_DATA, EMU_A2_SRCMULTI_ENABLE_INPUT);
844 	}
845 
846 
847 	/* Let's play with sound processor */
848 	emuxki_initfx(sc);
849 
850 	/* Here is our Page Table */
851 	if ((sc->ptb = dmamem_alloc(sc->sc_dmat,
852 	    EMU_MAXPTE * sizeof(u_int32_t),
853 	    EMU_DMA_ALIGN, EMU_DMAMEM_NSEG,
854 	    M_DEVBUF, M_WAITOK)) == NULL)
855 		return ENOMEM;
856 
857 	/* This is necessary unless you like Metallic noise... */
858 	if ((sc->silentpage = dmamem_alloc(sc->sc_dmat, EMU_PTESIZE,
859 	    EMU_DMA_ALIGN, EMU_DMAMEM_NSEG, M_DEVBUF, M_WAITOK))==NULL){
860 		dmamem_free(sc->ptb, M_DEVBUF);
861 		return ENOMEM;
862 	}
863 
864 	/* Zero out the silent page */
865 	/* This might not be always true, it might be 128 for 8bit channels */
866 	memset(KERNADDR(sc->silentpage), 0, DMASIZE(sc->silentpage));
867 
868 	/*
869 	 * Set all the PTB Entries to the silent page We shift the physical
870 	 * address by one and OR it with the page number. I don't know what
871 	 * the ORed index is for, might be a very useful unused feature...
872 	 */
873 	silentpage = DMAADDR(sc->silentpage) << 1;
874 	ptb = KERNADDR(sc->ptb);
875 	for (i = 0; i < EMU_MAXPTE; i++)
876 		ptb[i] = htole32(silentpage | i);
877 
878 	/* Write PTB address and set TCB to none */
879 	emuxki_write(sc, 0, EMU_PTB, DMAADDR(sc->ptb));
880 	emuxki_write(sc, 0, EMU_TCBS, 0);	/* This means 16K TCB */
881 	emuxki_write(sc, 0, EMU_TCB, 0);	/* No TCB use for now */
882 
883 	/*
884 	 * Set channels MAPs to the silent page.
885 	 * I don't know what MAPs are for.
886 	 */
887 	silentpage |= EMU_CHAN_MAP_PTI_MASK;
888 	for (i = 0; i < EMU_NUMCHAN; i++) {
889 		emuxki_write(sc, i, EMU_CHAN_MAPA, silentpage);
890 		emuxki_write(sc, i, EMU_CHAN_MAPB, silentpage);
891 		sc->channel[i] = NULL;
892 	}
893 
894 	/* Init voices list */
895 	LIST_INIT(&(sc->voices));
896 
897 	/* Timer is stopped */
898 	sc->timerstate &= ~EMU_TIMER_STATE_ENABLED;
899 	return 0;
900 }
901 
902 static void
903 emuxki_shutdown(struct emuxki_softc *sc)
904 {
905 	uint32_t i;
906 
907 	/* Disable any Channels interrupts */
908 	emuxki_write(sc, 0, EMU_CLIEL, 0);
909 	emuxki_write(sc, 0, EMU_CLIEH, 0);
910 	emuxki_write(sc, 0, EMU_SOLEL, 0);
911 	emuxki_write(sc, 0, EMU_SOLEH, 0);
912 
913 	/*
914 	 * Should do some voice(stream) stopping stuff here, that's what will
915 	 * stop and deallocate all channels.
916 	 */
917 
918 	/* Stop all channels */
919 	/* XXX This shouldn't be necessary, I'll remove once everything works */
920 	for (i = 0; i < EMU_NUMCHAN; i++)
921 		emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0);
922 	for (i = 0; i < EMU_NUMCHAN; i++) {
923 		emuxki_write(sc, i, EMU_CHAN_VTFT, 0);
924 		emuxki_write(sc, i, EMU_CHAN_CVCF, 0);
925 		emuxki_write(sc, i, EMU_CHAN_PTRX, 0);
926 		emuxki_write(sc, i, EMU_CHAN_CPF, 0);
927 	}
928 
929 	/*
930 	 * Deallocate Emu10k1 caches and recording buffers. Again it will be
931 	 * removed because it will be done in voice shutdown.
932 	 */
933 	emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
934 	emuxki_write(sc, 0, EMU_MICBA, 0);
935 	emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
936 	emuxki_write(sc, 0, EMU_FXBA, 0);
937 	if(sc->sc_type & EMUXKI_AUDIGY) {
938 		emuxki_write(sc, 0, EMU_A_FXWC1, 0);
939 		emuxki_write(sc, 0, EMU_A_FXWC2, 0);
940 	} else {
941 		emuxki_write(sc, 0, EMU_FXWC, 0);
942 	}
943 	emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
944 	emuxki_write(sc, 0, EMU_ADCBA, 0);
945 
946 	/*
947 	 * XXX I don't know yet how I will handle tank cache buffer,
948 	 * I don't even clearly  know what it is for.
949 	 */
950 	emuxki_write(sc, 0, EMU_TCB, 0);	/* 16K again */
951 	emuxki_write(sc, 0, EMU_TCBS, 0);
952 
953 	emuxki_write(sc, 0, EMU_DBG, 0x8000);	/* necessary ? */
954 
955 	dmamem_free(sc->silentpage, M_DEVBUF);
956 	dmamem_free(sc->ptb, M_DEVBUF);
957 }
958 
959 /* Emu10k1 Memory management */
960 
961 static struct emuxki_mem *
962 emuxki_mem_new(struct emuxki_softc *sc, int ptbidx,
963 	       size_t size, struct malloc_type *type, int flags)
964 {
965 	struct emuxki_mem *mem;
966 
967 	if ((mem = malloc(sizeof(*mem), type, flags)) == NULL)
968 		return NULL;
969 
970 	mem->ptbidx = ptbidx;
971 	if ((mem->dmamem = dmamem_alloc(sc->sc_dmat, size, EMU_DMA_ALIGN,
972 	    EMU_DMAMEM_NSEG, type, flags)) == NULL) {
973 		free(mem, type);
974 		return NULL;
975 	}
976 	return mem;
977 }
978 
979 static void
980 emuxki_mem_delete(struct emuxki_mem *mem, struct malloc_type *type)
981 {
982 
983 	dmamem_free(mem->dmamem, type);
984 	free(mem, type);
985 }
986 
987 static void *
988 emuxki_pmem_alloc(struct emuxki_softc *sc, size_t size,
989     struct malloc_type *type, int flags)
990 {
991 	int i, j, s;
992 	size_t numblocks;
993 	struct emuxki_mem *mem;
994 	uint32_t *ptb, silentpage;
995 
996 	ptb = KERNADDR(sc->ptb);
997 	silentpage = DMAADDR(sc->silentpage) << 1;
998 	numblocks = size / EMU_PTESIZE;
999 	if (size % EMU_PTESIZE)
1000 		numblocks++;
1001 
1002 	for (i = 0; i < EMU_MAXPTE; i++)
1003 		if ((le32toh(ptb[i]) & EMU_CHAN_MAP_PTE_MASK) == silentpage) {
1004 			/* We look for a free PTE */
1005 			s = splaudio();
1006 			for (j = 0; j < numblocks; j++)
1007 				if ((le32toh(ptb[i + j])
1008 				    & EMU_CHAN_MAP_PTE_MASK) != silentpage)
1009 					break;
1010 			if (j == numblocks) {
1011 				if ((mem = emuxki_mem_new(sc, i,
1012 						size, type, flags)) == NULL) {
1013 					splx(s);
1014 					return NULL;
1015 				}
1016 				for (j = 0; j < numblocks; j++)
1017 					ptb[i + j] =
1018 					    htole32((((DMAADDR(mem->dmamem) +
1019 					    j * EMU_PTESIZE)) << 1) | (i + j));
1020 				LIST_INSERT_HEAD(&(sc->mem), mem, next);
1021 				splx(s);
1022 				return (KERNADDR(mem->dmamem));
1023 			} else
1024 				i += j;
1025 			splx(s);
1026 		}
1027 	return NULL;
1028 }
1029 
1030 static void *
1031 emuxki_rmem_alloc(struct emuxki_softc *sc, size_t size,
1032     struct malloc_type *type, int flags)
1033 {
1034 	struct emuxki_mem *mem;
1035 	int s;
1036 
1037 	mem = emuxki_mem_new(sc, EMU_RMEM, size, type, flags);
1038 	if (mem == NULL)
1039 		return NULL;
1040 
1041 	s = splaudio();
1042 	LIST_INSERT_HEAD(&(sc->mem), mem, next);
1043 	splx(s);
1044 
1045 	return KERNADDR(mem->dmamem);
1046 }
1047 
1048 /*
1049  * emuxki_channel_* : Channel management functions
1050  * emuxki_chanparms_* : Channel parameters modification functions
1051  */
1052 
1053 /*
1054  * is splaudio necessary here, can the same voice be manipulated by two
1055  * different threads at a time ?
1056  */
1057 static void
1058 emuxki_chanparms_set_defaults(struct emuxki_channel *chan)
1059 {
1060 
1061 	chan->fxsend.a.level = chan->fxsend.b.level =
1062 	chan->fxsend.c.level = chan->fxsend.d.level =
1063 	/* for audigy */
1064 	chan->fxsend.e.level = chan->fxsend.f.level =
1065 	chan->fxsend.g.level = chan->fxsend.h.level =
1066 		chan->voice->sc->sc_type & EMUXKI_AUDIGY ?
1067 			0xc0 : 0xff;	/* not max */
1068 
1069 	chan->fxsend.a.dest = 0x0;
1070 	chan->fxsend.b.dest = 0x1;
1071 	chan->fxsend.c.dest = 0x2;
1072 	chan->fxsend.d.dest = 0x3;
1073 	/* for audigy */
1074 	chan->fxsend.e.dest = 0x4;
1075 	chan->fxsend.f.dest = 0x5;
1076 	chan->fxsend.g.dest = 0x6;
1077 	chan->fxsend.h.dest = 0x7;
1078 
1079 	chan->pitch.initial = 0x0000;	/* shouldn't it be 0xE000 ? */
1080 	chan->pitch.current = 0x0000;	/* should it be 0x0400 */
1081 	chan->pitch.target = 0x0000;	/* the unity pitch shift ? */
1082 	chan->pitch.envelope_amount = 0x00;	/* none */
1083 
1084 	chan->initial_attenuation = 0x00;	/* no attenuation */
1085 	chan->volume.current = 0x0000;	/* no volume */
1086 	chan->volume.target = 0xffff;
1087 	chan->volume.envelope.current_state = 0x8000;	/* 0 msec delay */
1088 	chan->volume.envelope.hold_time = 0x7f;	/* 0 msec */
1089 	chan->volume.envelope.attack_time = 0x7F;	/* 5.5msec */
1090 	chan->volume.envelope.sustain_level = 0x7F;	/* full  */
1091 	chan->volume.envelope.decay_time = 0x7F;	/* 22msec  */
1092 
1093 	chan->filter.initial_cutoff_frequency = 0xff;	/* no filter */
1094 	chan->filter.current_cutoff_frequency = 0xffff;	/* no filtering */
1095 	chan->filter.target_cutoff_frequency = 0xffff;	/* no filtering */
1096 	chan->filter.lowpass_resonance_height = 0x0;
1097 	chan->filter.interpolation_ROM = 0x1;	/* full band */
1098 	chan->filter.envelope_amount = 0x7f;	/* none */
1099 	chan->filter.LFO_modulation_depth = 0x00;	/* none */
1100 
1101 	chan->loop.start = 0x000000;
1102 	chan->loop.end = 0x000010;	/* Why ? */
1103 
1104 	chan->modulation.envelope.current_state = 0x8000;
1105 	chan->modulation.envelope.hold_time = 0x00;	/* 127 better ? */
1106 	chan->modulation.envelope.attack_time = 0x00;	/* infinite */
1107 	chan->modulation.envelope.sustain_level = 0x00;	/* off */
1108 	chan->modulation.envelope.decay_time = 0x7f;	/* 22 msec */
1109 	chan->modulation.LFO_state = 0x8000;
1110 
1111 	chan->vibrato_LFO.state = 0x8000;
1112 	chan->vibrato_LFO.modulation_depth = 0x00;	/* none */
1113 	chan->vibrato_LFO.vibrato_depth = 0x00;
1114 	chan->vibrato_LFO.frequency = 0x00;	/* Why set to 24 when
1115 						 * initialized ? */
1116 
1117 	chan->tremolo_depth = 0x00;
1118 }
1119 
1120 /* only call it at splaudio */
1121 static struct emuxki_channel *
1122 emuxki_channel_new(struct emuxki_voice *voice, u_int8_t num)
1123 {
1124 	struct emuxki_channel *chan;
1125 
1126 	chan = malloc(sizeof(struct emuxki_channel), M_DEVBUF, M_WAITOK);
1127 	if (chan == NULL)
1128 		return NULL;
1129 
1130 	chan->voice = voice;
1131 	chan->num = num;
1132 	emuxki_chanparms_set_defaults(chan);
1133 	chan->voice->sc->channel[num] = chan;
1134 	return chan;
1135 }
1136 
1137 /* only call it at splaudio */
1138 static void
1139 emuxki_channel_delete(struct emuxki_channel *chan)
1140 {
1141 
1142 	chan->voice->sc->channel[chan->num] = NULL;
1143 	free(chan, M_DEVBUF);
1144 }
1145 
1146 static void
1147 emuxki_channel_set_fxsend(struct emuxki_channel *chan,
1148     struct emuxki_chanparms_fxsend *fxsend)
1149 {
1150 	/* Could do a memcpy ...*/
1151 	chan->fxsend.a.level = fxsend->a.level;
1152 	chan->fxsend.b.level = fxsend->b.level;
1153 	chan->fxsend.c.level = fxsend->c.level;
1154 	chan->fxsend.d.level = fxsend->d.level;
1155 	chan->fxsend.a.dest = fxsend->a.dest;
1156 	chan->fxsend.b.dest = fxsend->b.dest;
1157 	chan->fxsend.c.dest = fxsend->c.dest;
1158 	chan->fxsend.d.dest = fxsend->d.dest;
1159 
1160 	/* for audigy */
1161 	chan->fxsend.e.level = fxsend->e.level;
1162 	chan->fxsend.f.level = fxsend->f.level;
1163 	chan->fxsend.g.level = fxsend->g.level;
1164 	chan->fxsend.h.level = fxsend->h.level;
1165 	chan->fxsend.e.dest = fxsend->e.dest;
1166 	chan->fxsend.f.dest = fxsend->f.dest;
1167 	chan->fxsend.g.dest = fxsend->g.dest;
1168 	chan->fxsend.h.dest = fxsend->h.dest;
1169 }
1170 
1171 static void
1172 emuxki_channel_set_srate(struct emuxki_channel *chan, uint32_t srate)
1173 {
1174 
1175 	chan->pitch.target = (srate << 8) / 375;
1176 	chan->pitch.target = (chan->pitch.target >> 1) +
1177 		(chan->pitch.target & 1);
1178 	chan->pitch.target &= 0xffff;
1179 	chan->pitch.current = chan->pitch.target;
1180 	chan->pitch.initial =
1181 		(emuxki_rate_to_pitch(srate) >> 8) & EMU_CHAN_IP_MASK;
1182 }
1183 
1184 /* voice params must be set before calling this */
1185 static void
1186 emuxki_channel_set_bufparms(struct emuxki_channel *chan,
1187     uint32_t start, uint32_t end)
1188 {
1189 
1190 	chan->loop.start = start & EMU_CHAN_PSST_LOOPSTARTADDR_MASK;
1191 	chan->loop.end = end & EMU_CHAN_DSL_LOOPENDADDR_MASK;
1192 }
1193 
1194 static void
1195 emuxki_channel_commit_fx(struct emuxki_channel *chan)
1196 {
1197 	struct emuxki_softc *sc;
1198 	u_int8_t chano;
1199 
1200 	sc = chan->voice->sc;
1201 	chano = chan->num;
1202 	if(sc->sc_type & EMUXKI_AUDIGY) {
1203 		emuxki_write(sc, chano, EMU_A_CHAN_FXRT1,
1204 			      (chan->fxsend.d.dest << 24) |
1205 			      (chan->fxsend.c.dest << 16) |
1206 			      (chan->fxsend.b.dest << 8) |
1207 			      (chan->fxsend.a.dest));
1208 		emuxki_write(sc, chano, EMU_A_CHAN_FXRT2,
1209 			      (chan->fxsend.h.dest << 24) |
1210 			      (chan->fxsend.g.dest << 16) |
1211 			      (chan->fxsend.f.dest << 8) |
1212 			      (chan->fxsend.e.dest));
1213 		emuxki_write(sc, chano, EMU_A_CHAN_SENDAMOUNTS,
1214 			      (chan->fxsend.e.level << 24) |
1215 			      (chan->fxsend.f.level << 16) |
1216 			      (chan->fxsend.g.level << 8) |
1217 			      (chan->fxsend.h.level));
1218 	} else {
1219 		emuxki_write(sc, chano, EMU_CHAN_FXRT,
1220 			      (chan->fxsend.d.dest << 28) |
1221 			      (chan->fxsend.c.dest << 24) |
1222 			      (chan->fxsend.b.dest << 20) |
1223 			      (chan->fxsend.a.dest << 16));
1224 	}
1225 
1226 	emuxki_write(sc, chano, 0x10000000 | EMU_CHAN_PTRX,
1227 		      (chan->fxsend.a.level << 8) | chan->fxsend.b.level);
1228 	emuxki_write(sc, chano, EMU_CHAN_DSL,
1229 		      (chan->fxsend.d.level << 24) | chan->loop.end);
1230 	emuxki_write(sc, chano, EMU_CHAN_PSST,
1231 		      (chan->fxsend.c.level << 24) | chan->loop.start);
1232 }
1233 
1234 static void
1235 emuxki_channel_commit_parms(struct emuxki_channel *chan)
1236 {
1237 	struct emuxki_voice *voice;
1238 	struct emuxki_softc *sc;
1239 	uint32_t start, mapval;
1240 	uint8_t chano;
1241 	int s;
1242 
1243 	voice = chan->voice;
1244 	sc = voice->sc;
1245 	chano = chan->num;
1246 	start = chan->loop.start +
1247 		(voice->stereo ? 28 : 30) * (voice->b16 + 1);
1248 	mapval = DMAADDR(sc->silentpage) << 1 | EMU_CHAN_MAP_PTI_MASK;
1249 
1250 	s = splaudio();
1251 	emuxki_write(sc, chano, EMU_CHAN_CPF_STEREO, voice->stereo);
1252 
1253 	emuxki_channel_commit_fx(chan);
1254 
1255 	emuxki_write(sc, chano, EMU_CHAN_CCCA,
1256 		(chan->filter.lowpass_resonance_height << 28) |
1257 		(chan->filter.interpolation_ROM << 25) |
1258 		(voice->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT) | start);
1259 	emuxki_write(sc, chano, EMU_CHAN_Z1, 0);
1260 	emuxki_write(sc, chano, EMU_CHAN_Z2, 0);
1261 	emuxki_write(sc, chano, EMU_CHAN_MAPA, mapval);
1262 	emuxki_write(sc, chano, EMU_CHAN_MAPB, mapval);
1263 	emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRFILTER,
1264 		chan->filter.current_cutoff_frequency);
1265 	emuxki_write(sc, chano, EMU_CHAN_VTFT_FILTERTARGET,
1266 		chan->filter.target_cutoff_frequency);
1267 	emuxki_write(sc, chano, EMU_CHAN_ATKHLDM,
1268 		(chan->modulation.envelope.hold_time << 8) |
1269 		chan->modulation.envelope.attack_time);
1270 	emuxki_write(sc, chano, EMU_CHAN_DCYSUSM,
1271 		(chan->modulation.envelope.sustain_level << 8) |
1272 		chan->modulation.envelope.decay_time);
1273 	emuxki_write(sc, chano, EMU_CHAN_LFOVAL1,
1274 		chan->modulation.LFO_state);
1275 	emuxki_write(sc, chano, EMU_CHAN_LFOVAL2,
1276 		chan->vibrato_LFO.state);
1277 	emuxki_write(sc, chano, EMU_CHAN_FMMOD,
1278 		(chan->vibrato_LFO.modulation_depth << 8) |
1279 		chan->filter.LFO_modulation_depth);
1280 	emuxki_write(sc, chano, EMU_CHAN_TREMFRQ,
1281 		(chan->tremolo_depth << 8));
1282 	emuxki_write(sc, chano, EMU_CHAN_FM2FRQ2,
1283 		(chan->vibrato_LFO.vibrato_depth << 8) |
1284 		chan->vibrato_LFO.frequency);
1285 	emuxki_write(sc, chano, EMU_CHAN_ENVVAL,
1286 		chan->modulation.envelope.current_state);
1287 	emuxki_write(sc, chano, EMU_CHAN_ATKHLDV,
1288 		(chan->volume.envelope.hold_time << 8) |
1289 		chan->volume.envelope.attack_time);
1290 	emuxki_write(sc, chano, EMU_CHAN_ENVVOL,
1291 		chan->volume.envelope.current_state);
1292 	emuxki_write(sc, chano, EMU_CHAN_PEFE,
1293 		(chan->pitch.envelope_amount << 8) |
1294 		chan->filter.envelope_amount);
1295 	splx(s);
1296 }
1297 
1298 static void
1299 emuxki_channel_start(struct emuxki_channel *chan)
1300 {
1301 	struct emuxki_voice *voice;
1302 	struct emuxki_softc *sc;
1303 	u_int8_t cache_sample, cache_invalid_size, chano;
1304 	u_int32_t sample;
1305 	int s;
1306 
1307 	voice = chan->voice;
1308 	sc = voice->sc;
1309 	chano = chan->num;
1310 	cache_sample = voice->stereo ? 4 : 2;
1311 	sample = voice->b16 ? 0x00000000 : 0x80808080;
1312 	cache_invalid_size = (voice->stereo ? 28 : 30) * (voice->b16 + 1);
1313 
1314 	s = splaudio();
1315 	while (cache_sample--) {
1316 		emuxki_write(sc, chano, EMU_CHAN_CD0 + cache_sample,
1317 			sample);
1318 	}
1319 	emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0);
1320 	emuxki_write(sc, chano, EMU_CHAN_CCR_READADDRESS, 64);
1321 	emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE,
1322 		cache_invalid_size);
1323 	emuxki_write(sc, chano, EMU_CHAN_IFATN,
1324 		(chan->filter.target_cutoff_frequency << 8) |
1325 		chan->initial_attenuation);
1326 	emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET,
1327 		chan->volume.target);
1328 	emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL,
1329 		chan->volume.current);
1330 	emuxki_write(sc, 0,
1331 		EMU_MKSUBREG(1, chano, EMU_SOLEL + (chano >> 5)),
1332 		0);	/* Clear stop on loop */
1333 	emuxki_write(sc, 0,
1334 		EMU_MKSUBREG(1, chano, EMU_CLIEL + (chano >> 5)),
1335 		0);	/* Clear loop interrupt */
1336 	emuxki_write(sc, chano, EMU_CHAN_DCYSUSV,
1337 		(chan->volume.envelope.sustain_level << 8) |
1338 		chan->volume.envelope.decay_time);
1339 	emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET,
1340 		chan->pitch.target);
1341 	emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH,
1342 		chan->pitch.current);
1343 	emuxki_write(sc, chano, EMU_CHAN_IP, chan->pitch.initial);
1344 
1345 	splx(s);
1346 }
1347 
1348 static void
1349 emuxki_channel_stop(struct emuxki_channel *chan)
1350 {
1351 	struct emuxki_softc *sc;
1352 	int s;
1353 	u_int8_t chano;
1354 
1355 	sc = chan->voice->sc;
1356 	chano = chan->num;
1357 	s = splaudio();
1358 	emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET, 0);
1359 	emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH, 0);
1360 	emuxki_write(sc, chano, EMU_CHAN_IFATN_ATTENUATION, 0xff);
1361 	emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET, 0);
1362 	emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL, 0);
1363 	emuxki_write(sc, chano, EMU_CHAN_IP, 0);
1364 	splx(s);
1365 }
1366 
1367 /*
1368  * Voices management
1369  * emuxki_voice_dataloc : use(play or rec) independent dataloc union helpers
1370  * emuxki_voice_channel_* : play part of dataloc union helpers
1371  * emuxki_voice_recsrc_* : rec part of dataloc union helpers
1372  */
1373 
1374 /* Allocate channels for voice in case of play voice */
1375 static int
1376 emuxki_voice_channel_create(struct emuxki_voice *voice)
1377 {
1378 	struct emuxki_channel **channel;
1379 	int s;
1380 	uint8_t i, stereo;
1381 
1382 	channel = voice->sc->channel;
1383 	stereo = voice->stereo;
1384 	for (i = 0; i < EMU_NUMCHAN - stereo; i += stereo + 1) {
1385 		if ((stereo && (channel[i + 1] != NULL)) ||
1386 		    (channel[i] != NULL))	/* Looking for free channels */
1387 			continue;
1388 		s = splaudio();
1389 		if (stereo) {
1390 			voice->dataloc.chan[1] =
1391 				emuxki_channel_new(voice, i + 1);
1392 			if (voice->dataloc.chan[1] == NULL) {
1393 				splx(s);
1394 				return ENOMEM;
1395 			}
1396 		}
1397 		voice->dataloc.chan[0] = emuxki_channel_new(voice, i);
1398 		if (voice->dataloc.chan[0] == NULL) {
1399 			if (stereo) {
1400 				emuxki_channel_delete(voice->dataloc.chan[1]);
1401 				voice->dataloc.chan[1] = NULL;
1402 			}
1403 			splx(s);
1404 			return ENOMEM;
1405 		}
1406 		splx(s);
1407 		return 0;
1408 	}
1409 	return EAGAIN;
1410 }
1411 
1412 /* When calling this function we assume no one can access the voice */
1413 static void
1414 emuxki_voice_channel_destroy(struct emuxki_voice *voice)
1415 {
1416 
1417 	emuxki_channel_delete(voice->dataloc.chan[0]);
1418 	voice->dataloc.chan[0] = NULL;
1419 	if (voice->stereo)
1420 		emuxki_channel_delete(voice->dataloc.chan[1]);
1421 	voice->dataloc.chan[1] = NULL;
1422 }
1423 
1424 /*
1425  * Will come back when used in voice_dataloc_create
1426  */
1427 static int
1428 emuxki_recsrc_reserve(struct emuxki_voice *voice, emuxki_recsrc_t source)
1429 {
1430 
1431 	if (source >= EMU_NUMRECSRCS) {
1432 #ifdef EMUXKI_DEBUG
1433 		printf("Tried to reserve invalid source: %d\n", source);
1434 #endif
1435 		return EINVAL;
1436 	}
1437 	if (voice->sc->recsrc[source] == voice)
1438 		return 0;			/* XXX */
1439 	if (voice->sc->recsrc[source] != NULL)
1440 		return EBUSY;
1441 	voice->sc->recsrc[source] = voice;
1442 	return 0;
1443 }
1444 
1445 /* When calling this function we assume the voice is stopped */
1446 static void
1447 emuxki_voice_recsrc_release(struct emuxki_softc *sc, emuxki_recsrc_t source)
1448 {
1449 
1450 	sc->recsrc[source] = NULL;
1451 }
1452 
1453 static int
1454 emuxki_voice_dataloc_create(struct emuxki_voice *voice)
1455 {
1456 	int error;
1457 
1458 	if (voice->use & EMU_VOICE_USE_PLAY) {
1459 		if ((error = emuxki_voice_channel_create(voice)))
1460 			return error;
1461 	} else {
1462 		if ((error =
1463 		    emuxki_recsrc_reserve(voice, voice->dataloc.source)))
1464 			return error;
1465 	}
1466 	return 0;
1467 }
1468 
1469 static void
1470 emuxki_voice_dataloc_destroy(struct emuxki_voice *voice)
1471 {
1472 
1473 	if (voice->use & EMU_VOICE_USE_PLAY) {
1474 		if (voice->dataloc.chan[0] != NULL)
1475 			emuxki_voice_channel_destroy(voice);
1476 	} else {
1477 		if (voice->dataloc.source != EMU_RECSRC_NOTSET) {
1478 			emuxki_voice_recsrc_release(voice->sc,
1479 						     voice->dataloc.source);
1480 			voice->dataloc.source = EMU_RECSRC_NOTSET;
1481 		}
1482 	}
1483 }
1484 
1485 static struct emuxki_voice *
1486 emuxki_voice_new(struct emuxki_softc *sc, uint8_t use)
1487 {
1488 	struct emuxki_voice *voice;
1489 	int s;
1490 
1491 	s = splaudio();
1492 	voice = sc->lvoice;
1493 	sc->lvoice = NULL;
1494 	splx(s);
1495 
1496 	if (!voice) {
1497 		if (!(voice = malloc(sizeof(*voice), M_DEVBUF, M_WAITOK)))
1498 			return NULL;
1499 	} else if (voice->use != use)
1500 		emuxki_voice_dataloc_destroy(voice);
1501 	else
1502 		goto skip_initialize;
1503 
1504 	voice->sc = sc;
1505 	voice->state = !EMU_VOICE_STATE_STARTED;
1506 	voice->stereo = EMU_VOICE_STEREO_NOTSET;
1507 	voice->b16 = 0;
1508 	voice->sample_rate = 0;
1509 	if (use & EMU_VOICE_USE_PLAY)
1510 		voice->dataloc.chan[0] = voice->dataloc.chan[1] = NULL;
1511 	else
1512 		voice->dataloc.source = EMU_RECSRC_NOTSET;
1513 	voice->buffer = NULL;
1514 	voice->blksize = 0;
1515 	voice->trigblk = 0;
1516 	voice->blkmod = 0;
1517 	voice->inth = NULL;
1518 	voice->inthparam = NULL;
1519 	voice->use = use;
1520 
1521 skip_initialize:
1522 	s = splaudio();
1523 	LIST_INSERT_HEAD((&sc->voices), voice, next);
1524 	splx(s);
1525 
1526 	return voice;
1527 }
1528 
1529 static void
1530 emuxki_voice_delete(struct emuxki_voice *voice)
1531 {
1532 	struct emuxki_softc *sc;
1533 	struct emuxki_voice *lvoice;
1534 	int s;
1535 
1536 	sc = voice->sc;
1537 	if (voice->state & EMU_VOICE_STATE_STARTED)
1538 		emuxki_voice_halt(voice);
1539 
1540 	s = splaudio();
1541 	LIST_REMOVE(voice, next);
1542 	lvoice = sc->lvoice;
1543 	sc->lvoice = voice;
1544 	splx(s);
1545 
1546 	if (lvoice) {
1547 		emuxki_voice_dataloc_destroy(lvoice);
1548 		free(lvoice, M_DEVBUF);
1549 	}
1550 }
1551 
1552 static int
1553 emuxki_voice_set_stereo(struct emuxki_voice *voice, uint8_t stereo)
1554 {
1555 	int error;
1556 	emuxki_recsrc_t source;
1557 	struct emuxki_chanparms_fxsend fxsend;
1558 
1559 	source = 0;		/* XXX: gcc */
1560 	if (! (voice->use & EMU_VOICE_USE_PLAY))
1561 		source = voice->dataloc.source;
1562 	emuxki_voice_dataloc_destroy(voice);
1563 	if (! (voice->use & EMU_VOICE_USE_PLAY))
1564 		voice->dataloc.source = source;
1565 	voice->stereo = stereo;
1566 	if ((error = emuxki_voice_dataloc_create(voice)))
1567 		return error;
1568 	if (voice->use & EMU_VOICE_USE_PLAY) {
1569 		fxsend.a.dest = 0x0;
1570 		fxsend.b.dest = 0x1;
1571 		fxsend.c.dest = 0x2;
1572 		fxsend.d.dest = 0x3;
1573 		/* for audigy */
1574 		fxsend.e.dest = 0x4;
1575 		fxsend.f.dest = 0x5;
1576 		fxsend.g.dest = 0x6;
1577 		fxsend.h.dest = 0x7;
1578 		if (voice->stereo) {
1579 			fxsend.a.level = fxsend.c.level = 0xc0;
1580 			fxsend.b.level = fxsend.d.level = 0x00;
1581 			fxsend.e.level = fxsend.g.level = 0xc0;
1582 			fxsend.f.level = fxsend.h.level = 0x00;
1583 			emuxki_channel_set_fxsend(voice->dataloc.chan[0],
1584 						   &fxsend);
1585 			fxsend.a.level = fxsend.c.level = 0x00;
1586 			fxsend.b.level = fxsend.d.level = 0xc0;
1587 			fxsend.e.level = fxsend.g.level = 0x00;
1588 			fxsend.f.level = fxsend.h.level = 0xc0;
1589 			emuxki_channel_set_fxsend(voice->dataloc.chan[1],
1590 						   &fxsend);
1591 		} /* No else : default is good for mono */
1592 	}
1593 	return 0;
1594 }
1595 
1596 static int
1597 emuxki_voice_set_srate(struct emuxki_voice *voice, uint32_t srate)
1598 {
1599 
1600 	if (voice->use & EMU_VOICE_USE_PLAY) {
1601 		if ((srate < 4000) || (srate > 48000))
1602 			return EINVAL;
1603 		voice->sample_rate = srate;
1604 		emuxki_channel_set_srate(voice->dataloc.chan[0], srate);
1605 		if (voice->stereo)
1606 			emuxki_channel_set_srate(voice->dataloc.chan[1],
1607 						  srate);
1608 	} else {
1609 		if ((srate < 8000) || (srate > 48000))
1610 			return EINVAL;
1611 		voice->sample_rate = srate;
1612 		if (emuxki_voice_adc_rate(voice) < 0) {
1613 			voice->sample_rate = 0;
1614 			return EINVAL;
1615 		}
1616 	}
1617 	return 0;
1618 }
1619 
1620 static int
1621 emuxki_voice_set_audioparms(struct emuxki_voice *voice, uint8_t stereo,
1622     uint8_t b16, uint32_t srate)
1623 {
1624 	int error;
1625 
1626 	if (voice->stereo == stereo && voice->b16 == b16 &&
1627 	    voice->sample_rate == srate)
1628 		return 0;
1629 
1630 #ifdef EMUXKI_DEBUG
1631 	printf("Setting %s voice params : %s, %u bits, %u Hz\n",
1632 	       (voice->use & EMU_VOICE_USE_PLAY) ? "play" : "record",
1633 	       stereo ? "stereo" : "mono", (b16 + 1) * 8, srate);
1634 #endif
1635 	error = 0;
1636 	if (voice->stereo != stereo) {
1637 		if ((error = emuxki_voice_set_stereo(voice, stereo)))
1638 			return error;
1639 	 }
1640 	voice->b16 = b16;
1641 	if (voice->sample_rate != srate)
1642 		error = emuxki_voice_set_srate(voice, srate);
1643 	return error;
1644 }
1645 
1646 /* voice audio parms (see just before) must be set prior to this */
1647 static int
1648 emuxki_voice_set_bufparms(struct emuxki_voice *voice, void *ptr,
1649     uint32_t bufsize, uint16_t blksize)
1650 {
1651 	struct emuxki_mem *mem;
1652 	struct emuxki_channel **chan;
1653 	uint32_t start, end;
1654 	uint8_t sample_size;
1655 	int idx;
1656 	int error;
1657 
1658 	error = EFAULT;
1659 	LIST_FOREACH(mem, &voice->sc->mem, next) {
1660 		if (KERNADDR(mem->dmamem) != ptr)
1661 			continue;
1662 
1663 		voice->buffer = mem;
1664 		sample_size = (voice->b16 + 1) * (voice->stereo + 1);
1665 		voice->trigblk = 0;	/* This shouldn't be needed */
1666 		voice->blkmod = bufsize / blksize;
1667 		if (bufsize % blksize)	  /* This should not happen */
1668 			voice->blkmod++;
1669 		error = 0;
1670 
1671 		if (voice->use & EMU_VOICE_USE_PLAY) {
1672 			voice->blksize = blksize / sample_size;
1673 			chan = voice->dataloc.chan;
1674 			start = mem->ptbidx << 12;
1675 			end = start + bufsize / sample_size;
1676 			emuxki_channel_set_bufparms(chan[0],
1677 						     start, end);
1678 			if (voice->stereo)
1679 				emuxki_channel_set_bufparms(chan[1],
1680 				     start, end);
1681 			voice->timerate = (uint32_t) 48000 *
1682 			    voice->blksize / voice->sample_rate;
1683 			if (voice->timerate < 5)
1684 				error = EINVAL;
1685 		} else {
1686 			voice->blksize = blksize;
1687 			for(idx = sizeof(emuxki_recbuf_sz) /
1688 			    sizeof(emuxki_recbuf_sz[0]); --idx >= 0;)
1689 				if (emuxki_recbuf_sz[idx] == bufsize)
1690 					break;
1691 			if (idx < 0) {
1692 #ifdef EMUXKI_DEBUG
1693 				printf("Invalid bufsize: %d\n", bufsize);
1694 #endif
1695 				return EINVAL;
1696 			}
1697 			emuxki_write(voice->sc, 0,
1698 			    emuxki_recsrc_szreg[voice->dataloc.source], idx);
1699 			emuxki_write(voice->sc, 0,
1700 			    emuxki_recsrc_bufaddrreg[voice->dataloc.source],
1701 			    DMAADDR(mem->dmamem));
1702 
1703 			/* Use timer to emulate DMA completion interrupt */
1704 			voice->timerate = (u_int32_t) 48000 * blksize /
1705 			    (voice->sample_rate * sample_size);
1706 			if (voice->timerate < 5) {
1707 #ifdef EMUXKI_DEBUG
1708 				printf("Invalid timerate: %d, blksize %d\n",
1709 				    voice->timerate, blksize);
1710 #endif
1711 				error = EINVAL;
1712 			}
1713 		}
1714 
1715 		break;
1716 	}
1717 
1718 	return error;
1719 }
1720 
1721 static void
1722 emuxki_voice_commit_parms(struct emuxki_voice *voice)
1723 {
1724 	if (voice->use & EMU_VOICE_USE_PLAY) {
1725 		emuxki_channel_commit_parms(voice->dataloc.chan[0]);
1726 		if (voice->stereo)
1727 			emuxki_channel_commit_parms(voice->dataloc.chan[1]);
1728 	}
1729 }
1730 
1731 static uint32_t
1732 emuxki_voice_curaddr(struct emuxki_voice *voice)
1733 {
1734 	int idxreg;
1735 
1736 	/* XXX different semantics in these cases */
1737 	if (voice->use & EMU_VOICE_USE_PLAY) {
1738 		/* returns number of samples (an l/r pair counts 1) */
1739 		return emuxki_read(voice->sc,
1740 		    voice->dataloc.chan[0]->num, EMU_CHAN_CCCA_CURRADDR) -
1741 		    voice->dataloc.chan[0]->loop.start;
1742 	} else {
1743 		idxreg = 0;
1744 		/* returns number of bytes */
1745 		switch (voice->dataloc.source) {
1746 			case EMU_RECSRC_MIC:
1747 				idxreg = (voice->sc->sc_type & EMUXKI_AUDIGY) ?
1748 					EMU_A_MICIDX : EMU_MICIDX;
1749 				break;
1750 			case EMU_RECSRC_ADC:
1751 				idxreg = (voice->sc->sc_type & EMUXKI_AUDIGY) ?
1752 					EMU_A_ADCIDX : EMU_ADCIDX;
1753 				break;
1754 			case EMU_RECSRC_FX:
1755 				idxreg = EMU_FXIDX;
1756 				break;
1757 			default:
1758 #ifdef EMUXKI_DEBUG
1759 				printf("emu: bad recording source!\n");
1760 #endif
1761 				break;
1762 		}
1763 		return emuxki_read(voice->sc, 0, EMU_RECIDX(idxreg)
1764 				& EMU_RECIDX_MASK);
1765 	}
1766 	return 0;
1767 }
1768 
1769 static void
1770 emuxki_resched_timer(struct emuxki_softc *sc)
1771 {
1772 	struct emuxki_voice *voice;
1773 	uint16_t timerate;
1774 	uint8_t active;
1775 	int s;
1776 
1777 	timerate = 1024;
1778 	active = 0;
1779 	s = splaudio();
1780 	LIST_FOREACH(voice, &sc->voices, next) {
1781 		if ((voice->state & EMU_VOICE_STATE_STARTED) == 0)
1782 			continue;
1783 		active = 1;
1784 		if (voice->timerate < timerate)
1785 			timerate = voice->timerate;
1786 	}
1787 
1788 	if (timerate & ~EMU_TIMER_RATE_MASK)
1789 		timerate = 0;
1790 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_TIMER, timerate);
1791 	if (!active && (sc->timerstate & EMU_TIMER_STATE_ENABLED)) {
1792 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
1793 			bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) &
1794 			~EMU_INTE_INTERTIMERENB);
1795 		sc->timerstate &= ~EMU_TIMER_STATE_ENABLED;
1796 	} else if (active && !(sc->timerstate & EMU_TIMER_STATE_ENABLED)) {
1797 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
1798 			bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) |
1799 			EMU_INTE_INTERTIMERENB);
1800 		sc->timerstate |= EMU_TIMER_STATE_ENABLED;
1801 	}
1802 	splx(s);
1803 }
1804 
1805 static int
1806 emuxki_voice_adc_rate(struct emuxki_voice *voice)
1807 {
1808 
1809 	switch(voice->sample_rate) {
1810 		case 48000:
1811 			return EMU_ADCCR_SAMPLERATE_48;
1812 			break;
1813 		case 44100:
1814 			return EMU_ADCCR_SAMPLERATE_44;
1815 			break;
1816 		case 32000:
1817 			return EMU_ADCCR_SAMPLERATE_32;
1818 			break;
1819 		case 24000:
1820 			return EMU_ADCCR_SAMPLERATE_24;
1821 			break;
1822 		case 22050:
1823 			return EMU_ADCCR_SAMPLERATE_22;
1824 			break;
1825 		case 16000:
1826 			return EMU_ADCCR_SAMPLERATE_16;
1827 			break;
1828 		case 12000:
1829 			if(voice->sc->sc_type & EMUXKI_AUDIGY)
1830 				return EMU_A_ADCCR_SAMPLERATE_12;
1831 			else {
1832 #ifdef EMUXKI_DEBUG
1833 				printf("recording sample_rate not supported : %u\n", voice->sample_rate);
1834 #endif
1835 				return -1;
1836 			}
1837 			break;
1838 		case 11000:
1839 			if(voice->sc->sc_type & EMUXKI_AUDIGY)
1840 				return EMU_A_ADCCR_SAMPLERATE_11;
1841 			else
1842 				return EMU_ADCCR_SAMPLERATE_11;
1843 			break;
1844 		case 8000:
1845 			if(voice->sc->sc_type & EMUXKI_AUDIGY)
1846 				return EMU_A_ADCCR_SAMPLERATE_8;
1847 			else
1848 				return EMU_ADCCR_SAMPLERATE_8;
1849 			break;
1850 		default:
1851 #ifdef EMUXKI_DEBUG
1852 				printf("recording sample_rate not supported : %u\n", voice->sample_rate);
1853 #endif
1854 				return -1;
1855 	}
1856 	return -1;		/* shouldn't get here */
1857 }
1858 
1859 
1860 static void
1861 emuxki_voice_start(struct emuxki_voice *voice,
1862     void (*inth) (void *), void *inthparam)
1863 {
1864 	uint32_t val;
1865 
1866 	voice->inth = inth;
1867 	voice->inthparam = inthparam;
1868 	if (voice->use & EMU_VOICE_USE_PLAY) {
1869 		voice->trigblk = 1;
1870 		emuxki_channel_start(voice->dataloc.chan[0]);
1871 		if (voice->stereo)
1872 			emuxki_channel_start(voice->dataloc.chan[1]);
1873 	} else {
1874 		voice->trigblk = 1;
1875 		switch (voice->dataloc.source) {
1876 		case EMU_RECSRC_ADC:
1877 			/* XXX need to program DSP to output L+R
1878 			 * XXX in monaural case? */
1879 			if (voice->sc->sc_type & EMUXKI_AUDIGY) {
1880 				val = EMU_A_ADCCR_LCHANENABLE;
1881 				if (voice->stereo)
1882 					val |= EMU_A_ADCCR_RCHANENABLE;
1883 			} else {
1884 				val = EMU_ADCCR_LCHANENABLE;
1885 				if (voice->stereo)
1886 					val |= EMU_ADCCR_RCHANENABLE;
1887 			}
1888 			val |= emuxki_voice_adc_rate(voice);
1889 			emuxki_write(voice->sc, 0, EMU_ADCCR, 0);
1890 			emuxki_write(voice->sc, 0, EMU_ADCCR, val);
1891 			break;
1892 		case EMU_RECSRC_MIC:
1893 		case EMU_RECSRC_FX:
1894 			printf("unimplemented\n");
1895 			break;
1896 		case EMU_RECSRC_NOTSET:
1897 		default:
1898 			printf("Bad dataloc.source %d\n",
1899 			    voice->dataloc.source);
1900 			break;
1901 		}
1902 #if 0
1903 		switch (voice->dataloc.source) {
1904 		case EMU_RECSRC_ADC:
1905 		case EMU_RECSRC_FX:
1906 		case EMU_RECSRC_MIC:
1907 			/* DMA completion interrupt is useless; use timer */
1908 			int s;
1909 			s = splaudio();
1910 			val = emu_rd(sc, INTE, 4);
1911 			val |= emuxki_recsrc_intrmasks[voice->dataloc.source];
1912 			emu_wr(sc, INTE, val, 4);
1913 			splx(s);
1914 			break;
1915 		default:
1916 			break;
1917 		}
1918 #endif
1919 	}
1920 	voice->state |= EMU_VOICE_STATE_STARTED;
1921 	emuxki_resched_timer(voice->sc);
1922 }
1923 
1924 static void
1925 emuxki_voice_halt(struct emuxki_voice *voice)
1926 {
1927 
1928 	if (voice->use & EMU_VOICE_USE_PLAY) {
1929 		emuxki_channel_stop(voice->dataloc.chan[0]);
1930 		if (voice->stereo)
1931 			emuxki_channel_stop(voice->dataloc.chan[1]);
1932 	} else {
1933 		switch (voice->dataloc.source) {
1934 		case EMU_RECSRC_ADC:
1935 			emuxki_write(voice->sc, 0, EMU_ADCCR, 0);
1936 			break;
1937 		case EMU_RECSRC_FX:
1938 		case EMU_RECSRC_MIC:
1939 			printf("unimplemented\n");
1940 			break;
1941 		default:
1942 		case EMU_RECSRC_NOTSET:
1943 			printf("Bad dataloc.source %d\n",
1944 			    voice->dataloc.source);
1945 			break;
1946 		}
1947 
1948 		switch (voice->dataloc.source) {
1949 		case EMU_RECSRC_ADC:
1950 		case EMU_RECSRC_FX:
1951 		case EMU_RECSRC_MIC:
1952 			/* This should reset buffer pointer */
1953 			emuxki_write(voice->sc, 0,
1954 			    emuxki_recsrc_szreg[voice->dataloc.source],
1955 			    EMU_RECBS_BUFSIZE_NONE);
1956 #if 0
1957 			int s;
1958 			s = splaudio();
1959 			val = emu_rd(sc, INTE, 4);
1960 			val &= ~emuxki_recsrc_intrmasks[voice->dataloc.source];
1961 			emu_wr(sc, INTE, val, 4);
1962 			splx(s);
1963 #endif
1964 			break;
1965 		default:
1966 			break;
1967 		}
1968 	}
1969 	voice->state &= ~EMU_VOICE_STATE_STARTED;
1970 	emuxki_resched_timer(voice->sc);
1971 }
1972 
1973 /*
1974  * The interrupt handler
1975  */
1976 static int
1977 emuxki_intr(void *arg)
1978 {
1979 	struct emuxki_softc *sc;
1980 	struct emuxki_voice *voice;
1981 	uint32_t ipr, curblk;
1982 	int claim;
1983 
1984 	sc = arg;
1985 	claim = 0;
1986 	while ((ipr = bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_IPR))) {
1987 		if (ipr & EMU_IPR_INTERVALTIMER) {
1988 			LIST_FOREACH(voice, &sc->voices, next) {
1989 				if ((voice->state &
1990 				      EMU_VOICE_STATE_STARTED) == 0)
1991 					continue;
1992 
1993 				curblk = emuxki_voice_curaddr(voice) /
1994 				       voice->blksize;
1995 #if 0
1996 				if (curblk == voice->trigblk) {
1997 					voice->inth(voice->inthparam);
1998 					voice->trigblk++;
1999 					voice->trigblk %= voice->blkmod;
2000 				}
2001 #else
2002 				while ((curblk >= voice->trigblk &&
2003 				    curblk < (voice->trigblk + voice->blkmod / 2)) ||
2004 				    ((int)voice->trigblk - (int)curblk) >
2005 				    (voice->blkmod / 2 + 1)) {
2006 					voice->inth(voice->inthparam);
2007 					voice->trigblk++;
2008 					voice->trigblk %= voice->blkmod;
2009 				}
2010 #endif
2011 			}
2012 		}
2013 
2014 		/* Got interrupt */
2015 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_IPR, ipr);
2016 
2017 		claim = 1;
2018 	}
2019 
2020 	return claim;
2021 }
2022 
2023 
2024 /*
2025  * Audio Architecture callbacks
2026  */
2027 
2028 static int
2029 emuxki_open(void *addr, int flags)
2030 {
2031 	struct emuxki_softc *sc;
2032 
2033 	sc = addr;
2034 #ifdef EMUXKI_DEBUG
2035 	printf("%s: emuxki_open called\n", sc->sc_dev.dv_xname);
2036 #endif
2037 
2038 	/*
2039 	 * Multiple voice support would be added as soon as I find a way to
2040 	 * trick the audio arch into supporting multiple voices.
2041 	 * Or I might integrate a modified audio arch supporting
2042 	 * multiple voices.
2043 	 */
2044 
2045 	/*
2046 	 * I did this because i have problems identifying the selected
2047 	 * recording source(s) which is necessary when setting recording
2048 	 * params This will be addressed very soon
2049 	 */
2050 	if (flags & AUOPEN_READ) {
2051 		sc->rvoice = emuxki_voice_new(sc, 0 /* EMU_VOICE_USE_RECORD */);
2052 		if (sc->rvoice == NULL)
2053 			return EBUSY;
2054 
2055 		/* XXX Hardcode RECSRC_ADC for now */
2056 		sc->rvoice->dataloc.source = EMU_RECSRC_ADC;
2057 	}
2058 
2059 	if (flags & AUOPEN_WRITE) {
2060 		sc->pvoice = emuxki_voice_new(sc, EMU_VOICE_USE_PLAY);
2061 		if (sc->pvoice == NULL) {
2062 			if (sc->rvoice) {
2063 				emuxki_voice_delete(sc->rvoice);
2064 				sc->rvoice = NULL;
2065 			}
2066 			return EBUSY;
2067 		}
2068 	}
2069 
2070 	return 0;
2071 }
2072 
2073 static void
2074 emuxki_close(void *addr)
2075 {
2076 	struct emuxki_softc *sc;
2077 
2078 	sc = addr;
2079 #ifdef EMUXKI_DEBUG
2080 	printf("%s: emu10K1_close called\n", sc->sc_dev.dv_xname);
2081 #endif
2082 
2083 	/* No multiple voice support for now */
2084 	if (sc->rvoice != NULL) {
2085 		emuxki_voice_delete(sc->rvoice);
2086 		sc->rvoice = NULL;
2087 	}
2088 	if (sc->pvoice != NULL) {
2089 		emuxki_voice_delete(sc->pvoice);
2090 		sc->pvoice = NULL;
2091 	}
2092 }
2093 
2094 static int
2095 emuxki_query_encoding(void *addr, struct audio_encoding *fp)
2096 {
2097 #ifdef EMUXKI_DEBUG
2098 	struct emuxki_softc *sc;
2099 
2100 	sc = addr;
2101 	printf("%s: emuxki_query_encoding called\n", sc->sc_dev.dv_xname);
2102 #endif
2103 
2104 	switch (fp->index) {
2105 	case 0:
2106 		strcpy(fp->name, AudioEulinear);
2107 		fp->encoding = AUDIO_ENCODING_ULINEAR;
2108 		fp->precision = 8;
2109 		fp->flags = 0;
2110 		break;
2111 	case 1:
2112 		strcpy(fp->name, AudioEmulaw);
2113 		fp->encoding = AUDIO_ENCODING_ULAW;
2114 		fp->precision = 8;
2115 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
2116 		break;
2117 	case 2:
2118 		strcpy(fp->name, AudioEalaw);
2119 		fp->encoding = AUDIO_ENCODING_ALAW;
2120 		fp->precision = 8;
2121 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
2122 		break;
2123 	case 3:
2124 		strcpy(fp->name, AudioEslinear);
2125 		fp->encoding = AUDIO_ENCODING_SLINEAR;
2126 		fp->precision = 8;
2127 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
2128 		break;
2129 	case 4:
2130 		strcpy(fp->name, AudioEslinear_le);
2131 		fp->encoding = AUDIO_ENCODING_SLINEAR_LE;
2132 		fp->precision = 16;
2133 		fp->flags = 0;
2134 		break;
2135 	case 5:
2136 		strcpy(fp->name, AudioEulinear_le);
2137 		fp->encoding = AUDIO_ENCODING_ULINEAR_LE;
2138 		fp->precision = 16;
2139 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
2140 		break;
2141 	case 6:
2142 		strcpy(fp->name, AudioEslinear_be);
2143 		fp->encoding = AUDIO_ENCODING_SLINEAR_BE;
2144 		fp->precision = 16;
2145 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
2146 		break;
2147 	case 7:
2148 		strcpy(fp->name, AudioEulinear_be);
2149 		fp->encoding = AUDIO_ENCODING_ULINEAR_BE;
2150 		fp->precision = 16;
2151 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
2152 		break;
2153 	default:
2154 		return EINVAL;
2155 	}
2156 	return 0;
2157 }
2158 
2159 static int
2160 emuxki_set_vparms(struct emuxki_voice *voice, const audio_params_t *p,
2161     stream_filter_list_t *fil)
2162 {
2163 	int mode, i;
2164 
2165 	mode = (voice->use & EMU_VOICE_USE_PLAY) ?
2166 		AUMODE_PLAY : AUMODE_RECORD;
2167 	i = auconv_set_converter(emuxki_formats, EMUXKI_NFORMATS,
2168 				 mode, p, FALSE, fil);
2169 	if (i < 0)
2170 		return EINVAL;
2171 	if (fil->req_size > 0)
2172 		p = &fil->filters[0].param;
2173 	return emuxki_voice_set_audioparms
2174 	    (voice, p->channels == 2, p->precision == 16, p->sample_rate);
2175 }
2176 
2177 static int
2178 emuxki_set_params(void *addr, int setmode, int usemode, audio_params_t *play,
2179     audio_params_t *rec, stream_filter_list_t *pfil, stream_filter_list_t *rfil)
2180 {
2181 	struct emuxki_softc *sc;
2182 	struct audio_params *p;
2183 	struct emuxki_voice *v;
2184 	stream_filter_list_t *fil;
2185 	int mode, error;
2186 
2187 	sc = addr;
2188 	for (mode = AUMODE_RECORD; mode != -1;
2189 	     mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) {
2190 		if ((usemode & setmode & mode) == 0)
2191 			continue;
2192 
2193 		if (mode == AUMODE_PLAY) {
2194 			p = play;
2195 			fil = pfil;
2196 			v = sc->pvoice;
2197 		} else {
2198 			p = rec;
2199 			fil = rfil;
2200 			v = sc->rvoice;
2201 		}
2202 
2203 		if (v == NULL) {
2204 			continue;
2205 		}
2206 
2207 		/* No multiple voice support for now */
2208 		if ((error = emuxki_set_vparms(v, p, fil)))
2209 			return error;
2210 	}
2211 
2212 	return 0;
2213 }
2214 
2215 static int
2216 emuxki_halt_output(void *addr)
2217 {
2218 	struct emuxki_softc *sc;
2219 
2220 	sc = addr;
2221 	/* No multiple voice support for now */
2222 	if (sc->pvoice == NULL)
2223 		return ENXIO;
2224 
2225 	emuxki_voice_halt(sc->pvoice);
2226 	return 0;
2227 }
2228 
2229 static int
2230 emuxki_halt_input(void *addr)
2231 {
2232 	struct emuxki_softc *sc;
2233 
2234 	sc = addr;
2235 #ifdef EMUXKI_DEBUG
2236 	printf("%s: emuxki_halt_input called\n", sc->sc_dev.dv_xname);
2237 #endif
2238 
2239 	/* No multiple voice support for now */
2240 	if (sc->rvoice == NULL)
2241 		return ENXIO;
2242 	emuxki_voice_halt(sc->rvoice);
2243 	return 0;
2244 }
2245 
2246 static int
2247 emuxki_getdev(void *addr, struct audio_device *dev)
2248 {
2249 	struct emuxki_softc *sc;
2250 
2251 	sc = addr;
2252 	*dev = sc->sc_audv;
2253 	return 0;
2254 }
2255 
2256 static int
2257 emuxki_set_port(void *addr, mixer_ctrl_t *mctl)
2258 {
2259 	struct emuxki_softc *sc;
2260 
2261 	sc = addr;
2262 	return sc->codecif->vtbl->mixer_set_port(sc->codecif, mctl);
2263 }
2264 
2265 static int
2266 emuxki_get_port(void *addr, mixer_ctrl_t *mctl)
2267 {
2268 	struct emuxki_softc *sc;
2269 
2270 	sc = addr;
2271 	return sc->codecif->vtbl->mixer_get_port(sc->codecif, mctl);
2272 }
2273 
2274 static int
2275 emuxki_query_devinfo(void *addr, mixer_devinfo_t *minfo)
2276 {
2277 	struct emuxki_softc *sc;
2278 
2279 	sc = addr;
2280 	return sc->codecif->vtbl->query_devinfo(sc->codecif, minfo);
2281 }
2282 
2283 static void *
2284 emuxki_allocm(void *addr, int direction, size_t size,
2285     struct malloc_type *type, int flags)
2286 {
2287 	if (direction == AUMODE_PLAY)
2288 		return emuxki_pmem_alloc(addr, size, type, flags);
2289 	else
2290 		return emuxki_rmem_alloc(addr, size, type, flags);
2291 }
2292 
2293 static void
2294 emuxki_freem(void *addr, void *ptr, struct malloc_type *type)
2295 {
2296 	struct emuxki_softc *sc;
2297 	struct emuxki_mem *mem;
2298 	uint32_t *ptb, silentpage;
2299 	size_t numblocks;
2300 	int i, s;
2301 
2302 	sc = addr;
2303 	ptb = KERNADDR(sc->ptb);
2304 	silentpage = DMAADDR(sc->silentpage) << 1;
2305 	LIST_FOREACH(mem, &sc->mem, next) {
2306 		if (KERNADDR(mem->dmamem) != ptr)
2307 			continue;
2308 
2309 		s = splaudio();
2310 		if (mem->ptbidx != EMU_RMEM) {
2311 			numblocks = DMASIZE(mem->dmamem) / EMU_PTESIZE;
2312 			if (DMASIZE(mem->dmamem) % EMU_PTESIZE)
2313 				numblocks++;
2314 			for (i = 0; i < numblocks; i++)
2315 				ptb[mem->ptbidx + i] =
2316 				    htole32(silentpage | (mem->ptbidx + i));
2317 		}
2318 		LIST_REMOVE(mem, next);
2319 		splx(s);
2320 
2321 		emuxki_mem_delete(mem, type);
2322 		break;
2323 	}
2324 }
2325 
2326 /* blocksize should be a divisor of allowable buffersize */
2327 /* XXX probably this could be done better */
2328 static int
2329 emuxki_round_blocksize(void *addr, int blksize,
2330     int mode, const audio_params_t* param)
2331 {
2332 #if 0
2333 	struct emuxki_softc *sc;
2334 	struct audio_softc *au;
2335 #endif
2336 	int bufsize;
2337 #if 0
2338 	sc = addr;
2339 	if (sc == NULL)
2340 		return blksize;
2341 
2342 	au = (void *)sc->sc_audev;
2343 	if (au == NULL)
2344 		return blksize;
2345 
2346 	bufsize = emuxki_round_buffersize(sc, AUMODE_RECORD,
2347 	    au->sc_rr.bufsize);
2348 #else
2349 	bufsize = 65536;
2350 #endif
2351 
2352 	while (bufsize > blksize)
2353 		bufsize /= 2;
2354 
2355 	return bufsize;
2356 }
2357 
2358 static size_t
2359 emuxki_round_buffersize(void *addr, int direction, size_t bsize)
2360 {
2361 
2362 	if (direction == AUMODE_PLAY) {
2363 		if (bsize < EMU_PTESIZE)
2364 			bsize = EMU_PTESIZE;
2365 		else if (bsize > (EMU_PTESIZE * EMU_MAXPTE))
2366 			bsize = EMU_PTESIZE * EMU_MAXPTE;
2367 		/* Would be better if set to max available */
2368 		else if (bsize % EMU_PTESIZE)
2369 			bsize = bsize -
2370 				(bsize % EMU_PTESIZE) +
2371 				EMU_PTESIZE;
2372 	} else {
2373 		int idx;
2374 
2375 		/* find nearest lower recbuf size */
2376 		for(idx = sizeof(emuxki_recbuf_sz) /
2377 		    sizeof(emuxki_recbuf_sz[0]); --idx >= 0; ) {
2378 			if (bsize >= emuxki_recbuf_sz[idx]) {
2379 				bsize = emuxki_recbuf_sz[idx];
2380 				break;
2381 			}
2382 		}
2383 
2384 		if (bsize == 0)
2385 			bsize = 384;
2386 	}
2387 
2388 	return bsize;
2389 }
2390 
2391 static paddr_t
2392 emuxki_mappage(void *addr, void *ptr, off_t off, int prot)
2393 {
2394 	struct emuxki_softc *sc;
2395 	struct emuxki_mem *mem;
2396 
2397 	sc = addr;
2398 	LIST_FOREACH(mem, &sc->mem, next) {
2399 		if (KERNADDR(mem->dmamem) == ptr) {
2400 			struct dmamem *dm = mem->dmamem;
2401 
2402 			return bus_dmamem_mmap(dm->dmat, dm->segs, dm->nsegs,
2403 			       off, prot, BUS_DMA_WAITOK);
2404 		}
2405 	}
2406 
2407 	return -1;
2408 }
2409 
2410 static int
2411 emuxki_get_props(void *addr)
2412 {
2413 	return AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT |
2414 	    AUDIO_PROP_FULLDUPLEX;
2415 }
2416 
2417 static int
2418 emuxki_trigger_output(void *addr, void *start, void *end, int blksize,
2419     void (*inth) (void *), void *inthparam, const audio_params_t *params)
2420 {
2421 	struct emuxki_softc *sc;
2422 	/* No multiple voice support for now */
2423 	struct emuxki_voice *voice;
2424 	int error;
2425 
2426 	sc = addr;
2427 	voice = sc->pvoice;
2428 	if (voice == NULL)
2429 		return ENXIO;
2430 	if ((error = emuxki_voice_set_audioparms(voice, params->channels == 2,
2431 	    params->precision == 16, params->sample_rate)))
2432 		return error;
2433 	if ((error = emuxki_voice_set_bufparms(voice, start,
2434 	    (caddr_t)end - (caddr_t)start, blksize)))
2435 		return error;
2436 	emuxki_voice_commit_parms(voice);
2437 	emuxki_voice_start(voice, inth, inthparam);
2438 
2439 	return 0;
2440 }
2441 
2442 static int
2443 emuxki_trigger_input(void *addr, void *start, void *end, int blksize,
2444     void (*inth) (void *), void *inthparam, const audio_params_t *params)
2445 {
2446 	struct emuxki_softc *sc;
2447 	/* No multiple voice support for now */
2448 	struct emuxki_voice *voice;
2449 	int	error;
2450 
2451 	sc = addr;
2452 	voice = sc->rvoice;
2453 	if (voice == NULL)
2454 		return ENXIO;
2455 	if ((error = emuxki_voice_set_audioparms(voice, params->channels == 2,
2456 	    params->precision == 16, params->sample_rate)))
2457 		return error;
2458 	if ((error = emuxki_voice_set_bufparms(voice, start,
2459 	    (caddr_t)end - (caddr_t)start, blksize)))
2460 		return error;
2461 	emuxki_voice_start(voice, inth, inthparam);
2462 
2463 	return 0;
2464 }
2465 
2466 /*
2467  * AC97 callbacks
2468  */
2469 
2470 static int
2471 emuxki_ac97_attach(void *arg, struct ac97_codec_if *codecif)
2472 {
2473 	struct emuxki_softc *sc;
2474 
2475 	sc = arg;
2476 	sc->codecif = codecif;
2477 	return 0;
2478 }
2479 
2480 static int
2481 emuxki_ac97_read(void *arg, uint8_t reg, uint16_t *val)
2482 {
2483 	struct emuxki_softc *sc;
2484 	int s;
2485 
2486 	sc = arg;
2487 	s = splaudio();
2488 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg);
2489 	*val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA);
2490 	splx(s);
2491 
2492 	return 0;
2493 }
2494 
2495 static int
2496 emuxki_ac97_write(void *arg, uint8_t reg, uint16_t val)
2497 {
2498 	struct emuxki_softc *sc;
2499 	int s;
2500 
2501 	sc = arg;
2502 	s = splaudio();
2503 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg);
2504 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA, val);
2505 	splx(s);
2506 
2507 	return 0;
2508 }
2509 
2510 static int
2511 emuxki_ac97_reset(void *arg)
2512 {
2513 
2514 	return 0;
2515 }
2516 
2517 enum ac97_host_flags
2518 emuxki_ac97_flags(void *arg)
2519 {
2520 
2521 	return AC97_HOST_SWAPPED_CHANNELS;
2522 }
2523