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