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