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