xref: /freebsd/sys/dev/sound/pci/emu10kx.c (revision 3157ba21)
1 /*-
2  * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
3  * Copyright (c) 2003-2007 Yuriy Tsibizov <yuriy.tsibizov@gfk.ru>
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  */
29 
30 #include <sys/param.h>
31 #include <sys/types.h>
32 #include <sys/bus.h>
33 #include <machine/bus.h>
34 #include <sys/rman.h>
35 #include <sys/systm.h>
36 #include <sys/sbuf.h>
37 #include <sys/queue.h>
38 #include <sys/lock.h>
39 #include <sys/mutex.h>
40 #include <sys/sysctl.h>
41 #include <sys/kdb.h>
42 
43 #include <dev/pci/pcireg.h>
44 #include <dev/pci/pcivar.h>
45 
46 #include <machine/clock.h>	/* for DELAY */
47 
48 #ifdef HAVE_KERNEL_OPTION_HEADERS
49 #include "opt_snd.h"
50 #endif
51 
52 #include <dev/sound/chip.h>
53 #include <dev/sound/pcm/sound.h>
54 #include <dev/sound/pcm/ac97.h>
55 
56 #include <dev/sound/pci/emu10kx.h>
57 
58 /* hw flags */
59 #define	HAS_51		0x0001
60 #define	HAS_71		0x0002
61 #define	HAS_AC97	0x0004
62 
63 #define	IS_EMU10K1	0x0008
64 #define	IS_EMU10K2	0x0010
65 #define	IS_CA0102	0x0020
66 #define	IS_CA0108	0x0040
67 #define	IS_UNKNOWN	0x0080
68 
69 #define	BROKEN_DIGITAL	0x0100
70 #define	DIGITAL_ONLY	0x0200
71 
72 #define	IS_CARDBUS	0x0400
73 
74 #define	MODE_ANALOG	1
75 #define	MODE_DIGITAL	2
76 #define	SPDIF_MODE_PCM	1
77 #define	SPDIF_MODE_AC3	2
78 
79 #define	MACS	0x0
80 #define	MACS1	0x1
81 #define	MACW	0x2
82 #define	MACW1	0x3
83 #define	MACINTS	0x4
84 #define	MACINTW	0x5
85 #define	ACC3	0x6
86 #define	MACMV	0x7
87 #define	ANDXOR	0x8
88 #define	TSTNEG	0x9
89 #define	LIMIT	0xA
90 #define	LIMIT1	0xB
91 #define	LOG	0xC
92 #define	EXP	0xD
93 #define	INTERP	0xE
94 #define	SKIP	0xF
95 
96 #define	GPR(i)	(sc->gpr_base+(i))
97 #define	INP(i)	(sc->input_base+(i))
98 #define	OUTP(i)	(sc->output_base+(i))
99 #define	FX(i)	(i)
100 #define	FX2(i)	(sc->efxc_base+(i))
101 #define	DSP_CONST(i) (sc->dsp_zero+(i))
102 
103 #define	COND_NORMALIZED	DSP_CONST(0x1)
104 #define	COND_BORROW	DSP_CONST(0x2)
105 #define	COND_MINUS	DSP_CONST(0x3)
106 #define	COND_LESS_ZERO	DSP_CONST(0x4)
107 #define	COND_EQ_ZERO	DSP_CONST(0x5)
108 #define	COND_SATURATION	DSP_CONST(0x6)
109 #define	COND_NEQ_ZERO	DSP_CONST(0x8)
110 
111 #define	DSP_ACCUM	DSP_CONST(0x16)
112 #define	DSP_CCR		DSP_CONST(0x17)
113 
114 /* Live! Inputs */
115 #define	IN_AC97_L 	0x00
116 #define	IN_AC97_R 	0x01
117 #define	IN_AC97		IN_AC97_L
118 #define	IN_SPDIF_CD_L	0x02
119 #define	IN_SPDIF_CD_R	0x03
120 #define	IN_SPDIF_CD	IN_SPDIF_CD_L
121 #define	IN_ZOOM_L 	0x04
122 #define	IN_ZOOM_R 	0x05
123 #define	IN_ZOOM		IN_ZOOM_L
124 #define	IN_TOSLINK_L	0x06
125 #define	IN_TOSLINK_R	0x07
126 #define	IN_TOSLINK	IN_TOSLINK_L
127 #define	IN_LINE1_L	0x08
128 #define	IN_LINE1_R	0x09
129 #define	IN_LINE1	IN_LINE1_L
130 #define	IN_COAX_SPDIF_L	0x0a
131 #define	IN_COAX_SPDIF_R	0x0b
132 #define	IN_COAX_SPDIF	IN_COAX_SPDIF_L
133 #define	IN_LINE2_L	0x0c
134 #define	IN_LINE2_R	0x0d
135 #define	IN_LINE2	IN_LINE2_L
136 #define	IN_0E		0x0e
137 #define	IN_0F		0x0f
138 
139 /* Outputs */
140 #define	OUT_AC97_L	0x00
141 #define	OUT_AC97_R	0x01
142 #define	OUT_AC97	OUT_AC97_L
143 #define	OUT_A_FRONT	OUT_AC97
144 #define	OUT_TOSLINK_L 	0x02
145 #define	OUT_TOSLINK_R 	0x03
146 #define	OUT_TOSLINK	OUT_TOSLINK_L
147 #define	OUT_D_CENTER	0x04
148 #define	OUT_D_SUB	0x05
149 #define	OUT_HEADPHONE_L	0x06
150 #define	OUT_HEADPHONE_R	0x07
151 #define	OUT_HEADPHONE	OUT_HEADPHONE_L
152 #define	OUT_REAR_L	0x08
153 #define	OUT_REAR_R	0x09
154 #define	OUT_REAR	OUT_REAR_L
155 #define	OUT_ADC_REC_L 	0x0a
156 #define	OUT_ADC_REC_R	0x0b
157 #define	OUT_ADC_REC	OUT_ADC_REC_L
158 #define	OUT_MIC_CAP	0x0c
159 
160 /* Live! 5.1 Digital, non-standart 5.1 (center & sub) outputs */
161 #define	OUT_A_CENTER	0x11
162 #define	OUT_A_SUB	0x12
163 
164 /* Audigy Inputs */
165 #define	A_IN_AC97_L	0x00
166 #define	A_IN_AC97_R	0x01
167 #define	A_IN_AC97	A_IN_AC97_L
168 #define	A_IN_SPDIF_CD_L	0x02
169 #define	A_IN_SPDIF_CD_R	0x03
170 #define	A_IN_SPDIF_CD	A_IN_SPDIF_CD_L
171 #define	A_IN_O_SPDIF_L	0x04
172 #define	A_IN_O_SPDIF_R	0x05
173 #define	A_IN_O_SPDIF	A_IN_O_SPDIF_L
174 #define	A_IN_LINE2_L	0x08
175 #define	A_IN_LINE2_R	0x09
176 #define	A_IN_LINE2	A_IN_LINE2_L
177 #define	A_IN_R_SPDIF_L	0x0a
178 #define	A_IN_R_SPDIF_R	0x0b
179 #define	A_IN_R_SPDIF	A_IN_R_SPDIF_L
180 #define	A_IN_AUX2_L	0x0c
181 #define	A_IN_AUX2_R	0x0d
182 #define	A_IN_AUX2	A_IN_AUX2_L
183 
184 /* Audigiy Outputs */
185 #define	A_OUT_D_FRONT_L	0x00
186 #define	A_OUT_D_FRONT_R	0x01
187 #define	A_OUT_D_FRONT	A_OUT_D_FRONT_L
188 #define	A_OUT_D_CENTER	0x02
189 #define	A_OUT_D_SUB	0x03
190 #define	A_OUT_D_SIDE_L	0x04
191 #define	A_OUT_D_SIDE_R	0x05
192 #define	A_OUT_D_SIDE	A_OUT_D_SIDE_L
193 #define	A_OUT_D_REAR_L	0x06
194 #define	A_OUT_D_REAR_R	0x07
195 #define	A_OUT_D_REAR	A_OUT_D_REAR_L
196 
197 /* on Audigy Platinum only */
198 #define	A_OUT_HPHONE_L	0x04
199 #define	A_OUT_HPHONE_R	0x05
200 #define	A_OUT_HPHONE	A_OUT_HPHONE_L
201 
202 #define	A_OUT_A_FRONT_L	0x08
203 #define	A_OUT_A_FRONT_R	0x09
204 #define	A_OUT_A_FRONT	A_OUT_A_FRONT_L
205 #define	A_OUT_A_CENTER	0x0a
206 #define	A_OUT_A_SUB	0x0b
207 #define	A_OUT_A_SIDE_L	0x0c
208 #define	A_OUT_A_SIDE_R	0x0d
209 #define	A_OUT_A_SIDE	A_OUT_A_SIDE_L
210 #define	A_OUT_A_REAR_L	0x0e
211 #define	A_OUT_A_REAR_R	0x0f
212 #define	A_OUT_A_REAR	A_OUT_A_REAR_L
213 #define	A_OUT_AC97_L	0x10
214 #define	A_OUT_AC97_R	0x11
215 #define	A_OUT_AC97	A_OUT_AC97_L
216 #define	A_OUT_ADC_REC_L	0x16
217 #define	A_OUT_ADC_REC_R	0x17
218 #define	A_OUT_ADC_REC	A_OUT_ADC_REC_L
219 
220 #include "emu10k1-alsa%diked.h"
221 #include "p16v-alsa%diked.h"
222 #include "p17v-alsa%diked.h"
223 
224 #define	C_FRONT_L	0
225 #define	C_FRONT_R	1
226 #define	C_REC_L		2
227 #define	C_REC_R		3
228 #define	C_REAR_L	4
229 #define	C_REAR_R	5
230 #define	C_CENTER	6
231 #define	C_SUB		7
232 #define	C_SIDE_L	8
233 #define	C_SIDE_R	9
234 #define	NUM_CACHES	10
235 
236 #define	CDSPDIFMUTE	0
237 #define	ANALOGMUTE	1
238 #define	NUM_MUTE	2
239 
240 #define	EMU_MAX_GPR	512
241 #define	EMU_MAX_IRQ_CONSUMERS 32
242 
243 struct emu_voice {
244 	int	vnum;
245 	unsigned int	b16:1, stereo:1, busy:1, running:1, ismaster:1;
246 	int	speed;
247 	int	start;
248 	int	end;
249 	int	vol;
250 	uint32_t buf;
251 	void	*vbuf;
252 	struct emu_voice *slave;
253 	uint32_t sa;
254 	uint32_t ea;
255 	uint32_t routing[8];
256 	uint32_t amounts[8];
257 };
258 
259 struct emu_memblk {
260 	SLIST_ENTRY(emu_memblk)	link;
261 	void		*buf;
262 	char		owner[16];
263 	bus_addr_t	buf_addr;
264 	uint32_t	pte_start, pte_size;
265 };
266 
267 struct emu_mem {
268 	uint8_t		bmap[EMU_MAXPAGES / 8];
269 	uint32_t	*ptb_pages;
270 	void		*silent_page;
271 	bus_addr_t	silent_page_addr;
272 	bus_addr_t	ptb_pages_addr;
273 	bus_dma_tag_t	dmat;
274 	struct emu_sc_info *card;
275 	SLIST_HEAD(, emu_memblk) blocks;
276 };
277 
278 /* rm */
279 struct emu_rm {
280 	struct emu_sc_info *card;
281 	struct mtx	gpr_lock;
282 	signed int	allocmap[EMU_MAX_GPR];
283 	int		num_gprs;
284 	int		last_free_gpr;
285 	int 		num_used;
286 };
287 
288 struct emu_intr_handler {
289 	void*		softc;
290 	uint32_t	intr_mask;
291 	uint32_t	inte_mask;
292 	uint32_t(*irq_func) (void *softc, uint32_t irq);
293 };
294 
295 struct emu_sc_info {
296 	struct mtx	lock;
297 	struct mtx	rw;		/* Hardware exclusive access lock */
298 
299 	/* Hardware and subdevices */
300 	device_t	dev;
301 	device_t	pcm[RT_COUNT];
302 	device_t	midi[2];
303 	uint32_t	type;
304 	uint32_t	rev;
305 
306 	bus_space_tag_t	st;
307 	bus_space_handle_t sh;
308 
309 	struct cdev	*cdev;		/* /dev/emu10k character device */
310 	struct mtx	emu10kx_lock;
311 	int		emu10kx_isopen;
312 	struct sbuf	emu10kx_sbuf;
313 	int		emu10kx_bufptr;
314 
315 
316 	/* Resources */
317 	struct resource	*reg;
318 	struct resource	*irq;
319 	void 		*ih;
320 
321 	/* IRQ handlers */
322 	struct emu_intr_handler ihandler[EMU_MAX_IRQ_CONSUMERS];
323 
324 	/* Card HW configuration */
325 	unsigned int	mode;	/* analog / digital */
326 	unsigned int	mchannel_fx;
327 	unsigned int	dsp_zero;
328 	unsigned int	code_base;
329 	unsigned int	code_size;
330 	unsigned int	gpr_base;
331 	unsigned int	num_gprs;
332 	unsigned int	input_base;
333 	unsigned int	output_base;
334 	unsigned int	efxc_base;
335 	unsigned int	opcode_shift;
336 	unsigned int	high_operand_shift;
337 	unsigned int	address_mask;
338 	uint32_t 	is_emu10k1:1, is_emu10k2, is_ca0102, is_ca0108:1,
339 			has_ac97:1, has_51:1, has_71:1,
340 			enable_ir:1,
341 			broken_digital:1, is_cardbus:1;
342 
343 	signed int	mch_disabled, mch_rec, dbg_level;
344 	signed int 	num_inputs;
345 	unsigned int 	num_outputs;
346 	unsigned int 	num_fxbuses;
347 	unsigned int 	routing_code_start;
348 	unsigned int	routing_code_end;
349 
350 	/* HW resources */
351 	struct emu_voice voice[NUM_G];			/* Hardware voices */
352 	uint32_t	irq_mask[EMU_MAX_IRQ_CONSUMERS]; /* IRQ manager data */
353 	int 		timer[EMU_MAX_IRQ_CONSUMERS];	/* timer */
354 	int		timerinterval;
355 	struct		emu_rm *rm;
356 	struct		emu_mem mem;			/* memory */
357 
358 	/* Mixer */
359 	int		mixer_gpr[NUM_MIXERS];
360 	int		mixer_volcache[NUM_MIXERS];
361 	int		cache_gpr[NUM_CACHES];
362 	int		dummy_gpr;
363 	int		mute_gpr[NUM_MUTE];
364 	struct sysctl_ctx_list	*ctx;
365 	struct sysctl_oid	*root;
366 };
367 
368 static void	emu_setmap(void *arg, bus_dma_segment_t * segs, int nseg, int error);
369 static void*	emu_malloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr);
370 static void	emu_free(struct emu_mem *mem, void *dmabuf);
371 static void*	emu_memalloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr, const char * owner);
372 static int	emu_memfree(struct emu_mem *mem, void *membuf);
373 static int	emu_memstart(struct emu_mem *mem, void *membuf);
374 
375 /* /dev */
376 static int	emu10kx_dev_init(struct emu_sc_info *sc);
377 static int	emu10kx_dev_uninit(struct emu_sc_info *sc);
378 static int	emu10kx_prepare(struct emu_sc_info *sc, struct sbuf *s);
379 
380 static void	emumix_set_mode(struct emu_sc_info *sc, int mode);
381 static void	emumix_set_spdif_mode(struct emu_sc_info *sc, int mode);
382 static void	emumix_set_fxvol(struct emu_sc_info *sc, unsigned gpr, int32_t vol);
383 static void	emumix_set_gpr(struct emu_sc_info *sc, unsigned gpr, int32_t val);
384 static int	sysctl_emu_mixer_control(SYSCTL_HANDLER_ARGS);
385 
386 static int	emu_rm_init(struct emu_sc_info *sc);
387 static int	emu_rm_uninit(struct emu_sc_info *sc);
388 static int	emu_rm_gpr_alloc(struct emu_rm *rm, int count);
389 
390 static unsigned int emu_getcard(device_t dev);
391 static uint32_t	emu_rd_nolock(struct emu_sc_info *sc, unsigned int regno, unsigned int size);
392 static void	emu_wr_nolock(struct emu_sc_info *sc, unsigned int regno, uint32_t data, unsigned int size);
393 static void	emu_wr_cbptr(struct emu_sc_info *sc, uint32_t data);
394 
395 static void	emu_vstop(struct emu_sc_info *sc, char channel, int enable);
396 
397 static void	emu_intr(void *p);
398 static void	emu_wrefx(struct emu_sc_info *sc, unsigned int pc, unsigned int data);
399 static void	emu_addefxop(struct emu_sc_info *sc, unsigned int op, unsigned int z, unsigned int w, unsigned int x, unsigned int y, uint32_t * pc);
400 static void	emu_initefx(struct emu_sc_info *sc);
401 
402 static int	emu_cardbus_init(struct emu_sc_info *sc);
403 static int	emu_init(struct emu_sc_info *sc);
404 static int	emu_uninit(struct emu_sc_info *sc);
405 
406 static int	emu_read_ivar(device_t bus __unused, device_t dev, int ivar_index, uintptr_t * result);
407 static int	emu_write_ivar(device_t bus __unused, device_t dev __unused,
408     int ivar_index, uintptr_t value __unused);
409 
410 static int	emu_pci_probe(device_t dev);
411 static int	emu_pci_attach(device_t dev);
412 static int	emu_pci_detach(device_t dev);
413 static int	emu_modevent(module_t mod __unused, int cmd, void *data __unused);
414 
415 #ifdef	SND_EMU10KX_DEBUG
416 
417 #define EMU_MTX_DEBUG() do { 						\
418 		if (mtx_owned(&sc->rw)) {				\
419 		printf("RW owned in %s line %d for %s\n", __func__,	\
420 			__LINE__ , device_get_nameunit(sc->dev));	\
421 		printf("rw lock owned: %d\n", mtx_owned(&sc->rw));	\
422 		printf("rw lock: value %x thread %x\n",			\
423 			((&sc->rw)->mtx_lock & ~MTX_FLAGMASK), 		\
424 			(uintptr_t)curthread);				\
425 		printf("rw lock: recursed %d\n", mtx_recursed(&sc->rw));\
426 		db_show_mtx(&sc->rw);					\
427 		}							\
428 	} while (0)
429 #else
430 #define EMU_MTX_DEBUG() do { 						\
431 	} while (0)
432 #endif
433 
434 #define EMU_RWLOCK() do {		\
435 	EMU_MTX_DEBUG();		\
436 	mtx_lock(&(sc->rw));		\
437 	} while (0)
438 
439 #define EMU_RWUNLOCK() do {		\
440 	mtx_unlock(&(sc->rw));		\
441 	EMU_MTX_DEBUG();		\
442 	} while (0)
443 
444 /* Supported cards */
445 struct emu_hwinfo {
446 	uint16_t	vendor;
447 	uint16_t	device;
448 	uint16_t	subvendor;
449 	uint16_t	subdevice;
450 	char		SBcode[8];
451 	char		desc[32];
452 	int		flags;
453 };
454 
455 static struct emu_hwinfo emu_cards[] = {
456 	{0xffff, 0xffff, 0xffff, 0xffff, "BADCRD", "Not a compatible card", 0},
457 	/* 0x0020..0x002f 4.0 EMU10K1 cards */
458 	{0x1102, 0x0002, 0x1102, 0x0020, "CT4850", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
459 	{0x1102, 0x0002, 0x1102, 0x0021, "CT4620", "SBLive!", HAS_AC97 | IS_EMU10K1},
460 	{0x1102, 0x0002, 0x1102, 0x002f, "CT????", "SBLive! mainboard implementation", HAS_AC97 | IS_EMU10K1},
461 
462 	/* (range unknown) 5.1 EMU10K1 cards */
463 	{0x1102, 0x0002, 0x1102, 0x100a, "CT????", "SBLive! 5.1", HAS_AC97 | HAS_51 | IS_EMU10K1},
464 
465 	/* 0x80??..0x805? 4.0 EMU10K1 cards */
466 	{0x1102, 0x0002, 0x1102, 0x8022, "CT4780", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
467 	{0x1102, 0x0002, 0x1102, 0x8023, "CT4790", "SB PCI512", HAS_AC97 | IS_EMU10K1},
468 	{0x1102, 0x0002, 0x1102, 0x8024, "CT4760", "SBLive!", HAS_AC97 | IS_EMU10K1},
469 	{0x1102, 0x0002, 0x1102, 0x8025, "CT????", "SBLive! Mainboard Implementation", HAS_AC97 | IS_EMU10K1},
470 	{0x1102, 0x0002, 0x1102, 0x8026, "CT4830", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
471 	{0x1102, 0x0002, 0x1102, 0x8027, "CT4832", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
472 	{0x1102, 0x0002, 0x1102, 0x8028, "CT4760", "SBLive! OEM version", HAS_AC97 | IS_EMU10K1},
473 	{0x1102, 0x0002, 0x1102, 0x8031, "CT4831", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
474 	{0x1102, 0x0002, 0x1102, 0x8040, "CT4760", "SBLive!", HAS_AC97 | IS_EMU10K1},
475 	{0x1102, 0x0002, 0x1102, 0x8051, "CT4850", "SBLive! Value", HAS_AC97 | IS_EMU10K1},
476 
477 	/* 0x8061..0x???? 5.1 EMU10K1  cards */
478 	{0x1102, 0x0002, 0x1102, 0x8061, "SB????", "SBLive! Player 5.1", HAS_AC97 | HAS_51 | IS_EMU10K1},
479 	{0x1102, 0x0002, 0x1102, 0x8062, "CT4830", "SBLive! 1024", HAS_AC97 | HAS_51 | IS_EMU10K1},
480 	{0x1102, 0x0002, 0x1102, 0x8064, "SB????", "SBLive! 5.1", HAS_AC97 | HAS_51 | IS_EMU10K1},
481 	{0x1102, 0x0002, 0x1102, 0x8065, "SB0220", "SBLive! 5.1 Digital", HAS_AC97 | HAS_51 | IS_EMU10K1},
482 	{0x1102, 0x0002, 0x1102, 0x8066, "CT4780", "SBLive! 5.1 Digital", HAS_AC97 | HAS_51 | IS_EMU10K1},
483 	{0x1102, 0x0002, 0x1102, 0x8067, "SB????", "SBLive!", HAS_AC97 | HAS_51 | IS_EMU10K1},
484 
485 	/* Generic SB Live! */
486 	{0x1102, 0x0002, 0x1102, 0x0000, "SB????", "SBLive! (Unknown model)", HAS_AC97 | IS_EMU10K1},
487 
488 	/* 0x0041..0x0043 EMU10K2 (some kind of Audigy) cards */
489 
490 	/* 0x0051..0x0051 5.1 CA0100-IAF cards */
491 	{0x1102, 0x0004, 0x1102, 0x0051, "SB0090", "Audigy", HAS_AC97 | HAS_51 | IS_EMU10K2},
492 	/* ES is CA0100-IDF chip that don't work in digital mode */
493 	{0x1102, 0x0004, 0x1102, 0x0052, "SB0160", "Audigy ES", HAS_AC97 | HAS_71 | IS_EMU10K2 | BROKEN_DIGITAL},
494 	/* 0x0053..0x005C 5.1 CA0101-NAF cards */
495 	{0x1102, 0x0004, 0x1102, 0x0053, "SB0090", "Audigy Player/OEM", HAS_AC97 | HAS_51 | IS_EMU10K2},
496 	{0x1102, 0x0004, 0x1102, 0x0058, "SB0090", "Audigy Player/OEM", HAS_AC97 | HAS_51 | IS_EMU10K2},
497 
498 	/* 0x1002..0x1009 5.1 CA0102-IAT cards */
499 	{0x1102, 0x0004, 0x1102, 0x1002, "SB????", "Audigy 2 Platinum", HAS_51 | IS_CA0102},
500 	{0x1102, 0x0004, 0x1102, 0x1005, "SB????", "Audigy 2 Platinum EX", HAS_51 | IS_CA0102},
501 	{0x1102, 0x0004, 0x1102, 0x1007, "SB0240", "Audigy 2", HAS_AC97 | HAS_51 | IS_CA0102},
502 
503 	/* 0x2001..0x2003 7.1 CA0102-ICT cards */
504 	{0x1102, 0x0004, 0x1102, 0x2001, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
505 	{0x1102, 0x0004, 0x1102, 0x2002, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
506 	/* XXX No reports about 0x2003 & 0x2004 cards */
507 	{0x1102, 0x0004, 0x1102, 0x2003, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
508 	{0x1102, 0x0004, 0x1102, 0x2004, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
509 	{0x1102, 0x0004, 0x1102, 0x2005, "SB0350", "Audigy 2 ZS", HAS_AC97 | HAS_71 | IS_CA0102},
510 
511 	/* (range unknown) 7.1 CA0102-xxx Audigy 4 cards */
512 	{0x1102, 0x0004, 0x1102, 0x2007, "SB0380", "Audigy 4 Pro", HAS_AC97 | HAS_71 | IS_CA0102},
513 
514 	/* Generic Audigy or Audigy 2 */
515 	{0x1102, 0x0004, 0x1102, 0x0000, "SB????", "Audigy (Unknown model)", HAS_AC97 | HAS_51 | IS_EMU10K2},
516 
517 	/* We don't support CA0103-DAT (Audigy LS) cards */
518 	/* There is NO CA0104-xxx cards */
519 	/* There is NO CA0105-xxx cards */
520 	/* We don't support CA0106-DAT (SB Live! 24 bit) cards */
521 	/* There is NO CA0107-xxx cards */
522 
523 	/* 0x1000..0x1001 7.1 CA0108-IAT cards */
524 	{0x1102, 0x0008, 0x1102, 0x1000, "SB????", "Audigy 2 LS", HAS_AC97 | HAS_51 | IS_CA0108 | DIGITAL_ONLY},
525 	{0x1102, 0x0008, 0x1102, 0x1001, "SB0400", "Audigy 2 Value", HAS_AC97 | HAS_71 | IS_CA0108 | DIGITAL_ONLY},
526 	{0x1102, 0x0008, 0x1102, 0x1021, "SB0610", "Audigy 4", HAS_AC97 | HAS_71 | IS_CA0108 | DIGITAL_ONLY},
527 
528 	{0x1102, 0x0008, 0x1102, 0x2001, "SB0530", "Audigy 2 ZS CardBus", HAS_AC97 | HAS_71 | IS_CA0108 | IS_CARDBUS},
529 
530 	{0x1102, 0x0008, 0x0000, 0x0000, "SB????", "Audigy 2 Value (Unknown model)", HAS_AC97 | HAS_51 | IS_CA0108},
531 };
532 /* Unsupported cards */
533 
534 static struct emu_hwinfo emu_bad_cards[] = {
535 	/* APS cards should be possible to support */
536 	{0x1102, 0x0002, 0x1102, 0x4001, "EMUAPS", "E-mu APS", 0},
537 	{0x1102, 0x0002, 0x1102, 0x4002, "EMUAPS", "E-mu APS", 0},
538 	{0x1102, 0x0004, 0x1102, 0x4001, "EMU???", "E-mu 1212m [4001]", 0},
539 	/* Similar-named ("Live!" or "Audigy") cards on different chipsets */
540 	{0x1102, 0x8064, 0x0000, 0x0000, "SB0100", "SBLive! 5.1 OEM", 0},
541 	{0x1102, 0x0006, 0x0000, 0x0000, "SB0200", "DELL OEM SBLive! Value", 0},
542 	{0x1102, 0x0007, 0x0000, 0x0000, "SB0310", "Audigy LS", 0},
543 };
544 
545 /*
546  * Get best known information about device.
547  */
548 static unsigned int
549 emu_getcard(device_t dev)
550 {
551 	uint16_t device;
552 	uint16_t subdevice;
553 	int n_cards;
554 	unsigned int thiscard;
555 	int i;
556 
557 	device = pci_read_config(dev, PCIR_DEVICE, /* bytes */ 2);
558 	subdevice = pci_read_config(dev, PCIR_SUBDEV_0, /* bytes */ 2);
559 
560 	n_cards = sizeof(emu_cards) / sizeof(struct emu_hwinfo);
561 	thiscard = 0;
562 	for (i = 1; i < n_cards; i++) {
563 		if (device == emu_cards[i].device) {
564 			if (subdevice == emu_cards[i].subdevice) {
565 				thiscard = i;
566 				break;
567 			}
568 			if (0x0000 == emu_cards[i].subdevice) {
569 				thiscard = i;
570 				/*
571 				 * don't break, we can get more specific card
572 				 * later in the list.
573 				 */
574 			}
575 		}
576 	}
577 
578 	n_cards = sizeof(emu_bad_cards) / sizeof(struct emu_hwinfo);
579 	for (i = 0; i < n_cards; i++) {
580 		if (device == emu_bad_cards[i].device) {
581 			if (subdevice == emu_bad_cards[i].subdevice) {
582 				thiscard = 0;
583 				break;
584 			}
585 			if (0x0000 == emu_bad_cards[i].subdevice) {
586 				thiscard = 0;
587 				break;	/* we avoid all this cards */
588 			}
589 		}
590 	}
591 	return (thiscard);
592 }
593 
594 
595 /*
596  * Base hardware interface are 32 (Audigy) or 64 (Audigy2) registers.
597  * Some of them are used directly, some of them provide pointer / data pairs.
598  */
599 static uint32_t
600 emu_rd_nolock(struct emu_sc_info *sc, unsigned int regno, unsigned int size)
601 {
602 
603 	KASSERT(sc != NULL, ("emu_rd: NULL sc"));
604 	switch (size) {
605 	case 1:
606 		return (bus_space_read_1(sc->st, sc->sh, regno));
607 	case 2:
608 		return (bus_space_read_2(sc->st, sc->sh, regno));
609 	case 4:
610 		return (bus_space_read_4(sc->st, sc->sh, regno));
611 	}
612 	return (0xffffffff);
613 }
614 
615 static void
616 emu_wr_nolock(struct emu_sc_info *sc, unsigned int regno, uint32_t data, unsigned int size)
617 {
618 
619 	KASSERT(sc != NULL, ("emu_rd: NULL sc"));
620 	switch (size) {
621 	case 1:
622 		bus_space_write_1(sc->st, sc->sh, regno, data);
623 		break;
624 	case 2:
625 		bus_space_write_2(sc->st, sc->sh, regno, data);
626 		break;
627 	case 4:
628 		bus_space_write_4(sc->st, sc->sh, regno, data);
629 		break;
630 	}
631 }
632 /*
633  * PTR / DATA interface. Access to EMU10Kx is made
634  * via (channel, register) pair. Some registers are channel-specific,
635  * some not.
636  */
637 uint32_t
638 emu_rdptr(struct emu_sc_info *sc, unsigned int chn, unsigned int reg)
639 {
640 	uint32_t ptr, val, mask, size, offset;
641 
642 	ptr = ((reg << 16) & sc->address_mask) | (chn & PTR_CHANNELNUM_MASK);
643 
644 	EMU_RWLOCK();
645 	emu_wr_nolock(sc, PTR, ptr, 4);
646 	val = emu_rd_nolock(sc, DATA, 4);
647 	EMU_RWUNLOCK();
648 
649 	/*
650 	 * XXX Some register numbers has data size and offset encoded in
651 	 * it to get only part of 32bit register. This use is not described
652 	 * in register name, be careful!
653 	 */
654 	if (reg & 0xff000000) {
655 		size = (reg >> 24) & 0x3f;
656 		offset = (reg >> 16) & 0x1f;
657 		mask = ((1 << size) - 1) << offset;
658 		val &= mask;
659 		val >>= offset;
660 	}
661 	return (val);
662 }
663 
664 void
665 emu_wrptr(struct emu_sc_info *sc, unsigned int chn, unsigned int reg, uint32_t data)
666 {
667 	uint32_t ptr, mask, size, offset;
668 
669 	ptr = ((reg << 16) & sc->address_mask) | (chn & PTR_CHANNELNUM_MASK);
670 
671 	EMU_RWLOCK();
672 	emu_wr_nolock(sc, PTR, ptr, 4);
673 	/*
674 	 * XXX Another kind of magic encoding in register number. This can
675 	 * give you side effect - it will read previous data from register
676 	 * and change only required bits.
677 	 */
678 	if (reg & 0xff000000) {
679 		size = (reg >> 24) & 0x3f;
680 		offset = (reg >> 16) & 0x1f;
681 		mask = ((1 << size) - 1) << offset;
682 		data <<= offset;
683 		data &= mask;
684 		data |= emu_rd_nolock(sc, DATA, 4) & ~mask;
685 	}
686 	emu_wr_nolock(sc, DATA, data, 4);
687 	EMU_RWUNLOCK();
688 }
689 /*
690  * PTR2 / DATA2 interface. Access to P16v is made
691  * via (channel, register) pair. Some registers are channel-specific,
692  * some not. This interface is supported by CA0102 and CA0108 chips only.
693  */
694 uint32_t
695 emu_rd_p16vptr(struct emu_sc_info *sc, uint16_t chn, uint16_t reg)
696 {
697 	uint32_t val;
698 
699 	/* XXX separate lock? */
700 	EMU_RWLOCK();
701 	emu_wr_nolock(sc, PTR2, (reg << 16) | chn, 4);
702 	val = emu_rd_nolock(sc, DATA2, 4);
703 
704 	EMU_RWUNLOCK();
705 
706 	return (val);
707 }
708 
709 void
710 emu_wr_p16vptr(struct emu_sc_info *sc, uint16_t chn, uint16_t reg, uint32_t data)
711 {
712 
713 	EMU_RWLOCK();
714 	emu_wr_nolock(sc, PTR2, (reg << 16) | chn, 4);
715 	emu_wr_nolock(sc, DATA2, data, 4);
716 	EMU_RWUNLOCK();
717 }
718 /*
719  * XXX CardBus interface. Not tested on any real hardware.
720  */
721 static void
722 emu_wr_cbptr(struct emu_sc_info *sc, uint32_t data)
723 {
724 	uint32_t val;
725 
726 	/*
727 	 * 0x38 is IPE3 (CD S/PDIF interrupt pending register) on CA0102. Seems
728 	 * to be some reg/value accessible kind of config register on CardBus
729 	 * CA0108, with value(?) in top 16 bit, address(?) in low 16
730 	 */
731 
732 	val = emu_rd_nolock(sc, 0x38, 4);
733 	emu_wr_nolock(sc, 0x38, data, 4);
734 	val = emu_rd_nolock(sc, 0x38, 4);
735 
736 }
737 
738 /*
739  * Direct hardware register access
740  * Assume that it is never used to access PTR-based registers and can run unlocked.
741  */
742 void
743 emu_wr(struct emu_sc_info *sc, unsigned int regno, uint32_t data, unsigned int size)
744 {
745 	KASSERT(regno != PTR, ("emu_wr: attempt to write to PTR"));
746 	KASSERT(regno != PTR2, ("emu_wr: attempt to write to PTR2"));
747 
748 	emu_wr_nolock(sc, regno, data, size);
749 }
750 
751 uint32_t
752 emu_rd(struct emu_sc_info *sc, unsigned int regno, unsigned int size)
753 {
754 	uint32_t rd;
755 
756 	KASSERT(regno != DATA, ("emu_rd: attempt to read DATA"));
757 	KASSERT(regno != DATA2, ("emu_rd: attempt to read DATA2"));
758 
759 	rd = emu_rd_nolock(sc, regno, size);
760 	return (rd);
761 }
762 
763 /*
764  * Enabling IR MIDI messages is another kind of black magic. It just
765  * has to be made this way. It really do it.
766  */
767 void
768 emu_enable_ir(struct emu_sc_info *sc)
769 {
770 	uint32_t iocfg;
771 
772 	if (sc->is_emu10k2 || sc->is_ca0102) {
773 		iocfg = emu_rd_nolock(sc, A_IOCFG, 2);
774 		emu_wr_nolock(sc, A_IOCFG, iocfg | A_IOCFG_GPOUT2, 2);
775 		DELAY(500);
776 		emu_wr_nolock(sc, A_IOCFG, iocfg | A_IOCFG_GPOUT1 | A_IOCFG_GPOUT2, 2);
777 		DELAY(500);
778 		emu_wr_nolock(sc, A_IOCFG, iocfg | A_IOCFG_GPOUT1, 2);
779 		DELAY(100);
780 		emu_wr_nolock(sc, A_IOCFG, iocfg, 2);
781 		device_printf(sc->dev, "Audigy IR MIDI events enabled.\n");
782 		sc->enable_ir = 1;
783 	}
784 	if (sc->is_emu10k1) {
785 		iocfg = emu_rd_nolock(sc, HCFG, 4);
786 		emu_wr_nolock(sc, HCFG, iocfg | HCFG_GPOUT2, 4);
787 		DELAY(500);
788 		emu_wr_nolock(sc, HCFG, iocfg | HCFG_GPOUT1 | HCFG_GPOUT2, 4);
789 		DELAY(100);
790 		emu_wr_nolock(sc, HCFG, iocfg, 4);
791 		device_printf(sc->dev, "SB Live! IR MIDI events enabled.\n");
792 		sc->enable_ir = 1;
793 	}
794 }
795 
796 
797 /*
798  * emu_timer_ - HW timer managment
799  */
800 int
801 emu_timer_create(struct emu_sc_info *sc)
802 {
803 	int i, timer;
804 
805 	timer = -1;
806 
807 	mtx_lock(&sc->lock);
808 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
809 		if (sc->timer[i] == 0) {
810 			sc->timer[i] = -1;	/* disable it */
811 			timer = i;
812 			mtx_unlock(&sc->lock);
813 			return (timer);
814 		}
815 	mtx_unlock(&sc->lock);
816 
817 	return (-1);
818 }
819 
820 int
821 emu_timer_set(struct emu_sc_info *sc, int timer, int delay)
822 {
823 	int i;
824 
825 	if (timer < 0)
826 		return (-1);
827 
828 	RANGE(delay, 16, 1024);
829 	RANGE(timer, 0, EMU_MAX_IRQ_CONSUMERS-1);
830 
831 	mtx_lock(&sc->lock);
832 	sc->timer[timer] = delay;
833 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
834 		if (sc->timerinterval > sc->timer[i])
835 			sc->timerinterval = sc->timer[i];
836 
837 	/* XXX */
838 	emu_wr(sc, TIMER, sc->timerinterval & 0x03ff, 2);
839 	mtx_unlock(&sc->lock);
840 
841 	return (timer);
842 }
843 
844 int
845 emu_timer_enable(struct emu_sc_info *sc, int timer, int go)
846 {
847 	uint32_t x;
848 	int ena_int;
849 	int i;
850 
851 	if (timer < 0)
852 		return (-1);
853 
854 	RANGE(timer, 0, EMU_MAX_IRQ_CONSUMERS-1);
855 
856 	mtx_lock(&sc->lock);
857 
858 	if ((go == 1) && (sc->timer[timer] < 0))
859 		sc->timer[timer] = -sc->timer[timer];
860 	if ((go == 0) && (sc->timer[timer] > 0))
861 		sc->timer[timer] = -sc->timer[timer];
862 
863 	ena_int = 0;
864 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++) {
865 		if (sc->timerinterval > sc->timer[i])
866 			sc->timerinterval = sc->timer[i];
867 		if (sc->timer[i] > 0)
868 			ena_int = 1;
869 	}
870 
871 	emu_wr(sc, TIMER, sc->timerinterval & 0x03ff, 2);
872 
873 	if (ena_int == 1) {
874 		x = emu_rd(sc, INTE, 4);
875 		x |= INTE_INTERVALTIMERENB;
876 		emu_wr(sc, INTE, x, 4);
877 	} else {
878 		x = emu_rd(sc, INTE, 4);
879 		x &= ~INTE_INTERVALTIMERENB;
880 		emu_wr(sc, INTE, x, 4);
881 	}
882 	mtx_unlock(&sc->lock);
883 	return (0);
884 }
885 
886 int
887 emu_timer_clear(struct emu_sc_info *sc, int timer)
888 {
889 	if (timer < 0)
890 		return (-1);
891 
892 	RANGE(timer, 0, EMU_MAX_IRQ_CONSUMERS-1);
893 
894 	emu_timer_enable(sc, timer, 0);
895 
896 	mtx_lock(&sc->lock);
897 	if (sc->timer[timer] != 0)
898 		sc->timer[timer] = 0;
899 	mtx_unlock(&sc->lock);
900 
901 	return (timer);
902 }
903 
904 /*
905  * emu_intr_ - HW interrupt handler managment
906  */
907 int
908 emu_intr_register(struct emu_sc_info *sc, uint32_t inte_mask, uint32_t intr_mask, uint32_t(*func) (void *softc, uint32_t irq), void *isc)
909 {
910 	int i;
911 	uint32_t x;
912 
913 	mtx_lock(&sc->lock);
914 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
915 		if (sc->ihandler[i].inte_mask == 0) {
916 			sc->ihandler[i].inte_mask = inte_mask;
917 			sc->ihandler[i].intr_mask = intr_mask;
918 			sc->ihandler[i].softc = isc;
919 			sc->ihandler[i].irq_func = func;
920 			x = emu_rd(sc, INTE, 4);
921 			x |= inte_mask;
922 			emu_wr(sc, INTE, x, 4);
923 			mtx_unlock(&sc->lock);
924 			if (sc->dbg_level > 1)
925 				device_printf(sc->dev, "ihandle %d registered\n", i);
926 
927 			return (i);
928 		}
929 	mtx_unlock(&sc->lock);
930 	if (sc->dbg_level > 1)
931 		device_printf(sc->dev, "ihandle not registered\n");
932 
933 	return (-1);
934 }
935 
936 int
937 emu_intr_unregister(struct emu_sc_info *sc, int hnumber)
938 {
939 	uint32_t x;
940 	int i;
941 
942 	mtx_lock(&sc->lock);
943 
944 	if (sc->ihandler[hnumber].inte_mask == 0) {
945 		mtx_unlock(&sc->lock);
946 		return (-1);
947 	}
948 
949 	x = emu_rd(sc, INTE, 4);
950 	x &= ~sc->ihandler[hnumber].inte_mask;
951 
952 	sc->ihandler[hnumber].inte_mask = 0;
953 	sc->ihandler[hnumber].intr_mask = 0;
954 	sc->ihandler[hnumber].softc = NULL;
955 	sc->ihandler[hnumber].irq_func = NULL;
956 
957 	/* other interrupt handlers may use this INTE value */
958 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
959 		if (sc->ihandler[i].inte_mask != 0)
960 			x |= sc->ihandler[i].inte_mask;
961 
962 	emu_wr(sc, INTE, x, 4);
963 
964 	mtx_unlock(&sc->lock);
965 	return (hnumber);
966 }
967 
968 static void
969 emu_intr(void *p)
970 {
971 	struct emu_sc_info *sc = (struct emu_sc_info *)p;
972 	uint32_t stat, ack;
973 	int i;
974 
975 	for (;;) {
976 		stat = emu_rd(sc, IPR, 4);
977 		ack = 0;
978 		if (stat == 0)
979 			break;
980 		emu_wr(sc, IPR, stat, 4);
981 		for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++) {
982 			if ((((sc->ihandler[i].intr_mask) & stat) != 0) &&
983 			    (((void *)sc->ihandler[i].irq_func) != NULL)) {
984 				ack |= sc->ihandler[i].irq_func(sc->ihandler[i].softc,
985 				    (sc->ihandler[i].intr_mask) & stat);
986 			}
987 		}
988 	if (sc->dbg_level > 1)
989 		if (stat & (~ack))
990 			device_printf(sc->dev, "Unhandled interrupt: %08x\n", stat & (~ack));
991 
992 	}
993 
994 	if ((sc->is_ca0102) || (sc->is_ca0108))
995 		for (;;) {
996 			stat = emu_rd(sc, IPR2, 4);
997 			ack = 0;
998 			if (stat == 0)
999 				break;
1000 			emu_wr(sc, IPR2, stat, 4);
1001 			if (sc->dbg_level > 1)
1002 				device_printf(sc->dev, "IPR2: %08x\n", stat);
1003 
1004 			break;	/* to avoid infinite loop. shoud be removed
1005 				 * after completion of P16V interface. */
1006 		}
1007 
1008 	if (sc->is_ca0102)
1009 		for (;;) {
1010 			stat = emu_rd(sc, IPR3, 4);
1011 			ack = 0;
1012 			if (stat == 0)
1013 				break;
1014 			emu_wr(sc, IPR3, stat, 4);
1015 			if (sc->dbg_level > 1)
1016 				device_printf(sc->dev, "IPR3: %08x\n", stat);
1017 
1018 			break;	/* to avoid infinite loop. should be removed
1019 				 * after completion of S/PDIF interface */
1020 		}
1021 }
1022 
1023 
1024 /*
1025  * Get data from private emu10kx structure for PCM buffer allocation.
1026  * Used by PCM code only.
1027  */
1028 bus_dma_tag_t
1029 emu_gettag(struct emu_sc_info *sc)
1030 {
1031 	return (sc->mem.dmat);
1032 }
1033 
1034 static void
1035 emu_setmap(void *arg, bus_dma_segment_t * segs, int nseg, int error)
1036 {
1037 	bus_addr_t *phys = (bus_addr_t *) arg;
1038 
1039 	*phys = error ? 0 : (bus_addr_t) segs->ds_addr;
1040 
1041 	if (bootverbose) {
1042 		printf("emu10kx: setmap (%lx, %lx), nseg=%d, error=%d\n",
1043 		    (unsigned long)segs->ds_addr, (unsigned long)segs->ds_len,
1044 		    nseg, error);
1045 	}
1046 }
1047 
1048 static void *
1049 emu_malloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr)
1050 {
1051 	void *dmabuf;
1052 	bus_dmamap_t map;
1053 	int error;
1054 
1055 	*addr = 0;
1056 	if ((error = bus_dmamem_alloc(mem->dmat, &dmabuf, BUS_DMA_NOWAIT, &map))) {
1057 		if (mem->card->dbg_level > 2)
1058 			device_printf(mem->card->dev, "emu_malloc: failed to alloc DMA map: %d\n", error);
1059 		return (NULL);
1060 		}
1061 	if ((error = bus_dmamap_load(mem->dmat, map, dmabuf, sz, emu_setmap, addr, 0)) || !*addr) {
1062 		if (mem->card->dbg_level > 2)
1063 			device_printf(mem->card->dev, "emu_malloc: failed to load DMA memory: %d\n", error);
1064 		return (NULL);
1065 		}
1066 	return (dmabuf);
1067 }
1068 
1069 static void
1070 emu_free(struct emu_mem *mem, void *dmabuf)
1071 {
1072 	bus_dmamem_free(mem->dmat, dmabuf, NULL);
1073 }
1074 
1075 static void *
1076 emu_memalloc(struct emu_mem *mem, uint32_t sz, bus_addr_t * addr, const char *owner)
1077 {
1078 	uint32_t blksz, start, idx, ofs, tmp, found;
1079 	struct emu_memblk *blk;
1080 	void *membuf;
1081 
1082 	blksz = sz / EMUPAGESIZE;
1083 	if (sz > (blksz * EMUPAGESIZE))
1084 		blksz++;
1085 	if (blksz > EMU_MAX_BUFSZ / EMUPAGESIZE) {
1086 		if (mem->card->dbg_level > 2)
1087 			device_printf(mem->card->dev, "emu_memalloc: memory request tool large\n");
1088 		return (NULL);
1089 		}
1090 	/* find a free block in the bitmap */
1091 	found = 0;
1092 	start = 1;
1093 	while (!found && start + blksz < EMU_MAXPAGES) {
1094 		found = 1;
1095 		for (idx = start; idx < start + blksz; idx++)
1096 			if (mem->bmap[idx >> 3] & (1 << (idx & 7)))
1097 				found = 0;
1098 		if (!found)
1099 			start++;
1100 	}
1101 	if (!found) {
1102 		if (mem->card->dbg_level > 2)
1103 			device_printf(mem->card->dev, "emu_memalloc: no free space in bitmap\n");
1104 		return (NULL);
1105 		}
1106 	blk = malloc(sizeof(*blk), M_DEVBUF, M_NOWAIT);
1107 	if (blk == NULL) {
1108 		if (mem->card->dbg_level > 2)
1109 			device_printf(mem->card->dev, "emu_memalloc: buffer allocation failed\n");
1110 		return (NULL);
1111 		}
1112 	bzero(blk, sizeof(*blk));
1113 	membuf = emu_malloc(mem, sz, &blk->buf_addr);
1114 	*addr = blk->buf_addr;
1115 	if (membuf == NULL) {
1116 		if (mem->card->dbg_level > 2)
1117 			device_printf(mem->card->dev, "emu_memalloc: can't setup HW memory\n");
1118 		free(blk, M_DEVBUF);
1119 		return (NULL);
1120 	}
1121 	blk->buf = membuf;
1122 	blk->pte_start = start;
1123 	blk->pte_size = blksz;
1124 	strncpy(blk->owner, owner, 15);
1125 	blk->owner[15] = '\0';
1126 	ofs = 0;
1127 	for (idx = start; idx < start + blksz; idx++) {
1128 		mem->bmap[idx >> 3] |= 1 << (idx & 7);
1129 		tmp = (uint32_t) (u_long) ((uint8_t *) blk->buf_addr + ofs);
1130 		mem->ptb_pages[idx] = (tmp << 1) | idx;
1131 		ofs += EMUPAGESIZE;
1132 	}
1133 	SLIST_INSERT_HEAD(&mem->blocks, blk, link);
1134 	return (membuf);
1135 }
1136 
1137 static int
1138 emu_memfree(struct emu_mem *mem, void *membuf)
1139 {
1140 	uint32_t idx, tmp;
1141 	struct emu_memblk *blk, *i;
1142 
1143 	blk = NULL;
1144 	SLIST_FOREACH(i, &mem->blocks, link) {
1145 		if (i->buf == membuf)
1146 			blk = i;
1147 	}
1148 	if (blk == NULL)
1149 		return (EINVAL);
1150 	SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
1151 	emu_free(mem, membuf);
1152 	tmp = (uint32_t) (mem->silent_page_addr) << 1;
1153 	for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
1154 		mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
1155 		mem->ptb_pages[idx] = tmp | idx;
1156 	}
1157 	free(blk, M_DEVBUF);
1158 	return (0);
1159 }
1160 
1161 static int
1162 emu_memstart(struct emu_mem *mem, void *membuf)
1163 {
1164 	struct emu_memblk *blk, *i;
1165 
1166 	blk = NULL;
1167 	SLIST_FOREACH(i, &mem->blocks, link) {
1168 		if (i->buf == membuf)
1169 			blk = i;
1170 	}
1171 	if (blk == NULL)
1172 		return (-1);
1173 	return (blk->pte_start);
1174 }
1175 
1176 
1177 static uint32_t
1178 emu_rate_to_pitch(uint32_t rate)
1179 {
1180 	static uint32_t logMagTable[128] = {
1181 		0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
1182 		0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
1183 		0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
1184 		0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
1185 		0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
1186 		0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
1187 		0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
1188 		0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
1189 		0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
1190 		0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
1191 		0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
1192 		0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
1193 		0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
1194 		0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
1195 		0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
1196 		0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
1197 	};
1198 	static char logSlopeTable[128] = {
1199 		0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
1200 		0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
1201 		0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
1202 		0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
1203 		0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
1204 		0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
1205 		0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
1206 		0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
1207 		0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
1208 		0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
1209 		0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
1210 		0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
1211 		0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
1212 		0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
1213 		0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
1214 		0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
1215 	};
1216 	int i;
1217 
1218 	if (rate == 0)
1219 		return (0);
1220 	rate *= 11185;		/* Scale 48000 to 0x20002380 */
1221 	for (i = 31; i > 0; i--) {
1222 		if (rate & 0x80000000) {	/* Detect leading "1" */
1223 			return (((uint32_t) (i - 15) << 20) +
1224 			    logMagTable[0x7f & (rate >> 24)] +
1225 			    (0x7f & (rate >> 17)) *
1226 			    logSlopeTable[0x7f & (rate >> 24)]);
1227 		}
1228 		rate <<= 1;
1229 	}
1230 	/* NOTREACHED */
1231 	return (0);
1232 }
1233 
1234 static uint32_t
1235 emu_rate_to_linearpitch(uint32_t rate)
1236 {
1237 	rate = (rate << 8) / 375;
1238 	return ((rate >> 1) + (rate & 1));
1239 }
1240 
1241 struct emu_voice *
1242 emu_valloc(struct emu_sc_info *sc)
1243 {
1244 	struct emu_voice *v;
1245 	int i;
1246 
1247 	v = NULL;
1248 	mtx_lock(&sc->lock);
1249 	for (i = 0; i < NUM_G && sc->voice[i].busy; i++);
1250 	if (i < NUM_G) {
1251 		v = &sc->voice[i];
1252 		v->busy = 1;
1253 	}
1254 	mtx_unlock(&sc->lock);
1255 	return (v);
1256 }
1257 
1258 void
1259 emu_vfree(struct emu_sc_info *sc, struct emu_voice *v)
1260 {
1261 	int i, r;
1262 
1263 	mtx_lock(&sc->lock);
1264 	for (i = 0; i < NUM_G; i++) {
1265 		if (v == &sc->voice[i] && sc->voice[i].busy) {
1266 			v->busy = 0;
1267 			/*
1268 			 * XXX What we should do with mono channels?
1269 			 * See -pcm.c emupchan_init for other side of
1270 			 * this problem
1271 			 */
1272 			if (v->slave != NULL)
1273 				r = emu_memfree(&sc->mem, v->vbuf);
1274 		}
1275 	}
1276 	mtx_unlock(&sc->lock);
1277 }
1278 
1279 int
1280 emu_vinit(struct emu_sc_info *sc, struct emu_voice *m, struct emu_voice *s,
1281     uint32_t sz, struct snd_dbuf *b)
1282 {
1283 	void *vbuf;
1284 	bus_addr_t tmp_addr;
1285 
1286 	vbuf = emu_memalloc(&sc->mem, sz, &tmp_addr, "vinit");
1287 	if (vbuf == NULL) {
1288 		if(sc->dbg_level > 2)
1289 			device_printf(sc->dev, "emu_memalloc returns NULL in enu_vinit\n");
1290 		return (ENOMEM);
1291 		}
1292 	if (b != NULL)
1293 		sndbuf_setup(b, vbuf, sz);
1294 	m->start = emu_memstart(&sc->mem, vbuf) * EMUPAGESIZE;
1295 	if (m->start < 0) {
1296 		if(sc->dbg_level > 2)
1297 			device_printf(sc->dev, "emu_memstart returns (-1) in enu_vinit\n");
1298 		emu_memfree(&sc->mem, vbuf);
1299 		return (ENOMEM);
1300 	}
1301 	m->end = m->start + sz;
1302 	m->speed = 0;
1303 	m->b16 = 0;
1304 	m->stereo = 0;
1305 	m->running = 0;
1306 	m->ismaster = 1;
1307 	m->vol = 0xff;
1308 	m->buf = tmp_addr;
1309 	m->vbuf = vbuf;
1310 	m->slave = s;
1311 	if (s != NULL) {
1312 		s->start = m->start;
1313 		s->end = m->end;
1314 		s->speed = 0;
1315 		s->b16 = 0;
1316 		s->stereo = 0;
1317 		s->running = 0;
1318 		s->ismaster = 0;
1319 		s->vol = m->vol;
1320 		s->buf = m->buf;
1321 		s->vbuf = NULL;
1322 		s->slave = NULL;
1323 	}
1324 	return (0);
1325 }
1326 
1327 void
1328 emu_vsetup(struct emu_voice *v, int fmt, int spd)
1329 {
1330 	if (fmt) {
1331 		v->b16 = (fmt & AFMT_16BIT) ? 1 : 0;
1332 		v->stereo = (AFMT_CHANNEL(fmt) > 1) ? 1 : 0;
1333 		if (v->slave != NULL) {
1334 			v->slave->b16 = v->b16;
1335 			v->slave->stereo = v->stereo;
1336 		}
1337 	}
1338 	if (spd) {
1339 		v->speed = spd;
1340 		if (v->slave != NULL)
1341 			v->slave->speed = v->speed;
1342 	}
1343 }
1344 
1345 void
1346 emu_vroute(struct emu_sc_info *sc, struct emu_route *rt,  struct emu_voice *v)
1347 {
1348 	int i;
1349 
1350 	for (i = 0; i < 8; i++) {
1351 		v->routing[i] = rt->routing_left[i];
1352 		v->amounts[i] = rt->amounts_left[i];
1353 	}
1354 	if ((v->stereo) && (v->ismaster == 0))
1355 		for (i = 0; i < 8; i++) {
1356 			v->routing[i] = rt->routing_right[i];
1357 			v->amounts[i] = rt->amounts_right[i];
1358 		}
1359 
1360 	if ((v->stereo) && (v->slave != NULL))
1361 		emu_vroute(sc, rt, v->slave);
1362 }
1363 
1364 void
1365 emu_vwrite(struct emu_sc_info *sc, struct emu_voice *v)
1366 {
1367 	int s;
1368 	uint32_t start, val, silent_page;
1369 
1370 	s = (v->stereo ? 1 : 0) + (v->b16 ? 1 : 0);
1371 
1372 	v->sa = v->start >> s;
1373 	v->ea = v->end >> s;
1374 
1375 
1376 	if (v->stereo) {
1377 		emu_wrptr(sc, v->vnum, CPF, CPF_STEREO_MASK);
1378 	} else {
1379 		emu_wrptr(sc, v->vnum, CPF, 0);
1380 	}
1381 	val = v->stereo ? 28 : 30;
1382 	val *= v->b16 ? 1 : 2;
1383 	start = v->sa + val;
1384 
1385 	if (sc->is_emu10k1) {
1386 		emu_wrptr(sc, v->vnum, FXRT, ((v->routing[3] << 12) |
1387 		    (v->routing[2] << 8) |
1388 		    (v->routing[1] << 4) |
1389 		    (v->routing[0] << 0)) << 16);
1390 	} else {
1391 		emu_wrptr(sc, v->vnum, A_FXRT1, (v->routing[3] << 24) |
1392 		    (v->routing[2] << 16) |
1393 		    (v->routing[1] << 8) |
1394 		    (v->routing[0] << 0));
1395 		emu_wrptr(sc, v->vnum, A_FXRT2, (v->routing[7] << 24) |
1396 		    (v->routing[6] << 16) |
1397 		    (v->routing[5] << 8) |
1398 		    (v->routing[4] << 0));
1399 		emu_wrptr(sc, v->vnum, A_SENDAMOUNTS, (v->amounts[7] << 24) |
1400 		    (v->amounts[6] << 26) |
1401 		    (v->amounts[5] << 8) |
1402 		    (v->amounts[4] << 0));
1403 	}
1404 	emu_wrptr(sc, v->vnum, PTRX, (v->amounts[0] << 8) | (v->amounts[1] << 0));
1405 	emu_wrptr(sc, v->vnum, DSL, v->ea | (v->amounts[3] << 24));
1406 	emu_wrptr(sc, v->vnum, PSST, v->sa | (v->amounts[2] << 24));
1407 
1408 	emu_wrptr(sc, v->vnum, CCCA, start | (v->b16 ? 0 : CCCA_8BITSELECT));
1409 	emu_wrptr(sc, v->vnum, Z1, 0);
1410 	emu_wrptr(sc, v->vnum, Z2, 0);
1411 
1412 	silent_page = ((uint32_t) (sc->mem.silent_page_addr) << 1) | MAP_PTI_MASK;
1413 	emu_wrptr(sc, v->vnum, MAPA, silent_page);
1414 	emu_wrptr(sc, v->vnum, MAPB, silent_page);
1415 
1416 	emu_wrptr(sc, v->vnum, CVCF, CVCF_CURRENTFILTER_MASK);
1417 	emu_wrptr(sc, v->vnum, VTFT, VTFT_FILTERTARGET_MASK);
1418 	emu_wrptr(sc, v->vnum, ATKHLDM, 0);
1419 	emu_wrptr(sc, v->vnum, DCYSUSM, DCYSUSM_DECAYTIME_MASK);
1420 	emu_wrptr(sc, v->vnum, LFOVAL1, 0x8000);
1421 	emu_wrptr(sc, v->vnum, LFOVAL2, 0x8000);
1422 	emu_wrptr(sc, v->vnum, FMMOD, 0);
1423 	emu_wrptr(sc, v->vnum, TREMFRQ, 0);
1424 	emu_wrptr(sc, v->vnum, FM2FRQ2, 0);
1425 	emu_wrptr(sc, v->vnum, ENVVAL, 0x8000);
1426 
1427 	emu_wrptr(sc, v->vnum, ATKHLDV, ATKHLDV_HOLDTIME_MASK | ATKHLDV_ATTACKTIME_MASK);
1428 	emu_wrptr(sc, v->vnum, ENVVOL, 0x8000);
1429 
1430 	emu_wrptr(sc, v->vnum, PEFE_FILTERAMOUNT, 0x7f);
1431 	emu_wrptr(sc, v->vnum, PEFE_PITCHAMOUNT, 0);
1432 	if ((v->stereo) && (v->slave != NULL))
1433 		emu_vwrite(sc, v->slave);
1434 }
1435 
1436 static void
1437 emu_vstop(struct emu_sc_info *sc, char channel, int enable)
1438 {
1439 	int reg;
1440 
1441 	reg = (channel & 0x20) ? SOLEH : SOLEL;
1442 	channel &= 0x1f;
1443 	reg |= 1 << 24;
1444 	reg |= channel << 16;
1445 	emu_wrptr(sc, 0, reg, enable);
1446 }
1447 
1448 void
1449 emu_vtrigger(struct emu_sc_info *sc, struct emu_voice *v, int go)
1450 {
1451 	uint32_t pitch_target, initial_pitch;
1452 	uint32_t cra, cs, ccis;
1453 	uint32_t sample, i;
1454 
1455 	if (go) {
1456 		cra = 64;
1457 		cs = v->stereo ? 4 : 2;
1458 		ccis = v->stereo ? 28 : 30;
1459 		ccis *= v->b16 ? 1 : 2;
1460 		sample = v->b16 ? 0x00000000 : 0x80808080;
1461 		for (i = 0; i < cs; i++)
1462 			emu_wrptr(sc, v->vnum, CD0 + i, sample);
1463 		emu_wrptr(sc, v->vnum, CCR_CACHEINVALIDSIZE, 0);
1464 		emu_wrptr(sc, v->vnum, CCR_READADDRESS, cra);
1465 		emu_wrptr(sc, v->vnum, CCR_CACHEINVALIDSIZE, ccis);
1466 
1467 		emu_wrptr(sc, v->vnum, IFATN, 0xff00);
1468 		emu_wrptr(sc, v->vnum, VTFT, 0xffffffff);
1469 		emu_wrptr(sc, v->vnum, CVCF, 0xffffffff);
1470 		emu_wrptr(sc, v->vnum, DCYSUSV, 0x00007f7f);
1471 		emu_vstop(sc, v->vnum, 0);
1472 
1473 		pitch_target = emu_rate_to_linearpitch(v->speed);
1474 		initial_pitch = emu_rate_to_pitch(v->speed) >> 8;
1475 		emu_wrptr(sc, v->vnum, PTRX_PITCHTARGET, pitch_target);
1476 		emu_wrptr(sc, v->vnum, CPF_CURRENTPITCH, pitch_target);
1477 		emu_wrptr(sc, v->vnum, IP, initial_pitch);
1478 	} else {
1479 		emu_wrptr(sc, v->vnum, PTRX_PITCHTARGET, 0);
1480 		emu_wrptr(sc, v->vnum, CPF_CURRENTPITCH, 0);
1481 		emu_wrptr(sc, v->vnum, IFATN, 0xffff);
1482 		emu_wrptr(sc, v->vnum, VTFT, 0x0000ffff);
1483 		emu_wrptr(sc, v->vnum, CVCF, 0x0000ffff);
1484 		emu_wrptr(sc, v->vnum, IP, 0);
1485 		emu_vstop(sc, v->vnum, 1);
1486 	}
1487 	if ((v->stereo) && (v->slave != NULL))
1488 		emu_vtrigger(sc, v->slave, go);
1489 }
1490 
1491 int
1492 emu_vpos(struct emu_sc_info *sc, struct emu_voice *v)
1493 {
1494 	int s, ptr;
1495 
1496 	s = (v->b16 ? 1 : 0) + (v->stereo ? 1 : 0);
1497 	ptr = (emu_rdptr(sc, v->vnum, CCCA_CURRADDR) - (v->start >> s)) << s;
1498 	return (ptr & ~0x0000001f);
1499 }
1500 
1501 
1502 /* fx */
1503 static void
1504 emu_wrefx(struct emu_sc_info *sc, unsigned int pc, unsigned int data)
1505 {
1506 	emu_wrptr(sc, 0, sc->code_base + pc, data);
1507 }
1508 
1509 
1510 static void
1511 emu_addefxop(struct emu_sc_info *sc, unsigned int op, unsigned int z, unsigned int w, unsigned int x, unsigned int y, uint32_t * pc)
1512 {
1513 	if ((*pc) + 1 > sc->code_size) {
1514 		device_printf(sc->dev, "DSP CODE OVERRUN: attept to write past code_size (pc=%d)\n", (*pc));
1515 		return;
1516 	}
1517 	emu_wrefx(sc, (*pc) * 2, (x << sc->high_operand_shift) | y);
1518 	emu_wrefx(sc, (*pc) * 2 + 1, (op << sc->opcode_shift) | (z << sc->high_operand_shift) | w);
1519 	(*pc)++;
1520 }
1521 
1522 static int
1523 sysctl_emu_mixer_control(SYSCTL_HANDLER_ARGS)
1524 {
1525 	struct emu_sc_info *sc;
1526 	int	mixer_id;
1527 	int	new_vol;
1528 	int	err;
1529 
1530 	sc = arg1;
1531 	mixer_id = arg2;
1532 
1533 	new_vol = emumix_get_volume(sc, mixer_id);
1534 	err = sysctl_handle_int(oidp, &new_vol, 0, req);
1535 
1536 	if (err || req->newptr == NULL)
1537 		return (err);
1538 	if (new_vol < 0 || new_vol > 100)
1539 		return (EINVAL);
1540 	emumix_set_volume(sc, mixer_id, new_vol);
1541 
1542 	return (0);
1543 }
1544 
1545 static int
1546 emu_addefxmixer(struct emu_sc_info *sc, const char *mix_name, const int mix_id, uint32_t defvolume)
1547 {
1548 	int volgpr;
1549 	char	sysctl_name[32];
1550 
1551 	volgpr = emu_rm_gpr_alloc(sc->rm, 1);
1552 	emumix_set_fxvol(sc, volgpr, defvolume);
1553 	/*
1554 	 * Mixer controls with NULL mix_name are handled
1555 	 * by AC97 emulation code or PCM mixer.
1556 	 */
1557 	if (mix_name != NULL) {
1558 		/*
1559 		 * Temporary sysctls should start with underscore,
1560 		 * see freebsd-current mailing list, emu10kx driver
1561 		 * discussion around 2006-05-24.
1562 		 */
1563 		snprintf(sysctl_name, 32, "_%s", mix_name);
1564 		SYSCTL_ADD_PROC(sc->ctx,
1565 			SYSCTL_CHILDREN(sc->root),
1566 			OID_AUTO, sysctl_name,
1567 			CTLTYPE_INT | CTLFLAG_RW, sc, mix_id,
1568 			sysctl_emu_mixer_control, "I", "");
1569 	}
1570 
1571 	return (volgpr);
1572 }
1573 
1574 static int
1575 sysctl_emu_digitalswitch_control(SYSCTL_HANDLER_ARGS)
1576 {
1577 	struct emu_sc_info *sc;
1578 	int	new_val;
1579 	int	err;
1580 
1581 	sc = arg1;
1582 
1583 	new_val = (sc->mode == MODE_DIGITAL) ? 1 : 0;
1584 	err = sysctl_handle_int(oidp, &new_val, 0, req);
1585 
1586 	if (err || req->newptr == NULL)
1587 		return (err);
1588 	if (new_val < 0 || new_val > 1)
1589 		return (EINVAL);
1590 
1591 	switch (new_val) {
1592 		case 0:
1593 			emumix_set_mode(sc, MODE_ANALOG);
1594 			break;
1595 		case 1:
1596 			emumix_set_mode(sc, MODE_DIGITAL);
1597 			break;
1598 	}
1599 	return (0);
1600 }
1601 
1602 static void
1603 emu_digitalswitch(struct emu_sc_info *sc)
1604 {
1605 	/* XXX temporary? */
1606 	SYSCTL_ADD_PROC(sc->ctx,
1607 		SYSCTL_CHILDREN(sc->root),
1608 		OID_AUTO, "_digital",
1609 		CTLTYPE_INT | CTLFLAG_RW, sc, 0,
1610 		sysctl_emu_digitalswitch_control, "I", "Enable digital output");
1611 
1612 	return;
1613 }
1614 
1615 /*
1616  * Allocate cache GPRs that will hold mixed output channels
1617  * and clear it on every DSP run.
1618  */
1619 #define	EFX_CACHE(CACHE_IDX) do {				\
1620 	sc->cache_gpr[CACHE_IDX] = emu_rm_gpr_alloc(sc->rm, 1); \
1621 	emu_addefxop(sc, ACC3, 					\
1622 		GPR(sc->cache_gpr[CACHE_IDX]), 			\
1623 		DSP_CONST(0), 					\
1624 		DSP_CONST(0), 					\
1625 		DSP_CONST(0), 					\
1626 		&pc);						\
1627 } while (0)
1628 
1629 /* Allocate GPR for volume control and route sound: OUT = OUT + IN * VOL */
1630 #define	EFX_ROUTE(TITLE, INP_NR, IN_GPR_IDX, OUT_CACHE_IDX, DEF) do { 	\
1631 	sc->mixer_gpr[IN_GPR_IDX] = emu_addefxmixer(sc, TITLE, IN_GPR_IDX,  DEF); \
1632 	sc->mixer_volcache[IN_GPR_IDX] = DEF; 			\
1633 	emu_addefxop(sc, MACS, 					\
1634 		GPR(sc->cache_gpr[OUT_CACHE_IDX]), 		\
1635 		GPR(sc->cache_gpr[OUT_CACHE_IDX]),		\
1636 		INP_NR,						\
1637 		GPR(sc->mixer_gpr[IN_GPR_IDX]),			\
1638 		&pc);						\
1639 } while (0)
1640 
1641 /* allocate GPR, OUT = IN * VOL */
1642 #define	EFX_OUTPUT(TITLE, OUT_CACHE_IDX, OUT_GPR_IDX, OUTP_NR, DEF) do {	\
1643 	sc->mixer_gpr[OUT_GPR_IDX] = emu_addefxmixer(sc, TITLE, OUT_GPR_IDX, DEF); \
1644 	sc->mixer_volcache[OUT_GPR_IDX] = DEF;			\
1645 	emu_addefxop(sc, MACS,					\
1646 		OUTP(OUTP_NR),					\
1647 		DSP_CONST(0),					\
1648 		GPR(sc->cache_gpr[OUT_CACHE_IDX]),		\
1649 		GPR(sc->mixer_gpr[OUT_GPR_IDX]),		\
1650 		&pc);						\
1651 } while (0)
1652 
1653 /* like EFX_OUTPUT, but don't allocate mixer gpr */
1654 #define	EFX_OUTPUTD(OUT_CACHE_IDX, OUT_GPR_IDX, OUTP_NR) do {	\
1655 	emu_addefxop(sc, MACS,					\
1656 		OUTP(OUTP_NR),					\
1657 		DSP_CONST(0),					\
1658 		GPR(sc->cache_gpr[OUT_CACHE_IDX]),		\
1659 		GPR(sc->mixer_gpr[OUT_GPR_IDX]),		\
1660 		&pc);						\
1661 } while (0)
1662 
1663 /* skip next OPCOUNT instructions if FLAG != 0 */
1664 #define EFX_SKIP(OPCOUNT, FLAG_GPR) do {			\
1665 	emu_addefxop(sc, MACS,					\
1666 		DSP_CONST(0),					\
1667 		GPR(sc->mute_gpr[FLAG_GPR]),					\
1668 		DSP_CONST(0),					\
1669 		DSP_CONST(0),					\
1670 		&pc);						\
1671 	emu_addefxop(sc, SKIP,					\
1672 		DSP_CCR,					\
1673 		DSP_CCR,					\
1674 		COND_NEQ_ZERO,					\
1675 		OPCOUNT,					\
1676 		&pc);						\
1677 } while (0)
1678 
1679 #define EFX_COPY(TO, FROM) do {					\
1680 	emu_addefxop(sc, ACC3,					\
1681 		TO,						\
1682 		DSP_CONST(0),					\
1683 		DSP_CONST(0),					\
1684 		FROM,						\
1685 		&pc);						\
1686 } while (0)
1687 
1688 
1689 static void
1690 emu_initefx(struct emu_sc_info *sc)
1691 {
1692 	unsigned int i;
1693 	uint32_t pc;
1694 
1695 	/* stop DSP */
1696 	if (sc->is_emu10k1) {
1697 		emu_wrptr(sc, 0, DBG, EMU10K1_DBG_SINGLE_STEP);
1698 	} else {
1699 		emu_wrptr(sc, 0, A_DBG, A_DBG_SINGLE_STEP);
1700 	}
1701 
1702 	/* code size is in instructions */
1703 	pc = 0;
1704 	for (i = 0; i < sc->code_size; i++) {
1705 		if (sc->is_emu10k1) {
1706 			emu_addefxop(sc, ACC3, DSP_CONST(0x0), DSP_CONST(0x0), DSP_CONST(0x0), DSP_CONST(0x0), &pc);
1707 		} else {
1708 			emu_addefxop(sc, SKIP, DSP_CONST(0x0), DSP_CONST(0x0), DSP_CONST(0xf), DSP_CONST(0x0), &pc);
1709 		}
1710 	}
1711 
1712 	/* allocate GPRs for mute switches (EFX_SKIP). Mute by default */
1713 	for (i = 0; i < NUM_MUTE; i++) {
1714 		sc->mute_gpr[i] = emu_rm_gpr_alloc(sc->rm, 1);
1715 		emumix_set_gpr(sc, sc->mute_gpr[i], 1);
1716 	}
1717 	emu_digitalswitch(sc);
1718 
1719 	pc = 0;
1720 
1721 	/*
1722 	 * DSP code below is not good, because:
1723 	 * 1. It can be written smaller, if it can use DSP accumulator register
1724 	 * instead of cache_gpr[].
1725 	 * 2. It can be more careful when volume is 100%, because in DSP
1726 	 * x*0x7fffffff may not be equal to x !
1727 	 */
1728 
1729 	/* clean outputs */
1730 	for (i = 0; i < 16 ; i++) {
1731 		emu_addefxop(sc, ACC3, OUTP(i), DSP_CONST(0), DSP_CONST(0), DSP_CONST(0), &pc);
1732 	}
1733 
1734 
1735 	if (sc->is_emu10k1) {
1736 		EFX_CACHE(C_FRONT_L);
1737 		EFX_CACHE(C_FRONT_R);
1738 		EFX_CACHE(C_REC_L);
1739 		EFX_CACHE(C_REC_R);
1740 
1741 		/* fx0 to front/record, 100%/muted by default */
1742 		EFX_ROUTE("pcm_front_l", FX(0), M_FX0_FRONT_L, C_FRONT_L, 100);
1743 		EFX_ROUTE("pcm_front_r", FX(1), M_FX1_FRONT_R, C_FRONT_R, 100);
1744 		EFX_ROUTE(NULL, FX(0), M_FX0_REC_L, C_REC_L, 0);
1745 		EFX_ROUTE(NULL, FX(1), M_FX1_REC_R, C_REC_R, 0);
1746 
1747 		/* in0, from AC97 codec output */
1748 		EFX_ROUTE("ac97_front_l", INP(IN_AC97_L), M_IN0_FRONT_L, C_FRONT_L, 0);
1749 		EFX_ROUTE("ac97_front_r", INP(IN_AC97_R), M_IN0_FRONT_R, C_FRONT_R, 0);
1750 		EFX_ROUTE("ac97_rec_l", INP(IN_AC97_L), M_IN0_REC_L, C_REC_L, 0);
1751 		EFX_ROUTE("ac97_rec_r", INP(IN_AC97_R), M_IN0_REC_R, C_REC_R, 0);
1752 
1753 		/* in1, from CD S/PDIF */
1754 		/* XXX EFX_SKIP 4 assumes that each EFX_ROUTE is one DSP op */
1755 		EFX_SKIP(4, CDSPDIFMUTE);
1756 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_L), M_IN1_FRONT_L, C_FRONT_L, 0);
1757 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_R), M_IN1_FRONT_R, C_FRONT_R, 0);
1758 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_L), M_IN1_REC_L, C_REC_L, 0);
1759 		EFX_ROUTE(NULL, INP(IN_SPDIF_CD_R), M_IN1_REC_R, C_REC_R, 0);
1760 
1761 		if (sc->dbg_level > 0) {
1762 			/* in2, ZoomVide (???) */
1763 			EFX_ROUTE("zoom_front_l", INP(IN_ZOOM_L), M_IN2_FRONT_L, C_FRONT_L, 0);
1764 			EFX_ROUTE("zoom_front_r", INP(IN_ZOOM_R), M_IN2_FRONT_R, C_FRONT_R, 0);
1765 			EFX_ROUTE("zoom_rec_l", INP(IN_ZOOM_L), M_IN2_REC_L, C_REC_L, 0);
1766 			EFX_ROUTE("zoom_rec_r", INP(IN_ZOOM_R), M_IN2_REC_R, C_REC_R, 0);
1767 		}
1768 
1769 		/* in3, TOSLink  */
1770 		EFX_ROUTE(NULL, INP(IN_TOSLINK_L), M_IN3_FRONT_L, C_FRONT_L, 0);
1771 		EFX_ROUTE(NULL, INP(IN_TOSLINK_R), M_IN3_FRONT_R, C_FRONT_R, 0);
1772 		EFX_ROUTE(NULL, INP(IN_TOSLINK_L), M_IN3_REC_L, C_REC_L, 0);
1773 		EFX_ROUTE(NULL, INP(IN_TOSLINK_R), M_IN3_REC_R, C_REC_R, 0);
1774 		/* in4, LineIn  */
1775 		EFX_ROUTE(NULL, INP(IN_LINE1_L), M_IN4_FRONT_L, C_FRONT_L, 0);
1776 		EFX_ROUTE(NULL, INP(IN_LINE1_R), M_IN4_FRONT_R, C_FRONT_R, 0);
1777 		EFX_ROUTE(NULL, INP(IN_LINE1_L), M_IN4_REC_L, C_REC_L, 0);
1778 		EFX_ROUTE(NULL, INP(IN_LINE1_R), M_IN4_REC_R, C_REC_R, 0);
1779 
1780 		/* in5, on-card S/PDIF */
1781 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_L), M_IN5_FRONT_L, C_FRONT_L, 0);
1782 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_R), M_IN5_FRONT_R, C_FRONT_R, 0);
1783 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_L), M_IN5_REC_L, C_REC_L, 0);
1784 		EFX_ROUTE(NULL, INP(IN_COAX_SPDIF_R), M_IN5_REC_R, C_REC_R, 0);
1785 
1786 		/* in6, Line2 on Live!Drive */
1787 		EFX_ROUTE(NULL, INP(IN_LINE2_L), M_IN6_FRONT_L, C_FRONT_L, 0);
1788 		EFX_ROUTE(NULL, INP(IN_LINE2_R), M_IN6_FRONT_R, C_FRONT_R, 0);
1789 		EFX_ROUTE(NULL, INP(IN_LINE2_L), M_IN6_REC_L, C_REC_L, 0);
1790 		EFX_ROUTE(NULL, INP(IN_LINE2_R), M_IN6_REC_R, C_REC_R, 0);
1791 
1792 		if (sc->dbg_level > 0) {
1793 			/* in7, unknown */
1794 			EFX_ROUTE("in7_front_l", INP(0xE), M_IN7_FRONT_L, C_FRONT_L, 0);
1795 			EFX_ROUTE("in7_front_r", INP(0xF), M_IN7_FRONT_R, C_FRONT_R, 0);
1796 			EFX_ROUTE("in7_rec_l", INP(0xE), M_IN7_REC_L, C_REC_L, 0);
1797 			EFX_ROUTE("in7_rec_r", INP(0xF), M_IN7_REC_R, C_REC_R, 0);
1798 		}
1799 
1800 		/* analog and digital */
1801 		EFX_OUTPUT("master_front_l", C_FRONT_L, M_MASTER_FRONT_L, OUT_AC97_L, 100);
1802 		EFX_OUTPUT("master_front_r", C_FRONT_R, M_MASTER_FRONT_R, OUT_AC97_R, 100);
1803 		/* S/PDIF */
1804 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, OUT_TOSLINK_L);
1805 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, OUT_TOSLINK_R);
1806 		/* Headphones */
1807 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, OUT_HEADPHONE_L);
1808 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, OUT_HEADPHONE_R);
1809 
1810 		/* rec output to "ADC" */
1811 		EFX_OUTPUT("master_rec_l", C_REC_L, M_MASTER_REC_L, OUT_ADC_REC_L, 100);
1812 		EFX_OUTPUT("master_rec_r", C_REC_R, M_MASTER_REC_R, OUT_ADC_REC_R, 100);
1813 
1814 		if (!(sc->mch_disabled)) {
1815 			/*
1816 			 * Additional channel volume is controlled by mixer in
1817 			 * emu_dspmixer_set() in -pcm.c
1818 			 */
1819 
1820 			/* fx2/3 (pcm1) to rear */
1821 			EFX_CACHE(C_REAR_L);
1822 			EFX_CACHE(C_REAR_R);
1823 			EFX_ROUTE(NULL, FX(2), M_FX2_REAR_L, C_REAR_L, 100);
1824 			EFX_ROUTE(NULL, FX(3), M_FX3_REAR_R, C_REAR_R, 100);
1825 
1826 			EFX_OUTPUT(NULL, C_REAR_L, M_MASTER_REAR_L, OUT_REAR_L, 100);
1827 			EFX_OUTPUT(NULL, C_REAR_R, M_MASTER_REAR_R, OUT_REAR_R, 100);
1828 			if (sc->has_51) {
1829 				/* fx4 (pcm2) to center */
1830 				EFX_CACHE(C_CENTER);
1831 				EFX_ROUTE(NULL, FX(4), M_FX4_CENTER, C_CENTER, 100);
1832 				EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, OUT_D_CENTER, 100);
1833 
1834 				/* XXX in digital mode (default) this should be muted because
1835 				this output is shared with digital out */
1836 				EFX_SKIP(1, ANALOGMUTE);
1837 				EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, OUT_A_CENTER);
1838 
1839 				/* fx5 (pcm3) to sub */
1840 				EFX_CACHE(C_SUB);
1841 				EFX_ROUTE(NULL, FX(5), M_FX5_SUBWOOFER, C_SUB, 100);
1842 				EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, OUT_D_SUB, 100);
1843 
1844 				/* XXX in digital mode (default) this should be muted because
1845 				this output is shared with digital out */
1846 				EFX_SKIP(1, ANALOGMUTE);
1847 				EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, OUT_A_SUB);
1848 
1849 			}
1850 		} else {
1851 			/* SND_EMU10KX_MULTICHANNEL_DISABLED */
1852 			EFX_OUTPUT(NULL, C_FRONT_L, M_MASTER_REAR_L, OUT_REAR_L, 57); /* 75%*75% */
1853 			EFX_OUTPUT(NULL, C_FRONT_R, M_MASTER_REAR_R, OUT_REAR_R, 57); /* 75%*75% */
1854 
1855 #if 0
1856 			/* XXX 5.1 does not work */
1857 
1858 			if (sc->has_51) {
1859 				/* (fx0+fx1)/2 to center */
1860 				EFX_CACHE(C_CENTER);
1861 				emu_addefxop(sc, MACS,
1862 					GPR(sc->cache_gpr[C_CENTER]),
1863 					GPR(sc->cache_gpr[C_CENTER]),
1864 					DSP_CONST(0xd), /* = 1/2 */
1865 					GPR(sc->cache_gpr[C_FRONT_L]),
1866 					&pc);
1867 				emu_addefxop(sc, MACS,
1868 					GPR(sc->cache_gpr[C_CENTER]),
1869 					GPR(sc->cache_gpr[C_CENTER]),
1870 					DSP_CONST(0xd), /* = 1/2 */
1871 					GPR(sc->cache_gpr[C_FRONT_R]),
1872 					&pc);
1873 				EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, OUT_D_CENTER, 100);
1874 
1875 				/* XXX in digital mode (default) this should be muted because
1876 				this output is shared with digital out */
1877 				EFX_SKIP(1, ANALOGMUTE);
1878 				EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, OUT_A_CENTER);
1879 
1880 				/* (fx0+fx1)/2  to sub */
1881 				EFX_CACHE(C_SUB);
1882 				emu_addefxop(sc, MACS,
1883 					GPR(sc->cache_gpr[C_CENTER]),
1884 					GPR(sc->cache_gpr[C_CENTER]),
1885 					DSP_CONST(0xd), /* = 1/2 */
1886 					GPR(sc->cache_gpr[C_FRONT_L]),
1887 					&pc);
1888 				emu_addefxop(sc, MACS,
1889 					GPR(sc->cache_gpr[C_CENTER]),
1890 					GPR(sc->cache_gpr[C_CENTER]),
1891 					DSP_CONST(0xd), /* = 1/2 */
1892 					GPR(sc->cache_gpr[C_FRONT_R]),
1893 					&pc);
1894 				/* XXX add lowpass filter here */
1895 
1896 				EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, OUT_D_SUB, 100);
1897 
1898 				/* XXX in digital mode (default) this should be muted because
1899 				this output is shared with digital out */
1900 				EFX_SKIP(1, ANALOGMUTE);
1901 				EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, OUT_A_SUB);
1902 			}
1903 #endif
1904 		} /* !mch_disabled */
1905 		if (sc->mch_rec) {
1906 			/*
1907 			 * MCH RECORDING , hight 16 slots. On 5.1 cards first 4 slots
1908 			 * are used as outputs and already filled with data
1909 			 */
1910 			/*
1911 			 * XXX On Live! cards stream does not begin at zero offset.
1912 			 * It can be HW, driver or sound buffering problem.
1913 			 * Use sync substream (offset 0x3E) to let userland find
1914 			 * correct data.
1915 			 */
1916 
1917 			/*
1918 			 * Substream map (in byte offsets, each substream is 2 bytes):
1919 			 *	0x00..0x1E - outputs
1920 			 *	0x20..0x3E - FX, inputs ans sync stream
1921 			 */
1922 
1923 			/* First 2 channels (offset 0x20,0x22) are empty */
1924 			for(i = (sc->has_51 ? 2 : 0); i < 2; i++)
1925 				EFX_COPY(FX2(i), DSP_CONST(0));
1926 
1927 			/* PCM Playback monitoring, offset 0x24..0x2A */
1928 			for(i = 0; i < 4; i++)
1929 				EFX_COPY(FX2(i+2), FX(i));
1930 
1931 			/* Copy of some inputs, offset 0x2C..0x3C */
1932 			for(i = 0; i < 9; i++)
1933 				EFX_COPY(FX2(i+8), INP(i));
1934 
1935 			/* sync data (0xc0de, offset 0x3E) */
1936 			sc->dummy_gpr = emu_rm_gpr_alloc(sc->rm, 1);
1937 			emumix_set_gpr(sc, sc->dummy_gpr, 0xc0de0000);
1938 
1939 			EFX_COPY(FX2(15), GPR(sc->dummy_gpr));
1940 		} /* mch_rec */
1941 	} else /* emu10k2 and later */ {
1942 		EFX_CACHE(C_FRONT_L);
1943 		EFX_CACHE(C_FRONT_R);
1944 		EFX_CACHE(C_REC_L);
1945 		EFX_CACHE(C_REC_R);
1946 
1947 		/* fx0 to front/record, 100%/muted by default */
1948 		/*
1949 		 * FRONT_[L|R] is controlled by AC97 emulation in
1950 		 * emu_ac97_[read|write]_emulation in -pcm.c
1951 		 */
1952 		EFX_ROUTE(NULL, FX(0), M_FX0_FRONT_L, C_FRONT_L, 100);
1953 		EFX_ROUTE(NULL, FX(1), M_FX1_FRONT_R, C_FRONT_R, 100);
1954 		EFX_ROUTE(NULL, FX(0), M_FX0_REC_L, C_REC_L, 0);
1955 		EFX_ROUTE(NULL, FX(1), M_FX1_REC_R, C_REC_R, 0);
1956 
1957 		/* in0, from AC97 codec output */
1958 		EFX_ROUTE(NULL, INP(A_IN_AC97_L), M_IN0_FRONT_L, C_FRONT_L, 100);
1959 		EFX_ROUTE(NULL, INP(A_IN_AC97_R), M_IN0_FRONT_R, C_FRONT_R, 100);
1960 		EFX_ROUTE(NULL, INP(A_IN_AC97_L), M_IN0_REC_L, C_REC_L, 0);
1961 		EFX_ROUTE(NULL, INP(A_IN_AC97_R), M_IN0_REC_R, C_REC_R, 0);
1962 
1963 		/* in1, from CD S/PDIF */
1964 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_L), M_IN1_FRONT_L, C_FRONT_L, 0);
1965 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_R), M_IN1_FRONT_R, C_FRONT_R, 0);
1966 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_L), M_IN1_REC_L, C_REC_L, 0);
1967 		EFX_ROUTE(NULL, INP(A_IN_SPDIF_CD_R), M_IN1_REC_R, C_REC_R, 0);
1968 
1969 		/* in2, optical & coax S/PDIF on AudigyDrive*/
1970 		/* XXX Should be muted when GPRSCS valid stream == 0 */
1971 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_L), M_IN2_FRONT_L, C_FRONT_L, 0);
1972 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_R), M_IN2_FRONT_R, C_FRONT_R, 0);
1973 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_L), M_IN2_REC_L, C_REC_L, 0);
1974 		EFX_ROUTE(NULL, INP(A_IN_O_SPDIF_R), M_IN2_REC_R, C_REC_R, 0);
1975 
1976 		if (sc->dbg_level > 0) {
1977 			/* in3, unknown */
1978 			EFX_ROUTE("in3_front_l", INP(0x6), M_IN3_FRONT_L, C_FRONT_L, 0);
1979 			EFX_ROUTE("in3_front_r", INP(0x7), M_IN3_FRONT_R, C_FRONT_R, 0);
1980 			EFX_ROUTE("in3_rec_l", INP(0x6), M_IN3_REC_L, C_REC_L, 0);
1981 			EFX_ROUTE("in3_rec_r", INP(0x7), M_IN3_REC_R, C_REC_R, 0);
1982 		}
1983 
1984 		/* in4, LineIn 2 on AudigyDrive */
1985 		EFX_ROUTE(NULL, INP(A_IN_LINE2_L), M_IN4_FRONT_L, C_FRONT_L, 0);
1986 		EFX_ROUTE(NULL, INP(A_IN_LINE2_R), M_IN4_FRONT_R, C_FRONT_R, 0);
1987 		EFX_ROUTE(NULL, INP(A_IN_LINE2_L), M_IN4_REC_L, C_REC_L, 0);
1988 		EFX_ROUTE(NULL, INP(A_IN_LINE2_R), M_IN4_REC_R, C_REC_R, 0);
1989 
1990 		/* in5, on-card S/PDIF */
1991 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_L), M_IN5_FRONT_L, C_FRONT_L, 0);
1992 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_R), M_IN5_FRONT_R, C_FRONT_R, 0);
1993 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_L), M_IN5_REC_L, C_REC_L, 0);
1994 		EFX_ROUTE(NULL, INP(A_IN_R_SPDIF_R), M_IN5_REC_R, C_REC_R, 0);
1995 
1996 		/* in6, AUX2 on AudigyDrive */
1997 		EFX_ROUTE(NULL, INP(A_IN_AUX2_L), M_IN6_FRONT_L, C_FRONT_L, 0);
1998 		EFX_ROUTE(NULL, INP(A_IN_AUX2_R), M_IN6_FRONT_R, C_FRONT_R, 0);
1999 		EFX_ROUTE(NULL, INP(A_IN_AUX2_L), M_IN6_REC_L, C_REC_L, 0);
2000 		EFX_ROUTE(NULL, INP(A_IN_AUX2_R), M_IN6_REC_R, C_REC_R, 0);
2001 
2002 		if (sc->dbg_level > 0) {
2003 			/* in7, unknown */
2004 			EFX_ROUTE("in7_front_l", INP(0xE), M_IN7_FRONT_L, C_FRONT_L, 0);
2005 			EFX_ROUTE("in7_front_r", INP(0xF), M_IN7_FRONT_R, C_FRONT_R, 0);
2006 			EFX_ROUTE("in7_rec_l", INP(0xE), M_IN7_REC_L, C_REC_L, 0);
2007 			EFX_ROUTE("in7_rec_r", INP(0xF), M_IN7_REC_R, C_REC_R, 0);
2008 		}
2009 
2010 		/* front output to headphones and  alog and digital *front */
2011 		/* volume controlled by AC97 emulation */
2012 		EFX_OUTPUT(NULL, C_FRONT_L, M_MASTER_FRONT_L, A_OUT_A_FRONT_L, 100);
2013 		EFX_OUTPUT(NULL, C_FRONT_R, M_MASTER_FRONT_R, A_OUT_A_FRONT_R, 100);
2014 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_D_FRONT_L);
2015 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_D_FRONT_R);
2016 		EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_HPHONE_L);
2017 		EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_HPHONE_R);
2018 
2019 		/* rec output to "ADC" */
2020 		/* volume controlled by AC97 emulation */
2021 		EFX_OUTPUT(NULL, C_REC_L, M_MASTER_REC_L, A_OUT_ADC_REC_L, 100);
2022 		EFX_OUTPUT(NULL, C_REC_R, M_MASTER_REC_R, A_OUT_ADC_REC_R, 100);
2023 
2024 		if (!(sc->mch_disabled)) {
2025 			/*
2026 			 * Additional channel volume is controlled by mixer in
2027 			 * emu_dspmixer_set() in -pcm.c
2028 			 */
2029 
2030 			/* fx2/3 (pcm1) to rear */
2031 			EFX_CACHE(C_REAR_L);
2032 			EFX_CACHE(C_REAR_R);
2033 			EFX_ROUTE(NULL, FX(2), M_FX2_REAR_L, C_REAR_L, 100);
2034 			EFX_ROUTE(NULL, FX(3), M_FX3_REAR_R, C_REAR_R, 100);
2035 
2036 			EFX_OUTPUT(NULL, C_REAR_L, M_MASTER_REAR_L, A_OUT_A_REAR_L, 100);
2037 			EFX_OUTPUT(NULL, C_REAR_R, M_MASTER_REAR_R, A_OUT_A_REAR_R, 100);
2038 			EFX_OUTPUTD(C_REAR_L, M_MASTER_REAR_L, A_OUT_D_REAR_L);
2039 			EFX_OUTPUTD(C_REAR_R, M_MASTER_REAR_R, A_OUT_D_REAR_R);
2040 
2041 			/* fx4 (pcm2) to center */
2042 			EFX_CACHE(C_CENTER);
2043 			EFX_ROUTE(NULL, FX(4), M_FX4_CENTER, C_CENTER, 100);
2044 			EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, A_OUT_D_CENTER, 100);
2045 #if 0
2046 			/*
2047 			 * XXX in digital mode (default) this should be muted
2048 			 * because this output is shared with digital out
2049 			 */
2050 			EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, A_OUT_A_CENTER);
2051 #endif
2052 			/* fx5 (pcm3) to sub */
2053 			EFX_CACHE(C_SUB);
2054 			EFX_ROUTE(NULL, FX(5), M_FX5_SUBWOOFER, C_SUB, 100);
2055 			EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, A_OUT_D_SUB, 100);
2056 #if 0
2057 			/*
2058 			 * XXX in digital mode (default) this should be muted
2059 			 * because this output is shared with digital out
2060 			 */
2061 			EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, A_OUT_A_SUB);
2062 #endif
2063 			if (sc->has_71) {
2064 				/* XXX this will broke headphones on AudigyDrive */
2065 				/* fx6/7 (pcm4) to side */
2066 				EFX_CACHE(C_SIDE_L);
2067 				EFX_CACHE(C_SIDE_R);
2068 				EFX_ROUTE(NULL, FX(6), M_FX6_SIDE_L, C_SIDE_L, 100);
2069 				EFX_ROUTE(NULL, FX(7), M_FX7_SIDE_R, C_SIDE_R, 100);
2070 				EFX_OUTPUT(NULL, C_SIDE_L, M_MASTER_SIDE_L, A_OUT_A_SIDE_L, 100);
2071 				EFX_OUTPUT(NULL, C_SIDE_R, M_MASTER_SIDE_R, A_OUT_A_SIDE_R, 100);
2072 				EFX_OUTPUTD(C_SIDE_L, M_MASTER_SIDE_L, A_OUT_D_SIDE_L);
2073 				EFX_OUTPUTD(C_SIDE_R, M_MASTER_SIDE_R, A_OUT_D_SIDE_R);
2074 			}
2075 		} else {	/* mch_disabled */
2076 			EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_A_REAR_L);
2077 			EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_A_REAR_R);
2078 
2079 			EFX_OUTPUTD(C_FRONT_L, M_MASTER_FRONT_L, A_OUT_D_REAR_L);
2080 			EFX_OUTPUTD(C_FRONT_R, M_MASTER_FRONT_R, A_OUT_D_REAR_R);
2081 
2082 			if (sc->has_51) {
2083 				/* (fx0+fx1)/2 to center */
2084 				EFX_CACHE(C_CENTER);
2085 				emu_addefxop(sc, MACS,
2086 					GPR(sc->cache_gpr[C_CENTER]),
2087 					GPR(sc->cache_gpr[C_CENTER]),
2088 					DSP_CONST(0xd), /* = 1/2 */
2089 					GPR(sc->cache_gpr[C_FRONT_L]),
2090 					&pc);
2091 				emu_addefxop(sc, MACS,
2092 					GPR(sc->cache_gpr[C_CENTER]),
2093 					GPR(sc->cache_gpr[C_CENTER]),
2094 					DSP_CONST(0xd), /* = 1/2 */
2095 					GPR(sc->cache_gpr[C_FRONT_R]),
2096 					&pc);
2097 				EFX_OUTPUT(NULL, C_CENTER, M_MASTER_CENTER, A_OUT_D_CENTER, 100);
2098 
2099 				/* XXX in digital mode (default) this should be muted because
2100 				this output is shared with digital out */
2101 				EFX_SKIP(1, ANALOGMUTE);
2102 				EFX_OUTPUTD(C_CENTER, M_MASTER_CENTER, A_OUT_A_CENTER);
2103 
2104 				/* (fx0+fx1)/2  to sub */
2105 				EFX_CACHE(C_SUB);
2106 				emu_addefxop(sc, MACS,
2107 					GPR(sc->cache_gpr[C_SUB]),
2108 					GPR(sc->cache_gpr[C_SUB]),
2109 					DSP_CONST(0xd), /* = 1/2 */
2110 					GPR(sc->cache_gpr[C_FRONT_L]),
2111 					&pc);
2112 				emu_addefxop(sc, MACS,
2113 					GPR(sc->cache_gpr[C_SUB]),
2114 					GPR(sc->cache_gpr[C_SUB]),
2115 					DSP_CONST(0xd), /* = 1/2 */
2116 					GPR(sc->cache_gpr[C_FRONT_R]),
2117 					&pc);
2118 				/* XXX add lowpass filter here */
2119 
2120 				EFX_OUTPUT(NULL, C_SUB, M_MASTER_SUBWOOFER, A_OUT_D_SUB, 100);
2121 
2122 				/* XXX in digital mode (default) this should be muted because
2123 				this output is shared with digital out */
2124 				EFX_SKIP(1, ANALOGMUTE);
2125 				EFX_OUTPUTD(C_SUB, M_MASTER_SUBWOOFER, A_OUT_A_SUB);
2126 			}
2127 		} /* mch_disabled */
2128 		if (sc->mch_rec) {
2129 			/* MCH RECORDING, high 32 slots */
2130 
2131 			/*
2132 			 * Stream map (in byte offsets):
2133 			 *	0x00..0x3E - outputs
2134 			 *	0x40..0x7E - FX, inputs
2135 			 *	each substream is 2 bytes.
2136 			 */
2137 			/*
2138 			 * XXX Audigy 2 Value cards (and, possibly,
2139 			 * Audigy 4) write some unknown data in place of
2140 			 * some outputs (offsets 0x20..0x3F) and one
2141 			 * input (offset 0x7E).
2142 			 */
2143 
2144 			/* PCM Playback monitoring, offsets 0x40..0x5E */
2145 			for(i = 0; i < 16; i++)
2146 				EFX_COPY(FX2(i), FX(i));
2147 
2148 			/* Copy of all inputs, offsets 0x60..0x7E */
2149 			for(i = 0; i < 16; i++)
2150 				EFX_COPY(FX2(i+16), INP(i));
2151 #if 0
2152 			/* XXX Audigy seems to work correct and does not need this */
2153 			/* sync data (0xc0de), offset 0x7E */
2154 			sc->dummy_gpr = emu_rm_gpr_alloc(sc->rm, 1);
2155 			emumix_set_gpr(sc, sc->dummy_gpr, 0xc0de0000);
2156 			EFX_COPY(FX2(31), GPR(sc->dummy_gpr));
2157 #endif
2158 		} /* mch_rec */
2159 	}
2160 
2161 	sc->routing_code_end = pc;
2162 
2163 	/* start DSP */
2164 	if (sc->is_emu10k1) {
2165 		emu_wrptr(sc, 0, DBG, 0);
2166 	} else {
2167 		emu_wrptr(sc, 0, A_DBG, 0);
2168 	}
2169 }
2170 
2171 /* /dev/em10kx */
2172 static d_open_t		emu10kx_open;
2173 static d_close_t	emu10kx_close;
2174 static d_read_t		emu10kx_read;
2175 
2176 static struct cdevsw emu10kx_cdevsw = {
2177 	.d_open = 	emu10kx_open,
2178 	.d_close =	emu10kx_close,
2179 	.d_read = 	emu10kx_read,
2180 	.d_name = 	"emu10kx",
2181 	.d_version = 	D_VERSION,
2182 };
2183 
2184 
2185 static int
2186 emu10kx_open(struct cdev *i_dev, int flags __unused, int mode __unused, struct thread *td __unused)
2187 {
2188 	int error;
2189 	struct emu_sc_info *sc;
2190 
2191 	sc = i_dev->si_drv1;
2192 	mtx_lock(&sc->emu10kx_lock);
2193 	if (sc->emu10kx_isopen) {
2194 		mtx_unlock(&sc->emu10kx_lock);
2195 		return (EBUSY);
2196 	}
2197 	sc->emu10kx_isopen = 1;
2198 	mtx_unlock(&sc->emu10kx_lock);
2199 	if (sbuf_new(&sc->emu10kx_sbuf, NULL, 4096, 0) == NULL) {
2200 		error = ENXIO;
2201 		goto out;
2202 	}
2203 	sc->emu10kx_bufptr = 0;
2204 	error = (emu10kx_prepare(sc, &sc->emu10kx_sbuf) > 0) ? 0 : ENOMEM;
2205 out:
2206 	if (error) {
2207 		mtx_lock(&sc->emu10kx_lock);
2208 		sc->emu10kx_isopen = 0;
2209 		mtx_unlock(&sc->emu10kx_lock);
2210 	}
2211 	return (error);
2212 }
2213 
2214 static int
2215 emu10kx_close(struct cdev *i_dev, int flags __unused, int mode __unused, struct thread *td __unused)
2216 {
2217 	struct emu_sc_info *sc;
2218 
2219 	sc = i_dev->si_drv1;
2220 
2221 	mtx_lock(&sc->emu10kx_lock);
2222 	if (!(sc->emu10kx_isopen)) {
2223 		mtx_unlock(&sc->emu10kx_lock);
2224 		return (EBADF);
2225 	}
2226 	sbuf_delete(&sc->emu10kx_sbuf);
2227 	sc->emu10kx_isopen = 0;
2228 	mtx_unlock(&sc->emu10kx_lock);
2229 
2230 	return (0);
2231 }
2232 
2233 static int
2234 emu10kx_read(struct cdev *i_dev, struct uio *buf, int flag __unused)
2235 {
2236 	int l, err;
2237 	struct emu_sc_info *sc;
2238 
2239 	sc = i_dev->si_drv1;
2240 	mtx_lock(&sc->emu10kx_lock);
2241 	if (!(sc->emu10kx_isopen)) {
2242 		mtx_unlock(&sc->emu10kx_lock);
2243 		return (EBADF);
2244 	}
2245 	mtx_unlock(&sc->emu10kx_lock);
2246 
2247 	l = min(buf->uio_resid, sbuf_len(&sc->emu10kx_sbuf) - sc->emu10kx_bufptr);
2248 	err = (l > 0) ? uiomove(sbuf_data(&sc->emu10kx_sbuf) + sc->emu10kx_bufptr, l, buf) : 0;
2249 	sc->emu10kx_bufptr += l;
2250 
2251 	return (err);
2252 }
2253 
2254 static int
2255 emu10kx_prepare(struct emu_sc_info *sc, struct sbuf *s)
2256 {
2257 	int i;
2258 
2259 	sbuf_printf(s, "FreeBSD EMU10Kx Audio Driver\n");
2260 	sbuf_printf(s, "\nHardware resource usage:\n");
2261 	sbuf_printf(s, "DSP General Purpose Registers: %d used, %d total\n", sc->rm->num_used, sc->rm->num_gprs);
2262 	sbuf_printf(s, "DSP Instruction Registers: %d used, %d total\n", sc->routing_code_end, sc->code_size);
2263 	sbuf_printf(s, "Card supports");
2264 	if (sc->has_ac97) {
2265 		sbuf_printf(s, " AC97 codec");
2266 	} else {
2267 		sbuf_printf(s, " NO AC97 codec");
2268 	}
2269 	if (sc->has_51) {
2270 		if (sc->has_71)
2271 			sbuf_printf(s, " and 7.1 output");
2272 		else
2273 			sbuf_printf(s, " and 5.1 output");
2274 	}
2275 	if (sc->is_emu10k1)
2276 		sbuf_printf(s, ", SBLive! DSP code");
2277 	if (sc->is_emu10k2)
2278 		sbuf_printf(s, ", Audigy DSP code");
2279 	if (sc->is_ca0102)
2280 		sbuf_printf(s, ", Audigy DSP code with Audigy2 hacks");
2281 	if (sc->is_ca0108)
2282 		sbuf_printf(s, ", Audigy DSP code with Audigy2Value hacks");
2283 	sbuf_printf(s, "\n");
2284 	if (sc->broken_digital)
2285 		sbuf_printf(s, "Digital mode unsupported\n");
2286 	sbuf_printf(s, "\nInstalled devices:\n");
2287 	for (i = 0; i < RT_COUNT; i++)
2288 		if (sc->pcm[i] != NULL)
2289 			if (device_is_attached(sc->pcm[i])) {
2290 				sbuf_printf(s, "%s on %s\n", device_get_desc(sc->pcm[i]), device_get_nameunit(sc->pcm[i]));
2291 			}
2292 	if (sc->midi[0] != NULL)
2293 		if (device_is_attached(sc->midi[0])) {
2294 			sbuf_printf(s, "EMU10Kx MIDI Interface\n");
2295 			sbuf_printf(s, "\tOn-card connector on %s\n", device_get_nameunit(sc->midi[0]));
2296 		}
2297 	if (sc->midi[1] != NULL)
2298 		if (device_is_attached(sc->midi[1])) {
2299 			sbuf_printf(s, "\tOn-Drive connector on %s\n", device_get_nameunit(sc->midi[1]));
2300 		}
2301 	if (sc->midi[0] != NULL)
2302 		if (device_is_attached(sc->midi[0])) {
2303 			sbuf_printf(s, "\tIR reciever MIDI events %s\n", sc->enable_ir ? "enabled" : "disabled");
2304 		}
2305 	sbuf_printf(s, "Card is in %s mode\n", (sc->mode == MODE_ANALOG) ? "analog" : "digital");
2306 
2307 	sbuf_finish(s);
2308 	return (sbuf_len(s));
2309 }
2310 
2311 /* INIT & UNINIT */
2312 static int
2313 emu10kx_dev_init(struct emu_sc_info *sc)
2314 {
2315 	int unit;
2316 
2317 	mtx_init(&sc->emu10kx_lock, device_get_nameunit(sc->dev), "kxdevlock", 0);
2318 	unit = device_get_unit(sc->dev);
2319 
2320 	sc->cdev = make_dev(&emu10kx_cdevsw, PCMMINOR(unit), UID_ROOT, GID_WHEEL, 0640, "emu10kx%d", unit);
2321 	if (sc->cdev != NULL) {
2322 		sc->cdev->si_drv1 = sc;
2323 		return (0);
2324 	}
2325 	return (ENXIO);
2326 }
2327 
2328 static int
2329 emu10kx_dev_uninit(struct emu_sc_info *sc)
2330 {
2331 	mtx_lock(&sc->emu10kx_lock);
2332 	if (sc->emu10kx_isopen) {
2333 		mtx_unlock(&sc->emu10kx_lock);
2334 		return (EBUSY);
2335 	}
2336 	if (sc->cdev)
2337 		destroy_dev(sc->cdev);
2338 	sc->cdev = 0;
2339 
2340 	mtx_destroy(&sc->emu10kx_lock);
2341 	return (0);
2342 }
2343 
2344 /* resource manager */
2345 int
2346 emu_rm_init(struct emu_sc_info *sc)
2347 {
2348 	int i;
2349 	int maxcount;
2350 	struct emu_rm *rm;
2351 
2352 	rm = malloc(sizeof(struct emu_rm), M_DEVBUF, M_NOWAIT | M_ZERO);
2353 	if (rm == NULL) {
2354 		return (ENOMEM);
2355 	}
2356 	sc->rm = rm;
2357 	rm->card = sc;
2358 	maxcount = sc->num_gprs;
2359 	rm->num_used = 0;
2360 	mtx_init(&(rm->gpr_lock), device_get_nameunit(sc->dev), "gpr alloc", MTX_DEF);
2361 	rm->num_gprs = (maxcount < EMU_MAX_GPR ? maxcount : EMU_MAX_GPR);
2362 	for (i = 0; i < rm->num_gprs; i++)
2363 		rm->allocmap[i] = 0;
2364 	/* pre-allocate gpr[0] */
2365 	rm->allocmap[0] = 1;
2366 	rm->last_free_gpr = 1;
2367 
2368 	return (0);
2369 }
2370 
2371 int
2372 emu_rm_uninit(struct emu_sc_info *sc)
2373 {
2374 	int i;
2375 
2376 	if (sc->dbg_level > 1) {
2377 		mtx_lock(&(sc->rm->gpr_lock));
2378 		for (i = 1; i < sc->rm->last_free_gpr; i++)
2379 			if (sc->rm->allocmap[i] > 0)
2380 				device_printf(sc->dev, "rm: gpr %d not free before uninit\n", i);
2381 		mtx_unlock(&(sc->rm->gpr_lock));
2382 	}
2383 
2384 	mtx_destroy(&(sc->rm->gpr_lock));
2385 	free(sc->rm, M_DEVBUF);
2386 	return (0);
2387 }
2388 
2389 static int
2390 emu_rm_gpr_alloc(struct emu_rm *rm, int count)
2391 {
2392 	int i, j;
2393 	int allocated_gpr;
2394 
2395 	allocated_gpr = rm->num_gprs;
2396 	/* try fast way first */
2397 	mtx_lock(&(rm->gpr_lock));
2398 	if (rm->last_free_gpr + count <= rm->num_gprs) {
2399 		allocated_gpr = rm->last_free_gpr;
2400 		rm->last_free_gpr += count;
2401 		rm->allocmap[allocated_gpr] = count;
2402 		for (i = 1; i < count; i++)
2403 			rm->allocmap[allocated_gpr + i] = -(count - i);
2404 	} else {
2405 		/* longer */
2406 		i = 0;
2407 		allocated_gpr = rm->num_gprs;
2408 		while (i < rm->last_free_gpr - count) {
2409 			if (rm->allocmap[i] > 0) {
2410 				i += rm->allocmap[i];
2411 			} else {
2412 				allocated_gpr = i;
2413 				for (j = 1; j < count; j++) {
2414 					if (rm->allocmap[i + j] != 0)
2415 						allocated_gpr = rm->num_gprs;
2416 				}
2417 				if (allocated_gpr == i)
2418 					break;
2419 			}
2420 		}
2421 		if (allocated_gpr + count < rm->last_free_gpr) {
2422 			rm->allocmap[allocated_gpr] = count;
2423 			for (i = 1; i < count; i++)
2424 				rm->allocmap[allocated_gpr + i] = -(count - i);
2425 
2426 		}
2427 	}
2428 	if (allocated_gpr == rm->num_gprs)
2429 		allocated_gpr = (-1);
2430 	if (allocated_gpr >= 0)
2431 		rm->num_used += count;
2432 	mtx_unlock(&(rm->gpr_lock));
2433 	return (allocated_gpr);
2434 }
2435 
2436 /* mixer */
2437 void
2438 emumix_set_mode(struct emu_sc_info *sc, int mode)
2439 {
2440 	uint32_t a_iocfg;
2441 	uint32_t hcfg;
2442 	uint32_t tmp;
2443 
2444 	switch (mode) {
2445 	case MODE_DIGITAL:
2446 		/* FALLTHROUGH */
2447 	case MODE_ANALOG:
2448 		break;
2449 	default:
2450 		return;
2451 	}
2452 
2453 	hcfg = HCFG_AUDIOENABLE | HCFG_AUTOMUTE;
2454 	a_iocfg = 0;
2455 
2456 	if (sc->rev >= 6)
2457 		hcfg |= HCFG_JOYENABLE;
2458 
2459 	if (sc->is_emu10k1)
2460 		hcfg |= HCFG_LOCKTANKCACHE_MASK;
2461 	else
2462 		hcfg |= HCFG_CODECFORMAT_I2S | HCFG_JOYENABLE;
2463 
2464 
2465 	if (mode == MODE_DIGITAL) {
2466 		if (sc->broken_digital) {
2467 			device_printf(sc->dev, "Digital mode is reported as broken on this card.\n");
2468 		}
2469 		a_iocfg |= A_IOCFG_ENABLE_DIGITAL;
2470 		hcfg |= HCFG_GPOUT0;
2471 	}
2472 
2473 	if (mode == MODE_ANALOG)
2474 		emumix_set_spdif_mode(sc, SPDIF_MODE_PCM);
2475 
2476 	if (sc->is_emu10k2)
2477 		a_iocfg |= 0x80; /* XXX */
2478 
2479 	if ((sc->is_ca0102) || (sc->is_ca0108))
2480 		/*
2481 		 * Setting A_IOCFG_DISABLE_ANALOG will do opposite things
2482 		 * on diffrerent cards.
2483 		 * "don't disable analog outs" on Audigy 2 (ca0102/ca0108)
2484 		 * "disable analog outs" on Audigy (emu10k2)
2485 		 */
2486 		a_iocfg |= A_IOCFG_DISABLE_ANALOG;
2487 
2488 	if (sc->is_ca0108)
2489 		a_iocfg |= 0x20; /* XXX */
2490 
2491 	/* Mute analog center & subwoofer before mode change */
2492 	if (mode == MODE_DIGITAL)
2493 		emumix_set_gpr(sc, sc->mute_gpr[ANALOGMUTE], 1);
2494 
2495 	emu_wr(sc, HCFG, hcfg, 4);
2496 
2497 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
2498 		tmp = emu_rd(sc, A_IOCFG, 2);
2499 		tmp = a_iocfg;
2500 		emu_wr(sc, A_IOCFG, tmp, 2);
2501 	}
2502 
2503 	/* Unmute if we have changed mode to analog. */
2504 
2505 	if (mode == MODE_ANALOG)
2506 		emumix_set_gpr(sc, sc->mute_gpr[ANALOGMUTE], 0);
2507 
2508 	sc->mode = mode;
2509 }
2510 
2511 void
2512 emumix_set_spdif_mode(struct emu_sc_info *sc, int mode)
2513 {
2514 	uint32_t spcs;
2515 
2516 	switch (mode) {
2517 	case SPDIF_MODE_PCM:
2518 		break;
2519 	case SPDIF_MODE_AC3:
2520 		device_printf(sc->dev, "AC3 mode does not work and disabled\n");
2521 		return;
2522 	default:
2523 		return;
2524 	}
2525 
2526 	spcs = SPCS_CLKACCY_1000PPM | SPCS_SAMPLERATE_48 |
2527 	    SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC |
2528 	    SPCS_GENERATIONSTATUS | 0x00001200 | 0x00000000 |
2529 	    SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT;
2530 
2531 	mode = SPDIF_MODE_PCM;
2532 
2533 	emu_wrptr(sc, 0, SPCS0, spcs);
2534 	emu_wrptr(sc, 0, SPCS1, spcs);
2535 	emu_wrptr(sc, 0, SPCS2, spcs);
2536 }
2537 
2538 #define	L2L_POINTS	10
2539 
2540 static int l2l_df[L2L_POINTS] = {
2541 	0x572C5CA,		/* 100..90 */
2542 	0x3211625,		/* 90..80 */
2543 	0x1CC1A76,		/* 80..70 */
2544 	0x108428F,		/* 70..60 */
2545 	0x097C70A,		/* 60..50 */
2546 	0x0572C5C,		/* 50..40 */
2547 	0x0321162,		/* 40..30 */
2548 	0x01CC1A7,		/* 30..20 */
2549 	0x0108428,		/* 20..10 */
2550 	0x016493D		/* 10..0 */
2551 };
2552 
2553 static int l2l_f[L2L_POINTS] = {
2554 	0x4984461A,		/* 90 */
2555 	0x2A3968A7,		/* 80 */
2556 	0x18406003,		/* 70 */
2557 	0x0DEDC66D,		/* 60 */
2558 	0x07FFFFFF,		/* 50 */
2559 	0x04984461,		/* 40 */
2560 	0x02A3968A,		/* 30 */
2561 	0x01840600,		/* 20 */
2562 	0x00DEDC66,		/* 10 */
2563 	0x00000000		/* 0 */
2564 };
2565 
2566 
2567 static int
2568 log2lin(int log_t)
2569 {
2570 	int lin_t;
2571 	int idx, lin;
2572 
2573 	if (log_t <= 0) {
2574 		lin_t = 0x00000000;
2575 		return (lin_t);
2576 	}
2577 
2578 	if (log_t >= 100) {
2579 		lin_t = 0x7fffffff;
2580 		return (lin_t);
2581 	}
2582 
2583 	idx = (L2L_POINTS - 1) - log_t / (L2L_POINTS);
2584 	lin = log_t % (L2L_POINTS);
2585 	lin_t = l2l_df[idx] * lin + l2l_f[idx];
2586 	return (lin_t);
2587 }
2588 
2589 
2590 void
2591 emumix_set_fxvol(struct emu_sc_info *sc, unsigned gpr, int32_t vol)
2592 {
2593 
2594 	vol = log2lin(vol);
2595 	emumix_set_gpr(sc, gpr, vol);
2596 }
2597 
2598 void
2599 emumix_set_gpr(struct emu_sc_info *sc, unsigned gpr, int32_t val)
2600 {
2601 	if (sc->dbg_level > 1)
2602 		if (gpr == 0) {
2603 			device_printf(sc->dev, "Zero gpr write access\n");
2604 #ifdef KDB
2605 			kdb_backtrace();
2606 #endif
2607 			return;
2608 			}
2609 
2610 	emu_wrptr(sc, 0, GPR(gpr), val);
2611 }
2612 
2613 void
2614 emumix_set_volume(struct emu_sc_info *sc, int mixer_idx, int volume)
2615 {
2616 
2617 	RANGE(volume, 0, 100);
2618 	if (mixer_idx < NUM_MIXERS) {
2619 		sc->mixer_volcache[mixer_idx] = volume;
2620 		emumix_set_fxvol(sc, sc->mixer_gpr[mixer_idx], volume);
2621 	}
2622 }
2623 
2624 int
2625 emumix_get_volume(struct emu_sc_info *sc, int mixer_idx)
2626 {
2627 	if ((mixer_idx < NUM_MIXERS) && (mixer_idx >= 0))
2628 		return (sc->mixer_volcache[mixer_idx]);
2629 	return (-1);
2630 }
2631 
2632 /* Init CardBus part */
2633 static int
2634 emu_cardbus_init(struct emu_sc_info *sc)
2635 {
2636 
2637 	/*
2638 	 * XXX May not need this if we have IPR3 handler.
2639 	 * Is it a real init calls, or IPR3 interrupt acknowledgments?
2640 	 * Looks much like "(data << 16) | register".
2641 	 */
2642 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x0000);
2643 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x0001);
2644 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x005f);
2645 	emu_wr_cbptr(sc, (0x00d0 << 16) | 0x007f);
2646 
2647 	emu_wr_cbptr(sc, (0x0090 << 16) | 0x007f);
2648 
2649 	return (0);
2650 }
2651 
2652 /* Probe and attach the card */
2653 static int
2654 emu_init(struct emu_sc_info *sc)
2655 {
2656 	uint32_t ch, tmp;
2657 	uint32_t spdif_sr;
2658 	uint32_t ac97slot;
2659 	int def_mode;
2660 	int i;
2661 
2662 	/* disable audio and lock cache */
2663 	emu_wr(sc, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE, 4);
2664 
2665 	/* reset recording buffers */
2666 	emu_wrptr(sc, 0, MICBS, ADCBS_BUFSIZE_NONE);
2667 	emu_wrptr(sc, 0, MICBA, 0);
2668 	emu_wrptr(sc, 0, FXBS, ADCBS_BUFSIZE_NONE);
2669 	emu_wrptr(sc, 0, FXBA, 0);
2670 	emu_wrptr(sc, 0, ADCBS, ADCBS_BUFSIZE_NONE);
2671 	emu_wrptr(sc, 0, ADCBA, 0);
2672 
2673 	/* disable channel interrupt */
2674 	emu_wr(sc, INTE, INTE_INTERVALTIMERENB | INTE_SAMPLERATETRACKER | INTE_PCIERRORENABLE, 4);
2675 	emu_wrptr(sc, 0, CLIEL, 0);
2676 	emu_wrptr(sc, 0, CLIEH, 0);
2677 	emu_wrptr(sc, 0, SOLEL, 0);
2678 	emu_wrptr(sc, 0, SOLEH, 0);
2679 
2680 	/* disable P16V and S/PDIF interrupts */
2681 	if ((sc->is_ca0102) || (sc->is_ca0108))
2682 		emu_wr(sc, INTE2, 0, 4);
2683 
2684 	if (sc->is_ca0102)
2685 		emu_wr(sc, INTE3, 0, 4);
2686 
2687 	/* init phys inputs and outputs */
2688 	ac97slot = 0;
2689 	if (sc->has_51)
2690 		ac97slot = AC97SLOT_CNTR | AC97SLOT_LFE;
2691 	if (sc->has_71)
2692 		ac97slot = AC97SLOT_CNTR | AC97SLOT_LFE | AC97SLOT_REAR_LEFT | AC97SLOT_REAR_RIGHT;
2693 	if (sc->is_emu10k2)
2694 		ac97slot |= 0x40;
2695 	emu_wrptr(sc, 0, AC97SLOT, ac97slot);
2696 
2697 	if (sc->is_emu10k2)	/* XXX for later cards? */
2698 		emu_wrptr(sc, 0, SPBYPASS, 0xf00);	/* What will happen if
2699 							 * we write 1 here? */
2700 
2701 	if (bus_dma_tag_create( /* parent */ bus_get_dma_tag(sc->dev),
2702 	     /* alignment */ 2, /* boundary */ 0,
2703 	     /* lowaddr */ 1 << 31,	/* can only access 0-2gb */
2704 	     /* highaddr */ BUS_SPACE_MAXADDR,
2705 	     /* filter */ NULL, /* filterarg */ NULL,
2706 	     /* maxsize */ EMU_MAX_BUFSZ, /* nsegments */ 1, /* maxsegz */ 0x3ffff,
2707 	     /* flags */ 0, /* lockfunc */ busdma_lock_mutex,
2708 	     /* lockarg */ &Giant, &(sc->mem.dmat)) != 0) {
2709 		device_printf(sc->dev, "unable to create dma tag\n");
2710 		bus_dma_tag_destroy(sc->mem.dmat);
2711 		return (ENOMEM);
2712 	}
2713 
2714 	sc->mem.card = sc;
2715 	SLIST_INIT(&sc->mem.blocks);
2716 	sc->mem.ptb_pages = emu_malloc(&sc->mem, EMU_MAXPAGES * sizeof(uint32_t), &sc->mem.ptb_pages_addr);
2717 	if (sc->mem.ptb_pages == NULL)
2718 		return (ENOMEM);
2719 
2720 	sc->mem.silent_page = emu_malloc(&sc->mem, EMUPAGESIZE, &sc->mem.silent_page_addr);
2721 	if (sc->mem.silent_page == NULL) {
2722 		emu_free(&sc->mem, sc->mem.ptb_pages);
2723 		return (ENOMEM);
2724 	}
2725 	/* Clear page with silence & setup all pointers to this page */
2726 	bzero(sc->mem.silent_page, EMUPAGESIZE);
2727 	tmp = (uint32_t) (sc->mem.silent_page_addr) << 1;
2728 	for (i = 0; i < EMU_MAXPAGES; i++)
2729 		sc->mem.ptb_pages[i] = tmp | i;
2730 
2731 	for (ch = 0; ch < NUM_G; ch++) {
2732 		emu_wrptr(sc, ch, MAPA, tmp | MAP_PTI_MASK);
2733 		emu_wrptr(sc, ch, MAPB, tmp | MAP_PTI_MASK);
2734 	}
2735 	emu_wrptr(sc, 0, PTB, (sc->mem.ptb_pages_addr));
2736 	emu_wrptr(sc, 0, TCB, 0);	/* taken from original driver */
2737 	emu_wrptr(sc, 0, TCBS, 0);	/* taken from original driver */
2738 
2739 	/* init envelope engine */
2740 	for (ch = 0; ch < NUM_G; ch++) {
2741 		emu_wrptr(sc, ch, DCYSUSV, 0);
2742 		emu_wrptr(sc, ch, IP, 0);
2743 		emu_wrptr(sc, ch, VTFT, 0xffff);
2744 		emu_wrptr(sc, ch, CVCF, 0xffff);
2745 		emu_wrptr(sc, ch, PTRX, 0);
2746 		emu_wrptr(sc, ch, CPF, 0);
2747 		emu_wrptr(sc, ch, CCR, 0);
2748 
2749 		emu_wrptr(sc, ch, PSST, 0);
2750 		emu_wrptr(sc, ch, DSL, 0x10);
2751 		emu_wrptr(sc, ch, CCCA, 0);
2752 		emu_wrptr(sc, ch, Z1, 0);
2753 		emu_wrptr(sc, ch, Z2, 0);
2754 		emu_wrptr(sc, ch, FXRT, 0xd01c0000);
2755 
2756 		emu_wrptr(sc, ch, ATKHLDM, 0);
2757 		emu_wrptr(sc, ch, DCYSUSM, 0);
2758 		emu_wrptr(sc, ch, IFATN, 0xffff);
2759 		emu_wrptr(sc, ch, PEFE, 0);
2760 		emu_wrptr(sc, ch, FMMOD, 0);
2761 		emu_wrptr(sc, ch, TREMFRQ, 24);	/* 1 Hz */
2762 		emu_wrptr(sc, ch, FM2FRQ2, 24);	/* 1 Hz */
2763 		emu_wrptr(sc, ch, TEMPENV, 0);
2764 
2765 		/*** these are last so OFF prevents writing ***/
2766 		emu_wrptr(sc, ch, LFOVAL2, 0);
2767 		emu_wrptr(sc, ch, LFOVAL1, 0);
2768 		emu_wrptr(sc, ch, ATKHLDV, 0);
2769 		emu_wrptr(sc, ch, ENVVOL, 0);
2770 		emu_wrptr(sc, ch, ENVVAL, 0);
2771 
2772 		if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
2773 			emu_wrptr(sc, ch, 0x4c, 0x0);
2774 			emu_wrptr(sc, ch, 0x4d, 0x0);
2775 			emu_wrptr(sc, ch, 0x4e, 0x0);
2776 			emu_wrptr(sc, ch, 0x4f, 0x0);
2777 			emu_wrptr(sc, ch, A_FXRT1, 0x3f3f3f3f);
2778 			emu_wrptr(sc, ch, A_FXRT2, 0x3f3f3f3f);
2779 			emu_wrptr(sc, ch, A_SENDAMOUNTS, 0x0);
2780 		}
2781 	}
2782 
2783 	emumix_set_spdif_mode(sc, SPDIF_MODE_PCM);
2784 
2785 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108))
2786 		emu_wrptr(sc, 0, A_SPDIF_SAMPLERATE, A_SPDIF_48000);
2787 
2788 	/*
2789 	 * CAxxxx cards needs additional setup:
2790 	 * 1. Set I2S capture sample rate to 96000
2791 	 * 2. Disable P16v / P17v proceesing
2792 	 * 3. Allow EMU10K DSP inputs
2793 	 */
2794 	if ((sc->is_ca0102) || (sc->is_ca0108)) {
2795 
2796 		spdif_sr = emu_rdptr(sc, 0, A_SPDIF_SAMPLERATE);
2797 		spdif_sr &= 0xfffff1ff;
2798 		spdif_sr |= A_I2S_CAPTURE_96000;
2799 		emu_wrptr(sc, 0, A_SPDIF_SAMPLERATE, spdif_sr);
2800 
2801 		/* Disable P16v processing */
2802 		emu_wr_p16vptr(sc, 0, SRCSel, 0x14);
2803 
2804 		/* Setup P16v/P17v sound routing */
2805 		if (sc->is_ca0102)
2806 			emu_wr_p16vptr(sc, 0, SRCMULTI_ENABLE, 0xFF00FF00);
2807 		else {
2808 			emu_wr_p16vptr(sc, 0, P17V_MIXER_I2S_ENABLE, 0xFF000000);
2809 			emu_wr_p16vptr(sc, 0, P17V_MIXER_SPDIF_ENABLE, 0xFF000000);
2810 
2811 			tmp = emu_rd(sc, A_IOCFG, 2);
2812 			emu_wr(sc, A_IOCFG, tmp & ~0x8, 2);
2813 		}
2814 	}
2815 	emu_initefx(sc);
2816 
2817 	def_mode = MODE_ANALOG;
2818 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108))
2819 		def_mode = MODE_DIGITAL;
2820 	if (((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) && (sc->broken_digital)) {
2821 		device_printf(sc->dev, "Audigy card initialized in analog mode.\n");
2822 		def_mode = MODE_ANALOG;
2823 	}
2824 	emumix_set_mode(sc, def_mode);
2825 
2826 	if (bootverbose) {
2827 		tmp = emu_rd(sc, HCFG, 4);
2828 		device_printf(sc->dev, "Card Configuration (   0x%08x )\n", tmp);
2829 		device_printf(sc->dev, "Card Configuration ( & 0xff000000 ) : %s%s%s%s%s%s%s%s\n",
2830 		    (tmp & 0x80000000 ? "[Legacy MPIC] " : ""),
2831 		    (tmp & 0x40000000 ? "[0x40] " : ""),
2832 		    (tmp & 0x20000000 ? "[0x20] " : ""),
2833 		    (tmp & 0x10000000 ? "[0x10] " : ""),
2834 		    (tmp & 0x08000000 ? "[0x08] " : ""),
2835 		    (tmp & 0x04000000 ? "[0x04] " : ""),
2836 		    (tmp & 0x02000000 ? "[0x02] " : ""),
2837 		    (tmp & 0x01000000 ? "[0x01]" : " "));
2838 		device_printf(sc->dev, "Card Configuration ( & 0x00ff0000 ) : %s%s%s%s%s%s%s%s\n",
2839 		    (tmp & 0x00800000 ? "[0x80] " : ""),
2840 		    (tmp & 0x00400000 ? "[0x40] " : ""),
2841 		    (tmp & 0x00200000 ? "[Legacy INT] " : ""),
2842 		    (tmp & 0x00100000 ? "[0x10] " : ""),
2843 		    (tmp & 0x00080000 ? "[0x08] " : ""),
2844 		    (tmp & 0x00040000 ? "[Codec4] " : ""),
2845 		    (tmp & 0x00020000 ? "[Codec2] " : ""),
2846 		    (tmp & 0x00010000 ? "[I2S Codec]" : " "));
2847 		device_printf(sc->dev, "Card Configuration ( & 0x0000ff00 ) : %s%s%s%s%s%s%s%s\n",
2848 		    (tmp & 0x00008000 ? "[0x80] " : ""),
2849 		    (tmp & 0x00004000 ? "[GPINPUT0] " : ""),
2850 		    (tmp & 0x00002000 ? "[GPINPUT1] " : ""),
2851 		    (tmp & 0x00001000 ? "[GPOUT0] " : ""),
2852 		    (tmp & 0x00000800 ? "[GPOUT1] " : ""),
2853 		    (tmp & 0x00000400 ? "[GPOUT2] " : ""),
2854 		    (tmp & 0x00000200 ? "[Joystick] " : ""),
2855 		    (tmp & 0x00000100 ? "[0x01]" : " "));
2856 		device_printf(sc->dev, "Card Configuration ( & 0x000000ff ) : %s%s%s%s%s%s%s%s\n",
2857 		    (tmp & 0x00000080 ? "[0x80] " : ""),
2858 		    (tmp & 0x00000040 ? "[0x40] " : ""),
2859 		    (tmp & 0x00000020 ? "[0x20] " : ""),
2860 		    (tmp & 0x00000010 ? "[AUTOMUTE] " : ""),
2861 		    (tmp & 0x00000008 ? "[LOCKSOUNDCACHE] " : ""),
2862 		    (tmp & 0x00000004 ? "[LOCKTANKCACHE] " : ""),
2863 		    (tmp & 0x00000002 ? "[MUTEBUTTONENABLE] " : ""),
2864 		    (tmp & 0x00000001 ? "[AUDIOENABLE]" : " "));
2865 
2866 		if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
2867 			tmp = emu_rd(sc, A_IOCFG, 2);
2868 			device_printf(sc->dev, "Audigy Card Configuration (    0x%04x )\n", tmp);
2869 			device_printf(sc->dev, "Audigy Card Configuration (  & 0xff00 )");
2870 			printf(" : %s%s%s%s%s%s%s%s\n",
2871 			    (tmp & 0x8000 ? "[Rear Speakers] " : ""),
2872 			    (tmp & 0x4000 ? "[Front Speakers] " : ""),
2873 			    (tmp & 0x2000 ? "[0x20] " : ""),
2874 			    (tmp & 0x1000 ? "[0x10] " : ""),
2875 			    (tmp & 0x0800 ? "[0x08] " : ""),
2876 			    (tmp & 0x0400 ? "[0x04] " : ""),
2877 			    (tmp & 0x0200 ? "[0x02] " : ""),
2878 			    (tmp & 0x0100 ? "[AudigyDrive Phones]" : " "));
2879 			device_printf(sc->dev, "Audigy Card Configuration (  & 0x00ff )");
2880 			printf(" : %s%s%s%s%s%s%s%s\n",
2881 			    (tmp & 0x0080 ? "[0x80] " : ""),
2882 			    (tmp & 0x0040 ? "[Mute AnalogOut] " : ""),
2883 			    (tmp & 0x0020 ? "[0x20] " : ""),
2884 			    (tmp & 0x0010 ? "[0x10] " : ""),
2885 			    (tmp & 0x0008 ? "[0x08] " : ""),
2886 			    (tmp & 0x0004 ? "[GPOUT0] " : ""),
2887 			    (tmp & 0x0002 ? "[GPOUT1] " : ""),
2888 			    (tmp & 0x0001 ? "[GPOUT2]" : " "));
2889 		}		/* is_emu10k2 or ca* */
2890 	}			/* bootverbose */
2891 	return (0);
2892 }
2893 
2894 static int
2895 emu_uninit(struct emu_sc_info *sc)
2896 {
2897 	uint32_t ch;
2898 	struct emu_memblk *blk;
2899 
2900 	emu_wr(sc, INTE, 0, 4);
2901 	for (ch = 0; ch < NUM_G; ch++)
2902 		emu_wrptr(sc, ch, DCYSUSV, 0);
2903 	for (ch = 0; ch < NUM_G; ch++) {
2904 		emu_wrptr(sc, ch, VTFT, 0);
2905 		emu_wrptr(sc, ch, CVCF, 0);
2906 		emu_wrptr(sc, ch, PTRX, 0);
2907 		emu_wrptr(sc, ch, CPF, 0);
2908 	}
2909 
2910 	/* disable audio and lock cache */
2911 	emu_wr(sc, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE, 4);
2912 
2913 	emu_wrptr(sc, 0, PTB, 0);
2914 	/* reset recording buffers */
2915 	emu_wrptr(sc, 0, MICBS, ADCBS_BUFSIZE_NONE);
2916 	emu_wrptr(sc, 0, MICBA, 0);
2917 	emu_wrptr(sc, 0, FXBS, ADCBS_BUFSIZE_NONE);
2918 	emu_wrptr(sc, 0, FXBA, 0);
2919 	emu_wrptr(sc, 0, FXWC, 0);
2920 	emu_wrptr(sc, 0, ADCBS, ADCBS_BUFSIZE_NONE);
2921 	emu_wrptr(sc, 0, ADCBA, 0);
2922 	emu_wrptr(sc, 0, TCB, 0);
2923 	emu_wrptr(sc, 0, TCBS, 0);
2924 
2925 	/* disable channel interrupt */
2926 	emu_wrptr(sc, 0, CLIEL, 0);
2927 	emu_wrptr(sc, 0, CLIEH, 0);
2928 	emu_wrptr(sc, 0, SOLEL, 0);
2929 	emu_wrptr(sc, 0, SOLEH, 0);
2930 
2931 	if (!SLIST_EMPTY(&sc->mem.blocks))
2932 		device_printf(sc->dev, "warning: memblock list not empty\n");
2933 
2934 	SLIST_FOREACH(blk, &sc->mem.blocks, link)
2935 		if (blk != NULL)
2936 		device_printf(sc->dev, "lost %d for %s\n", blk->pte_size, blk->owner);
2937 
2938 	emu_free(&sc->mem, sc->mem.ptb_pages);
2939 	emu_free(&sc->mem, sc->mem.silent_page);
2940 
2941 	return (0);
2942 }
2943 
2944 static int
2945 emu_read_ivar(device_t bus, device_t dev, int ivar_index, uintptr_t * result)
2946 {
2947 	struct sndcard_func *func = device_get_ivars(dev);
2948 	struct emu_sc_info *sc = device_get_softc(bus);
2949 
2950 	if (func==NULL)
2951 		return (ENOMEM);
2952 	if (sc == NULL)
2953 		return (ENOMEM);
2954 
2955 	switch (ivar_index) {
2956 	case EMU_VAR_FUNC:
2957 		*result = func->func;
2958 		break;
2959 	case EMU_VAR_ROUTE:
2960 		if (func->varinfo == NULL)
2961 			return (ENOMEM);
2962 		*result = ((struct emu_pcminfo *)func->varinfo)->route;
2963 		break;
2964 	case EMU_VAR_ISEMU10K1:
2965 		*result = sc->is_emu10k1;
2966 		break;
2967 	case EMU_VAR_MCH_DISABLED:
2968 		*result = sc->mch_disabled;
2969 		break;
2970 	case EMU_VAR_MCH_REC:
2971 		*result = sc->mch_rec;
2972 		break;
2973 	default:
2974 		return (ENOENT);
2975 	}
2976 
2977 	return (0);
2978 }
2979 
2980 static int
2981 emu_write_ivar(device_t bus __unused, device_t dev __unused,
2982     int ivar_index, uintptr_t value __unused)
2983 {
2984 
2985 	switch (ivar_index) {
2986 		case 0:
2987 		return (EINVAL);
2988 
2989 	default:
2990 		return (ENOENT);
2991 	}
2992 }
2993 
2994 static int
2995 emu_pci_probe(device_t dev)
2996 {
2997 	struct sbuf *s;
2998 	unsigned int thiscard = 0;
2999 	uint16_t vendor;
3000 
3001 	vendor = pci_read_config(dev, PCIR_DEVVENDOR, /* bytes */ 2);
3002 	if (vendor != 0x1102)
3003 		return (ENXIO);	/* Not Creative */
3004 
3005 	thiscard = emu_getcard(dev);
3006 	if (thiscard == 0)
3007 		return (ENXIO);
3008 
3009 	s = sbuf_new(NULL, NULL, 4096, 0);
3010 	if (s == NULL)
3011 		return (ENOMEM);
3012 	sbuf_printf(s, "Creative %s [%s]", emu_cards[thiscard].desc, emu_cards[thiscard].SBcode);
3013 	sbuf_finish(s);
3014 
3015 	device_set_desc_copy(dev, sbuf_data(s));
3016 
3017 	sbuf_delete(s);
3018 
3019 	return (BUS_PROBE_DEFAULT);
3020 }
3021 
3022 
3023 static int
3024 emu_pci_attach(device_t dev)
3025 {
3026 	struct sndcard_func *func;
3027 	struct emu_sc_info *sc;
3028 	struct emu_pcminfo *pcminfo;
3029 #if 0
3030 	struct emu_midiinfo *midiinfo;
3031 #endif
3032 	uint32_t data;
3033 	int i;
3034 	int device_flags;
3035 	char status[255];
3036 	int error = ENXIO;
3037 	int unit;
3038 
3039 	sc = device_get_softc(dev);
3040 	unit = device_get_unit(dev);
3041 
3042 	if (resource_disabled("emu10kx", unit)) {
3043 		device_printf(dev, "disabled by kernel hints\n");
3044 		return (ENXIO); /* XXX to avoid unit reuse */
3045 	}
3046 
3047 	/* Get configuration */
3048 
3049 	sc->ctx = device_get_sysctl_ctx(dev);
3050 	if (sc->ctx == NULL)
3051 		goto bad;
3052 	sc->root = device_get_sysctl_tree(dev);
3053 	if (sc->root == NULL)
3054 		goto bad;
3055 
3056 	if (resource_int_value("emu10kx", unit, "multichannel_disabled", &(sc->mch_disabled)))
3057 		RANGE(sc->mch_disabled, 0, 1);
3058 	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3059 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
3060             OID_AUTO, "multichannel_disabled", CTLFLAG_RD, &(sc->mch_disabled), 0, "Multichannel playback setting");
3061 
3062 	if (resource_int_value("emu10kx", unit, "multichannel_recording", &(sc->mch_rec)))
3063 		RANGE(sc->mch_rec, 0, 1);
3064 	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3065 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
3066             OID_AUTO, "multichannel_recording", CTLFLAG_RD,  &(sc->mch_rec), 0, "Multichannel recording setting");
3067 
3068 	if (resource_int_value("emu10kx", unit, "debug", &(sc->dbg_level)))
3069 		RANGE(sc->mch_rec, 0, 2);
3070 	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3071 	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
3072             OID_AUTO, "debug", CTLFLAG_RW, &(sc->dbg_level), 0, "Debug level");
3073 
3074 	/* Fill in the softc. */
3075 	mtx_init(&sc->lock, device_get_nameunit(dev), "bridge conf", MTX_DEF);
3076 	mtx_init(&sc->rw, device_get_nameunit(dev), "exclusive io", MTX_DEF);
3077 	sc->dev = dev;
3078 	sc->type = pci_get_devid(dev);
3079 	sc->rev = pci_get_revid(dev);
3080 	sc->enable_ir = 0;
3081 	sc->has_ac97 = 0;
3082 	sc->has_51 = 0;
3083 	sc->has_71 = 0;
3084 	sc->broken_digital = 0;
3085 	sc->is_emu10k1 = 0;
3086 	sc->is_emu10k2 = 0;
3087 	sc->is_ca0102 = 0;
3088 	sc->is_ca0108 = 0;
3089 	sc->is_cardbus = 0;
3090 
3091 	device_flags = emu_cards[emu_getcard(dev)].flags;
3092 	if (device_flags & HAS_51)
3093 		sc->has_51 = 1;
3094 	if (device_flags & HAS_71) {
3095 		sc->has_51 = 1;
3096 		sc->has_71 = 1;
3097 	}
3098 	if (device_flags & IS_EMU10K1)
3099 		sc->is_emu10k1 = 1;
3100 	if (device_flags & IS_EMU10K2)
3101 		sc->is_emu10k2 = 1;
3102 	if (device_flags & IS_CA0102)
3103 		sc->is_ca0102 = 1;
3104 	if (device_flags & IS_CA0108)
3105 		sc->is_ca0108 = 1;
3106 	if ((sc->is_emu10k2) && (sc->rev == 4)) {
3107 		sc->is_emu10k2 = 0;
3108 		sc->is_ca0102 = 1;	/* for unknown Audigy 2 cards */
3109 	}
3110 	if ((sc->is_ca0102 == 1) || (sc->is_ca0108 == 1))
3111 		if (device_flags & IS_CARDBUS)
3112 			sc->is_cardbus = 1;
3113 
3114 	if ((sc->is_emu10k1 + sc->is_emu10k2 + sc->is_ca0102 + sc->is_ca0108) != 1) {
3115 		device_printf(sc->dev, "Unable to detect HW chipset\n");
3116 		goto bad;
3117 	}
3118 	if (device_flags & BROKEN_DIGITAL)
3119 		sc->broken_digital = 1;
3120 	if (device_flags & HAS_AC97)
3121 		sc->has_ac97 = 1;
3122 
3123 	sc->opcode_shift = 0;
3124 	if ((sc->is_emu10k2) || (sc->is_ca0102) || (sc->is_ca0108)) {
3125 		sc->opcode_shift = 24;
3126 		sc->high_operand_shift = 12;
3127 
3128 	/*	DSP map				*/
3129 	/*	sc->fx_base = 0x0		*/
3130 		sc->input_base = 0x40;
3131 	/*	sc->p16vinput_base = 0x50;	*/
3132 		sc->output_base = 0x60;
3133 		sc->efxc_base = 0x80;
3134 	/*	sc->output32h_base = 0xa0;	*/
3135 	/*	sc->output32l_base = 0xb0;	*/
3136 		sc->dsp_zero = 0xc0;
3137 	/*	0xe0...0x100 are unknown	*/
3138 	/*	sc->tram_base = 0x200		*/
3139 	/*	sc->tram_addr_base = 0x300	*/
3140 		sc->gpr_base = A_FXGPREGBASE;
3141 		sc->num_gprs = 0x200;
3142 		sc->code_base = A_MICROCODEBASE;
3143 		sc->code_size = 0x800 / 2;	/* 0x600-0xdff,  2048 words,
3144 						 * 1024 instructions */
3145 
3146 		sc->mchannel_fx = 8;
3147 		sc->num_fxbuses = 16;
3148 		sc->num_inputs = 8;
3149 		sc->num_outputs = 16;
3150 		sc->address_mask = A_PTR_ADDRESS_MASK;
3151 	}
3152 	if (sc->is_emu10k1) {
3153 		sc->has_51 = 0;	/* We don't support 5.1 sound on SB Live! 5.1 */
3154 		sc->opcode_shift = 20;
3155 		sc->high_operand_shift = 10;
3156 		sc->code_base = MICROCODEBASE;
3157 		sc->code_size = 0x400 / 2;	/* 0x400-0x7ff,  1024 words,
3158 						 * 512 instructions */
3159 		sc->gpr_base = FXGPREGBASE;
3160 		sc->num_gprs = 0x100;
3161 		sc->input_base = 0x10;
3162 		sc->output_base = 0x20;
3163 		/*
3164 		 * XXX 5.1 Analog outputs are inside efxc address space!
3165 		 * They use ouput+0x11/+0x12 (=efxc+1/+2).
3166 		 * Don't use this efx registers for recording on SB Live! 5.1!
3167 		 */
3168 		sc->efxc_base = 0x30;
3169 		sc->dsp_zero = 0x40;
3170 		sc->mchannel_fx = 0;
3171 		sc->num_fxbuses = 8;
3172 		sc->num_inputs = 8;
3173 		sc->num_outputs = 16;
3174 		sc->address_mask = PTR_ADDRESS_MASK;
3175 	}
3176 	if (sc->opcode_shift == 0)
3177 		goto bad;
3178 
3179 	data = pci_read_config(dev, PCIR_COMMAND, 2);
3180 	data |= (PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN);
3181 	pci_write_config(dev, PCIR_COMMAND, data, 2);
3182 	data = pci_read_config(dev, PCIR_COMMAND, 2);
3183 
3184 	pci_enable_busmaster(dev);
3185 
3186 	i = PCIR_BAR(0);
3187 	sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &i, RF_ACTIVE);
3188 	if (sc->reg == NULL) {
3189 		device_printf(dev, "unable to map register space\n");
3190 		goto bad;
3191 	}
3192 	sc->st = rman_get_bustag(sc->reg);
3193 	sc->sh = rman_get_bushandle(sc->reg);
3194 
3195 	for (i = 0; i < EMU_MAX_IRQ_CONSUMERS; i++)
3196 		sc->timer[i] = 0;	/* disable it */
3197 
3198 	i = 0;
3199 	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i, RF_ACTIVE | RF_SHAREABLE);
3200 	if ((sc->irq == NULL) || bus_setup_intr(dev, sc->irq, INTR_MPSAFE | INTR_TYPE_AV,
3201 #if __FreeBSD_version >= 700031
3202 	    NULL,
3203 #endif
3204 	    emu_intr, sc, &sc->ih)) {
3205 		device_printf(dev, "unable to map interrupt\n");
3206 		goto bad;
3207 	}
3208 	if (emu_rm_init(sc) != 0) {
3209 		device_printf(dev, "unable to create resource manager\n");
3210 		goto bad;
3211 	}
3212 	if (sc->is_cardbus)
3213 		if (emu_cardbus_init(sc) != 0) {
3214 			device_printf(dev, "unable to initialize CardBus interface\n");
3215 			goto bad;
3216 		}
3217 	if (emu_init(sc) != 0) {
3218 		device_printf(dev, "unable to initialize the card\n");
3219 		goto bad;
3220 	}
3221 	if (emu10kx_dev_init(sc) != 0) {
3222 		device_printf(dev, "unable to create control device\n");
3223 		goto bad;
3224 	}
3225 	snprintf(status, 255, "rev %d at io 0x%lx irq %ld", sc->rev, rman_get_start(sc->reg), rman_get_start(sc->irq));
3226 
3227 	/* Voices */
3228 	for (i = 0; i < NUM_G; i++) {
3229 		sc->voice[i].vnum = i;
3230 		sc->voice[i].slave = NULL;
3231 		sc->voice[i].busy = 0;
3232 		sc->voice[i].ismaster = 0;
3233 		sc->voice[i].running = 0;
3234 		sc->voice[i].b16 = 0;
3235 		sc->voice[i].stereo = 0;
3236 		sc->voice[i].speed = 0;
3237 		sc->voice[i].start = 0;
3238 		sc->voice[i].end = 0;
3239 	}
3240 
3241 	/* PCM Audio */
3242 	for (i = 0; i < RT_COUNT; i++)
3243 		sc->pcm[i] = NULL;
3244 
3245 	/* FRONT */
3246 	func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3247 	if (func == NULL) {
3248 		error = ENOMEM;
3249 		goto bad;
3250 	}
3251 	pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3252 	if (pcminfo == NULL) {
3253 		error = ENOMEM;
3254 		goto bad;
3255 	}
3256 	pcminfo->card = sc;
3257 	pcminfo->route = RT_FRONT;
3258 
3259 	func->func = SCF_PCM;
3260 	func->varinfo = pcminfo;
3261 	sc->pcm[RT_FRONT] = device_add_child(dev, "pcm", -1);
3262 	device_set_ivars(sc->pcm[RT_FRONT], func);
3263 
3264 	if (!(sc->mch_disabled)) {
3265 		/* REAR */
3266 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3267 		if (func == NULL) {
3268 			error = ENOMEM;
3269 			goto bad;
3270 		}
3271 		pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3272 		if (pcminfo == NULL) {
3273 			error = ENOMEM;
3274 			goto bad;
3275 		}
3276 		pcminfo->card = sc;
3277 		pcminfo->route = RT_REAR;
3278 
3279 		func->func = SCF_PCM;
3280 		func->varinfo = pcminfo;
3281 		sc->pcm[RT_REAR] = device_add_child(dev, "pcm", -1);
3282 		device_set_ivars(sc->pcm[RT_REAR], func);
3283 		if (sc->has_51) {
3284 			/* CENTER */
3285 			func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3286 			if (func == NULL) {
3287 				error = ENOMEM;
3288 				goto bad;
3289 			}
3290 			pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3291 			if (pcminfo == NULL) {
3292 				error = ENOMEM;
3293 				goto bad;
3294 			}
3295 			pcminfo->card = sc;
3296 			pcminfo->route = RT_CENTER;
3297 
3298 			func->func = SCF_PCM;
3299 			func->varinfo = pcminfo;
3300 			sc->pcm[RT_CENTER] = device_add_child(dev, "pcm", -1);
3301 			device_set_ivars(sc->pcm[RT_CENTER], func);
3302 			/* SUB */
3303 			func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3304 			if (func == NULL) {
3305 				error = ENOMEM;
3306 				goto bad;
3307 			}
3308 			pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3309 			if (pcminfo == NULL) {
3310 				error = ENOMEM;
3311 				goto bad;
3312 			}
3313 			pcminfo->card = sc;
3314 			pcminfo->route = RT_SUB;
3315 
3316 			func->func = SCF_PCM;
3317 			func->varinfo = pcminfo;
3318 			sc->pcm[RT_SUB] = device_add_child(dev, "pcm", -1);
3319 			device_set_ivars(sc->pcm[RT_SUB], func);
3320 		}
3321 		if (sc->has_71) {
3322 			/* SIDE */
3323 			func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3324 			if (func == NULL) {
3325 				error = ENOMEM;
3326 				goto bad;
3327 			}
3328 			pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3329 			if (pcminfo == NULL) {
3330 				error = ENOMEM;
3331 				goto bad;
3332 			}
3333 			pcminfo->card = sc;
3334 			pcminfo->route = RT_SIDE;
3335 
3336 			func->func = SCF_PCM;
3337 			func->varinfo = pcminfo;
3338 			sc->pcm[RT_SIDE] = device_add_child(dev, "pcm", -1);
3339 			device_set_ivars(sc->pcm[RT_SIDE], func);
3340 		}
3341 	} /* mch_disabled */
3342 
3343 	if (sc->mch_rec) {
3344 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3345 		if (func == NULL) {
3346 			error = ENOMEM;
3347 			goto bad;
3348 		}
3349 		pcminfo = malloc(sizeof(struct emu_pcminfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3350 		if (pcminfo == NULL) {
3351 			error = ENOMEM;
3352 			goto bad;
3353 		}
3354 		pcminfo->card = sc;
3355 		pcminfo->route = RT_MCHRECORD;
3356 
3357 		func->func = SCF_PCM;
3358 		func->varinfo = pcminfo;
3359 		sc->pcm[RT_MCHRECORD] = device_add_child(dev, "pcm", -1);
3360 		device_set_ivars(sc->pcm[RT_MCHRECORD], func);
3361 	} /*mch_rec */
3362 
3363 	for (i = 0; i < 2; i++)
3364 		sc->midi[i] = NULL;
3365 
3366 	/* MIDI has some memory mangament and (possible) locking problems */
3367 #if 0
3368 	/* Midi Interface 1: Live!, Audigy, Audigy 2 */
3369 	if ((sc->is_emu10k1) || (sc->is_emu10k2) || (sc->is_ca0102)) {
3370 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3371 		if (func == NULL) {
3372 			error = ENOMEM;
3373 			goto bad;
3374 		}
3375 		midiinfo = malloc(sizeof(struct emu_midiinfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3376 		if (midiinfo == NULL) {
3377 			error = ENOMEM;
3378 			goto bad;
3379 		}
3380 		midiinfo->card = sc;
3381 		if (sc->is_emu10k2 || (sc->is_ca0102)) {
3382 			midiinfo->port = A_MUDATA1;
3383 			midiinfo->portnr = 1;
3384 		}
3385 		if (sc->is_emu10k1) {
3386 			midiinfo->port = MUDATA;
3387 			midiinfo->portnr = 1;
3388 		}
3389 		func->func = SCF_MIDI;
3390 		func->varinfo = midiinfo;
3391 		sc->midi[0] = device_add_child(dev, "midi", -1);
3392 		device_set_ivars(sc->midi[0], func);
3393 	}
3394 	/* Midi Interface 2: Audigy, Audigy 2 (on AudigyDrive) */
3395 	if (sc->is_emu10k2 || (sc->is_ca0102)) {
3396 		func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT | M_ZERO);
3397 		if (func == NULL) {
3398 			error = ENOMEM;
3399 			goto bad;
3400 		}
3401 		midiinfo = malloc(sizeof(struct emu_midiinfo), M_DEVBUF, M_NOWAIT | M_ZERO);
3402 		if (midiinfo == NULL) {
3403 			error = ENOMEM;
3404 			goto bad;
3405 		}
3406 		midiinfo->card = sc;
3407 
3408 		midiinfo->port = A_MUDATA2;
3409 		midiinfo->portnr = 2;
3410 
3411 		func->func = SCF_MIDI;
3412 		func->varinfo = midiinfo;
3413 		sc->midi[1] = device_add_child(dev, "midi", -1);
3414 		device_set_ivars(sc->midi[1], func);
3415 	}
3416 #endif
3417 	return (bus_generic_attach(dev));
3418 
3419 bad:
3420 	/* XXX can we just call emu_pci_detach here? */
3421 	if (sc->cdev)
3422 		emu10kx_dev_uninit(sc);
3423 	if (sc->rm != NULL)
3424 		emu_rm_uninit(sc);
3425 	if (sc->reg)
3426 		bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
3427 	if (sc->ih)
3428 		bus_teardown_intr(dev, sc->irq, sc->ih);
3429 	if (sc->irq)
3430 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
3431 	mtx_destroy(&sc->rw);
3432 	mtx_destroy(&sc->lock);
3433 	return (error);
3434 }
3435 
3436 static int
3437 emu_pci_detach(device_t dev)
3438 {
3439 	struct emu_sc_info *sc;
3440 	struct sndcard_func *func;
3441 	int devcount, i;
3442 	device_t *childlist;
3443 	int r = 0;
3444 
3445 	sc = device_get_softc(dev);
3446 
3447 	for (i = 0; i < RT_COUNT; i++) {
3448 		if (sc->pcm[i] != NULL) {
3449 			func = device_get_ivars(sc->pcm[i]);
3450 			if (func != NULL && func->func == SCF_PCM) {
3451 				device_set_ivars(sc->pcm[i], NULL);
3452 				free(func->varinfo, M_DEVBUF);
3453 				free(func, M_DEVBUF);
3454 			}
3455 			r = device_delete_child(dev, sc->pcm[i]);
3456 			if (r)	return (r);
3457 		}
3458 	}
3459 
3460 	if (sc->midi[0] != NULL) {
3461 		func = device_get_ivars(sc->midi[0]);
3462 		if (func != NULL && func->func == SCF_MIDI) {
3463 			device_set_ivars(sc->midi[0], NULL);
3464 			free(func->varinfo, M_DEVBUF);
3465 			free(func, M_DEVBUF);
3466 		}
3467 		r = device_delete_child(dev, sc->midi[0]);
3468 		if (r)	return (r);
3469 	}
3470 
3471 	if (sc->midi[1] != NULL) {
3472 		func = device_get_ivars(sc->midi[1]);
3473 		if (func != NULL && func->func == SCF_MIDI) {
3474 			device_set_ivars(sc->midi[1], NULL);
3475 			free(func->varinfo, M_DEVBUF);
3476 			free(func, M_DEVBUF);
3477 		}
3478 		r = device_delete_child(dev, sc->midi[1]);
3479 		if (r)	return (r);
3480 	}
3481 
3482 	if (device_get_children(dev, &childlist, &devcount) == 0)
3483 		for (i = 0; i < devcount - 1; i++) {
3484 			device_printf(dev, "removing stale child %d (unit %d)\n", i, device_get_unit(childlist[i]));
3485 			func = device_get_ivars(childlist[i]);
3486 			if (func != NULL && (func->func == SCF_MIDI || func->func == SCF_PCM)) {
3487 				device_set_ivars(childlist[i], NULL);
3488 				free(func->varinfo, M_DEVBUF);
3489 				free(func, M_DEVBUF);
3490 			}
3491 			device_delete_child(dev, childlist[i]);
3492 		}
3493 	if (childlist != NULL)
3494 		free(childlist, M_TEMP);
3495 
3496 	r = emu10kx_dev_uninit(sc);
3497 	if (r)
3498 		return (r);
3499 
3500 	/* shutdown chip */
3501 	emu_uninit(sc);
3502 	emu_rm_uninit(sc);
3503 
3504 	if (sc->mem.dmat)
3505 		bus_dma_tag_destroy(sc->mem.dmat);
3506 
3507 	if (sc->reg)
3508 		bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
3509 	bus_teardown_intr(dev, sc->irq, sc->ih);
3510 	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
3511 	mtx_destroy(&sc->rw);
3512 	mtx_destroy(&sc->lock);
3513 
3514 	return (bus_generic_detach(dev));
3515 }
3516 /* add suspend, resume */
3517 static device_method_t emu_methods[] = {
3518 	/* Device interface */
3519 	DEVMETHOD(device_probe, emu_pci_probe),
3520 	DEVMETHOD(device_attach, emu_pci_attach),
3521 	DEVMETHOD(device_detach, emu_pci_detach),
3522 	/* Bus methods */
3523 	DEVMETHOD(bus_read_ivar, emu_read_ivar),
3524 	DEVMETHOD(bus_write_ivar, emu_write_ivar),
3525 
3526 	{0, 0}
3527 };
3528 
3529 
3530 static driver_t emu_driver = {
3531 	"emu10kx",
3532 	emu_methods,
3533 	sizeof(struct emu_sc_info),
3534 	NULL,
3535 	0,
3536 	NULL
3537 };
3538 
3539 static int
3540 emu_modevent(module_t mod __unused, int cmd, void *data __unused)
3541 {
3542 	int err = 0;
3543 
3544 	switch (cmd) {
3545 	case MOD_LOAD:
3546 		break;		/* Success */
3547 
3548 	case MOD_UNLOAD:
3549 	case MOD_SHUTDOWN:
3550 
3551 		/* XXX  Should we check state of pcm & midi subdevices here? */
3552 
3553 		break;		/* Success */
3554 
3555 	default:
3556 		err = EINVAL;
3557 		break;
3558 	}
3559 
3560 	return (err);
3561 
3562 }
3563 
3564 static devclass_t emu_devclass;
3565 
3566 DRIVER_MODULE(snd_emu10kx, pci, emu_driver, emu_devclass, emu_modevent, NULL);
3567 MODULE_VERSION(snd_emu10kx, SND_EMU10KX_PREFVER);
3568