Linux Audio

Check our new training course

Loading...
   1/*
   2 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   3 *                   Creative Labs, Inc.
   4 *  Routines for effect processor FX8010
   5 *
   6 *  Copyright (c) by James Courtier-Dutton <James@superbug.co.uk>
   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
  54static bool high_res_gpr_volume;
  55module_param(high_res_gpr_volume, bool, 0444);
  56MODULE_PARM_DESC(high_res_gpr_volume, "GPR mixer controls use 31-bit range.");
  57
  58/*
  59 *  Tables
  60 */ 
  61
  62static 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
  81static 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
 100static 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
 119static 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
 154static 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
 189static const u32 bass_table[41][5] = {
 190	{ 0x3e4f844f, 0x84ed4cc3, 0x3cc69927, 0x7b03553a, 0xc4da8486 },
 191	{ 0x3e69a17a, 0x84c280fb, 0x3cd77cd4, 0x7b2f2a6f, 0xc4b08d1d },
 192	{ 0x3e82ff42, 0x849991d5, 0x3ce7466b, 0x7b5917c6, 0xc48863ee },
 193	{ 0x3e9bab3c, 0x847267f0, 0x3cf5ffe8, 0x7b813560, 0xc461f22c },
 194	{ 0x3eb3b275, 0x844ced29, 0x3d03b295, 0x7ba79a1c, 0xc43d223b },
 195	{ 0x3ecb2174, 0x84290c8b, 0x3d106714, 0x7bcc5ba3, 0xc419dfa5 },
 196	{ 0x3ee2044b, 0x8406b244, 0x3d1c2561, 0x7bef8e77, 0xc3f8170f },
 197	{ 0x3ef86698, 0x83e5cb96, 0x3d26f4d8, 0x7c114600, 0xc3d7b625 },
 198	{ 0x3f0e5390, 0x83c646c9, 0x3d30dc39, 0x7c319498, 0xc3b8ab97 },
 199	{ 0x3f23d60b, 0x83a81321, 0x3d39e1af, 0x7c508b9c, 0xc39ae704 },
 200	{ 0x3f38f884, 0x838b20d2, 0x3d420ad2, 0x7c6e3b75, 0xc37e58f1 },
 201	{ 0x3f4dc52c, 0x836f60ef, 0x3d495cab, 0x7c8ab3a6, 0xc362f2be },
 202	{ 0x3f6245e8, 0x8354c565, 0x3d4fdbb8, 0x7ca602d6, 0xc348a69b },
 203	{ 0x3f76845f, 0x833b40ec, 0x3d558bf0, 0x7cc036df, 0xc32f677c },
 204	{ 0x3f8a8a03, 0x8322c6fb, 0x3d5a70c4, 0x7cd95cd7, 0xc317290b },
 205	{ 0x3f9e6014, 0x830b4bc3, 0x3d5e8d25, 0x7cf1811a, 0xc2ffdfa5 },
 206	{ 0x3fb20fae, 0x82f4c420, 0x3d61e37f, 0x7d08af56, 0xc2e9804a },
 207	{ 0x3fc5a1cc, 0x82df2592, 0x3d6475c3, 0x7d1ef294, 0xc2d40096 },
 208	{ 0x3fd91f55, 0x82ca6632, 0x3d664564, 0x7d345541, 0xc2bf56b9 },
 209	{ 0x3fec9120, 0x82b67cac, 0x3d675356, 0x7d48e138, 0xc2ab796e },
 210	{ 0x40000000, 0x82a36037, 0x3d67a012, 0x7d5c9fc9, 0xc2985fee },
 211	{ 0x401374c7, 0x8291088a, 0x3d672b93, 0x7d6f99c3, 0xc28601f2 },
 212	{ 0x4026f857, 0x827f6dd7, 0x3d65f559, 0x7d81d77c, 0xc27457a3 },
 213	{ 0x403a939f, 0x826e88c5, 0x3d63fc63, 0x7d9360d4, 0xc2635996 },
 214	{ 0x404e4faf, 0x825e5266, 0x3d613f32, 0x7da43d42, 0xc25300c6 },
 215	{ 0x406235ba, 0x824ec434, 0x3d5dbbc3, 0x7db473d7, 0xc243468e },
 216	{ 0x40764f1f, 0x823fd80c, 0x3d596f8f, 0x7dc40b44, 0xc23424a2 },
 217	{ 0x408aa576, 0x82318824, 0x3d545787, 0x7dd309e2, 0xc2259509 },
 218	{ 0x409f4296, 0x8223cf0b, 0x3d4e7012, 0x7de175b5, 0xc2179218 },
 219	{ 0x40b430a0, 0x8216a7a1, 0x3d47b505, 0x7def5475, 0xc20a1670 },
 220	{ 0x40c97a0a, 0x820a0d12, 0x3d4021a1, 0x7dfcab8d, 0xc1fd1cf5 },
 221	{ 0x40df29a6, 0x81fdfad6, 0x3d37b08d, 0x7e098028, 0xc1f0a0ca },
 222	{ 0x40f54ab1, 0x81f26ca9, 0x3d2e5bd1, 0x7e15d72b, 0xc1e49d52 },
 223	{ 0x410be8da, 0x81e75e89, 0x3d241cce, 0x7e21b544, 0xc1d90e24 },
 224	{ 0x41231051, 0x81dcccb3, 0x3d18ec37, 0x7e2d1ee6, 0xc1cdef10 },
 225	{ 0x413acdd0, 0x81d2b39e, 0x3d0cc20a, 0x7e38184e, 0xc1c33c13 },
 226	{ 0x41532ea7, 0x81c90ffb, 0x3cff9585, 0x7e42a58b, 0xc1b8f15a },
 227	{ 0x416c40cd, 0x81bfdeb2, 0x3cf15d21, 0x7e4cca7c, 0xc1af0b3f },
 228	{ 0x418612ea, 0x81b71cdc, 0x3ce20e85, 0x7e568ad3, 0xc1a58640 },
 229	{ 0x41a0b465, 0x81aec7c5, 0x3cd19e7c, 0x7e5fea1e, 0xc19c5f03 },
 230	{ 0x41bc3573, 0x81a6dcea, 0x3cc000e9, 0x7e68ebc2, 0xc1939250 }
 231};
 232
 233static const u32 treble_table[41][5] = {
 234	{ 0x0125cba9, 0xfed5debd, 0x00599b6c, 0x0d2506da, 0xfa85b354 },
 235	{ 0x0142f67e, 0xfeb03163, 0x0066cd0f, 0x0d14c69d, 0xfa914473 },
 236	{ 0x016328bd, 0xfe860158, 0x0075b7f2, 0x0d03eb27, 0xfa9d32d2 },
 237	{ 0x0186b438, 0xfe56c982, 0x00869234, 0x0cf27048, 0xfaa97fca },
 238	{ 0x01adf358, 0xfe21f5fe, 0x00999842, 0x0ce051c2, 0xfab62ca5 },
 239	{ 0x01d949fa, 0xfde6e287, 0x00af0d8d, 0x0ccd8b4a, 0xfac33aa7 },
 240	{ 0x02092669, 0xfda4d8bf, 0x00c73d4c, 0x0cba1884, 0xfad0ab07 },
 241	{ 0x023e0268, 0xfd5b0e4a, 0x00e27b54, 0x0ca5f509, 0xfade7ef2 },
 242	{ 0x0278645c, 0xfd08a2b0, 0x01012509, 0x0c911c63, 0xfaecb788 },
 243	{ 0x02b8e091, 0xfcac9d1a, 0x0123a262, 0x0c7b8a14, 0xfafb55df },
 244	{ 0x03001a9a, 0xfc45e9ce, 0x014a6709, 0x0c65398f, 0xfb0a5aff },
 245	{ 0x034ec6d7, 0xfbd3576b, 0x0175f397, 0x0c4e2643, 0xfb19c7e4 },
 246	{ 0x03a5ac15, 0xfb5393ee, 0x01a6d6ed, 0x0c364b94, 0xfb299d7c },
 247	{ 0x0405a562, 0xfac52968, 0x01ddafae, 0x0c1da4e2, 0xfb39dca5 },
 248	{ 0x046fa3fe, 0xfa267a66, 0x021b2ddd, 0x0c042d8d, 0xfb4a8631 },
 249	{ 0x04e4b17f, 0xf975be0f, 0x0260149f, 0x0be9e0f2, 0xfb5b9ae0 },
 250	{ 0x0565f220, 0xf8b0fbe5, 0x02ad3c29, 0x0bceba73, 0xfb6d1b60 },
 251	{ 0x05f4a745, 0xf7d60722, 0x030393d4, 0x0bb2b578, 0xfb7f084d },
 252	{ 0x06923236, 0xf6e279bd, 0x03642465, 0x0b95cd75, 0xfb916233 },
 253	{ 0x07401713, 0xf5d3aef9, 0x03d01283, 0x0b77fded, 0xfba42984 },
 254	{ 0x08000000, 0xf4a6bd88, 0x0448a161, 0x0b594278, 0xfbb75e9f },
 255	{ 0x08d3c097, 0xf3587131, 0x04cf35a4, 0x0b3996c9, 0xfbcb01cb },
 256	{ 0x09bd59a2, 0xf1e543f9, 0x05655880, 0x0b18f6b2, 0xfbdf1333 },
 257	{ 0x0abefd0f, 0xf04956ca, 0x060cbb12, 0x0af75e2c, 0xfbf392e8 },
 258	{ 0x0bdb123e, 0xee806984, 0x06c739fe, 0x0ad4c962, 0xfc0880dd },
 259	{ 0x0d143a94, 0xec85d287, 0x0796e150, 0x0ab134b0, 0xfc1ddce5 },
 260	{ 0x0e6d5664, 0xea547598, 0x087df0a0, 0x0a8c9cb6, 0xfc33a6ad },
 261	{ 0x0fe98a2a, 0xe7e6ba35, 0x097edf83, 0x0a66fe5b, 0xfc49ddc2 },
 262	{ 0x118c4421, 0xe536813a, 0x0a9c6248, 0x0a4056d7, 0xfc608185 },
 263	{ 0x1359422e, 0xe23d19eb, 0x0bd96efb, 0x0a18a3bf, 0xfc77912c },
 264	{ 0x1554982b, 0xdef33645, 0x0d3942bd, 0x09efe312, 0xfc8f0bc1 },
 265	{ 0x1782b68a, 0xdb50deb1, 0x0ebf676d, 0x09c6133f, 0xfca6f019 },
 266	{ 0x19e8715d, 0xd74d64fd, 0x106fb999, 0x099b3337, 0xfcbf3cd6 },
 267	{ 0x1c8b07b8, 0xd2df56ab, 0x124e6ec8, 0x096f4274, 0xfcd7f060 },
 268	{ 0x1f702b6d, 0xcdfc6e92, 0x14601c10, 0x0942410b, 0xfcf108e5 },
 269	{ 0x229e0933, 0xc89985cd, 0x16a9bcfa, 0x09142fb5, 0xfd0a8451 },
 270	{ 0x261b5118, 0xc2aa8409, 0x1930bab6, 0x08e50fdc, 0xfd24604d },
 271	{ 0x29ef3f5d, 0xbc224f28, 0x1bfaf396, 0x08b4e3aa, 0xfd3e9a3b },
 272	{ 0x2e21a59b, 0xb4f2ba46, 0x1f0ec2d6, 0x0883ae15, 0xfd592f33 },
 273	{ 0x32baf44b, 0xad0c7429, 0x227308a3, 0x085172eb, 0xfd741bfd },
 274	{ 0x37c4448b, 0xa45ef51d, 0x262f3267, 0x081e36dc, 0xfd8f5d14 }
 275};
 276
 277/* dB gain = (float) 20 * log10( float(db_table_value) / 0x8000000 ) */
 278static const u32 db_table[101] = {
 279	0x00000000, 0x01571f82, 0x01674b41, 0x01783a1b, 0x0189f540,
 280	0x019c8651, 0x01aff763, 0x01c45306, 0x01d9a446, 0x01eff6b8,
 281	0x0207567a, 0x021fd03d, 0x0239714c, 0x02544792, 0x027061a1,
 282	0x028dcebb, 0x02ac9edc, 0x02cce2bf, 0x02eeabe8, 0x03120cb0,
 283	0x0337184e, 0x035de2df, 0x03868173, 0x03b10a18, 0x03dd93e9,
 284	0x040c3713, 0x043d0cea, 0x04702ff3, 0x04a5bbf2, 0x04ddcdfb,
 285	0x0518847f, 0x0555ff62, 0x05966005, 0x05d9c95d, 0x06206005,
 286	0x066a4a52, 0x06b7b067, 0x0708bc4c, 0x075d9a01, 0x07b6779d,
 287	0x08138561, 0x0874f5d5, 0x08dafde1, 0x0945d4ed, 0x09b5b4fd,
 288	0x0a2adad1, 0x0aa58605, 0x0b25f936, 0x0bac7a24, 0x0c3951d8,
 289	0x0ccccccc, 0x0d673b17, 0x0e08f093, 0x0eb24510, 0x0f639481,
 290	0x101d3f2d, 0x10dfa9e6, 0x11ab3e3f, 0x12806ac3, 0x135fa333,
 291	0x144960c5, 0x153e2266, 0x163e6cfe, 0x174acbb7, 0x1863d04d,
 292	0x198a1357, 0x1abe349f, 0x1c00db77, 0x1d52b712, 0x1eb47ee6,
 293	0x2026f30f, 0x21aadcb6, 0x23410e7e, 0x24ea64f9, 0x26a7c71d,
 294	0x287a26c4, 0x2a62812c, 0x2c61df84, 0x2e795779, 0x30aa0bcf,
 295	0x32f52cfe, 0x355bf9d8, 0x37dfc033, 0x3a81dda4, 0x3d43c038,
 296	0x4026e73c, 0x432ce40f, 0x46575af8, 0x49a8040f, 0x4d20ac2a,
 297	0x50c335d3, 0x54919a57, 0x588dead1, 0x5cba514a, 0x611911ea,
 298	0x65ac8c2f, 0x6a773c39, 0x6f7bbc23, 0x74bcc56c, 0x7a3d3272,
 299	0x7fffffff,
 300};
 301
 302/* EMU10k1/EMU10k2 DSP control db gain */
 303static const DECLARE_TLV_DB_SCALE(snd_emu10k1_db_scale1, -4000, 40, 1);
 304static const DECLARE_TLV_DB_LINEAR(snd_emu10k1_db_linear, TLV_DB_GAIN_MUTE, 0);
 305
 306/* EMU10K1 bass/treble db gain */
 307static const DECLARE_TLV_DB_SCALE(snd_emu10k1_bass_treble_db_scale, -1200, 60, 0);
 308
 309static const u32 onoff_table[2] = {
 310	0x00000000, 0x00000001
 311};
 312
 313/*
 314 */
 315 
 316static 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
 323static inline void snd_leave_user(mm_segment_t fs)
 324{
 325	set_fs(fs);
 326}
 327
 328/*
 329 *   controls
 330 */
 331
 332static 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)
 338		uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
 339	else
 340		uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 341	uinfo->count = ctl->vcount;
 342	uinfo->value.integer.min = ctl->min;
 343	uinfo->value.integer.max = ctl->max;
 344	return 0;
 345}
 346
 347static 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
 362static 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) {
 383		case EMU10K1_GPR_TRANSLATION_NONE:
 384			snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, val);
 385			break;
 386		case EMU10K1_GPR_TRANSLATION_TABLE100:
 387			snd_emu10k1_ptr_write(emu, emu->gpr_base + ctl->gpr[i], 0, db_table[val]);
 388			break;
 389		case EMU10K1_GPR_TRANSLATION_BASS:
 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;
 397		case EMU10K1_GPR_TRANSLATION_TREBLE:
 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;
 405		case EMU10K1_GPR_TRANSLATION_ONOFF:
 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
 419static 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
 435int 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
 466int 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
 494static 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
 511static 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
 528static 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
 534unsigned 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
 540static 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
 556static 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
 571static 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
 594static 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
 617static 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
 634static int snd_emu10k1_code_peek(struct snd_emu10k1 *emu,
 635				 struct snd_emu10k1_fx8010_code *icode)
 636{
 637	u32 pc;
 638
 639	memset(icode->code_valid, 0, sizeof(icode->code_valid));
 640	for (pc = 0; pc < (emu->audigy ? 2*1024 : 2*512); pc += 2) {
 641		set_bit(pc / 2, icode->code_valid);
 642		if (put_user(snd_emu10k1_efx_read(emu, pc + 0), &icode->code[pc + 0]))
 643			return -EFAULT;
 644		if (put_user(snd_emu10k1_efx_read(emu, pc + 1), &icode->code[pc + 1]))
 645			return -EFAULT;
 646	}
 647	return 0;
 648}
 649
 650static struct snd_emu10k1_fx8010_ctl *
 651snd_emu10k1_look_for_ctl(struct snd_emu10k1 *emu, struct snd_ctl_elem_id *id)
 652{
 653	struct snd_emu10k1_fx8010_ctl *ctl;
 654	struct snd_kcontrol *kcontrol;
 655
 656	list_for_each_entry(ctl, &emu->fx8010.gpr_ctl, list) {
 657		kcontrol = ctl->kcontrol;
 658		if (kcontrol->id.iface == id->iface &&
 659		    !strcmp(kcontrol->id.name, id->name) &&
 660		    kcontrol->id.index == id->index)
 661			return ctl;
 662	}
 663	return NULL;
 664}
 665
 666#define MAX_TLV_SIZE	256
 667
 668static unsigned int *copy_tlv(const unsigned int __user *_tlv)
 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
 690static 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{
 695	struct snd_emu10k1_fx8010_control_old_gpr __user *octl;
 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
 706static 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{
 711	struct snd_emu10k1_fx8010_control_old_gpr __user *octl;
 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
 720static 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
 772static 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
 784static 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 |
 828				SNDRV_CTL_ELEM_ACCESS_TLV_READ;
 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;
 864			snd_ctl_notify(emu->card, SNDRV_CTL_EVENT_MASK_VALUE |
 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
 876static 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
 898static 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
 944static 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
 976static 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
 995static 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
1041static 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
1076static void __devinit
1077snd_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;
1088		ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
1089	} else {
1090		ctl->min = 0;
1091		ctl->max = 100;
1092		ctl->tlv = snd_emu10k1_db_scale1;
1093		ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
1094	}
1095}
1096
1097static void __devinit
1098snd_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;
1110		ctl->translation = EMU10K1_GPR_TRANSLATION_NONE;
1111	} else {
1112		ctl->min = 0;
1113		ctl->max = 100;
1114		ctl->tlv = snd_emu10k1_db_scale1;
1115		ctl->translation = EMU10K1_GPR_TRANSLATION_TABLE100;
1116	}
1117}
1118
1119static void __devinit
1120snd_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;
1129	ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
1130}
1131
1132static void __devinit
1133snd_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;
1143	ctl->translation = EMU10K1_GPR_TRANSLATION_ONOFF;
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 */
1151static 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
1171static 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;
1181	struct snd_emu10k1_fx8010_control_gpr *controls = NULL, *ctl;
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) \
1286A_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 */	
1315	A_OP(icode, &ptr, iINTERP, A_EXTOUT(A_EXTOUT_MIC_CAP), A_EXTIN(A_EXTIN_AC97_L), 0xcd, A_EXTIN(A_EXTIN_AC97_R));
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 */
1531	A_PUT_STEREO_OUTPUT(A_EXTOUT_AFRONT_L, A_EXTOUT_AFRONT_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
1532	A_PUT_STEREO_OUTPUT(A_EXTOUT_AREAR_L, A_EXTOUT_AREAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
1533	A_PUT_OUTPUT(A_EXTOUT_ACENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
1534	A_PUT_OUTPUT(A_EXTOUT_ALFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
1535	if (emu->card_capabilities->spk71)
1536		A_PUT_STEREO_OUTPUT(A_EXTOUT_ASIDE_L, A_EXTOUT_ASIDE_R, playback+6 + SND_EMU10K1_PLAYBACK_CHANNELS);
1537
1538	/* headphone */
1539	A_PUT_STEREO_OUTPUT(A_EXTOUT_HEADPHONE_L, A_EXTOUT_HEADPHONE_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
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	
1579	A_PUT_STEREO_OUTPUT(A_EXTOUT_REAR_L, A_EXTOUT_REAR_R, playback+2 + SND_EMU10K1_PLAYBACK_CHANNELS);
1580	A_PUT_OUTPUT(A_EXTOUT_CENTER, playback+4 + SND_EMU10K1_PLAYBACK_CHANNELS);
1581	A_PUT_OUTPUT(A_EXTOUT_LFE, playback+5 + SND_EMU10K1_PLAYBACK_CHANNELS);
1582
1583	/* ADC buffer */
1584#ifdef EMU10K1_CAPTURE_DIGITAL_OUT
1585	A_PUT_STEREO_OUTPUT(A_EXTOUT_ADC_CAP_L, A_EXTOUT_ADC_CAP_R, playback + SND_EMU10K1_PLAYBACK_CHANNELS);
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),
1654			     A_C_00000000, A_C_00000000);
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),
1661			     A_C_00000000, A_C_00000000);
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),
1668			     A_C_00000000, A_C_00000000);
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),
1675			     A_C_00000000, A_C_00000000);
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),
1682			     A_C_00000000, A_C_00000000);
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),
1689			     A_C_00000000, A_C_00000000);
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),
1696			     A_C_00000000, A_C_00000000);
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),
1703			     A_C_00000000, A_C_00000000);
1704		}
1705
1706#if 0
1707		for (z = 4; z < 8; z++) {
1708			A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_C_00000000);
1709		}
1710		for (z = 0xc; z < 0x10; z++) {
1711			A_OP(icode, &ptr, iACC3, A_FXBUS2(z), A_C_00000000, A_C_00000000, A_C_00000000);
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) */
1760static 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);
1764	OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000001);
1765	OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);
1766}
1767static 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);
1770	OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1771	OP(icode, ptr, iMACINT0, dst, dst, src, C_00000001);
1772	OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);
1773	OP(icode, ptr, iMAC0, dst, dst, src, vol);
1774}
1775static 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);
1778	OP(icode, ptr, iSKIP, GPR_COND, GPR_COND, CC_REG_NONZERO, C_00000002);
1779	OP(icode, ptr, iACC3, dst, src, C_00000000, C_00000000);
1780	OP(icode, ptr, iSKIP, C_00000000, C_7fffffff, C_7fffffff, C_00000001);
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
1806static 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);
1862	OP(icode, &ptr, iMACINT0, GPR(4), C_00000000, FXBUS(FXBUS_PCM_LEFT_REAR), C_00000004);
1863	OP(icode, &ptr, iMACINT0, GPR(5), C_00000000, FXBUS(FXBUS_PCM_RIGHT_REAR), 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 */
1868	OP(icode, &ptr, iMACINT0, GPR(10), C_00000000, FXBUS(FXBUS_PCM_LEFT_FRONT), C_00000004);
1869	OP(icode, &ptr, iMACINT0, GPR(11), C_00000000, FXBUS(FXBUS_PCM_RIGHT_FRONT), C_00000004);
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
2291		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
2292		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 4), C_00000000, C_00000000);
2293#else
2294		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_CENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
2295		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ACENTER), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 0), C_00000000, C_00000000);
2296#endif
2297	}
2298
2299	if (emu->fx8010.extout_mask & (1<<EXTOUT_AC97_LFE)) {
2300#ifndef EMU10K1_CENTER_LFE_FROM_FRONT
2301		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
2302		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_ALFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 5), C_00000000, C_00000000);
2303#else
2304		OP(icode, &ptr, iACC3, EXTOUT(EXTOUT_AC97_LFE), GPR(playback + SND_EMU10K1_PLAYBACK_CHANNELS + 1), C_00000000, C_00000000);
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
2376int __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
2386void 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? */
2396int 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
2404int 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
2413int 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) {
2441		if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(emu->pci),
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
2455static int snd_emu10k1_fx8010_open(struct snd_hwdep * hw, struct file *file)
2456{
2457	return 0;
2458}
2459
2460static 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
2468static 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
2493static 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) {
2504	case SNDRV_EMU10K1_IOCTL_PVERSION:
2505		emu->support_tlv = 1;
2506		return put_user(SNDRV_EMU10K1_VERSION, (int __user *)argp);
2507	case SNDRV_EMU10K1_IOCTL_INFO:
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;
2518	case SNDRV_EMU10K1_IOCTL_CODE_POKE:
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;
2528	case SNDRV_EMU10K1_IOCTL_CODE_PEEK:
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;
2539	case SNDRV_EMU10K1_IOCTL_PCM_POKE:
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;
2546	case SNDRV_EMU10K1_IOCTL_PCM_PEEK:
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;
2557	case SNDRV_EMU10K1_IOCTL_TRAM_SETUP:
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;
2566	case SNDRV_EMU10K1_IOCTL_STOP:
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;
2574	case SNDRV_EMU10K1_IOCTL_CONTINUE:
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;
2582	case SNDRV_EMU10K1_IOCTL_ZERO_TRAM_COUNTER:
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;
2595	case SNDRV_EMU10K1_IOCTL_SINGLE_STEP:
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;
2612	case SNDRV_EMU10K1_IOCTL_DBG_READ:
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
2624static int snd_emu10k1_fx8010_release(struct snd_hwdep * hw, struct file *file)
2625{
2626	return 0;
2627}
2628
2629int __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)");
2639	hw->iface = SNDRV_HWDEP_IFACE_EMU10K1;
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
2650int __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
2670void 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 */
2681void 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
2705void 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