xref: /netbsd-src/sys/dev/pci/emuxki.c (revision 220b5c059a84c51ea44107ea8951a57ffaecdc8c)
1 /*	$NetBSD: emuxki.c,v 1.5 2001/11/15 09:48:11 lukem 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 disapear 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  * - Single source recording
53  * - Multiple voices play (problem with /dev/audio architecture)
54  * - Multiple sources recording (Pb with audio(4))
55  * - Independant modification of each channel's parameters (via mixer ?)
56  * - DSP FX patches (to make fx like chipmunk)
57  */
58 
59 #include <sys/cdefs.h>
60 __KERNEL_RCSID(0, "$NetBSD: emuxki.c,v 1.5 2001/11/15 09:48:11 lukem Exp $");
61 
62 #include <sys/param.h>
63 #include <sys/device.h>
64 #include <sys/errno.h>
65 #include <sys/malloc.h>
66 #include <sys/systm.h>
67 #include <sys/audioio.h>
68 #include <sys/select.h>
69 #include <dev/pci/pcireg.h>
70 #include <dev/pci/pcivar.h>
71 #include <dev/pci/pcidevs.h>
72 #include <dev/audio_if.h>
73 #include <dev/audiovar.h>
74 #include <dev/auconv.h>
75 #include <dev/mulaw.h>
76 #include <dev/ic/ac97reg.h>
77 #include <dev/ic/ac97var.h>
78 
79 #include <dev/pci/emuxkireg.h>
80 #include <dev/pci/emuxkivar.h>
81 
82 /* autconf goo */
83 static int  emuxki_match(struct device *, struct cfdata *, void *);
84 static void emuxki_attach(struct device *, struct device *, void *);
85 static int  emuxki_detach(struct device *, int);
86 
87 /* dma mem mgmt */
88 static struct dmamem *dmamem_alloc(bus_dma_tag_t, size_t, bus_size_t,
89 				 int, int, int);
90 static void           dmamem_free(struct dmamem *, int);
91 
92 /* Emu10k1 init & shutdown */
93 static int  emuxki_init(struct emuxki_softc *);
94 static void emuxki_shutdown(struct emuxki_softc *);
95 
96 /* Emu10k1 mem mgmt */
97 static void   *emuxki_pmem_alloc(struct emuxki_softc *, size_t,int,int);
98 static void   *emuxki_rmem_alloc(struct emuxki_softc *, size_t,int,int);
99 
100 /*
101  * Emu10k1 channels funcs : There is no direct access to channels, everything
102  * is done through voices I will at least provide channel based fx params
103  * modification, later...
104  */
105 
106 /* Emu10k1 voice mgmt */
107 static struct emuxki_voice *emuxki_voice_new(struct emuxki_softc *,
108 					u_int8_t);
109 static void   emuxki_voice_delete(struct emuxki_voice *);
110 static int    emuxki_voice_set_audioparms(struct emuxki_voice *, u_int8_t,
111 					 u_int8_t, u_int32_t);
112 /* emuxki_voice_set_fxparms will come later, it'll need channel distinction */
113 static int emuxki_voice_set_bufparms(struct emuxki_voice *,
114 				      void *, u_int32_t, u_int16_t);
115 static void emuxki_voice_commit_parms(struct emuxki_voice *);
116 static u_int32_t emuxki_voice_curaddr(struct emuxki_voice *);
117 static void emuxki_voice_start(struct emuxki_voice *,
118 				      void (*) (void *), void *);
119 static void emuxki_voice_halt(struct emuxki_voice *);
120 
121 /*
122  * Emu10k1 stream mgmt : not done yet
123  */
124 #if 0
125 static struct emuxki_stream *emuxki_stream_new(struct emu10k1 *);
126 static void   emuxki_stream_delete(struct emuxki_stream *);
127 static int    emuxki_stream_set_audio_params(struct emuxki_stream *, u_int8_t,
128 					    u_int8_t, u_int8_t, u_int16_t);
129 static void   emuxki_stream_start(struct emuxki_stream *);
130 static void   emuxki_stream_halt(struct emuxki_stream *);
131 #endif
132 
133 /* audio interface callbacks */
134 
135 static int	emuxki_open(void *, int);
136 static void	emuxki_close(void *);
137 
138 static int	emuxki_query_encoding(void *, struct audio_encoding *);
139 static int	emuxki_set_params(void *, int, int,
140 				      struct audio_params *,
141 				      struct audio_params *);
142 
143 static size_t	emuxki_round_buffersize(void *, int, size_t);
144 
145 static int	emuxki_trigger_output(void *, void *, void *, int,
146 				      void (*)(void *), void *,
147 				      struct audio_params *);
148 static int	emuxki_trigger_input(void *, void *, void *, int,
149 				      void (*) (void *), void *,
150 				      struct audio_params *);
151 static int	emuxki_halt_output(void *);
152 static int	emuxki_halt_input(void *);
153 
154 static int	emuxki_getdev(void *, struct audio_device *);
155 static int	emuxki_set_port(void *, mixer_ctrl_t *);
156 static int	emuxki_get_port(void *, mixer_ctrl_t *);
157 static int	emuxki_query_devinfo(void *, mixer_devinfo_t *);
158 
159 static void   *emuxki_allocm(void *, int, size_t, int, int);
160 static void	emuxki_freem(void *, void *, int);
161 
162 static paddr_t	emuxki_mappage(void *, void *, off_t, int);
163 static int	emuxki_get_props(void *);
164 
165 /* Interrupt handler */
166 static int  emuxki_intr(void *);
167 
168 /* Emu10k1 AC97 interface callbacks */
169 static int  emuxki_ac97_attach(void *, struct ac97_codec_if *);
170 static int  emuxki_ac97_read(void *, u_int8_t, u_int16_t *);
171 static int  emuxki_ac97_write(void *, u_int8_t, u_int16_t);
172 static void emuxki_ac97_reset(void *);
173 
174 /*
175  * Autoconfig goo.
176  */
177 struct cfattach emuxki_ca = {
178         sizeof(struct emuxki_softc),
179         emuxki_match,
180         emuxki_attach,
181 	emuxki_detach,
182 	NULL		  /* config activate */
183 };
184 
185 static struct audio_hw_if emuxki_hw_if = {
186 	emuxki_open,
187 	emuxki_close,
188 	NULL,			/* drain */
189 	emuxki_query_encoding,
190 	emuxki_set_params,
191 	NULL,			/* round blocksize */
192 	NULL,			/* commit settings */
193 	NULL,			/* init_output */
194 	NULL,			/* init_input */
195 	NULL,			/* start_output */
196 	NULL,			/* start_input */
197 	emuxki_halt_output,
198 	emuxki_halt_input,
199 	NULL,			/* speaker_ctl */
200 	emuxki_getdev,
201 	NULL,			/* setfd */
202 	emuxki_set_port,
203 	emuxki_get_port,
204 	emuxki_query_devinfo,
205 	emuxki_allocm,
206 	emuxki_freem,
207 	emuxki_round_buffersize,
208 	emuxki_mappage,
209 	emuxki_get_props,
210 	emuxki_trigger_output,
211 	emuxki_trigger_input,
212 	NULL,			/* dev_ioctl */
213 };
214 
215 /*
216  * Dma memory mgmt
217  */
218 
219 static void
220 dmamem_delete(struct dmamem *mem, int type)
221 {
222 	free(mem->segs, type);
223 	free(mem, type);
224 }
225 
226 static struct dmamem *
227 dmamem_alloc(bus_dma_tag_t dmat, size_t size, bus_size_t align,
228 	     int nsegs, int type, int flags)
229 {
230 	struct dmamem	*mem;
231 	int		bus_dma_flags;
232 
233 	/* Allocate memory for structure */
234 	if ((mem = malloc(sizeof(*mem), type, flags)) == NULL)
235 		return (NULL);
236 	mem->dmat = dmat;
237 	mem->size = size;
238 	mem->align = align;
239 	mem->nsegs = nsegs;
240 	mem->bound = 0;
241 
242 	mem->segs = malloc(mem->nsegs * sizeof(*(mem->segs)), type, flags);
243 	if (mem->segs == NULL) {
244 		free(mem, type);
245 		return (NULL);
246 	}
247 
248 	bus_dma_flags = (flags & M_NOWAIT) ? BUS_DMA_NOWAIT : BUS_DMA_WAITOK;
249 	if (bus_dmamem_alloc(dmat, mem->size, mem->align, mem->bound,
250 			     mem->segs, mem->nsegs, &(mem->rsegs),
251 			     bus_dma_flags)) {
252 		dmamem_delete(mem, type);
253 		return (NULL);
254 	}
255 
256 	if (bus_dmamem_map(dmat, mem->segs, mem->nsegs, mem->size,
257 			   &(mem->kaddr), bus_dma_flags | BUS_DMA_COHERENT)) {
258 		bus_dmamem_free(dmat, mem->segs, mem->nsegs);
259 		dmamem_delete(mem, type);
260 		return (NULL);
261 	}
262 
263 	if (bus_dmamap_create(dmat, mem->size, mem->nsegs, mem->size,
264 			      mem->bound, bus_dma_flags, &(mem->map))) {
265 		bus_dmamem_unmap(dmat, mem->kaddr, mem->size);
266 		bus_dmamem_free(dmat, mem->segs, mem->nsegs);
267 		dmamem_delete(mem, type);
268 		return (NULL);
269 	}
270 
271 	if (bus_dmamap_load(dmat, mem->map, mem->kaddr,
272 			    mem->size, NULL, bus_dma_flags)) {
273 		bus_dmamap_destroy(dmat, mem->map);
274 		bus_dmamem_unmap(dmat, mem->kaddr, mem->size);
275 		bus_dmamem_free(dmat, mem->segs, mem->nsegs);
276 		dmamem_delete(mem, type);
277 		return (NULL);
278 	}
279 
280 	return (mem);
281 }
282 
283 static void
284 dmamem_free(struct dmamem *mem, int type)
285 {
286 	bus_dmamap_unload(mem->dmat, mem->map);
287 	bus_dmamap_destroy(mem->dmat, mem->map);
288 	bus_dmamem_unmap(mem->dmat, mem->kaddr, mem->size);
289 	bus_dmamem_free(mem->dmat, mem->segs, mem->nsegs);
290 	dmamem_delete(mem, type);
291 }
292 
293 
294 /*
295  * Autoconf device callbacks : attach and detach
296  */
297 
298 static void
299 emuxki_pci_shutdown(struct emuxki_softc *sc)
300 {
301 	if (sc->sc_ih != NULL)
302 		pci_intr_disestablish(sc->sc_pc, sc->sc_ih);
303 	if (sc->sc_ios)
304 		bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
305 }
306 
307 static int
308 emuxki_scinit(struct emuxki_softc *sc)
309 {
310 	int             err;
311 
312 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
313 		EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK |
314 		EMU_HCFG_MUTEBUTTONENABLE);
315 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
316 		EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE);
317 
318 	if ((err = emuxki_init(sc)))
319 		return (err);
320 
321 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
322 		EMU_HCFG_AUDIOENABLE |
323 		EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_AUTOMUTE);
324 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
325 		bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) |
326 		EMU_INTE_VOLINCRENABLE | EMU_INTE_VOLDECRENABLE |
327 		EMU_INTE_MUTEENABLE);
328 
329 	/* No multiple voice support for now */
330 	sc->pvoice = sc->rvoice = NULL;
331 
332 	return (0);
333 }
334 
335 static int
336 emuxki_ac97_init(struct emuxki_softc *sc)
337 {
338 	sc->hostif.arg = sc;
339 	sc->hostif.attach = emuxki_ac97_attach;
340 	sc->hostif.read = emuxki_ac97_read;
341 	sc->hostif.write = emuxki_ac97_write;
342 	sc->hostif.reset = emuxki_ac97_reset;
343 	sc->hostif.flags = NULL;
344 	return (ac97_attach(&(sc->hostif)));
345 }
346 
347 static int
348 emuxki_match(struct device *parent, struct cfdata *match, void *aux)
349 {
350 	struct pci_attach_args *pa = aux;
351 
352 	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_CREATIVELABS &&
353 	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CREATIVELABS_SBLIVE)
354 		return (1);
355 
356 	return (0);
357 }
358 
359 static void
360 emuxki_attach(struct device *parent, struct device *self, void *aux)
361 {
362 	struct emuxki_softc *sc = (struct emuxki_softc *) self;
363 	struct pci_attach_args *pa = aux;
364 	char            devinfo[256];
365 	pci_intr_handle_t ih;
366 	const char     *intrstr;
367 
368 	if (pci_mapreg_map(pa, EMU_PCI_CBIO, PCI_MAPREG_TYPE_IO, 0,
369 	    &(sc->sc_iot), &(sc->sc_ioh), &(sc->sc_iob),
370 			   &(sc->sc_ios))) {
371 		printf(": can't map iospace\n");
372 		return;
373 	}
374 	pci_devinfo(pa->pa_id, pa->pa_class, 1, devinfo);
375 	printf(": %s\n", devinfo);
376 
377 	sc->sc_pc   = pa->pa_pc;
378 	sc->sc_dmat = pa->pa_dmat;
379 	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
380 		pci_conf_read(pa->pa_pc, pa->pa_tag,
381 		(PCI_COMMAND_STATUS_REG) | PCI_COMMAND_MASTER_ENABLE));
382 
383 	if (pci_intr_map(pa, &ih)) {
384 		printf("%s: couldn't map interrupt\n",
385 			sc->sc_dev.dv_xname);
386 		bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
387 		return;
388 	}
389 
390 	intrstr = pci_intr_string(pa->pa_pc, ih);
391 	sc->sc_ih = pci_intr_establish(pa->pa_pc, ih, IPL_AUDIO, emuxki_intr,
392 		sc);
393 	if (sc->sc_ih == NULL) {
394 		printf("%s: couldn't establish interrupt", sc->sc_dev.dv_xname);
395 		if (intrstr != NULL)
396 			printf(" at %s", intrstr);
397 		printf("\n");
398 		bus_space_unmap(sc->sc_iot, sc->sc_ioh, sc->sc_ios);
399 		return;
400 	}
401 	printf("%s: interrupting at %s\n", sc->sc_dev.dv_xname, intrstr);
402 
403 	if (emuxki_scinit(sc) || emuxki_ac97_init(sc) ||
404 	    (sc->sc_audev = audio_attach_mi(&emuxki_hw_if, sc, self)) == NULL)
405 		emuxki_pci_shutdown(sc);
406 }
407 
408 static int
409 emuxki_detach(struct device *self, int flags)
410 {
411 	struct emuxki_softc *sc = (struct emuxki_softc *) self;
412 	int             err = 0;
413 
414         if (sc->sc_audev != NULL) /* Test in case audio didn't attach */
415 	        err = config_detach(sc->sc_audev, 0);
416 
417 	/* All voices should be stopped now but add some code here if not */
418 
419 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_HCFG,
420 		EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK |
421 		EMU_HCFG_MUTEBUTTONENABLE);
422 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE, 0);
423 
424 	emuxki_shutdown(sc);
425 
426 	emuxki_pci_shutdown(sc);
427 
428 	return (0);
429 }
430 
431 
432 /* Misc stuff relative to emu10k1 */
433 
434 static u_int32_t
435 emuxki_rate_to_pitch(u_int32_t rate)
436 {
437 	static const u_int32_t logMagTable[128] = {
438 		0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3,
439 		0x13aa2, 0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a,
440 		0x2655d, 0x28ed5, 0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb,
441 		0x381b6, 0x3a93d, 0x3d081, 0x3f782, 0x41e42, 0x444c1, 0x46b01,
442 		0x49101, 0x4b6c4, 0x4dc49, 0x50191, 0x5269e, 0x54b6f, 0x57006,
443 		0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7, 0x646ee, 0x66a00,
444 		0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829, 0x759d4,
445 		0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
446 		0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20,
447 		0x93d26, 0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec,
448 		0xa11d8, 0xa2f9d, 0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241,
449 		0xadf26, 0xafbe7, 0xb1885, 0xb3500, 0xb5157, 0xb6d8c, 0xb899f,
450 		0xba58f, 0xbc15e, 0xbdd0c, 0xbf899, 0xc1404, 0xc2f50, 0xc4a7b,
451 		0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c, 0xceaec, 0xd053f,
452 		0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3, 0xdba4a,
453 		0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
454 		0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a,
455 		0xf2c83, 0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57,
456 		0xfd1a7, 0xfe8df
457 	};
458 	static const u_int8_t logSlopeTable[128] = {
459 		0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
460 		0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
461 		0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
462 		0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
463 		0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
464 		0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
465 		0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
466 		0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
467 		0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
468 		0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
469 		0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
470 		0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
471 		0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
472 		0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
473 		0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
474 		0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
475 	};
476 	int8_t          i;
477 
478 	if (rate == 0)
479 		return 0;	/* Bail out if no leading "1" */
480 	rate *= 11185;		/* Scale 48000 to 0x20002380 */
481 	for (i = 31; i > 0; i--) {
482 		if (rate & 0x80000000) {	/* Detect leading "1" */
483 			return (((u_int32_t) (i - 15) << 20) +
484 				logMagTable[0x7f & (rate >> 24)] +
485 				(0x7f & (rate >> 17)) *
486 				logSlopeTable[0x7f & (rate >> 24)]);
487 		}
488 		rate <<= 1;
489 	}
490 
491 	return 0;		/* Should never reach this point */
492 }
493 
494 /* Emu10k1 Low level */
495 
496 static u_int32_t
497 emuxki_read(struct emuxki_softc *sc, u_int16_t chano, u_int32_t reg)
498 {
499 	u_int32_t       ptr, mask = 0xffffffff;
500 	u_int8_t        size, offset = 0;
501 	int             s;
502 
503 	ptr = ((((u_int32_t) reg) << 16) & EMU_PTR_ADDR_MASK) |
504 		(chano & EMU_PTR_CHNO_MASK);
505 	if (reg & 0xff000000) {
506 		size = (reg >> 24) & 0x3f;
507 		offset = (reg >> 16) & 0x1f;
508 		mask = ((1 << size) - 1) << offset;
509 	}
510 
511 	s = splaudio();
512 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr);
513 	ptr = (bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_DATA) & mask)
514 		>> offset;
515 	splx(s);
516 
517 	return (ptr);
518 }
519 
520 static void
521 emuxki_write(struct emuxki_softc *sc, u_int16_t chano,
522 	      u_int32_t reg, u_int32_t data)
523 {
524 	u_int32_t       ptr, mask;
525 	u_int8_t        size, offset;
526 	int             s;
527 
528 	ptr = ((((u_int32_t) reg) << 16) & EMU_PTR_ADDR_MASK) |
529 		(chano & EMU_PTR_CHNO_MASK);
530 	if (reg & 0xff000000) {
531 		size = (reg >> 24) & 0x3f;
532 		offset = (reg >> 16) & 0x1f;
533 		mask = ((1 << size) - 1) << offset;
534 		data = ((data << offset) & mask) |
535 			(emuxki_read(sc, chano, reg & 0xffff) & ~mask);
536 	}
537 
538 	s = splaudio();
539 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_PTR, ptr);
540 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_DATA, data);
541 	splx(s);
542 }
543 
544 /* Microcode should this go in /sys/dev/microcode ? */
545 
546 static void
547 emuxki_write_micro(struct emuxki_softc *sc, u_int32_t pc, u_int32_t data)
548 {
549 	emuxki_write(sc, 0, EMU_MICROCODEBASE + pc, data);
550 }
551 
552 static void
553 emuxki_dsp_addop(struct emuxki_softc *sc, u_int16_t *pc, u_int8_t op,
554 		  u_int16_t r, u_int16_t a, u_int16_t x, u_int16_t y)
555 {
556 	emuxki_write_micro(sc, *pc << 1,
557 		((x << 10) & EMU_DSP_LOWORD_OPX_MASK) |
558 		(y & EMU_DSP_LOWORD_OPY_MASK));
559 	emuxki_write_micro(sc, (*pc << 1) + 1,
560 		((op << 20) & EMU_DSP_HIWORD_OPCODE_MASK) |
561 		((r << 10) & EMU_DSP_HIWORD_RESULT_MASK) |
562 		(a & EMU_DSP_HIWORD_OPA_MASK));
563 	(*pc)++;
564 }
565 
566 /* init and shutdown */
567 
568 static void
569 emuxki_initfx(struct emuxki_softc *sc)
570 {
571 	u_int16_t       pc;
572 
573 	/* Set all GPRs to 0 */
574 	for (pc = 0; pc < 256; pc++)
575 		emuxki_write(sc, 0, EMU_DSP_GPR(pc), 0);
576 	for (pc = 0; pc < 160; pc++) {
577 		emuxki_write(sc, 0, EMU_TANKMEMDATAREGBASE + pc, 0);
578 		emuxki_write(sc, 0, EMU_TANKMEMADDRREGBASE + pc, 0);
579 	}
580 	pc = 0;
581 	/* AC97 Out (l/r) = AC97 In (l/r) + FX[0/1] * 4 */
582 	emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
583 			  EMU_DSP_OUTL(EMU_DSP_OUT_AC97),
584 			  EMU_DSP_CST(0),
585 			  EMU_DSP_FX(0), EMU_DSP_CST(4));
586 	emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
587 			  EMU_DSP_OUTR(EMU_DSP_OUT_AC97),
588 			  EMU_DSP_CST(0),
589 			  EMU_DSP_FX(1), EMU_DSP_CST(4));
590 
591 	/* Rear channel OUT (l/r) = FX[2/3] * 4 */
592 #if 0
593 	emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
594 			  EMU_DSP_OUTL(EMU_DSP_OUT_RCHAN),
595 			  EMU_DSP_OUTL(EMU_DSP_OUT_AC97),
596 			  EMU_DSP_FX(0), EMU_DSP_CST(4));
597 	emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_MACINTS,
598 			  EMU_DSP_OUTR(EMU_DSP_OUT_RCHAN),
599 			  EMU_DSP_OUTR(EMU_DSP_OUT_AC97),
600 			  EMU_DSP_FX(1), EMU_DSP_CST(4));
601 #endif
602 	/* zero out the rest of the microcode */
603 	while (pc < 512)
604 		emuxki_dsp_addop(sc, &pc, EMU_DSP_OP_ACC3,
605 				  EMU_DSP_CST(0), EMU_DSP_CST(0),
606 				  EMU_DSP_CST(0), EMU_DSP_CST(0));
607 
608 	emuxki_write(sc, 0, EMU_DBG, 0);	/* Is it really necessary ? */
609 }
610 
611 static int
612 emuxki_init(struct emuxki_softc *sc)
613 {
614 	u_int16_t       i;
615 	u_int32_t       spcs, *ptb;
616 	bus_addr_t      silentpage;
617 
618 	/* disable any channel interrupt */
619 	emuxki_write(sc, 0, EMU_CLIEL, 0);
620 	emuxki_write(sc, 0, EMU_CLIEH, 0);
621 	emuxki_write(sc, 0, EMU_SOLEL, 0);
622 	emuxki_write(sc, 0, EMU_SOLEH, 0);
623 
624 	/* Set recording buffers sizes to zero */
625 	emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
626 	emuxki_write(sc, 0, EMU_MICBA, 0);
627 	emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
628 	emuxki_write(sc, 0, EMU_FXBA, 0);
629 	emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
630 	emuxki_write(sc, 0, EMU_ADCBA, 0);
631 
632 	/* Initialize all channels to stopped and no effects */
633 	for (i = 0; i < EMU_NUMCHAN; i++) {
634 		emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0);
635 		emuxki_write(sc, i, EMU_CHAN_IP, 0);
636 		emuxki_write(sc, i, EMU_CHAN_VTFT, 0xffff);
637 		emuxki_write(sc, i, EMU_CHAN_CVCF, 0xffff);
638 		emuxki_write(sc, i, EMU_CHAN_PTRX, 0);
639 		emuxki_write(sc, i, EMU_CHAN_CPF, 0);
640 		emuxki_write(sc, i, EMU_CHAN_CCR, 0);
641 		emuxki_write(sc, i, EMU_CHAN_PSST, 0);
642 		emuxki_write(sc, i, EMU_CHAN_DSL, 0x10);	/* Why 16 ? */
643 		emuxki_write(sc, i, EMU_CHAN_CCCA, 0);
644 		emuxki_write(sc, i, EMU_CHAN_Z1, 0);
645 		emuxki_write(sc, i, EMU_CHAN_Z2, 0);
646 		emuxki_write(sc, i, EMU_CHAN_FXRT, 0x32100000);
647 		emuxki_write(sc, i, EMU_CHAN_ATKHLDM, 0);
648 		emuxki_write(sc, i, EMU_CHAN_DCYSUSM, 0);
649 		emuxki_write(sc, i, EMU_CHAN_IFATN, 0xffff);
650 		emuxki_write(sc, i, EMU_CHAN_PEFE, 0);
651 		emuxki_write(sc, i, EMU_CHAN_FMMOD, 0);
652 		emuxki_write(sc, i, EMU_CHAN_TREMFRQ, 24);
653 		emuxki_write(sc, i, EMU_CHAN_FM2FRQ2, 24);
654 		emuxki_write(sc, i, EMU_CHAN_TEMPENV, 0);
655 
656 		/* these are last so OFF prevents writing */
657 		emuxki_write(sc, i, EMU_CHAN_LFOVAL2, 0);
658 		emuxki_write(sc, i, EMU_CHAN_LFOVAL1, 0);
659 		emuxki_write(sc, i, EMU_CHAN_ATKHLDV, 0);
660 		emuxki_write(sc, i, EMU_CHAN_ENVVOL, 0);
661 		emuxki_write(sc, i, EMU_CHAN_ENVVAL, 0);
662 	}
663 
664 	/* set digital outputs format */
665 	spcs = (EMU_SPCS_CLKACCY_1000PPM | EMU_SPCS_SAMPLERATE_48 |
666 	      EMU_SPCS_CHANNELNUM_LEFT | EMU_SPCS_SOURCENUM_UNSPEC |
667 		EMU_SPCS_GENERATIONSTATUS | 0x00001200 /* Cat code. */ |
668 		0x00000000 /* IEC-958 Mode */ | EMU_SPCS_EMPHASIS_NONE |
669 		EMU_SPCS_COPYRIGHT);
670 	emuxki_write(sc, 0, EMU_SPCS0, spcs);
671 	emuxki_write(sc, 0, EMU_SPCS1, spcs);
672 	emuxki_write(sc, 0, EMU_SPCS2, spcs);
673 
674 	/* Let's play with sound processor */
675 	emuxki_initfx(sc);
676 
677 	/* Here is our Page Table */
678 	if ((sc->ptb = dmamem_alloc(sc->sc_dmat,
679 	    EMU_MAXPTE * sizeof(u_int32_t),
680 	    EMU_DMA_ALIGN, EMU_DMAMEM_NSEG,
681 	    M_DEVBUF, M_WAITOK)) == NULL)
682 		return (ENOMEM);
683 
684 	/* This is necessary unless you like Metallic noise... */
685 	if ((sc->silentpage = dmamem_alloc(sc->sc_dmat, EMU_PTESIZE,
686 	    EMU_DMA_ALIGN, EMU_DMAMEM_NSEG, M_DEVBUF, M_WAITOK))==NULL){
687 		dmamem_free(sc->ptb, M_DEVBUF);
688 		return (ENOMEM);
689 	}
690 
691 	/* Zero out the silent page */
692 	/* This might not be always true, it might be 128 for 8bit channels */
693 	memset(KERNADDR(sc->silentpage), 0, DMASIZE(sc->silentpage));
694 
695 	/*
696 	 * Set all the PTB Entries to the silent page We shift the physical
697 	 * address by one and OR it with the page number. I don't know what
698 	 * the ORed index is for, might be a very useful unused feature...
699 	 */
700 	silentpage = DMAADDR(sc->silentpage) << 1;
701 	ptb = KERNADDR(sc->ptb);
702 	for (i = 0; i < EMU_MAXPTE; i++)
703 		ptb[i] = silentpage | i;
704 
705 	/* Write PTB address and set TCB to none */
706 	emuxki_write(sc, 0, EMU_PTB, DMAADDR(sc->ptb));
707 	emuxki_write(sc, 0, EMU_TCBS, 0);	/* This means 16K TCB */
708 	emuxki_write(sc, 0, EMU_TCB, 0);	/* No TCB use for now */
709 
710 	/*
711 	 * Set channels MAPs to the silent page.
712 	 * I don't know what MAPs are for.
713 	 */
714 	silentpage |= EMU_CHAN_MAP_PTI_MASK;
715 	for (i = 0; i < EMU_NUMCHAN; i++) {
716 		emuxki_write(sc, i, EMU_CHAN_MAPA, silentpage);
717 		emuxki_write(sc, i, EMU_CHAN_MAPB, silentpage);
718 		sc->channel[i] = NULL;
719 	}
720 
721 	/* Init voices list */
722 	LIST_INIT(&(sc->voices));
723 
724 	/* Timer is stopped */
725 	sc->timerstate &= ~EMU_TIMER_STATE_ENABLED;
726 	return (0);
727 }
728 
729 static void
730 emuxki_shutdown(struct emuxki_softc *sc)
731 {
732 	u_int32_t       i;
733 
734 	/* Disable any Channels interrupts */
735 	emuxki_write(sc, 0, EMU_CLIEL, 0);
736 	emuxki_write(sc, 0, EMU_CLIEH, 0);
737 	emuxki_write(sc, 0, EMU_SOLEL, 0);
738 	emuxki_write(sc, 0, EMU_SOLEH, 0);
739 
740 	/*
741 	 * Should do some voice(stream) stopping stuff here, that's what will
742 	 * stop and deallocate all channels.
743 	 */
744 
745 	/* Stop all channels */
746 	/* XXX This shouldn't be necessary, I'll remove once everything works */
747 	for (i = 0; i < EMU_NUMCHAN; i++)
748 		emuxki_write(sc, i, EMU_CHAN_DCYSUSV, 0);
749 	for (i = 0; i < EMU_NUMCHAN; i++) {
750 		emuxki_write(sc, i, EMU_CHAN_VTFT, 0);
751 		emuxki_write(sc, i, EMU_CHAN_CVCF, 0);
752 		emuxki_write(sc, i, EMU_CHAN_PTRX, 0);
753 		emuxki_write(sc, i, EMU_CHAN_CPF, 0);
754 	}
755 
756 	/*
757 	 * Deallocate Emu10k1 caches and recording buffers. Again it will be
758 	 * removed because it will be done in voice shutdown.
759 	 */
760 	emuxki_write(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
761 	emuxki_write(sc, 0, EMU_MICBA, 0);
762 	emuxki_write(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
763 	emuxki_write(sc, 0, EMU_FXBA, 0);
764 	emuxki_write(sc, 0, EMU_FXWC, 0);
765 	emuxki_write(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
766 	emuxki_write(sc, 0, EMU_ADCBA, 0);
767 
768 	/*
769 	 * XXX I don't know yet how I will handle tank cache buffer,
770 	 * I don't even clearly  know what it is for.
771 	 */
772 	emuxki_write(sc, 0, EMU_TCB, 0);	/* 16K again */
773 	emuxki_write(sc, 0, EMU_TCBS, 0);
774 
775 	emuxki_write(sc, 0, EMU_DBG, 0x8000);	/* necessary ? */
776 
777 	dmamem_free(sc->silentpage, M_DEVBUF);
778 	dmamem_free(sc->ptb, M_DEVBUF);
779 }
780 
781 /* Emu10k1 Memory managment */
782 
783 static struct emuxki_mem *
784 emuxki_mem_new(struct emuxki_softc *sc, int ptbidx,
785 		size_t size, int type, int flags)
786 {
787 	struct emuxki_mem *mem;
788 
789 	if ((mem = malloc(sizeof(*mem), type, flags)) == NULL)
790 		return (NULL);
791 
792 	mem->ptbidx = ptbidx;
793 	if ((mem->dmamem = dmamem_alloc(sc->sc_dmat, size, EMU_DMA_ALIGN,
794 	    EMU_DMAMEM_NSEG, type, flags)) == NULL) {
795 		free(mem, type);
796 		return (NULL);
797 	}
798 	return (mem);
799 }
800 
801 static void
802 emuxki_mem_delete(struct emuxki_mem *mem, int type)
803 {
804 	dmamem_free(mem->dmamem, type);
805 	free(mem, type);
806 }
807 
808 static void *
809 emuxki_pmem_alloc(struct emuxki_softc *sc, size_t size, int type, int flags)
810 {
811 	int             i, j, s;
812 	size_t          numblocks;
813 	struct emuxki_mem *mem;
814 	u_int32_t      *ptb, silentpage;
815 
816 	ptb = KERNADDR(sc->ptb);
817 	silentpage = DMAADDR(sc->silentpage) << 1;
818 	numblocks = size / EMU_PTESIZE;
819 	if (size % EMU_PTESIZE)
820 		numblocks++;
821 
822 	for (i = 0; i < EMU_MAXPTE; i++)
823 		if ((ptb[i] & EMU_CHAN_MAP_PTE_MASK) == silentpage) {
824 			/* We look for a free PTE */
825 			s = splaudio();
826 			for (j = 0; j < numblocks; j++)
827 				if ((ptb[i + j] & EMU_CHAN_MAP_PTE_MASK)
828 				    != silentpage)
829 					break;
830 			if (j == numblocks) {
831 				if ((mem = emuxki_mem_new(sc, i,
832 						size, type, flags)) == NULL) {
833 					splx(s);
834 					return (NULL);
835 				}
836 				for (j = 0; j < numblocks; j++)
837 					ptb[i + j] =
838 						(((DMAADDR(mem->dmamem) +
839 						 j * EMU_PTESIZE)) << 1)
840 						| (i + j);
841 				LIST_INSERT_HEAD(&(sc->mem), mem, next);
842 				splx(s);
843 				return (KERNADDR(mem->dmamem));
844 			} else
845 				i += j;
846 			splx(s);
847 		}
848 	return (NULL);
849 }
850 
851 static void *
852 emuxki_rmem_alloc(struct emuxki_softc *sc, size_t size, int type, int flags)
853 {
854 	struct emuxki_mem *mem;
855 	int             s;
856 
857 	mem = emuxki_mem_new(sc, EMU_RMEM, size, type, flags);
858 	if (mem == NULL)
859 		return (NULL);
860 
861 	s = splaudio();
862 	LIST_INSERT_HEAD(&(sc->mem), mem, next);
863 	splx(s);
864 
865 	return (KERNADDR(mem->dmamem));
866 }
867 
868 /*
869  * emuxki_channel_* : Channel managment functions
870  * emuxki_chanparms_* : Channel parameters modification functions
871  */
872 
873 /*
874  * is splaudio necessary here, can the same voice be manipulated by two
875  * different threads at a time ?
876  */
877 static void
878 emuxki_chanparms_set_defaults(struct emuxki_channel *chan)
879 {
880 	chan->fxsend.a.level = chan->fxsend.b.level =
881 	chan->fxsend.c.level = chan->fxsend.d.level = 0xff;	/* max */
882 	chan->fxsend.a.dest = 0x0;
883 	chan->fxsend.b.dest = 0x1;
884 	chan->fxsend.c.dest = 0x2;
885 	chan->fxsend.d.dest = 0x3;
886 
887 	chan->pitch.intial = 0x0000;	/* shouldn't it be 0xE000 ? */
888 	chan->pitch.current = 0x0000;	/* should it be 0x0400 */
889 	chan->pitch.target = 0x0000;	/* the unity pitch shift ? */
890 	chan->pitch.envelope_amount = 0x00;	/* none */
891 
892 	chan->initial_attenuation = 0x00;	/* no attenuation */
893 	chan->volume.current = 0x0000;	/* no volume */
894 	chan->volume.target = 0xffff;
895 	chan->volume.envelope.current_state = 0x8000;	/* 0 msec delay */
896 	chan->volume.envelope.hold_time = 0x7f;	/* 0 msec */
897 	chan->volume.envelope.attack_time = 0x7F;	/* 5.5msec */
898 	chan->volume.envelope.sustain_level = 0x7F;	/* full  */
899 	chan->volume.envelope.decay_time = 0x7F;	/* 22msec  */
900 
901 	chan->filter.initial_cutoff_frequency = 0xff;	/* no filter */
902 	chan->filter.current_cutoff_frequency = 0xffff;	/* no filtering */
903 	chan->filter.target_cutoff_frequency = 0xffff;	/* no filtering */
904 	chan->filter.lowpass_resonance_height = 0x0;
905 	chan->filter.interpolation_ROM = 0x1;	/* full band */
906 	chan->filter.envelope_amount = 0x7f;	/* none */
907 	chan->filter.LFO_modulation_depth = 0x00;	/* none */
908 
909 	chan->loop.start = 0x000000;
910 	chan->loop.end = 0x000010;	/* Why ? */
911 
912 	chan->modulation.envelope.current_state = 0x8000;
913 	chan->modulation.envelope.hold_time = 0x00;	/* 127 better ? */
914 	chan->modulation.envelope.attack_time = 0x00;	/* infinite */
915 	chan->modulation.envelope.sustain_level = 0x00;	/* off */
916 	chan->modulation.envelope.decay_time = 0x7f;	/* 22 msec */
917 	chan->modulation.LFO_state = 0x8000;
918 
919 	chan->vibrato_LFO.state = 0x8000;
920 	chan->vibrato_LFO.modulation_depth = 0x00;	/* none */
921 	chan->vibrato_LFO.vibrato_depth = 0x00;
922 	chan->vibrato_LFO.frequency = 0x00;	/* Why set to 24 when
923 						 * initialized ? */
924 
925 	chan->tremolo_depth = 0x00;
926 }
927 
928 /* only call it at splaudio */
929 static struct emuxki_channel *
930 emuxki_channel_new(struct emuxki_voice *voice, u_int8_t num)
931 {
932 	struct emuxki_channel *chan;
933 
934 	chan = malloc(sizeof(struct emuxki_channel), M_DEVBUF, M_WAITOK);
935 	if (chan == NULL)
936 		return (NULL);
937 
938 	chan->voice = voice;
939 	chan->num = num;
940 	emuxki_chanparms_set_defaults(chan);
941 	chan->voice->sc->channel[num] = chan;
942 	return (chan);
943 }
944 
945 /* only call it at splaudio */
946 static void
947 emuxki_channel_delete(struct emuxki_channel *chan)
948 {
949 	chan->voice->sc->channel[chan->num] = NULL;
950 	free(chan, M_DEVBUF);
951 }
952 
953 static void
954 emuxki_channel_set_fxsend(struct emuxki_channel *chan,
955 			   struct emuxki_chanparms_fxsend *fxsend)
956 {
957 	/* Could do a memcpy ...*/
958 	chan->fxsend.a.level = fxsend->a.level;
959 	chan->fxsend.b.level = fxsend->b.level;
960 	chan->fxsend.c.level = fxsend->c.level;
961 	chan->fxsend.d.level = fxsend->d.level;
962 	chan->fxsend.a.dest = fxsend->a.dest;
963 	chan->fxsend.b.dest = fxsend->b.dest;
964 	chan->fxsend.c.dest = fxsend->c.dest;
965 	chan->fxsend.d.dest = fxsend->d.dest;
966 }
967 
968 static void
969 emuxki_channel_set_srate(struct emuxki_channel *chan, u_int32_t srate)
970 {
971 	chan->pitch.target = (srate << 8) / 375;
972 	chan->pitch.target = (chan->pitch.target >> 1) +
973 		(chan->pitch.target & 1);
974 	chan->pitch.target &= 0xffff;
975 	chan->pitch.current = chan->pitch.target;
976 	chan->pitch.intial =
977 		(emuxki_rate_to_pitch(srate) >> 8) & EMU_CHAN_IP_MASK;
978 }
979 
980 /* voice params must be set before calling this */
981 static void
982 emuxki_channel_set_bufparms(struct emuxki_channel *chan,
983 			     u_int32_t start, u_int32_t end)
984 {
985 	u_int8_t        shift;
986 	struct emuxki_voice *voice = chan->voice;
987 
988 	shift = voice->stereo + voice->b16;
989 	chan->loop.start = start & EMU_CHAN_PSST_LOOPSTARTADDR_MASK;
990 	chan->loop.end = end & EMU_CHAN_DSL_LOOPENDADDR_MASK;
991 }
992 
993 static void
994 emuxki_channel_commit_parms(struct emuxki_channel *chan)
995 {
996 	struct emuxki_voice *voice = chan->voice;
997 	struct emuxki_softc *sc = voice->sc;
998 	u_int32_t start, mapval;
999 	u_int8_t chano = chan->num;
1000 	int s;
1001 
1002 	start = chan->loop.start +
1003 		(voice->stereo ? 28 : 30) * (voice->b16 + 1);
1004 	mapval = DMAADDR(sc->silentpage) << 1 | EMU_CHAN_MAP_PTI_MASK;
1005 
1006 	s = splaudio();
1007 	emuxki_write(sc, chano, EMU_CHAN_CPF_STEREO, voice->stereo);
1008 	emuxki_write(sc, chano, EMU_CHAN_FXRT,
1009 		(chan->fxsend.d.dest << 28) | (chan->fxsend.c.dest << 24) |
1010 		(chan->fxsend.b.dest << 20) | (chan->fxsend.a.dest << 16));
1011 	emuxki_write(sc, chano, 0x10000000 | EMU_CHAN_PTRX,
1012 		(chan->fxsend.a.level << 8) | chan->fxsend.b.level);
1013 	emuxki_write(sc, chano, EMU_CHAN_DSL,
1014 		(chan->fxsend.d.level << 24) | chan->loop.end);
1015 	emuxki_write(sc, chano, EMU_CHAN_PSST,
1016 		(chan->fxsend.c.level << 24) | chan->loop.start);
1017 	emuxki_write(sc, chano, EMU_CHAN_CCCA,
1018 		(chan->filter.lowpass_resonance_height << 28) |
1019 		(chan->filter.interpolation_ROM << 25) |
1020 		(voice->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT) | start);
1021 	emuxki_write(sc, chano, EMU_CHAN_Z1, 0);
1022 	emuxki_write(sc, chano, EMU_CHAN_Z2, 0);
1023 	emuxki_write(sc, chano, EMU_CHAN_MAPA, mapval);
1024 	emuxki_write(sc, chano, EMU_CHAN_MAPB, mapval);
1025 	emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRFILTER,
1026 		chan->filter.current_cutoff_frequency);
1027 	emuxki_write(sc, chano, EMU_CHAN_VTFT_FILTERTARGET,
1028 		chan->filter.target_cutoff_frequency);
1029 	emuxki_write(sc, chano, EMU_CHAN_ATKHLDM,
1030 		(chan->modulation.envelope.hold_time << 8) |
1031 		chan->modulation.envelope.attack_time);
1032 	emuxki_write(sc, chano, EMU_CHAN_DCYSUSM,
1033 		(chan->modulation.envelope.sustain_level << 8) |
1034 		chan->modulation.envelope.decay_time);
1035 	emuxki_write(sc, chano, EMU_CHAN_LFOVAL1,
1036 		chan->modulation.LFO_state);
1037 	emuxki_write(sc, chano, EMU_CHAN_LFOVAL2,
1038 		chan->vibrato_LFO.state);
1039 	emuxki_write(sc, chano, EMU_CHAN_FMMOD,
1040 		(chan->vibrato_LFO.modulation_depth << 8) |
1041 		chan->filter.LFO_modulation_depth);
1042 	emuxki_write(sc, chano, EMU_CHAN_TREMFRQ,
1043 		(chan->tremolo_depth << 8));
1044 	emuxki_write(sc, chano, EMU_CHAN_FM2FRQ2,
1045 		(chan->vibrato_LFO.vibrato_depth << 8) |
1046 		chan->vibrato_LFO.frequency);
1047 	emuxki_write(sc, chano, EMU_CHAN_ENVVAL,
1048 		chan->modulation.envelope.current_state);
1049 	emuxki_write(sc, chano, EMU_CHAN_ATKHLDV,
1050 		(chan->volume.envelope.hold_time << 8) |
1051 		chan->volume.envelope.attack_time);
1052 	emuxki_write(sc, chano, EMU_CHAN_ENVVOL,
1053 		chan->volume.envelope.current_state);
1054 	emuxki_write(sc, chano, EMU_CHAN_PEFE,
1055 		(chan->pitch.envelope_amount << 8) |
1056 		chan->filter.envelope_amount);
1057 	splx(s);
1058 }
1059 
1060 static void
1061 emuxki_channel_start(struct emuxki_channel *chan)
1062 {
1063 	struct emuxki_voice *voice = chan->voice;
1064 	struct emuxki_softc *sc = voice->sc;
1065 	u_int8_t        cache_sample, cache_invalid_size, chano = chan->num;
1066 	u_int32_t       sample;
1067 	int             s;
1068 
1069 	cache_sample = voice->stereo ? 4 : 2;
1070 	sample = voice->b16 ? 0x00000000 : 0x80808080;
1071 	cache_invalid_size = (voice->stereo ? 28 : 30) * (voice->b16 + 1);
1072 
1073 	s = splaudio();
1074 	while (cache_sample--) {
1075 		emuxki_write(sc, chano, EMU_CHAN_CD0 + cache_sample,
1076 			sample);
1077 	}
1078 	emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0);
1079 	emuxki_write(sc, chano, EMU_CHAN_CCR_READADDRESS, 64);
1080 	emuxki_write(sc, chano, EMU_CHAN_CCR_CACHEINVALIDSIZE,
1081 		cache_invalid_size);
1082 	emuxki_write(sc, chano, EMU_CHAN_IFATN,
1083 		(chan->filter.target_cutoff_frequency << 8) |
1084 		chan->initial_attenuation);
1085 	emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET,
1086 		chan->volume.target);
1087 	emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL,
1088 		chan->volume.current);
1089 	emuxki_write(sc, 0,
1090 		EMU_MKSUBREG(1, chano, EMU_SOLEL + (chano >> 5)),
1091 		0);	/* Clear stop on loop */
1092 	emuxki_write(sc, 0,
1093 		EMU_MKSUBREG(1, chano, EMU_CLIEL + (chano >> 5)),
1094 		0);	/* Clear loop interrupt */
1095 	emuxki_write(sc, chano, EMU_CHAN_DCYSUSV,
1096 		(chan->volume.envelope.sustain_level << 8) |
1097 		chan->volume.envelope.decay_time);
1098 	emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET,
1099 		chan->pitch.target);
1100 	emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH,
1101 		chan->pitch.current);
1102 	emuxki_write(sc, chano, EMU_CHAN_IP, chan->pitch.intial);
1103 
1104 	splx(s);
1105 }
1106 
1107 static void
1108 emuxki_channel_stop(struct emuxki_channel *chan)
1109 {
1110 	int s;
1111 	u_int8_t chano = chan->num;
1112 	struct emuxki_softc *sc = chan->voice->sc;
1113 
1114 	s = splaudio();
1115 	emuxki_write(sc, chano, EMU_CHAN_PTRX_PITCHTARGET, 0);
1116 	emuxki_write(sc, chano, EMU_CHAN_CPF_PITCH, 0);
1117 	emuxki_write(sc, chano, EMU_CHAN_IFATN_ATTENUATION, 0xff);
1118 	emuxki_write(sc, chano, EMU_CHAN_VTFT_VOLUMETARGET, 0);
1119 	emuxki_write(sc, chano, EMU_CHAN_CVCF_CURRVOL, 0);
1120 	emuxki_write(sc, chano, EMU_CHAN_IP, 0);
1121 	splx(s);
1122 }
1123 
1124 /*
1125  * Voices managment
1126  * emuxki_voice_dataloc : use(play or rec) independant dataloc union helpers
1127  * emuxki_voice_channel_* : play part of dataloc union helpers
1128  * emuxki_voice_recsrc_* : rec part of dataloc union helpers
1129  */
1130 
1131 /* Allocate channels for voice in case of play voice */
1132 static int
1133 emuxki_voice_channel_create(struct emuxki_voice *voice)
1134 {
1135 	struct emuxki_channel **channel = voice->sc->channel;
1136 	u_int8_t i, stereo = voice->stereo;
1137 	int s;
1138 
1139 	for (i = 0; i < EMU_NUMCHAN; i += stereo + 1) {
1140 		if ((stereo && (channel[i + 1] != NULL)) ||
1141 		    (channel[i] != NULL))	/* Looking for free channels */
1142 			continue;
1143 		s = splaudio();
1144 		if (stereo) {
1145 			voice->dataloc.chan[1] =
1146 				emuxki_channel_new(voice, i + 1);
1147 			if (voice->dataloc.chan[1] == NULL) {
1148 				splx(s);
1149 				return (ENOMEM);
1150 			}
1151 		}
1152 		voice->dataloc.chan[0] = emuxki_channel_new(voice, i);
1153 		if (voice->dataloc.chan[0] == NULL) {
1154 			if (stereo) {
1155 				emuxki_channel_delete(voice->dataloc.chan[1]);
1156 				voice->dataloc.chan[1] = NULL;
1157 			}
1158 			splx(s);
1159 			return (ENOMEM);
1160 		}
1161 		splx(s);
1162 		return (0);
1163 	}
1164 	return (EAGAIN);
1165 }
1166 
1167 /* When calling this function we assume no one can access the voice */
1168 static void
1169 emuxki_voice_channel_destroy(struct emuxki_voice *voice)
1170 {
1171 	emuxki_channel_delete(voice->dataloc.chan[0]);
1172 	voice->dataloc.chan[0] = NULL;
1173 	if (voice->stereo)
1174 		emuxki_channel_delete(voice->dataloc.chan[1]);
1175 	voice->dataloc.chan[1] = NULL;
1176 }
1177 
1178 /*
1179  * Will come back when used in voice_dataloc_create
1180  */
1181 #if 0
1182 static int
1183 emuxki_recsrc_reserve(struct emuxki_voice *voice, emuxki_recsrc_t source)
1184 {
1185 	if (voice->emu->recsrc[source] != NULL)
1186 		return (EBUSY);
1187 	voice->emu->recsrc[source] = voice;
1188 	return (0);
1189 }
1190 #endif
1191 
1192 /* When calling this function we assume the voice is stopped */
1193 static void
1194 emuxki_voice_recsrc_release(struct emuxki_softc *sc, emuxki_recsrc_t source)
1195 {
1196 	sc->recsrc[source] = NULL;
1197 }
1198 
1199 static int
1200 emuxki_voice_dataloc_create(struct emuxki_voice *voice)
1201 {
1202 	int             error;
1203 
1204 	if (voice->use & EMU_VOICE_USE_PLAY) {
1205 		if ((error = emuxki_voice_channel_create(voice)))
1206 			return (error);
1207 	} else {
1208 		/*
1209 		 * Commented out because i don't know how to get the selected
1210 		 * recording source
1211 		 */
1212 #if 0
1213 		if (emuxki_recsrc_reserve(voice, recsrc))
1214 			return (EBUSY);
1215 		printf("Which rec src do i have to create!!!\n");
1216 #endif
1217 		return (EBUSY);	/* just return an error, no real meaning */
1218 	}
1219 	return (0);
1220 }
1221 
1222 static void
1223 emuxki_voice_dataloc_destroy(struct emuxki_voice *voice)
1224 {
1225 	if (voice->use & EMU_VOICE_USE_PLAY) {
1226 		if (voice->dataloc.chan[0] != NULL)
1227 			emuxki_voice_channel_destroy(voice);
1228 	} else {
1229 		if (voice->dataloc.source != EMU_RECSRC_NOTSET) {
1230 			emuxki_voice_recsrc_release(voice->sc,
1231 						     voice->dataloc.source);
1232 			voice->dataloc.source = EMU_RECSRC_NOTSET;
1233 		}
1234 	}
1235 }
1236 
1237 static struct emuxki_voice *
1238 emuxki_voice_new(struct emuxki_softc *sc, u_int8_t use)
1239 {
1240 	struct emuxki_voice *voice;
1241 	int             s;
1242 
1243 	if ((voice = malloc(sizeof(*voice), M_DEVBUF, M_WAITOK)) == NULL)
1244 		return (NULL);
1245 	voice->sc = sc;
1246 	voice->use = use;
1247 	voice->state = !EMU_VOICE_STATE_STARTED;
1248 	voice->stereo = EMU_VOICE_STEREO_NOTSET;
1249 	voice->b16 = 0;
1250 	voice->sample_rate = 0;
1251 	if (use & EMU_VOICE_USE_PLAY)
1252 		voice->dataloc.chan[0] = voice->dataloc.chan[0] = NULL;
1253 	else
1254 		voice->dataloc.source = EMU_RECSRC_NOTSET;
1255 	voice->buffer = NULL;
1256 	voice->blksize = 0;
1257 	voice->trigblk = 0;
1258 	voice->blkmod = 0;
1259 	voice->inth = NULL;
1260 	voice->inthparam = NULL;
1261 
1262 	s = splaudio();
1263 	LIST_INSERT_HEAD((&sc->voices), voice, next);
1264 	splx(s);
1265 
1266 	return (voice);
1267 }
1268 
1269 static void
1270 emuxki_voice_delete(struct emuxki_voice *voice)
1271 {
1272 	int             s;
1273 
1274 	if (voice->state & EMU_VOICE_STATE_STARTED)
1275 		emuxki_voice_halt(voice);
1276 
1277 	s = splaudio();
1278 	LIST_REMOVE(voice, next);
1279 	splx(s);
1280 
1281 	emuxki_voice_dataloc_destroy(voice);
1282 	free(voice, M_DEVBUF);
1283 }
1284 
1285 static int
1286 emuxki_voice_set_stereo(struct emuxki_voice *voice, u_int8_t stereo)
1287 {
1288 	int	error;
1289 	struct emuxki_chanparms_fxsend fxsend;
1290 
1291 	emuxki_voice_dataloc_destroy(voice);
1292 	voice->stereo = stereo;
1293 	if ((error = emuxki_voice_dataloc_create(voice)))
1294 	  return (error);
1295 	if (voice->use & EMU_VOICE_USE_PLAY) {
1296 		fxsend.a.dest = 0x0;
1297 		fxsend.b.dest = 0x1;
1298 		fxsend.c.dest = 0x2;
1299 		fxsend.d.dest = 0x3;
1300 		if (voice->stereo) {
1301 			fxsend.a.level = fxsend.c.level = 0xff;
1302 			fxsend.b.level = fxsend.d.level = 0x00;
1303 			emuxki_channel_set_fxsend(voice->dataloc.chan[0],
1304 						   &fxsend);
1305 			fxsend.a.level = fxsend.c.level = 0x00;
1306 			fxsend.b.level = fxsend.d.level = 0xff;
1307 			emuxki_channel_set_fxsend(voice->dataloc.chan[1],
1308 						   &fxsend);
1309 		} /* No else : default is good for mono */
1310 	}
1311 	return (0);
1312 }
1313 
1314 static int
1315 emuxki_voice_set_srate(struct emuxki_voice *voice, u_int32_t srate)
1316 {
1317 	if (voice->use & EMU_VOICE_USE_PLAY) {
1318 		if ((srate < 4000) || (srate > 48000))
1319 			return (EINVAL);
1320 		voice->sample_rate = srate;
1321 		emuxki_channel_set_srate(voice->dataloc.chan[0], srate);
1322 		if (voice->stereo)
1323 			emuxki_channel_set_srate(voice->dataloc.chan[1],
1324 						  srate);
1325 	} else {
1326 #ifdef EMUXKI_DEBUG
1327 		printf("Recording voice set_srate not implemented\n");
1328 #endif
1329 		return (EINVAL);
1330 	}
1331 	return (0);
1332 }
1333 
1334 static int
1335 emuxki_voice_set_audioparms(struct emuxki_voice *voice, u_int8_t stereo,
1336 			     u_int8_t b16, u_int32_t srate)
1337 {
1338 	int             error;
1339 
1340 	/*
1341 	 * Audio driver tried to set recording AND playing params even if
1342 	 * device opened in play or record only mode ==>
1343 	 * modified emuxki_set_params.
1344 	 * Stays here for now just in case ...
1345 	 */
1346 	if (voice == NULL) {
1347 #ifdef EMUXKI_DEBUG
1348 		printf("warning: tried to set unallocated voice params !!\n");
1349 #endif
1350 		return (0);
1351 	}
1352 
1353 	if (voice->stereo == stereo && voice->b16 == b16 &&
1354 	    voice->sample_rate == srate)
1355 		return (0);
1356 
1357 #ifdef EMUXKI_DEBUG
1358 	printf("Setting %s voice params : %s, %u bits, %u hz\n",
1359 	       (voice->use & EMU_VOICE_USE_PLAY) ? "play" : "record",
1360 	       stereo ? "stereo" : "mono", (b16 + 1) * 8, srate);
1361 #endif
1362 
1363 	if (voice->stereo != stereo) {
1364 		if ((error = emuxki_voice_set_stereo(voice, stereo)))
1365 			return (error);
1366 	 }
1367 	voice->b16 = b16;
1368 	if (voice->sample_rate != srate)
1369 		emuxki_voice_set_srate(voice, srate);
1370 	return (0);
1371 }
1372 
1373 /* voice audio parms (see just before) must be set prior to this */
1374 static int
1375 emuxki_voice_set_bufparms(struct emuxki_voice *voice, void *ptr,
1376 			   u_int32_t bufsize, u_int16_t blksize)
1377 {
1378 	struct emuxki_mem *mem;
1379 	struct emuxki_channel **chan;
1380 	u_int32_t start, end;
1381 	u_int8_t sample_size;
1382 	int error = EFAULT;
1383 
1384 	LIST_FOREACH(mem, &voice->sc->mem, next) {
1385 		if (KERNADDR(mem->dmamem) != ptr)
1386 			continue;
1387 
1388 		voice->buffer = mem;
1389 		sample_size = (voice->b16 + 1) * (voice->stereo + 1);
1390 		voice->blksize = blksize / sample_size;
1391 		voice->trigblk = 0;	/* This shouldn't be needed */
1392 		voice->blkmod = bufsize / blksize;
1393 		if (bufsize % blksize) 	  /* This should not happen */
1394 			voice->blkmod++;
1395 		error = 0;
1396 
1397 		if (voice->use & EMU_VOICE_USE_PLAY) {
1398 			chan = voice->dataloc.chan;
1399 			start = mem->ptbidx << 12;
1400 			end = start + bufsize / sample_size;
1401 			emuxki_channel_set_bufparms(chan[0],
1402 						     start, end);
1403 			if (voice->stereo)
1404 				emuxki_channel_set_bufparms(chan[1],
1405 				     start, end);
1406 			voice->timerate = (u_int32_t) 48000 *
1407 			                voice->blksize / voice->sample_rate;
1408 			if (voice->timerate < 5)
1409 				error = EINVAL;
1410 		} else {
1411 #ifdef EMUXKI_DEBUG
1412 			printf("Rec voice set bufparms not implemented\n");
1413 #endif
1414 			error = ENODEV;
1415 		}
1416 
1417 		break;
1418 	}
1419 
1420 	return (error);
1421 }
1422 
1423 static void
1424 emuxki_voice_commit_parms(struct emuxki_voice *voice)
1425 {
1426 	if (voice->use & EMU_VOICE_USE_PLAY) {
1427 		emuxki_channel_commit_parms(voice->dataloc.chan[0]);
1428 		if (voice->stereo)
1429 			emuxki_channel_commit_parms(voice->dataloc.chan[1]);
1430 	}
1431 }
1432 
1433 static u_int32_t
1434 emuxki_voice_curaddr(struct emuxki_voice *voice)
1435 {
1436 	if (voice->use & EMU_VOICE_USE_PLAY)
1437 		return (emuxki_read(voice->sc,
1438 				     voice->dataloc.chan[0]->num,
1439 				     EMU_CHAN_CCCA_CURRADDR) -
1440 			voice->dataloc.chan[0]->loop.start);
1441 	return (0);
1442 }
1443 
1444 static void
1445 emuxki_resched_timer(struct emuxki_softc *sc)
1446 {
1447 	struct emuxki_voice *voice;
1448 	u_int16_t       timerate = 1024;
1449 	u_int8_t	active = 0;
1450 	int s;
1451 
1452 	s = splaudio();
1453 	LIST_FOREACH(voice, &sc->voices, next) {
1454 		if ((voice->use & EMU_VOICE_USE_PLAY) == 0 ||
1455 		    (voice->state & EMU_VOICE_STATE_STARTED) == 0)
1456 			continue;
1457 		active = 1;
1458 		if (voice->timerate < timerate)
1459 			timerate = voice->timerate;
1460 	}
1461 
1462 	if (timerate & ~EMU_TIMER_RATE_MASK)
1463 		timerate = 0;
1464 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_TIMER, timerate);
1465 	if (!active && (sc->timerstate & EMU_TIMER_STATE_ENABLED)) {
1466 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
1467 			bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) &
1468 			~EMU_INTE_INTERTIMERENB);
1469 		sc->timerstate &= ~EMU_TIMER_STATE_ENABLED;
1470 	} else if (active && !(sc->timerstate & EMU_TIMER_STATE_ENABLED)) {
1471 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_INTE,
1472 			bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_INTE) |
1473 			EMU_INTE_INTERTIMERENB);
1474 		sc->timerstate |= EMU_TIMER_STATE_ENABLED;
1475 	}
1476 	splx(s);
1477 }
1478 
1479 static void
1480 emuxki_voice_start(struct emuxki_voice *voice,
1481 		    void (*inth) (void *), void *inthparam)
1482 {
1483 	voice->inth = inth;
1484 	voice->inthparam = inthparam;
1485 	if (voice->use & EMU_VOICE_USE_PLAY) {
1486 		voice->trigblk = 1;
1487 		emuxki_channel_start(voice->dataloc.chan[0]);
1488 		if (voice->stereo)
1489 			emuxki_channel_start(voice->dataloc.chan[1]);
1490 	}
1491 #ifdef EMUXKI_DEBUG
1492 	else
1493 		printf("Recording voice start not implemented\n");
1494 #endif
1495 	voice->state |= EMU_VOICE_STATE_STARTED;
1496 	if (voice->use & EMU_VOICE_USE_PLAY)
1497 		emuxki_resched_timer(voice->sc);
1498 }
1499 
1500 static void
1501 emuxki_voice_halt(struct emuxki_voice *voice)
1502 {
1503 	if (voice->use & EMU_VOICE_USE_PLAY) {
1504 		emuxki_channel_stop(voice->dataloc.chan[0]);
1505 		if (voice->stereo)
1506 			emuxki_channel_stop(voice->dataloc.chan[1]);
1507 	}
1508 #ifdef EMUXKI_DEBUG
1509 	else
1510 		printf("Recording voice halt not implemented\n");
1511 #endif
1512 	voice->state &= ~EMU_VOICE_STATE_STARTED;
1513 	if (voice->use & EMU_VOICE_USE_PLAY)
1514 		emuxki_resched_timer(voice->sc);
1515 }
1516 
1517 /*
1518  * The interrupt handler
1519  */
1520 static int
1521 emuxki_intr(void *arg)
1522 {
1523 	struct emuxki_softc *sc = arg;
1524 	u_int32_t       ipr, curblk;
1525 	struct emuxki_voice *voice;
1526 
1527 	while ((ipr = bus_space_read_4(sc->sc_iot, sc->sc_ioh, EMU_IPR))) {
1528 		if (ipr & EMU_IPR_INTERVALTIMER) {
1529 			LIST_FOREACH(voice, &sc->voices, next) {
1530 				if ((voice->use & EMU_VOICE_USE_PLAY)==0 ||
1531 				    (voice->state &
1532 				      EMU_VOICE_STATE_STARTED) == 0)
1533 					continue;
1534 
1535 				curblk = emuxki_voice_curaddr(voice) /
1536 				       voice->blksize;
1537 				if (curblk == voice->trigblk) {
1538 					voice->inth(voice->inthparam);
1539 					voice->trigblk++;
1540 					voice->trigblk %= voice->blkmod;
1541 				}
1542 			}
1543 		}
1544 
1545 		/* Got interrupt */
1546 		bus_space_write_4(sc->sc_iot, sc->sc_ioh, EMU_IPR, ipr);
1547 	}
1548 
1549 	return (0);
1550 }
1551 
1552 
1553 /*
1554  * Audio Architecture callbacks
1555  */
1556 
1557 static int
1558 emuxki_open(void *addr, int flags)
1559 {
1560 	struct emuxki_softc *sc = addr;
1561 
1562 #ifdef EMUXKI_DEBUG
1563 	printf("%s: emuxki_open called\n", sc->sc_dev.dv_xname);
1564 #endif
1565 
1566 	/*
1567 	 * Multiple voice support would be added as soon as I find a way to
1568 	 * trick the audio arch into supporting multiple voices.
1569 	 * Or I might integrate a modified audio arch supporting
1570 	 * multiple voices.
1571 	 */
1572 
1573 	/*
1574 	 * I did this because i have problems identifying the selected
1575 	 * recording source(s) which is necessary when setting recording
1576 	 * params This will be adressed very soon
1577 	 */
1578 	if (flags & AUOPEN_READ)
1579 		return (EOPNOTSUPP);
1580 
1581 	if (flags & AUOPEN_WRITE) {
1582 		sc->pvoice = emuxki_voice_new(sc, EMU_VOICE_USE_PLAY);
1583 		if (sc->pvoice == NULL) {
1584 			if (flags & AUOPEN_READ)
1585 				emuxki_voice_delete(sc->rvoice);
1586 			return (EBUSY);
1587 		}
1588 	}
1589 
1590 	return (0);
1591 }
1592 
1593 static void
1594 emuxki_close(void *addr)
1595 {
1596 	struct emuxki_softc *sc = addr;
1597 
1598 #ifdef EMUXKI_DEBUG
1599 	printf("%s: emu10K1_close called\n", sc->sc_dev.dv_xname);
1600 #endif
1601 
1602 	/* No multiple voice support for now */
1603 	if (sc->rvoice != NULL)
1604 		emuxki_voice_delete(sc->rvoice);
1605 	sc->rvoice = NULL;
1606 	if (sc->pvoice != NULL)
1607 		emuxki_voice_delete(sc->pvoice);
1608 	sc->pvoice = NULL;
1609 }
1610 
1611 static int
1612 emuxki_query_encoding(void *addr, struct audio_encoding *fp)
1613 {
1614 #ifdef EMUXKI_DEBUG
1615 	struct emuxki_softc *sc = addr;
1616 
1617 	printf("%s: emuxki_query_encoding called\n", sc->sc_dev.dv_xname);
1618 #endif
1619 
1620 	switch (fp->index) {
1621 	case 0:
1622 		strcpy(fp->name, AudioEulinear);
1623 		fp->encoding = AUDIO_ENCODING_ULINEAR;
1624 		fp->precision = 8;
1625 		fp->flags = 0;
1626 		break;
1627 	case 1:
1628 		strcpy(fp->name, AudioEmulaw);
1629 		fp->encoding = AUDIO_ENCODING_ULAW;
1630 		fp->precision = 8;
1631 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
1632 		break;
1633 	case 2:
1634 		strcpy(fp->name, AudioEalaw);
1635 		fp->encoding = AUDIO_ENCODING_ALAW;
1636 		fp->precision = 8;
1637 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
1638 		break;
1639 	case 3:
1640 		strcpy(fp->name, AudioEslinear);
1641 		fp->encoding = AUDIO_ENCODING_SLINEAR;
1642 		fp->precision = 8;
1643 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
1644 		break;
1645 	case 4:
1646 		strcpy(fp->name, AudioEslinear_le);
1647 		fp->encoding = AUDIO_ENCODING_SLINEAR_LE;
1648 		fp->precision = 16;
1649 		fp->flags = 0;
1650 		break;
1651 	case 5:
1652 		strcpy(fp->name, AudioEulinear_le);
1653 		fp->encoding = AUDIO_ENCODING_ULINEAR_LE;
1654 		fp->precision = 16;
1655 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
1656 		break;
1657 	case 6:
1658 		strcpy(fp->name, AudioEslinear_be);
1659 		fp->encoding = AUDIO_ENCODING_SLINEAR_BE;
1660 		fp->precision = 16;
1661 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
1662 		break;
1663 	case 7:
1664 		strcpy(fp->name, AudioEulinear_be);
1665 		fp->encoding = AUDIO_ENCODING_ULINEAR_BE;
1666 		fp->precision = 16;
1667 		fp->flags = AUDIO_ENCODINGFLAG_EMULATED;
1668 		break;
1669 	default:
1670 		return (EINVAL);
1671 	}
1672 	return (0);
1673 }
1674 
1675 static int
1676 emuxki_set_vparms(struct emuxki_voice *voice, struct audio_params *p)
1677 {
1678 	u_int8_t        b16, mode;
1679 
1680 	mode = (voice->use & EMU_VOICE_USE_PLAY) ?
1681 		AUMODE_PLAY : AUMODE_RECORD;
1682 	p->factor = 1;
1683 	p->sw_code = NULL;
1684 	if (p->channels != 1 && p->channels != 2)
1685 		return (EINVAL);/* Will change when streams come in use */
1686 
1687 	switch (p->encoding) {
1688 	case AUDIO_ENCODING_ULAW:
1689 		if (mode == AUMODE_PLAY) {
1690 			p->factor = 2;
1691 			p->sw_code = mulaw_to_slinear16_le;
1692 			b16 = 1;
1693 		} else {
1694 			p->sw_code = ulinear8_to_mulaw;
1695 			b16 = 0;
1696 		}
1697 		break;
1698 
1699 	case AUDIO_ENCODING_ALAW:
1700 		if (mode == AUMODE_PLAY) {
1701 			p->factor = 2;
1702 			p->sw_code = alaw_to_slinear16_le;
1703 			b16 = 1;
1704 		} else {
1705 			p->sw_code = ulinear8_to_alaw;
1706 			b16 = 0;
1707 		}
1708 		break;
1709 
1710 	case AUDIO_ENCODING_SLINEAR_LE:
1711 		if (p->precision == 8)
1712 			p->sw_code = change_sign8;
1713 		b16 = (p->precision == 16);
1714 		break;
1715 
1716 	case AUDIO_ENCODING_ULINEAR_LE:
1717 		if (p->precision == 16)
1718 			p->sw_code = change_sign16_le;
1719 		b16 = (p->precision == 16);
1720 		break;
1721 
1722 	case AUDIO_ENCODING_SLINEAR_BE:
1723 		if (p->precision == 16)
1724 			p->sw_code = swap_bytes;
1725 		else
1726 			p->sw_code = change_sign8;
1727 		b16 = (p->precision == 16);
1728 		break;
1729 
1730 	case AUDIO_ENCODING_ULINEAR_BE:
1731 		if (p->precision == 16) {
1732 			if (mode == AUMODE_PLAY)
1733 				p->sw_code = swap_bytes_change_sign16_le;
1734 			else
1735 				p->sw_code = change_sign16_swap_bytes_le;
1736 		}
1737 		b16 = (p->precision == 16);
1738 		break;
1739 
1740 	default:
1741 		return (EINVAL);
1742 	}
1743 
1744 	return (emuxki_voice_set_audioparms(voice, p->channels == 2,
1745 				     b16, p->sample_rate));
1746 }
1747 
1748 static int
1749 emuxki_set_params(void *addr, int setmode, int usemode,
1750 		   struct audio_params *play, struct audio_params *rec)
1751 {
1752 	struct emuxki_softc *sc = addr;
1753 	int             mode, error;
1754 	struct audio_params *p;
1755 
1756 	for (mode = AUMODE_RECORD; mode != -1;
1757 	     mode = mode == AUMODE_RECORD ? AUMODE_PLAY : -1) {
1758 		if ((usemode & setmode & mode) == 0)
1759 			continue;
1760 
1761 		p = (mode == AUMODE_PLAY) ? play : rec;
1762 
1763 		/* No multiple voice support for now */
1764 		if ((error = emuxki_set_vparms((mode == AUMODE_PLAY) ?
1765 						sc->pvoice : sc->rvoice, p)))
1766 			return (error);
1767 	}
1768 
1769 	return (0);
1770 }
1771 
1772 static int
1773 emuxki_halt_output(void *addr)
1774 {
1775 	struct emuxki_softc *sc = addr;
1776 
1777 	/* No multiple voice support for now */
1778 	if (sc->pvoice == NULL)
1779 		return (ENXIO);
1780 
1781 	emuxki_voice_halt(sc->pvoice);
1782 	return (0);
1783 }
1784 
1785 static int
1786 emuxki_halt_input(void *addr)
1787 {
1788 	struct emuxki_softc *sc = addr;
1789 
1790 #ifdef EMUXKI_DEBUG
1791 	printf("%s: emuxki_halt_input called\n", sc->sc_dev.dv_xname);
1792 #endif
1793 
1794 	/* No multiple voice support for now */
1795 	if (sc->rvoice == NULL)
1796 		return (ENXIO);
1797 	emuxki_voice_halt(sc->rvoice);
1798 	return (0);
1799 }
1800 
1801 static int
1802 emuxki_getdev(void *addr, struct audio_device *dev)
1803 {
1804 	strncpy(dev->name, "Creative EMU10k1", sizeof(dev->name));
1805 	strcpy(dev->version, "");
1806 	strncpy(dev->config, "emuxki", sizeof(dev->config));
1807 
1808 	return (0);
1809 }
1810 
1811 static int
1812 emuxki_set_port(void *addr, mixer_ctrl_t *mctl)
1813 {
1814 	struct emuxki_softc *sc = addr;
1815 
1816 	return sc->codecif->vtbl->mixer_set_port(sc->codecif, mctl);
1817 }
1818 
1819 static int
1820 emuxki_get_port(void *addr, mixer_ctrl_t *mctl)
1821 {
1822 	struct emuxki_softc *sc = addr;
1823 
1824 	return sc->codecif->vtbl->mixer_get_port(sc->codecif, mctl);
1825 }
1826 
1827 static int
1828 emuxki_query_devinfo(void *addr, mixer_devinfo_t *minfo)
1829 {
1830 	struct emuxki_softc *sc = addr;
1831 
1832 	return sc->codecif->vtbl->query_devinfo(sc->codecif, minfo);
1833 }
1834 
1835 static void *
1836 emuxki_allocm(void *addr, int direction, size_t size, int type, int flags)
1837 {
1838 	struct emuxki_softc *sc = addr;
1839 
1840 	if (direction == AUMODE_PLAY)
1841 		return emuxki_pmem_alloc(sc, size, type, flags);
1842 	else
1843 		return emuxki_rmem_alloc(sc, size, type, flags);
1844 }
1845 
1846 static void
1847 emuxki_freem(void *addr, void *ptr, int type)
1848 {
1849 	struct emuxki_softc *sc = addr;
1850 	int             i, s;
1851 	struct emuxki_mem *mem;
1852 	size_t          numblocks;
1853 	u_int32_t      *ptb, silentpage;
1854 
1855 	ptb = KERNADDR(sc->ptb);
1856 	silentpage = DMAADDR(sc->silentpage) << 1;
1857 	LIST_FOREACH(mem, &sc->mem, next) {
1858 		if (KERNADDR(mem->dmamem) != ptr)
1859 			continue;
1860 
1861 		s = splaudio();
1862 		if (mem->ptbidx != EMU_RMEM) {
1863 			numblocks = DMASIZE(mem->dmamem) / EMU_PTESIZE;
1864 			if (DMASIZE(mem->dmamem) % EMU_PTESIZE)
1865 				numblocks++;
1866 			for (i = 0; i < numblocks; i++)
1867 				ptb[mem->ptbidx + i] =
1868 					silentpage | (mem->ptbidx + i);
1869 		}
1870 		LIST_REMOVE(mem, next);
1871 		splx(s);
1872 
1873 		emuxki_mem_delete(mem, type);
1874 		break;
1875 	}
1876 }
1877 
1878 static size_t
1879 emuxki_round_buffersize(void *addr, int direction, size_t bsize)
1880 {
1881 	static const int recbuf_sz[] = {
1882 		0, 384, 448, 512, 640, 768, 896, 1024, 1280, 1536, 1792,
1883 		2048, 2560, 3072, 3584, 4096, 5120, 6144, 7168, 8192, 10240,
1884 		12288, 14366, 16384, 20480, 24576, 28672, 32768, 40960, 49152,
1885 		57344, 65536
1886 	};
1887 
1888 	if (direction == AUMODE_PLAY) {
1889 		if (bsize < EMU_PTESIZE)
1890 			bsize = EMU_PTESIZE;
1891 		else if (bsize > (EMU_PTESIZE * EMU_MAXPTE))
1892 			bsize = EMU_PTESIZE * EMU_MAXPTE;
1893 		/* Would be better if set to max available */
1894 		else if (bsize % EMU_PTESIZE)
1895 			bsize = bsize -
1896 				(bsize % EMU_PTESIZE) +
1897 				EMU_PTESIZE;
1898 	} else {
1899 		int idx;
1900 
1901 		/* find nearest lower recbuf size */
1902 		for(idx=32; --idx >= 0; ) {
1903 			if (bsize >= recbuf_sz[idx]) {
1904 				bsize = recbuf_sz[idx];
1905 				break;
1906 			}
1907 		}
1908 
1909 		if (bsize == 0)
1910 			bsize = 384;
1911 	}
1912 
1913 	return (bsize);
1914 }
1915 
1916 static paddr_t
1917 emuxki_mappage(void *addr, void *ptr, off_t off, int prot)
1918 {
1919 	struct emuxki_softc *sc = addr;
1920 	struct emuxki_mem *mem;
1921 	u_int32_t      *ptb;
1922 
1923 	ptb = KERNADDR(sc->ptb);
1924 	LIST_FOREACH(mem, &sc->mem, next) {
1925 		if (KERNADDR(mem->dmamem) == ptr) {
1926 			struct dmamem *dm = mem->dmamem;
1927 
1928 			return bus_dmamem_mmap(dm->dmat, dm->segs, dm->nsegs,
1929 			       off, prot, BUS_DMA_WAITOK);
1930 		}
1931 	}
1932 
1933 	return (-1);
1934 }
1935 
1936 static int
1937 emuxki_get_props(void *addr)
1938 {
1939 	return (AUDIO_PROP_MMAP | AUDIO_PROP_INDEPENDENT |
1940 		AUDIO_PROP_FULLDUPLEX);
1941 }
1942 
1943 static int
1944 emuxki_trigger_output(void *addr, void *start, void *end, int blksize,
1945 		       void (*inth) (void *), void *inthparam,
1946 		       struct audio_params *params)
1947 {
1948 	struct emuxki_softc *sc = addr;
1949 	/* No multiple voice support for now */
1950 	struct emuxki_voice *voice = sc->pvoice;
1951 	int             error;
1952 
1953 	if (voice == NULL)
1954 		return (ENXIO);
1955 	if ((error = emuxki_set_vparms(voice, params)))
1956 		return (error);
1957 	if ((error = emuxki_voice_set_bufparms(voice, start,
1958 				(caddr_t)end - (caddr_t)start, blksize)))
1959 		return (error);
1960 	emuxki_voice_commit_parms(voice);
1961 	emuxki_voice_start(voice, inth, inthparam);
1962 
1963 	return (0);
1964 }
1965 
1966 static int
1967 emuxki_trigger_input(void *addr, void *start, void *end, int blksize,
1968 		      void (*inth) (void *), void *inthparam,
1969 		      struct audio_params *params)
1970 {
1971 	struct emuxki_softc *sc = addr;
1972 	/* No multiple voice support for now */
1973 	struct emuxki_voice *voice = sc->rvoice;
1974 	int             error;
1975 
1976 	if (voice == NULL)
1977 		return (ENXIO);
1978 	if ((error = emuxki_set_vparms(voice, params)))
1979 		return (error);
1980 	if ((error = emuxki_voice_set_bufparms(voice, start,
1981 						(caddr_t)end - (caddr_t)start,
1982 						blksize)))
1983 		return (error);
1984 	emuxki_voice_commit_parms(voice); /* Useless for record ? */
1985 	emuxki_voice_start(voice, inth, inthparam);
1986 
1987 	return (0);
1988 }
1989 
1990 
1991 /*
1992  * AC97 callbacks
1993  */
1994 
1995 static int
1996 emuxki_ac97_attach(void *arg, struct ac97_codec_if *codecif)
1997 {
1998 	struct emuxki_softc *sc = arg;
1999 
2000 	sc->codecif = codecif;
2001 	return (0);
2002 }
2003 
2004 static int
2005 emuxki_ac97_read(void *arg, u_int8_t reg, u_int16_t *val)
2006 {
2007 	struct emuxki_softc *sc = arg;
2008 	int s;
2009 
2010 	s = splaudio();
2011 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg);
2012 	*val = bus_space_read_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA);
2013 	splx(s);
2014 
2015 	return (0);
2016 }
2017 
2018 static int
2019 emuxki_ac97_write(void *arg, u_int8_t reg, u_int16_t val)
2020 {
2021 	struct emuxki_softc *sc = arg;
2022 	int s;
2023 
2024 	s = splaudio();
2025 	bus_space_write_1(sc->sc_iot, sc->sc_ioh, EMU_AC97ADDR, reg);
2026 	bus_space_write_2(sc->sc_iot, sc->sc_ioh, EMU_AC97DATA, val);
2027 	splx(s);
2028 
2029 	return (0);
2030 }
2031 
2032 static void
2033 emuxki_ac97_reset(void *arg)
2034 {
2035 }
2036