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