root/sound/pci/emu10k1/emufx.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. snd_emu10k1_gpr_ctl_info
  2. snd_emu10k1_gpr_ctl_get
  3. snd_emu10k1_gpr_ctl_put
  4. snd_emu10k1_fx8010_interrupt
  5. snd_emu10k1_fx8010_register_irq_handler
  6. snd_emu10k1_fx8010_unregister_irq_handler
  7. snd_emu10k1_write_op
  8. snd_emu10k1_audigy_write_op
  9. snd_emu10k1_efx_write
  10. snd_emu10k1_efx_read
  11. snd_emu10k1_gpr_poke
  12. snd_emu10k1_gpr_peek
  13. snd_emu10k1_tram_poke
  14. snd_emu10k1_tram_peek
  15. snd_emu10k1_code_poke
  16. snd_emu10k1_code_peek
  17. snd_emu10k1_look_for_ctl
  18. copy_tlv
  19. copy_gctl
  20. copy_gctl_to_user
  21. snd_emu10k1_verify_controls
  22. snd_emu10k1_ctl_private_free
  23. snd_emu10k1_add_controls
  24. snd_emu10k1_del_controls
  25. snd_emu10k1_list_controls
  26. snd_emu10k1_icode_poke
  27. snd_emu10k1_icode_peek
  28. snd_emu10k1_ipcm_poke
  29. snd_emu10k1_ipcm_peek
  30. snd_emu10k1_init_mono_control
  31. snd_emu10k1_init_stereo_control
  32. snd_emu10k1_init_mono_onoff_control
  33. snd_emu10k1_init_stereo_onoff_control
  34. snd_emu10k1_audigy_dsp_convert_32_to_2x16
  35. _snd_emu10k1_audigy_init_efx
  36. _volume
  37. _volume_add
  38. _volume_out
  39. _snd_emu10k1_init_efx
  40. snd_emu10k1_init_efx
  41. snd_emu10k1_free_efx
  42. snd_emu10k1_fx8010_tone_control_activate
  43. snd_emu10k1_fx8010_tone_control_deactivate
  44. snd_emu10k1_fx8010_tram_setup
  45. snd_emu10k1_fx8010_open
  46. copy_string
  47. snd_emu10k1_fx8010_info
  48. snd_emu10k1_fx8010_ioctl
  49. snd_emu10k1_fx8010_release
  50. snd_emu10k1_fx8010_new
  51. snd_emu10k1_efx_alloc_pm_buffer
  52. snd_emu10k1_efx_free_pm_buffer
  53. snd_emu10k1_efx_suspend
  54. snd_emu10k1_efx_resume

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

/* [<][>][^][v][top][bottom][index][help] */