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