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