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