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