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