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