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