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