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