Merge tag 'pci-v6.4-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci
[linux-block.git] / sound / pci / emu10k1 / emufx.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
4  *                   Creative Labs, Inc.
5  *  Routines for effect processor FX8010
6  *
7  *  Copyright (c) by James Courtier-Dutton <James@superbug.co.uk>
8  *      Added EMU 1010 support.
9  *
10  *  BUGS:
11  *    --
12  *
13  *  TODO:
14  *    --
15  */
16
17 #include <linux/pci.h>
18 #include <linux/capability.h>
19 #include <linux/delay.h>
20 #include <linux/slab.h>
21 #include <linux/vmalloc.h>
22 #include <linux/init.h>
23 #include <linux/mutex.h>
24 #include <linux/moduleparam.h>
25 #include <linux/nospec.h>
26
27 #include <sound/core.h>
28 #include <sound/tlv.h>
29 #include <sound/emu10k1.h>
30
31 #if 0           /* for testing purposes - digital out -> capture */
32 #define EMU10K1_CAPTURE_DIGITAL_OUT
33 #endif
34 #if 0           /* for testing purposes - set S/PDIF to AC3 output */
35 #define EMU10K1_SET_AC3_IEC958
36 #endif
37 #if 0           /* for testing purposes - feed the front signal to Center/LFE outputs */
38 #define EMU10K1_CENTER_LFE_FROM_FRONT
39 #endif
40
41 static bool high_res_gpr_volume;
42 module_param(high_res_gpr_volume, bool, 0444);
43 MODULE_PARM_DESC(high_res_gpr_volume, "GPR mixer controls use 31-bit range.");
44
45 /*
46  *  Tables
47  */ 
48
49 static const char * const fxbuses[16] = {
50         /* 0x00 */ "PCM Left",
51         /* 0x01 */ "PCM Right",
52         /* 0x02 */ "PCM Surround Left",
53         /* 0x03 */ "PCM Surround Right",
54         /* 0x04 */ "MIDI Left",
55         /* 0x05 */ "MIDI Right",
56         /* 0x06 */ "Center",
57         /* 0x07 */ "LFE",
58         /* 0x08 */ NULL,
59         /* 0x09 */ NULL,
60         /* 0x0a */ NULL,
61         /* 0x0b */ NULL,
62         /* 0x0c */ "MIDI Reverb",
63         /* 0x0d */ "MIDI Chorus",
64         /* 0x0e */ NULL,
65         /* 0x0f */ NULL
66 };
67
68 static const char * const creative_ins[16] = {
69         /* 0x00 */ "AC97 Left",
70         /* 0x01 */ "AC97 Right",
71         /* 0x02 */ "TTL IEC958 Left",
72         /* 0x03 */ "TTL IEC958 Right",
73         /* 0x04 */ "Zoom Video Left",
74         /* 0x05 */ "Zoom Video Right",
75         /* 0x06 */ "Optical IEC958 Left",
76         /* 0x07 */ "Optical IEC958 Right",
77         /* 0x08 */ "Line/Mic 1 Left",
78         /* 0x09 */ "Line/Mic 1 Right",
79         /* 0x0a */ "Coaxial IEC958 Left",
80         /* 0x0b */ "Coaxial IEC958 Right",
81         /* 0x0c */ "Line/Mic 2 Left",
82         /* 0x0d */ "Line/Mic 2 Right",
83         /* 0x0e */ NULL,
84         /* 0x0f */ NULL
85 };
86
87 static const char * const audigy_ins[16] = {
88         /* 0x00 */ "AC97 Left",
89         /* 0x01 */ "AC97 Right",
90         /* 0x02 */ "Audigy CD Left",
91         /* 0x03 */ "Audigy CD Right",
92         /* 0x04 */ "Optical IEC958 Left",
93         /* 0x05 */ "Optical IEC958 Right",
94         /* 0x06 */ NULL,
95         /* 0x07 */ NULL,
96         /* 0x08 */ "Line/Mic 2 Left",
97         /* 0x09 */ "Line/Mic 2 Right",
98         /* 0x0a */ "SPDIF Left",
99         /* 0x0b */ "SPDIF Right",
100         /* 0x0c */ "Aux2 Left",
101         /* 0x0d */ "Aux2 Right",
102         /* 0x0e */ NULL,
103         /* 0x0f */ NULL
104 };
105
106 static const char * const creative_outs[32] = {
107         /* 0x00 */ "AC97 Left",
108         /* 0x01 */ "AC97 Right",
109         /* 0x02 */ "Optical IEC958 Left",
110         /* 0x03 */ "Optical IEC958 Right",
111         /* 0x04 */ "Center",
112         /* 0x05 */ "LFE",
113         /* 0x06 */ "Headphone Left",
114         /* 0x07 */ "Headphone Right",
115         /* 0x08 */ "Surround Left",
116         /* 0x09 */ "Surround Right",
117         /* 0x0a */ "PCM Capture Left",
118         /* 0x0b */ "PCM Capture Right",
119         /* 0x0c */ "MIC Capture",
120         /* 0x0d */ "AC97 Surround Left",
121         /* 0x0e */ "AC97 Surround Right",
122         /* 0x0f */ NULL,
123         /* 0x10 */ NULL,
124         /* 0x11 */ "Analog Center",
125         /* 0x12 */ "Analog LFE",
126         /* 0x13 */ NULL,
127         /* 0x14 */ NULL,
128         /* 0x15 */ NULL,
129         /* 0x16 */ NULL,
130         /* 0x17 */ NULL,
131         /* 0x18 */ NULL,
132         /* 0x19 */ NULL,
133         /* 0x1a */ NULL,
134         /* 0x1b */ NULL,
135         /* 0x1c */ NULL,
136         /* 0x1d */ NULL,
137         /* 0x1e */ NULL,
138         /* 0x1f */ NULL,
139 };
140
141 static const char * const audigy_outs[32] = {
142         /* 0x00 */ "Digital Front Left",
143         /* 0x01 */ "Digital Front Right",
144         /* 0x02 */ "Digital Center",
145         /* 0x03 */ "Digital LEF",
146         /* 0x04 */ "Headphone Left",
147         /* 0x05 */ "Headphone Right",
148         /* 0x06 */ "Digital Rear Left",
149         /* 0x07 */ "Digital Rear Right",
150         /* 0x08 */ "Front Left",
151         /* 0x09 */ "Front Right",
152         /* 0x0a */ "Center",
153         /* 0x0b */ "LFE",
154         /* 0x0c */ NULL,
155         /* 0x0d */ NULL,
156         /* 0x0e */ "Rear Left",
157         /* 0x0f */ "Rear Right",
158         /* 0x10 */ "AC97 Front Left",
159         /* 0x11 */ "AC97 Front Right",
160         /* 0x12 */ "ADC Capture Left",
161         /* 0x13 */ "ADC Capture Right",
162         /* 0x14 */ NULL,
163         /* 0x15 */ NULL,
164         /* 0x16 */ NULL,
165         /* 0x17 */ NULL,
166         /* 0x18 */ NULL,
167         /* 0x19 */ NULL,
168         /* 0x1a */ NULL,
169         /* 0x1b */ NULL,
170         /* 0x1c */ NULL,
171         /* 0x1d */ NULL,
172         /* 0x1e */ NULL,
173         /* 0x1f */ NULL,
174 };
175
176 static const u32 bass_table[41][5] = {
177         { 0x3e4f844f, 0x84ed4cc3, 0x3cc69927, 0x7b03553a, 0xc4da8486 },
178         { 0x3e69a17a, 0x84c280fb, 0x3cd77cd4, 0x7b2f2a6f, 0xc4b08d1d },
179         { 0x3e82ff42, 0x849991d5, 0x3ce7466b, 0x7b5917c6, 0xc48863ee },
180         { 0x3e9bab3c, 0x847267f0, 0x3cf5ffe8, 0x7b813560, 0xc461f22c },
181         { 0x3eb3b275, 0x844ced29, 0x3d03b295, 0x7ba79a1c, 0xc43d223b },
182         { 0x3ecb2174, 0x84290c8b, 0x3d106714, 0x7bcc5ba3, 0xc419dfa5 },
183         { 0x3ee2044b, 0x8406b244, 0x3d1c2561, 0x7bef8e77, 0xc3f8170f },
184         { 0x3ef86698, 0x83e5cb96, 0x3d26f4d8, 0x7c114600, 0xc3d7b625 },
185         { 0x3f0e5390, 0x83c646c9, 0x3d30dc39, 0x7c319498, 0xc3b8ab97 },
186         { 0x3f23d60b, 0x83a81321, 0x3d39e1af, 0x7c508b9c, 0xc39ae704 },
187         { 0x3f38f884, 0x838b20d2, 0x3d420ad2, 0x7c6e3b75, 0xc37e58f1 },
188         { 0x3f4dc52c, 0x836f60ef, 0x3d495cab, 0x7c8ab3a6, 0xc362f2be },
189         { 0x3f6245e8, 0x8354c565, 0x3d4fdbb8, 0x7ca602d6, 0xc348a69b },
190         { 0x3f76845f, 0x833b40ec, 0x3d558bf0, 0x7cc036df, 0xc32f677c },
191         { 0x3f8a8a03, 0x8322c6fb, 0x3d5a70c4, 0x7cd95cd7, 0xc317290b },
192         { 0x3f9e6014, 0x830b4bc3, 0x3d5e8d25, 0x7cf1811a, 0xc2ffdfa5 },
193         { 0x3fb20fae, 0x82f4c420, 0x3d61e37f, 0x7d08af56, 0xc2e9804a },
194         { 0x3fc5a1cc, 0x82df2592, 0x3d6475c3, 0x7d1ef294, 0xc2d40096 },
195         { 0x3fd91f55, 0x82ca6632, 0x3d664564, 0x7d345541, 0xc2bf56b9 },
196         { 0x3fec9120, 0x82b67cac, 0x3d675356, 0x7d48e138, 0xc2ab796e },
197         { 0x40000000, 0x82a36037, 0x3d67a012, 0x7d5c9fc9, 0xc2985fee },
198         { 0x401374c7, 0x8291088a, 0x3d672b93, 0x7d6f99c3, 0xc28601f2 },
199         { 0x4026f857, 0x827f6dd7, 0x3d65f559, 0x7d81d77c, 0xc27457a3 },
200         { 0x403a939f, 0x826e88c5, 0x3d63fc63, 0x7d9360d4, 0xc2635996 },
201         { 0x404e4faf, 0x825e5266, 0x3d613f32, 0x7da43d42, 0xc25300c6 },
202         { 0x406235ba, 0x824ec434, 0x3d5dbbc3, 0x7db473d7, 0xc243468e },
203         { 0x40764f1f, 0x823fd80c, 0x3d596f8f, 0x7dc40b44, 0xc23424a2 },
204         { 0x408aa576, 0x82318824, 0x3d545787, 0x7dd309e2, 0xc2259509 },
205         { 0x409f4296, 0x8223cf0b, 0x3d4e7012, 0x7de175b5, 0xc2179218 },
206         { 0x40b430a0, 0x8216a7a1, 0x3d47b505, 0x7def5475, 0xc20a1670 },
207         { 0x40c97a0a, 0x820a0d12, 0x3d4021a1, 0x7dfcab8d, 0xc1fd1cf5 },
208         { 0x40df29a6, 0x81fdfad6, 0x3d37b08d, 0x7e098028, 0xc1f0a0ca },
209         { 0x40f54ab1, 0x81f26ca9, 0x3d2e5bd1, 0x7e15d72b, 0xc1e49d52 },
210         { 0x410be8da, 0x81e75e89, 0x3d241cce, 0x7e21b544, 0xc1d90e24 },
211         { 0x41231051, 0x81dcccb3, 0x3d18ec37, 0x7e2d1ee6, 0xc1cdef10 },
212         { 0x413acdd0, 0x81d2b39e, 0x3d0cc20a, 0x7e38184e, 0xc1c33c13 },
213         { 0x41532ea7, 0x81c90ffb, 0x3cff9585, 0x7e42a58b, 0xc1b8f15a },
214         { 0x416c40cd, 0x81bfdeb2, 0x3cf15d21, 0x7e4cca7c, 0xc1af0b3f },
215         { 0x418612ea, 0x81b71cdc, 0x3ce20e85, 0x7e568ad3, 0xc1a58640 },
216         { 0x41a0b465, 0x81aec7c5, 0x3cd19e7c, 0x7e5fea1e, 0xc19c5f03 },
217         { 0x41bc3573, 0x81a6dcea, 0x3cc000e9, 0x7e68ebc2, 0xc1939250 }
218 };
219
220 static const u32 treble_table[41][5] = {
221         { 0x0125cba9, 0xfed5debd, 0x00599b6c, 0x0d2506da, 0xfa85b354 },
222         { 0x0142f67e, 0xfeb03163, 0x0066cd0f, 0x0d14c69d, 0xfa914473 },
223         { 0x016328bd, 0xfe860158, 0x0075b7f2, 0x0d03eb27, 0xfa9d32d2 },
224         { 0x0186b438, 0xfe56c982, 0x00869234, 0x0cf27048, 0xfaa97fca },
225         { 0x01adf358, 0xfe21f5fe, 0x00999842, 0x0ce051c2, 0xfab62ca5 },
226         { 0x01d949fa, 0xfde6e287, 0x00af0d8d, 0x0ccd8b4a, 0xfac33aa7 },
227         { 0x02092669, 0xfda4d8bf, 0x00c73d4c, 0x0cba1884, 0xfad0ab07 },
228         { 0x023e0268, 0xfd5b0e4a, 0x00e27b54, 0x0ca5f509, 0xfade7ef2 },
229         { 0x0278645c, 0xfd08a2b0, 0x01012509, 0x0c911c63, 0xfaecb788 },
230         { 0x02b8e091, 0xfcac9d1a, 0x0123a262, 0x0c7b8a14, 0xfafb55df },
231         { 0x03001a9a, 0xfc45e9ce, 0x014a6709, 0x0c65398f, 0xfb0a5aff },
232         { 0x034ec6d7, 0xfbd3576b, 0x0175f397, 0x0c4e2643, 0xfb19c7e4 },
233         { 0x03a5ac15, 0xfb5393ee, 0x01a6d6ed, 0x0c364b94, 0xfb299d7c },
234         { 0x0405a562, 0xfac52968, 0x01ddafae, 0x0c1da4e2, 0xfb39dca5 },
235         { 0x046fa3fe, 0xfa267a66, 0x021b2ddd, 0x0c042d8d, 0xfb4a8631 },
236         { 0x04e4b17f, 0xf975be0f, 0x0260149f, 0x0be9e0f2, 0xfb5b9ae0 },
237         { 0x0565f220, 0xf8b0fbe5, 0x02ad3c29, 0x0bceba73, 0xfb6d1b60 },
238         { 0x05f4a745, 0xf7d60722, 0x030393d4, 0x0bb2b578, 0xfb7f084d },
239         { 0x06923236, 0xf6e279bd, 0x03642465, 0x0b95cd75, 0xfb916233 },
240         { 0x07401713, 0xf5d3aef9, 0x03d01283, 0x0b77fded, 0xfba42984 },
241         { 0x08000000, 0xf4a6bd88, 0x0448a161, 0x0b594278, 0xfbb75e9f },
242         { 0x08d3c097, 0xf3587131, 0x04cf35a4, 0x0b3996c9, 0xfbcb01cb },
243         { 0x09bd59a2, 0xf1e543f9, 0x05655880, 0x0b18f6b2, 0xfbdf1333 },
244         { 0x0abefd0f, 0xf04956ca, 0x060cbb12, 0x0af75e2c, 0xfbf392e8 },
245         { 0x0bdb123e, 0xee806984, 0x06c739fe, 0x0ad4c962, 0xfc0880dd },
246         { 0x0d143a94, 0xec85d287, 0x0796e150, 0x0ab134b0, 0xfc1ddce5 },
247         { 0x0e6d5664, 0xea547598, 0x087df0a0, 0x0a8c9cb6, 0xfc33a6ad },
248         { 0x0fe98a2a, 0xe7e6ba35, 0x097edf83, 0x0a66fe5b, 0xfc49ddc2 },
249         { 0x118c4421, 0xe536813a, 0x0a9c6248, 0x0a4056d7, 0xfc608185 },
250         { 0x1359422e, 0xe23d19eb, 0x0bd96efb, 0x0a18a3bf, 0xfc77912c },
251         { 0x1554982b, 0xdef33645, 0x0d3942bd, 0x09efe312, 0xfc8f0bc1 },
252         { 0x1782b68a, 0xdb50deb1, 0x0ebf676d, 0x09c6133f, 0xfca6f019 },
253         { 0x19e8715d, 0xd74d64fd, 0x106fb999, 0x099b3337, 0xfcbf3cd6 },
254         { 0x1c8b07b8, 0xd2df56ab, 0x124e6ec8, 0x096f4274, 0xfcd7f060 },
255         { 0x1f702b6d, 0xcdfc6e92, 0x14601c10, 0x0942410b, 0xfcf108e5 },
256         { 0x229e0933, 0xc89985cd, 0x16a9bcfa, 0x09142fb5, 0xfd0a8451 },
257         { 0x261b5118, 0xc2aa8409, 0x1930bab6, 0x08e50fdc, 0xfd24604d },
258         { 0x29ef3f5d, 0xbc224f28, 0x1bfaf396, 0x08b4e3aa, 0xfd3e9a3b },
259         { 0x2e21a59b, 0xb4f2ba46, 0x1f0ec2d6, 0x0883ae15, 0xfd592f33 },
260         { 0x32baf44b, 0xad0c7429, 0x227308a3, 0x085172eb, 0xfd741bfd },
261         { 0x37c4448b, 0xa45ef51d, 0x262f3267, 0x081e36dc, 0xfd8f5d14 }
262 };
263
264 /* dB gain = (float) 20 * log10( float(db_table_value) / 0x8000000 ) */
265 static const u32 db_table[101] = {
266         0x00000000, 0x01571f82, 0x01674b41, 0x01783a1b, 0x0189f540,
267         0x019c8651, 0x01aff763, 0x01c45306, 0x01d9a446, 0x01eff6b8,
268         0x0207567a, 0x021fd03d, 0x0239714c, 0x02544792, 0x027061a1,
269         0x028dcebb, 0x02ac9edc, 0x02cce2bf, 0x02eeabe8, 0x03120cb0,
270         0x0337184e, 0x035de2df, 0x03868173, 0x03b10a18, 0x03dd93e9,
271         0x040c3713, 0x043d0cea, 0x04702ff3, 0x04a5bbf2, 0x04ddcdfb,
272         0x0518847f, 0x0555ff62, 0x05966005, 0x05d9c95d, 0x06206005,
273         0x066a4a52, 0x06b7b067, 0x0708bc4c, 0x075d9a01, 0x07b6779d,
274         0x08138561, 0x0874f5d5, 0x08dafde1, 0x0945d4ed, 0x09b5b4fd,
275         0x0a2adad1, 0x0aa58605, 0x0b25f936, 0x0bac7a24, 0x0c3951d8,
276         0x0ccccccc, 0x0d673b17, 0x0e08f093, 0x0eb24510, 0x0f639481,
277         0x101d3f2d, 0x10dfa9e6, 0x11ab3e3f, 0x12806ac3, 0x135fa333,
278         0x144960c5, 0x153e2266, 0x163e6cfe, 0x174acbb7, 0x1863d04d,
279         0x198a1357, 0x1abe349f, 0x1c00db77, 0x1d52b712, 0x1eb47ee6,
280         0x2026f30f, 0x21aadcb6, 0x23410e7e, 0x24ea64f9, 0x26a7c71d,
281         0x287a26c4, 0x2a62812c, 0x2c61df84, 0x2e795779, 0x30aa0bcf,
282         0x32f52cfe, 0x355bf9d8, 0x37dfc033, 0x3a81dda4, 0x3d43c038,
283         0x4026e73c, 0x432ce40f, 0x46575af8, 0x49a8040f, 0x4d20ac2a,
284         0x50c335d3, 0x54919a57, 0x588dead1, 0x5cba514a, 0x611911ea,
285         0x65ac8c2f, 0x6a773c39, 0x6f7bbc23, 0x74bcc56c, 0x7a3d3272,
286         0x7fffffff,
287 };
288
289 /* EMU10k1/EMU10k2 DSP control db gain */
290 static const DECLARE_TLV_DB_SCALE(snd_emu10k1_db_scale1, -4000, 40, 1);
291 static const DECLARE_TLV_DB_LINEAR(snd_emu10k1_db_linear, TLV_DB_GAIN_MUTE, 0);
292
293 /* EMU10K1 bass/treble db gain */
294 static const DECLARE_TLV_DB_SCALE(snd_emu10k1_bass_treble_db_scale, -1200, 60, 0);
295
296 static const u32 onoff_table[2] = {
297         0x00000000, 0x00000001
298 };
299
300 /*
301  *   controls
302  */
303
304 static int snd_emu10k1_gpr_ctl_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
305 {
306         struct snd_emu10k1_fx8010_ctl *ctl =
307                 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
308
309         if (ctl->min == 0 && ctl->max == 1)
310                 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
311         else
312                 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
313         uinfo->count = ctl->vcount;
314         uinfo->value.integer.min = ctl->min;
315         uinfo->value.integer.max = ctl->max;
316         return 0;
317 }
318
319 static int snd_emu10k1_gpr_ctl_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
320 {
321         struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
322         struct snd_emu10k1_fx8010_ctl *ctl =
323                 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
324         unsigned long flags;
325         unsigned int i;
326         
327         spin_lock_irqsave(&emu->reg_lock, flags);
328         for (i = 0; i < ctl->vcount; i++)
329                 ucontrol->value.integer.value[i] = ctl->value[i];
330         spin_unlock_irqrestore(&emu->reg_lock, flags);
331         return 0;
332 }
333
334 static int snd_emu10k1_gpr_ctl_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
335 {
336         struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
337         struct snd_emu10k1_fx8010_ctl *ctl =
338                 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
339         unsigned long flags;
340         unsigned int nval, val;
341         unsigned int i, j;
342         int change = 0;
343         
344         spin_lock_irqsave(&emu->reg_lock, flags);
345         for (i = 0; i < ctl->vcount; i++) {
346                 nval = ucontrol->value.integer.value[i];
347                 if (nval < ctl->min)
348                         nval = ctl->min;
349                 if (nval > ctl->max)
350                         nval = ctl->max;
351                 if (nval != ctl->value[i])
352                         change = 1;
353                 val = ctl->value[i] = nval;
354                 switch (ctl->translation) {
355                 case EMU10K1_GPR_TRANSLATION_NONE:
356                         snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, val);
357                         break;
358                 case EMU10K1_GPR_TRANSLATION_TABLE100:
359                         snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, db_table[val]);
360                         break;
361                 case EMU10K1_GPR_TRANSLATION_BASS:
362                         if ((ctl->count % 5) != 0 || (ctl->count / 5) != ctl->vcount) {
363                                 change = -EIO;
364                                 goto __error;
365                         }
366                         for (j = 0; j < 5; j++)
367                                 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, bass_table[val][j]);
368                         break;
369                 case EMU10K1_GPR_TRANSLATION_TREBLE:
370                         if ((ctl->count % 5) != 0 || (ctl->count / 5) != ctl->vcount) {
371                                 change = -EIO;
372                                 goto __error;
373                         }
374                         for (j = 0; j < 5; j++)
375                                 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, treble_table[val][j]);
376                         break;
377                 case EMU10K1_GPR_TRANSLATION_ONOFF:
378                         snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, onoff_table[val]);
379                         break;
380                 }
381         }
382       __error:
383         spin_unlock_irqrestore(&emu->reg_lock, flags);
384         return change;
385 }
386
387 /*
388  *   Interrupt handler
389  */
390
391 static void snd_emu10k1_fx8010_interrupt(struct snd_emu10k1 *emu)
392 {
393         struct snd_emu10k1_fx8010_irq *irq, *nirq;
394
395         irq = emu->fx8010.irq_handlers;
396         while (irq) {
397                 nirq = irq->next;       /* irq ptr can be removed from list */
398                 if (snd_emu10k1_ptr_read(emu, emu->gpr_base + irq->gpr_running, 0) & 0xffff0000) {
399                         if (irq->handler)
400                                 irq->handler(emu, irq->private_data);
401                         snd_emu10k1_ptr_write(emu, emu->gpr_base + irq->gpr_running, 0, 1);
402                 }
403                 irq = nirq;
404         }
405 }
406
407 int snd_emu10k1_fx8010_register_irq_handler(struct snd_emu10k1 *emu,
408                                             snd_fx8010_irq_handler_t *handler,
409                                             unsigned char gpr_running,
410                                             void *private_data,
411                                             struct snd_emu10k1_fx8010_irq *irq)
412 {
413         unsigned long flags;
414         
415         irq->handler = handler;
416         irq->gpr_running = gpr_running;
417         irq->private_data = private_data;
418         irq->next = NULL;
419         spin_lock_irqsave(&emu->fx8010.irq_lock, flags);
420         if (emu->fx8010.irq_handlers == NULL) {
421                 emu->fx8010.irq_handlers = irq;
422                 emu->dsp_interrupt = snd_emu10k1_fx8010_interrupt;
423                 snd_emu10k1_intr_enable(emu, INTE_FXDSPENABLE);
424         } else {
425                 irq->next = emu->fx8010.irq_handlers;
426                 emu->fx8010.irq_handlers = irq;
427         }
428         spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags);
429         return 0;
430 }
431
432 int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,
433                                               struct snd_emu10k1_fx8010_irq *irq)
434 {
435         struct snd_emu10k1_fx8010_irq *tmp;
436         unsigned long flags;
437         
438         spin_lock_irqsave(&emu->fx8010.irq_lock, flags);
439         tmp = emu->fx8010.irq_handlers;
440         if (tmp == irq) {
441                 emu->fx8010.irq_handlers = tmp->next;
442                 if (emu->fx8010.irq_handlers == NULL) {
443                         snd_emu10k1_intr_disable(emu, INTE_FXDSPENABLE);
444                         emu->dsp_interrupt = NULL;
445                 }
446         } else {
447                 while (tmp && tmp->next != irq)
448                         tmp = tmp->next;
449                 if (tmp)
450                         tmp->next = tmp->next->next;
451         }
452         spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags);
453         return 0;
454 }
455
456 /*************************************************************************
457  * EMU10K1 effect manager
458  *************************************************************************/
459
460 static void snd_emu10k1_write_op(struct snd_emu10k1_fx8010_code *icode,
461                                  unsigned int *ptr,
462                                  u32 op, u32 r, u32 a, u32 x, u32 y)
463 {
464         u_int32_t *code;
465         if (snd_BUG_ON(*ptr >= 512))
466                 return;
467         code = icode->code + (*ptr) * 2;
468         set_bit(*ptr, icode->code_valid);
469         code[0] = ((x & 0x3ff) << 10) | (y & 0x3ff);
470         code[1] = ((op & 0x0f) << 20) | ((r & 0x3ff) << 10) | (a & 0x3ff);
471         (*ptr)++;
472 }
473
474 #define OP(icode, ptr, op, r, a, x, y) \
475         snd_emu10k1_write_op(icode, ptr, op, r, a, x, y)
476
477 static void snd_emu10k1_audigy_write_op(struct snd_emu10k1_fx8010_code *icode,
478                                         unsigned int *ptr,
479                                         u32 op, u32 r, u32 a, u32 x, u32 y)
480 {
481         u_int32_t *code;
482         if (snd_BUG_ON(*ptr >= 1024))
483                 return;
484         code = icode->code + (*ptr) * 2;
485         set_bit(*ptr, icode->code_valid);
486         code[0] = ((x & 0x7ff) << 12) | (y & 0x7ff);
487         code[1] = ((op & 0x0f) << 24) | ((r & 0x7ff) << 12) | (a & 0x7ff);
488         (*ptr)++;
489 }
490
491 #define A_OP(icode, ptr, op, r, a, x, y) \
492         snd_emu10k1_audigy_write_op(icode, ptr, op, r, a, x, y)
493
494 static void snd_emu10k1_efx_write(struct snd_emu10k1 *emu, unsigned int pc, unsigned int data)
495 {
496         pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;
497         snd_emu10k1_ptr_write(emu, pc, 0, data);
498 }
499
500 unsigned int snd_emu10k1_efx_read(struct snd_emu10k1 *emu, unsigned int pc)
501 {
502         pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;
503         return snd_emu10k1_ptr_read(emu, pc, 0);
504 }
505
506 static int snd_emu10k1_gpr_poke(struct snd_emu10k1 *emu,
507                                 struct snd_emu10k1_fx8010_code *icode,
508                                 bool in_kernel)
509 {
510         int gpr;
511         u32 val;
512
513         for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) {
514                 if (!test_bit(gpr, icode->gpr_valid))
515                         continue;
516                 if (in_kernel)
517                         val = icode->gpr_map[gpr];
518                 else if (get_user(val, (__user u32 *)&icode->gpr_map[gpr]))
519                         return -EFAULT;
520                 snd_emu10k1_ptr_write(emu, emu->gpr_base + gpr, 0, val);
521         }
522         return 0;
523 }
524
525 static int snd_emu10k1_gpr_peek(struct snd_emu10k1 *emu,
526                                 struct snd_emu10k1_fx8010_code *icode)
527 {
528         int gpr;
529         u32 val;
530
531         for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) {
532                 set_bit(gpr, icode->gpr_valid);
533                 val = snd_emu10k1_ptr_read(emu, emu->gpr_base + gpr, 0);
534                 if (put_user(val, (__user u32 *)&icode->gpr_map[gpr]))
535                         return -EFAULT;
536         }
537         return 0;
538 }
539
540 static int snd_emu10k1_tram_poke(struct snd_emu10k1 *emu,
541                                  struct snd_emu10k1_fx8010_code *icode,
542                                  bool in_kernel)
543 {
544         int tram;
545         u32 addr, val;
546
547         for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) {
548                 if (!test_bit(tram, icode->tram_valid))
549                         continue;
550                 if (in_kernel) {
551                         val = icode->tram_data_map[tram];
552                         addr = icode->tram_addr_map[tram];
553                 } else {
554                         if (get_user(val, (__user __u32 *)&icode->tram_data_map[tram]) ||
555                             get_user(addr, (__user __u32 *)&icode->tram_addr_map[tram]))
556                                 return -EFAULT;
557                 }
558                 snd_emu10k1_ptr_write(emu, TANKMEMDATAREGBASE + tram, 0, val);
559                 if (!emu->audigy) {
560                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + tram, 0, addr);
561                 } else {
562                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + tram, 0, addr << 12);
563                         snd_emu10k1_ptr_write(emu, A_TANKMEMCTLREGBASE + tram, 0, addr >> 20);
564                 }
565         }
566         return 0;
567 }
568
569 static int snd_emu10k1_tram_peek(struct snd_emu10k1 *emu,
570                                  struct snd_emu10k1_fx8010_code *icode)
571 {
572         int tram;
573         u32 val, addr;
574
575         memset(icode->tram_valid, 0, sizeof(icode->tram_valid));
576         for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) {
577                 set_bit(tram, icode->tram_valid);
578                 val = snd_emu10k1_ptr_read(emu, TANKMEMDATAREGBASE + tram, 0);
579                 if (!emu->audigy) {
580                         addr = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + tram, 0);
581                 } else {
582                         addr = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + tram, 0) >> 12;
583                         addr |= snd_emu10k1_ptr_read(emu, A_TANKMEMCTLREGBASE + tram, 0) << 20;
584                 }
585                 if (put_user(val, (__user u32 *)&icode->tram_data_map[tram]) ||
586                     put_user(addr, (__user u32 *)&icode->tram_addr_map[tram]))
587                         return -EFAULT;
588         }
589         return 0;
590 }
591
592 static int snd_emu10k1_code_poke(struct snd_emu10k1 *emu,
593                                  struct snd_emu10k1_fx8010_code *icode,
594                                  bool in_kernel)
595 {
596         u32 pc, lo, hi;
597
598         for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) {
599                 if (!test_bit(pc / 2, icode->code_valid))
600                         continue;
601                 if (in_kernel) {
602                         lo = icode->code[pc + 0];
603                         hi = icode->code[pc + 1];
604                 } else {
605                         if (get_user(lo, (__user u32 *)&icode->code[pc + 0]) ||
606                             get_user(hi, (__user u32 *)&icode->code[pc + 1]))
607                                 return -EFAULT;
608                 }
609                 snd_emu10k1_efx_write(emu, pc + 0, lo);
610                 snd_emu10k1_efx_write(emu, pc + 1, hi);
611         }
612         return 0;
613 }
614
615 static int snd_emu10k1_code_peek(struct snd_emu10k1 *emu,
616                                  struct snd_emu10k1_fx8010_code *icode)
617 {
618         u32 pc;
619
620         memset(icode->code_valid, 0, sizeof(icode->code_valid));
621         for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) {
622                 set_bit(pc / 2, icode->code_valid);
623                 if (put_user(snd_emu10k1_efx_read(emu, pc + 0),
624                              (__user u32 *)&icode->code[pc + 0]))
625                         return -EFAULT;
626                 if (put_user(snd_emu10k1_efx_read(emu, pc + 1),
627                              (__user u32 *)&icode->code[pc + 1]))
628                         return -EFAULT;
629         }
630         return 0;
631 }
632
633 static struct snd_emu10k1_fx8010_ctl *
634 snd_emu10k1_look_for_ctl(struct snd_emu10k1 *emu,
635                          struct emu10k1_ctl_elem_id *_id)
636 {
637         struct snd_ctl_elem_id *id = (struct snd_ctl_elem_id *)_id;
638         struct snd_emu10k1_fx8010_ctl *ctl;
639         struct snd_kcontrol *kcontrol;
640
641         list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) {
642                 kcontrol = ctl->kcontrol;
643                 if (kcontrol->id.iface == id->iface &&
644                     !strcmp(kcontrol->id.name, id->name) &&
645                     kcontrol->id.index == id->index)
646                         return ctl;
647         }
648         return NULL;
649 }
650
651 #define MAX_TLV_SIZE    256
652
653 static unsigned int *copy_tlv(const unsigned int __user *_tlv, bool in_kernel)
654 {
655         unsigned int data[2];
656         unsigned int *tlv;
657
658         if (!_tlv)
659                 return NULL;
660         if (in_kernel)
661                 memcpy(data, (__force void *)_tlv, sizeof(data));
662         else if (copy_from_user(data, _tlv, sizeof(data)))
663                 return NULL;
664         if (data[1] >= MAX_TLV_SIZE)
665                 return NULL;
666         tlv = kmalloc(data[1] + sizeof(data), GFP_KERNEL);
667         if (!tlv)
668                 return NULL;
669         memcpy(tlv, data, sizeof(data));
670         if (in_kernel) {
671                 memcpy(tlv + 2, (__force void *)(_tlv + 2),  data[1]);
672         } else if (copy_from_user(tlv + 2, _tlv + 2, data[1])) {
673                 kfree(tlv);
674                 return NULL;
675         }
676         return tlv;
677 }
678
679 static int copy_gctl(struct snd_emu10k1 *emu,
680                      struct snd_emu10k1_fx8010_control_gpr *dst,
681                      struct snd_emu10k1_fx8010_control_gpr *src,
682                      int idx, bool in_kernel)
683 {
684         struct snd_emu10k1_fx8010_control_gpr __user *_src;
685         struct snd_emu10k1_fx8010_control_old_gpr *octl;
686         struct snd_emu10k1_fx8010_control_old_gpr __user *_octl;
687
688         _src = (struct snd_emu10k1_fx8010_control_gpr __user *)src;
689         if (emu->support_tlv) {
690                 if (in_kernel)
691                         *dst = src[idx];
692                 else if (copy_from_user(dst, &_src[idx], sizeof(*src)))
693                         return -EFAULT;
694                 return 0;
695         }
696
697         octl = (struct snd_emu10k1_fx8010_control_old_gpr *)src;
698         _octl = (struct snd_emu10k1_fx8010_control_old_gpr __user *)octl;
699         if (in_kernel)
700                 memcpy(dst, &octl[idx], sizeof(*octl));
701         else if (copy_from_user(dst, &_octl[idx], sizeof(*octl)))
702                 return -EFAULT;
703         dst->tlv = NULL;
704         return 0;
705 }
706
707 static int copy_gctl_to_user(struct snd_emu10k1 *emu,
708                      struct snd_emu10k1_fx8010_control_gpr *dst,
709                      struct snd_emu10k1_fx8010_control_gpr *src,
710                      int idx)
711 {
712         struct snd_emu10k1_fx8010_control_gpr __user *_dst;
713         struct snd_emu10k1_fx8010_control_old_gpr __user *octl;
714
715         _dst = (struct snd_emu10k1_fx8010_control_gpr __user *)dst;
716         if (emu->support_tlv)
717                 return copy_to_user(&_dst[idx], src, sizeof(*src));
718         
719         octl = (struct snd_emu10k1_fx8010_control_old_gpr __user *)dst;
720         return copy_to_user(&octl[idx], src, sizeof(*octl));
721 }
722
723 static int copy_ctl_elem_id(const struct emu10k1_ctl_elem_id *list, int i,
724                             struct emu10k1_ctl_elem_id *ret, bool in_kernel)
725 {
726         struct emu10k1_ctl_elem_id __user *_id =
727                 (struct emu10k1_ctl_elem_id __user *)&list[i];
728
729         if (in_kernel)
730                 *ret = list[i];
731         else if (copy_from_user(ret, _id, sizeof(*ret)))
732                 return -EFAULT;
733         return 0;
734 }
735
736 static int snd_emu10k1_verify_controls(struct snd_emu10k1 *emu,
737                                        struct snd_emu10k1_fx8010_code *icode,
738                                        bool in_kernel)
739 {
740         unsigned int i;
741         struct emu10k1_ctl_elem_id id;
742         struct snd_emu10k1_fx8010_control_gpr *gctl;
743         struct snd_ctl_elem_id *gctl_id;
744         int err;
745         
746         for (i = 0; i < icode->gpr_del_control_count; i++) {
747                 err = copy_ctl_elem_id(icode->gpr_del_controls, i, &id,
748                                        in_kernel);
749                 if (err < 0)
750                         return err;
751                 if (snd_emu10k1_look_for_ctl(emu, &id) == NULL)
752                         return -ENOENT;
753         }
754         gctl = kmalloc(sizeof(*gctl), GFP_KERNEL);
755         if (! gctl)
756                 return -ENOMEM;
757         err = 0;
758         for (i = 0; i < icode->gpr_add_control_count; i++) {
759                 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i,
760                               in_kernel)) {
761                         err = -EFAULT;
762                         goto __error;
763                 }
764                 if (snd_emu10k1_look_for_ctl(emu, &gctl->id))
765                         continue;
766                 gctl_id = (struct snd_ctl_elem_id *)&gctl->id;
767                 down_read(&emu->card->controls_rwsem);
768                 if (snd_ctl_find_id(emu->card, gctl_id)) {
769                         up_read(&emu->card->controls_rwsem);
770                         err = -EEXIST;
771                         goto __error;
772                 }
773                 up_read(&emu->card->controls_rwsem);
774                 if (gctl_id->iface != SNDRV_CTL_ELEM_IFACE_MIXER &&
775                     gctl_id->iface != SNDRV_CTL_ELEM_IFACE_PCM) {
776                         err = -EINVAL;
777                         goto __error;
778                 }
779         }
780         for (i = 0; i < icode->gpr_list_control_count; i++) {
781                 /* FIXME: we need to check the WRITE access */
782                 if (copy_gctl(emu, gctl, icode->gpr_list_controls, i,
783                               in_kernel)) {
784                         err = -EFAULT;
785                         goto __error;
786                 }
787         }
788  __error:
789         kfree(gctl);
790         return err;
791 }
792
793 static void snd_emu10k1_ctl_private_free(struct snd_kcontrol *kctl)
794 {
795         struct snd_emu10k1_fx8010_ctl *ctl;
796         
797         ctl = (struct snd_emu10k1_fx8010_ctl *) kctl->private_value;
798         kctl->private_value = 0;
799         list_del(&ctl->list);
800         kfree(ctl);
801         kfree(kctl->tlv.p);
802 }
803
804 static int snd_emu10k1_add_controls(struct snd_emu10k1 *emu,
805                                     struct snd_emu10k1_fx8010_code *icode,
806                                     bool in_kernel)
807 {
808         unsigned int i, j;
809         struct snd_emu10k1_fx8010_control_gpr *gctl;
810         struct snd_ctl_elem_id *gctl_id;
811         struct snd_emu10k1_fx8010_ctl *ctl, *nctl;
812         struct snd_kcontrol_new knew;
813         struct snd_kcontrol *kctl;
814         struct snd_ctl_elem_value *val;
815         int err = 0;
816
817         val = kmalloc(sizeof(*val), GFP_KERNEL);
818         gctl = kmalloc(sizeof(*gctl), GFP_KERNEL);
819         nctl = kmalloc(sizeof(*nctl), GFP_KERNEL);
820         if (!val || !gctl || !nctl) {
821                 err = -ENOMEM;
822                 goto __error;
823         }
824
825         for (i = 0; i < icode->gpr_add_control_count; i++) {
826                 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i,
827                               in_kernel)) {
828                         err = -EFAULT;
829                         goto __error;
830                 }
831                 gctl_id = (struct snd_ctl_elem_id *)&gctl->id;
832                 if (gctl_id->iface != SNDRV_CTL_ELEM_IFACE_MIXER &&
833                     gctl_id->iface != SNDRV_CTL_ELEM_IFACE_PCM) {
834                         err = -EINVAL;
835                         goto __error;
836                 }
837                 if (!*gctl_id->name) {
838                         err = -EINVAL;
839                         goto __error;
840                 }
841                 ctl = snd_emu10k1_look_for_ctl(emu, &gctl->id);
842                 memset(&knew, 0, sizeof(knew));
843                 knew.iface = gctl_id->iface;
844                 knew.name = gctl_id->name;
845                 knew.index = gctl_id->index;
846                 knew.device = gctl_id->device;
847                 knew.subdevice = gctl_id->subdevice;
848                 knew.info = snd_emu10k1_gpr_ctl_info;
849                 knew.tlv.p = copy_tlv((const unsigned int __user *)gctl->tlv, in_kernel);
850                 if (knew.tlv.p)
851                         knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
852                                 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
853                 knew.get = snd_emu10k1_gpr_ctl_get;
854                 knew.put = snd_emu10k1_gpr_ctl_put;
855                 memset(nctl, 0, sizeof(*nctl));
856                 nctl->vcount = gctl->vcount;
857                 nctl->count = gctl->count;
858                 for (j = 0; j < 32; j++) {
859                         nctl->gpr[j] = gctl->gpr[j];
860                         nctl->value[j] = ~gctl->value[j];       /* inverted, we want to write new value in gpr_ctl_put() */
861                         val->value.integer.value[j] = gctl->value[j];
862                 }
863                 nctl->min = gctl->min;
864                 nctl->max = gctl->max;
865                 nctl->translation = gctl->translation;
866                 if (ctl == NULL) {
867                         ctl = kmalloc(sizeof(*ctl), GFP_KERNEL);
868                         if (ctl == NULL) {
869                                 err = -ENOMEM;
870                                 kfree(knew.tlv.p);
871                                 goto __error;
872                         }
873                         knew.private_value = (unsigned long)ctl;
874                         *ctl = *nctl;
875                         kctl = snd_ctl_new1(&knew, emu);
876                         err = snd_ctl_add(emu->card, kctl);
877                         if (err < 0) {
878                                 kfree(ctl);
879                                 kfree(knew.tlv.p);
880                                 goto __error;
881                         }
882                         kctl->private_free = snd_emu10k1_ctl_private_free;
883                         ctl->kcontrol = kctl;
884                         list_add_tail(&ctl->list, &emu->fx8010.gpr_ctl);
885                 } else {
886                         /* overwrite */
887                         nctl->list = ctl->list;
888                         nctl->kcontrol = ctl->kcontrol;
889                         *ctl = *nctl;
890                         snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE |
891                                                   SNDRV_CTL_EVENT_MASK_INFO, &ctl->kcontrol->id);
892                 }
893                 snd_emu10k1_gpr_ctl_put(ctl->kcontrol, val);
894         }
895       __error:
896         kfree(nctl);
897         kfree(gctl);
898         kfree(val);
899         return err;
900 }
901
902 static int snd_emu10k1_del_controls(struct snd_emu10k1 *emu,
903                                     struct snd_emu10k1_fx8010_code *icode,
904                                     bool in_kernel)
905 {
906         unsigned int i;
907         struct emu10k1_ctl_elem_id id;
908         struct snd_emu10k1_fx8010_ctl *ctl;
909         struct snd_card *card = emu->card;
910         int err;
911         
912         for (i = 0; i < icode->gpr_del_control_count; i++) {
913                 err = copy_ctl_elem_id(icode->gpr_del_controls, i, &id,
914                                        in_kernel);
915                 if (err < 0)
916                         return err;
917                 down_write(&card->controls_rwsem);
918                 ctl = snd_emu10k1_look_for_ctl(emu, &id);
919                 if (ctl)
920                         snd_ctl_remove(card, ctl->kcontrol);
921                 up_write(&card->controls_rwsem);
922         }
923         return 0;
924 }
925
926 static int snd_emu10k1_list_controls(struct snd_emu10k1 *emu,
927                                      struct snd_emu10k1_fx8010_code *icode)
928 {
929         unsigned int i = 0, j;
930         unsigned int total = 0;
931         struct snd_emu10k1_fx8010_control_gpr *gctl;
932         struct snd_emu10k1_fx8010_ctl *ctl;
933         struct snd_ctl_elem_id *id;
934
935         gctl = kmalloc(sizeof(*gctl), GFP_KERNEL);
936         if (! gctl)
937                 return -ENOMEM;
938
939         list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) {
940                 total++;
941                 if (icode->gpr_list_controls &&
942                     i < icode->gpr_list_control_count) {
943                         memset(gctl, 0, sizeof(*gctl));
944                         id = &ctl->kcontrol->id;
945                         gctl->id.iface = (__force int)id->iface;
946                         strscpy(gctl->id.name, id->name, sizeof(gctl->id.name));
947                         gctl->id.index = id->index;
948                         gctl->id.device = id->device;
949                         gctl->id.subdevice = id->subdevice;
950                         gctl->vcount = ctl->vcount;
951                         gctl->count = ctl->count;
952                         for (j = 0; j < 32; j++) {
953                                 gctl->gpr[j] = ctl->gpr[j];
954                                 gctl->value[j] = ctl->value[j];
955                         }
956                         gctl->min = ctl->min;
957                         gctl->max = ctl->max;
958                         gctl->translation = ctl->translation;
959                         if (copy_gctl_to_user(emu, icode->gpr_list_controls,
960                                               gctl, i)) {
961                                 kfree(gctl);
962                                 return -EFAULT;
963                         }
964                         i++;
965                 }
966         }
967         icode->gpr_list_control_total = total;
968         kfree(gctl);
969         return 0;
970 }
971
972 static int snd_emu10k1_icode_poke(struct snd_emu10k1 *emu,
973                                   struct snd_emu10k1_fx8010_code *icode,
974                                   bool in_kernel)
975 {
976         int err = 0;
977
978         mutex_lock(&emu->fx8010.lock);
979         err = snd_emu10k1_verify_controls(emu, icode, in_kernel);
980         if (err < 0)
981                 goto __error;
982         strscpy(emu->fx8010.name, icode->name, sizeof(emu->fx8010.name));
983         /* stop FX processor - this may be dangerous, but it's better to miss
984            some samples than generate wrong ones - [jk] */
985         if (emu->audigy)
986                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP);
987         else
988                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP);
989         /* ok, do the main job */
990         err = snd_emu10k1_del_controls(emu, icode, in_kernel);
991         if (err < 0)
992                 goto __error;
993         err = snd_emu10k1_gpr_poke(emu, icode, in_kernel);
994         if (err < 0)
995                 goto __error;
996         err = snd_emu10k1_tram_poke(emu, icode, in_kernel);
997         if (err < 0)
998                 goto __error;
999         err = snd_emu10k1_code_poke(emu, icode, in_kernel);
1000         if (err < 0)
1001                 goto __error;
1002         err = snd_emu10k1_add_controls(emu, icode, in_kernel);
1003         if (err < 0)
1004                 goto __error;
1005         /* start FX processor when the DSP code is updated */
1006         if (emu->audigy)
1007                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
1008         else
1009                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
1010       __error:
1011         mutex_unlock(&emu->fx8010.lock);
1012         return err;
1013 }
1014
1015 static int snd_emu10k1_icode_peek(struct snd_emu10k1 *emu,
1016                                   struct snd_emu10k1_fx8010_code *icode)
1017 {
1018         int err;
1019
1020         mutex_lock(&emu->fx8010.lock);
1021         strscpy(icode->name, emu->fx8010.name, sizeof(icode->name));
1022         /* ok, do the main job */
1023         err = snd_emu10k1_gpr_peek(emu, icode);
1024         if (err >= 0)
1025                 err = snd_emu10k1_tram_peek(emu, icode);
1026         if (err >= 0)
1027                 err = snd_emu10k1_code_peek(emu, icode);
1028         if (err >= 0)
1029                 err = snd_emu10k1_list_controls(emu, icode);
1030         mutex_unlock(&emu->fx8010.lock);
1031         return err;
1032 }
1033
1034 static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu,
1035                                  struct snd_emu10k1_fx8010_pcm_rec *ipcm)
1036 {
1037         unsigned int i;
1038         int err = 0;
1039         struct snd_emu10k1_fx8010_pcm *pcm;
1040
1041         if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
1042                 return -EINVAL;
1043         ipcm->substream = array_index_nospec(ipcm->substream,
1044                                              EMU10K1_FX8010_PCM_COUNT);
1045         if (ipcm->channels > 32)
1046                 return -EINVAL;
1047         pcm = &emu->fx8010.pcm[ipcm->substream];
1048         mutex_lock(&emu->fx8010.lock);
1049         spin_lock_irq(&emu->reg_lock);
1050         if (pcm->opened) {
1051                 err = -EBUSY;
1052                 goto __error;
1053         }
1054         if (ipcm->channels == 0) {      /* remove */
1055                 pcm->valid = 0;
1056         } else {
1057                 /* FIXME: we need to add universal code to the PCM transfer routine */
1058                 if (ipcm->channels != 2) {
1059                         err = -EINVAL;
1060                         goto __error;
1061                 }
1062                 pcm->valid = 1;
1063                 pcm->opened = 0;
1064                 pcm->channels = ipcm->channels;
1065                 pcm->tram_start = ipcm->tram_start;
1066                 pcm->buffer_size = ipcm->buffer_size;
1067                 pcm->gpr_size = ipcm->gpr_size;
1068                 pcm->gpr_count = ipcm->gpr_count;
1069                 pcm->gpr_tmpcount = ipcm->gpr_tmpcount;
1070                 pcm->gpr_ptr = ipcm->gpr_ptr;
1071                 pcm->gpr_trigger = ipcm->gpr_trigger;
1072                 pcm->gpr_running = ipcm->gpr_running;
1073                 for (i = 0; i < pcm->channels; i++)
1074                         pcm->etram[i] = ipcm->etram[i];
1075         }
1076       __error:
1077         spin_unlock_irq(&emu->reg_lock);
1078         mutex_unlock(&emu->fx8010.lock);
1079         return err;
1080 }
1081
1082 static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu,
1083                                  struct snd_emu10k1_fx8010_pcm_rec *ipcm)
1084 {
1085         unsigned int i;
1086         int err = 0;
1087         struct snd_emu10k1_fx8010_pcm *pcm;
1088
1089         if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
1090                 return -EINVAL;
1091         ipcm->substream = array_index_nospec(ipcm->substream,
1092                                              EMU10K1_FX8010_PCM_COUNT);
1093         pcm = &emu->fx8010.pcm[ipcm->substream];
1094         mutex_lock(&emu->fx8010.lock);
1095         spin_lock_irq(&emu->reg_lock);
1096         ipcm->channels = pcm->channels;
1097         ipcm->tram_start = pcm->tram_start;
1098         ipcm->buffer_size = pcm->buffer_size;
1099         ipcm->gpr_size = pcm->gpr_size;
1100         ipcm->gpr_ptr = pcm->gpr_ptr;
1101         ipcm->gpr_count = pcm->gpr_count;
1102         ipcm->gpr_tmpcount = pcm->gpr_tmpcount;
1103         ipcm->gpr_trigger = pcm->gpr_trigger;
1104         ipcm->gpr_running = pcm->gpr_running;
1105         for (i = 0; i < pcm->channels; i++)
1106                 ipcm->etram[i] = pcm->etram[i];
1107         ipcm->res1 = ipcm->res2 = 0;
1108         ipcm->pad = 0;
1109         spin_unlock_irq(&emu->reg_lock);
1110         mutex_unlock(&emu->fx8010.lock);
1111         return err;
1112 }
1113
1114 #define SND_EMU10K1_GPR_CONTROLS        44
1115 #define SND_EMU10K1_INPUTS              12
1116 #define SND_EMU10K1_PLAYBACK_CHANNELS   8
1117 #define SND_EMU10K1_CAPTURE_CHANNELS    4
1118
1119 static void
1120 snd_emu10k1_init_mono_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1121                               const char *name, int gpr, int defval)
1122 {
1123         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1124         strcpy(ctl->id.name, name);
1125         ctl->vcount = ctl->count = 1;
1126         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1127         if (high_res_gpr_volume) {
1128                 ctl->min = 0;
1129                 ctl->max = 0x7fffffff;
1130                 ctl->tlv = snd_emu10k1_db_linear;
1131                 ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
1132         } else {
1133                 ctl->min = 0;
1134                 ctl->max = 100;
1135                 ctl->tlv = snd_emu10k1_db_scale1;
1136                 ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
1137         }
1138 }
1139
1140 static void
1141 snd_emu10k1_init_stereo_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1142                                 const char *name, int gpr, int defval)
1143 {
1144         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1145         strcpy(ctl->id.name, name);
1146         ctl->vcount = ctl->count = 2;
1147         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1148         ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;
1149         if (high_res_gpr_volume) {
1150                 ctl->min = 0;
1151                 ctl->max = 0x7fffffff;
1152                 ctl->tlv = snd_emu10k1_db_linear;
1153                 ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
1154         } else {
1155                 ctl->min = 0;
1156                 ctl->max = 100;
1157                 ctl->tlv = snd_emu10k1_db_scale1;
1158                 ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
1159         }
1160 }
1161
1162 static void
1163 snd_emu10k1_init_mono_onoff_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1164                                     const char *name, int gpr, int defval)
1165 {
1166         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1167         strcpy(ctl->id.name, name);
1168         ctl->vcount = ctl->count = 1;
1169         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1170         ctl->min = 0;
1171         ctl->max = 1;
1172         ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
1173 }
1174
1175 static void
1176 snd_emu10k1_init_stereo_onoff_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1177                                       const char *name, int gpr, int defval)
1178 {
1179         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1180         strcpy(ctl->id.name, name);
1181         ctl->vcount = ctl->count = 2;
1182         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1183         ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;
1184         ctl->min = 0;
1185         ctl->max = 1;
1186         ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
1187 }
1188
1189 /*
1190  * Used for emu1010 - conversion from 32-bit capture inputs from HANA
1191  * to 2 x 16-bit registers in audigy - their values are read via DMA.
1192  * Conversion is performed by Audigy DSP instructions of FX8010.
1193  */
1194 static int snd_emu10k1_audigy_dsp_convert_32_to_2x16(
1195                                 struct snd_emu10k1_fx8010_code *icode,
1196                                 u32 *ptr, int tmp, int bit_shifter16,
1197                                 int reg_in, int reg_out)
1198 {
1199         A_OP(icode, ptr, iACC3, A_GPR(tmp + 1), reg_in, A_C_00000000, A_C_00000000);
1200         A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp + 1), A_GPR(bit_shifter16 - 1), A_C_00000000);
1201         A_OP(icode, ptr, iTSTNEG, A_GPR(tmp + 2), A_GPR(tmp), A_C_80000000, A_GPR(bit_shifter16 - 2));
1202         A_OP(icode, ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_C_80000000, A_C_00000000);
1203         A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp), A_GPR(bit_shifter16 - 3), A_C_00000000);
1204         A_OP(icode, ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A_GPR(tmp), A_C_00010000);
1205         A_OP(icode, ptr, iANDXOR, reg_out, A_GPR(tmp), A_C_ffffffff, A_GPR(tmp + 2));
1206         A_OP(icode, ptr, iACC3, reg_out + 1, A_GPR(tmp + 1), A_C_00000000, A_C_00000000);
1207         return 1;
1208 }
1209
1210 /*
1211  * initial DSP configuration for Audigy
1212  */
1213
1214 static int _snd_emu10k1_audigy_init_efx(struct snd_emu10k1 *emu)
1215 {
1216         int err, i, z, gpr, nctl;
1217         int bit_shifter16;
1218         const int playback = 10;
1219         const int capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2); /* we reserve 10 voices */
1220         const int stereo_mix = capture + 2;
1221         const int tmp = 0x88;
1222         u32 ptr;
1223         struct snd_emu10k1_fx8010_code *icode = NULL;
1224         struct snd_emu10k1_fx8010_control_gpr *controls = NULL, *ctl;
1225         u32 *gpr_map;
1226
1227         err = -ENOMEM;
1228         icode = kzalloc(sizeof(*icode), GFP_KERNEL);
1229         if (!icode)
1230                 return err;
1231
1232         icode->gpr_map = kcalloc(512 + 256 + 256 + 2 * 1024,
1233                                  sizeof(u_int32_t), GFP_KERNEL);
1234         if (!icode->gpr_map)
1235                 goto __err_gpr;
1236         controls = kcalloc(SND_EMU10K1_GPR_CONTROLS,
1237                            sizeof(*controls), GFP_KERNEL);
1238         if (!controls)
1239                 goto __err_ctrls;
1240
1241         gpr_map = icode->gpr_map;
1242
1243         icode->tram_data_map = icode->gpr_map + 512;
1244         icode->tram_addr_map = icode->tram_data_map + 256;
1245         icode->code = icode->tram_addr_map + 256;
1246
1247         /* clear free GPRs */
1248         for (i = 0; i < 512; i++)
1249                 set_bit(i, icode->gpr_valid);
1250                 
1251         /* clear TRAM data & address lines */
1252         for (i = 0; i < 256; i++)
1253                 set_bit(i, icode->tram_valid);
1254
1255         strcpy(icode->name, "Audigy DSP code for ALSA");
1256         ptr = 0;
1257         nctl = 0;
1258         gpr = stereo_mix + 10;
1259         gpr_map[gpr++] = 0x00007fff;
1260         gpr_map[gpr++] = 0x00008000;
1261         gpr_map[gpr++] = 0x0000ffff;
1262         bit_shifter16 = gpr;
1263
1264         /* stop FX processor */
1265         snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP);
1266
1267 #if 1
1268         /* PCM front Playback Volume (independent from stereo mix)
1269          * playback = 0 + ( gpr * FXBUS_PCM_LEFT_FRONT >> 31)
1270          * where gpr contains attenuation from corresponding mixer control
1271          * (snd_emu10k1_init_stereo_control)
1272          */
1273         A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_FRONT));
1274         A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_FRONT));
1275         snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Front Playback Volume", gpr, 100);
1276         gpr += 2;
1277
1278         /* PCM Surround Playback (independent from stereo mix) */
1279         A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_REAR));
1280         A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_REAR));
1281         snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Surround Playback Volume", gpr, 100);
1282         gpr += 2;
1283         
1284         /* PCM Side Playback (independent from stereo mix) */
1285         if (emu->card_capabilities->spk71) {
1286                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+6), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_SIDE));
1287                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+7), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_SIDE));
1288                 snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Side Playback Volume", gpr, 100);
1289                 gpr += 2;
1290         }
1291
1292         /* PCM Center Playback (independent from stereo mix) */
1293         A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_CENTER));
1294         snd_emu10k1_init_mono_control(&controls[nctl++], "PCM Center Playback Volume", gpr, 100);
1295         gpr++;
1296
1297         /* PCM LFE Playback (independent from stereo mix) */
1298         A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LFE));
1299         snd_emu10k1_init_mono_control(&controls[nctl++], "PCM LFE Playback Volume", gpr, 100);
1300         gpr++;
1301         
1302         /*
1303          * Stereo Mix
1304          */
1305         /* Wave (PCM) Playback Volume (will be renamed later) */
1306         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
1307         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
1308         snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, 100);
1309         gpr += 2;
1310
1311         /* Synth Playback */
1312         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+0), A_GPR(stereo_mix+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));
1313         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+1), A_GPR(stereo_mix+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));
1314         snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Playback Volume", gpr, 100);
1315         gpr += 2;
1316
1317         /* Wave (PCM) Capture */
1318         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
1319         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
1320         snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Capture Volume", gpr, 0);
1321         gpr += 2;
1322
1323         /* Synth Capture */
1324         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));
1325         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));
1326         snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Capture Volume", gpr, 0);
1327         gpr += 2;
1328       
1329         /*
1330          * inputs
1331          */
1332 #define A_ADD_VOLUME_IN(var,vol,input) \
1333 A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
1334
1335         /* emu1212 DSP 0 and DSP 1 Capture */
1336         if (emu->card_capabilities->emu_model) {
1337                 if (emu->card_capabilities->ca0108_chip) {
1338                         /* Note:JCD:No longer bit shift lower 16bits to upper 16bits of 32bit value. */
1339                         A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x0), A_C_00000001);
1340                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_GPR(tmp));
1341                         A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x1), A_C_00000001);
1342                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr), A_GPR(tmp));
1343                 } else {
1344                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_P16VIN(0x0));
1345                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_P16VIN(0x1));
1346                 }
1347                 snd_emu10k1_init_stereo_control(&controls[nctl++], "EMU Capture Volume", gpr, 0);
1348                 gpr += 2;
1349         }
1350         /* AC'97 Playback Volume - used only for mic (renamed later) */
1351         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AC97_L);
1352         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AC97_R);
1353         snd_emu10k1_init_stereo_control(&controls[nctl++], "AMic Playback Volume", gpr, 0);
1354         gpr += 2;
1355         /* AC'97 Capture Volume - used only for mic */
1356         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AC97_L);
1357         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AC97_R);
1358         snd_emu10k1_init_stereo_control(&controls[nctl++], "Mic Capture Volume", gpr, 0);
1359         gpr += 2;
1360
1361         /* mic capture buffer */        
1362         A_OP(icode, &ptr, iINTERP, A_EXTOUT(A_EXTOUT_MIC_CAP), A_EXTIN(A_EXTIN_AC97_L), 0xcd, A_EXTIN(A_EXTIN_AC97_R));
1363
1364         /* Audigy CD Playback Volume */
1365         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_SPDIF_CD_L);
1366         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_SPDIF_CD_R);
1367         snd_emu10k1_init_stereo_control(&controls[nctl++],
1368                                         emu->card_capabilities->ac97_chip ? "Audigy CD Playback Volume" : "CD Playback Volume",
1369                                         gpr, 0);
1370         gpr += 2;
1371         /* Audigy CD Capture Volume */
1372         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_SPDIF_CD_L);
1373         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_SPDIF_CD_R);
1374         snd_emu10k1_init_stereo_control(&controls[nctl++],
1375                                         emu->card_capabilities->ac97_chip ? "Audigy CD Capture Volume" : "CD Capture Volume",
1376                                         gpr, 0);
1377         gpr += 2;
1378
1379         /* Optical SPDIF Playback Volume */
1380         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_OPT_SPDIF_L);
1381         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_OPT_SPDIF_R);
1382         snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",PLAYBACK,VOLUME), gpr, 0);
1383         gpr += 2;
1384         /* Optical SPDIF Capture Volume */
1385         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_OPT_SPDIF_L);
1386         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_OPT_SPDIF_R);
1387         snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",CAPTURE,VOLUME), gpr, 0);
1388         gpr += 2;
1389
1390         /* Line2 Playback Volume */
1391         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_LINE2_L);
1392         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_LINE2_R);
1393         snd_emu10k1_init_stereo_control(&controls[nctl++],
1394                                         emu->card_capabilities->ac97_chip ? "Line2 Playback Volume" : "Line Playback Volume",
1395                                         gpr, 0);
1396         gpr += 2;
1397         /* Line2 Capture Volume */
1398         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_LINE2_L);
1399         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_LINE2_R);
1400         snd_emu10k1_init_stereo_control(&controls[nctl++],
1401                                         emu->card_capabilities->ac97_chip ? "Line2 Capture Volume" : "Line Capture Volume",
1402                                         gpr, 0);
1403         gpr += 2;
1404         
1405         /* Philips ADC Playback Volume */
1406         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_ADC_L);
1407         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_ADC_R);
1408         snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Playback Volume", gpr, 0);
1409         gpr += 2;
1410         /* Philips ADC Capture Volume */
1411         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_ADC_L);
1412         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_ADC_R);
1413         snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Capture Volume", gpr, 0);
1414         gpr += 2;
1415
1416         /* Aux2 Playback Volume */
1417         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AUX2_L);
1418         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AUX2_R);
1419         snd_emu10k1_init_stereo_control(&controls[nctl++],
1420                                         emu->card_capabilities->ac97_chip ? "Aux2 Playback Volume" : "Aux Playback Volume",
1421                                         gpr, 0);
1422         gpr += 2;
1423         /* Aux2 Capture Volume */
1424         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AUX2_L);
1425         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AUX2_R);
1426         snd_emu10k1_init_stereo_control(&controls[nctl++],
1427                                         emu->card_capabilities->ac97_chip ? "Aux2 Capture Volume" : "Aux Capture Volume",
1428                                         gpr, 0);
1429         gpr += 2;
1430         
1431         /* Stereo Mix Front Playback Volume */
1432         A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_GPR(playback), A_GPR(gpr), A_GPR(stereo_mix));
1433         A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_GPR(playback+1), A_GPR(gpr+1), A_GPR(stereo_mix+1));
1434         snd_emu10k1_init_stereo_control(&controls[nctl++], "Front Playback Volume", gpr, 100);
1435         gpr += 2;
1436         
1437         /* Stereo Mix Surround Playback */
1438         A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_GPR(playback+2), A_GPR(gpr), A_GPR(stereo_mix));
1439         A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_GPR(playback+3), A_GPR(gpr+1), A_GPR(stereo_mix+1));
1440         snd_emu10k1_init_stereo_control(&controls[nctl++], "Surround Playback Volume", gpr, 0);
1441         gpr += 2;
1442
1443         /* Stereo Mix Center Playback */
1444         /* Center = sub = Left/2 + Right/2 */
1445         A_OP(icode, &ptr, iINTERP, A_GPR(tmp), A_GPR(stereo_mix), 0xcd, A_GPR(stereo_mix+1));
1446         A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_GPR(playback+4), A_GPR(gpr), A_GPR(tmp));
1447         snd_emu10k1_init_mono_control(&controls[nctl++], "Center Playback Volume", gpr, 0);
1448         gpr++;
1449
1450         /* Stereo Mix LFE Playback */
1451         A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_GPR(playback+5), A_GPR(gpr), A_GPR(tmp));
1452         snd_emu10k1_init_mono_control(&controls[nctl++], "LFE Playback Volume", gpr, 0);
1453         gpr++;
1454         
1455         if (emu->card_capabilities->spk71) {
1456                 /* Stereo Mix Side Playback */
1457                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+6), A_GPR(playback+6), A_GPR(gpr), A_GPR(stereo_mix));
1458                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+7), A_GPR(playback+7), A_GPR(gpr+1), A_GPR(stereo_mix+1));
1459                 snd_emu10k1_init_stereo_control(&controls[nctl++], "Side Playback Volume", gpr, 0);
1460                 gpr += 2;
1461         }
1462
1463         /*
1464          * outputs
1465          */
1466 #define A_PUT_OUTPUT(out,src) A_OP(icode, &ptr, iACC3, A_EXTOUT(out), A_C_00000000, A_C_00000000, A_GPR(src))
1467 #define A_PUT_STEREO_OUTPUT(out1,out2,src) \
1468         {A_PUT_OUTPUT(out1,src); A_PUT_OUTPUT(out2,src+1);}
1469
1470 #define _A_SWITCH(icode, ptr, dst, src, sw) \
1471         A_OP((icode), ptr, iMACINT0, dst, A_C_00000000, src, sw);
1472 #define A_SWITCH(icode, ptr, dst, src, sw) \
1473                 _A_SWITCH(icode, ptr, A_GPR(dst), A_GPR(src), A_GPR(sw))
1474 #define _A_SWITCH_NEG(icode, ptr, dst, src) \
1475         A_OP((icode), ptr, iANDXOR, dst, src, A_C_00000001, A_C_00000001);
1476 #define A_SWITCH_NEG(icode, ptr, dst, src) \
1477                 _A_SWITCH_NEG(icode, ptr, A_GPR(dst), A_GPR(src))
1478
1479
1480         /*
1481          *  Process tone control
1482          */
1483         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), A_GPR(playback + 0), A_C_00000000, A_C_00000000); /* left */
1484         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), A_GPR(playback + 1), A_C_00000000, A_C_00000000); /* right */
1485         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2), A_GPR(playback + 2), A_C_00000000, A_C_00000000); /* rear left */
1486         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 3), A_GPR(playback + 3), A_C_00000000, A_C_00000000); /* rear right */
1487         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), A_GPR(playback + 4), A_C_00000000, A_C_00000000); /* center */
1488         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), A_GPR(playback + 5), A_C_00000000, A_C_00000000); /* LFE */
1489         if (emu->card_capabilities->spk71) {
1490                 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 6), A_GPR(playback + 6), A_C_00000000, A_C_00000000); /* side left */
1491                 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 7), A_GPR(playback + 7), A_C_00000000, A_C_00000000); /* side right */
1492         }
1493         
1494
1495         ctl = &controls[nctl + 0];
1496         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1497         strcpy(ctl->id.name, "Tone Control - Bass");
1498         ctl->vcount = 2;
1499         ctl->count = 10;
1500         ctl->min = 0;
1501         ctl->max = 40;
1502         ctl->value[0] = ctl->value[1] = 20;
1503         ctl->translation = EMU10K1_GPR_TRANSLATION_BASS;
1504         ctl = &controls[nctl + 1];
1505         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
1506         strcpy(ctl->id.name, "Tone Control - Treble");
1507         ctl->vcount = 2;
1508         ctl->count = 10;
1509         ctl->min = 0;
1510         ctl->max = 40;
1511         ctl->value[0] = ctl->value[1] = 20;
1512         ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE;
1513
1514 #define BASS_GPR        0x8c
1515 #define TREBLE_GPR      0x96
1516
1517         for (z = 0; z < 5; z++) {
1518                 int j;
1519                 for (j = 0; j < 2; j++) {
1520                         controls[nctl + 0].gpr[z * 2 + j] = BASS_GPR + z * 2 + j;
1521                         controls[nctl + 1].gpr[z * 2 + j] = TREBLE_GPR + z * 2 + j;
1522                 }
1523         }
1524         for (z = 0; z < 4; z++) {               /* front/rear/center-lfe/side */
1525                 int j, k, l, d;
1526                 for (j = 0; j < 2; j++) {       /* left/right */
1527                         k = 0xb0 + (z * 8) + (j * 4);
1528                         l = 0xe0 + (z * 8) + (j * 4);
1529                         d = playback + SND_EMU10K1_PLAYBACK_CHANNELS + z * 2 + j;
1530
1531                         A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(d), A_GPR(BASS_GPR + 0 + j));
1532                         A_OP(icode, &ptr, iMACMV, A_GPR(k+1), A_GPR(k), A_GPR(k+1), A_GPR(BASS_GPR + 4 + j));
1533                         A_OP(icode, &ptr, iMACMV, A_GPR(k), A_GPR(d), A_GPR(k), A_GPR(BASS_GPR + 2 + j));
1534                         A_OP(icode, &ptr, iMACMV, A_GPR(k+3), A_GPR(k+2), A_GPR(k+3), A_GPR(BASS_GPR + 8 + j));
1535                         A_OP(icode, &ptr, iMAC0, A_GPR(k+2), A_GPR_ACCU, A_GPR(k+2), A_GPR(BASS_GPR + 6 + j));
1536                         A_OP(icode, &ptr, iACC3, A_GPR(k+2), A_GPR(k+2), A_GPR(k+2), A_C_00000000);
1537
1538                         A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(k+2), A_GPR(TREBLE_GPR + 0 + j));
1539                         A_OP(icode, &ptr, iMACMV, A_GPR(l+1), A_GPR(l), A_GPR(l+1), A_GPR(TREBLE_GPR + 4 + j));
1540                         A_OP(icode, &ptr, iMACMV, A_GPR(l), A_GPR(k+2), A_GPR(l), A_GPR(TREBLE_GPR + 2 + j));
1541                         A_OP(icode, &ptr, iMACMV, A_GPR(l+3), A_GPR(l+2), A_GPR(l+3), A_GPR(TREBLE_GPR + 8 + j));
1542                         A_OP(icode, &ptr, iMAC0, A_GPR(l+2), A_GPR_ACCU, A_GPR(l+2), A_GPR(TREBLE_GPR + 6 + j));
1543                         A_OP(icode, &ptr, iMACINT0, A_GPR(l+2), A_C_00000000, A_GPR(l+2), A_C_00000010);
1544
1545                         A_OP(icode, &ptr, iACC3, A_GPR(d), A_GPR(l+2), A_C_00000000, A_C_00000000);
1546
1547                         if (z == 2)     /* center */
1548                                 break;
1549                 }
1550         }
1551         nctl += 2;
1552
1553 #undef BASS_GPR
1554 #undef TREBLE_GPR
1555
1556         for (z = 0; z < 8; z++) {
1557                 A_SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, gpr + 0);
1558                 A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 0);
1559                 A_SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1);
1560                 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
1561         }
1562         snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "Tone Control - Switch", gpr, 0);
1563         gpr += 2;
1564
1565         /* Master volume (will be renamed later) */
1566         A_OP(icode, &ptr, iMAC0, A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+0+SND_EMU10K1_PLAYBACK_CHANNELS));
1567         A_OP(icode, &ptr, iMAC0, A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+1+SND_EMU10K1_PLAYBACK_CHANNELS));
1568         A_OP(icode, &ptr, iMAC0, A_GPR(playback+2+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+2+SND_EMU10K1_PLAYBACK_CHANNELS));
1569         A_OP(icode, &ptr, iMAC0, A_GPR(playback+3+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+3+SND_EMU10K1_PLAYBACK_CHANNELS));
1570         A_OP(icode, &ptr, iMAC0, A_GPR(playback+4+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+4+SND_EMU10K1_PLAYBACK_CHANNELS));
1571         A_OP(icode, &ptr, iMAC0, A_GPR(playback+5+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+5+SND_EMU10K1_PLAYBACK_CHANNELS));
1572         A_OP(icode, &ptr, iMAC0, A_GPR(playback+6+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+6+SND_EMU10K1_PLAYBACK_CHANNELS));
1573         A_OP(icode, &ptr, iMAC0, A_GPR(playback+7+SND_EMU10K1_PLAYBACK_CHANNELS), A_C_00000000, A_GPR(gpr), A_GPR(playback+7+SND_EMU10K1_PLAYBACK_CHANNELS));
1574         snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0);
1575         gpr += 2;
1576
1577         /* analog speakers */
1578         A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
1579         A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
1580         A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
1581         A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
1582         if (emu->card_capabilities->spk71)
1583                 A_PUT_STEREO_OUTPUT(A_EXTOUT_ASIDE_L, A_EXTOUT_ASIDE_R, playback+6 + SND_EMU10K1_PLAYBACK_CHANNELS);
1584
1585         /* headphone */
1586         A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
1587
1588         /* digital outputs */
1589         /* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */
1590         if (emu->card_capabilities->emu_model) {
1591                 /* EMU1010 Outputs from PCM Front, Rear, Center, LFE, Side */
1592                 dev_info(emu->card->dev, "EMU outputs on\n");
1593                 for (z = 0; z < 8; z++) {
1594                         if (emu->card_capabilities->ca0108_chip) {
1595                                 A_OP(icode, &ptr, iACC3, A3_EMU32OUT(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_C_00000000, A_C_00000000);
1596                         } else {
1597                                 A_OP(icode, &ptr, iACC3, A_EMU32OUTL(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_C_00000000, A_C_00000000);
1598                         }
1599                 }
1600         }
1601
1602         /* IEC958 Optical Raw Playback Switch */ 
1603         gpr_map[gpr++] = 0;
1604         gpr_map[gpr++] = 0x1008;
1605         gpr_map[gpr++] = 0xffff0000;
1606         for (z = 0; z < 2; z++) {
1607                 A_OP(icode, &ptr, iMAC0, A_GPR(tmp + 2), A_FXBUS(FXBUS_PT_LEFT + z), A_C_00000000, A_C_00000000);
1608                 A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_GPR(gpr - 2), A_C_00000001);
1609                 A_OP(icode, &ptr, iACC3, A_GPR(tmp + 2), A_C_00000000, A_C_00010000, A_GPR(tmp + 2));
1610                 A_OP(icode, &ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_GPR(gpr - 1), A_C_00000000);
1611                 A_SWITCH(icode, &ptr, tmp + 0, tmp + 2, gpr + z);
1612                 A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z);
1613                 A_SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);
1614                 if ((z==1) && (emu->card_capabilities->spdif_bug)) {
1615                         /* Due to a SPDIF output bug on some Audigy cards, this code delays the Right channel by 1 sample */
1616                         dev_info(emu->card->dev,
1617                                  "Installing spdif_bug patch: %s\n",
1618                                  emu->card_capabilities->name);
1619                         A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(gpr - 3), A_C_00000000, A_C_00000000);
1620                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 3), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
1621                 } else {
1622                         A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
1623                 }
1624         }
1625         snd_emu10k1_init_stereo_onoff_control(controls + nctl++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0);
1626         gpr += 2;
1627         
1628         A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
1629         A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
1630         A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
1631
1632         /* ADC buffer */
1633 #ifdef EMU10K1_CAPTURE_DIGITAL_OUT
1634         A_PUT_STEREO_OUTPUT(A_EXTOUT_ADC_CAP_L, A_EXTOUT_ADC_CAP_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
1635 #else
1636         A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_L, capture);
1637         A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_R, capture+1);
1638 #endif
1639
1640         if (emu->card_capabilities->emu_model) {
1641                 if (emu->card_capabilities->ca0108_chip) {
1642                         dev_info(emu->card->dev, "EMU2 inputs on\n");
1643                         for (z = 0; z < 0x10; z++) {
1644                                 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, 
1645                                                                         bit_shifter16,
1646                                                                         A3_EMU32IN(z),
1647                                                                         A_FXBUS2(z*2) );
1648                         }
1649                 } else {
1650                         dev_info(emu->card->dev, "EMU inputs on\n");
1651                         /* Capture 16 (originally 8) channels of S32_LE sound */
1652
1653                         /*
1654                         dev_dbg(emu->card->dev, "emufx.c: gpr=0x%x, tmp=0x%x\n",
1655                                gpr, tmp);
1656                         */
1657                         /* For the EMU1010: How to get 32bit values from the DSP. High 16bits into L, low 16bits into R. */
1658                         /* A_P16VIN(0) is delayed by one sample,
1659                          * so all other A_P16VIN channels will need to also be delayed
1660                          */
1661                         /* Left ADC in. 1 of 2 */
1662                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_P16VIN(0x0), A_FXBUS2(0) );
1663                         /* Right ADC in 1 of 2 */
1664                         gpr_map[gpr++] = 0x00000000;
1665                         /* Delaying by one sample: instead of copying the input
1666                          * value A_P16VIN to output A_FXBUS2 as in the first channel,
1667                          * we use an auxiliary register, delaying the value by one
1668                          * sample
1669                          */
1670                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(2) );
1671                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x1), A_C_00000000, A_C_00000000);
1672                         gpr_map[gpr++] = 0x00000000;
1673                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(4) );
1674                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x2), A_C_00000000, A_C_00000000);
1675                         gpr_map[gpr++] = 0x00000000;
1676                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(6) );
1677                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x3), A_C_00000000, A_C_00000000);
1678                         /* For 96kHz mode */
1679                         /* Left ADC in. 2 of 2 */
1680                         gpr_map[gpr++] = 0x00000000;
1681                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0x8) );
1682                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x4), A_C_00000000, A_C_00000000);
1683                         /* Right ADC in 2 of 2 */
1684                         gpr_map[gpr++] = 0x00000000;
1685                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xa) );
1686                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x5), A_C_00000000, A_C_00000000);
1687                         gpr_map[gpr++] = 0x00000000;
1688                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xc) );
1689                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x6), A_C_00000000, A_C_00000000);
1690                         gpr_map[gpr++] = 0x00000000;
1691                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xe) );
1692                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x7), A_C_00000000, A_C_00000000);
1693                         /* Pavel Hofman - we still have voices, A_FXBUS2s, and
1694                          * A_P16VINs available -
1695                          * let's add 8 more capture channels - total of 16
1696                          */
1697                         gpr_map[gpr++] = 0x00000000;
1698                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1699                                                                   bit_shifter16,
1700                                                                   A_GPR(gpr - 1),
1701                                                                   A_FXBUS2(0x10));
1702                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x8),
1703                              A_C_00000000, A_C_00000000);
1704                         gpr_map[gpr++] = 0x00000000;
1705                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1706                                                                   bit_shifter16,
1707                                                                   A_GPR(gpr - 1),
1708                                                                   A_FXBUS2(0x12));
1709                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x9),
1710                              A_C_00000000, A_C_00000000);
1711                         gpr_map[gpr++] = 0x00000000;
1712                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1713                                                                   bit_shifter16,
1714                                                                   A_GPR(gpr - 1),
1715                                                                   A_FXBUS2(0x14));
1716                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xa),
1717                              A_C_00000000, A_C_00000000);
1718                         gpr_map[gpr++] = 0x00000000;
1719                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1720                                                                   bit_shifter16,
1721                                                                   A_GPR(gpr - 1),
1722                                                                   A_FXBUS2(0x16));
1723                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xb),
1724                              A_C_00000000, A_C_00000000);
1725                         gpr_map[gpr++] = 0x00000000;
1726                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1727                                                                   bit_shifter16,
1728                                                                   A_GPR(gpr - 1),
1729                                                                   A_FXBUS2(0x18));
1730                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xc),
1731                              A_C_00000000, A_C_00000000);
1732                         gpr_map[gpr++] = 0x00000000;
1733                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1734                                                                   bit_shifter16,
1735                                                                   A_GPR(gpr - 1),
1736                                                                   A_FXBUS2(0x1a));
1737                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xd),
1738                              A_C_00000000, A_C_00000000);
1739                         gpr_map[gpr++] = 0x00000000;
1740                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1741                                                                   bit_shifter16,
1742                                                                   A_GPR(gpr - 1),
1743                                                                   A_FXBUS2(0x1c));
1744                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xe),
1745                              A_C_00000000, A_C_00000000);
1746                         gpr_map[gpr++] = 0x00000000;
1747                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1748                                                                   bit_shifter16,
1749                                                                   A_GPR(gpr - 1),
1750                                                                   A_FXBUS2(0x1e));
1751                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xf),
1752                              A_C_00000000, A_C_00000000);
1753                 }
1754
1755 #if 0
1756                 for (z = 4; z < 8; z++) {
1757                         A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_C_00000000);
1758                 }
1759                 for (z = 0xc; z < 0x10; z++) {
1760                         A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_C_00000000);
1761                 }
1762 #endif
1763         } else {
1764                 /* EFX capture - capture the 16 EXTINs */
1765                 /* Capture 16 channels of S16_LE sound */
1766                 for (z = 0; z < 16; z++) {
1767                         A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_EXTIN(z));
1768                 }
1769         }
1770         
1771 #endif /* JCD test */
1772         /*
1773          * ok, set up done..
1774          */
1775
1776         if (gpr > tmp) {
1777                 snd_BUG();
1778                 err = -EIO;
1779                 goto __err;
1780         }
1781         /* clear remaining instruction memory */
1782         while (ptr < 0x400)
1783                 A_OP(icode, &ptr, 0x0f, 0xc0, 0xc0, 0xcf, 0xc0);
1784
1785         icode->gpr_add_control_count = nctl;
1786         icode->gpr_add_controls = controls;
1787         emu->support_tlv = 1; /* support TLV */
1788         err = snd_emu10k1_icode_poke(emu, icode, true);
1789         emu->support_tlv = 0; /* clear again */
1790
1791 __err:
1792         kfree(controls);
1793 __err_ctrls:
1794         kfree(icode->gpr_map);
1795 __err_gpr:
1796         kfree(icode);
1797         return err;
1798 }
1799
1800
1801 /*
1802  * initial DSP configuration for Emu10k1
1803  */
1804
1805 /* when volume = max, then copy only to avoid volume modification */
1806 /* with iMAC0 (negative values) */
1807 static void _volume(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol)
1808 {
1809         OP(icode, ptr, iMAC0, dst, C_00000000, src, vol);
1810         OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);
1811         OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000001);
1812         OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);
1813 }
1814 static void _volume_add(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol)
1815 {
1816         OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);
1817         OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1818         OP(icode, ptr, iMACINT0, dst, dst, src, C_00000001);
1819         OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);
1820         OP(icode, ptr, iMAC0, dst, dst, src, vol);
1821 }
1822 static void _volume_out(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol)
1823 {
1824         OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);
1825         OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1826         OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);
1827         OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);
1828         OP(icode, ptr, iMAC0, dst, C_00000000, src, vol);
1829 }
1830
1831 #define VOLUME(icode, ptr, dst, src, vol) \
1832                 _volume(icode, ptr, GPR(dst), GPR(src), GPR(vol))
1833 #define VOLUME_IN(icode, ptr, dst, src, vol) \
1834                 _volume(icode, ptr, GPR(dst), EXTIN(src), GPR(vol))
1835 #define VOLUME_ADD(icode, ptr, dst, src, vol) \
1836                 _volume_add(icode, ptr, GPR(dst), GPR(src), GPR(vol))
1837 #define VOLUME_ADDIN(icode, ptr, dst, src, vol) \
1838                 _volume_add(icode, ptr, GPR(dst), EXTIN(src), GPR(vol))
1839 #define VOLUME_OUT(icode, ptr, dst, src, vol) \
1840                 _volume_out(icode, ptr, EXTOUT(dst), GPR(src), GPR(vol))
1841 #define _SWITCH(icode, ptr, dst, src, sw) \
1842         OP((icode), ptr, iMACINT0, dst, C_00000000, src, sw);
1843 #define SWITCH(icode, ptr, dst, src, sw) \
1844                 _SWITCH(icode, ptr, GPR(dst), GPR(src), GPR(sw))
1845 #define SWITCH_IN(icode, ptr, dst, src, sw) \
1846                 _SWITCH(icode, ptr, GPR(dst), EXTIN(src), GPR(sw))
1847 #define _SWITCH_NEG(icode, ptr, dst, src) \
1848         OP((icode), ptr, iANDXOR, dst, src, C_00000001, C_00000001);
1849 #define SWITCH_NEG(icode, ptr, dst, src) \
1850                 _SWITCH_NEG(icode, ptr, GPR(dst), GPR(src))
1851
1852
1853 static int _snd_emu10k1_init_efx(struct snd_emu10k1 *emu)
1854 {
1855         int err, i, z, gpr, tmp, playback, capture;
1856         u32 ptr;
1857         struct snd_emu10k1_fx8010_code *icode;
1858         struct snd_emu10k1_fx8010_pcm_rec *ipcm = NULL;
1859         struct snd_emu10k1_fx8010_control_gpr *controls = NULL, *ctl;
1860         u32 *gpr_map;
1861
1862         err = -ENOMEM;
1863         icode = kzalloc(sizeof(*icode), GFP_KERNEL);
1864         if (!icode)
1865                 return err;
1866
1867         icode->gpr_map = kcalloc(256 + 160 + 160 + 2 * 512,
1868                                  sizeof(u_int32_t), GFP_KERNEL);
1869         if (!icode->gpr_map)
1870                 goto __err_gpr;
1871
1872         controls = kcalloc(SND_EMU10K1_GPR_CONTROLS,
1873                            sizeof(struct snd_emu10k1_fx8010_control_gpr),
1874                            GFP_KERNEL);
1875         if (!controls)
1876                 goto __err_ctrls;
1877
1878         ipcm = kzalloc(sizeof(*ipcm), GFP_KERNEL);
1879         if (!ipcm)
1880                 goto __err_ipcm;
1881
1882         gpr_map = icode->gpr_map;
1883
1884         icode->tram_data_map = icode->gpr_map + 256;
1885         icode->tram_addr_map = icode->tram_data_map + 160;
1886         icode->code = icode->tram_addr_map + 160;
1887         
1888         /* clear free GPRs */
1889         for (i = 0; i < 256; i++)
1890                 set_bit(i, icode->gpr_valid);
1891
1892         /* clear TRAM data & address lines */
1893         for (i = 0; i < 160; i++)
1894                 set_bit(i, icode->tram_valid);
1895
1896         strcpy(icode->name, "SB Live! FX8010 code for ALSA v1.2 by Jaroslav Kysela");
1897         ptr = 0; i = 0;
1898         /* we have 12 inputs */
1899         playback = SND_EMU10K1_INPUTS;
1900         /* we have 6 playback channels and tone control doubles */
1901         capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2);
1902         gpr = capture + SND_EMU10K1_CAPTURE_CHANNELS;
1903         tmp = 0x88;     /* we need 4 temporary GPR */
1904         /* from 0x8c to 0xff is the area for tone control */
1905
1906         /* stop FX processor */
1907         snd_emu10k1_ptr_write(emu, DBG, 0, (emu->fx8010.dbg = 0) | EMU10K1_DBG_SINGLE_STEP);
1908
1909         /*
1910          *  Process FX Buses
1911          */
1912         OP(icode, &ptr, iMACINT0, GPR(0), C_00000000, FXBUS(FXBUS_PCM_LEFT), C_00000004);
1913         OP(icode, &ptr, iMACINT0, GPR(1), C_00000000, FXBUS(FXBUS_PCM_RIGHT), C_00000004);
1914         OP(icode, &ptr, iMACINT0, GPR(2), C_00000000, FXBUS(FXBUS_MIDI_LEFT), C_00000004);
1915         OP(icode, &ptr, iMACINT0, GPR(3), C_00000000, FXBUS(FXBUS_MIDI_RIGHT), C_00000004);
1916         OP(icode, &ptr, iMACINT0, GPR(4), C_00000000, FXBUS(FXBUS_PCM_LEFT_REAR), C_00000004);
1917         OP(icode, &ptr, iMACINT0, GPR(5), C_00000000, FXBUS(FXBUS_PCM_RIGHT_REAR), C_00000004);
1918         OP(icode, &ptr, iMACINT0, GPR(6), C_00000000, FXBUS(FXBUS_PCM_CENTER), C_00000004);
1919         OP(icode, &ptr, iMACINT0, GPR(7), C_00000000, FXBUS(FXBUS_PCM_LFE), C_00000004);
1920         OP(icode, &ptr, iMACINT0, GPR(8), C_00000000, C_00000000, C_00000000);  /* S/PDIF left */
1921         OP(icode, &ptr, iMACINT0, GPR(9), C_00000000, C_00000000, C_00000000);  /* S/PDIF right */
1922         OP(icode, &ptr, iMACINT0, GPR(10), C_00000000, FXBUS(FXBUS_PCM_LEFT_FRONT), C_00000004);
1923         OP(icode, &ptr, iMACINT0, GPR(11), C_00000000, FXBUS(FXBUS_PCM_RIGHT_FRONT), C_00000004);
1924
1925         /* Raw S/PDIF PCM */
1926         ipcm->substream = 0;
1927         ipcm->channels = 2;
1928         ipcm->tram_start = 0;
1929         ipcm->buffer_size = (64 * 1024) / 2;
1930         ipcm->gpr_size = gpr++;
1931         ipcm->gpr_ptr = gpr++;
1932         ipcm->gpr_count = gpr++;
1933         ipcm->gpr_tmpcount = gpr++;
1934         ipcm->gpr_trigger = gpr++;
1935         ipcm->gpr_running = gpr++;
1936         ipcm->etram[0] = 0;
1937         ipcm->etram[1] = 1;
1938
1939         gpr_map[gpr + 0] = 0xfffff000;
1940         gpr_map[gpr + 1] = 0xffff0000;
1941         gpr_map[gpr + 2] = 0x70000000;
1942         gpr_map[gpr + 3] = 0x00000007;
1943         gpr_map[gpr + 4] = 0x001f << 11;
1944         gpr_map[gpr + 5] = 0x001c << 11;
1945         gpr_map[gpr + 6] = (0x22  - 0x01) - 1;  /* skip at 01 to 22 */
1946         gpr_map[gpr + 7] = (0x22  - 0x06) - 1;  /* skip at 06 to 22 */
1947         gpr_map[gpr + 8] = 0x2000000 + (2<<11);
1948         gpr_map[gpr + 9] = 0x4000000 + (2<<11);
1949         gpr_map[gpr + 10] = 1<<11;
1950         gpr_map[gpr + 11] = (0x24 - 0x0a) - 1;  /* skip at 0a to 24 */
1951         gpr_map[gpr + 12] = 0;
1952
1953         /* if the trigger flag is not set, skip */
1954         /* 00: */ OP(icode, &ptr, iMAC0, C_00000000, GPR(ipcm->gpr_trigger), C_00000000, C_00000000);
1955         /* 01: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_ZERO, GPR(gpr + 6));
1956         /* if the running flag is set, we're running */
1957         /* 02: */ OP(icode, &ptr, iMAC0, C_00000000, GPR(ipcm->gpr_running), C_00000000, C_00000000);
1958         /* 03: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000004);
1959         /* wait until ((GPR_DBAC>>11) & 0x1f) == 0x1c) */
1960         /* 04: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), GPR_DBAC, GPR(gpr + 4), C_00000000);
1961         /* 05: */ OP(icode, &ptr, iMACINT0, C_00000000, GPR(tmp + 0), C_ffffffff, GPR(gpr + 5));
1962         /* 06: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, GPR(gpr + 7));
1963         /* 07: */ OP(icode, &ptr, iACC3, GPR(gpr + 12), C_00000010, C_00000001, C_00000000);
1964
1965         /* 08: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00000000, C_00000001);
1966         /* 09: */ OP(icode, &ptr, iACC3, GPR(gpr + 12), GPR(gpr + 12), C_ffffffff, C_00000000);
1967         /* 0a: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, GPR(gpr + 11));
1968         /* 0b: */ OP(icode, &ptr, iACC3, GPR(gpr + 12), C_00000001, C_00000000, C_00000000);
1969
1970         /* 0c: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), ETRAM_DATA(ipcm->etram[0]), GPR(gpr + 0), C_00000000);
1971         /* 0d: */ OP(icode, &ptr, iLOG, GPR(tmp + 0), GPR(tmp + 0), GPR(gpr + 3), C_00000000);
1972         /* 0e: */ OP(icode, &ptr, iANDXOR, GPR(8), GPR(tmp + 0), GPR(gpr + 1), GPR(gpr + 2));
1973         /* 0f: */ OP(icode, &ptr, iSKIP, C_00000000, GPR_COND, CC_REG_MINUS, C_00000001);
1974         /* 10: */ OP(icode, &ptr, iANDXOR, GPR(8), GPR(8), GPR(gpr + 1), GPR(gpr + 2));
1975
1976         /* 11: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), ETRAM_DATA(ipcm->etram[1]), GPR(gpr + 0), C_00000000);
1977         /* 12: */ OP(icode, &ptr, iLOG, GPR(tmp + 0), GPR(tmp + 0), GPR(gpr + 3), C_00000000);
1978         /* 13: */ OP(icode, &ptr, iANDXOR, GPR(9), GPR(tmp + 0), GPR(gpr + 1), GPR(gpr + 2));
1979         /* 14: */ OP(icode, &ptr, iSKIP, C_00000000, GPR_COND, CC_REG_MINUS, C_00000001);
1980         /* 15: */ OP(icode, &ptr, iANDXOR, GPR(9), GPR(9), GPR(gpr + 1), GPR(gpr + 2));
1981
1982         /* 16: */ OP(icode, &ptr, iACC3, GPR(tmp + 0), GPR(ipcm->gpr_ptr), C_00000001, C_00000000);
1983         /* 17: */ OP(icode, &ptr, iMACINT0, C_00000000, GPR(tmp + 0), C_ffffffff, GPR(ipcm->gpr_size));
1984         /* 18: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_MINUS, C_00000001);
1985         /* 19: */ OP(icode, &ptr, iACC3, GPR(tmp + 0), C_00000000, C_00000000, C_00000000);
1986         /* 1a: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_ptr), GPR(tmp + 0), C_00000000, C_00000000);
1987         
1988         /* 1b: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_tmpcount), GPR(ipcm->gpr_tmpcount), C_ffffffff, C_00000000);
1989         /* 1c: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1990         /* 1d: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_tmpcount), GPR(ipcm->gpr_count), C_00000000, C_00000000);
1991         /* 1e: */ OP(icode, &ptr, iACC3, GPR_IRQ, C_80000000, C_00000000, C_00000000);
1992         /* 1f: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00000001, C_00010000);
1993
1994         /* 20: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00010000, C_00000001);
1995         /* 21: */ OP(icode, &ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000002);
1996
1997         /* 22: */ OP(icode, &ptr, iMACINT1, ETRAM_ADDR(ipcm->etram[0]), GPR(gpr + 8), GPR_DBAC, C_ffffffff);
1998         /* 23: */ OP(icode, &ptr, iMACINT1, ETRAM_ADDR(ipcm->etram[1]), GPR(gpr + 9), GPR_DBAC, C_ffffffff);
1999
2000         /* 24: */
2001         gpr += 13;
2002
2003         /* Wave Playback Volume */
2004         for (z = 0; z < 2; z++)
2005                 VOLUME(icode, &ptr, playback + z, z, gpr + z);
2006         snd_emu10k1_init_stereo_control(controls + i++, "Wave Playback Volume", gpr, 100);
2007         gpr += 2;
2008
2009         /* Wave Surround Playback Volume */
2010         for (z = 0; z < 2; z++)
2011                 VOLUME(icode, &ptr, playback + 2 + z, z, gpr + z);
2012         snd_emu10k1_init_stereo_control(controls + i++, "Wave Surround Playback Volume", gpr, 0);
2013         gpr += 2;
2014         
2015         /* Wave Center/LFE Playback Volume */
2016         OP(icode, &ptr, iACC3, GPR(tmp + 0), FXBUS(FXBUS_PCM_LEFT), FXBUS(FXBUS_PCM_RIGHT), C_00000000);
2017         OP(icode, &ptr, iMACINT0, GPR(tmp + 0), C_00000000, GPR(tmp + 0), C_00000002);
2018         VOLUME(icode, &ptr, playback + 4, tmp + 0, gpr);
2019         snd_emu10k1_init_mono_control(controls + i++, "Wave Center Playback Volume", gpr++, 0);
2020         VOLUME(icode, &ptr, playback + 5, tmp + 0, gpr);
2021         snd_emu10k1_init_mono_control(controls + i++, "Wave LFE Playback Volume", gpr++, 0);
2022
2023         /* Wave Capture Volume + Switch */
2024         for (z = 0; z < 2; z++) {
2025                 SWITCH(icode, &ptr, tmp + 0, z, gpr + 2 + z);
2026                 VOLUME(icode, &ptr, capture + z, tmp + 0, gpr + z);
2027         }
2028         snd_emu10k1_init_stereo_control(controls + i++, "Wave Capture Volume", gpr, 0);
2029         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Wave Capture Switch", gpr + 2, 0);
2030         gpr += 4;
2031
2032         /* Synth Playback Volume */
2033         for (z = 0; z < 2; z++)
2034                 VOLUME_ADD(icode, &ptr, playback + z, 2 + z, gpr + z);
2035         snd_emu10k1_init_stereo_control(controls + i++, "Synth Playback Volume", gpr, 100);
2036         gpr += 2;
2037
2038         /* Synth Capture Volume + Switch */
2039         for (z = 0; z < 2; z++) {
2040                 SWITCH(icode, &ptr, tmp + 0, 2 + z, gpr + 2 + z);
2041                 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2042         }
2043         snd_emu10k1_init_stereo_control(controls + i++, "Synth Capture Volume", gpr, 0);
2044         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Synth Capture Switch", gpr + 2, 0);
2045         gpr += 4;
2046
2047         /* Surround Digital Playback Volume (renamed later without Digital) */
2048         for (z = 0; z < 2; z++)
2049                 VOLUME_ADD(icode, &ptr, playback + 2 + z, 4 + z, gpr + z);
2050         snd_emu10k1_init_stereo_control(controls + i++, "Surround Digital Playback Volume", gpr, 100);
2051         gpr += 2;
2052
2053         /* Surround Capture Volume + Switch */
2054         for (z = 0; z < 2; z++) {
2055                 SWITCH(icode, &ptr, tmp + 0, 4 + z, gpr + 2 + z);
2056                 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2057         }
2058         snd_emu10k1_init_stereo_control(controls + i++, "Surround Capture Volume", gpr, 0);
2059         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Surround Capture Switch", gpr + 2, 0);
2060         gpr += 4;
2061
2062         /* Center Playback Volume (renamed later without Digital) */
2063         VOLUME_ADD(icode, &ptr, playback + 4, 6, gpr);
2064         snd_emu10k1_init_mono_control(controls + i++, "Center Digital Playback Volume", gpr++, 100);
2065
2066         /* LFE Playback Volume + Switch (renamed later without Digital) */
2067         VOLUME_ADD(icode, &ptr, playback + 5, 7, gpr);
2068         snd_emu10k1_init_mono_control(controls + i++, "LFE Digital Playback Volume", gpr++, 100);
2069
2070         /* Front Playback Volume */
2071         for (z = 0; z < 2; z++)
2072                 VOLUME_ADD(icode, &ptr, playback + z, 10 + z, gpr + z);
2073         snd_emu10k1_init_stereo_control(controls + i++, "Front Playback Volume", gpr, 100);
2074         gpr += 2;
2075
2076         /* Front Capture Volume + Switch */
2077         for (z = 0; z < 2; z++) {
2078                 SWITCH(icode, &ptr, tmp + 0, 10 + z, gpr + 2);
2079                 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2080         }
2081         snd_emu10k1_init_stereo_control(controls + i++, "Front Capture Volume", gpr, 0);
2082         snd_emu10k1_init_mono_onoff_control(controls + i++, "Front Capture Switch", gpr + 2, 0);
2083         gpr += 3;
2084
2085         /*
2086          *  Process inputs
2087          */
2088
2089         if (emu->fx8010.extin_mask & ((1<<EXTIN_AC97_L)|(1<<EXTIN_AC97_R))) {
2090                 /* AC'97 Playback Volume */
2091                 VOLUME_ADDIN(icode, &ptr, playback + 0, EXTIN_AC97_L, gpr); gpr++;
2092                 VOLUME_ADDIN(icode, &ptr, playback + 1, EXTIN_AC97_R, gpr); gpr++;
2093                 snd_emu10k1_init_stereo_control(controls + i++, "AC97 Playback Volume", gpr-2, 0);
2094                 /* AC'97 Capture Volume */
2095                 VOLUME_ADDIN(icode, &ptr, capture + 0, EXTIN_AC97_L, gpr); gpr++;
2096                 VOLUME_ADDIN(icode, &ptr, capture + 1, EXTIN_AC97_R, gpr); gpr++;
2097                 snd_emu10k1_init_stereo_control(controls + i++, "AC97 Capture Volume", gpr-2, 100);
2098         }
2099         
2100         if (emu->fx8010.extin_mask & ((1<<EXTIN_SPDIF_CD_L)|(1<<EXTIN_SPDIF_CD_R))) {
2101                 /* IEC958 TTL Playback Volume */
2102                 for (z = 0; z < 2; z++)
2103                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_SPDIF_CD_L + z, gpr + z);
2104                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",PLAYBACK,VOLUME), gpr, 0);
2105                 gpr += 2;
2106         
2107                 /* IEC958 TTL Capture Volume + Switch */
2108                 for (z = 0; z < 2; z++) {
2109                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_SPDIF_CD_L + z, gpr + 2 + z);
2110                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2111                 }
2112                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",CAPTURE,VOLUME), gpr, 0);
2113                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",CAPTURE,SWITCH), gpr + 2, 0);
2114                 gpr += 4;
2115         }
2116         
2117         if (emu->fx8010.extin_mask & ((1<<EXTIN_ZOOM_L)|(1<<EXTIN_ZOOM_R))) {
2118                 /* Zoom Video Playback Volume */
2119                 for (z = 0; z < 2; z++)
2120                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_ZOOM_L + z, gpr + z);
2121                 snd_emu10k1_init_stereo_control(controls + i++, "Zoom Video Playback Volume", gpr, 0);
2122                 gpr += 2;
2123         
2124                 /* Zoom Video Capture Volume + Switch */
2125                 for (z = 0; z < 2; z++) {
2126                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_ZOOM_L + z, gpr + 2 + z);
2127                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2128                 }
2129                 snd_emu10k1_init_stereo_control(controls + i++, "Zoom Video Capture Volume", gpr, 0);
2130                 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Zoom Video Capture Switch", gpr + 2, 0);
2131                 gpr += 4;
2132         }
2133         
2134         if (emu->fx8010.extin_mask & ((1<<EXTIN_TOSLINK_L)|(1<<EXTIN_TOSLINK_R))) {
2135                 /* IEC958 Optical Playback Volume */
2136                 for (z = 0; z < 2; z++)
2137                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_TOSLINK_L + z, gpr + z);
2138                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",PLAYBACK,VOLUME), gpr, 0);
2139                 gpr += 2;
2140         
2141                 /* IEC958 Optical Capture Volume */
2142                 for (z = 0; z < 2; z++) {
2143                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_TOSLINK_L + z, gpr + 2 + z);
2144                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2145                 }
2146                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",CAPTURE,VOLUME), gpr, 0);
2147                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",CAPTURE,SWITCH), gpr + 2, 0);
2148                 gpr += 4;
2149         }
2150         
2151         if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE1_L)|(1<<EXTIN_LINE1_R))) {
2152                 /* Line LiveDrive Playback Volume */
2153                 for (z = 0; z < 2; z++)
2154                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_LINE1_L + z, gpr + z);
2155                 snd_emu10k1_init_stereo_control(controls + i++, "Line LiveDrive Playback Volume", gpr, 0);
2156                 gpr += 2;
2157         
2158                 /* Line LiveDrive Capture Volume + Switch */
2159                 for (z = 0; z < 2; z++) {
2160                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_LINE1_L + z, gpr + 2 + z);
2161                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2162                 }
2163                 snd_emu10k1_init_stereo_control(controls + i++, "Line LiveDrive Capture Volume", gpr, 0);
2164                 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Line LiveDrive Capture Switch", gpr + 2, 0);
2165                 gpr += 4;
2166         }
2167         
2168         if (emu->fx8010.extin_mask & ((1<<EXTIN_COAX_SPDIF_L)|(1<<EXTIN_COAX_SPDIF_R))) {
2169                 /* IEC958 Coax Playback Volume */
2170                 for (z = 0; z < 2; z++)
2171                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_COAX_SPDIF_L + z, gpr + z);
2172                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",PLAYBACK,VOLUME), gpr, 0);
2173                 gpr += 2;
2174         
2175                 /* IEC958 Coax Capture Volume + Switch */
2176                 for (z = 0; z < 2; z++) {
2177                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_COAX_SPDIF_L + z, gpr + 2 + z);
2178                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2179                 }
2180                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",CAPTURE,VOLUME), gpr, 0);
2181                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",CAPTURE,SWITCH), gpr + 2, 0);
2182                 gpr += 4;
2183         }
2184         
2185         if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE2_L)|(1<<EXTIN_LINE2_R))) {
2186                 /* Line LiveDrive Playback Volume */
2187                 for (z = 0; z < 2; z++)
2188                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_LINE2_L + z, gpr + z);
2189                 snd_emu10k1_init_stereo_control(controls + i++, "Line2 LiveDrive Playback Volume", gpr, 0);
2190                 controls[i-1].id.index = 1;
2191                 gpr += 2;
2192         
2193                 /* Line LiveDrive Capture Volume */
2194                 for (z = 0; z < 2; z++) {
2195                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_LINE2_L + z, gpr + 2 + z);
2196                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2197                 }
2198                 snd_emu10k1_init_stereo_control(controls + i++, "Line2 LiveDrive Capture Volume", gpr, 0);
2199                 controls[i-1].id.index = 1;
2200                 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Line2 LiveDrive Capture Switch", gpr + 2, 0);
2201                 controls[i-1].id.index = 1;
2202                 gpr += 4;
2203         }
2204
2205         /*
2206          *  Process tone control
2207          */
2208         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), GPR(playback + 0), C_00000000, C_00000000); /* left */
2209         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), GPR(playback + 1), C_00000000, C_00000000); /* right */
2210         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2), GPR(playback + 2), C_00000000, C_00000000); /* rear left */
2211         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 3), GPR(playback + 3), C_00000000, C_00000000); /* rear right */
2212         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), GPR(playback + 4), C_00000000, C_00000000); /* center */
2213         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), GPR(playback + 5), C_00000000, C_00000000); /* LFE */
2214
2215         ctl = &controls[i + 0];
2216         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
2217         strcpy(ctl->id.name, "Tone Control - Bass");
2218         ctl->vcount = 2;
2219         ctl->count = 10;
2220         ctl->min = 0;
2221         ctl->max = 40;
2222         ctl->value[0] = ctl->value[1] = 20;
2223         ctl->tlv = snd_emu10k1_bass_treble_db_scale;
2224         ctl->translation = EMU10K1_GPR_TRANSLATION_BASS;
2225         ctl = &controls[i + 1];
2226         ctl->id.iface = (__force int)SNDRV_CTL_ELEM_IFACE_MIXER;
2227         strcpy(ctl->id.name, "Tone Control - Treble");
2228         ctl->vcount = 2;
2229         ctl->count = 10;
2230         ctl->min = 0;
2231         ctl->max = 40;
2232         ctl->value[0] = ctl->value[1] = 20;
2233         ctl->tlv = snd_emu10k1_bass_treble_db_scale;
2234         ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE;
2235
2236 #define BASS_GPR        0x8c
2237 #define TREBLE_GPR      0x96
2238
2239         for (z = 0; z < 5; z++) {
2240                 int j;
2241                 for (j = 0; j < 2; j++) {
2242                         controls[i + 0].gpr[z * 2 + j] = BASS_GPR + z * 2 + j;
2243                         controls[i + 1].gpr[z * 2 + j] = TREBLE_GPR + z * 2 + j;
2244                 }
2245         }
2246         for (z = 0; z < 3; z++) {               /* front/rear/center-lfe */
2247                 int j, k, l, d;
2248                 for (j = 0; j < 2; j++) {       /* left/right */
2249                         k = 0xa0 + (z * 8) + (j * 4);
2250                         l = 0xd0 + (z * 8) + (j * 4);
2251                         d = playback + SND_EMU10K1_PLAYBACK_CHANNELS + z * 2 + j;
2252
2253                         OP(icode, &ptr, iMAC0, C_00000000, C_00000000, GPR(d), GPR(BASS_GPR + 0 + j));
2254                         OP(icode, &ptr, iMACMV, GPR(k+1), GPR(k), GPR(k+1), GPR(BASS_GPR + 4 + j));
2255                         OP(icode, &ptr, iMACMV, GPR(k), GPR(d), GPR(k), GPR(BASS_GPR + 2 + j));
2256                         OP(icode, &ptr, iMACMV, GPR(k+3), GPR(k+2), GPR(k+3), GPR(BASS_GPR + 8 + j));
2257                         OP(icode, &ptr, iMAC0, GPR(k+2), GPR_ACCU, GPR(k+2), GPR(BASS_GPR + 6 + j));
2258                         OP(icode, &ptr, iACC3, GPR(k+2), GPR(k+2), GPR(k+2), C_00000000);
2259
2260                         OP(icode, &ptr, iMAC0, C_00000000, C_00000000, GPR(k+2), GPR(TREBLE_GPR + 0 + j));
2261                         OP(icode, &ptr, iMACMV, GPR(l+1), GPR(l), GPR(l+1), GPR(TREBLE_GPR + 4 + j));
2262                         OP(icode, &ptr, iMACMV, GPR(l), GPR(k+2), GPR(l), GPR(TREBLE_GPR + 2 + j));
2263                         OP(icode, &ptr, iMACMV, GPR(l+3), GPR(l+2), GPR(l+3), GPR(TREBLE_GPR + 8 + j));
2264                         OP(icode, &ptr, iMAC0, GPR(l+2), GPR_ACCU, GPR(l+2), GPR(TREBLE_GPR + 6 + j));
2265                         OP(icode, &ptr, iMACINT0, GPR(l+2), C_00000000, GPR(l+2), C_00000010);
2266
2267                         OP(icode, &ptr, iACC3, GPR(d), GPR(l+2), C_00000000, C_00000000);
2268
2269                         if (z == 2)     /* center */
2270                                 break;
2271                 }
2272         }
2273         i += 2;
2274
2275 #undef BASS_GPR
2276 #undef TREBLE_GPR
2277
2278         for (z = 0; z < 6; z++) {
2279                 SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, gpr + 0);
2280                 SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 0);
2281                 SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1);
2282                 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2283         }
2284         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Tone Control - Switch", gpr, 0);
2285         gpr += 2;
2286
2287         /*
2288          *  Process outputs
2289          */
2290         if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_L)|(1<<EXTOUT_AC97_R))) {
2291                 /* AC'97 Playback Volume */
2292
2293                 for (z = 0; z < 2; z++)
2294                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), C_00000000, C_00000000);
2295         }
2296
2297         if (emu->fx8010.extout_mask & ((1<<EXTOUT_TOSLINK_L)|(1<<EXTOUT_TOSLINK_R))) {
2298                 /* IEC958 Optical Raw Playback Switch */
2299
2300                 for (z = 0; z < 2; z++) {
2301                         SWITCH(icode, &ptr, tmp + 0, 8 + z, gpr + z);
2302                         SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z);
2303                         SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);
2304                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_TOSLINK_L + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2305 #ifdef EMU10K1_CAPTURE_DIGITAL_OUT
2306                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ADC_CAP_L + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2307 #endif
2308                 }
2309
2310                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0);
2311                 gpr += 2;
2312         }
2313
2314         if (emu->fx8010.extout_mask & ((1<<EXTOUT_HEADPHONE_L)|(1<<EXTOUT_HEADPHONE_R))) {
2315                 /* Headphone Playback Volume */
2316
2317                 for (z = 0; z < 2; z++) {
2318                         SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4 + z, gpr + 2 + z);
2319                         SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 2 + z);
2320                         SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);
2321                         OP(icode, &ptr, iACC3, GPR(tmp + 0), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2322                         VOLUME_OUT(icode, &ptr, EXTOUT_HEADPHONE_L + z, tmp + 0, gpr + z);
2323                 }
2324
2325                 snd_emu10k1_init_stereo_control(controls + i++, "Headphone Playback Volume", gpr + 0, 0);
2326                 controls[i-1].id.index = 1;     /* AC'97 can have also Headphone control */
2327                 snd_emu10k1_init_mono_onoff_control(controls + i++, "Headphone Center Playback Switch", gpr + 2, 0);
2328                 controls[i-1].id.index = 1;
2329                 snd_emu10k1_init_mono_onoff_control(controls + i++, "Headphone LFE Playback Switch", gpr + 3, 0);
2330                 controls[i-1].id.index = 1;
2331
2332                 gpr += 4;
2333         }
2334         
2335         if (emu->fx8010.extout_mask & ((1<<EXTOUT_REAR_L)|(1<<EXTOUT_REAR_R)))
2336                 for (z = 0; z < 2; z++)
2337                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2 + z), C_00000000, C_00000000);
2338
2339         if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_REAR_L)|(1<<EXTOUT_AC97_REAR_R)))
2340                 for (z = 0; z < 2; z++)
2341                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2 + z), C_00000000, C_00000000);
2342
2343         if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_CENTER)) {
2344 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT
2345                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
2346                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
2347 #else
2348                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
2349                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
2350 #endif
2351         }
2352
2353         if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_LFE)) {
2354 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT
2355                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
2356                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
2357 #else
2358                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
2359                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
2360 #endif
2361         }
2362         
2363 #ifndef EMU10K1_CAPTURE_DIGITAL_OUT
2364         for (z = 0; z < 2; z++)
2365                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ADC_CAP_L + z), GPR(capture + z), C_00000000, C_00000000);
2366 #endif
2367         
2368         if (emu->fx8010.extout_mask & (1<<EXTOUT_MIC_CAP))
2369                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_MIC_CAP), GPR(capture + 2), C_00000000, C_00000000);
2370
2371         /* EFX capture - capture the 16 EXTINS */
2372         if (emu->card_capabilities->sblive51) {
2373                 /* On the Live! 5.1, FXBUS2(1) and FXBUS(2) are shared with EXTOUT_ACENTER
2374                  * and EXTOUT_ALFE, so we can't connect inputs to them for multitrack recording.
2375                  *
2376                  * Since only 14 of the 16 EXTINs are used, this is not a big problem.  
2377                  * We route AC97L and R to FX capture 14 and 15, SPDIF CD in to FX capture 
2378                  * 0 and 3, then the rest of the EXTINs to the corresponding FX capture 
2379                  * channel.  Multitrack recorders will still see the center/lfe output signal 
2380                  * on the second and third channels.
2381                  */
2382                 OP(icode, &ptr, iACC3, FXBUS2(14), C_00000000, C_00000000, EXTIN(0));
2383                 OP(icode, &ptr, iACC3, FXBUS2(15), C_00000000, C_00000000, EXTIN(1));
2384                 OP(icode, &ptr, iACC3, FXBUS2(0), C_00000000, C_00000000, EXTIN(2));
2385                 OP(icode, &ptr, iACC3, FXBUS2(3), C_00000000, C_00000000, EXTIN(3));
2386                 for (z = 4; z < 14; z++)
2387                         OP(icode, &ptr, iACC3, FXBUS2(z), C_00000000, C_00000000, EXTIN(z));
2388         } else {
2389                 for (z = 0; z < 16; z++)
2390                         OP(icode, &ptr, iACC3, FXBUS2(z), C_00000000, C_00000000, EXTIN(z));
2391         }
2392             
2393
2394         if (gpr > tmp) {
2395                 snd_BUG();
2396                 err = -EIO;
2397                 goto __err;
2398         }
2399         if (i > SND_EMU10K1_GPR_CONTROLS) {
2400                 snd_BUG();
2401                 err = -EIO;
2402                 goto __err;
2403         }
2404         
2405         /* clear remaining instruction memory */
2406         while (ptr < 0x200)
2407                 OP(icode, &ptr, iACC3, C_00000000, C_00000000, C_00000000, C_00000000);
2408
2409         err = snd_emu10k1_fx8010_tram_setup(emu, ipcm->buffer_size);
2410         if (err < 0)
2411                 goto __err;
2412         icode->gpr_add_control_count = i;
2413         icode->gpr_add_controls = controls;
2414         emu->support_tlv = 1; /* support TLV */
2415         err = snd_emu10k1_icode_poke(emu, icode, true);
2416         emu->support_tlv = 0; /* clear again */
2417         if (err >= 0)
2418                 err = snd_emu10k1_ipcm_poke(emu, ipcm);
2419 __err:
2420         kfree(ipcm);
2421 __err_ipcm:
2422         kfree(controls);
2423 __err_ctrls:
2424         kfree(icode->gpr_map);
2425 __err_gpr:
2426         kfree(icode);
2427         return err;
2428 }
2429
2430 int snd_emu10k1_init_efx(struct snd_emu10k1 *emu)
2431 {
2432         spin_lock_init(&emu->fx8010.irq_lock);
2433         INIT_LIST_HEAD(&emu->fx8010.gpr_ctl);
2434         if (emu->audigy)
2435                 return _snd_emu10k1_audigy_init_efx(emu);
2436         else
2437                 return _snd_emu10k1_init_efx(emu);
2438 }
2439
2440 void snd_emu10k1_free_efx(struct snd_emu10k1 *emu)
2441 {
2442         /* stop processor */
2443         if (emu->audigy)
2444                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = A_DBG_SINGLE_STEP);
2445         else
2446                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = EMU10K1_DBG_SINGLE_STEP);
2447 }
2448
2449 #if 0 /* FIXME: who use them? */
2450 int snd_emu10k1_fx8010_tone_control_activate(struct snd_emu10k1 *emu, int output)
2451 {
2452         if (output < 0 || output >= 6)
2453                 return -EINVAL;
2454         snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 1);
2455         return 0;
2456 }
2457
2458 int snd_emu10k1_fx8010_tone_control_deactivate(struct snd_emu10k1 *emu, int output)
2459 {
2460         if (output < 0 || output >= 6)
2461                 return -EINVAL;
2462         snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 0);
2463         return 0;
2464 }
2465 #endif
2466
2467 int snd_emu10k1_fx8010_tram_setup(struct snd_emu10k1 *emu, u32 size)
2468 {
2469         u8 size_reg = 0;
2470
2471         /* size is in samples */
2472         if (size != 0) {
2473                 size = (size - 1) >> 13;
2474
2475                 while (size) {
2476                         size >>= 1;
2477                         size_reg++;
2478                 }
2479                 size = 0x2000 << size_reg;
2480         }
2481         if ((emu->fx8010.etram_pages.bytes / 2) == size)
2482                 return 0;
2483         spin_lock_irq(&emu->emu_lock);
2484         outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
2485         spin_unlock_irq(&emu->emu_lock);
2486         snd_emu10k1_ptr_write(emu, TCB, 0, 0);
2487         snd_emu10k1_ptr_write(emu, TCBS, 0, 0);
2488         if (emu->fx8010.etram_pages.area != NULL) {
2489                 snd_dma_free_pages(&emu->fx8010.etram_pages);
2490                 emu->fx8010.etram_pages.area = NULL;
2491                 emu->fx8010.etram_pages.bytes = 0;
2492         }
2493
2494         if (size > 0) {
2495                 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &emu->pci->dev,
2496                                         size * 2, &emu->fx8010.etram_pages) < 0)
2497                         return -ENOMEM;
2498                 memset(emu->fx8010.etram_pages.area, 0, size * 2);
2499                 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr);
2500                 snd_emu10k1_ptr_write(emu, TCBS, 0, size_reg);
2501                 spin_lock_irq(&emu->emu_lock);
2502                 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
2503                 spin_unlock_irq(&emu->emu_lock);
2504         }
2505
2506         return 0;
2507 }
2508
2509 static int snd_emu10k1_fx8010_open(struct snd_hwdep * hw, struct file *file)
2510 {
2511         return 0;
2512 }
2513
2514 static void copy_string(char *dst, const char *src, const char *null, int idx)
2515 {
2516         if (src == NULL)
2517                 sprintf(dst, "%s %02X", null, idx);
2518         else
2519                 strcpy(dst, src);
2520 }
2521
2522 static void snd_emu10k1_fx8010_info(struct snd_emu10k1 *emu,
2523                                    struct snd_emu10k1_fx8010_info *info)
2524 {
2525         const char * const *fxbus, * const *extin, * const *extout;
2526         unsigned short fxbus_mask, extin_mask, extout_mask;
2527         int res;
2528
2529         info->internal_tram_size = emu->fx8010.itram_size;
2530         info->external_tram_size = emu->fx8010.etram_pages.bytes / 2;
2531         fxbus = fxbuses;
2532         extin = emu->audigy ? audigy_ins : creative_ins;
2533         extout = emu->audigy ? audigy_outs : creative_outs;
2534         fxbus_mask = emu->fx8010.fxbus_mask;
2535         extin_mask = emu->fx8010.extin_mask;
2536         extout_mask = emu->fx8010.extout_mask;
2537         for (res = 0; res < 16; res++, fxbus++, extin++, extout++) {
2538                 copy_string(info->fxbus_names[res], fxbus_mask & (1 << res) ? *fxbus : NULL, "FXBUS", res);
2539                 copy_string(info->extin_names[res], extin_mask & (1 << res) ? *extin : NULL, "Unused", res);
2540                 copy_string(info->extout_names[res], extout_mask & (1 << res) ? *extout : NULL, "Unused", res);
2541         }
2542         for (res = 16; res < 32; res++, extout++)
2543                 copy_string(info->extout_names[res], extout_mask & (1 << res) ? *extout : NULL, "Unused", res);
2544         info->gpr_controls = emu->fx8010.gpr_count;
2545 }
2546
2547 static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, unsigned int cmd, unsigned long arg)
2548 {
2549         struct snd_emu10k1 *emu = hw->private_data;
2550         struct snd_emu10k1_fx8010_info *info;
2551         struct snd_emu10k1_fx8010_code *icode;
2552         struct snd_emu10k1_fx8010_pcm_rec *ipcm;
2553         unsigned int addr;
2554         void __user *argp = (void __user *)arg;
2555         int res;
2556         
2557         switch (cmd) {
2558         case SNDRV_EMU10K1_IOCTL_PVERSION:
2559                 emu->support_tlv = 1;
2560                 return put_user(SNDRV_EMU10K1_VERSION, (int __user *)argp);
2561         case SNDRV_EMU10K1_IOCTL_INFO:
2562                 info = kzalloc(sizeof(*info), GFP_KERNEL);
2563                 if (!info)
2564                         return -ENOMEM;
2565                 snd_emu10k1_fx8010_info(emu, info);
2566                 if (copy_to_user(argp, info, sizeof(*info))) {
2567                         kfree(info);
2568                         return -EFAULT;
2569                 }
2570                 kfree(info);
2571                 return 0;
2572         case SNDRV_EMU10K1_IOCTL_CODE_POKE:
2573                 if (!capable(CAP_SYS_ADMIN))
2574                         return -EPERM;
2575
2576                 icode = memdup_user(argp, sizeof(*icode));
2577                 if (IS_ERR(icode))
2578                         return PTR_ERR(icode);
2579                 res = snd_emu10k1_icode_poke(emu, icode, false);
2580                 kfree(icode);
2581                 return res;
2582         case SNDRV_EMU10K1_IOCTL_CODE_PEEK:
2583                 icode = memdup_user(argp, sizeof(*icode));
2584                 if (IS_ERR(icode))
2585                         return PTR_ERR(icode);
2586                 res = snd_emu10k1_icode_peek(emu, icode);
2587                 if (res == 0 && copy_to_user(argp, icode, sizeof(*icode))) {
2588                         kfree(icode);
2589                         return -EFAULT;
2590                 }
2591                 kfree(icode);
2592                 return res;
2593         case SNDRV_EMU10K1_IOCTL_PCM_POKE:
2594                 ipcm = memdup_user(argp, sizeof(*ipcm));
2595                 if (IS_ERR(ipcm))
2596                         return PTR_ERR(ipcm);
2597                 res = snd_emu10k1_ipcm_poke(emu, ipcm);
2598                 kfree(ipcm);
2599                 return res;
2600         case SNDRV_EMU10K1_IOCTL_PCM_PEEK:
2601                 ipcm = memdup_user(argp, sizeof(*ipcm));
2602                 if (IS_ERR(ipcm))
2603                         return PTR_ERR(ipcm);
2604                 res = snd_emu10k1_ipcm_peek(emu, ipcm);
2605                 if (res == 0 && copy_to_user(argp, ipcm, sizeof(*ipcm))) {
2606                         kfree(ipcm);
2607                         return -EFAULT;
2608                 }
2609                 kfree(ipcm);
2610                 return res;
2611         case SNDRV_EMU10K1_IOCTL_TRAM_SETUP:
2612                 if (!capable(CAP_SYS_ADMIN))
2613                         return -EPERM;
2614                 if (get_user(addr, (unsigned int __user *)argp))
2615                         return -EFAULT;
2616                 mutex_lock(&emu->fx8010.lock);
2617                 res = snd_emu10k1_fx8010_tram_setup(emu, addr);
2618                 mutex_unlock(&emu->fx8010.lock);
2619                 return res;
2620         case SNDRV_EMU10K1_IOCTL_STOP:
2621                 if (!capable(CAP_SYS_ADMIN))
2622                         return -EPERM;
2623                 if (emu->audigy)
2624                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP);
2625                 else
2626                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP);
2627                 return 0;
2628         case SNDRV_EMU10K1_IOCTL_CONTINUE:
2629                 if (!capable(CAP_SYS_ADMIN))
2630                         return -EPERM;
2631                 if (emu->audigy)
2632                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = 0);
2633                 else
2634                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = 0);
2635                 return 0;
2636         case SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER:
2637                 if (!capable(CAP_SYS_ADMIN))
2638                         return -EPERM;
2639                 if (emu->audigy)
2640                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_ZC);
2641                 else
2642                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_ZC);
2643                 udelay(10);
2644                 if (emu->audigy)
2645                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
2646                 else
2647                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
2648                 return 0;
2649         case SNDRV_EMU10K1_IOCTL_SINGLE_STEP:
2650                 if (!capable(CAP_SYS_ADMIN))
2651                         return -EPERM;
2652                 if (get_user(addr, (unsigned int __user *)argp))
2653                         return -EFAULT;
2654                 if (addr > 0x1ff)
2655                         return -EINVAL;
2656                 if (emu->audigy)
2657                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | addr);
2658                 else
2659                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | addr);
2660                 udelay(10);
2661                 if (emu->audigy)
2662                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | A_DBG_STEP_ADDR | addr);
2663                 else
2664                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | EMU10K1_DBG_STEP | addr);
2665                 return 0;
2666         case SNDRV_EMU10K1_IOCTL_DBG_READ:
2667                 if (emu->audigy)
2668                         addr = snd_emu10k1_ptr_read(emu, A_DBG, 0);
2669                 else
2670                         addr = snd_emu10k1_ptr_read(emu, DBG, 0);
2671                 if (put_user(addr, (unsigned int __user *)argp))
2672                         return -EFAULT;
2673                 return 0;
2674         }
2675         return -ENOTTY;
2676 }
2677
2678 static int snd_emu10k1_fx8010_release(struct snd_hwdep * hw, struct file *file)
2679 {
2680         return 0;
2681 }
2682
2683 int snd_emu10k1_fx8010_new(struct snd_emu10k1 *emu, int device)
2684 {
2685         struct snd_hwdep *hw;
2686         int err;
2687         
2688         err = snd_hwdep_new(emu->card, "FX8010", device, &hw);
2689         if (err < 0)
2690                 return err;
2691         strcpy(hw->name, "EMU10K1 (FX8010)");
2692         hw->iface = SNDRV_HWDEP_IFACE_EMU10K1;
2693         hw->ops.open = snd_emu10k1_fx8010_open;
2694         hw->ops.ioctl = snd_emu10k1_fx8010_ioctl;
2695         hw->ops.release = snd_emu10k1_fx8010_release;
2696         hw->private_data = emu;
2697         return 0;
2698 }
2699
2700 #ifdef CONFIG_PM_SLEEP
2701 int snd_emu10k1_efx_alloc_pm_buffer(struct snd_emu10k1 *emu)
2702 {
2703         int len;
2704
2705         len = emu->audigy ? 0x200 : 0x100;
2706         emu->saved_gpr = kmalloc_array(len, 4, GFP_KERNEL);
2707         if (! emu->saved_gpr)
2708                 return -ENOMEM;
2709         len = emu->audigy ? 0x100 : 0xa0;
2710         emu->tram_val_saved = kmalloc_array(len, 4, GFP_KERNEL);
2711         emu->tram_addr_saved = kmalloc_array(len, 4, GFP_KERNEL);
2712         if (! emu->tram_val_saved || ! emu->tram_addr_saved)
2713                 return -ENOMEM;
2714         len = emu->audigy ? 2 * 1024 : 2 * 512;
2715         emu->saved_icode = vmalloc(array_size(len, 4));
2716         if (! emu->saved_icode)
2717                 return -ENOMEM;
2718         return 0;
2719 }
2720
2721 void snd_emu10k1_efx_free_pm_buffer(struct snd_emu10k1 *emu)
2722 {
2723         kfree(emu->saved_gpr);
2724         kfree(emu->tram_val_saved);
2725         kfree(emu->tram_addr_saved);
2726         vfree(emu->saved_icode);
2727 }
2728
2729 /*
2730  * save/restore GPR, TRAM and codes
2731  */
2732 void snd_emu10k1_efx_suspend(struct snd_emu10k1 *emu)
2733 {
2734         int i, len;
2735
2736         len = emu->audigy ? 0x200 : 0x100;
2737         for (i = 0; i < len; i++)
2738                 emu->saved_gpr[i] = snd_emu10k1_ptr_read(emu, emu->gpr_base + i, 0);
2739
2740         len = emu->audigy ? 0x100 : 0xa0;
2741         for (i = 0; i < len; i++) {
2742                 emu->tram_val_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMDATAREGBASE + i, 0);
2743                 emu->tram_addr_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + i, 0);
2744                 if (emu->audigy) {
2745                         emu->tram_addr_saved[i] >>= 12;
2746                         emu->tram_addr_saved[i] |=
2747                                 snd_emu10k1_ptr_read(emu, A_TANKMEMCTLREGBASE + i, 0) << 20;
2748                 }
2749         }
2750
2751         len = emu->audigy ? 2 * 1024 : 2 * 512;
2752         for (i = 0; i < len; i++)
2753                 emu->saved_icode[i] = snd_emu10k1_efx_read(emu, i);
2754 }
2755
2756 void snd_emu10k1_efx_resume(struct snd_emu10k1 *emu)
2757 {
2758         int i, len;
2759
2760         /* set up TRAM */
2761         if (emu->fx8010.etram_pages.bytes > 0) {
2762                 unsigned size, size_reg = 0;
2763                 size = emu->fx8010.etram_pages.bytes / 2;
2764                 size = (size - 1) >> 13;
2765                 while (size) {
2766                         size >>= 1;
2767                         size_reg++;
2768                 }
2769                 outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
2770                 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr);
2771                 snd_emu10k1_ptr_write(emu, TCBS, 0, size_reg);
2772                 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
2773         }
2774
2775         if (emu->audigy)
2776                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP);
2777         else
2778                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP);
2779
2780         len = emu->audigy ? 0x200 : 0x100;
2781         for (i = 0; i < len; i++)
2782                 snd_emu10k1_ptr_write(emu, emu->gpr_base + i, 0, emu->saved_gpr[i]);
2783
2784         len = emu->audigy ? 0x100 : 0xa0;
2785         for (i = 0; i < len; i++) {
2786                 snd_emu10k1_ptr_write(emu, TANKMEMDATAREGBASE + i, 0,
2787                                       emu->tram_val_saved[i]);
2788                 if (! emu->audigy)
2789                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0,
2790                                               emu->tram_addr_saved[i]);
2791                 else {
2792                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0,
2793                                               emu->tram_addr_saved[i] << 12);
2794                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0,
2795                                               emu->tram_addr_saved[i] >> 20);
2796                 }
2797         }
2798
2799         len = emu->audigy ? 2 * 1024 : 2 * 512;
2800         for (i = 0; i < len; i++)
2801                 snd_emu10k1_efx_write(emu, i, emu->saved_icode[i]);
2802
2803         /* start FX processor when the DSP code is updated */
2804         if (emu->audigy)
2805                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
2806         else
2807                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
2808 }
2809 #endif