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

source code of linux/sound/pci/emu10k1/emufx.c