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