1/*-
2 * Copyright (c) 2004 David O'Brien <obrien@FreeBSD.org>
3 * Copyright (c) 2003 Orlando Bassotto <orlando.bassotto@ieo-research.it>
4 * Copyright (c) 1999 Cameron Grant <cg@freebsd.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHERIN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29#ifdef HAVE_KERNEL_OPTION_HEADERS
30#include "opt_snd.h"
31#endif
32
33#include <dev/sound/pcm/sound.h>
34#include <dev/sound/pcm/ac97.h>
35#include <dev/sound/pci/emuxkireg.h>
36
37#include <dev/pci/pcireg.h>
38#include <dev/pci/pcivar.h>
39#include <sys/queue.h>
40
41#include <dev/sound/midi/mpu401.h>
42#include "mpufoi_if.h"
43
44SND_DECLARE_FILE("$FreeBSD$");
45
46/* -------------------------------------------------------------------- */
47
48#define	NUM_G		64	/* use all channels */
49#define	WAVEOUT_MAXBUFSIZE 32768
50#define	EMUPAGESIZE	4096	/* don't change */
51#define	EMUMAXPAGES	(WAVEOUT_MAXBUFSIZE * NUM_G / EMUPAGESIZE)
52#define	EMU10K1_PCI_ID	0x00021102	/* 1102 => Creative Labs Vendor ID */
53#define	EMU10K2_PCI_ID	0x00041102
54#define	EMU10K3_PCI_ID	0x00081102
55#define	EMU_DEFAULT_BUFSZ	4096
56#define EMU_MAX_CHANS	8
57#define	EMU_CHANS	4
58
59#define	MAXREQVOICES	8
60#define	RESERVED	0
61#define	NUM_MIDI	16
62#define	NUM_FXSENDS	4
63
64#define	TMEMSIZE	256*1024
65#define	TMEMSIZEREG	4
66
67#define	ENABLE		0xffffffff
68#define	DISABLE		0x00000000
69#define	ENV_ON		EMU_CHAN_DCYSUSV_CHANNELENABLE_MASK
70#define	ENV_OFF		0x00	/* XXX: should this be 1? */
71
72#define	EMU_A_IOCFG_GPOUT_A	0x40
73#define	EMU_A_IOCFG_GPOUT_D	0x04
74#define	EMU_A_IOCFG_GPOUT_AD (EMU_A_IOCFG_GPOUT_A|EMU_A_IOCFG_GPOUT_D)  /* EMU_A_IOCFG_GPOUT0 */
75
76#define	EMU_HCFG_GPOUT1		0x00000800
77
78/* instruction set */
79#define iACC3	 0x06
80#define iMACINT0 0x04
81#define iINTERP  0x0e
82
83#define C_00000000	0x40
84#define C_00000001	0x41
85#define C_00000004	0x44
86#define C_40000000	0x4d
87/* Audigy constants */
88#define A_C_00000000	0xc0
89#define A_C_40000000	0xcd
90
91/* GPRs */
92#define FXBUS(x)	(0x00 + (x))
93#define EXTIN(x)	(0x10 + (x))
94#define EXTOUT(x)	(0x20 + (x))
95
96#define GPR(x)		(EMU_FXGPREGBASE + (x))
97#define A_EXTIN(x)	(0x40 + (x))
98#define A_FXBUS(x)	(0x00 + (x))
99#define A_EXTOUT(x)	(0x60 + (x))
100#define A_GPR(x)	(EMU_A_FXGPREGBASE + (x))
101
102/* FX buses */
103#define FXBUS_PCM_LEFT		0x00
104#define FXBUS_PCM_RIGHT		0x01
105#define FXBUS_MIDI_LEFT		0x04
106#define FXBUS_MIDI_RIGHT	0x05
107#define FXBUS_MIDI_REVERB	0x0c
108#define FXBUS_MIDI_CHORUS	0x0d
109
110/* Inputs */
111#define EXTIN_AC97_L		0x00
112#define EXTIN_AC97_R		0x01
113#define EXTIN_SPDIF_CD_L	0x02
114#define EXTIN_SPDIF_CD_R	0x03
115#define EXTIN_TOSLINK_L		0x06
116#define EXTIN_TOSLINK_R		0x07
117#define EXTIN_COAX_SPDIF_L	0x0a
118#define EXTIN_COAX_SPDIF_R	0x0b
119/* Audigy Inputs */
120#define A_EXTIN_AC97_L		0x00
121#define A_EXTIN_AC97_R		0x01
122
123/* Outputs */
124#define EXTOUT_AC97_L	   0x00
125#define EXTOUT_AC97_R	   0x01
126#define EXTOUT_TOSLINK_L   0x02
127#define EXTOUT_TOSLINK_R   0x03
128#define EXTOUT_AC97_CENTER 0x04
129#define EXTOUT_AC97_LFE	   0x05
130#define EXTOUT_HEADPHONE_L 0x06
131#define EXTOUT_HEADPHONE_R 0x07
132#define EXTOUT_REAR_L	   0x08
133#define EXTOUT_REAR_R	   0x09
134#define EXTOUT_ADC_CAP_L   0x0a
135#define EXTOUT_ADC_CAP_R   0x0b
136#define EXTOUT_ACENTER	   0x11
137#define EXTOUT_ALFE	   0x12
138/* Audigy Outputs */
139#define A_EXTOUT_FRONT_L	0x00
140#define A_EXTOUT_FRONT_R	0x01
141#define A_EXTOUT_CENTER		0x02
142#define A_EXTOUT_LFE		0x03
143#define A_EXTOUT_HEADPHONE_L	0x04
144#define A_EXTOUT_HEADPHONE_R	0x05
145#define A_EXTOUT_REAR_L		0x06
146#define A_EXTOUT_REAR_R		0x07
147#define A_EXTOUT_AFRONT_L	0x08
148#define A_EXTOUT_AFRONT_R	0x09
149#define A_EXTOUT_ACENTER	0x0a
150#define A_EXTOUT_ALFE		0x0b
151#define A_EXTOUT_AREAR_L	0x0e
152#define A_EXTOUT_AREAR_R	0x0f
153#define A_EXTOUT_AC97_L		0x10
154#define A_EXTOUT_AC97_R		0x11
155#define A_EXTOUT_ADC_CAP_L	0x16
156#define A_EXTOUT_ADC_CAP_R	0x17
157
158struct emu_memblk {
159	SLIST_ENTRY(emu_memblk) link;
160	void *buf;
161	bus_addr_t buf_addr;
162	u_int32_t pte_start, pte_size;
163};
164
165struct emu_mem {
166	u_int8_t bmap[EMUMAXPAGES / 8];
167	u_int32_t *ptb_pages;
168	void *silent_page;
169	bus_addr_t silent_page_addr;
170	bus_addr_t ptb_pages_addr;
171	SLIST_HEAD(, emu_memblk) blocks;
172};
173
174struct emu_voice {
175	int vnum;
176	unsigned int b16:1, stereo:1, busy:1, running:1, ismaster:1;
177	int speed;
178	int start, end, vol;
179	int fxrt1;	/* FX routing */
180	int fxrt2;	/* FX routing (only for audigy) */
181	u_int32_t buf;
182	struct emu_voice *slave;
183	struct pcm_channel *channel;
184};
185
186struct sc_info;
187
188/* channel registers */
189struct sc_pchinfo {
190	int spd, fmt, blksz, run;
191	struct emu_voice *master, *slave;
192	struct snd_dbuf *buffer;
193	struct pcm_channel *channel;
194	struct sc_info *parent;
195};
196
197struct sc_rchinfo {
198	int spd, fmt, run, blksz, num;
199	u_int32_t idxreg, basereg, sizereg, setupreg, irqmask;
200	struct snd_dbuf *buffer;
201	struct pcm_channel *channel;
202	struct sc_info *parent;
203};
204
205/* device private data */
206struct sc_info {
207	device_t	dev;
208	u_int32_t	type, rev;
209	u_int32_t	tos_link:1, APS:1, audigy:1, audigy2:1;
210	u_int32_t	addrmask;	/* wider if audigy */
211
212	bus_space_tag_t st;
213	bus_space_handle_t sh;
214	bus_dma_tag_t parent_dmat;
215
216	struct resource *reg, *irq;
217	void		*ih;
218	struct mtx	*lock;
219
220	unsigned int bufsz;
221	int timer, timerinterval;
222	int pnum, rnum;
223	int nchans;
224	struct emu_mem mem;
225	struct emu_voice voice[64];
226	struct sc_pchinfo pch[EMU_MAX_CHANS];
227	struct sc_rchinfo rch[3];
228	struct mpu401   *mpu;
229	mpu401_intr_t           *mpu_intr;
230	int mputx;
231};
232
233/* -------------------------------------------------------------------- */
234
235/*
236 * prototypes
237 */
238
239/* stuff */
240static int emu_init(struct sc_info *);
241static void emu_intr(void *);
242static void *emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr);
243static void *emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr);
244static int emu_memfree(struct sc_info *sc, void *buf);
245static int emu_memstart(struct sc_info *sc, void *buf);
246#ifdef EMUDEBUG
247static void emu_vdump(struct sc_info *sc, struct emu_voice *v);
248#endif
249
250/* talk to the card */
251static u_int32_t emu_rd(struct sc_info *, int, int);
252static void emu_wr(struct sc_info *, int, u_int32_t, int);
253
254/* -------------------------------------------------------------------- */
255
256static u_int32_t emu_rfmt_ac97[] = {
257	SND_FORMAT(AFMT_S16_LE, 1, 0),
258	SND_FORMAT(AFMT_S16_LE, 2, 0),
259	0
260};
261
262static u_int32_t emu_rfmt_mic[] = {
263	SND_FORMAT(AFMT_U8, 1, 0),
264	0
265};
266
267static u_int32_t emu_rfmt_efx[] = {
268	SND_FORMAT(AFMT_S16_LE, 2, 0),
269	0
270};
271
272static struct pcmchan_caps emu_reccaps[3] = {
273	{8000, 48000, emu_rfmt_ac97, 0},
274	{8000, 8000, emu_rfmt_mic, 0},
275	{48000, 48000, emu_rfmt_efx, 0},
276};
277
278static u_int32_t emu_pfmt[] = {
279	SND_FORMAT(AFMT_U8, 1, 0),
280	SND_FORMAT(AFMT_U8, 2, 0),
281	SND_FORMAT(AFMT_S16_LE, 1, 0),
282	SND_FORMAT(AFMT_S16_LE, 2, 0),
283	0
284};
285
286static struct pcmchan_caps emu_playcaps = {4000, 48000, emu_pfmt, 0};
287
288static int adcspeed[8] = {48000, 44100, 32000, 24000, 22050, 16000, 11025, 8000};
289/* audigy supports 12kHz. */
290static int audigy_adcspeed[9] = {
291	48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000
292};
293
294/* -------------------------------------------------------------------- */
295/* Hardware */
296static u_int32_t
297emu_rd(struct sc_info *sc, int regno, int size)
298{
299	switch (size) {
300	case 1:
301		return bus_space_read_1(sc->st, sc->sh, regno);
302	case 2:
303		return bus_space_read_2(sc->st, sc->sh, regno);
304	case 4:
305		return bus_space_read_4(sc->st, sc->sh, regno);
306	default:
307		return 0xffffffff;
308	}
309}
310
311static void
312emu_wr(struct sc_info *sc, int regno, u_int32_t data, int size)
313{
314	switch (size) {
315	case 1:
316		bus_space_write_1(sc->st, sc->sh, regno, data);
317		break;
318	case 2:
319		bus_space_write_2(sc->st, sc->sh, regno, data);
320		break;
321	case 4:
322		bus_space_write_4(sc->st, sc->sh, regno, data);
323		break;
324	}
325}
326
327static u_int32_t
328emu_rdptr(struct sc_info *sc, int chn, int reg)
329{
330	u_int32_t ptr, val, mask, size, offset;
331
332	ptr = ((reg << 16) & sc->addrmask) | (chn & EMU_PTR_CHNO_MASK);
333	emu_wr(sc, EMU_PTR, ptr, 4);
334	val = emu_rd(sc, EMU_DATA, 4);
335	if (reg & 0xff000000) {
336		size = (reg >> 24) & 0x3f;
337		offset = (reg >> 16) & 0x1f;
338		mask = ((1 << size) - 1) << offset;
339		val &= mask;
340		val >>= offset;
341	}
342	return val;
343}
344
345static void
346emu_wrptr(struct sc_info *sc, int chn, int reg, u_int32_t data)
347{
348	u_int32_t ptr, mask, size, offset;
349
350	ptr = ((reg << 16) & sc->addrmask) | (chn & EMU_PTR_CHNO_MASK);
351	emu_wr(sc, EMU_PTR, ptr, 4);
352	if (reg & 0xff000000) {
353		size = (reg >> 24) & 0x3f;
354		offset = (reg >> 16) & 0x1f;
355		mask = ((1 << size) - 1) << offset;
356		data <<= offset;
357		data &= mask;
358		data |= emu_rd(sc, EMU_DATA, 4) & ~mask;
359	}
360	emu_wr(sc, EMU_DATA, data, 4);
361}
362
363static void
364emu_wrefx(struct sc_info *sc, unsigned int pc, unsigned int data)
365{
366	pc += sc->audigy ? EMU_A_MICROCODEBASE : EMU_MICROCODEBASE;
367	emu_wrptr(sc, 0, pc, data);
368}
369
370/* -------------------------------------------------------------------- */
371/* ac97 codec */
372/* no locking needed */
373
374static int
375emu_rdcd(kobj_t obj, void *devinfo, int regno)
376{
377	struct sc_info *sc = (struct sc_info *)devinfo;
378
379	emu_wr(sc, EMU_AC97ADDR, regno, 1);
380	return emu_rd(sc, EMU_AC97DATA, 2);
381}
382
383static int
384emu_wrcd(kobj_t obj, void *devinfo, int regno, u_int32_t data)
385{
386	struct sc_info *sc = (struct sc_info *)devinfo;
387
388	emu_wr(sc, EMU_AC97ADDR, regno, 1);
389	emu_wr(sc, EMU_AC97DATA, data, 2);
390	return 0;
391}
392
393static kobj_method_t emu_ac97_methods[] = {
394	KOBJMETHOD(ac97_read,		emu_rdcd),
395	KOBJMETHOD(ac97_write,		emu_wrcd),
396	KOBJMETHOD_END
397};
398AC97_DECLARE(emu_ac97);
399
400/* -------------------------------------------------------------------- */
401/* stuff */
402static int
403emu_settimer(struct sc_info *sc)
404{
405	struct sc_pchinfo *pch;
406	struct sc_rchinfo *rch;
407	int i, tmp, rate;
408
409	rate = 0;
410	for (i = 0; i < sc->nchans; i++) {
411		pch = &sc->pch[i];
412		if (pch->buffer) {
413			tmp = (pch->spd * sndbuf_getalign(pch->buffer))
414			    / pch->blksz;
415			if (tmp > rate)
416				rate = tmp;
417		}
418	}
419
420	for (i = 0; i < 3; i++) {
421		rch = &sc->rch[i];
422		if (rch->buffer) {
423			tmp = (rch->spd * sndbuf_getalign(rch->buffer))
424			    / rch->blksz;
425			if (tmp > rate)
426				rate = tmp;
427		}
428	}
429	RANGE(rate, 48, 9600);
430	sc->timerinterval = 48000 / rate;
431	emu_wr(sc, EMU_TIMER, sc->timerinterval & 0x03ff, 2);
432
433	return sc->timerinterval;
434}
435
436static int
437emu_enatimer(struct sc_info *sc, int go)
438{
439	u_int32_t x;
440	if (go) {
441		if (sc->timer++ == 0) {
442			x = emu_rd(sc, EMU_INTE, 4);
443			x |= EMU_INTE_INTERTIMERENB;
444			emu_wr(sc, EMU_INTE, x, 4);
445		}
446	} else {
447		sc->timer = 0;
448		x = emu_rd(sc, EMU_INTE, 4);
449		x &= ~EMU_INTE_INTERTIMERENB;
450		emu_wr(sc, EMU_INTE, x, 4);
451	}
452	return 0;
453}
454
455static void
456emu_enastop(struct sc_info *sc, char channel, int enable)
457{
458	int reg = (channel & 0x20) ? EMU_SOLEH : EMU_SOLEL;
459	channel &= 0x1f;
460	reg |= 1 << 24;
461	reg |= channel << 16;
462	emu_wrptr(sc, 0, reg, enable);
463}
464
465static int
466emu_recval(int speed) {
467	int val;
468
469	val = 0;
470	while (val < 7 && speed < adcspeed[val])
471		val++;
472	return val;
473}
474
475static int
476audigy_recval(int speed) {
477	int val;
478
479	val = 0;
480	while (val < 8 && speed < audigy_adcspeed[val])
481		val++;
482	return val;
483}
484
485static u_int32_t
486emu_rate_to_pitch(u_int32_t rate)
487{
488	static u_int32_t logMagTable[128] = {
489		0x00000, 0x02dfc, 0x05b9e, 0x088e6, 0x0b5d6, 0x0e26f, 0x10eb3, 0x13aa2,
490		0x1663f, 0x1918a, 0x1bc84, 0x1e72e, 0x2118b, 0x23b9a, 0x2655d, 0x28ed5,
491		0x2b803, 0x2e0e8, 0x30985, 0x331db, 0x359eb, 0x381b6, 0x3a93d, 0x3d081,
492		0x3f782, 0x41e42, 0x444c1, 0x46b01, 0x49101, 0x4b6c4, 0x4dc49, 0x50191,
493		0x5269e, 0x54b6f, 0x57006, 0x59463, 0x5b888, 0x5dc74, 0x60029, 0x623a7,
494		0x646ee, 0x66a00, 0x68cdd, 0x6af86, 0x6d1fa, 0x6f43c, 0x7164b, 0x73829,
495		0x759d4, 0x77b4f, 0x79c9a, 0x7bdb5, 0x7dea1, 0x7ff5e, 0x81fed, 0x8404e,
496		0x86082, 0x88089, 0x8a064, 0x8c014, 0x8df98, 0x8fef1, 0x91e20, 0x93d26,
497		0x95c01, 0x97ab4, 0x9993e, 0x9b79f, 0x9d5d9, 0x9f3ec, 0xa11d8, 0xa2f9d,
498		0xa4d3c, 0xa6ab5, 0xa8808, 0xaa537, 0xac241, 0xadf26, 0xafbe7, 0xb1885,
499		0xb3500, 0xb5157, 0xb6d8c, 0xb899f, 0xba58f, 0xbc15e, 0xbdd0c, 0xbf899,
500		0xc1404, 0xc2f50, 0xc4a7b, 0xc6587, 0xc8073, 0xc9b3f, 0xcb5ed, 0xcd07c,
501		0xceaec, 0xd053f, 0xd1f73, 0xd398a, 0xd5384, 0xd6d60, 0xd8720, 0xda0c3,
502		0xdba4a, 0xdd3b4, 0xded03, 0xe0636, 0xe1f4e, 0xe384a, 0xe512c, 0xe69f3,
503		0xe829f, 0xe9b31, 0xeb3a9, 0xecc08, 0xee44c, 0xefc78, 0xf148a, 0xf2c83,
504		0xf4463, 0xf5c2a, 0xf73da, 0xf8b71, 0xfa2f0, 0xfba57, 0xfd1a7, 0xfe8df
505	};
506	static char logSlopeTable[128] = {
507		0x5c, 0x5c, 0x5b, 0x5a, 0x5a, 0x59, 0x58, 0x58,
508		0x57, 0x56, 0x56, 0x55, 0x55, 0x54, 0x53, 0x53,
509		0x52, 0x52, 0x51, 0x51, 0x50, 0x50, 0x4f, 0x4f,
510		0x4e, 0x4d, 0x4d, 0x4d, 0x4c, 0x4c, 0x4b, 0x4b,
511		0x4a, 0x4a, 0x49, 0x49, 0x48, 0x48, 0x47, 0x47,
512		0x47, 0x46, 0x46, 0x45, 0x45, 0x45, 0x44, 0x44,
513		0x43, 0x43, 0x43, 0x42, 0x42, 0x42, 0x41, 0x41,
514		0x41, 0x40, 0x40, 0x40, 0x3f, 0x3f, 0x3f, 0x3e,
515		0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 0x3c,
516		0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39,
517		0x39, 0x39, 0x39, 0x38, 0x38, 0x38, 0x38, 0x37,
518		0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x36, 0x35,
519		0x35, 0x35, 0x35, 0x34, 0x34, 0x34, 0x34, 0x34,
520		0x33, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x32,
521		0x32, 0x31, 0x31, 0x31, 0x31, 0x31, 0x30, 0x30,
522		0x30, 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f
523	};
524	int i;
525
526	if (rate == 0)
527		return 0;	/* Bail out if no leading "1" */
528	rate *= 11185;	/* Scale 48000 to 0x20002380 */
529	for (i = 31; i > 0; i--) {
530		if (rate & 0x80000000) {	/* Detect leading "1" */
531			return (((u_int32_t) (i - 15) << 20) +
532			    logMagTable[0x7f & (rate >> 24)] +
533			    (0x7f & (rate >> 17)) *
534			    logSlopeTable[0x7f & (rate >> 24)]);
535		}
536		rate <<= 1;
537	}
538
539	return 0;		/* Should never reach this point */
540}
541
542static u_int32_t
543emu_rate_to_linearpitch(u_int32_t rate)
544{
545	rate = (rate << 8) / 375;
546	return (rate >> 1) + (rate & 1);
547}
548
549static struct emu_voice *
550emu_valloc(struct sc_info *sc)
551{
552	struct emu_voice *v;
553	int i;
554
555	v = NULL;
556	for (i = 0; i < 64 && sc->voice[i].busy; i++);
557	if (i < 64) {
558		v = &sc->voice[i];
559		v->busy = 1;
560	}
561	return v;
562}
563
564static int
565emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s,
566	  u_int32_t sz, struct snd_dbuf *b)
567{
568	void *buf;
569	bus_addr_t tmp_addr;
570
571	buf = emu_memalloc(sc, sz, &tmp_addr);
572	if (buf == NULL)
573		return -1;
574	if (b != NULL)
575		sndbuf_setup(b, buf, sz);
576	m->start = emu_memstart(sc, buf) * EMUPAGESIZE;
577	m->end = m->start + sz;
578	m->channel = NULL;
579	m->speed = 0;
580	m->b16 = 0;
581	m->stereo = 0;
582	m->running = 0;
583	m->ismaster = 1;
584	m->vol = 0xff;
585	m->buf = tmp_addr;
586	m->slave = s;
587	if (sc->audigy) {
588		m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 8 |
589		    FXBUS_PCM_LEFT << 16 | FXBUS_MIDI_REVERB << 24;
590		m->fxrt2 = 0x3f3f3f3f;	/* No effects on second route */
591	} else {
592		m->fxrt1 = FXBUS_MIDI_CHORUS | FXBUS_PCM_RIGHT << 4 |
593		    FXBUS_PCM_LEFT << 8 | FXBUS_MIDI_REVERB << 12;
594		m->fxrt2 = 0;
595	}
596
597	if (s != NULL) {
598		s->start = m->start;
599		s->end = m->end;
600		s->channel = NULL;
601		s->speed = 0;
602		s->b16 = 0;
603		s->stereo = 0;
604		s->running = 0;
605		s->ismaster = 0;
606		s->vol = m->vol;
607		s->buf = m->buf;
608		s->fxrt1 = m->fxrt1;
609		s->fxrt2 = m->fxrt2;
610		s->slave = NULL;
611	}
612	return 0;
613}
614
615static void
616emu_vsetup(struct sc_pchinfo *ch)
617{
618	struct emu_voice *v = ch->master;
619
620	if (ch->fmt) {
621		v->b16 = (ch->fmt & AFMT_16BIT) ? 1 : 0;
622		v->stereo = (AFMT_CHANNEL(ch->fmt) > 1) ? 1 : 0;
623		if (v->slave != NULL) {
624			v->slave->b16 = v->b16;
625			v->slave->stereo = v->stereo;
626		}
627	}
628	if (ch->spd) {
629		v->speed = ch->spd;
630		if (v->slave != NULL)
631			v->slave->speed = v->speed;
632	}
633}
634
635static void
636emu_vwrite(struct sc_info *sc, struct emu_voice *v)
637{
638	int s;
639	int l, r, x, y;
640	u_int32_t sa, ea, start, val, silent_page;
641
642	s = (v->stereo ? 1 : 0) + (v->b16 ? 1 : 0);
643
644	sa = v->start >> s;
645	ea = v->end >> s;
646
647	l = r = x = y = v->vol;
648	if (v->stereo) {
649		l = v->ismaster ? l : 0;
650		r = v->ismaster ? 0 : r;
651	}
652
653	emu_wrptr(sc, v->vnum, EMU_CHAN_CPF, v->stereo ? EMU_CHAN_CPF_STEREO_MASK : 0);
654	val = v->stereo ? 28 : 30;
655	val *= v->b16 ? 1 : 2;
656	start = sa + val;
657
658	if (sc->audigy) {
659		emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT1, v->fxrt1);
660		emu_wrptr(sc, v->vnum, EMU_A_CHAN_FXRT2, v->fxrt2);
661		emu_wrptr(sc, v->vnum, EMU_A_CHAN_SENDAMOUNTS, 0);
662	}
663	else
664		emu_wrptr(sc, v->vnum, EMU_CHAN_FXRT, v->fxrt1 << 16);
665
666	emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX, (x << 8) | r);
667	emu_wrptr(sc, v->vnum, EMU_CHAN_DSL, ea | (y << 24));
668	emu_wrptr(sc, v->vnum, EMU_CHAN_PSST, sa | (l << 24));
669	emu_wrptr(sc, v->vnum, EMU_CHAN_CCCA, start | (v->b16 ? 0 : EMU_CHAN_CCCA_8BITSELECT));
670
671	emu_wrptr(sc, v->vnum, EMU_CHAN_Z1, 0);
672	emu_wrptr(sc, v->vnum, EMU_CHAN_Z2, 0);
673
674	silent_page = ((u_int32_t)(sc->mem.silent_page_addr) << 1)
675	    | EMU_CHAN_MAP_PTI_MASK;
676	emu_wrptr(sc, v->vnum, EMU_CHAN_MAPA, silent_page);
677	emu_wrptr(sc, v->vnum, EMU_CHAN_MAPB, silent_page);
678
679	emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, EMU_CHAN_CVCF_CURRFILTER_MASK);
680	emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, EMU_CHAN_VTFT_FILTERTARGET_MASK);
681	emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDM, 0);
682	emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSM, EMU_CHAN_DCYSUSM_DECAYTIME_MASK);
683	emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL1, 0x8000);
684	emu_wrptr(sc, v->vnum, EMU_CHAN_LFOVAL2, 0x8000);
685	emu_wrptr(sc, v->vnum, EMU_CHAN_FMMOD, 0);
686	emu_wrptr(sc, v->vnum, EMU_CHAN_TREMFRQ, 0);
687	emu_wrptr(sc, v->vnum, EMU_CHAN_FM2FRQ2, 0);
688	emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVAL, 0x8000);
689
690	emu_wrptr(sc, v->vnum, EMU_CHAN_ATKHLDV,
691	    EMU_CHAN_ATKHLDV_HOLDTIME_MASK | EMU_CHAN_ATKHLDV_ATTACKTIME_MASK);
692	emu_wrptr(sc, v->vnum, EMU_CHAN_ENVVOL, 0x8000);
693
694	emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_FILTERAMOUNT, 0x7f);
695	emu_wrptr(sc, v->vnum, EMU_CHAN_PEFE_PITCHAMOUNT, 0);
696
697	if (v->slave != NULL)
698		emu_vwrite(sc, v->slave);
699}
700
701static void
702emu_vtrigger(struct sc_info *sc, struct emu_voice *v, int go)
703{
704	u_int32_t pitch_target, initial_pitch;
705	u_int32_t cra, cs, ccis;
706	u_int32_t sample, i;
707
708	if (go) {
709		cra = 64;
710		cs = v->stereo ? 4 : 2;
711		ccis = v->stereo ? 28 : 30;
712		ccis *= v->b16 ? 1 : 2;
713		sample = v->b16 ? 0x00000000 : 0x80808080;
714
715		for (i = 0; i < cs; i++)
716			emu_wrptr(sc, v->vnum, EMU_CHAN_CD0 + i, sample);
717		emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, 0);
718		emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_READADDRESS, cra);
719		emu_wrptr(sc, v->vnum, EMU_CHAN_CCR_CACHEINVALIDSIZE, ccis);
720
721		emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xff00);
722		emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0xffffffff);
723		emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0xffffffff);
724		emu_wrptr(sc, v->vnum, EMU_CHAN_DCYSUSV, 0x00007f7f);
725		emu_enastop(sc, v->vnum, 0);
726
727		pitch_target = emu_rate_to_linearpitch(v->speed);
728		initial_pitch = emu_rate_to_pitch(v->speed) >> 8;
729		emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, pitch_target);
730		emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, pitch_target);
731		emu_wrptr(sc, v->vnum, EMU_CHAN_IP, initial_pitch);
732	} else {
733		emu_wrptr(sc, v->vnum, EMU_CHAN_PTRX_PITCHTARGET, 0);
734		emu_wrptr(sc, v->vnum, EMU_CHAN_CPF_PITCH, 0);
735		emu_wrptr(sc, v->vnum, EMU_CHAN_IFATN, 0xffff);
736		emu_wrptr(sc, v->vnum, EMU_CHAN_VTFT, 0x0000ffff);
737		emu_wrptr(sc, v->vnum, EMU_CHAN_CVCF, 0x0000ffff);
738		emu_wrptr(sc, v->vnum, EMU_CHAN_IP, 0);
739		emu_enastop(sc, v->vnum, 1);
740	}
741	if (v->slave != NULL)
742		emu_vtrigger(sc, v->slave, go);
743}
744
745static int
746emu_vpos(struct sc_info *sc, struct emu_voice *v)
747{
748	int s, ptr;
749
750	s = (v->b16 ? 1 : 0) + (v->stereo ? 1 : 0);
751	ptr = (emu_rdptr(sc, v->vnum, EMU_CHAN_CCCA_CURRADDR) - (v->start >> s)) << s;
752	return ptr & ~0x0000001f;
753}
754
755#ifdef EMUDEBUG
756static void
757emu_vdump(struct sc_info *sc, struct emu_voice *v)
758{
759	char *regname[] = {
760		"cpf", "ptrx", "cvcf", "vtft", "z2", "z1", "psst", "dsl",
761		"ccca", "ccr", "clp", "fxrt", "mapa", "mapb", NULL, NULL,
762		"envvol", "atkhldv", "dcysusv", "lfoval1",
763		"envval", "atkhldm", "dcysusm", "lfoval2",
764		"ip", "ifatn", "pefe", "fmmod", "tremfrq", "fmfrq2",
765		"tempenv"
766	};
767	char *regname2[] = {
768		"mudata1", "mustat1", "mudata2", "mustat2",
769		"fxwc1", "fxwc2", "spdrate", NULL, NULL,
770		NULL, NULL, NULL, "fxrt2", "sndamnt", "fxrt1",
771		NULL, NULL
772	};
773	int i, x;
774
775	printf("voice number %d\n", v->vnum);
776	for (i = 0, x = 0; i <= 0x1e; i++) {
777		if (regname[i] == NULL)
778			continue;
779		printf("%s\t[%08x]", regname[i], emu_rdptr(sc, v->vnum, i));
780		printf("%s", (x == 2) ? "\n" : "\t");
781		x++;
782		if (x > 2)
783			x = 0;
784	}
785
786	/* Print out audigy extra registers */
787	if (sc->audigy) {
788		for (i = 0; i <= 0xe; i++) {
789			if (regname2[i] == NULL)
790				continue;
791			printf("%s\t[%08x]", regname2[i],
792			    emu_rdptr(sc, v->vnum, i + 0x70));
793			printf("%s", (x == 2)? "\n" : "\t");
794			x++;
795			if (x > 2)
796				x = 0;
797		}
798	}
799	printf("\n\n");
800}
801#endif
802
803/* channel interface */
804static void *
805emupchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
806    struct pcm_channel *c, int dir)
807{
808	struct sc_info *sc = devinfo;
809	struct sc_pchinfo *ch;
810	void *r;
811
812	KASSERT(dir == PCMDIR_PLAY, ("emupchan_init: bad direction"));
813	ch = &sc->pch[sc->pnum++];
814	ch->buffer = b;
815	ch->parent = sc;
816	ch->channel = c;
817	ch->blksz = sc->bufsz / 2;
818	ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
819	ch->spd = 8000;
820	snd_mtxlock(sc->lock);
821	ch->master = emu_valloc(sc);
822	ch->slave = emu_valloc(sc);
823	snd_mtxunlock(sc->lock);
824	r = (emu_vinit(sc, ch->master, ch->slave, sc->bufsz, ch->buffer))
825	    ? NULL : ch;
826
827	return r;
828}
829
830static int
831emupchan_free(kobj_t obj, void *data)
832{
833	struct sc_pchinfo *ch = data;
834	struct sc_info *sc = ch->parent;
835	int r;
836
837	snd_mtxlock(sc->lock);
838	r = emu_memfree(sc, sndbuf_getbuf(ch->buffer));
839	snd_mtxunlock(sc->lock);
840
841	return r;
842}
843
844static int
845emupchan_setformat(kobj_t obj, void *data, u_int32_t format)
846{
847	struct sc_pchinfo *ch = data;
848
849	ch->fmt = format;
850	return 0;
851}
852
853static u_int32_t
854emupchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
855{
856	struct sc_pchinfo *ch = data;
857
858	ch->spd = speed;
859	return ch->spd;
860}
861
862static u_int32_t
863emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
864{
865	struct sc_pchinfo *ch = data;
866	struct sc_info *sc = ch->parent;
867	int irqrate, blksz;
868
869	ch->blksz = blocksize;
870	snd_mtxlock(sc->lock);
871	emu_settimer(sc);
872	irqrate = 48000 / sc->timerinterval;
873	snd_mtxunlock(sc->lock);
874	blksz = (ch->spd * sndbuf_getalign(ch->buffer)) / irqrate;
875	return blocksize;
876}
877
878static int
879emupchan_trigger(kobj_t obj, void *data, int go)
880{
881	struct sc_pchinfo *ch = data;
882	struct sc_info *sc = ch->parent;
883
884	if (!PCMTRIG_COMMON(go))
885		return 0;
886
887	snd_mtxlock(sc->lock);
888	if (go == PCMTRIG_START) {
889		emu_vsetup(ch);
890		emu_vwrite(sc, ch->master);
891		emu_settimer(sc);
892		emu_enatimer(sc, 1);
893#ifdef EMUDEBUG
894		printf("start [%d bit, %s, %d hz]\n",
895			ch->master->b16 ? 16 : 8,
896			ch->master->stereo ? "stereo" : "mono",
897			ch->master->speed);
898		emu_vdump(sc, ch->master);
899		emu_vdump(sc, ch->slave);
900#endif
901	}
902	ch->run = (go == PCMTRIG_START) ? 1 : 0;
903	emu_vtrigger(sc, ch->master, ch->run);
904	snd_mtxunlock(sc->lock);
905	return 0;
906}
907
908static u_int32_t
909emupchan_getptr(kobj_t obj, void *data)
910{
911	struct sc_pchinfo *ch = data;
912	struct sc_info *sc = ch->parent;
913	int r;
914
915	snd_mtxlock(sc->lock);
916	r = emu_vpos(sc, ch->master);
917	snd_mtxunlock(sc->lock);
918
919	return r;
920}
921
922static struct pcmchan_caps *
923emupchan_getcaps(kobj_t obj, void *data)
924{
925	return &emu_playcaps;
926}
927
928static kobj_method_t emupchan_methods[] = {
929	KOBJMETHOD(channel_init,		emupchan_init),
930	KOBJMETHOD(channel_free,		emupchan_free),
931	KOBJMETHOD(channel_setformat,		emupchan_setformat),
932	KOBJMETHOD(channel_setspeed,		emupchan_setspeed),
933	KOBJMETHOD(channel_setblocksize,	emupchan_setblocksize),
934	KOBJMETHOD(channel_trigger,		emupchan_trigger),
935	KOBJMETHOD(channel_getptr,		emupchan_getptr),
936	KOBJMETHOD(channel_getcaps,		emupchan_getcaps),
937	KOBJMETHOD_END
938};
939CHANNEL_DECLARE(emupchan);
940
941/* channel interface */
942static void *
943emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
944    struct pcm_channel *c, int dir)
945{
946	struct sc_info *sc = devinfo;
947	struct sc_rchinfo *ch;
948
949	KASSERT(dir == PCMDIR_REC, ("emurchan_init: bad direction"));
950	ch = &sc->rch[sc->rnum];
951	ch->buffer = b;
952	ch->parent = sc;
953	ch->channel = c;
954	ch->blksz = sc->bufsz / 2;
955	ch->fmt = SND_FORMAT(AFMT_U8, 1, 0);
956	ch->spd = 8000;
957	ch->num = sc->rnum;
958	switch(sc->rnum) {
959	case 0:
960		ch->idxreg = sc->audigy ? EMU_A_ADCIDX : EMU_ADCIDX;
961		ch->basereg = EMU_ADCBA;
962		ch->sizereg = EMU_ADCBS;
963		ch->setupreg = EMU_ADCCR;
964		ch->irqmask = EMU_INTE_ADCBUFENABLE;
965		break;
966
967	case 1:
968		ch->idxreg = EMU_FXIDX;
969		ch->basereg = EMU_FXBA;
970		ch->sizereg = EMU_FXBS;
971		ch->setupreg = EMU_FXWC;
972		ch->irqmask = EMU_INTE_EFXBUFENABLE;
973		break;
974
975	case 2:
976		ch->idxreg = EMU_MICIDX;
977		ch->basereg = EMU_MICBA;
978		ch->sizereg = EMU_MICBS;
979		ch->setupreg = 0;
980		ch->irqmask = EMU_INTE_MICBUFENABLE;
981		break;
982	}
983	sc->rnum++;
984	if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 0, sc->bufsz) != 0)
985		return NULL;
986	else {
987		snd_mtxlock(sc->lock);
988		emu_wrptr(sc, 0, ch->basereg, sndbuf_getbufaddr(ch->buffer));
989		emu_wrptr(sc, 0, ch->sizereg, 0); /* off */
990		snd_mtxunlock(sc->lock);
991		return ch;
992	}
993}
994
995static int
996emurchan_setformat(kobj_t obj, void *data, u_int32_t format)
997{
998	struct sc_rchinfo *ch = data;
999
1000	ch->fmt = format;
1001	return 0;
1002}
1003
1004static u_int32_t
1005emurchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
1006{
1007	struct sc_rchinfo *ch = data;
1008
1009	if (ch->num == 0) {
1010		if (ch->parent->audigy)
1011			speed = audigy_adcspeed[audigy_recval(speed)];
1012		else
1013			speed = adcspeed[emu_recval(speed)];
1014	}
1015	if (ch->num == 1)
1016		speed = 48000;
1017	if (ch->num == 2)
1018		speed = 8000;
1019	ch->spd = speed;
1020	return ch->spd;
1021}
1022
1023static u_int32_t
1024emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
1025{
1026	struct sc_rchinfo *ch = data;
1027	struct sc_info *sc = ch->parent;
1028	int irqrate, blksz;
1029
1030	ch->blksz = blocksize;
1031	snd_mtxlock(sc->lock);
1032	emu_settimer(sc);
1033	irqrate = 48000 / sc->timerinterval;
1034	snd_mtxunlock(sc->lock);
1035	blksz = (ch->spd * sndbuf_getalign(ch->buffer)) / irqrate;
1036	return blocksize;
1037}
1038
1039/* semantic note: must start at beginning of buffer */
1040static int
1041emurchan_trigger(kobj_t obj, void *data, int go)
1042{
1043	struct sc_rchinfo *ch = data;
1044	struct sc_info *sc = ch->parent;
1045	u_int32_t val, sz;
1046
1047	if (!PCMTRIG_COMMON(go))
1048		return 0;
1049
1050	switch(sc->bufsz) {
1051	case 4096:
1052		sz = EMU_RECBS_BUFSIZE_4096;
1053		break;
1054
1055	case 8192:
1056		sz = EMU_RECBS_BUFSIZE_8192;
1057		break;
1058
1059	case 16384:
1060		sz = EMU_RECBS_BUFSIZE_16384;
1061		break;
1062
1063	case 32768:
1064		sz = EMU_RECBS_BUFSIZE_32768;
1065		break;
1066
1067	case 65536:
1068		sz = EMU_RECBS_BUFSIZE_65536;
1069		break;
1070
1071	default:
1072		sz = EMU_RECBS_BUFSIZE_4096;
1073	}
1074
1075	snd_mtxlock(sc->lock);
1076	switch(go) {
1077	case PCMTRIG_START:
1078		ch->run = 1;
1079		emu_wrptr(sc, 0, ch->sizereg, sz);
1080		if (ch->num == 0) {
1081			if (sc->audigy) {
1082				val = EMU_A_ADCCR_LCHANENABLE;
1083				if (AFMT_CHANNEL(ch->fmt) > 1)
1084					val |= EMU_A_ADCCR_RCHANENABLE;
1085				val |= audigy_recval(ch->spd);
1086			} else {
1087				val = EMU_ADCCR_LCHANENABLE;
1088				if (AFMT_CHANNEL(ch->fmt) > 1)
1089					val |= EMU_ADCCR_RCHANENABLE;
1090				val |= emu_recval(ch->spd);
1091			}
1092
1093			emu_wrptr(sc, 0, ch->setupreg, 0);
1094			emu_wrptr(sc, 0, ch->setupreg, val);
1095		}
1096		val = emu_rd(sc, EMU_INTE, 4);
1097		val |= ch->irqmask;
1098		emu_wr(sc, EMU_INTE, val, 4);
1099		break;
1100
1101	case PCMTRIG_STOP:
1102	case PCMTRIG_ABORT:
1103		ch->run = 0;
1104		emu_wrptr(sc, 0, ch->sizereg, 0);
1105		if (ch->setupreg)
1106			emu_wrptr(sc, 0, ch->setupreg, 0);
1107		val = emu_rd(sc, EMU_INTE, 4);
1108		val &= ~ch->irqmask;
1109		emu_wr(sc, EMU_INTE, val, 4);
1110		break;
1111
1112	case PCMTRIG_EMLDMAWR:
1113	case PCMTRIG_EMLDMARD:
1114	default:
1115		break;
1116	}
1117	snd_mtxunlock(sc->lock);
1118
1119	return 0;
1120}
1121
1122static u_int32_t
1123emurchan_getptr(kobj_t obj, void *data)
1124{
1125	struct sc_rchinfo *ch = data;
1126	struct sc_info *sc = ch->parent;
1127	int r;
1128
1129	snd_mtxlock(sc->lock);
1130	r = emu_rdptr(sc, 0, ch->idxreg) & 0x0000ffff;
1131	snd_mtxunlock(sc->lock);
1132
1133	return r;
1134}
1135
1136static struct pcmchan_caps *
1137emurchan_getcaps(kobj_t obj, void *data)
1138{
1139	struct sc_rchinfo *ch = data;
1140
1141	return &emu_reccaps[ch->num];
1142}
1143
1144static kobj_method_t emurchan_methods[] = {
1145	KOBJMETHOD(channel_init,		emurchan_init),
1146	KOBJMETHOD(channel_setformat,		emurchan_setformat),
1147	KOBJMETHOD(channel_setspeed,		emurchan_setspeed),
1148	KOBJMETHOD(channel_setblocksize,	emurchan_setblocksize),
1149	KOBJMETHOD(channel_trigger,		emurchan_trigger),
1150	KOBJMETHOD(channel_getptr,		emurchan_getptr),
1151	KOBJMETHOD(channel_getcaps,		emurchan_getcaps),
1152	KOBJMETHOD_END
1153};
1154CHANNEL_DECLARE(emurchan);
1155
1156static unsigned char
1157emu_mread(struct mpu401 *arg, void *sc, int reg)
1158{
1159	unsigned int d;
1160
1161	d = emu_rd((struct sc_info *)sc, 0x18 + reg, 1);
1162	return d;
1163}
1164
1165static void
1166emu_mwrite(struct mpu401 *arg, void *sc, int reg, unsigned char b)
1167{
1168
1169	emu_wr((struct sc_info *)sc, 0x18 + reg, b, 1);
1170}
1171
1172static int
1173emu_muninit(struct mpu401 *arg, void *cookie)
1174{
1175	struct sc_info *sc = cookie;
1176
1177	snd_mtxlock(sc->lock);
1178	sc->mpu_intr = 0;
1179	snd_mtxunlock(sc->lock);
1180
1181	return 0;
1182}
1183
1184static kobj_method_t emu_mpu_methods[] = {
1185    	KOBJMETHOD(mpufoi_read,		emu_mread),
1186    	KOBJMETHOD(mpufoi_write,	emu_mwrite),
1187    	KOBJMETHOD(mpufoi_uninit,	emu_muninit),
1188	KOBJMETHOD_END
1189};
1190
1191static DEFINE_CLASS(emu_mpu, emu_mpu_methods, 0);
1192
1193static void
1194emu_intr2(void *p)
1195{
1196	struct sc_info *sc = (struct sc_info *)p;
1197
1198	if (sc->mpu_intr)
1199	    (sc->mpu_intr)(sc->mpu);
1200}
1201
1202static void
1203emu_midiattach(struct sc_info *sc)
1204{
1205	int i;
1206
1207	i = emu_rd(sc, EMU_INTE, 4);
1208	i |= EMU_INTE_MIDIRXENABLE;
1209	emu_wr(sc, EMU_INTE, i, 4);
1210
1211	sc->mpu = mpu401_init(&emu_mpu_class, sc, emu_intr2, &sc->mpu_intr);
1212}
1213/* -------------------------------------------------------------------- */
1214/* The interrupt handler */
1215
1216static void
1217emu_intr(void *data)
1218{
1219	struct sc_info *sc = data;
1220	u_int32_t stat, ack, i, x;
1221
1222	snd_mtxlock(sc->lock);
1223	while (1) {
1224		stat = emu_rd(sc, EMU_IPR, 4);
1225		if (stat == 0)
1226			break;
1227		ack = 0;
1228
1229		/* process irq */
1230		if (stat & EMU_IPR_INTERVALTIMER)
1231			ack |= EMU_IPR_INTERVALTIMER;
1232
1233		if (stat & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL))
1234			ack |= stat & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL);
1235
1236		if (stat & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL))
1237			ack |= stat & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL);
1238
1239		if (stat & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL))
1240			ack |= stat & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL);
1241
1242		if (stat & EMU_PCIERROR) {
1243			ack |= EMU_PCIERROR;
1244			device_printf(sc->dev, "pci error\n");
1245			/* we still get an nmi with ecc ram even if we ack this */
1246		}
1247		if (stat & EMU_IPR_RATETRCHANGE) {
1248			ack |= EMU_IPR_RATETRCHANGE;
1249#ifdef EMUDEBUG
1250			device_printf(sc->dev,
1251			    "sample rate tracker lock status change\n");
1252#endif
1253		}
1254
1255	    if (stat & EMU_IPR_MIDIRECVBUFE)
1256		if (sc->mpu_intr) {
1257		    (sc->mpu_intr)(sc->mpu);
1258		    ack |= EMU_IPR_MIDIRECVBUFE | EMU_IPR_MIDITRANSBUFE;
1259 		}
1260		if (stat & ~ack)
1261			device_printf(sc->dev, "dodgy irq: %x (harmless)\n",
1262			    stat & ~ack);
1263
1264		emu_wr(sc, EMU_IPR, stat, 4);
1265
1266		if (ack) {
1267			snd_mtxunlock(sc->lock);
1268
1269			if (ack & EMU_IPR_INTERVALTIMER) {
1270				x = 0;
1271				for (i = 0; i < sc->nchans; i++) {
1272					if (sc->pch[i].run) {
1273						x = 1;
1274						chn_intr(sc->pch[i].channel);
1275					}
1276				}
1277				if (x == 0)
1278					emu_enatimer(sc, 0);
1279			}
1280
1281
1282			if (ack & (EMU_IPR_ADCBUFFULL | EMU_IPR_ADCBUFHALFFULL)) {
1283				if (sc->rch[0].channel)
1284					chn_intr(sc->rch[0].channel);
1285			}
1286			if (ack & (EMU_IPR_EFXBUFFULL | EMU_IPR_EFXBUFHALFFULL)) {
1287				if (sc->rch[1].channel)
1288					chn_intr(sc->rch[1].channel);
1289			}
1290			if (ack & (EMU_IPR_MICBUFFULL | EMU_IPR_MICBUFHALFFULL)) {
1291				if (sc->rch[2].channel)
1292					chn_intr(sc->rch[2].channel);
1293			}
1294
1295			snd_mtxlock(sc->lock);
1296		}
1297	}
1298	snd_mtxunlock(sc->lock);
1299}
1300
1301/* -------------------------------------------------------------------- */
1302
1303static void
1304emu_setmap(void *arg, bus_dma_segment_t *segs, int nseg, int error)
1305{
1306	bus_addr_t *phys = arg;
1307
1308	*phys = error ? 0 : (bus_addr_t)segs->ds_addr;
1309
1310	if (bootverbose) {
1311		printf("emu: setmap (%lx, %lx), nseg=%d, error=%d\n",
1312		    (unsigned long)segs->ds_addr, (unsigned long)segs->ds_len,
1313		    nseg, error);
1314	}
1315}
1316
1317static void *
1318emu_malloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
1319{
1320	void *buf;
1321	bus_dmamap_t map;
1322
1323	*addr = 0;
1324	if (bus_dmamem_alloc(sc->parent_dmat, &buf, BUS_DMA_NOWAIT, &map))
1325		return NULL;
1326	if (bus_dmamap_load(sc->parent_dmat, map, buf, sz, emu_setmap, addr, 0)
1327	    || !*addr)
1328		return NULL;
1329	return buf;
1330}
1331
1332static void
1333emu_free(struct sc_info *sc, void *buf)
1334{
1335	bus_dmamem_free(sc->parent_dmat, buf, NULL);
1336}
1337
1338static void *
1339emu_memalloc(struct sc_info *sc, u_int32_t sz, bus_addr_t *addr)
1340{
1341	u_int32_t blksz, start, idx, ofs, tmp, found;
1342	struct emu_mem *mem = &sc->mem;
1343	struct emu_memblk *blk;
1344	void *buf;
1345
1346	blksz = sz / EMUPAGESIZE;
1347	if (sz > (blksz * EMUPAGESIZE))
1348		blksz++;
1349	/* find a free block in the bitmap */
1350	found = 0;
1351	start = 1;
1352	while (!found && start + blksz < EMUMAXPAGES) {
1353		found = 1;
1354		for (idx = start; idx < start + blksz; idx++)
1355			if (mem->bmap[idx >> 3] & (1 << (idx & 7)))
1356				found = 0;
1357		if (!found)
1358			start++;
1359	}
1360	if (!found)
1361		return NULL;
1362	blk = malloc(sizeof(*blk), M_DEVBUF, M_NOWAIT);
1363	if (blk == NULL)
1364		return NULL;
1365	buf = emu_malloc(sc, sz, &blk->buf_addr);
1366	*addr = blk->buf_addr;
1367	if (buf == NULL) {
1368		free(blk, M_DEVBUF);
1369		return NULL;
1370	}
1371	blk->buf = buf;
1372	blk->pte_start = start;
1373	blk->pte_size = blksz;
1374#ifdef EMUDEBUG
1375	printf("buf %p, pte_start %d, pte_size %d\n", blk->buf,
1376	    blk->pte_start, blk->pte_size);
1377#endif
1378	ofs = 0;
1379	for (idx = start; idx < start + blksz; idx++) {
1380		mem->bmap[idx >> 3] |= 1 << (idx & 7);
1381		tmp = (u_int32_t)(u_long)((u_int8_t *)blk->buf_addr + ofs);
1382#ifdef EMUDEBUG
1383		printf("pte[%d] -> %x phys, %x virt\n", idx, tmp,
1384		    ((u_int32_t)buf) + ofs);
1385#endif
1386		mem->ptb_pages[idx] = (tmp << 1) | idx;
1387		ofs += EMUPAGESIZE;
1388	}
1389	SLIST_INSERT_HEAD(&mem->blocks, blk, link);
1390	return buf;
1391}
1392
1393static int
1394emu_memfree(struct sc_info *sc, void *buf)
1395{
1396	u_int32_t idx, tmp;
1397	struct emu_mem *mem = &sc->mem;
1398	struct emu_memblk *blk, *i;
1399
1400	blk = NULL;
1401	SLIST_FOREACH(i, &mem->blocks, link) {
1402		if (i->buf == buf)
1403			blk = i;
1404	}
1405	if (blk == NULL)
1406		return EINVAL;
1407	SLIST_REMOVE(&mem->blocks, blk, emu_memblk, link);
1408	emu_free(sc, buf);
1409	tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
1410	for (idx = blk->pte_start; idx < blk->pte_start + blk->pte_size; idx++) {
1411		mem->bmap[idx >> 3] &= ~(1 << (idx & 7));
1412		mem->ptb_pages[idx] = tmp | idx;
1413	}
1414	free(blk, M_DEVBUF);
1415	return 0;
1416}
1417
1418static int
1419emu_memstart(struct sc_info *sc, void *buf)
1420{
1421	struct emu_mem *mem = &sc->mem;
1422	struct emu_memblk *blk, *i;
1423
1424	blk = NULL;
1425	SLIST_FOREACH(i, &mem->blocks, link) {
1426		if (i->buf == buf)
1427			blk = i;
1428	}
1429	if (blk == NULL)
1430		return -EINVAL;
1431	return blk->pte_start;
1432}
1433
1434static void
1435emu_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y,
1436    u_int32_t *pc)
1437{
1438	emu_wrefx(sc, (*pc) * 2, (x << 10) | y);
1439	emu_wrefx(sc, (*pc) * 2 + 1, (op << 20) | (z << 10) | w);
1440	(*pc)++;
1441}
1442
1443static void
1444audigy_addefxop(struct sc_info *sc, int op, int z, int w, int x, int y,
1445    u_int32_t *pc)
1446{
1447	emu_wrefx(sc, (*pc) * 2, (x << 12) | y);
1448	emu_wrefx(sc, (*pc) * 2 + 1, (op << 24) | (z << 12) | w);
1449	(*pc)++;
1450}
1451
1452static void
1453audigy_initefx(struct sc_info *sc)
1454{
1455	int i;
1456	u_int32_t pc = 0;
1457
1458	/* skip 0, 0, -1, 0 - NOPs */
1459	for (i = 0; i < 512; i++)
1460		audigy_addefxop(sc, 0x0f, 0x0c0, 0x0c0, 0x0cf, 0x0c0, &pc);
1461
1462	for (i = 0; i < 512; i++)
1463		emu_wrptr(sc, 0, EMU_A_FXGPREGBASE + i, 0x0);
1464
1465	pc = 16;
1466
1467	/* stop fx processor */
1468	emu_wrptr(sc, 0, EMU_A_DBG, EMU_A_DBG_SINGLE_STEP);
1469
1470	/* Audigy 2 (EMU10K2) DSP Registers:
1471	   FX Bus
1472		0x000-0x00f : 16 registers (?)
1473	   Input
1474		0x040/0x041 : AC97 Codec (l/r)
1475		0x042/0x043 : ADC, S/PDIF (l/r)
1476		0x044/0x045 : Optical S/PDIF in (l/r)
1477		0x046/0x047 : ?
1478		0x048/0x049 : Line/Mic 2 (l/r)
1479		0x04a/0x04b : RCA S/PDIF (l/r)
1480		0x04c/0x04d : Aux 2 (l/r)
1481	   Output
1482		0x060/0x061 : Digital Front (l/r)
1483		0x062/0x063 : Digital Center/LFE
1484		0x064/0x065 : AudigyDrive Heaphone (l/r)
1485		0x066/0x067 : Digital Rear (l/r)
1486		0x068/0x069 : Analog Front (l/r)
1487		0x06a/0x06b : Analog Center/LFE
1488		0x06c/0x06d : ?
1489		0x06e/0x06f : Analog Rear (l/r)
1490		0x070/0x071 : AC97 Output (l/r)
1491		0x072/0x073 : ?
1492		0x074/0x075 : ?
1493		0x076/0x077 : ADC Recording Buffer (l/r)
1494	   Constants
1495		0x0c0 - 0x0c4 = 0 - 4
1496		0x0c5 = 0x8, 0x0c6 = 0x10, 0x0c7 = 0x20
1497		0x0c8 = 0x100, 0x0c9 = 0x10000, 0x0ca = 0x80000
1498		0x0cb = 0x10000000, 0x0cc = 0x20000000, 0x0cd = 0x40000000
1499		0x0ce = 0x80000000, 0x0cf = 0x7fffffff, 0x0d0 = 0xffffffff
1500		0x0d1 = 0xfffffffe, 0x0d2 = 0xc0000000, 0x0d3 = 0x41fbbcdc
1501		0x0d4 = 0x5a7ef9db, 0x0d5 = 0x00100000, 0x0dc = 0x00000001 (?)
1502	   Temporary Values
1503		0x0d6 : Accumulator (?)
1504		0x0d7 : Condition Register
1505		0x0d8 : Noise source
1506		0x0d9 : Noise source
1507	   Tank Memory Data Registers
1508		0x200 - 0x2ff
1509	   Tank Memory Address Registers
1510		0x300 - 0x3ff
1511	   General Purpose Registers
1512		0x400 - 0x5ff
1513	 */
1514
1515	/* AC97Output[l/r] = FXBus PCM[l/r] */
1516	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AC97_L), A_C_00000000,
1517			A_C_00000000, A_FXBUS(FXBUS_PCM_LEFT), &pc);
1518	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AC97_R), A_C_00000000,
1519			A_C_00000000, A_FXBUS(FXBUS_PCM_RIGHT), &pc);
1520
1521	/* GPR[0/1] = RCA S/PDIF[l/r] -- Master volume */
1522	audigy_addefxop(sc, iACC3, A_GPR(0), A_C_00000000,
1523			A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_L), &pc);
1524	audigy_addefxop(sc, iACC3, A_GPR(1), A_C_00000000,
1525			A_C_00000000, A_EXTIN(EXTIN_COAX_SPDIF_R), &pc);
1526
1527	/* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
1528	audigy_addefxop(sc, iINTERP, A_GPR(2), A_GPR(1),
1529			A_C_40000000, A_GPR(0), &pc);
1530
1531	/* Headphones[l/r] = GPR[0/1] */
1532	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_HEADPHONE_L),
1533			A_C_00000000, A_C_00000000, A_GPR(0), &pc);
1534	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_HEADPHONE_R),
1535			A_C_00000000, A_C_00000000, A_GPR(1), &pc);
1536
1537	/* Analog Front[l/r] = GPR[0/1] */
1538	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AFRONT_L), A_C_00000000,
1539			A_C_00000000, A_GPR(0), &pc);
1540	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AFRONT_R), A_C_00000000,
1541			A_C_00000000, A_GPR(1), &pc);
1542
1543	/* Digital Front[l/r] = GPR[0/1] */
1544	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L), A_C_00000000,
1545			A_C_00000000, A_GPR(0), &pc);
1546	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_FRONT_R), A_C_00000000,
1547			A_C_00000000, A_GPR(1), &pc);
1548
1549	/* Center and Subwoofer configuration */
1550	/* Analog Center = GPR[0] + GPR[2] */
1551	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ACENTER), A_C_00000000,
1552			A_GPR(0), A_GPR(2), &pc);
1553	/* Analog Sub = GPR[1] + GPR[2] */
1554	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ALFE), A_C_00000000,
1555			A_GPR(1), A_GPR(2), &pc);
1556
1557	/* Digital Center = GPR[0] + GPR[2] */
1558	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_CENTER), A_C_00000000,
1559			A_GPR(0), A_GPR(2), &pc);
1560	/* Digital Sub = GPR[1] + GPR[2] */
1561	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_LFE), A_C_00000000,
1562			A_GPR(1), A_GPR(2), &pc);
1563
1564#if 0
1565	/* Analog Rear[l/r] = (GPR[0/1] * RearVolume[l/r]) >> 31 */
1566	/*   RearVolume = GPR[0x10/0x11] (Will this ever be implemented?) */
1567	audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_AREAR_L), A_C_00000000,
1568			A_GPR(16), A_GPR(0), &pc);
1569	audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_AREAR_R), A_C_00000000,
1570			A_GPR(17), A_GPR(1), &pc);
1571
1572	/* Digital Rear[l/r] = (GPR[0/1] * RearVolume[l/r]) >> 31 */
1573	/*   RearVolume = GPR[0x10/0x11] (Will this ever be implemented?) */
1574	audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_REAR_L), A_C_00000000,
1575			A_GPR(16), A_GPR(0), &pc);
1576	audigy_addefxop(sc, iMAC0, A_EXTOUT(A_EXTOUT_REAR_R), A_C_00000000,
1577			A_GPR(17), A_GPR(1), &pc);
1578#else
1579	/* XXX This is just a copy to the channel, since we do not have
1580	 *     a patch manager, it is useful for have another output enabled.
1581	 */
1582
1583	/* Analog Rear[l/r] = GPR[0/1] */
1584	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AREAR_L), A_C_00000000,
1585			A_C_00000000, A_GPR(0), &pc);
1586	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_AREAR_R), A_C_00000000,
1587			A_C_00000000, A_GPR(1), &pc);
1588
1589	/* Digital Rear[l/r] = GPR[0/1] */
1590	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_REAR_L), A_C_00000000,
1591			A_C_00000000, A_GPR(0), &pc);
1592	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_REAR_R), A_C_00000000,
1593			A_C_00000000, A_GPR(1), &pc);
1594#endif
1595
1596	/* ADC Recording buffer[l/r] = AC97Input[l/r] */
1597	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ADC_CAP_L), A_C_00000000,
1598			A_C_00000000, A_EXTIN(A_EXTIN_AC97_L), &pc);
1599	audigy_addefxop(sc, iACC3, A_EXTOUT(A_EXTOUT_ADC_CAP_R), A_C_00000000,
1600			A_C_00000000, A_EXTIN(A_EXTIN_AC97_R), &pc);
1601
1602	/* resume normal operations */
1603	emu_wrptr(sc, 0, EMU_A_DBG, 0);
1604}
1605
1606static void
1607emu_initefx(struct sc_info *sc)
1608{
1609	int i;
1610	u_int32_t pc = 16;
1611
1612	/* acc3 0,0,0,0 - NOPs */
1613	for (i = 0; i < 512; i++) {
1614		emu_wrefx(sc, i * 2, 0x10040);
1615		emu_wrefx(sc, i * 2 + 1, 0x610040);
1616	}
1617
1618	for (i = 0; i < 256; i++)
1619		emu_wrptr(sc, 0, EMU_FXGPREGBASE + i, 0);
1620
1621	/* FX-8010 DSP Registers:
1622	   FX Bus
1623	     0x000-0x00f : 16 registers
1624	   Input
1625	     0x010/0x011 : AC97 Codec (l/r)
1626	     0x012/0x013 : ADC, S/PDIF (l/r)
1627	     0x014/0x015 : Mic(left), Zoom (l/r)
1628	     0x016/0x017 : TOS link in (l/r)
1629	     0x018/0x019 : Line/Mic 1 (l/r)
1630	     0x01a/0x01b : COAX S/PDIF (l/r)
1631	     0x01c/0x01d : Line/Mic 2 (l/r)
1632	   Output
1633	     0x020/0x021 : AC97 Output (l/r)
1634	     0x022/0x023 : TOS link out (l/r)
1635	     0x024/0x025 : Center/LFE
1636	     0x026/0x027 : LiveDrive Headphone (l/r)
1637	     0x028/0x029 : Rear Channel (l/r)
1638	     0x02a/0x02b : ADC Recording Buffer (l/r)
1639	     0x02c       : Mic Recording Buffer
1640	     0x031/0x032 : Analog Center/LFE
1641	   Constants
1642	     0x040 - 0x044 = 0 - 4
1643	     0x045 = 0x8, 0x046 = 0x10, 0x047 = 0x20
1644	     0x048 = 0x100, 0x049 = 0x10000, 0x04a = 0x80000
1645	     0x04b = 0x10000000, 0x04c = 0x20000000, 0x04d = 0x40000000
1646	     0x04e = 0x80000000, 0x04f = 0x7fffffff, 0x050 = 0xffffffff
1647	     0x051 = 0xfffffffe, 0x052 = 0xc0000000, 0x053 = 0x41fbbcdc
1648	     0x054 = 0x5a7ef9db, 0x055 = 0x00100000
1649	   Temporary Values
1650	     0x056 : Accumulator
1651	     0x057 : Condition Register
1652	     0x058 : Noise source
1653	     0x059 : Noise source
1654	     0x05a : IRQ Register
1655	     0x05b : TRAM Delay Base Address Count
1656	   General Purpose Registers
1657	     0x100 - 0x1ff
1658	   Tank Memory Data Registers
1659	     0x200 - 0x2ff
1660	   Tank Memory Address Registers
1661	     0x300 - 0x3ff
1662	     */
1663
1664	/* Routing - this will be configurable in later version */
1665
1666	/* GPR[0/1] = FX * 4 + SPDIF-in */
1667	emu_addefxop(sc, iMACINT0, GPR(0), EXTIN(EXTIN_SPDIF_CD_L),
1668			FXBUS(FXBUS_PCM_LEFT), C_00000004, &pc);
1669	emu_addefxop(sc, iMACINT0, GPR(1), EXTIN(EXTIN_SPDIF_CD_R),
1670			FXBUS(FXBUS_PCM_RIGHT), C_00000004, &pc);
1671
1672	/* GPR[0/1] += APS-input */
1673	emu_addefxop(sc, iACC3, GPR(0), GPR(0), C_00000000,
1674			sc->APS ? EXTIN(EXTIN_TOSLINK_L) : C_00000000, &pc);
1675	emu_addefxop(sc, iACC3, GPR(1), GPR(1), C_00000000,
1676			sc->APS ? EXTIN(EXTIN_TOSLINK_R) : C_00000000, &pc);
1677
1678	/* FrontOut (AC97) = GPR[0/1] */
1679	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_L), C_00000000,
1680			C_00000000, GPR(0), &pc);
1681	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_R), C_00000000,
1682			C_00000001, GPR(1), &pc);
1683
1684	/* GPR[2] = GPR[0] (Left) / 2 + GPR[1] (Right) / 2 -- Central volume */
1685	emu_addefxop(sc, iINTERP, GPR(2), GPR(1), C_40000000, GPR(0), &pc);
1686
1687#if 0
1688	/* RearOut = (GPR[0/1] * RearVolume) >> 31 */
1689	/*   RearVolume = GPR[0x10/0x11] */
1690	emu_addefxop(sc, iMAC0, EXTOUT(EXTOUT_REAR_L), C_00000000,
1691			GPR(16), GPR(0), &pc);
1692	emu_addefxop(sc, iMAC0, EXTOUT(EXTOUT_REAR_R), C_00000000,
1693			GPR(17), GPR(1), &pc);
1694#else
1695	/* XXX This is just a copy to the channel, since we do not have
1696	 *     a patch manager, it is useful for have another output enabled.
1697	 */
1698
1699	/* Rear[l/r] = GPR[0/1] */
1700	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_REAR_L), C_00000000,
1701			C_00000000, GPR(0), &pc);
1702	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_REAR_R), C_00000000,
1703			C_00000000, GPR(1), &pc);
1704#endif
1705
1706	/* TOS out[l/r] = GPR[0/1] */
1707	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_TOSLINK_L), C_00000000,
1708			C_00000000, GPR(0), &pc);
1709	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_TOSLINK_R), C_00000000,
1710			C_00000000, GPR(1), &pc);
1711
1712	/* Center and Subwoofer configuration */
1713	/* Analog Center = GPR[0] + GPR[2] */
1714	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ACENTER), C_00000000,
1715			GPR(0), GPR(2), &pc);
1716	/* Analog Sub = GPR[1] + GPR[2] */
1717	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ALFE), C_00000000,
1718			GPR(1), GPR(2), &pc);
1719	/* Digital Center = GPR[0] + GPR[2] */
1720	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_CENTER), C_00000000,
1721			GPR(0), GPR(2), &pc);
1722	/* Digital Sub = GPR[1] + GPR[2] */
1723	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_AC97_LFE), C_00000000,
1724			GPR(1), GPR(2), &pc);
1725
1726	/* Headphones[l/r] = GPR[0/1] */
1727	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_HEADPHONE_L), C_00000000,
1728			C_00000000, GPR(0), &pc);
1729	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_HEADPHONE_R), C_00000000,
1730			C_00000000, GPR(1), &pc);
1731
1732	/* ADC Recording buffer[l/r] = AC97Input[l/r] */
1733	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ADC_CAP_L), C_00000000,
1734			C_00000000, EXTIN(EXTIN_AC97_L), &pc);
1735	emu_addefxop(sc, iACC3, EXTOUT(EXTOUT_ADC_CAP_R), C_00000000,
1736			C_00000000, EXTIN(EXTIN_AC97_R), &pc);
1737
1738	/* resume normal operations */
1739	emu_wrptr(sc, 0, EMU_DBG, 0);
1740}
1741
1742/* Probe and attach the card */
1743static int
1744emu_init(struct sc_info *sc)
1745{
1746	u_int32_t spcs, ch, tmp, i;
1747
1748	if (sc->audigy) {
1749		/* enable additional AC97 slots */
1750		emu_wrptr(sc, 0, EMU_AC97SLOT, EMU_AC97SLOT_CENTER | EMU_AC97SLOT_LFE);
1751	}
1752
1753	/* disable audio and lock cache */
1754	emu_wr(sc, EMU_HCFG,
1755	    EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_MUTEBUTTONENABLE,
1756	    4);
1757
1758	/* reset recording buffers */
1759	emu_wrptr(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
1760	emu_wrptr(sc, 0, EMU_MICBA, 0);
1761	emu_wrptr(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
1762	emu_wrptr(sc, 0, EMU_FXBA, 0);
1763	emu_wrptr(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
1764	emu_wrptr(sc, 0, EMU_ADCBA, 0);
1765
1766	/* disable channel interrupt */
1767	emu_wr(sc, EMU_INTE,
1768	    EMU_INTE_INTERTIMERENB | EMU_INTE_SAMPLERATER | EMU_INTE_PCIERRENABLE,
1769	    4);
1770	emu_wrptr(sc, 0, EMU_CLIEL, 0);
1771	emu_wrptr(sc, 0, EMU_CLIEH, 0);
1772	emu_wrptr(sc, 0, EMU_SOLEL, 0);
1773	emu_wrptr(sc, 0, EMU_SOLEH, 0);
1774
1775	/* wonder what these do... */
1776	if (sc->audigy) {
1777		emu_wrptr(sc, 0, EMU_SPBYPASS, 0xf00);
1778		emu_wrptr(sc, 0, EMU_AC97SLOT, 0x3);
1779	}
1780
1781	/* init envelope engine */
1782	for (ch = 0; ch < NUM_G; ch++) {
1783		emu_wrptr(sc, ch, EMU_CHAN_DCYSUSV, ENV_OFF);
1784		emu_wrptr(sc, ch, EMU_CHAN_IP, 0);
1785		emu_wrptr(sc, ch, EMU_CHAN_VTFT, 0xffff);
1786		emu_wrptr(sc, ch, EMU_CHAN_CVCF, 0xffff);
1787		emu_wrptr(sc, ch, EMU_CHAN_PTRX, 0);
1788		emu_wrptr(sc, ch, EMU_CHAN_CPF, 0);
1789		emu_wrptr(sc, ch, EMU_CHAN_CCR, 0);
1790
1791		emu_wrptr(sc, ch, EMU_CHAN_PSST, 0);
1792		emu_wrptr(sc, ch, EMU_CHAN_DSL, 0x10);
1793		emu_wrptr(sc, ch, EMU_CHAN_CCCA, 0);
1794		emu_wrptr(sc, ch, EMU_CHAN_Z1, 0);
1795		emu_wrptr(sc, ch, EMU_CHAN_Z2, 0);
1796		emu_wrptr(sc, ch, EMU_CHAN_FXRT, 0xd01c0000);
1797
1798		emu_wrptr(sc, ch, EMU_CHAN_ATKHLDM, 0);
1799		emu_wrptr(sc, ch, EMU_CHAN_DCYSUSM, 0);
1800		emu_wrptr(sc, ch, EMU_CHAN_IFATN, 0xffff);
1801		emu_wrptr(sc, ch, EMU_CHAN_PEFE, 0);
1802		emu_wrptr(sc, ch, EMU_CHAN_FMMOD, 0);
1803		emu_wrptr(sc, ch, EMU_CHAN_TREMFRQ, 24);	/* 1 Hz */
1804		emu_wrptr(sc, ch, EMU_CHAN_FM2FRQ2, 24);	/* 1 Hz */
1805		emu_wrptr(sc, ch, EMU_CHAN_TEMPENV, 0);
1806
1807		/*** these are last so OFF prevents writing ***/
1808		emu_wrptr(sc, ch, EMU_CHAN_LFOVAL2, 0);
1809		emu_wrptr(sc, ch, EMU_CHAN_LFOVAL1, 0);
1810		emu_wrptr(sc, ch, EMU_CHAN_ATKHLDV, 0);
1811		emu_wrptr(sc, ch, EMU_CHAN_ENVVOL, 0);
1812		emu_wrptr(sc, ch, EMU_CHAN_ENVVAL, 0);
1813
1814		if (sc->audigy) {
1815			/* audigy cards need this to initialize correctly */
1816			emu_wrptr(sc, ch, 0x4c, 0);
1817			emu_wrptr(sc, ch, 0x4d, 0);
1818			emu_wrptr(sc, ch, 0x4e, 0);
1819			emu_wrptr(sc, ch, 0x4f, 0);
1820			/* set default routing */
1821			emu_wrptr(sc, ch, EMU_A_CHAN_FXRT1, 0x03020100);
1822			emu_wrptr(sc, ch, EMU_A_CHAN_FXRT2, 0x3f3f3f3f);
1823			emu_wrptr(sc, ch, EMU_A_CHAN_SENDAMOUNTS, 0);
1824		}
1825
1826		sc->voice[ch].vnum = ch;
1827		sc->voice[ch].slave = NULL;
1828		sc->voice[ch].busy = 0;
1829		sc->voice[ch].ismaster = 0;
1830		sc->voice[ch].running = 0;
1831		sc->voice[ch].b16 = 0;
1832		sc->voice[ch].stereo = 0;
1833		sc->voice[ch].speed = 0;
1834		sc->voice[ch].start = 0;
1835		sc->voice[ch].end = 0;
1836		sc->voice[ch].channel = NULL;
1837	}
1838	sc->pnum = sc->rnum = 0;
1839
1840	/*
1841	 *  Init to 0x02109204 :
1842	 *  Clock accuracy    = 0     (1000ppm)
1843	 *  Sample Rate       = 2     (48kHz)
1844	 *  Audio Channel     = 1     (Left of 2)
1845	 *  Source Number     = 0     (Unspecified)
1846	 *  Generation Status = 1     (Original for Cat Code 12)
1847	 *  Cat Code          = 12    (Digital Signal Mixer)
1848	 *  Mode              = 0     (Mode 0)
1849	 *  Emphasis          = 0     (None)
1850	 *  CP                = 1     (Copyright unasserted)
1851	 *  AN                = 0     (Audio data)
1852	 *  P                 = 0     (Consumer)
1853	 */
1854	spcs = EMU_SPCS_CLKACCY_1000PPM | EMU_SPCS_SAMPLERATE_48 |
1855	    EMU_SPCS_CHANNELNUM_LEFT | EMU_SPCS_SOURCENUM_UNSPEC |
1856	    EMU_SPCS_GENERATIONSTATUS | 0x00001200 | 0x00000000 |
1857	    EMU_SPCS_EMPHASIS_NONE | EMU_SPCS_COPYRIGHT;
1858	emu_wrptr(sc, 0, EMU_SPCS0, spcs);
1859	emu_wrptr(sc, 0, EMU_SPCS1, spcs);
1860	emu_wrptr(sc, 0, EMU_SPCS2, spcs);
1861
1862	if (!sc->audigy)
1863		emu_initefx(sc);
1864	else if (sc->audigy2) {	/* Audigy 2 */
1865		/* from ALSA initialization code: */
1866
1867		/* Hack for Alice3 to work independent of haP16V driver */
1868		u_int32_t tmp;
1869
1870		/* Setup SRCMulti_I2S SamplingRate */
1871		tmp = emu_rdptr(sc, 0, EMU_A_SPDIF_SAMPLERATE) & 0xfffff1ff;
1872		emu_wrptr(sc, 0, EMU_A_SPDIF_SAMPLERATE, tmp | 0x400);
1873
1874		/* Setup SRCSel (Enable SPDIF, I2S SRCMulti) */
1875		emu_wr(sc, 0x20, 0x00600000, 4);
1876		emu_wr(sc, 0x24, 0x00000014, 4);
1877
1878		/* Setup SRCMulti Input Audio Enable */
1879		emu_wr(sc, 0x20, 0x006e0000, 4);
1880		emu_wr(sc, 0x24, 0xff00ff00, 4);
1881	}
1882
1883	SLIST_INIT(&sc->mem.blocks);
1884	sc->mem.ptb_pages = emu_malloc(sc, EMUMAXPAGES * sizeof(u_int32_t),
1885	    &sc->mem.ptb_pages_addr);
1886	if (sc->mem.ptb_pages == NULL)
1887		return -1;
1888
1889	sc->mem.silent_page = emu_malloc(sc, EMUPAGESIZE,
1890	    &sc->mem.silent_page_addr);
1891	if (sc->mem.silent_page == NULL) {
1892		emu_free(sc, sc->mem.ptb_pages);
1893		return -1;
1894	}
1895	/* Clear page with silence & setup all pointers to this page */
1896	bzero(sc->mem.silent_page, EMUPAGESIZE);
1897	tmp = (u_int32_t)(sc->mem.silent_page_addr) << 1;
1898	for (i = 0; i < EMUMAXPAGES; i++)
1899		sc->mem.ptb_pages[i] = tmp | i;
1900
1901	emu_wrptr(sc, 0, EMU_PTB, (sc->mem.ptb_pages_addr));
1902	emu_wrptr(sc, 0, EMU_TCB, 0);	/* taken from original driver */
1903	emu_wrptr(sc, 0, EMU_TCBS, 0);	/* taken from original driver */
1904
1905	for (ch = 0; ch < NUM_G; ch++) {
1906		emu_wrptr(sc, ch, EMU_CHAN_MAPA, tmp | EMU_CHAN_MAP_PTI_MASK);
1907		emu_wrptr(sc, ch, EMU_CHAN_MAPB, tmp | EMU_CHAN_MAP_PTI_MASK);
1908	}
1909
1910	/* emu_memalloc(sc, EMUPAGESIZE); */
1911	/*
1912	 *  Hokay, now enable the AUD bit
1913	 *
1914	 *  Audigy
1915	 *   Enable Audio = 0 (enabled after fx processor initialization)
1916	 *   Mute Disable Audio = 0
1917	 *   Joystick = 1
1918	 *
1919	 *  Audigy 2
1920	 *   Enable Audio = 1
1921	 *   Mute Disable Audio = 0
1922	 *   Joystick = 1
1923	 *   GP S/PDIF AC3 Enable = 1
1924	 *   CD S/PDIF AC3 Enable = 1
1925	 *
1926	 *  EMU10K1
1927	 *   Enable Audio = 1
1928	 *   Mute Disable Audio = 0
1929	 *   Lock Tank Memory = 1
1930	 *   Lock Sound Memory = 0
1931	 *   Auto Mute = 1
1932	 */
1933
1934	if (sc->audigy) {
1935		tmp = EMU_HCFG_AUTOMUTE | EMU_HCFG_JOYENABLE;
1936		if (sc->audigy2)	/* Audigy 2 */
1937			tmp = EMU_HCFG_AUDIOENABLE | EMU_HCFG_AC3ENABLE_CDSPDIF |
1938			    EMU_HCFG_AC3ENABLE_GPSPDIF;
1939		emu_wr(sc, EMU_HCFG, tmp, 4);
1940
1941		audigy_initefx(sc);
1942
1943		/* from ALSA initialization code: */
1944
1945		/* enable audio and disable both audio/digital outputs */
1946		emu_wr(sc, EMU_HCFG, emu_rd(sc, EMU_HCFG, 4) | EMU_HCFG_AUDIOENABLE, 4);
1947		emu_wr(sc, EMU_A_IOCFG, emu_rd(sc, EMU_A_IOCFG, 4) & ~EMU_A_IOCFG_GPOUT_AD,
1948		    4);
1949		if (sc->audigy2) {	/* Audigy 2 */
1950			/* Unmute Analog.
1951			 * Set GPO6 to 1 for Apollo. This has to be done after
1952			 * init Alice3 I2SOut beyond 48kHz.
1953			 * So, sequence is important.
1954			 */
1955			emu_wr(sc, EMU_A_IOCFG,
1956			    emu_rd(sc, EMU_A_IOCFG, 4) | EMU_A_IOCFG_GPOUT_A, 4);
1957		}
1958	} else {
1959		/* EMU10K1 initialization code */
1960		tmp = EMU_HCFG_AUDIOENABLE | EMU_HCFG_LOCKTANKCACHE_MASK
1961		    | EMU_HCFG_AUTOMUTE;
1962		if (sc->rev >= 6)
1963			tmp |= EMU_HCFG_JOYENABLE;
1964
1965		emu_wr(sc, EMU_HCFG, tmp, 4);
1966
1967		/* TOSLink detection */
1968		sc->tos_link = 0;
1969		tmp = emu_rd(sc, EMU_HCFG, 4);
1970		if (tmp & (EMU_HCFG_GPINPUT0 | EMU_HCFG_GPINPUT1)) {
1971			emu_wr(sc, EMU_HCFG, tmp | EMU_HCFG_GPOUT1, 4);
1972			DELAY(50);
1973			if (tmp != (emu_rd(sc, EMU_HCFG, 4) & ~EMU_HCFG_GPOUT1)) {
1974				sc->tos_link = 1;
1975				emu_wr(sc, EMU_HCFG, tmp, 4);
1976			}
1977		}
1978	}
1979
1980	return 0;
1981}
1982
1983static int
1984emu_uninit(struct sc_info *sc)
1985{
1986	u_int32_t ch;
1987
1988	emu_wr(sc, EMU_INTE, 0, 4);
1989	for (ch = 0; ch < NUM_G; ch++)
1990		emu_wrptr(sc, ch, EMU_CHAN_DCYSUSV, ENV_OFF);
1991	for (ch = 0; ch < NUM_G; ch++) {
1992		emu_wrptr(sc, ch, EMU_CHAN_VTFT, 0);
1993		emu_wrptr(sc, ch, EMU_CHAN_CVCF, 0);
1994		emu_wrptr(sc, ch, EMU_CHAN_PTRX, 0);
1995		emu_wrptr(sc, ch, EMU_CHAN_CPF, 0);
1996	}
1997
1998	if (sc->audigy) {	/* stop fx processor */
1999		emu_wrptr(sc, 0, EMU_A_DBG, EMU_A_DBG_SINGLE_STEP);
2000	}
2001
2002	/* disable audio and lock cache */
2003	emu_wr(sc, EMU_HCFG,
2004	    EMU_HCFG_LOCKSOUNDCACHE | EMU_HCFG_LOCKTANKCACHE_MASK | EMU_HCFG_MUTEBUTTONENABLE,
2005	    4);
2006
2007	emu_wrptr(sc, 0, EMU_PTB, 0);
2008	/* reset recording buffers */
2009	emu_wrptr(sc, 0, EMU_MICBS, EMU_RECBS_BUFSIZE_NONE);
2010	emu_wrptr(sc, 0, EMU_MICBA, 0);
2011	emu_wrptr(sc, 0, EMU_FXBS, EMU_RECBS_BUFSIZE_NONE);
2012	emu_wrptr(sc, 0, EMU_FXBA, 0);
2013	emu_wrptr(sc, 0, EMU_FXWC, 0);
2014	emu_wrptr(sc, 0, EMU_ADCBS, EMU_RECBS_BUFSIZE_NONE);
2015	emu_wrptr(sc, 0, EMU_ADCBA, 0);
2016	emu_wrptr(sc, 0, EMU_TCB, 0);
2017	emu_wrptr(sc, 0, EMU_TCBS, 0);
2018
2019	/* disable channel interrupt */
2020	emu_wrptr(sc, 0, EMU_CLIEL, 0);
2021	emu_wrptr(sc, 0, EMU_CLIEH, 0);
2022	emu_wrptr(sc, 0, EMU_SOLEL, 0);
2023	emu_wrptr(sc, 0, EMU_SOLEH, 0);
2024
2025	/* init envelope engine */
2026	if (!SLIST_EMPTY(&sc->mem.blocks))
2027		device_printf(sc->dev, "warning: memblock list not empty\n");
2028	emu_free(sc, sc->mem.ptb_pages);
2029	emu_free(sc, sc->mem.silent_page);
2030
2031	if(sc->mpu)
2032	    mpu401_uninit(sc->mpu);
2033	return 0;
2034}
2035
2036static int
2037emu_pci_probe(device_t dev)
2038{
2039	char *s = NULL;
2040
2041	switch (pci_get_devid(dev)) {
2042	case EMU10K1_PCI_ID:
2043		s = "Creative EMU10K1";
2044		break;
2045
2046	case EMU10K2_PCI_ID:
2047		if (pci_get_revid(dev) == 0x04)
2048			s = "Creative Audigy 2 (EMU10K2)";
2049		else
2050			s = "Creative Audigy (EMU10K2)";
2051		break;
2052
2053	case EMU10K3_PCI_ID:
2054		s = "Creative Audigy 2 (EMU10K3)";
2055		break;
2056
2057	default:
2058		return ENXIO;
2059	}
2060
2061	device_set_desc(dev, s);
2062	return BUS_PROBE_LOW_PRIORITY;
2063}
2064
2065static int
2066emu_pci_attach(device_t dev)
2067{
2068	struct ac97_info *codec = NULL;
2069	struct sc_info *sc;
2070	int i, gotmic;
2071	char status[SND_STATUSLEN];
2072
2073	sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK | M_ZERO);
2074	sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_emu10k1 softc");
2075	sc->dev = dev;
2076	sc->type = pci_get_devid(dev);
2077	sc->rev = pci_get_revid(dev);
2078	sc->audigy = sc->type == EMU10K2_PCI_ID || sc->type == EMU10K3_PCI_ID;
2079	sc->audigy2 = (sc->audigy && sc->rev == 0x04);
2080	sc->nchans = sc->audigy ? 8 : 4;
2081	sc->addrmask = sc->audigy ? EMU_A_PTR_ADDR_MASK : EMU_PTR_ADDR_MASK;
2082
2083	pci_enable_busmaster(dev);
2084
2085	i = PCIR_BAR(0);
2086	sc->reg = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &i, RF_ACTIVE);
2087	if (sc->reg == NULL) {
2088		device_printf(dev, "unable to map register space\n");
2089		goto bad;
2090	}
2091	sc->st = rman_get_bustag(sc->reg);
2092	sc->sh = rman_get_bushandle(sc->reg);
2093
2094	sc->bufsz = pcm_getbuffersize(dev, 4096, EMU_DEFAULT_BUFSZ, 65536);
2095
2096	if (bus_dma_tag_create(/*parent*/bus_get_dma_tag(dev), /*alignment*/2,
2097		/*boundary*/0,
2098		/*lowaddr*/(1U << 31) - 1, /* can only access 0-2gb */
2099		/*highaddr*/BUS_SPACE_MAXADDR,
2100		/*filter*/NULL, /*filterarg*/NULL,
2101		/*maxsize*/sc->bufsz, /*nsegments*/1, /*maxsegz*/0x3ffff,
2102		/*flags*/0, /*lockfunc*/busdma_lock_mutex,
2103		/*lockarg*/&Giant, &sc->parent_dmat) != 0) {
2104		device_printf(dev, "unable to create dma tag\n");
2105		goto bad;
2106	}
2107
2108	if (emu_init(sc) == -1) {
2109		device_printf(dev, "unable to initialize the card\n");
2110		goto bad;
2111	}
2112
2113	codec = AC97_CREATE(dev, sc, emu_ac97);
2114	if (codec == NULL) goto bad;
2115	gotmic = (ac97_getcaps(codec) & AC97_CAP_MICCHANNEL) ? 1 : 0;
2116	if (mixer_init(dev, ac97_getmixerclass(), codec) == -1) goto bad;
2117
2118	emu_midiattach(sc);
2119
2120	i = 0;
2121	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i,
2122	    RF_ACTIVE | RF_SHAREABLE);
2123	if (!sc->irq ||
2124	    snd_setup_intr(dev, sc->irq, INTR_MPSAFE, emu_intr, sc, &sc->ih)) {
2125		device_printf(dev, "unable to map interrupt\n");
2126		goto bad;
2127	}
2128
2129	snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld %s",
2130	    rman_get_start(sc->reg), rman_get_start(sc->irq),
2131	    PCM_KLDSTRING(snd_emu10k1));
2132
2133	if (pcm_register(dev, sc, sc->nchans, gotmic ? 3 : 2)) goto bad;
2134	for (i = 0; i < sc->nchans; i++)
2135		pcm_addchan(dev, PCMDIR_PLAY, &emupchan_class, sc);
2136	for (i = 0; i < (gotmic ? 3 : 2); i++)
2137		pcm_addchan(dev, PCMDIR_REC, &emurchan_class, sc);
2138
2139	pcm_setstatus(dev, status);
2140
2141	return 0;
2142
2143bad:
2144	if (codec) ac97_destroy(codec);
2145	if (sc->reg) bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
2146	if (sc->ih) bus_teardown_intr(dev, sc->irq, sc->ih);
2147	if (sc->irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
2148	if (sc->parent_dmat) bus_dma_tag_destroy(sc->parent_dmat);
2149	if (sc->lock) snd_mtxfree(sc->lock);
2150	free(sc, M_DEVBUF);
2151	return ENXIO;
2152}
2153
2154static int
2155emu_pci_detach(device_t dev)
2156{
2157	int r;
2158	struct sc_info *sc;
2159
2160	r = pcm_unregister(dev);
2161	if (r)
2162		return r;
2163
2164	sc = pcm_getdevinfo(dev);
2165	/* shutdown chip */
2166	emu_uninit(sc);
2167
2168	bus_release_resource(dev, SYS_RES_IOPORT, PCIR_BAR(0), sc->reg);
2169	bus_teardown_intr(dev, sc->irq, sc->ih);
2170	bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
2171	bus_dma_tag_destroy(sc->parent_dmat);
2172	snd_mtxfree(sc->lock);
2173	free(sc, M_DEVBUF);
2174
2175	return 0;
2176}
2177
2178/* add suspend, resume */
2179static device_method_t emu_methods[] = {
2180	/* Device interface */
2181	DEVMETHOD(device_probe,		emu_pci_probe),
2182	DEVMETHOD(device_attach,	emu_pci_attach),
2183	DEVMETHOD(device_detach,	emu_pci_detach),
2184
2185	{ 0, 0 }
2186};
2187
2188static driver_t emu_driver = {
2189	"pcm",
2190	emu_methods,
2191	PCM_SOFTC_SIZE,
2192};
2193
2194DRIVER_MODULE(snd_emu10k1, pci, emu_driver, pcm_devclass, 0, 0);
2195MODULE_DEPEND(snd_emu10k1, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
2196MODULE_VERSION(snd_emu10k1, 1);
2197MODULE_DEPEND(snd_emu10k1, midi, 1, 1, 1);
2198
2199/* dummy driver to silence the joystick device */
2200static int
2201emujoy_pci_probe(device_t dev)
2202{
2203	char *s = NULL;
2204
2205	switch (pci_get_devid(dev)) {
2206	case 0x70021102:
2207		s = "Creative EMU10K1 Joystick";
2208		device_quiet(dev);
2209		break;
2210	case 0x70031102:
2211		s = "Creative EMU10K2 Joystick";
2212		device_quiet(dev);
2213		break;
2214	}
2215
2216	if (s) device_set_desc(dev, s);
2217	return s ? -1000 : ENXIO;
2218}
2219
2220static int
2221emujoy_pci_attach(device_t dev)
2222{
2223	return 0;
2224}
2225
2226static int
2227emujoy_pci_detach(device_t dev)
2228{
2229	return 0;
2230}
2231
2232static device_method_t emujoy_methods[] = {
2233	DEVMETHOD(device_probe,		emujoy_pci_probe),
2234	DEVMETHOD(device_attach,	emujoy_pci_attach),
2235	DEVMETHOD(device_detach,	emujoy_pci_detach),
2236
2237	{ 0, 0 }
2238};
2239
2240static driver_t emujoy_driver = {
2241	"emujoy",
2242	emujoy_methods,
2243	8,
2244};
2245
2246static devclass_t emujoy_devclass;
2247
2248DRIVER_MODULE(emujoy, pci, emujoy_driver, emujoy_devclass, 0, 0);
2249
2250