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