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