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