af1085d946ec63378456313de2dc2de5550a8400
[linux-2.6-microblaze.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 Capture 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  *   controls
315  */
316
317 static int snd_emu10k1_gpr_ctl_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
318 {
319         struct snd_emu10k1_fx8010_ctl *ctl =
320                 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
321
322         if (ctl->min == 0 && ctl->max == 1)
323                 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
324         else
325                 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
326         uinfo->count = ctl->vcount;
327         uinfo->value.integer.min = ctl->min;
328         uinfo->value.integer.max = ctl->max;
329         return 0;
330 }
331
332 static int snd_emu10k1_gpr_ctl_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
333 {
334         struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
335         struct snd_emu10k1_fx8010_ctl *ctl =
336                 (struct snd_emu10k1_fx8010_ctl *) kcontrol->private_value;
337         unsigned long flags;
338         unsigned int i;
339         
340         spin_lock_irqsave(&emu->reg_lock, flags);
341         for (i = 0; i < ctl->vcount; i++)
342                 ucontrol->value.integer.value[i] = ctl->value[i];
343         spin_unlock_irqrestore(&emu->reg_lock, flags);
344         return 0;
345 }
346
347 static int snd_emu10k1_gpr_ctl_put(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 nval, val;
354         unsigned int i, j;
355         int change = 0;
356         
357         spin_lock_irqsave(&emu->reg_lock, flags);
358         for (i = 0; i < ctl->vcount; i++) {
359                 nval = ucontrol->value.integer.value[i];
360                 if (nval < ctl->min)
361                         nval = ctl->min;
362                 if (nval > ctl->max)
363                         nval = ctl->max;
364                 if (nval != ctl->value[i])
365                         change = 1;
366                 val = ctl->value[i] = nval;
367                 switch (ctl->translation) {
368                 case EMU10K1_GPR_TRANSLATION_NONE:
369                         snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, val);
370                         break;
371                 case EMU10K1_GPR_TRANSLATION_TABLE100:
372                         snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, db_table[val]);
373                         break;
374                 case EMU10K1_GPR_TRANSLATION_BASS:
375                         if ((ctl->count % 5) != 0 || (ctl->count / 5) != ctl->vcount) {
376                                 change = -EIO;
377                                 goto __error;
378                         }
379                         for (j = 0; j < 5; j++)
380                                 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, bass_table[val][j]);
381                         break;
382                 case EMU10K1_GPR_TRANSLATION_TREBLE:
383                         if ((ctl->count % 5) != 0 || (ctl->count / 5) != ctl->vcount) {
384                                 change = -EIO;
385                                 goto __error;
386                         }
387                         for (j = 0; j < 5; j++)
388                                 snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[j * ctl->vcount + i], 0, treble_table[val][j]);
389                         break;
390                 case EMU10K1_GPR_TRANSLATION_ONOFF:
391                         snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, onoff_table[val]);
392                         break;
393                 }
394         }
395       __error:
396         spin_unlock_irqrestore(&emu->reg_lock, flags);
397         return change;
398 }
399
400 /*
401  *   Interrupt handler
402  */
403
404 static void snd_emu10k1_fx8010_interrupt(struct snd_emu10k1 *emu)
405 {
406         struct snd_emu10k1_fx8010_irq *irq, *nirq;
407
408         irq = emu->fx8010.irq_handlers;
409         while (irq) {
410                 nirq = irq->next;       /* irq ptr can be removed from list */
411                 if (snd_emu10k1_ptr_read(emu, emu->gpr_base + irq->gpr_running, 0) & 0xffff0000) {
412                         if (irq->handler)
413                                 irq->handler(emu, irq->private_data);
414                         snd_emu10k1_ptr_write(emu, emu->gpr_base + irq->gpr_running, 0, 1);
415                 }
416                 irq = nirq;
417         }
418 }
419
420 int snd_emu10k1_fx8010_register_irq_handler(struct snd_emu10k1 *emu,
421                                             snd_fx8010_irq_handler_t *handler,
422                                             unsigned char gpr_running,
423                                             void *private_data,
424                                             struct snd_emu10k1_fx8010_irq *irq)
425 {
426         unsigned long flags;
427         
428         irq->handler = handler;
429         irq->gpr_running = gpr_running;
430         irq->private_data = private_data;
431         irq->next = NULL;
432         spin_lock_irqsave(&emu->fx8010.irq_lock, flags);
433         if (emu->fx8010.irq_handlers == NULL) {
434                 emu->fx8010.irq_handlers = irq;
435                 emu->dsp_interrupt = snd_emu10k1_fx8010_interrupt;
436                 snd_emu10k1_intr_enable(emu, INTE_FXDSPENABLE);
437         } else {
438                 irq->next = emu->fx8010.irq_handlers;
439                 emu->fx8010.irq_handlers = irq;
440         }
441         spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags);
442         return 0;
443 }
444
445 int snd_emu10k1_fx8010_unregister_irq_handler(struct snd_emu10k1 *emu,
446                                               struct snd_emu10k1_fx8010_irq *irq)
447 {
448         struct snd_emu10k1_fx8010_irq *tmp;
449         unsigned long flags;
450         
451         spin_lock_irqsave(&emu->fx8010.irq_lock, flags);
452         if ((tmp = emu->fx8010.irq_handlers) == irq) {
453                 emu->fx8010.irq_handlers = tmp->next;
454                 if (emu->fx8010.irq_handlers == NULL) {
455                         snd_emu10k1_intr_disable(emu, INTE_FXDSPENABLE);
456                         emu->dsp_interrupt = NULL;
457                 }
458         } else {
459                 while (tmp && tmp->next != irq)
460                         tmp = tmp->next;
461                 if (tmp)
462                         tmp->next = tmp->next->next;
463         }
464         spin_unlock_irqrestore(&emu->fx8010.irq_lock, flags);
465         return 0;
466 }
467
468 /*************************************************************************
469  * EMU10K1 effect manager
470  *************************************************************************/
471
472 static void snd_emu10k1_write_op(struct snd_emu10k1_fx8010_code *icode,
473                                  unsigned int *ptr,
474                                  u32 op, u32 r, u32 a, u32 x, u32 y)
475 {
476         u_int32_t *code;
477         if (snd_BUG_ON(*ptr >= 512))
478                 return;
479         code = (u_int32_t __force *)icode->code + (*ptr) * 2;
480         set_bit(*ptr, icode->code_valid);
481         code[0] = ((x & 0x3ff) << 10) | (y & 0x3ff);
482         code[1] = ((op & 0x0f) << 20) | ((r & 0x3ff) << 10) | (a & 0x3ff);
483         (*ptr)++;
484 }
485
486 #define OP(icode, ptr, op, r, a, x, y) \
487         snd_emu10k1_write_op(icode, ptr, op, r, a, x, y)
488
489 static void snd_emu10k1_audigy_write_op(struct snd_emu10k1_fx8010_code *icode,
490                                         unsigned int *ptr,
491                                         u32 op, u32 r, u32 a, u32 x, u32 y)
492 {
493         u_int32_t *code;
494         if (snd_BUG_ON(*ptr >= 1024))
495                 return;
496         code = (u_int32_t __force *)icode->code + (*ptr) * 2;
497         set_bit(*ptr, icode->code_valid);
498         code[0] = ((x & 0x7ff) << 12) | (y & 0x7ff);
499         code[1] = ((op & 0x0f) << 24) | ((r & 0x7ff) << 12) | (a & 0x7ff);
500         (*ptr)++;
501 }
502
503 #define A_OP(icode, ptr, op, r, a, x, y) \
504         snd_emu10k1_audigy_write_op(icode, ptr, op, r, a, x, y)
505
506 static void snd_emu10k1_efx_write(struct snd_emu10k1 *emu, unsigned int pc, unsigned int data)
507 {
508         pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;
509         snd_emu10k1_ptr_write(emu, pc, 0, data);
510 }
511
512 unsigned int snd_emu10k1_efx_read(struct snd_emu10k1 *emu, unsigned int pc)
513 {
514         pc += emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;
515         return snd_emu10k1_ptr_read(emu, pc, 0);
516 }
517
518 static int snd_emu10k1_gpr_poke(struct snd_emu10k1 *emu,
519                                 struct snd_emu10k1_fx8010_code *icode,
520                                 bool in_kernel)
521 {
522         int gpr;
523         u32 val;
524
525         for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) {
526                 if (!test_bit(gpr, icode->gpr_valid))
527                         continue;
528                 if (in_kernel)
529                         val = *(u32 *)&icode->gpr_map[gpr];
530                 else if (get_user(val, &icode->gpr_map[gpr]))
531                         return -EFAULT;
532                 snd_emu10k1_ptr_write(emu, emu->gpr_base + gpr, 0, val);
533         }
534         return 0;
535 }
536
537 static int snd_emu10k1_gpr_peek(struct snd_emu10k1 *emu,
538                                 struct snd_emu10k1_fx8010_code *icode)
539 {
540         int gpr;
541         u32 val;
542
543         for (gpr = 0; gpr < (emu->audigy ? 0x200 : 0x100); gpr++) {
544                 set_bit(gpr, icode->gpr_valid);
545                 val = snd_emu10k1_ptr_read(emu, emu->gpr_base + gpr, 0);
546                 if (put_user(val, &icode->gpr_map[gpr]))
547                         return -EFAULT;
548         }
549         return 0;
550 }
551
552 static int snd_emu10k1_tram_poke(struct snd_emu10k1 *emu,
553                                  struct snd_emu10k1_fx8010_code *icode,
554                                  bool in_kernel)
555 {
556         int tram;
557         u32 addr, val;
558
559         for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) {
560                 if (!test_bit(tram, icode->tram_valid))
561                         continue;
562                 if (in_kernel) {
563                         val = *(u32 *)&icode->tram_data_map[tram];
564                         addr = *(u32 *)&icode->tram_addr_map[tram];
565                 } else {
566                         if (get_user(val, &icode->tram_data_map[tram]) ||
567                             get_user(addr, &icode->tram_addr_map[tram]))
568                                 return -EFAULT;
569                 }
570                 snd_emu10k1_ptr_write(emu, TANKMEMDATAREGBASE + tram, 0, val);
571                 if (!emu->audigy) {
572                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + tram, 0, addr);
573                 } else {
574                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + tram, 0, addr << 12);
575                         snd_emu10k1_ptr_write(emu, A_TANKMEMCTLREGBASE + tram, 0, addr >> 20);
576                 }
577         }
578         return 0;
579 }
580
581 static int snd_emu10k1_tram_peek(struct snd_emu10k1 *emu,
582                                  struct snd_emu10k1_fx8010_code *icode)
583 {
584         int tram;
585         u32 val, addr;
586
587         memset(icode->tram_valid, 0, sizeof(icode->tram_valid));
588         for (tram = 0; tram < (emu->audigy ? 0x100 : 0xa0); tram++) {
589                 set_bit(tram, icode->tram_valid);
590                 val = snd_emu10k1_ptr_read(emu, TANKMEMDATAREGBASE + tram, 0);
591                 if (!emu->audigy) {
592                         addr = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + tram, 0);
593                 } else {
594                         addr = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + tram, 0) >> 12;
595                         addr |= snd_emu10k1_ptr_read(emu, A_TANKMEMCTLREGBASE + tram, 0) << 20;
596                 }
597                 if (put_user(val, &icode->tram_data_map[tram]) ||
598                     put_user(addr, &icode->tram_addr_map[tram]))
599                         return -EFAULT;
600         }
601         return 0;
602 }
603
604 static int snd_emu10k1_code_poke(struct snd_emu10k1 *emu,
605                                  struct snd_emu10k1_fx8010_code *icode,
606                                  bool in_kernel)
607 {
608         u32 pc, lo, hi;
609
610         for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) {
611                 if (!test_bit(pc / 2, icode->code_valid))
612                         continue;
613                 if (in_kernel) {
614                         lo = *(u32 *)&icode->code[pc + 0];
615                         hi = *(u32 *)&icode->code[pc + 1];
616                 } else {
617                         if (get_user(lo, &icode->code[pc + 0]) ||
618                             get_user(hi, &icode->code[pc + 1]))
619                                 return -EFAULT;
620                 }
621                 snd_emu10k1_efx_write(emu, pc + 0, lo);
622                 snd_emu10k1_efx_write(emu, pc + 1, hi);
623         }
624         return 0;
625 }
626
627 static int snd_emu10k1_code_peek(struct snd_emu10k1 *emu,
628                                  struct snd_emu10k1_fx8010_code *icode)
629 {
630         u32 pc;
631
632         memset(icode->code_valid, 0, sizeof(icode->code_valid));
633         for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) {
634                 set_bit(pc / 2, icode->code_valid);
635                 if (put_user(snd_emu10k1_efx_read(emu, pc + 0), &icode->code[pc + 0]))
636                         return -EFAULT;
637                 if (put_user(snd_emu10k1_efx_read(emu, pc + 1), &icode->code[pc + 1]))
638                         return -EFAULT;
639         }
640         return 0;
641 }
642
643 static struct snd_emu10k1_fx8010_ctl *
644 snd_emu10k1_look_for_ctl(struct snd_emu10k1 *emu, struct snd_ctl_elem_id *id)
645 {
646         struct snd_emu10k1_fx8010_ctl *ctl;
647         struct snd_kcontrol *kcontrol;
648
649         list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) {
650                 kcontrol = ctl->kcontrol;
651                 if (kcontrol->id.iface == id->iface &&
652                     !strcmp(kcontrol->id.name, id->name) &&
653                     kcontrol->id.index == id->index)
654                         return ctl;
655         }
656         return NULL;
657 }
658
659 #define MAX_TLV_SIZE    256
660
661 static unsigned int *copy_tlv(const unsigned int __user *_tlv, bool in_kernel)
662 {
663         unsigned int data[2];
664         unsigned int *tlv;
665
666         if (!_tlv)
667                 return NULL;
668         if (in_kernel)
669                 memcpy(data, (void *)_tlv, sizeof(data));
670         else if (copy_from_user(data, _tlv, sizeof(data)))
671                 return NULL;
672         if (data[1] >= MAX_TLV_SIZE)
673                 return NULL;
674         tlv = kmalloc(data[1] + sizeof(data), GFP_KERNEL);
675         if (!tlv)
676                 return NULL;
677         memcpy(tlv, data, sizeof(data));
678         if (in_kernel) {
679                 memcpy(tlv + 2, (void *)(_tlv + 2),  data[1]);
680         } else if (copy_from_user(tlv + 2, _tlv + 2, data[1])) {
681                 kfree(tlv);
682                 return NULL;
683         }
684         return tlv;
685 }
686
687 static int copy_gctl(struct snd_emu10k1 *emu,
688                      struct snd_emu10k1_fx8010_control_gpr *gctl,
689                      struct snd_emu10k1_fx8010_control_gpr __user *_gctl,
690                      int idx, bool in_kernel)
691 {
692         struct snd_emu10k1_fx8010_control_old_gpr __user *octl;
693
694         if (emu->support_tlv) {
695                 if (in_kernel)
696                         memcpy(gctl, (void *)&_gctl[idx], sizeof(*gctl));
697                 else if (copy_from_user(gctl, &_gctl[idx], sizeof(*gctl)))
698                         return -EFAULT;
699                 return 0;
700         }
701
702         octl = (struct snd_emu10k1_fx8010_control_old_gpr __user *)_gctl;
703         if (in_kernel)
704                 memcpy(gctl, (void *)&octl[idx], sizeof(*octl));
705         else if (copy_from_user(gctl, &octl[idx], sizeof(*octl)))
706                 return -EFAULT;
707         gctl->tlv = NULL;
708         return 0;
709 }
710
711 static int copy_gctl_to_user(struct snd_emu10k1 *emu,
712                      struct snd_emu10k1_fx8010_control_gpr __user *_gctl,
713                      struct snd_emu10k1_fx8010_control_gpr *gctl,
714                      int idx)
715 {
716         struct snd_emu10k1_fx8010_control_old_gpr __user *octl;
717
718         if (emu->support_tlv)
719                 return copy_to_user(&_gctl[idx], gctl, sizeof(*gctl));
720         
721         octl = (struct snd_emu10k1_fx8010_control_old_gpr __user *)_gctl;
722         return copy_to_user(&octl[idx], gctl, sizeof(*octl));
723 }
724
725 static int snd_emu10k1_verify_controls(struct snd_emu10k1 *emu,
726                                        struct snd_emu10k1_fx8010_code *icode,
727                                        bool in_kernel)
728 {
729         unsigned int i;
730         struct snd_ctl_elem_id __user *_id;
731         struct snd_ctl_elem_id id;
732         struct snd_emu10k1_fx8010_control_gpr *gctl;
733         int err;
734         
735         for (i = 0, _id = icode->gpr_del_controls;
736              i < icode->gpr_del_control_count; i++, _id++) {
737                 if (in_kernel)
738                         id = *(struct snd_ctl_elem_id *)_id;
739                 else if (copy_from_user(&id, _id, sizeof(id)))
740                         return -EFAULT;
741                 if (snd_emu10k1_look_for_ctl(emu, &id) == NULL)
742                         return -ENOENT;
743         }
744         gctl = kmalloc(sizeof(*gctl), GFP_KERNEL);
745         if (! gctl)
746                 return -ENOMEM;
747         err = 0;
748         for (i = 0; i < icode->gpr_add_control_count; i++) {
749                 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i,
750                               in_kernel)) {
751                         err = -EFAULT;
752                         goto __error;
753                 }
754                 if (snd_emu10k1_look_for_ctl(emu, &gctl->id))
755                         continue;
756                 down_read(&emu->card->controls_rwsem);
757                 if (snd_ctl_find_id(emu->card, &gctl->id) != NULL) {
758                         up_read(&emu->card->controls_rwsem);
759                         err = -EEXIST;
760                         goto __error;
761                 }
762                 up_read(&emu->card->controls_rwsem);
763                 if (gctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER &&
764                     gctl->id.iface != SNDRV_CTL_ELEM_IFACE_PCM) {
765                         err = -EINVAL;
766                         goto __error;
767                 }
768         }
769         for (i = 0; i < icode->gpr_list_control_count; i++) {
770                 /* FIXME: we need to check the WRITE access */
771                 if (copy_gctl(emu, gctl, icode->gpr_list_controls, i,
772                               in_kernel)) {
773                         err = -EFAULT;
774                         goto __error;
775                 }
776         }
777  __error:
778         kfree(gctl);
779         return err;
780 }
781
782 static void snd_emu10k1_ctl_private_free(struct snd_kcontrol *kctl)
783 {
784         struct snd_emu10k1_fx8010_ctl *ctl;
785         
786         ctl = (struct snd_emu10k1_fx8010_ctl *) kctl->private_value;
787         kctl->private_value = 0;
788         list_del(&ctl->list);
789         kfree(ctl);
790         kfree(kctl->tlv.p);
791 }
792
793 static int snd_emu10k1_add_controls(struct snd_emu10k1 *emu,
794                                     struct snd_emu10k1_fx8010_code *icode,
795                                     bool in_kernel)
796 {
797         unsigned int i, j;
798         struct snd_emu10k1_fx8010_control_gpr *gctl;
799         struct snd_emu10k1_fx8010_ctl *ctl, *nctl;
800         struct snd_kcontrol_new knew;
801         struct snd_kcontrol *kctl;
802         struct snd_ctl_elem_value *val;
803         int err = 0;
804
805         val = kmalloc(sizeof(*val), GFP_KERNEL);
806         gctl = kmalloc(sizeof(*gctl), GFP_KERNEL);
807         nctl = kmalloc(sizeof(*nctl), GFP_KERNEL);
808         if (!val || !gctl || !nctl) {
809                 err = -ENOMEM;
810                 goto __error;
811         }
812
813         for (i = 0; i < icode->gpr_add_control_count; i++) {
814                 if (copy_gctl(emu, gctl, icode->gpr_add_controls, i,
815                               in_kernel)) {
816                         err = -EFAULT;
817                         goto __error;
818                 }
819                 if (gctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER &&
820                     gctl->id.iface != SNDRV_CTL_ELEM_IFACE_PCM) {
821                         err = -EINVAL;
822                         goto __error;
823                 }
824                 if (! gctl->id.name[0]) {
825                         err = -EINVAL;
826                         goto __error;
827                 }
828                 ctl = snd_emu10k1_look_for_ctl(emu, &gctl->id);
829                 memset(&knew, 0, sizeof(knew));
830                 knew.iface = gctl->id.iface;
831                 knew.name = gctl->id.name;
832                 knew.index = gctl->id.index;
833                 knew.device = gctl->id.device;
834                 knew.subdevice = gctl->id.subdevice;
835                 knew.info = snd_emu10k1_gpr_ctl_info;
836                 knew.tlv.p = copy_tlv(gctl->tlv, in_kernel);
837                 if (knew.tlv.p)
838                         knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
839                                 SNDRV_CTL_ELEM_ACCESS_TLV_READ;
840                 knew.get = snd_emu10k1_gpr_ctl_get;
841                 knew.put = snd_emu10k1_gpr_ctl_put;
842                 memset(nctl, 0, sizeof(*nctl));
843                 nctl->vcount = gctl->vcount;
844                 nctl->count = gctl->count;
845                 for (j = 0; j < 32; j++) {
846                         nctl->gpr[j] = gctl->gpr[j];
847                         nctl->value[j] = ~gctl->value[j];       /* inverted, we want to write new value in gpr_ctl_put() */
848                         val->value.integer.value[j] = gctl->value[j];
849                 }
850                 nctl->min = gctl->min;
851                 nctl->max = gctl->max;
852                 nctl->translation = gctl->translation;
853                 if (ctl == NULL) {
854                         ctl = kmalloc(sizeof(*ctl), GFP_KERNEL);
855                         if (ctl == NULL) {
856                                 err = -ENOMEM;
857                                 kfree(knew.tlv.p);
858                                 goto __error;
859                         }
860                         knew.private_value = (unsigned long)ctl;
861                         *ctl = *nctl;
862                         if ((err = snd_ctl_add(emu->card, kctl = snd_ctl_new1(&knew, emu))) < 0) {
863                                 kfree(ctl);
864                                 kfree(knew.tlv.p);
865                                 goto __error;
866                         }
867                         kctl->private_free = snd_emu10k1_ctl_private_free;
868                         ctl->kcontrol = kctl;
869                         list_add_tail(&ctl->list, &emu->fx8010.gpr_ctl);
870                 } else {
871                         /* overwrite */
872                         nctl->list = ctl->list;
873                         nctl->kcontrol = ctl->kcontrol;
874                         *ctl = *nctl;
875                         snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE |
876                                                   SNDRV_CTL_EVENT_MASK_INFO, &ctl->kcontrol->id);
877                 }
878                 snd_emu10k1_gpr_ctl_put(ctl->kcontrol, val);
879         }
880       __error:
881         kfree(nctl);
882         kfree(gctl);
883         kfree(val);
884         return err;
885 }
886
887 static int snd_emu10k1_del_controls(struct snd_emu10k1 *emu,
888                                     struct snd_emu10k1_fx8010_code *icode,
889                                     bool in_kernel)
890 {
891         unsigned int i;
892         struct snd_ctl_elem_id id;
893         struct snd_ctl_elem_id __user *_id;
894         struct snd_emu10k1_fx8010_ctl *ctl;
895         struct snd_card *card = emu->card;
896         
897         for (i = 0, _id = icode->gpr_del_controls;
898              i < icode->gpr_del_control_count; i++, _id++) {
899                 if (in_kernel)
900                         id = *(struct snd_ctl_elem_id *)_id;
901                 else if (copy_from_user(&id, _id, sizeof(id)))
902                         return -EFAULT;
903                 down_write(&card->controls_rwsem);
904                 ctl = snd_emu10k1_look_for_ctl(emu, &id);
905                 if (ctl)
906                         snd_ctl_remove(card, ctl->kcontrol);
907                 up_write(&card->controls_rwsem);
908         }
909         return 0;
910 }
911
912 static int snd_emu10k1_list_controls(struct snd_emu10k1 *emu,
913                                      struct snd_emu10k1_fx8010_code *icode)
914 {
915         unsigned int i = 0, j;
916         unsigned int total = 0;
917         struct snd_emu10k1_fx8010_control_gpr *gctl;
918         struct snd_emu10k1_fx8010_ctl *ctl;
919         struct snd_ctl_elem_id *id;
920
921         gctl = kmalloc(sizeof(*gctl), GFP_KERNEL);
922         if (! gctl)
923                 return -ENOMEM;
924
925         list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) {
926                 total++;
927                 if (icode->gpr_list_controls &&
928                     i < icode->gpr_list_control_count) {
929                         memset(gctl, 0, sizeof(*gctl));
930                         id = &ctl->kcontrol->id;
931                         gctl->id.iface = id->iface;
932                         strlcpy(gctl->id.name, id->name, sizeof(gctl->id.name));
933                         gctl->id.index = id->index;
934                         gctl->id.device = id->device;
935                         gctl->id.subdevice = id->subdevice;
936                         gctl->vcount = ctl->vcount;
937                         gctl->count = ctl->count;
938                         for (j = 0; j < 32; j++) {
939                                 gctl->gpr[j] = ctl->gpr[j];
940                                 gctl->value[j] = ctl->value[j];
941                         }
942                         gctl->min = ctl->min;
943                         gctl->max = ctl->max;
944                         gctl->translation = ctl->translation;
945                         if (copy_gctl_to_user(emu, icode->gpr_list_controls,
946                                               gctl, i)) {
947                                 kfree(gctl);
948                                 return -EFAULT;
949                         }
950                         i++;
951                 }
952         }
953         icode->gpr_list_control_total = total;
954         kfree(gctl);
955         return 0;
956 }
957
958 static int snd_emu10k1_icode_poke(struct snd_emu10k1 *emu,
959                                   struct snd_emu10k1_fx8010_code *icode,
960                                   bool in_kernel)
961 {
962         int err = 0;
963
964         mutex_lock(&emu->fx8010.lock);
965         err = snd_emu10k1_verify_controls(emu, icode, in_kernel);
966         if (err < 0)
967                 goto __error;
968         strlcpy(emu->fx8010.name, icode->name, sizeof(emu->fx8010.name));
969         /* stop FX processor - this may be dangerous, but it's better to miss
970            some samples than generate wrong ones - [jk] */
971         if (emu->audigy)
972                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP);
973         else
974                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP);
975         /* ok, do the main job */
976         err = snd_emu10k1_del_controls(emu, icode, in_kernel);
977         if (err < 0)
978                 goto __error;
979         err = snd_emu10k1_gpr_poke(emu, icode, in_kernel);
980         if (err < 0)
981                 goto __error;
982         err = snd_emu10k1_tram_poke(emu, icode, in_kernel);
983         if (err < 0)
984                 goto __error;
985         err = snd_emu10k1_code_poke(emu, icode, in_kernel);
986         if (err < 0)
987                 goto __error;
988         err = snd_emu10k1_add_controls(emu, icode, in_kernel);
989         if (err < 0)
990                 goto __error;
991         /* start FX processor when the DSP code is updated */
992         if (emu->audigy)
993                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
994         else
995                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
996       __error:
997         mutex_unlock(&emu->fx8010.lock);
998         return err;
999 }
1000
1001 static int snd_emu10k1_icode_peek(struct snd_emu10k1 *emu,
1002                                   struct snd_emu10k1_fx8010_code *icode)
1003 {
1004         int err;
1005
1006         mutex_lock(&emu->fx8010.lock);
1007         strlcpy(icode->name, emu->fx8010.name, sizeof(icode->name));
1008         /* ok, do the main job */
1009         err = snd_emu10k1_gpr_peek(emu, icode);
1010         if (err >= 0)
1011                 err = snd_emu10k1_tram_peek(emu, icode);
1012         if (err >= 0)
1013                 err = snd_emu10k1_code_peek(emu, icode);
1014         if (err >= 0)
1015                 err = snd_emu10k1_list_controls(emu, icode);
1016         mutex_unlock(&emu->fx8010.lock);
1017         return err;
1018 }
1019
1020 static int snd_emu10k1_ipcm_poke(struct snd_emu10k1 *emu,
1021                                  struct snd_emu10k1_fx8010_pcm_rec *ipcm)
1022 {
1023         unsigned int i;
1024         int err = 0;
1025         struct snd_emu10k1_fx8010_pcm *pcm;
1026
1027         if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
1028                 return -EINVAL;
1029         if (ipcm->channels > 32)
1030                 return -EINVAL;
1031         pcm = &emu->fx8010.pcm[ipcm->substream];
1032         mutex_lock(&emu->fx8010.lock);
1033         spin_lock_irq(&emu->reg_lock);
1034         if (pcm->opened) {
1035                 err = -EBUSY;
1036                 goto __error;
1037         }
1038         if (ipcm->channels == 0) {      /* remove */
1039                 pcm->valid = 0;
1040         } else {
1041                 /* FIXME: we need to add universal code to the PCM transfer routine */
1042                 if (ipcm->channels != 2) {
1043                         err = -EINVAL;
1044                         goto __error;
1045                 }
1046                 pcm->valid = 1;
1047                 pcm->opened = 0;
1048                 pcm->channels = ipcm->channels;
1049                 pcm->tram_start = ipcm->tram_start;
1050                 pcm->buffer_size = ipcm->buffer_size;
1051                 pcm->gpr_size = ipcm->gpr_size;
1052                 pcm->gpr_count = ipcm->gpr_count;
1053                 pcm->gpr_tmpcount = ipcm->gpr_tmpcount;
1054                 pcm->gpr_ptr = ipcm->gpr_ptr;
1055                 pcm->gpr_trigger = ipcm->gpr_trigger;
1056                 pcm->gpr_running = ipcm->gpr_running;
1057                 for (i = 0; i < pcm->channels; i++)
1058                         pcm->etram[i] = ipcm->etram[i];
1059         }
1060       __error:
1061         spin_unlock_irq(&emu->reg_lock);
1062         mutex_unlock(&emu->fx8010.lock);
1063         return err;
1064 }
1065
1066 static int snd_emu10k1_ipcm_peek(struct snd_emu10k1 *emu,
1067                                  struct snd_emu10k1_fx8010_pcm_rec *ipcm)
1068 {
1069         unsigned int i;
1070         int err = 0;
1071         struct snd_emu10k1_fx8010_pcm *pcm;
1072
1073         if (ipcm->substream >= EMU10K1_FX8010_PCM_COUNT)
1074                 return -EINVAL;
1075         pcm = &emu->fx8010.pcm[ipcm->substream];
1076         mutex_lock(&emu->fx8010.lock);
1077         spin_lock_irq(&emu->reg_lock);
1078         ipcm->channels = pcm->channels;
1079         ipcm->tram_start = pcm->tram_start;
1080         ipcm->buffer_size = pcm->buffer_size;
1081         ipcm->gpr_size = pcm->gpr_size;
1082         ipcm->gpr_ptr = pcm->gpr_ptr;
1083         ipcm->gpr_count = pcm->gpr_count;
1084         ipcm->gpr_tmpcount = pcm->gpr_tmpcount;
1085         ipcm->gpr_trigger = pcm->gpr_trigger;
1086         ipcm->gpr_running = pcm->gpr_running;
1087         for (i = 0; i < pcm->channels; i++)
1088                 ipcm->etram[i] = pcm->etram[i];
1089         ipcm->res1 = ipcm->res2 = 0;
1090         ipcm->pad = 0;
1091         spin_unlock_irq(&emu->reg_lock);
1092         mutex_unlock(&emu->fx8010.lock);
1093         return err;
1094 }
1095
1096 #define SND_EMU10K1_GPR_CONTROLS        44
1097 #define SND_EMU10K1_INPUTS              12
1098 #define SND_EMU10K1_PLAYBACK_CHANNELS   8
1099 #define SND_EMU10K1_CAPTURE_CHANNELS    4
1100
1101 static void
1102 snd_emu10k1_init_mono_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1103                               const char *name, int gpr, int defval)
1104 {
1105         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1106         strcpy(ctl->id.name, name);
1107         ctl->vcount = ctl->count = 1;
1108         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1109         if (high_res_gpr_volume) {
1110                 ctl->min = 0;
1111                 ctl->max = 0x7fffffff;
1112                 ctl->tlv = snd_emu10k1_db_linear;
1113                 ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
1114         } else {
1115                 ctl->min = 0;
1116                 ctl->max = 100;
1117                 ctl->tlv = snd_emu10k1_db_scale1;
1118                 ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
1119         }
1120 }
1121
1122 static void
1123 snd_emu10k1_init_stereo_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1124                                 const char *name, int gpr, int defval)
1125 {
1126         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1127         strcpy(ctl->id.name, name);
1128         ctl->vcount = ctl->count = 2;
1129         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1130         ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;
1131         if (high_res_gpr_volume) {
1132                 ctl->min = 0;
1133                 ctl->max = 0x7fffffff;
1134                 ctl->tlv = snd_emu10k1_db_linear;
1135                 ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
1136         } else {
1137                 ctl->min = 0;
1138                 ctl->max = 100;
1139                 ctl->tlv = snd_emu10k1_db_scale1;
1140                 ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
1141         }
1142 }
1143
1144 static void
1145 snd_emu10k1_init_mono_onoff_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1146                                     const char *name, int gpr, int defval)
1147 {
1148         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1149         strcpy(ctl->id.name, name);
1150         ctl->vcount = ctl->count = 1;
1151         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1152         ctl->min = 0;
1153         ctl->max = 1;
1154         ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
1155 }
1156
1157 static void
1158 snd_emu10k1_init_stereo_onoff_control(struct snd_emu10k1_fx8010_control_gpr *ctl,
1159                                       const char *name, int gpr, int defval)
1160 {
1161         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1162         strcpy(ctl->id.name, name);
1163         ctl->vcount = ctl->count = 2;
1164         ctl->gpr[0] = gpr + 0; ctl->value[0] = defval;
1165         ctl->gpr[1] = gpr + 1; ctl->value[1] = defval;
1166         ctl->min = 0;
1167         ctl->max = 1;
1168         ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
1169 }
1170
1171 /*
1172  * Used for emu1010 - conversion from 32-bit capture inputs from HANA
1173  * to 2 x 16-bit registers in audigy - their values are read via DMA.
1174  * Conversion is performed by Audigy DSP instructions of FX8010.
1175  */
1176 static int snd_emu10k1_audigy_dsp_convert_32_to_2x16(
1177                                 struct snd_emu10k1_fx8010_code *icode,
1178                                 u32 *ptr, int tmp, int bit_shifter16,
1179                                 int reg_in, int reg_out)
1180 {
1181         A_OP(icode, ptr, iACC3, A_GPR(tmp + 1), reg_in, A_C_00000000, A_C_00000000);
1182         A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp + 1), A_GPR(bit_shifter16 - 1), A_C_00000000);
1183         A_OP(icode, ptr, iTSTNEG, A_GPR(tmp + 2), A_GPR(tmp), A_C_80000000, A_GPR(bit_shifter16 - 2));
1184         A_OP(icode, ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_C_80000000, A_C_00000000);
1185         A_OP(icode, ptr, iANDXOR, A_GPR(tmp), A_GPR(tmp), A_GPR(bit_shifter16 - 3), A_C_00000000);
1186         A_OP(icode, ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A_GPR(tmp), A_C_00010000);
1187         A_OP(icode, ptr, iANDXOR, reg_out, A_GPR(tmp), A_C_ffffffff, A_GPR(tmp + 2));
1188         A_OP(icode, ptr, iACC3, reg_out + 1, A_GPR(tmp + 1), A_C_00000000, A_C_00000000);
1189         return 1;
1190 }
1191
1192 /*
1193  * initial DSP configuration for Audigy
1194  */
1195
1196 static int _snd_emu10k1_audigy_init_efx(struct snd_emu10k1 *emu)
1197 {
1198         int err, i, z, gpr, nctl;
1199         int bit_shifter16;
1200         const int playback = 10;
1201         const int capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2); /* we reserve 10 voices */
1202         const int stereo_mix = capture + 2;
1203         const int tmp = 0x88;
1204         u32 ptr;
1205         struct snd_emu10k1_fx8010_code *icode = NULL;
1206         struct snd_emu10k1_fx8010_control_gpr *controls = NULL, *ctl;
1207         u32 *gpr_map;
1208
1209         err = -ENOMEM;
1210         icode = kzalloc(sizeof(*icode), GFP_KERNEL);
1211         if (!icode)
1212                 return err;
1213
1214         icode->gpr_map = (u_int32_t __user *) kcalloc(512 + 256 + 256 + 2 * 1024,
1215                                                       sizeof(u_int32_t), GFP_KERNEL);
1216         if (!icode->gpr_map)
1217                 goto __err_gpr;
1218         controls = kcalloc(SND_EMU10K1_GPR_CONTROLS,
1219                            sizeof(*controls), GFP_KERNEL);
1220         if (!controls)
1221                 goto __err_ctrls;
1222
1223         gpr_map = (u32 __force *)icode->gpr_map;
1224
1225         icode->tram_data_map = icode->gpr_map + 512;
1226         icode->tram_addr_map = icode->tram_data_map + 256;
1227         icode->code = icode->tram_addr_map + 256;
1228
1229         /* clear free GPRs */
1230         for (i = 0; i < 512; i++)
1231                 set_bit(i, icode->gpr_valid);
1232                 
1233         /* clear TRAM data & address lines */
1234         for (i = 0; i < 256; i++)
1235                 set_bit(i, icode->tram_valid);
1236
1237         strcpy(icode->name, "Audigy DSP code for ALSA");
1238         ptr = 0;
1239         nctl = 0;
1240         gpr = stereo_mix + 10;
1241         gpr_map[gpr++] = 0x00007fff;
1242         gpr_map[gpr++] = 0x00008000;
1243         gpr_map[gpr++] = 0x0000ffff;
1244         bit_shifter16 = gpr;
1245
1246         /* stop FX processor */
1247         snd_emu10k1_ptr_write(emu, A_DBG, 0, (emu->fx8010.dbg = 0) | A_DBG_SINGLE_STEP);
1248
1249 #if 1
1250         /* PCM front Playback Volume (independent from stereo mix)
1251          * playback = 0 + ( gpr * FXBUS_PCM_LEFT_FRONT >> 31)
1252          * where gpr contains attenuation from corresponding mixer control
1253          * (snd_emu10k1_init_stereo_control)
1254          */
1255         A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_FRONT));
1256         A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_FRONT));
1257         snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Front Playback Volume", gpr, 100);
1258         gpr += 2;
1259
1260         /* PCM Surround Playback (independent from stereo mix) */
1261         A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_REAR));
1262         A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_REAR));
1263         snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Surround Playback Volume", gpr, 100);
1264         gpr += 2;
1265         
1266         /* PCM Side Playback (independent from stereo mix) */
1267         if (emu->card_capabilities->spk71) {
1268                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+6), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT_SIDE));
1269                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+7), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT_SIDE));
1270                 snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Side Playback Volume", gpr, 100);
1271                 gpr += 2;
1272         }
1273
1274         /* PCM Center Playback (independent from stereo mix) */
1275         A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_CENTER));
1276         snd_emu10k1_init_mono_control(&controls[nctl++], "PCM Center Playback Volume", gpr, 100);
1277         gpr++;
1278
1279         /* PCM LFE Playback (independent from stereo mix) */
1280         A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LFE));
1281         snd_emu10k1_init_mono_control(&controls[nctl++], "PCM LFE Playback Volume", gpr, 100);
1282         gpr++;
1283         
1284         /*
1285          * Stereo Mix
1286          */
1287         /* Wave (PCM) Playback Volume (will be renamed later) */
1288         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
1289         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
1290         snd_emu10k1_init_stereo_control(&controls[nctl++], "Wave Playback Volume", gpr, 100);
1291         gpr += 2;
1292
1293         /* Synth Playback */
1294         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+0), A_GPR(stereo_mix+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));
1295         A_OP(icode, &ptr, iMAC0, A_GPR(stereo_mix+1), A_GPR(stereo_mix+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));
1296         snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Playback Volume", gpr, 100);
1297         gpr += 2;
1298
1299         /* Wave (PCM) Capture */
1300         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_C_00000000, A_GPR(gpr), A_FXBUS(FXBUS_PCM_LEFT));
1301         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_C_00000000, A_GPR(gpr+1), A_FXBUS(FXBUS_PCM_RIGHT));
1302         snd_emu10k1_init_stereo_control(&controls[nctl++], "PCM Capture Volume", gpr, 0);
1303         gpr += 2;
1304
1305         /* Synth Capture */
1306         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_FXBUS(FXBUS_MIDI_LEFT));
1307         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_FXBUS(FXBUS_MIDI_RIGHT));
1308         snd_emu10k1_init_stereo_control(&controls[nctl++], "Synth Capture Volume", gpr, 0);
1309         gpr += 2;
1310       
1311         /*
1312          * inputs
1313          */
1314 #define A_ADD_VOLUME_IN(var,vol,input) \
1315 A_OP(icode, &ptr, iMAC0, A_GPR(var), A_GPR(var), A_GPR(vol), A_EXTIN(input))
1316
1317         /* emu1212 DSP 0 and DSP 1 Capture */
1318         if (emu->card_capabilities->emu_model) {
1319                 if (emu->card_capabilities->ca0108_chip) {
1320                         /* Note:JCD:No longer bit shift lower 16bits to upper 16bits of 32bit value. */
1321                         A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x0), A_C_00000001);
1322                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_GPR(tmp));
1323                         A_OP(icode, &ptr, iMACINT0, A_GPR(tmp), A_C_00000000, A3_EMU32IN(0x1), A_C_00000001);
1324                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr), A_GPR(tmp));
1325                 } else {
1326                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+0), A_GPR(capture+0), A_GPR(gpr), A_P16VIN(0x0));
1327                         A_OP(icode, &ptr, iMAC0, A_GPR(capture+1), A_GPR(capture+1), A_GPR(gpr+1), A_P16VIN(0x1));
1328                 }
1329                 snd_emu10k1_init_stereo_control(&controls[nctl++], "EMU Capture Volume", gpr, 0);
1330                 gpr += 2;
1331         }
1332         /* AC'97 Playback Volume - used only for mic (renamed later) */
1333         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AC97_L);
1334         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AC97_R);
1335         snd_emu10k1_init_stereo_control(&controls[nctl++], "AMic Playback Volume", gpr, 0);
1336         gpr += 2;
1337         /* AC'97 Capture Volume - used only for mic */
1338         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AC97_L);
1339         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AC97_R);
1340         snd_emu10k1_init_stereo_control(&controls[nctl++], "Mic Capture Volume", gpr, 0);
1341         gpr += 2;
1342
1343         /* mic capture buffer */        
1344         A_OP(icode, &ptr, iINTERP, A_EXTOUT(A_EXTOUT_MIC_CAP), A_EXTIN(A_EXTIN_AC97_L), 0xcd, A_EXTIN(A_EXTIN_AC97_R));
1345
1346         /* Audigy CD Playback Volume */
1347         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_SPDIF_CD_L);
1348         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_SPDIF_CD_R);
1349         snd_emu10k1_init_stereo_control(&controls[nctl++],
1350                                         emu->card_capabilities->ac97_chip ? "Audigy CD Playback Volume" : "CD Playback Volume",
1351                                         gpr, 0);
1352         gpr += 2;
1353         /* Audigy CD Capture Volume */
1354         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_SPDIF_CD_L);
1355         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_SPDIF_CD_R);
1356         snd_emu10k1_init_stereo_control(&controls[nctl++],
1357                                         emu->card_capabilities->ac97_chip ? "Audigy CD Capture Volume" : "CD Capture Volume",
1358                                         gpr, 0);
1359         gpr += 2;
1360
1361         /* Optical SPDIF Playback Volume */
1362         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_OPT_SPDIF_L);
1363         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_OPT_SPDIF_R);
1364         snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",PLAYBACK,VOLUME), gpr, 0);
1365         gpr += 2;
1366         /* Optical SPDIF Capture Volume */
1367         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_OPT_SPDIF_L);
1368         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_OPT_SPDIF_R);
1369         snd_emu10k1_init_stereo_control(&controls[nctl++], SNDRV_CTL_NAME_IEC958("Optical ",CAPTURE,VOLUME), gpr, 0);
1370         gpr += 2;
1371
1372         /* Line2 Playback Volume */
1373         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_LINE2_L);
1374         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_LINE2_R);
1375         snd_emu10k1_init_stereo_control(&controls[nctl++],
1376                                         emu->card_capabilities->ac97_chip ? "Line2 Playback Volume" : "Line Playback Volume",
1377                                         gpr, 0);
1378         gpr += 2;
1379         /* Line2 Capture Volume */
1380         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_LINE2_L);
1381         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_LINE2_R);
1382         snd_emu10k1_init_stereo_control(&controls[nctl++],
1383                                         emu->card_capabilities->ac97_chip ? "Line2 Capture Volume" : "Line Capture Volume",
1384                                         gpr, 0);
1385         gpr += 2;
1386         
1387         /* Philips ADC Playback Volume */
1388         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_ADC_L);
1389         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_ADC_R);
1390         snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Playback Volume", gpr, 0);
1391         gpr += 2;
1392         /* Philips ADC Capture Volume */
1393         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_ADC_L);
1394         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_ADC_R);
1395         snd_emu10k1_init_stereo_control(&controls[nctl++], "Analog Mix Capture Volume", gpr, 0);
1396         gpr += 2;
1397
1398         /* Aux2 Playback Volume */
1399         A_ADD_VOLUME_IN(stereo_mix, gpr, A_EXTIN_AUX2_L);
1400         A_ADD_VOLUME_IN(stereo_mix+1, gpr+1, A_EXTIN_AUX2_R);
1401         snd_emu10k1_init_stereo_control(&controls[nctl++],
1402                                         emu->card_capabilities->ac97_chip ? "Aux2 Playback Volume" : "Aux Playback Volume",
1403                                         gpr, 0);
1404         gpr += 2;
1405         /* Aux2 Capture Volume */
1406         A_ADD_VOLUME_IN(capture, gpr, A_EXTIN_AUX2_L);
1407         A_ADD_VOLUME_IN(capture+1, gpr+1, A_EXTIN_AUX2_R);
1408         snd_emu10k1_init_stereo_control(&controls[nctl++],
1409                                         emu->card_capabilities->ac97_chip ? "Aux2 Capture Volume" : "Aux Capture Volume",
1410                                         gpr, 0);
1411         gpr += 2;
1412         
1413         /* Stereo Mix Front Playback Volume */
1414         A_OP(icode, &ptr, iMAC0, A_GPR(playback), A_GPR(playback), A_GPR(gpr), A_GPR(stereo_mix));
1415         A_OP(icode, &ptr, iMAC0, A_GPR(playback+1), A_GPR(playback+1), A_GPR(gpr+1), A_GPR(stereo_mix+1));
1416         snd_emu10k1_init_stereo_control(&controls[nctl++], "Front Playback Volume", gpr, 100);
1417         gpr += 2;
1418         
1419         /* Stereo Mix Surround Playback */
1420         A_OP(icode, &ptr, iMAC0, A_GPR(playback+2), A_GPR(playback+2), A_GPR(gpr), A_GPR(stereo_mix));
1421         A_OP(icode, &ptr, iMAC0, A_GPR(playback+3), A_GPR(playback+3), A_GPR(gpr+1), A_GPR(stereo_mix+1));
1422         snd_emu10k1_init_stereo_control(&controls[nctl++], "Surround Playback Volume", gpr, 0);
1423         gpr += 2;
1424
1425         /* Stereo Mix Center Playback */
1426         /* Center = sub = Left/2 + Right/2 */
1427         A_OP(icode, &ptr, iINTERP, A_GPR(tmp), A_GPR(stereo_mix), 0xcd, A_GPR(stereo_mix+1));
1428         A_OP(icode, &ptr, iMAC0, A_GPR(playback+4), A_GPR(playback+4), A_GPR(gpr), A_GPR(tmp));
1429         snd_emu10k1_init_mono_control(&controls[nctl++], "Center Playback Volume", gpr, 0);
1430         gpr++;
1431
1432         /* Stereo Mix LFE Playback */
1433         A_OP(icode, &ptr, iMAC0, A_GPR(playback+5), A_GPR(playback+5), A_GPR(gpr), A_GPR(tmp));
1434         snd_emu10k1_init_mono_control(&controls[nctl++], "LFE Playback Volume", gpr, 0);
1435         gpr++;
1436         
1437         if (emu->card_capabilities->spk71) {
1438                 /* Stereo Mix Side Playback */
1439                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+6), A_GPR(playback+6), A_GPR(gpr), A_GPR(stereo_mix));
1440                 A_OP(icode, &ptr, iMAC0, A_GPR(playback+7), A_GPR(playback+7), A_GPR(gpr+1), A_GPR(stereo_mix+1));
1441                 snd_emu10k1_init_stereo_control(&controls[nctl++], "Side Playback Volume", gpr, 0);
1442                 gpr += 2;
1443         }
1444
1445         /*
1446          * outputs
1447          */
1448 #define A_PUT_OUTPUT(out,src) A_OP(icode, &ptr, iACC3, A_EXTOUT(out), A_C_00000000, A_C_00000000, A_GPR(src))
1449 #define A_PUT_STEREO_OUTPUT(out1,out2,src) \
1450         {A_PUT_OUTPUT(out1,src); A_PUT_OUTPUT(out2,src+1);}
1451
1452 #define _A_SWITCH(icode, ptr, dst, src, sw) \
1453         A_OP((icode), ptr, iMACINT0, dst, A_C_00000000, src, sw);
1454 #define A_SWITCH(icode, ptr, dst, src, sw) \
1455                 _A_SWITCH(icode, ptr, A_GPR(dst), A_GPR(src), A_GPR(sw))
1456 #define _A_SWITCH_NEG(icode, ptr, dst, src) \
1457         A_OP((icode), ptr, iANDXOR, dst, src, A_C_00000001, A_C_00000001);
1458 #define A_SWITCH_NEG(icode, ptr, dst, src) \
1459                 _A_SWITCH_NEG(icode, ptr, A_GPR(dst), A_GPR(src))
1460
1461
1462         /*
1463          *  Process tone control
1464          */
1465         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), A_GPR(playback + 0), A_C_00000000, A_C_00000000); /* left */
1466         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), A_GPR(playback + 1), A_C_00000000, A_C_00000000); /* right */
1467         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 */
1468         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 */
1469         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), A_GPR(playback + 4), A_C_00000000, A_C_00000000); /* center */
1470         A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), A_GPR(playback + 5), A_C_00000000, A_C_00000000); /* LFE */
1471         if (emu->card_capabilities->spk71) {
1472                 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 */
1473                 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 */
1474         }
1475         
1476
1477         ctl = &controls[nctl + 0];
1478         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1479         strcpy(ctl->id.name, "Tone Control - Bass");
1480         ctl->vcount = 2;
1481         ctl->count = 10;
1482         ctl->min = 0;
1483         ctl->max = 40;
1484         ctl->value[0] = ctl->value[1] = 20;
1485         ctl->translation = EMU10K1_GPR_TRANSLATION_BASS;
1486         ctl = &controls[nctl + 1];
1487         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1488         strcpy(ctl->id.name, "Tone Control - Treble");
1489         ctl->vcount = 2;
1490         ctl->count = 10;
1491         ctl->min = 0;
1492         ctl->max = 40;
1493         ctl->value[0] = ctl->value[1] = 20;
1494         ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE;
1495
1496 #define BASS_GPR        0x8c
1497 #define TREBLE_GPR      0x96
1498
1499         for (z = 0; z < 5; z++) {
1500                 int j;
1501                 for (j = 0; j < 2; j++) {
1502                         controls[nctl + 0].gpr[z * 2 + j] = BASS_GPR + z * 2 + j;
1503                         controls[nctl + 1].gpr[z * 2 + j] = TREBLE_GPR + z * 2 + j;
1504                 }
1505         }
1506         for (z = 0; z < 4; z++) {               /* front/rear/center-lfe/side */
1507                 int j, k, l, d;
1508                 for (j = 0; j < 2; j++) {       /* left/right */
1509                         k = 0xb0 + (z * 8) + (j * 4);
1510                         l = 0xe0 + (z * 8) + (j * 4);
1511                         d = playback + SND_EMU10K1_PLAYBACK_CHANNELS + z * 2 + j;
1512
1513                         A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(d), A_GPR(BASS_GPR + 0 + j));
1514                         A_OP(icode, &ptr, iMACMV, A_GPR(k+1), A_GPR(k), A_GPR(k+1), A_GPR(BASS_GPR + 4 + j));
1515                         A_OP(icode, &ptr, iMACMV, A_GPR(k), A_GPR(d), A_GPR(k), A_GPR(BASS_GPR + 2 + j));
1516                         A_OP(icode, &ptr, iMACMV, A_GPR(k+3), A_GPR(k+2), A_GPR(k+3), A_GPR(BASS_GPR + 8 + j));
1517                         A_OP(icode, &ptr, iMAC0, A_GPR(k+2), A_GPR_ACCU, A_GPR(k+2), A_GPR(BASS_GPR + 6 + j));
1518                         A_OP(icode, &ptr, iACC3, A_GPR(k+2), A_GPR(k+2), A_GPR(k+2), A_C_00000000);
1519
1520                         A_OP(icode, &ptr, iMAC0, A_C_00000000, A_C_00000000, A_GPR(k+2), A_GPR(TREBLE_GPR + 0 + j));
1521                         A_OP(icode, &ptr, iMACMV, A_GPR(l+1), A_GPR(l), A_GPR(l+1), A_GPR(TREBLE_GPR + 4 + j));
1522                         A_OP(icode, &ptr, iMACMV, A_GPR(l), A_GPR(k+2), A_GPR(l), A_GPR(TREBLE_GPR + 2 + j));
1523                         A_OP(icode, &ptr, iMACMV, A_GPR(l+3), A_GPR(l+2), A_GPR(l+3), A_GPR(TREBLE_GPR + 8 + j));
1524                         A_OP(icode, &ptr, iMAC0, A_GPR(l+2), A_GPR_ACCU, A_GPR(l+2), A_GPR(TREBLE_GPR + 6 + j));
1525                         A_OP(icode, &ptr, iMACINT0, A_GPR(l+2), A_C_00000000, A_GPR(l+2), A_C_00000010);
1526
1527                         A_OP(icode, &ptr, iACC3, A_GPR(d), A_GPR(l+2), A_C_00000000, A_C_00000000);
1528
1529                         if (z == 2)     /* center */
1530                                 break;
1531                 }
1532         }
1533         nctl += 2;
1534
1535 #undef BASS_GPR
1536 #undef TREBLE_GPR
1537
1538         for (z = 0; z < 8; z++) {
1539                 A_SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, gpr + 0);
1540                 A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 0);
1541                 A_SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1);
1542                 A_OP(icode, &ptr, iACC3, A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
1543         }
1544         snd_emu10k1_init_stereo_onoff_control(controls + nctl++, "Tone Control - Switch", gpr, 0);
1545         gpr += 2;
1546
1547         /* Master volume (will be renamed later) */
1548         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));
1549         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));
1550         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));
1551         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));
1552         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));
1553         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));
1554         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));
1555         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));
1556         snd_emu10k1_init_mono_control(&controls[nctl++], "Wave Master Playback Volume", gpr, 0);
1557         gpr += 2;
1558
1559         /* analog speakers */
1560         A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
1561         A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
1562         A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
1563         A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
1564         if (emu->card_capabilities->spk71)
1565                 A_PUT_STEREO_OUTPUT(A_EXTOUT_ASIDE_L, A_EXTOUT_ASIDE_R, playback+6 + SND_EMU10K1_PLAYBACK_CHANNELS);
1566
1567         /* headphone */
1568         A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
1569
1570         /* digital outputs */
1571         /* A_PUT_STEREO_OUTPUT(A_EXTOUT_FRONT_L, A_EXTOUT_FRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS); */
1572         if (emu->card_capabilities->emu_model) {
1573                 /* EMU1010 Outputs from PCM Front, Rear, Center, LFE, Side */
1574                 dev_info(emu->card->dev, "EMU outputs on\n");
1575                 for (z = 0; z < 8; z++) {
1576                         if (emu->card_capabilities->ca0108_chip) {
1577                                 A_OP(icode, &ptr, iACC3, A3_EMU32OUT(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_C_00000000, A_C_00000000);
1578                         } else {
1579                                 A_OP(icode, &ptr, iACC3, A_EMU32OUTL(z), A_GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), A_C_00000000, A_C_00000000);
1580                         }
1581                 }
1582         }
1583
1584         /* IEC958 Optical Raw Playback Switch */ 
1585         gpr_map[gpr++] = 0;
1586         gpr_map[gpr++] = 0x1008;
1587         gpr_map[gpr++] = 0xffff0000;
1588         for (z = 0; z < 2; z++) {
1589                 A_OP(icode, &ptr, iMAC0, A_GPR(tmp + 2), A_FXBUS(FXBUS_PT_LEFT + z), A_C_00000000, A_C_00000000);
1590                 A_OP(icode, &ptr, iSKIP, A_GPR_COND, A_GPR_COND, A_GPR(gpr - 2), A_C_00000001);
1591                 A_OP(icode, &ptr, iACC3, A_GPR(tmp + 2), A_C_00000000, A_C_00010000, A_GPR(tmp + 2));
1592                 A_OP(icode, &ptr, iANDXOR, A_GPR(tmp + 2), A_GPR(tmp + 2), A_GPR(gpr - 1), A_C_00000000);
1593                 A_SWITCH(icode, &ptr, tmp + 0, tmp + 2, gpr + z);
1594                 A_SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z);
1595                 A_SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);
1596                 if ((z==1) && (emu->card_capabilities->spdif_bug)) {
1597                         /* Due to a SPDIF output bug on some Audigy cards, this code delays the Right channel by 1 sample */
1598                         dev_info(emu->card->dev,
1599                                  "Installing spdif_bug patch: %s\n",
1600                                  emu->card_capabilities->name);
1601                         A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(gpr - 3), A_C_00000000, A_C_00000000);
1602                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 3), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
1603                 } else {
1604                         A_OP(icode, &ptr, iACC3, A_EXTOUT(A_EXTOUT_FRONT_L + z), A_GPR(tmp + 0), A_GPR(tmp + 1), A_C_00000000);
1605                 }
1606         }
1607         snd_emu10k1_init_stereo_onoff_control(controls + nctl++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0);
1608         gpr += 2;
1609         
1610         A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
1611         A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
1612         A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
1613
1614         /* ADC buffer */
1615 #ifdef EMU10K1_CAPTURE_DIGITAL_OUT
1616         A_PUT_STEREO_OUTPUT(A_EXTOUT_ADC_CAP_L, A_EXTOUT_ADC_CAP_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
1617 #else
1618         A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_L, capture);
1619         A_PUT_OUTPUT(A_EXTOUT_ADC_CAP_R, capture+1);
1620 #endif
1621
1622         if (emu->card_capabilities->emu_model) {
1623                 if (emu->card_capabilities->ca0108_chip) {
1624                         dev_info(emu->card->dev, "EMU2 inputs on\n");
1625                         for (z = 0; z < 0x10; z++) {
1626                                 snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, 
1627                                                                         bit_shifter16,
1628                                                                         A3_EMU32IN(z),
1629                                                                         A_FXBUS2(z*2) );
1630                         }
1631                 } else {
1632                         dev_info(emu->card->dev, "EMU inputs on\n");
1633                         /* Capture 16 (originally 8) channels of S32_LE sound */
1634
1635                         /*
1636                         dev_dbg(emu->card->dev, "emufx.c: gpr=0x%x, tmp=0x%x\n",
1637                                gpr, tmp);
1638                         */
1639                         /* For the EMU1010: How to get 32bit values from the DSP. High 16bits into L, low 16bits into R. */
1640                         /* A_P16VIN(0) is delayed by one sample,
1641                          * so all other A_P16VIN channels will need to also be delayed
1642                          */
1643                         /* Left ADC in. 1 of 2 */
1644                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_P16VIN(0x0), A_FXBUS2(0) );
1645                         /* Right ADC in 1 of 2 */
1646                         gpr_map[gpr++] = 0x00000000;
1647                         /* Delaying by one sample: instead of copying the input
1648                          * value A_P16VIN to output A_FXBUS2 as in the first channel,
1649                          * we use an auxiliary register, delaying the value by one
1650                          * sample
1651                          */
1652                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(2) );
1653                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x1), A_C_00000000, A_C_00000000);
1654                         gpr_map[gpr++] = 0x00000000;
1655                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(4) );
1656                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x2), A_C_00000000, A_C_00000000);
1657                         gpr_map[gpr++] = 0x00000000;
1658                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(6) );
1659                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x3), A_C_00000000, A_C_00000000);
1660                         /* For 96kHz mode */
1661                         /* Left ADC in. 2 of 2 */
1662                         gpr_map[gpr++] = 0x00000000;
1663                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0x8) );
1664                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x4), A_C_00000000, A_C_00000000);
1665                         /* Right ADC in 2 of 2 */
1666                         gpr_map[gpr++] = 0x00000000;
1667                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xa) );
1668                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x5), A_C_00000000, A_C_00000000);
1669                         gpr_map[gpr++] = 0x00000000;
1670                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xc) );
1671                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x6), A_C_00000000, A_C_00000000);
1672                         gpr_map[gpr++] = 0x00000000;
1673                         snd_emu10k1_audigy_dsp_convert_32_to_2x16( icode, &ptr, tmp, bit_shifter16, A_GPR(gpr - 1), A_FXBUS2(0xe) );
1674                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x7), A_C_00000000, A_C_00000000);
1675                         /* Pavel Hofman - we still have voices, A_FXBUS2s, and
1676                          * A_P16VINs available -
1677                          * let's add 8 more capture channels - total of 16
1678                          */
1679                         gpr_map[gpr++] = 0x00000000;
1680                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1681                                                                   bit_shifter16,
1682                                                                   A_GPR(gpr - 1),
1683                                                                   A_FXBUS2(0x10));
1684                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x8),
1685                              A_C_00000000, A_C_00000000);
1686                         gpr_map[gpr++] = 0x00000000;
1687                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1688                                                                   bit_shifter16,
1689                                                                   A_GPR(gpr - 1),
1690                                                                   A_FXBUS2(0x12));
1691                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0x9),
1692                              A_C_00000000, A_C_00000000);
1693                         gpr_map[gpr++] = 0x00000000;
1694                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1695                                                                   bit_shifter16,
1696                                                                   A_GPR(gpr - 1),
1697                                                                   A_FXBUS2(0x14));
1698                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xa),
1699                              A_C_00000000, A_C_00000000);
1700                         gpr_map[gpr++] = 0x00000000;
1701                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1702                                                                   bit_shifter16,
1703                                                                   A_GPR(gpr - 1),
1704                                                                   A_FXBUS2(0x16));
1705                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xb),
1706                              A_C_00000000, A_C_00000000);
1707                         gpr_map[gpr++] = 0x00000000;
1708                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1709                                                                   bit_shifter16,
1710                                                                   A_GPR(gpr - 1),
1711                                                                   A_FXBUS2(0x18));
1712                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xc),
1713                              A_C_00000000, A_C_00000000);
1714                         gpr_map[gpr++] = 0x00000000;
1715                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1716                                                                   bit_shifter16,
1717                                                                   A_GPR(gpr - 1),
1718                                                                   A_FXBUS2(0x1a));
1719                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xd),
1720                              A_C_00000000, A_C_00000000);
1721                         gpr_map[gpr++] = 0x00000000;
1722                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1723                                                                   bit_shifter16,
1724                                                                   A_GPR(gpr - 1),
1725                                                                   A_FXBUS2(0x1c));
1726                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xe),
1727                              A_C_00000000, A_C_00000000);
1728                         gpr_map[gpr++] = 0x00000000;
1729                         snd_emu10k1_audigy_dsp_convert_32_to_2x16(icode, &ptr, tmp,
1730                                                                   bit_shifter16,
1731                                                                   A_GPR(gpr - 1),
1732                                                                   A_FXBUS2(0x1e));
1733                         A_OP(icode, &ptr, iACC3, A_GPR(gpr - 1), A_P16VIN(0xf),
1734                              A_C_00000000, A_C_00000000);
1735                 }
1736
1737 #if 0
1738                 for (z = 4; z < 8; z++) {
1739                         A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_C_00000000);
1740                 }
1741                 for (z = 0xc; z < 0x10; z++) {
1742                         A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_C_00000000);
1743                 }
1744 #endif
1745         } else {
1746                 /* EFX capture - capture the 16 EXTINs */
1747                 /* Capture 16 channels of S16_LE sound */
1748                 for (z = 0; z < 16; z++) {
1749                         A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_EXTIN(z));
1750                 }
1751         }
1752         
1753 #endif /* JCD test */
1754         /*
1755          * ok, set up done..
1756          */
1757
1758         if (gpr > tmp) {
1759                 snd_BUG();
1760                 err = -EIO;
1761                 goto __err;
1762         }
1763         /* clear remaining instruction memory */
1764         while (ptr < 0x400)
1765                 A_OP(icode, &ptr, 0x0f, 0xc0, 0xc0, 0xcf, 0xc0);
1766
1767         icode->gpr_add_control_count = nctl;
1768         icode->gpr_add_controls = (struct snd_emu10k1_fx8010_control_gpr __user *)controls;
1769         emu->support_tlv = 1; /* support TLV */
1770         err = snd_emu10k1_icode_poke(emu, icode, true);
1771         emu->support_tlv = 0; /* clear again */
1772
1773 __err:
1774         kfree(controls);
1775 __err_ctrls:
1776         kfree((void __force *)icode->gpr_map);
1777 __err_gpr:
1778         kfree(icode);
1779         return err;
1780 }
1781
1782
1783 /*
1784  * initial DSP configuration for Emu10k1
1785  */
1786
1787 /* when volume = max, then copy only to avoid volume modification */
1788 /* with iMAC0 (negative values) */
1789 static void _volume(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol)
1790 {
1791         OP(icode, ptr, iMAC0, dst, C_00000000, src, vol);
1792         OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);
1793         OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000001);
1794         OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);
1795 }
1796 static void _volume_add(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol)
1797 {
1798         OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);
1799         OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1800         OP(icode, ptr, iMACINT0, dst, dst, src, C_00000001);
1801         OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);
1802         OP(icode, ptr, iMAC0, dst, dst, src, vol);
1803 }
1804 static void _volume_out(struct snd_emu10k1_fx8010_code *icode, u32 *ptr, u32 dst, u32 src, u32 vol)
1805 {
1806         OP(icode, ptr, iANDXOR, C_00000000, vol, C_ffffffff, C_7fffffff);
1807         OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1808         OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);
1809         OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);
1810         OP(icode, ptr, iMAC0, dst, C_00000000, src, vol);
1811 }
1812
1813 #define VOLUME(icode, ptr, dst, src, vol) \
1814                 _volume(icode, ptr, GPR(dst), GPR(src), GPR(vol))
1815 #define VOLUME_IN(icode, ptr, dst, src, vol) \
1816                 _volume(icode, ptr, GPR(dst), EXTIN(src), GPR(vol))
1817 #define VOLUME_ADD(icode, ptr, dst, src, vol) \
1818                 _volume_add(icode, ptr, GPR(dst), GPR(src), GPR(vol))
1819 #define VOLUME_ADDIN(icode, ptr, dst, src, vol) \
1820                 _volume_add(icode, ptr, GPR(dst), EXTIN(src), GPR(vol))
1821 #define VOLUME_OUT(icode, ptr, dst, src, vol) \
1822                 _volume_out(icode, ptr, EXTOUT(dst), GPR(src), GPR(vol))
1823 #define _SWITCH(icode, ptr, dst, src, sw) \
1824         OP((icode), ptr, iMACINT0, dst, C_00000000, src, sw);
1825 #define SWITCH(icode, ptr, dst, src, sw) \
1826                 _SWITCH(icode, ptr, GPR(dst), GPR(src), GPR(sw))
1827 #define SWITCH_IN(icode, ptr, dst, src, sw) \
1828                 _SWITCH(icode, ptr, GPR(dst), EXTIN(src), GPR(sw))
1829 #define _SWITCH_NEG(icode, ptr, dst, src) \
1830         OP((icode), ptr, iANDXOR, dst, src, C_00000001, C_00000001);
1831 #define SWITCH_NEG(icode, ptr, dst, src) \
1832                 _SWITCH_NEG(icode, ptr, GPR(dst), GPR(src))
1833
1834
1835 static int _snd_emu10k1_init_efx(struct snd_emu10k1 *emu)
1836 {
1837         int err, i, z, gpr, tmp, playback, capture;
1838         u32 ptr;
1839         struct snd_emu10k1_fx8010_code *icode;
1840         struct snd_emu10k1_fx8010_pcm_rec *ipcm = NULL;
1841         struct snd_emu10k1_fx8010_control_gpr *controls = NULL, *ctl;
1842         u32 *gpr_map;
1843
1844         err = -ENOMEM;
1845         icode = kzalloc(sizeof(*icode), GFP_KERNEL);
1846         if (!icode)
1847                 return err;
1848
1849         icode->gpr_map = (u_int32_t __user *) kcalloc(256 + 160 + 160 + 2 * 512,
1850                                                       sizeof(u_int32_t), GFP_KERNEL);
1851         if (!icode->gpr_map)
1852                 goto __err_gpr;
1853
1854         controls = kcalloc(SND_EMU10K1_GPR_CONTROLS,
1855                            sizeof(struct snd_emu10k1_fx8010_control_gpr),
1856                            GFP_KERNEL);
1857         if (!controls)
1858                 goto __err_ctrls;
1859
1860         ipcm = kzalloc(sizeof(*ipcm), GFP_KERNEL);
1861         if (!ipcm)
1862                 goto __err_ipcm;
1863
1864         gpr_map = (u32 __force *)icode->gpr_map;
1865
1866         icode->tram_data_map = icode->gpr_map + 256;
1867         icode->tram_addr_map = icode->tram_data_map + 160;
1868         icode->code = icode->tram_addr_map + 160;
1869         
1870         /* clear free GPRs */
1871         for (i = 0; i < 256; i++)
1872                 set_bit(i, icode->gpr_valid);
1873
1874         /* clear TRAM data & address lines */
1875         for (i = 0; i < 160; i++)
1876                 set_bit(i, icode->tram_valid);
1877
1878         strcpy(icode->name, "SB Live! FX8010 code for ALSA v1.2 by Jaroslav Kysela");
1879         ptr = 0; i = 0;
1880         /* we have 12 inputs */
1881         playback = SND_EMU10K1_INPUTS;
1882         /* we have 6 playback channels and tone control doubles */
1883         capture = playback + (SND_EMU10K1_PLAYBACK_CHANNELS * 2);
1884         gpr = capture + SND_EMU10K1_CAPTURE_CHANNELS;
1885         tmp = 0x88;     /* we need 4 temporary GPR */
1886         /* from 0x8c to 0xff is the area for tone control */
1887
1888         /* stop FX processor */
1889         snd_emu10k1_ptr_write(emu, DBG, 0, (emu->fx8010.dbg = 0) | EMU10K1_DBG_SINGLE_STEP);
1890
1891         /*
1892          *  Process FX Buses
1893          */
1894         OP(icode, &ptr, iMACINT0, GPR(0), C_00000000, FXBUS(FXBUS_PCM_LEFT), C_00000004);
1895         OP(icode, &ptr, iMACINT0, GPR(1), C_00000000, FXBUS(FXBUS_PCM_RIGHT), C_00000004);
1896         OP(icode, &ptr, iMACINT0, GPR(2), C_00000000, FXBUS(FXBUS_MIDI_LEFT), C_00000004);
1897         OP(icode, &ptr, iMACINT0, GPR(3), C_00000000, FXBUS(FXBUS_MIDI_RIGHT), C_00000004);
1898         OP(icode, &ptr, iMACINT0, GPR(4), C_00000000, FXBUS(FXBUS_PCM_LEFT_REAR), C_00000004);
1899         OP(icode, &ptr, iMACINT0, GPR(5), C_00000000, FXBUS(FXBUS_PCM_RIGHT_REAR), C_00000004);
1900         OP(icode, &ptr, iMACINT0, GPR(6), C_00000000, FXBUS(FXBUS_PCM_CENTER), C_00000004);
1901         OP(icode, &ptr, iMACINT0, GPR(7), C_00000000, FXBUS(FXBUS_PCM_LFE), C_00000004);
1902         OP(icode, &ptr, iMACINT0, GPR(8), C_00000000, C_00000000, C_00000000);  /* S/PDIF left */
1903         OP(icode, &ptr, iMACINT0, GPR(9), C_00000000, C_00000000, C_00000000);  /* S/PDIF right */
1904         OP(icode, &ptr, iMACINT0, GPR(10), C_00000000, FXBUS(FXBUS_PCM_LEFT_FRONT), C_00000004);
1905         OP(icode, &ptr, iMACINT0, GPR(11), C_00000000, FXBUS(FXBUS_PCM_RIGHT_FRONT), C_00000004);
1906
1907         /* Raw S/PDIF PCM */
1908         ipcm->substream = 0;
1909         ipcm->channels = 2;
1910         ipcm->tram_start = 0;
1911         ipcm->buffer_size = (64 * 1024) / 2;
1912         ipcm->gpr_size = gpr++;
1913         ipcm->gpr_ptr = gpr++;
1914         ipcm->gpr_count = gpr++;
1915         ipcm->gpr_tmpcount = gpr++;
1916         ipcm->gpr_trigger = gpr++;
1917         ipcm->gpr_running = gpr++;
1918         ipcm->etram[0] = 0;
1919         ipcm->etram[1] = 1;
1920
1921         gpr_map[gpr + 0] = 0xfffff000;
1922         gpr_map[gpr + 1] = 0xffff0000;
1923         gpr_map[gpr + 2] = 0x70000000;
1924         gpr_map[gpr + 3] = 0x00000007;
1925         gpr_map[gpr + 4] = 0x001f << 11;
1926         gpr_map[gpr + 5] = 0x001c << 11;
1927         gpr_map[gpr + 6] = (0x22  - 0x01) - 1;  /* skip at 01 to 22 */
1928         gpr_map[gpr + 7] = (0x22  - 0x06) - 1;  /* skip at 06 to 22 */
1929         gpr_map[gpr + 8] = 0x2000000 + (2<<11);
1930         gpr_map[gpr + 9] = 0x4000000 + (2<<11);
1931         gpr_map[gpr + 10] = 1<<11;
1932         gpr_map[gpr + 11] = (0x24 - 0x0a) - 1;  /* skip at 0a to 24 */
1933         gpr_map[gpr + 12] = 0;
1934
1935         /* if the trigger flag is not set, skip */
1936         /* 00: */ OP(icode, &ptr, iMAC0, C_00000000, GPR(ipcm->gpr_trigger), C_00000000, C_00000000);
1937         /* 01: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_ZERO, GPR(gpr + 6));
1938         /* if the running flag is set, we're running */
1939         /* 02: */ OP(icode, &ptr, iMAC0, C_00000000, GPR(ipcm->gpr_running), C_00000000, C_00000000);
1940         /* 03: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000004);
1941         /* wait until ((GPR_DBAC>>11) & 0x1f) == 0x1c) */
1942         /* 04: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), GPR_DBAC, GPR(gpr + 4), C_00000000);
1943         /* 05: */ OP(icode, &ptr, iMACINT0, C_00000000, GPR(tmp + 0), C_ffffffff, GPR(gpr + 5));
1944         /* 06: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, GPR(gpr + 7));
1945         /* 07: */ OP(icode, &ptr, iACC3, GPR(gpr + 12), C_00000010, C_00000001, C_00000000);
1946
1947         /* 08: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00000000, C_00000001);
1948         /* 09: */ OP(icode, &ptr, iACC3, GPR(gpr + 12), GPR(gpr + 12), C_ffffffff, C_00000000);
1949         /* 0a: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, GPR(gpr + 11));
1950         /* 0b: */ OP(icode, &ptr, iACC3, GPR(gpr + 12), C_00000001, C_00000000, C_00000000);
1951
1952         /* 0c: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), ETRAM_DATA(ipcm->etram[0]), GPR(gpr + 0), C_00000000);
1953         /* 0d: */ OP(icode, &ptr, iLOG, GPR(tmp + 0), GPR(tmp + 0), GPR(gpr + 3), C_00000000);
1954         /* 0e: */ OP(icode, &ptr, iANDXOR, GPR(8), GPR(tmp + 0), GPR(gpr + 1), GPR(gpr + 2));
1955         /* 0f: */ OP(icode, &ptr, iSKIP, C_00000000, GPR_COND, CC_REG_MINUS, C_00000001);
1956         /* 10: */ OP(icode, &ptr, iANDXOR, GPR(8), GPR(8), GPR(gpr + 1), GPR(gpr + 2));
1957
1958         /* 11: */ OP(icode, &ptr, iANDXOR, GPR(tmp + 0), ETRAM_DATA(ipcm->etram[1]), GPR(gpr + 0), C_00000000);
1959         /* 12: */ OP(icode, &ptr, iLOG, GPR(tmp + 0), GPR(tmp + 0), GPR(gpr + 3), C_00000000);
1960         /* 13: */ OP(icode, &ptr, iANDXOR, GPR(9), GPR(tmp + 0), GPR(gpr + 1), GPR(gpr + 2));
1961         /* 14: */ OP(icode, &ptr, iSKIP, C_00000000, GPR_COND, CC_REG_MINUS, C_00000001);
1962         /* 15: */ OP(icode, &ptr, iANDXOR, GPR(9), GPR(9), GPR(gpr + 1), GPR(gpr + 2));
1963
1964         /* 16: */ OP(icode, &ptr, iACC3, GPR(tmp + 0), GPR(ipcm->gpr_ptr), C_00000001, C_00000000);
1965         /* 17: */ OP(icode, &ptr, iMACINT0, C_00000000, GPR(tmp + 0), C_ffffffff, GPR(ipcm->gpr_size));
1966         /* 18: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_MINUS, C_00000001);
1967         /* 19: */ OP(icode, &ptr, iACC3, GPR(tmp + 0), C_00000000, C_00000000, C_00000000);
1968         /* 1a: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_ptr), GPR(tmp + 0), C_00000000, C_00000000);
1969         
1970         /* 1b: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_tmpcount), GPR(ipcm->gpr_tmpcount), C_ffffffff, C_00000000);
1971         /* 1c: */ OP(icode, &ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1972         /* 1d: */ OP(icode, &ptr, iACC3, GPR(ipcm->gpr_tmpcount), GPR(ipcm->gpr_count), C_00000000, C_00000000);
1973         /* 1e: */ OP(icode, &ptr, iACC3, GPR_IRQ, C_80000000, C_00000000, C_00000000);
1974         /* 1f: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00000001, C_00010000);
1975
1976         /* 20: */ OP(icode, &ptr, iANDXOR, GPR(ipcm->gpr_running), GPR(ipcm->gpr_running), C_00010000, C_00000001);
1977         /* 21: */ OP(icode, &ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000002);
1978
1979         /* 22: */ OP(icode, &ptr, iMACINT1, ETRAM_ADDR(ipcm->etram[0]), GPR(gpr + 8), GPR_DBAC, C_ffffffff);
1980         /* 23: */ OP(icode, &ptr, iMACINT1, ETRAM_ADDR(ipcm->etram[1]), GPR(gpr + 9), GPR_DBAC, C_ffffffff);
1981
1982         /* 24: */
1983         gpr += 13;
1984
1985         /* Wave Playback Volume */
1986         for (z = 0; z < 2; z++)
1987                 VOLUME(icode, &ptr, playback + z, z, gpr + z);
1988         snd_emu10k1_init_stereo_control(controls + i++, "Wave Playback Volume", gpr, 100);
1989         gpr += 2;
1990
1991         /* Wave Surround Playback Volume */
1992         for (z = 0; z < 2; z++)
1993                 VOLUME(icode, &ptr, playback + 2 + z, z, gpr + z);
1994         snd_emu10k1_init_stereo_control(controls + i++, "Wave Surround Playback Volume", gpr, 0);
1995         gpr += 2;
1996         
1997         /* Wave Center/LFE Playback Volume */
1998         OP(icode, &ptr, iACC3, GPR(tmp + 0), FXBUS(FXBUS_PCM_LEFT), FXBUS(FXBUS_PCM_RIGHT), C_00000000);
1999         OP(icode, &ptr, iMACINT0, GPR(tmp + 0), C_00000000, GPR(tmp + 0), C_00000002);
2000         VOLUME(icode, &ptr, playback + 4, tmp + 0, gpr);
2001         snd_emu10k1_init_mono_control(controls + i++, "Wave Center Playback Volume", gpr++, 0);
2002         VOLUME(icode, &ptr, playback + 5, tmp + 0, gpr);
2003         snd_emu10k1_init_mono_control(controls + i++, "Wave LFE Playback Volume", gpr++, 0);
2004
2005         /* Wave Capture Volume + Switch */
2006         for (z = 0; z < 2; z++) {
2007                 SWITCH(icode, &ptr, tmp + 0, z, gpr + 2 + z);
2008                 VOLUME(icode, &ptr, capture + z, tmp + 0, gpr + z);
2009         }
2010         snd_emu10k1_init_stereo_control(controls + i++, "Wave Capture Volume", gpr, 0);
2011         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Wave Capture Switch", gpr + 2, 0);
2012         gpr += 4;
2013
2014         /* Synth Playback Volume */
2015         for (z = 0; z < 2; z++)
2016                 VOLUME_ADD(icode, &ptr, playback + z, 2 + z, gpr + z);
2017         snd_emu10k1_init_stereo_control(controls + i++, "Synth Playback Volume", gpr, 100);
2018         gpr += 2;
2019
2020         /* Synth Capture Volume + Switch */
2021         for (z = 0; z < 2; z++) {
2022                 SWITCH(icode, &ptr, tmp + 0, 2 + z, gpr + 2 + z);
2023                 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2024         }
2025         snd_emu10k1_init_stereo_control(controls + i++, "Synth Capture Volume", gpr, 0);
2026         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Synth Capture Switch", gpr + 2, 0);
2027         gpr += 4;
2028
2029         /* Surround Digital Playback Volume (renamed later without Digital) */
2030         for (z = 0; z < 2; z++)
2031                 VOLUME_ADD(icode, &ptr, playback + 2 + z, 4 + z, gpr + z);
2032         snd_emu10k1_init_stereo_control(controls + i++, "Surround Digital Playback Volume", gpr, 100);
2033         gpr += 2;
2034
2035         /* Surround Capture Volume + Switch */
2036         for (z = 0; z < 2; z++) {
2037                 SWITCH(icode, &ptr, tmp + 0, 4 + z, gpr + 2 + z);
2038                 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2039         }
2040         snd_emu10k1_init_stereo_control(controls + i++, "Surround Capture Volume", gpr, 0);
2041         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Surround Capture Switch", gpr + 2, 0);
2042         gpr += 4;
2043
2044         /* Center Playback Volume (renamed later without Digital) */
2045         VOLUME_ADD(icode, &ptr, playback + 4, 6, gpr);
2046         snd_emu10k1_init_mono_control(controls + i++, "Center Digital Playback Volume", gpr++, 100);
2047
2048         /* LFE Playback Volume + Switch (renamed later without Digital) */
2049         VOLUME_ADD(icode, &ptr, playback + 5, 7, gpr);
2050         snd_emu10k1_init_mono_control(controls + i++, "LFE Digital Playback Volume", gpr++, 100);
2051
2052         /* Front Playback Volume */
2053         for (z = 0; z < 2; z++)
2054                 VOLUME_ADD(icode, &ptr, playback + z, 10 + z, gpr + z);
2055         snd_emu10k1_init_stereo_control(controls + i++, "Front Playback Volume", gpr, 100);
2056         gpr += 2;
2057
2058         /* Front Capture Volume + Switch */
2059         for (z = 0; z < 2; z++) {
2060                 SWITCH(icode, &ptr, tmp + 0, 10 + z, gpr + 2);
2061                 VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2062         }
2063         snd_emu10k1_init_stereo_control(controls + i++, "Front Capture Volume", gpr, 0);
2064         snd_emu10k1_init_mono_onoff_control(controls + i++, "Front Capture Switch", gpr + 2, 0);
2065         gpr += 3;
2066
2067         /*
2068          *  Process inputs
2069          */
2070
2071         if (emu->fx8010.extin_mask & ((1<<EXTIN_AC97_L)|(1<<EXTIN_AC97_R))) {
2072                 /* AC'97 Playback Volume */
2073                 VOLUME_ADDIN(icode, &ptr, playback + 0, EXTIN_AC97_L, gpr); gpr++;
2074                 VOLUME_ADDIN(icode, &ptr, playback + 1, EXTIN_AC97_R, gpr); gpr++;
2075                 snd_emu10k1_init_stereo_control(controls + i++, "AC97 Playback Volume", gpr-2, 0);
2076                 /* AC'97 Capture Volume */
2077                 VOLUME_ADDIN(icode, &ptr, capture + 0, EXTIN_AC97_L, gpr); gpr++;
2078                 VOLUME_ADDIN(icode, &ptr, capture + 1, EXTIN_AC97_R, gpr); gpr++;
2079                 snd_emu10k1_init_stereo_control(controls + i++, "AC97 Capture Volume", gpr-2, 100);
2080         }
2081         
2082         if (emu->fx8010.extin_mask & ((1<<EXTIN_SPDIF_CD_L)|(1<<EXTIN_SPDIF_CD_R))) {
2083                 /* IEC958 TTL Playback Volume */
2084                 for (z = 0; z < 2; z++)
2085                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_SPDIF_CD_L + z, gpr + z);
2086                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",PLAYBACK,VOLUME), gpr, 0);
2087                 gpr += 2;
2088         
2089                 /* IEC958 TTL Capture Volume + Switch */
2090                 for (z = 0; z < 2; z++) {
2091                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_SPDIF_CD_L + z, gpr + 2 + z);
2092                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2093                 }
2094                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",CAPTURE,VOLUME), gpr, 0);
2095                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("TTL ",CAPTURE,SWITCH), gpr + 2, 0);
2096                 gpr += 4;
2097         }
2098         
2099         if (emu->fx8010.extin_mask & ((1<<EXTIN_ZOOM_L)|(1<<EXTIN_ZOOM_R))) {
2100                 /* Zoom Video Playback Volume */
2101                 for (z = 0; z < 2; z++)
2102                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_ZOOM_L + z, gpr + z);
2103                 snd_emu10k1_init_stereo_control(controls + i++, "Zoom Video Playback Volume", gpr, 0);
2104                 gpr += 2;
2105         
2106                 /* Zoom Video Capture Volume + Switch */
2107                 for (z = 0; z < 2; z++) {
2108                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_ZOOM_L + z, gpr + 2 + z);
2109                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2110                 }
2111                 snd_emu10k1_init_stereo_control(controls + i++, "Zoom Video Capture Volume", gpr, 0);
2112                 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Zoom Video Capture Switch", gpr + 2, 0);
2113                 gpr += 4;
2114         }
2115         
2116         if (emu->fx8010.extin_mask & ((1<<EXTIN_TOSLINK_L)|(1<<EXTIN_TOSLINK_R))) {
2117                 /* IEC958 Optical Playback Volume */
2118                 for (z = 0; z < 2; z++)
2119                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_TOSLINK_L + z, gpr + z);
2120                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",PLAYBACK,VOLUME), gpr, 0);
2121                 gpr += 2;
2122         
2123                 /* IEC958 Optical Capture Volume */
2124                 for (z = 0; z < 2; z++) {
2125                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_TOSLINK_L + z, gpr + 2 + z);
2126                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2127                 }
2128                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",CAPTURE,VOLUME), gpr, 0);
2129                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("LiveDrive ",CAPTURE,SWITCH), gpr + 2, 0);
2130                 gpr += 4;
2131         }
2132         
2133         if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE1_L)|(1<<EXTIN_LINE1_R))) {
2134                 /* Line LiveDrive Playback Volume */
2135                 for (z = 0; z < 2; z++)
2136                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_LINE1_L + z, gpr + z);
2137                 snd_emu10k1_init_stereo_control(controls + i++, "Line LiveDrive Playback Volume", gpr, 0);
2138                 gpr += 2;
2139         
2140                 /* Line LiveDrive Capture Volume + Switch */
2141                 for (z = 0; z < 2; z++) {
2142                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_LINE1_L + z, gpr + 2 + z);
2143                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2144                 }
2145                 snd_emu10k1_init_stereo_control(controls + i++, "Line LiveDrive Capture Volume", gpr, 0);
2146                 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Line LiveDrive Capture Switch", gpr + 2, 0);
2147                 gpr += 4;
2148         }
2149         
2150         if (emu->fx8010.extin_mask & ((1<<EXTIN_COAX_SPDIF_L)|(1<<EXTIN_COAX_SPDIF_R))) {
2151                 /* IEC958 Coax Playback Volume */
2152                 for (z = 0; z < 2; z++)
2153                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_COAX_SPDIF_L + z, gpr + z);
2154                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",PLAYBACK,VOLUME), gpr, 0);
2155                 gpr += 2;
2156         
2157                 /* IEC958 Coax Capture Volume + Switch */
2158                 for (z = 0; z < 2; z++) {
2159                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_COAX_SPDIF_L + z, gpr + 2 + z);
2160                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2161                 }
2162                 snd_emu10k1_init_stereo_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",CAPTURE,VOLUME), gpr, 0);
2163                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("Coaxial ",CAPTURE,SWITCH), gpr + 2, 0);
2164                 gpr += 4;
2165         }
2166         
2167         if (emu->fx8010.extin_mask & ((1<<EXTIN_LINE2_L)|(1<<EXTIN_LINE2_R))) {
2168                 /* Line LiveDrive Playback Volume */
2169                 for (z = 0; z < 2; z++)
2170                         VOLUME_ADDIN(icode, &ptr, playback + z, EXTIN_LINE2_L + z, gpr + z);
2171                 snd_emu10k1_init_stereo_control(controls + i++, "Line2 LiveDrive Playback Volume", gpr, 0);
2172                 controls[i-1].id.index = 1;
2173                 gpr += 2;
2174         
2175                 /* Line LiveDrive Capture Volume */
2176                 for (z = 0; z < 2; z++) {
2177                         SWITCH_IN(icode, &ptr, tmp + 0, EXTIN_LINE2_L + z, gpr + 2 + z);
2178                         VOLUME_ADD(icode, &ptr, capture + z, tmp + 0, gpr + z);
2179                 }
2180                 snd_emu10k1_init_stereo_control(controls + i++, "Line2 LiveDrive Capture Volume", gpr, 0);
2181                 controls[i-1].id.index = 1;
2182                 snd_emu10k1_init_stereo_onoff_control(controls + i++, "Line2 LiveDrive Capture Switch", gpr + 2, 0);
2183                 controls[i-1].id.index = 1;
2184                 gpr += 4;
2185         }
2186
2187         /*
2188          *  Process tone control
2189          */
2190         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), GPR(playback + 0), C_00000000, C_00000000); /* left */
2191         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), GPR(playback + 1), C_00000000, C_00000000); /* right */
2192         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2), GPR(playback + 2), C_00000000, C_00000000); /* rear left */
2193         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 3), GPR(playback + 3), C_00000000, C_00000000); /* rear right */
2194         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), GPR(playback + 4), C_00000000, C_00000000); /* center */
2195         OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), GPR(playback + 5), C_00000000, C_00000000); /* LFE */
2196
2197         ctl = &controls[i + 0];
2198         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2199         strcpy(ctl->id.name, "Tone Control - Bass");
2200         ctl->vcount = 2;
2201         ctl->count = 10;
2202         ctl->min = 0;
2203         ctl->max = 40;
2204         ctl->value[0] = ctl->value[1] = 20;
2205         ctl->tlv = snd_emu10k1_bass_treble_db_scale;
2206         ctl->translation = EMU10K1_GPR_TRANSLATION_BASS;
2207         ctl = &controls[i + 1];
2208         ctl->id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2209         strcpy(ctl->id.name, "Tone Control - Treble");
2210         ctl->vcount = 2;
2211         ctl->count = 10;
2212         ctl->min = 0;
2213         ctl->max = 40;
2214         ctl->value[0] = ctl->value[1] = 20;
2215         ctl->tlv = snd_emu10k1_bass_treble_db_scale;
2216         ctl->translation = EMU10K1_GPR_TRANSLATION_TREBLE;
2217
2218 #define BASS_GPR        0x8c
2219 #define TREBLE_GPR      0x96
2220
2221         for (z = 0; z < 5; z++) {
2222                 int j;
2223                 for (j = 0; j < 2; j++) {
2224                         controls[i + 0].gpr[z * 2 + j] = BASS_GPR + z * 2 + j;
2225                         controls[i + 1].gpr[z * 2 + j] = TREBLE_GPR + z * 2 + j;
2226                 }
2227         }
2228         for (z = 0; z < 3; z++) {               /* front/rear/center-lfe */
2229                 int j, k, l, d;
2230                 for (j = 0; j < 2; j++) {       /* left/right */
2231                         k = 0xa0 + (z * 8) + (j * 4);
2232                         l = 0xd0 + (z * 8) + (j * 4);
2233                         d = playback + SND_EMU10K1_PLAYBACK_CHANNELS + z * 2 + j;
2234
2235                         OP(icode, &ptr, iMAC0, C_00000000, C_00000000, GPR(d), GPR(BASS_GPR + 0 + j));
2236                         OP(icode, &ptr, iMACMV, GPR(k+1), GPR(k), GPR(k+1), GPR(BASS_GPR + 4 + j));
2237                         OP(icode, &ptr, iMACMV, GPR(k), GPR(d), GPR(k), GPR(BASS_GPR + 2 + j));
2238                         OP(icode, &ptr, iMACMV, GPR(k+3), GPR(k+2), GPR(k+3), GPR(BASS_GPR + 8 + j));
2239                         OP(icode, &ptr, iMAC0, GPR(k+2), GPR_ACCU, GPR(k+2), GPR(BASS_GPR + 6 + j));
2240                         OP(icode, &ptr, iACC3, GPR(k+2), GPR(k+2), GPR(k+2), C_00000000);
2241
2242                         OP(icode, &ptr, iMAC0, C_00000000, C_00000000, GPR(k+2), GPR(TREBLE_GPR + 0 + j));
2243                         OP(icode, &ptr, iMACMV, GPR(l+1), GPR(l), GPR(l+1), GPR(TREBLE_GPR + 4 + j));
2244                         OP(icode, &ptr, iMACMV, GPR(l), GPR(k+2), GPR(l), GPR(TREBLE_GPR + 2 + j));
2245                         OP(icode, &ptr, iMACMV, GPR(l+3), GPR(l+2), GPR(l+3), GPR(TREBLE_GPR + 8 + j));
2246                         OP(icode, &ptr, iMAC0, GPR(l+2), GPR_ACCU, GPR(l+2), GPR(TREBLE_GPR + 6 + j));
2247                         OP(icode, &ptr, iMACINT0, GPR(l+2), C_00000000, GPR(l+2), C_00000010);
2248
2249                         OP(icode, &ptr, iACC3, GPR(d), GPR(l+2), C_00000000, C_00000000);
2250
2251                         if (z == 2)     /* center */
2252                                 break;
2253                 }
2254         }
2255         i += 2;
2256
2257 #undef BASS_GPR
2258 #undef TREBLE_GPR
2259
2260         for (z = 0; z < 6; z++) {
2261                 SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, gpr + 0);
2262                 SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 0);
2263                 SWITCH(icode, &ptr, tmp + 1, playback + z, tmp + 1);
2264                 OP(icode, &ptr, iACC3, GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2265         }
2266         snd_emu10k1_init_stereo_onoff_control(controls + i++, "Tone Control - Switch", gpr, 0);
2267         gpr += 2;
2268
2269         /*
2270          *  Process outputs
2271          */
2272         if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_L)|(1<<EXTOUT_AC97_R))) {
2273                 /* AC'97 Playback Volume */
2274
2275                 for (z = 0; z < 2; z++)
2276                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + z), C_00000000, C_00000000);
2277         }
2278
2279         if (emu->fx8010.extout_mask & ((1<<EXTOUT_TOSLINK_L)|(1<<EXTOUT_TOSLINK_R))) {
2280                 /* IEC958 Optical Raw Playback Switch */
2281
2282                 for (z = 0; z < 2; z++) {
2283                         SWITCH(icode, &ptr, tmp + 0, 8 + z, gpr + z);
2284                         SWITCH_NEG(icode, &ptr, tmp + 1, gpr + z);
2285                         SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);
2286                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_TOSLINK_L + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2287 #ifdef EMU10K1_CAPTURE_DIGITAL_OUT
2288                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ADC_CAP_L + z), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2289 #endif
2290                 }
2291
2292                 snd_emu10k1_init_stereo_onoff_control(controls + i++, SNDRV_CTL_NAME_IEC958("Optical Raw ",PLAYBACK,SWITCH), gpr, 0);
2293                 gpr += 2;
2294         }
2295
2296         if (emu->fx8010.extout_mask & ((1<<EXTOUT_HEADPHONE_L)|(1<<EXTOUT_HEADPHONE_R))) {
2297                 /* Headphone Playback Volume */
2298
2299                 for (z = 0; z < 2; z++) {
2300                         SWITCH(icode, &ptr, tmp + 0, playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4 + z, gpr + 2 + z);
2301                         SWITCH_NEG(icode, &ptr, tmp + 1, gpr + 2 + z);
2302                         SWITCH(icode, &ptr, tmp + 1, playback + SND_EMU10K1_PLAYBACK_CHANNELS + z, tmp + 1);
2303                         OP(icode, &ptr, iACC3, GPR(tmp + 0), GPR(tmp + 0), GPR(tmp + 1), C_00000000);
2304                         VOLUME_OUT(icode, &ptr, EXTOUT_HEADPHONE_L + z, tmp + 0, gpr + z);
2305                 }
2306
2307                 snd_emu10k1_init_stereo_control(controls + i++, "Headphone Playback Volume", gpr + 0, 0);
2308                 controls[i-1].id.index = 1;     /* AC'97 can have also Headphone control */
2309                 snd_emu10k1_init_mono_onoff_control(controls + i++, "Headphone Center Playback Switch", gpr + 2, 0);
2310                 controls[i-1].id.index = 1;
2311                 snd_emu10k1_init_mono_onoff_control(controls + i++, "Headphone LFE Playback Switch", gpr + 3, 0);
2312                 controls[i-1].id.index = 1;
2313
2314                 gpr += 4;
2315         }
2316         
2317         if (emu->fx8010.extout_mask & ((1<<EXTOUT_REAR_L)|(1<<EXTOUT_REAR_R)))
2318                 for (z = 0; z < 2; z++)
2319                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2 + z), C_00000000, C_00000000);
2320
2321         if (emu->fx8010.extout_mask & ((1<<EXTOUT_AC97_REAR_L)|(1<<EXTOUT_AC97_REAR_R)))
2322                 for (z = 0; z < 2; z++)
2323                         OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_REAR_L + z), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 2 + z), C_00000000, C_00000000);
2324
2325         if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_CENTER)) {
2326 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT
2327                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
2328                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
2329 #else
2330                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
2331                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
2332 #endif
2333         }
2334
2335         if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_LFE)) {
2336 #ifndef EMU10K1_CENTER_LFE_FROM_FRONT
2337                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
2338                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
2339 #else
2340                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
2341                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
2342 #endif
2343         }
2344         
2345 #ifndef EMU10K1_CAPTURE_DIGITAL_OUT
2346         for (z = 0; z < 2; z++)
2347                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ADC_CAP_L + z), GPR(capture + z), C_00000000, C_00000000);
2348 #endif
2349         
2350         if (emu->fx8010.extout_mask & (1<<EXTOUT_MIC_CAP))
2351                 OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_MIC_CAP), GPR(capture + 2), C_00000000, C_00000000);
2352
2353         /* EFX capture - capture the 16 EXTINS */
2354         if (emu->card_capabilities->sblive51) {
2355                 /* On the Live! 5.1, FXBUS2(1) and FXBUS(2) are shared with EXTOUT_ACENTER
2356                  * and EXTOUT_ALFE, so we can't connect inputs to them for multitrack recording.
2357                  *
2358                  * Since only 14 of the 16 EXTINs are used, this is not a big problem.  
2359                  * We route AC97L and R to FX capture 14 and 15, SPDIF CD in to FX capture 
2360                  * 0 and 3, then the rest of the EXTINs to the corresponding FX capture 
2361                  * channel.  Multitrack recorders will still see the center/lfe output signal 
2362                  * on the second and third channels.
2363                  */
2364                 OP(icode, &ptr, iACC3, FXBUS2(14), C_00000000, C_00000000, EXTIN(0));
2365                 OP(icode, &ptr, iACC3, FXBUS2(15), C_00000000, C_00000000, EXTIN(1));
2366                 OP(icode, &ptr, iACC3, FXBUS2(0), C_00000000, C_00000000, EXTIN(2));
2367                 OP(icode, &ptr, iACC3, FXBUS2(3), C_00000000, C_00000000, EXTIN(3));
2368                 for (z = 4; z < 14; z++)
2369                         OP(icode, &ptr, iACC3, FXBUS2(z), C_00000000, C_00000000, EXTIN(z));
2370         } else {
2371                 for (z = 0; z < 16; z++)
2372                         OP(icode, &ptr, iACC3, FXBUS2(z), C_00000000, C_00000000, EXTIN(z));
2373         }
2374             
2375
2376         if (gpr > tmp) {
2377                 snd_BUG();
2378                 err = -EIO;
2379                 goto __err;
2380         }
2381         if (i > SND_EMU10K1_GPR_CONTROLS) {
2382                 snd_BUG();
2383                 err = -EIO;
2384                 goto __err;
2385         }
2386         
2387         /* clear remaining instruction memory */
2388         while (ptr < 0x200)
2389                 OP(icode, &ptr, iACC3, C_00000000, C_00000000, C_00000000, C_00000000);
2390
2391         if ((err = snd_emu10k1_fx8010_tram_setup(emu, ipcm->buffer_size)) < 0)
2392                 goto __err;
2393         icode->gpr_add_control_count = i;
2394         icode->gpr_add_controls = (struct snd_emu10k1_fx8010_control_gpr __user *)controls;
2395         emu->support_tlv = 1; /* support TLV */
2396         err = snd_emu10k1_icode_poke(emu, icode, true);
2397         emu->support_tlv = 0; /* clear again */
2398         if (err >= 0)
2399                 err = snd_emu10k1_ipcm_poke(emu, ipcm);
2400 __err:
2401         kfree(ipcm);
2402 __err_ipcm:
2403         kfree(controls);
2404 __err_ctrls:
2405         kfree((void __force *)icode->gpr_map);
2406 __err_gpr:
2407         kfree(icode);
2408         return err;
2409 }
2410
2411 int snd_emu10k1_init_efx(struct snd_emu10k1 *emu)
2412 {
2413         spin_lock_init(&emu->fx8010.irq_lock);
2414         INIT_LIST_HEAD(&emu->fx8010.gpr_ctl);
2415         if (emu->audigy)
2416                 return _snd_emu10k1_audigy_init_efx(emu);
2417         else
2418                 return _snd_emu10k1_init_efx(emu);
2419 }
2420
2421 void snd_emu10k1_free_efx(struct snd_emu10k1 *emu)
2422 {
2423         /* stop processor */
2424         if (emu->audigy)
2425                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = A_DBG_SINGLE_STEP);
2426         else
2427                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = EMU10K1_DBG_SINGLE_STEP);
2428 }
2429
2430 #if 0 /* FIXME: who use them? */
2431 int snd_emu10k1_fx8010_tone_control_activate(struct snd_emu10k1 *emu, int output)
2432 {
2433         if (output < 0 || output >= 6)
2434                 return -EINVAL;
2435         snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 1);
2436         return 0;
2437 }
2438
2439 int snd_emu10k1_fx8010_tone_control_deactivate(struct snd_emu10k1 *emu, int output)
2440 {
2441         if (output < 0 || output >= 6)
2442                 return -EINVAL;
2443         snd_emu10k1_ptr_write(emu, emu->gpr_base + 0x94 + output, 0, 0);
2444         return 0;
2445 }
2446 #endif
2447
2448 int snd_emu10k1_fx8010_tram_setup(struct snd_emu10k1 *emu, u32 size)
2449 {
2450         u8 size_reg = 0;
2451
2452         /* size is in samples */
2453         if (size != 0) {
2454                 size = (size - 1) >> 13;
2455
2456                 while (size) {
2457                         size >>= 1;
2458                         size_reg++;
2459                 }
2460                 size = 0x2000 << size_reg;
2461         }
2462         if ((emu->fx8010.etram_pages.bytes / 2) == size)
2463                 return 0;
2464         spin_lock_irq(&emu->emu_lock);
2465         outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
2466         spin_unlock_irq(&emu->emu_lock);
2467         snd_emu10k1_ptr_write(emu, TCB, 0, 0);
2468         snd_emu10k1_ptr_write(emu, TCBS, 0, 0);
2469         if (emu->fx8010.etram_pages.area != NULL) {
2470                 snd_dma_free_pages(&emu->fx8010.etram_pages);
2471                 emu->fx8010.etram_pages.area = NULL;
2472                 emu->fx8010.etram_pages.bytes = 0;
2473         }
2474
2475         if (size > 0) {
2476                 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci),
2477                                         size * 2, &emu->fx8010.etram_pages) < 0)
2478                         return -ENOMEM;
2479                 memset(emu->fx8010.etram_pages.area, 0, size * 2);
2480                 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr);
2481                 snd_emu10k1_ptr_write(emu, TCBS, 0, size_reg);
2482                 spin_lock_irq(&emu->emu_lock);
2483                 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
2484                 spin_unlock_irq(&emu->emu_lock);
2485         }
2486
2487         return 0;
2488 }
2489
2490 static int snd_emu10k1_fx8010_open(struct snd_hwdep * hw, struct file *file)
2491 {
2492         return 0;
2493 }
2494
2495 static void copy_string(char *dst, char *src, char *null, int idx)
2496 {
2497         if (src == NULL)
2498                 sprintf(dst, "%s %02X", null, idx);
2499         else
2500                 strcpy(dst, src);
2501 }
2502
2503 static void snd_emu10k1_fx8010_info(struct snd_emu10k1 *emu,
2504                                    struct snd_emu10k1_fx8010_info *info)
2505 {
2506         char **fxbus, **extin, **extout;
2507         unsigned short fxbus_mask, extin_mask, extout_mask;
2508         int res;
2509
2510         info->internal_tram_size = emu->fx8010.itram_size;
2511         info->external_tram_size = emu->fx8010.etram_pages.bytes / 2;
2512         fxbus = fxbuses;
2513         extin = emu->audigy ? audigy_ins : creative_ins;
2514         extout = emu->audigy ? audigy_outs : creative_outs;
2515         fxbus_mask = emu->fx8010.fxbus_mask;
2516         extin_mask = emu->fx8010.extin_mask;
2517         extout_mask = emu->fx8010.extout_mask;
2518         for (res = 0; res < 16; res++, fxbus++, extin++, extout++) {
2519                 copy_string(info->fxbus_names[res], fxbus_mask & (1 << res) ? *fxbus : NULL, "FXBUS", res);
2520                 copy_string(info->extin_names[res], extin_mask & (1 << res) ? *extin : NULL, "Unused", res);
2521                 copy_string(info->extout_names[res], extout_mask & (1 << res) ? *extout : NULL, "Unused", res);
2522         }
2523         for (res = 16; res < 32; res++, extout++)
2524                 copy_string(info->extout_names[res], extout_mask & (1 << res) ? *extout : NULL, "Unused", res);
2525         info->gpr_controls = emu->fx8010.gpr_count;
2526 }
2527
2528 static int snd_emu10k1_fx8010_ioctl(struct snd_hwdep * hw, struct file *file, unsigned int cmd, unsigned long arg)
2529 {
2530         struct snd_emu10k1 *emu = hw->private_data;
2531         struct snd_emu10k1_fx8010_info *info;
2532         struct snd_emu10k1_fx8010_code *icode;
2533         struct snd_emu10k1_fx8010_pcm_rec *ipcm;
2534         unsigned int addr;
2535         void __user *argp = (void __user *)arg;
2536         int res;
2537         
2538         switch (cmd) {
2539         case SNDRV_EMU10K1_IOCTL_PVERSION:
2540                 emu->support_tlv = 1;
2541                 return put_user(SNDRV_EMU10K1_VERSION, (int __user *)argp);
2542         case SNDRV_EMU10K1_IOCTL_INFO:
2543                 info = kmalloc(sizeof(*info), GFP_KERNEL);
2544                 if (!info)
2545                         return -ENOMEM;
2546                 snd_emu10k1_fx8010_info(emu, info);
2547                 if (copy_to_user(argp, info, sizeof(*info))) {
2548                         kfree(info);
2549                         return -EFAULT;
2550                 }
2551                 kfree(info);
2552                 return 0;
2553         case SNDRV_EMU10K1_IOCTL_CODE_POKE:
2554                 if (!capable(CAP_SYS_ADMIN))
2555                         return -EPERM;
2556
2557                 icode = memdup_user(argp, sizeof(*icode));
2558                 if (IS_ERR(icode))
2559                         return PTR_ERR(icode);
2560                 res = snd_emu10k1_icode_poke(emu, icode, false);
2561                 kfree(icode);
2562                 return res;
2563         case SNDRV_EMU10K1_IOCTL_CODE_PEEK:
2564                 icode = memdup_user(argp, sizeof(*icode));
2565                 if (IS_ERR(icode))
2566                         return PTR_ERR(icode);
2567                 res = snd_emu10k1_icode_peek(emu, icode);
2568                 if (res == 0 && copy_to_user(argp, icode, sizeof(*icode))) {
2569                         kfree(icode);
2570                         return -EFAULT;
2571                 }
2572                 kfree(icode);
2573                 return res;
2574         case SNDRV_EMU10K1_IOCTL_PCM_POKE:
2575                 ipcm = memdup_user(argp, sizeof(*ipcm));
2576                 if (IS_ERR(ipcm))
2577                         return PTR_ERR(ipcm);
2578                 res = snd_emu10k1_ipcm_poke(emu, ipcm);
2579                 kfree(ipcm);
2580                 return res;
2581         case SNDRV_EMU10K1_IOCTL_PCM_PEEK:
2582                 ipcm = memdup_user(argp, sizeof(*ipcm));
2583                 if (IS_ERR(ipcm))
2584                         return PTR_ERR(ipcm);
2585                 res = snd_emu10k1_ipcm_peek(emu, ipcm);
2586                 if (res == 0 && copy_to_user(argp, ipcm, sizeof(*ipcm))) {
2587                         kfree(ipcm);
2588                         return -EFAULT;
2589                 }
2590                 kfree(ipcm);
2591                 return res;
2592         case SNDRV_EMU10K1_IOCTL_TRAM_SETUP:
2593                 if (!capable(CAP_SYS_ADMIN))
2594                         return -EPERM;
2595                 if (get_user(addr, (unsigned int __user *)argp))
2596                         return -EFAULT;
2597                 mutex_lock(&emu->fx8010.lock);
2598                 res = snd_emu10k1_fx8010_tram_setup(emu, addr);
2599                 mutex_unlock(&emu->fx8010.lock);
2600                 return res;
2601         case SNDRV_EMU10K1_IOCTL_STOP:
2602                 if (!capable(CAP_SYS_ADMIN))
2603                         return -EPERM;
2604                 if (emu->audigy)
2605                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP);
2606                 else
2607                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP);
2608                 return 0;
2609         case SNDRV_EMU10K1_IOCTL_CONTINUE:
2610                 if (!capable(CAP_SYS_ADMIN))
2611                         return -EPERM;
2612                 if (emu->audigy)
2613                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg = 0);
2614                 else
2615                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg = 0);
2616                 return 0;
2617         case SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER:
2618                 if (!capable(CAP_SYS_ADMIN))
2619                         return -EPERM;
2620                 if (emu->audigy)
2621                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_ZC);
2622                 else
2623                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_ZC);
2624                 udelay(10);
2625                 if (emu->audigy)
2626                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
2627                 else
2628                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
2629                 return 0;
2630         case SNDRV_EMU10K1_IOCTL_SINGLE_STEP:
2631                 if (!capable(CAP_SYS_ADMIN))
2632                         return -EPERM;
2633                 if (get_user(addr, (unsigned int __user *)argp))
2634                         return -EFAULT;
2635                 if (addr > 0x1ff)
2636                         return -EINVAL;
2637                 if (emu->audigy)
2638                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | addr);
2639                 else
2640                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | addr);
2641                 udelay(10);
2642                 if (emu->audigy)
2643                         snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg |= A_DBG_SINGLE_STEP | A_DBG_STEP_ADDR | addr);
2644                 else
2645                         snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg |= EMU10K1_DBG_SINGLE_STEP | EMU10K1_DBG_STEP | addr);
2646                 return 0;
2647         case SNDRV_EMU10K1_IOCTL_DBG_READ:
2648                 if (emu->audigy)
2649                         addr = snd_emu10k1_ptr_read(emu, A_DBG, 0);
2650                 else
2651                         addr = snd_emu10k1_ptr_read(emu, DBG, 0);
2652                 if (put_user(addr, (unsigned int __user *)argp))
2653                         return -EFAULT;
2654                 return 0;
2655         }
2656         return -ENOTTY;
2657 }
2658
2659 static int snd_emu10k1_fx8010_release(struct snd_hwdep * hw, struct file *file)
2660 {
2661         return 0;
2662 }
2663
2664 int snd_emu10k1_fx8010_new(struct snd_emu10k1 *emu, int device)
2665 {
2666         struct snd_hwdep *hw;
2667         int err;
2668         
2669         if ((err = snd_hwdep_new(emu->card, "FX8010", device, &hw)) < 0)
2670                 return err;
2671         strcpy(hw->name, "EMU10K1 (FX8010)");
2672         hw->iface = SNDRV_HWDEP_IFACE_EMU10K1;
2673         hw->ops.open = snd_emu10k1_fx8010_open;
2674         hw->ops.ioctl = snd_emu10k1_fx8010_ioctl;
2675         hw->ops.release = snd_emu10k1_fx8010_release;
2676         hw->private_data = emu;
2677         return 0;
2678 }
2679
2680 #ifdef CONFIG_PM_SLEEP
2681 int snd_emu10k1_efx_alloc_pm_buffer(struct snd_emu10k1 *emu)
2682 {
2683         int len;
2684
2685         len = emu->audigy ? 0x200 : 0x100;
2686         emu->saved_gpr = kmalloc_array(len, 4, GFP_KERNEL);
2687         if (! emu->saved_gpr)
2688                 return -ENOMEM;
2689         len = emu->audigy ? 0x100 : 0xa0;
2690         emu->tram_val_saved = kmalloc_array(len, 4, GFP_KERNEL);
2691         emu->tram_addr_saved = kmalloc_array(len, 4, GFP_KERNEL);
2692         if (! emu->tram_val_saved || ! emu->tram_addr_saved)
2693                 return -ENOMEM;
2694         len = emu->audigy ? 2 * 1024 : 2 * 512;
2695         emu->saved_icode = vmalloc(len * 4);
2696         if (! emu->saved_icode)
2697                 return -ENOMEM;
2698         return 0;
2699 }
2700
2701 void snd_emu10k1_efx_free_pm_buffer(struct snd_emu10k1 *emu)
2702 {
2703         kfree(emu->saved_gpr);
2704         kfree(emu->tram_val_saved);
2705         kfree(emu->tram_addr_saved);
2706         vfree(emu->saved_icode);
2707 }
2708
2709 /*
2710  * save/restore GPR, TRAM and codes
2711  */
2712 void snd_emu10k1_efx_suspend(struct snd_emu10k1 *emu)
2713 {
2714         int i, len;
2715
2716         len = emu->audigy ? 0x200 : 0x100;
2717         for (i = 0; i < len; i++)
2718                 emu->saved_gpr[i] = snd_emu10k1_ptr_read(emu, emu->gpr_base + i, 0);
2719
2720         len = emu->audigy ? 0x100 : 0xa0;
2721         for (i = 0; i < len; i++) {
2722                 emu->tram_val_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMDATAREGBASE + i, 0);
2723                 emu->tram_addr_saved[i] = snd_emu10k1_ptr_read(emu, TANKMEMADDRREGBASE + i, 0);
2724                 if (emu->audigy) {
2725                         emu->tram_addr_saved[i] >>= 12;
2726                         emu->tram_addr_saved[i] |=
2727                                 snd_emu10k1_ptr_read(emu, A_TANKMEMCTLREGBASE + i, 0) << 20;
2728                 }
2729         }
2730
2731         len = emu->audigy ? 2 * 1024 : 2 * 512;
2732         for (i = 0; i < len; i++)
2733                 emu->saved_icode[i] = snd_emu10k1_efx_read(emu, i);
2734 }
2735
2736 void snd_emu10k1_efx_resume(struct snd_emu10k1 *emu)
2737 {
2738         int i, len;
2739
2740         /* set up TRAM */
2741         if (emu->fx8010.etram_pages.bytes > 0) {
2742                 unsigned size, size_reg = 0;
2743                 size = emu->fx8010.etram_pages.bytes / 2;
2744                 size = (size - 1) >> 13;
2745                 while (size) {
2746                         size >>= 1;
2747                         size_reg++;
2748                 }
2749                 outl(HCFG_LOCKTANKCACHE_MASK | inl(emu->port + HCFG), emu->port + HCFG);
2750                 snd_emu10k1_ptr_write(emu, TCB, 0, emu->fx8010.etram_pages.addr);
2751                 snd_emu10k1_ptr_write(emu, TCBS, 0, size_reg);
2752                 outl(inl(emu->port + HCFG) & ~HCFG_LOCKTANKCACHE_MASK, emu->port + HCFG);
2753         }
2754
2755         if (emu->audigy)
2756                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg | A_DBG_SINGLE_STEP);
2757         else
2758                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg | EMU10K1_DBG_SINGLE_STEP);
2759
2760         len = emu->audigy ? 0x200 : 0x100;
2761         for (i = 0; i < len; i++)
2762                 snd_emu10k1_ptr_write(emu, emu->gpr_base + i, 0, emu->saved_gpr[i]);
2763
2764         len = emu->audigy ? 0x100 : 0xa0;
2765         for (i = 0; i < len; i++) {
2766                 snd_emu10k1_ptr_write(emu, TANKMEMDATAREGBASE + i, 0,
2767                                       emu->tram_val_saved[i]);
2768                 if (! emu->audigy)
2769                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0,
2770                                               emu->tram_addr_saved[i]);
2771                 else {
2772                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0,
2773                                               emu->tram_addr_saved[i] << 12);
2774                         snd_emu10k1_ptr_write(emu, TANKMEMADDRREGBASE + i, 0,
2775                                               emu->tram_addr_saved[i] >> 20);
2776                 }
2777         }
2778
2779         len = emu->audigy ? 2 * 1024 : 2 * 512;
2780         for (i = 0; i < len; i++)
2781                 snd_emu10k1_efx_write(emu, i, emu->saved_icode[i]);
2782
2783         /* start FX processor when the DSP code is updated */
2784         if (emu->audigy)
2785                 snd_emu10k1_ptr_write(emu, A_DBG, 0, emu->fx8010.dbg);
2786         else
2787                 snd_emu10k1_ptr_write(emu, DBG, 0, emu->fx8010.dbg);
2788 }
2789 #endif