linux/sound/pci/ac97/ac97_codec.c
<<
>>
Prefs
   1/*
   2 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
   3 *  Universal interface for Audio Codec '97
   4 *
   5 *  For more details look to AC '97 component specification revision 2.2
   6 *  by Intel Corporation (http://developer.intel.com).
   7 *
   8 *
   9 *   This program is free software; you can redistribute it and/or modify
  10 *   it under the terms of the GNU General Public License as published by
  11 *   the Free Software Foundation; either version 2 of the License, or
  12 *   (at your option) any later version.
  13 *
  14 *   This program is distributed in the hope that it will be useful,
  15 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 *   GNU General Public License for more details.
  18 *
  19 *   You should have received a copy of the GNU General Public License
  20 *   along with this program; if not, write to the Free Software
  21 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22 *
  23 */
  24
  25#include <sound/driver.h>
  26#include <linux/delay.h>
  27#include <linux/init.h>
  28#include <linux/slab.h>
  29#include <linux/pci.h>
  30#include <linux/moduleparam.h>
  31#include <linux/mutex.h>
  32#include <sound/core.h>
  33#include <sound/pcm.h>
  34#include <sound/tlv.h>
  35#include <sound/ac97_codec.h>
  36#include <sound/asoundef.h>
  37#include <sound/initval.h>
  38#include "ac97_id.h"
  39
  40#include "ac97_patch.c"
  41
  42MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
  43MODULE_DESCRIPTION("Universal interface for Audio Codec '97");
  44MODULE_LICENSE("GPL");
  45
  46static int enable_loopback;
  47
  48module_param(enable_loopback, bool, 0444);
  49MODULE_PARM_DESC(enable_loopback, "Enable AC97 ADC/DAC Loopback Control");
  50
  51#ifdef CONFIG_SND_AC97_POWER_SAVE
  52static int power_save = CONFIG_SND_AC97_POWER_SAVE_DEFAULT;
  53module_param(power_save, bool, 0644);
  54MODULE_PARM_DESC(power_save, "Enable AC97 power-saving control");
  55#endif
  56/*
  57
  58 */
  59
  60struct ac97_codec_id {
  61        unsigned int id;
  62        unsigned int mask;
  63        const char *name;
  64        int (*patch)(struct snd_ac97 *ac97);
  65        int (*mpatch)(struct snd_ac97 *ac97);
  66        unsigned int flags;
  67};
  68
  69static const struct ac97_codec_id snd_ac97_codec_id_vendors[] = {
  70{ 0x414b4d00, 0xffffff00, "Asahi Kasei",        NULL,   NULL },
  71{ 0x41445300, 0xffffff00, "Analog Devices",     NULL,   NULL },
  72{ 0x414c4300, 0xffffff00, "Realtek",            NULL,   NULL },
  73{ 0x414c4700, 0xffffff00, "Realtek",            NULL,   NULL },
  74{ 0x434d4900, 0xffffff00, "C-Media Electronics", NULL,  NULL },
  75{ 0x43525900, 0xffffff00, "Cirrus Logic",       NULL,   NULL },
  76{ 0x43585400, 0xffffff00, "Conexant",           NULL,   NULL },
  77{ 0x44543000, 0xffffff00, "Diamond Technology", NULL,   NULL },
  78{ 0x454d4300, 0xffffff00, "eMicro",             NULL,   NULL },
  79{ 0x45838300, 0xffffff00, "ESS Technology",     NULL,   NULL },
  80{ 0x48525300, 0xffffff00, "Intersil",           NULL,   NULL },
  81{ 0x49434500, 0xffffff00, "ICEnsemble",         NULL,   NULL },
  82{ 0x49544500, 0xffffff00, "ITE Tech.Inc",       NULL,   NULL },
  83{ 0x4e534300, 0xffffff00, "National Semiconductor", NULL, NULL },
  84{ 0x50534300, 0xffffff00, "Philips",            NULL,   NULL },
  85{ 0x53494c00, 0xffffff00, "Silicon Laboratory", NULL,   NULL },
  86{ 0x54524100, 0xffffff00, "TriTech",            NULL,   NULL },
  87{ 0x54584e00, 0xffffff00, "Texas Instruments",  NULL,   NULL },
  88{ 0x56494100, 0xffffff00, "VIA Technologies",   NULL,   NULL },
  89{ 0x57454300, 0xffffff00, "Winbond",            NULL,   NULL },
  90{ 0x574d4c00, 0xffffff00, "Wolfson",            NULL,   NULL },
  91{ 0x594d4800, 0xffffff00, "Yamaha",             NULL,   NULL },
  92{ 0x83847600, 0xffffff00, "SigmaTel",           NULL,   NULL },
  93{ 0,          0,          NULL,                 NULL,   NULL }
  94};
  95
  96static const struct ac97_codec_id snd_ac97_codec_ids[] = {
  97{ 0x414b4d00, 0xffffffff, "AK4540",             NULL,           NULL },
  98{ 0x414b4d01, 0xffffffff, "AK4542",             NULL,           NULL },
  99{ 0x414b4d02, 0xffffffff, "AK4543",             NULL,           NULL },
 100{ 0x414b4d06, 0xffffffff, "AK4544A",            NULL,           NULL },
 101{ 0x414b4d07, 0xffffffff, "AK4545",             NULL,           NULL },
 102{ 0x41445303, 0xffffffff, "AD1819",             patch_ad1819,   NULL },
 103{ 0x41445340, 0xffffffff, "AD1881",             patch_ad1881,   NULL },
 104{ 0x41445348, 0xffffffff, "AD1881A",            patch_ad1881,   NULL },
 105{ 0x41445360, 0xffffffff, "AD1885",             patch_ad1885,   NULL },
 106{ 0x41445361, 0xffffffff, "AD1886",             patch_ad1886,   NULL },
 107{ 0x41445362, 0xffffffff, "AD1887",             patch_ad1881,   NULL },
 108{ 0x41445363, 0xffffffff, "AD1886A",            patch_ad1881,   NULL },
 109{ 0x41445368, 0xffffffff, "AD1888",             patch_ad1888,   NULL },
 110{ 0x41445370, 0xffffffff, "AD1980",             patch_ad1980,   NULL },
 111{ 0x41445372, 0xffffffff, "AD1981A",            patch_ad1981a,  NULL },
 112{ 0x41445374, 0xffffffff, "AD1981B",            patch_ad1981b,  NULL },
 113{ 0x41445375, 0xffffffff, "AD1985",             patch_ad1985,   NULL },
 114{ 0x41445378, 0xffffffff, "AD1986",             patch_ad1986,   NULL },
 115{ 0x414c4300, 0xffffff00, "ALC100,100P",        NULL,           NULL },
 116{ 0x414c4710, 0xfffffff0, "ALC200,200P",        NULL,           NULL },
 117{ 0x414c4721, 0xffffffff, "ALC650D",            NULL,   NULL }, /* already patched */
 118{ 0x414c4722, 0xffffffff, "ALC650E",            NULL,   NULL }, /* already patched */
 119{ 0x414c4723, 0xffffffff, "ALC650F",            NULL,   NULL }, /* already patched */
 120{ 0x414c4720, 0xfffffff0, "ALC650",             patch_alc650,   NULL },
 121{ 0x414c4760, 0xfffffff0, "ALC655",             patch_alc655,   NULL },
 122{ 0x414c4781, 0xffffffff, "ALC658D",            NULL,   NULL }, /* already patched */
 123{ 0x414c4780, 0xfffffff0, "ALC658",             patch_alc655,   NULL },
 124{ 0x414c4790, 0xfffffff0, "ALC850",             patch_alc850,   NULL },
 125{ 0x414c4730, 0xffffffff, "ALC101",             NULL,           NULL },
 126{ 0x414c4740, 0xfffffff0, "ALC202",             NULL,           NULL },
 127{ 0x414c4750, 0xfffffff0, "ALC250",             NULL,           NULL },
 128{ 0x414c4770, 0xfffffff0, "ALC203",             NULL,           NULL },
 129{ 0x434d4941, 0xffffffff, "CMI9738",            patch_cm9738,   NULL },
 130{ 0x434d4961, 0xffffffff, "CMI9739",            patch_cm9739,   NULL },
 131{ 0x434d4969, 0xffffffff, "CMI9780",            patch_cm9780,   NULL },
 132{ 0x434d4978, 0xffffffff, "CMI9761A",           patch_cm9761,   NULL },
 133{ 0x434d4982, 0xffffffff, "CMI9761B",           patch_cm9761,   NULL },
 134{ 0x434d4983, 0xffffffff, "CMI9761A+",          patch_cm9761,   NULL },
 135{ 0x43525900, 0xfffffff8, "CS4297",             NULL,           NULL },
 136{ 0x43525910, 0xfffffff8, "CS4297A",            patch_cirrus_spdif,     NULL },
 137{ 0x43525920, 0xfffffff8, "CS4298",             patch_cirrus_spdif,             NULL },
 138{ 0x43525928, 0xfffffff8, "CS4294",             NULL,           NULL },
 139{ 0x43525930, 0xfffffff8, "CS4299",             patch_cirrus_cs4299,    NULL },
 140{ 0x43525948, 0xfffffff8, "CS4201",             NULL,           NULL },
 141{ 0x43525958, 0xfffffff8, "CS4205",             patch_cirrus_spdif,     NULL },
 142{ 0x43525960, 0xfffffff8, "CS4291",             NULL,           NULL },
 143{ 0x43525970, 0xfffffff8, "CS4202",             NULL,           NULL },
 144{ 0x43585421, 0xffffffff, "HSD11246",           NULL,           NULL }, // SmartMC II
 145{ 0x43585428, 0xfffffff8, "Cx20468",            patch_conexant, NULL }, // SmartAMC fixme: the mask might be different
 146{ 0x43585431, 0xffffffff, "Cx20551",           patch_cx20551,  NULL },
 147{ 0x44543031, 0xfffffff0, "DT0398",             NULL,           NULL },
 148{ 0x454d4328, 0xffffffff, "EM28028",            NULL,           NULL },  // same as TR28028?
 149{ 0x45838308, 0xffffffff, "ESS1988",            NULL,           NULL },
 150{ 0x48525300, 0xffffff00, "HMP9701",            NULL,           NULL },
 151{ 0x49434501, 0xffffffff, "ICE1230",            NULL,           NULL },
 152{ 0x49434511, 0xffffffff, "ICE1232",            NULL,           NULL }, // alias VIA VT1611A?
 153{ 0x49434514, 0xffffffff, "ICE1232A",           NULL,           NULL },
 154{ 0x49434551, 0xffffffff, "VT1616",             patch_vt1616,   NULL }, 
 155{ 0x49434552, 0xffffffff, "VT1616i",            patch_vt1616,   NULL }, // VT1616 compatible (chipset integrated)
 156{ 0x49544520, 0xffffffff, "IT2226E",            NULL,           NULL },
 157{ 0x49544561, 0xffffffff, "IT2646E",            patch_it2646,   NULL },
 158{ 0x4e534300, 0xffffffff, "LM4540,43,45,46,48", NULL,           NULL }, // only guess --jk
 159{ 0x4e534331, 0xffffffff, "LM4549",             NULL,           NULL },
 160{ 0x4e534350, 0xffffffff, "LM4550",             patch_lm4550,   NULL }, // volume wrap fix 
 161{ 0x50534304, 0xffffffff, "UCB1400",            patch_ucb1400,  NULL },
 162{ 0x53494c20, 0xffffffe0, "Si3036,8",           mpatch_si3036,  mpatch_si3036, AC97_MODEM_PATCH },
 163{ 0x54524102, 0xffffffff, "TR28022",            NULL,           NULL },
 164{ 0x54524106, 0xffffffff, "TR28026",            NULL,           NULL },
 165{ 0x54524108, 0xffffffff, "TR28028",            patch_tritech_tr28028,  NULL }, // added by xin jin [07/09/99]
 166{ 0x54524123, 0xffffffff, "TR28602",            NULL,           NULL }, // only guess --jk [TR28023 = eMicro EM28023 (new CT1297)]
 167{ 0x54584e20, 0xffffffff, "TLC320AD9xC",        NULL,           NULL },
 168{ 0x56494161, 0xffffffff, "VIA1612A",           NULL,           NULL }, // modified ICE1232 with S/PDIF
 169{ 0x56494170, 0xffffffff, "VIA1617A",           patch_vt1617a,  NULL }, // modified VT1616 with S/PDIF
 170{ 0x56494182, 0xffffffff, "VIA1618",            NULL,           NULL },
 171{ 0x57454301, 0xffffffff, "W83971D",            NULL,           NULL },
 172{ 0x574d4c00, 0xffffffff, "WM9701A",            NULL,           NULL },
 173{ 0x574d4C03, 0xffffffff, "WM9703,WM9707,WM9708,WM9717", patch_wolfson03, NULL},
 174{ 0x574d4C04, 0xffffffff, "WM9704M,WM9704Q",    patch_wolfson04, NULL},
 175{ 0x574d4C05, 0xffffffff, "WM9705,WM9710",      patch_wolfson05, NULL},
 176{ 0x574d4C09, 0xffffffff, "WM9709",             NULL,           NULL},
 177{ 0x574d4C12, 0xffffffff, "WM9711,WM9712",      patch_wolfson11, NULL},
 178{ 0x574d4c13, 0xffffffff, "WM9713,WM9714",      patch_wolfson13, NULL, AC97_DEFAULT_POWER_OFF},
 179{ 0x594d4800, 0xffffffff, "YMF743",             patch_yamaha_ymf743,    NULL },
 180{ 0x594d4802, 0xffffffff, "YMF752",             NULL,           NULL },
 181{ 0x594d4803, 0xffffffff, "YMF753",             patch_yamaha_ymf753,    NULL },
 182{ 0x83847600, 0xffffffff, "STAC9700,83,84",     patch_sigmatel_stac9700,        NULL },
 183{ 0x83847604, 0xffffffff, "STAC9701,3,4,5",     NULL,           NULL },
 184{ 0x83847605, 0xffffffff, "STAC9704",           NULL,           NULL },
 185{ 0x83847608, 0xffffffff, "STAC9708,11",        patch_sigmatel_stac9708,        NULL },
 186{ 0x83847609, 0xffffffff, "STAC9721,23",        patch_sigmatel_stac9721,        NULL },
 187{ 0x83847644, 0xffffffff, "STAC9744",           patch_sigmatel_stac9744,        NULL },
 188{ 0x83847650, 0xffffffff, "STAC9750,51",        NULL,           NULL }, // patch?
 189{ 0x83847652, 0xffffffff, "STAC9752,53",        NULL,           NULL }, // patch?
 190{ 0x83847656, 0xffffffff, "STAC9756,57",        patch_sigmatel_stac9756,        NULL },
 191{ 0x83847658, 0xffffffff, "STAC9758,59",        patch_sigmatel_stac9758,        NULL },
 192{ 0x83847666, 0xffffffff, "STAC9766,67",        NULL,           NULL }, // patch?
 193{ 0,          0,          NULL,                 NULL,           NULL }
 194};
 195
 196
 197static void update_power_regs(struct snd_ac97 *ac97);
 198#ifdef CONFIG_SND_AC97_POWER_SAVE
 199#define ac97_is_power_save_mode(ac97) \
 200        ((ac97->scaps & AC97_SCAP_POWER_SAVE) && power_save)
 201#else
 202#define ac97_is_power_save_mode(ac97) 0
 203#endif
 204
 205
 206/*
 207 *  I/O routines
 208 */
 209
 210static int snd_ac97_valid_reg(struct snd_ac97 *ac97, unsigned short reg)
 211{
 212        /* filter some registers for buggy codecs */
 213        switch (ac97->id) {
 214        case AC97_ID_AK4540:
 215        case AC97_ID_AK4542:
 216                if (reg <= 0x1c || reg == 0x20 || reg == 0x26 || reg >= 0x7c)
 217                        return 1;
 218                return 0;
 219        case AC97_ID_AD1819:    /* AD1819 */
 220        case AC97_ID_AD1881:    /* AD1881 */
 221        case AC97_ID_AD1881A:   /* AD1881A */
 222                if (reg >= 0x3a && reg <= 0x6e) /* 0x59 */
 223                        return 0;
 224                return 1;
 225        case AC97_ID_AD1885:    /* AD1885 */
 226        case AC97_ID_AD1886:    /* AD1886 */
 227        case AC97_ID_AD1886A:   /* AD1886A - !!verify!! --jk */
 228        case AC97_ID_AD1887:    /* AD1887 - !!verify!! --jk */
 229                if (reg == 0x5a)
 230                        return 1;
 231                if (reg >= 0x3c && reg <= 0x6e) /* 0x59 */
 232                        return 0;
 233                return 1;
 234        case AC97_ID_STAC9700:
 235        case AC97_ID_STAC9704:
 236        case AC97_ID_STAC9705:
 237        case AC97_ID_STAC9708:
 238        case AC97_ID_STAC9721:
 239        case AC97_ID_STAC9744:
 240        case AC97_ID_STAC9756:
 241                if (reg <= 0x3a || reg >= 0x5a)
 242                        return 1;
 243                return 0;
 244        }
 245        return 1;
 246}
 247
 248/**
 249 * snd_ac97_write - write a value on the given register
 250 * @ac97: the ac97 instance
 251 * @reg: the register to change
 252 * @value: the value to set
 253 *
 254 * Writes a value on the given register.  This will invoke the write
 255 * callback directly after the register check.
 256 * This function doesn't change the register cache unlike
 257 * #snd_ca97_write_cache(), so use this only when you don't want to
 258 * reflect the change to the suspend/resume state.
 259 */
 260void snd_ac97_write(struct snd_ac97 *ac97, unsigned short reg, unsigned short value)
 261{
 262        if (!snd_ac97_valid_reg(ac97, reg))
 263                return;
 264        if ((ac97->id & 0xffffff00) == AC97_ID_ALC100) {
 265                /* Fix H/W bug of ALC100/100P */
 266                if (reg == AC97_MASTER || reg == AC97_HEADPHONE)
 267                        ac97->bus->ops->write(ac97, AC97_RESET, 0);     /* reset audio codec */
 268        }
 269        ac97->bus->ops->write(ac97, reg, value);
 270}
 271
 272EXPORT_SYMBOL(snd_ac97_write);
 273
 274/**
 275 * snd_ac97_read - read a value from the given register
 276 * 
 277 * @ac97: the ac97 instance
 278 * @reg: the register to read
 279 *
 280 * Reads a value from the given register.  This will invoke the read
 281 * callback directly after the register check.
 282 *
 283 * Returns the read value.
 284 */
 285unsigned short snd_ac97_read(struct snd_ac97 *ac97, unsigned short reg)
 286{
 287        if (!snd_ac97_valid_reg(ac97, reg))
 288                return 0;
 289        return ac97->bus->ops->read(ac97, reg);
 290}
 291
 292/* read a register - return the cached value if already read */
 293static inline unsigned short snd_ac97_read_cache(struct snd_ac97 *ac97, unsigned short reg)
 294{
 295        if (! test_bit(reg, ac97->reg_accessed)) {
 296                ac97->regs[reg] = ac97->bus->ops->read(ac97, reg);
 297                // set_bit(reg, ac97->reg_accessed);
 298        }
 299        return ac97->regs[reg];
 300}
 301
 302EXPORT_SYMBOL(snd_ac97_read);
 303
 304/**
 305 * snd_ac97_write_cache - write a value on the given register and update the cache
 306 * @ac97: the ac97 instance
 307 * @reg: the register to change
 308 * @value: the value to set
 309 *
 310 * Writes a value on the given register and updates the register
 311 * cache.  The cached values are used for the cached-read and the
 312 * suspend/resume.
 313 */
 314void snd_ac97_write_cache(struct snd_ac97 *ac97, unsigned short reg, unsigned short value)
 315{
 316        if (!snd_ac97_valid_reg(ac97, reg))
 317                return;
 318        mutex_lock(&ac97->reg_mutex);
 319        ac97->regs[reg] = value;
 320        ac97->bus->ops->write(ac97, reg, value);
 321        set_bit(reg, ac97->reg_accessed);
 322        mutex_unlock(&ac97->reg_mutex);
 323}
 324
 325EXPORT_SYMBOL(snd_ac97_write_cache);
 326
 327/**
 328 * snd_ac97_update - update the value on the given register
 329 * @ac97: the ac97 instance
 330 * @reg: the register to change
 331 * @value: the value to set
 332 *
 333 * Compares the value with the register cache and updates the value
 334 * only when the value is changed.
 335 *
 336 * Returns 1 if the value is changed, 0 if no change, or a negative
 337 * code on failure.
 338 */
 339int snd_ac97_update(struct snd_ac97 *ac97, unsigned short reg, unsigned short value)
 340{
 341        int change;
 342
 343        if (!snd_ac97_valid_reg(ac97, reg))
 344                return -EINVAL;
 345        mutex_lock(&ac97->reg_mutex);
 346        change = ac97->regs[reg] != value;
 347        if (change) {
 348                ac97->regs[reg] = value;
 349                ac97->bus->ops->write(ac97, reg, value);
 350        }
 351        set_bit(reg, ac97->reg_accessed);
 352        mutex_unlock(&ac97->reg_mutex);
 353        return change;
 354}
 355
 356EXPORT_SYMBOL(snd_ac97_update);
 357
 358/**
 359 * snd_ac97_update_bits - update the bits on the given register
 360 * @ac97: the ac97 instance
 361 * @reg: the register to change
 362 * @mask: the bit-mask to change
 363 * @value: the value to set
 364 *
 365 * Updates the masked-bits on the given register only when the value
 366 * is changed.
 367 *
 368 * Returns 1 if the bits are changed, 0 if no change, or a negative
 369 * code on failure.
 370 */
 371int snd_ac97_update_bits(struct snd_ac97 *ac97, unsigned short reg, unsigned short mask, unsigned short value)
 372{
 373        int change;
 374
 375        if (!snd_ac97_valid_reg(ac97, reg))
 376                return -EINVAL;
 377        mutex_lock(&ac97->reg_mutex);
 378        change = snd_ac97_update_bits_nolock(ac97, reg, mask, value);
 379        mutex_unlock(&ac97->reg_mutex);
 380        return change;
 381}
 382
 383EXPORT_SYMBOL(snd_ac97_update_bits);
 384
 385/* no lock version - see snd_ac97_updat_bits() */
 386int snd_ac97_update_bits_nolock(struct snd_ac97 *ac97, unsigned short reg,
 387                                unsigned short mask, unsigned short value)
 388{
 389        int change;
 390        unsigned short old, new;
 391
 392        old = snd_ac97_read_cache(ac97, reg);
 393        new = (old & ~mask) | (value & mask);
 394        change = old != new;
 395        if (change) {
 396                ac97->regs[reg] = new;
 397                ac97->bus->ops->write(ac97, reg, new);
 398        }
 399        set_bit(reg, ac97->reg_accessed);
 400        return change;
 401}
 402
 403static int snd_ac97_ad18xx_update_pcm_bits(struct snd_ac97 *ac97, int codec, unsigned short mask, unsigned short value)
 404{
 405        int change;
 406        unsigned short old, new, cfg;
 407
 408        mutex_lock(&ac97->page_mutex);
 409        old = ac97->spec.ad18xx.pcmreg[codec];
 410        new = (old & ~mask) | (value & mask);
 411        change = old != new;
 412        if (change) {
 413                mutex_lock(&ac97->reg_mutex);
 414                cfg = snd_ac97_read_cache(ac97, AC97_AD_SERIAL_CFG);
 415                ac97->spec.ad18xx.pcmreg[codec] = new;
 416                /* select single codec */
 417                ac97->bus->ops->write(ac97, AC97_AD_SERIAL_CFG,
 418                                 (cfg & ~0x7000) |
 419                                 ac97->spec.ad18xx.unchained[codec] | ac97->spec.ad18xx.chained[codec]);
 420                /* update PCM bits */
 421                ac97->bus->ops->write(ac97, AC97_PCM, new);
 422                /* select all codecs */
 423                ac97->bus->ops->write(ac97, AC97_AD_SERIAL_CFG,
 424                                 cfg | 0x7000);
 425                mutex_unlock(&ac97->reg_mutex);
 426        }
 427        mutex_unlock(&ac97->page_mutex);
 428        return change;
 429}
 430
 431/*
 432 * Controls
 433 */
 434
 435static int snd_ac97_info_enum_double(struct snd_kcontrol *kcontrol,
 436                                     struct snd_ctl_elem_info *uinfo)
 437{
 438        struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
 439        
 440        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
 441        uinfo->count = e->shift_l == e->shift_r ? 1 : 2;
 442        uinfo->value.enumerated.items = e->mask;
 443        
 444        if (uinfo->value.enumerated.item > e->mask - 1)
 445                uinfo->value.enumerated.item = e->mask - 1;
 446        strcpy(uinfo->value.enumerated.name, e->texts[uinfo->value.enumerated.item]);
 447        return 0;
 448}
 449
 450static int snd_ac97_get_enum_double(struct snd_kcontrol *kcontrol,
 451                                    struct snd_ctl_elem_value *ucontrol)
 452{
 453        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 454        struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
 455        unsigned short val, bitmask;
 456        
 457        for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
 458                ;
 459        val = snd_ac97_read_cache(ac97, e->reg);
 460        ucontrol->value.enumerated.item[0] = (val >> e->shift_l) & (bitmask - 1);
 461        if (e->shift_l != e->shift_r)
 462                ucontrol->value.enumerated.item[1] = (val >> e->shift_r) & (bitmask - 1);
 463
 464        return 0;
 465}
 466
 467static int snd_ac97_put_enum_double(struct snd_kcontrol *kcontrol,
 468                                    struct snd_ctl_elem_value *ucontrol)
 469{
 470        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 471        struct ac97_enum *e = (struct ac97_enum *)kcontrol->private_value;
 472        unsigned short val;
 473        unsigned short mask, bitmask;
 474        
 475        for (bitmask = 1; bitmask < e->mask; bitmask <<= 1)
 476                ;
 477        if (ucontrol->value.enumerated.item[0] > e->mask - 1)
 478                return -EINVAL;
 479        val = ucontrol->value.enumerated.item[0] << e->shift_l;
 480        mask = (bitmask - 1) << e->shift_l;
 481        if (e->shift_l != e->shift_r) {
 482                if (ucontrol->value.enumerated.item[1] > e->mask - 1)
 483                        return -EINVAL;
 484                val |= ucontrol->value.enumerated.item[1] << e->shift_r;
 485                mask |= (bitmask - 1) << e->shift_r;
 486        }
 487        return snd_ac97_update_bits(ac97, e->reg, mask, val);
 488}
 489
 490/* save/restore ac97 v2.3 paging */
 491static int snd_ac97_page_save(struct snd_ac97 *ac97, int reg, struct snd_kcontrol *kcontrol)
 492{
 493        int page_save = -1;
 494        if ((kcontrol->private_value & (1<<25)) &&
 495            (ac97->ext_id & AC97_EI_REV_MASK) >= AC97_EI_REV_23 &&
 496            (reg >= 0x60 && reg < 0x70)) {
 497                unsigned short page = (kcontrol->private_value >> 26) & 0x0f;
 498                mutex_lock(&ac97->page_mutex); /* lock paging */
 499                page_save = snd_ac97_read(ac97, AC97_INT_PAGING) & AC97_PAGE_MASK;
 500                snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page);
 501        }
 502        return page_save;
 503}
 504
 505static void snd_ac97_page_restore(struct snd_ac97 *ac97, int page_save)
 506{
 507        if (page_save >= 0) {
 508                snd_ac97_update_bits(ac97, AC97_INT_PAGING, AC97_PAGE_MASK, page_save);
 509                mutex_unlock(&ac97->page_mutex); /* unlock paging */
 510        }
 511}
 512
 513/* volume and switch controls */
 514static int snd_ac97_info_volsw(struct snd_kcontrol *kcontrol,
 515                               struct snd_ctl_elem_info *uinfo)
 516{
 517        int mask = (kcontrol->private_value >> 16) & 0xff;
 518        int shift = (kcontrol->private_value >> 8) & 0x0f;
 519        int rshift = (kcontrol->private_value >> 12) & 0x0f;
 520
 521        uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
 522        uinfo->count = shift == rshift ? 1 : 2;
 523        uinfo->value.integer.min = 0;
 524        uinfo->value.integer.max = mask;
 525        return 0;
 526}
 527
 528static int snd_ac97_get_volsw(struct snd_kcontrol *kcontrol,
 529                              struct snd_ctl_elem_value *ucontrol)
 530{
 531        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 532        int reg = kcontrol->private_value & 0xff;
 533        int shift = (kcontrol->private_value >> 8) & 0x0f;
 534        int rshift = (kcontrol->private_value >> 12) & 0x0f;
 535        int mask = (kcontrol->private_value >> 16) & 0xff;
 536        int invert = (kcontrol->private_value >> 24) & 0x01;
 537        int page_save;
 538
 539        page_save = snd_ac97_page_save(ac97, reg, kcontrol);
 540        ucontrol->value.integer.value[0] = (snd_ac97_read_cache(ac97, reg) >> shift) & mask;
 541        if (shift != rshift)
 542                ucontrol->value.integer.value[1] = (snd_ac97_read_cache(ac97, reg) >> rshift) & mask;
 543        if (invert) {
 544                ucontrol->value.integer.value[0] = mask - ucontrol->value.integer.value[0];
 545                if (shift != rshift)
 546                        ucontrol->value.integer.value[1] = mask - ucontrol->value.integer.value[1];
 547        }
 548        snd_ac97_page_restore(ac97, page_save);
 549        return 0;
 550}
 551
 552static int snd_ac97_put_volsw(struct snd_kcontrol *kcontrol,
 553                              struct snd_ctl_elem_value *ucontrol)
 554{
 555        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 556        int reg = kcontrol->private_value & 0xff;
 557        int shift = (kcontrol->private_value >> 8) & 0x0f;
 558        int rshift = (kcontrol->private_value >> 12) & 0x0f;
 559        int mask = (kcontrol->private_value >> 16) & 0xff;
 560        int invert = (kcontrol->private_value >> 24) & 0x01;
 561        int err, page_save;
 562        unsigned short val, val2, val_mask;
 563        
 564        page_save = snd_ac97_page_save(ac97, reg, kcontrol);
 565        val = (ucontrol->value.integer.value[0] & mask);
 566        if (invert)
 567                val = mask - val;
 568        val_mask = mask << shift;
 569        val = val << shift;
 570        if (shift != rshift) {
 571                val2 = (ucontrol->value.integer.value[1] & mask);
 572                if (invert)
 573                        val2 = mask - val2;
 574                val_mask |= mask << rshift;
 575                val |= val2 << rshift;
 576        }
 577        err = snd_ac97_update_bits(ac97, reg, val_mask, val);
 578        snd_ac97_page_restore(ac97, page_save);
 579#ifdef CONFIG_SND_AC97_POWER_SAVE
 580        /* check analog mixer power-down */
 581        if ((val_mask & 0x8000) &&
 582            (kcontrol->private_value & (1<<30))) {
 583                if (val & 0x8000)
 584                        ac97->power_up &= ~(1 << (reg>>1));
 585                else
 586                        ac97->power_up |= 1 << (reg>>1);
 587                update_power_regs(ac97);
 588        }
 589#endif
 590        return err;
 591}
 592
 593static const struct snd_kcontrol_new snd_ac97_controls_master_mono[2] = {
 594AC97_SINGLE("Master Mono Playback Switch", AC97_MASTER_MONO, 15, 1, 1),
 595AC97_SINGLE("Master Mono Playback Volume", AC97_MASTER_MONO, 0, 31, 1)
 596};
 597
 598static const struct snd_kcontrol_new snd_ac97_controls_tone[2] = {
 599AC97_SINGLE("Tone Control - Bass", AC97_MASTER_TONE, 8, 15, 1),
 600AC97_SINGLE("Tone Control - Treble", AC97_MASTER_TONE, 0, 15, 1)
 601};
 602
 603static const struct snd_kcontrol_new snd_ac97_controls_pc_beep[2] = {
 604AC97_SINGLE("PC Speaker Playback Switch", AC97_PC_BEEP, 15, 1, 1),
 605AC97_SINGLE("PC Speaker Playback Volume", AC97_PC_BEEP, 1, 15, 1)
 606};
 607
 608static const struct snd_kcontrol_new snd_ac97_controls_mic_boost =
 609        AC97_SINGLE("Mic Boost (+20dB)", AC97_MIC, 6, 1, 0);
 610
 611
 612static const char* std_rec_sel[] = {"Mic", "CD", "Video", "Aux", "Line", "Mix", "Mix Mono", "Phone"};
 613static const char* std_3d_path[] = {"pre 3D", "post 3D"};
 614static const char* std_mix[] = {"Mix", "Mic"};
 615static const char* std_mic[] = {"Mic1", "Mic2"};
 616
 617static const struct ac97_enum std_enum[] = {
 618AC97_ENUM_DOUBLE(AC97_REC_SEL, 8, 0, 8, std_rec_sel),
 619AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 15, 2, std_3d_path),
 620AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 9, 2, std_mix),
 621AC97_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 8, 2, std_mic),
 622};
 623
 624static const struct snd_kcontrol_new snd_ac97_control_capture_src = 
 625AC97_ENUM("Capture Source", std_enum[0]); 
 626
 627static const struct snd_kcontrol_new snd_ac97_control_capture_vol =
 628AC97_DOUBLE("Capture Volume", AC97_REC_GAIN, 8, 0, 15, 0);
 629
 630static const struct snd_kcontrol_new snd_ac97_controls_mic_capture[2] = {
 631AC97_SINGLE("Mic Capture Switch", AC97_REC_GAIN_MIC, 15, 1, 1),
 632AC97_SINGLE("Mic Capture Volume", AC97_REC_GAIN_MIC, 0, 15, 0)
 633};
 634
 635enum {
 636        AC97_GENERAL_PCM_OUT = 0,
 637        AC97_GENERAL_STEREO_ENHANCEMENT,
 638        AC97_GENERAL_3D,
 639        AC97_GENERAL_LOUDNESS,
 640        AC97_GENERAL_MONO,
 641        AC97_GENERAL_MIC,
 642        AC97_GENERAL_LOOPBACK
 643};
 644
 645static const struct snd_kcontrol_new snd_ac97_controls_general[7] = {
 646AC97_ENUM("PCM Out Path & Mute", std_enum[1]),
 647AC97_SINGLE("Simulated Stereo Enhancement", AC97_GENERAL_PURPOSE, 14, 1, 0),
 648AC97_SINGLE("3D Control - Switch", AC97_GENERAL_PURPOSE, 13, 1, 0),
 649AC97_SINGLE("Loudness (bass boost)", AC97_GENERAL_PURPOSE, 12, 1, 0),
 650AC97_ENUM("Mono Output Select", std_enum[2]),
 651AC97_ENUM("Mic Select", std_enum[3]),
 652AC97_SINGLE("ADC/DAC Loopback", AC97_GENERAL_PURPOSE, 7, 1, 0)
 653};
 654
 655static const struct snd_kcontrol_new snd_ac97_controls_3d[2] = {
 656AC97_SINGLE("3D Control - Center", AC97_3D_CONTROL, 8, 15, 0),
 657AC97_SINGLE("3D Control - Depth", AC97_3D_CONTROL, 0, 15, 0)
 658};
 659
 660static const struct snd_kcontrol_new snd_ac97_controls_center[2] = {
 661AC97_SINGLE("Center Playback Switch", AC97_CENTER_LFE_MASTER, 7, 1, 1),
 662AC97_SINGLE("Center Playback Volume", AC97_CENTER_LFE_MASTER, 0, 31, 1)
 663};
 664
 665static const struct snd_kcontrol_new snd_ac97_controls_lfe[2] = {
 666AC97_SINGLE("LFE Playback Switch", AC97_CENTER_LFE_MASTER, 15, 1, 1),
 667AC97_SINGLE("LFE Playback Volume", AC97_CENTER_LFE_MASTER, 8, 31, 1)
 668};
 669
 670static const struct snd_kcontrol_new snd_ac97_control_eapd =
 671AC97_SINGLE("External Amplifier", AC97_POWERDOWN, 15, 1, 1);
 672
 673static const struct snd_kcontrol_new snd_ac97_controls_modem_switches[2] = {
 674AC97_SINGLE("Off-hook Switch", AC97_GPIO_STATUS, 0, 1, 0),
 675AC97_SINGLE("Caller ID Switch", AC97_GPIO_STATUS, 2, 1, 0)
 676};
 677
 678/* change the existing EAPD control as inverted */
 679static void set_inv_eapd(struct snd_ac97 *ac97, struct snd_kcontrol *kctl)
 680{
 681        kctl->private_value = AC97_SINGLE_VALUE(AC97_POWERDOWN, 15, 1, 0);
 682        snd_ac97_update_bits(ac97, AC97_POWERDOWN, (1<<15), (1<<15)); /* EAPD up */
 683        ac97->scaps |= AC97_SCAP_INV_EAPD;
 684}
 685
 686static int snd_ac97_spdif_mask_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 687{
 688        uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
 689        uinfo->count = 1;
 690        return 0;
 691}
 692                        
 693static int snd_ac97_spdif_cmask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 694{
 695        ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
 696                                           IEC958_AES0_NONAUDIO |
 697                                           IEC958_AES0_CON_EMPHASIS_5015 |
 698                                           IEC958_AES0_CON_NOT_COPYRIGHT;
 699        ucontrol->value.iec958.status[1] = IEC958_AES1_CON_CATEGORY |
 700                                           IEC958_AES1_CON_ORIGINAL;
 701        ucontrol->value.iec958.status[3] = IEC958_AES3_CON_FS;
 702        return 0;
 703}
 704                        
 705static int snd_ac97_spdif_pmask_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 706{
 707        /* FIXME: AC'97 spec doesn't say which bits are used for what */
 708        ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
 709                                           IEC958_AES0_NONAUDIO |
 710                                           IEC958_AES0_PRO_FS |
 711                                           IEC958_AES0_PRO_EMPHASIS_5015;
 712        return 0;
 713}
 714
 715static int snd_ac97_spdif_default_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 716{
 717        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 718
 719        mutex_lock(&ac97->reg_mutex);
 720        ucontrol->value.iec958.status[0] = ac97->spdif_status & 0xff;
 721        ucontrol->value.iec958.status[1] = (ac97->spdif_status >> 8) & 0xff;
 722        ucontrol->value.iec958.status[2] = (ac97->spdif_status >> 16) & 0xff;
 723        ucontrol->value.iec958.status[3] = (ac97->spdif_status >> 24) & 0xff;
 724        mutex_unlock(&ac97->reg_mutex);
 725        return 0;
 726}
 727                        
 728static int snd_ac97_spdif_default_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 729{
 730        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 731        unsigned int new = 0;
 732        unsigned short val = 0;
 733        int change;
 734
 735        new = val = ucontrol->value.iec958.status[0] & (IEC958_AES0_PROFESSIONAL|IEC958_AES0_NONAUDIO);
 736        if (ucontrol->value.iec958.status[0] & IEC958_AES0_PROFESSIONAL) {
 737                new |= ucontrol->value.iec958.status[0] & (IEC958_AES0_PRO_FS|IEC958_AES0_PRO_EMPHASIS_5015);
 738                switch (new & IEC958_AES0_PRO_FS) {
 739                case IEC958_AES0_PRO_FS_44100: val |= 0<<12; break;
 740                case IEC958_AES0_PRO_FS_48000: val |= 2<<12; break;
 741                case IEC958_AES0_PRO_FS_32000: val |= 3<<12; break;
 742                default:                       val |= 1<<12; break;
 743                }
 744                if ((new & IEC958_AES0_PRO_EMPHASIS) == IEC958_AES0_PRO_EMPHASIS_5015)
 745                        val |= 1<<3;
 746        } else {
 747                new |= ucontrol->value.iec958.status[0] & (IEC958_AES0_CON_EMPHASIS_5015|IEC958_AES0_CON_NOT_COPYRIGHT);
 748                new |= ((ucontrol->value.iec958.status[1] & (IEC958_AES1_CON_CATEGORY|IEC958_AES1_CON_ORIGINAL)) << 8);
 749                new |= ((ucontrol->value.iec958.status[3] & IEC958_AES3_CON_FS) << 24);
 750                if ((new & IEC958_AES0_CON_EMPHASIS) == IEC958_AES0_CON_EMPHASIS_5015)
 751                        val |= 1<<3;
 752                if (!(new & IEC958_AES0_CON_NOT_COPYRIGHT))
 753                        val |= 1<<2;
 754                val |= ((new >> 8) & 0xff) << 4;        // category + original
 755                switch ((new >> 24) & 0xff) {
 756                case IEC958_AES3_CON_FS_44100: val |= 0<<12; break;
 757                case IEC958_AES3_CON_FS_48000: val |= 2<<12; break;
 758                case IEC958_AES3_CON_FS_32000: val |= 3<<12; break;
 759                default:                       val |= 1<<12; break;
 760                }
 761        }
 762
 763        mutex_lock(&ac97->reg_mutex);
 764        change = ac97->spdif_status != new;
 765        ac97->spdif_status = new;
 766
 767        if (ac97->flags & AC97_CS_SPDIF) {
 768                int x = (val >> 12) & 0x03;
 769                switch (x) {
 770                case 0: x = 1; break;  // 44.1
 771                case 2: x = 0; break;  // 48.0
 772                default: x = 0; break; // illegal.
 773                }
 774                change |= snd_ac97_update_bits_nolock(ac97, AC97_CSR_SPDIF, 0x3fff, ((val & 0xcfff) | (x << 12)));
 775        } else if (ac97->flags & AC97_CX_SPDIF) {
 776                int v;
 777                v = new & (IEC958_AES0_CON_EMPHASIS_5015|IEC958_AES0_CON_NOT_COPYRIGHT) ? 0 : AC97_CXR_COPYRGT;
 778                v |= new & IEC958_AES0_NONAUDIO ? AC97_CXR_SPDIF_AC3 : AC97_CXR_SPDIF_PCM;
 779                change |= snd_ac97_update_bits_nolock(ac97, AC97_CXR_AUDIO_MISC, 
 780                                                      AC97_CXR_SPDIF_MASK | AC97_CXR_COPYRGT,
 781                                                      v);
 782        } else if (ac97->id == AC97_ID_YMF743) {
 783                change |= snd_ac97_update_bits_nolock(ac97,
 784                                                      AC97_YMF7X3_DIT_CTRL,
 785                                                      0xff38,
 786                                                      ((val << 4) & 0xff00) |
 787                                                      ((val << 2) & 0x0038));
 788        } else {
 789                unsigned short extst = snd_ac97_read_cache(ac97, AC97_EXTENDED_STATUS);
 790                snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); /* turn off */
 791
 792                change |= snd_ac97_update_bits_nolock(ac97, AC97_SPDIF, 0x3fff, val);
 793                if (extst & AC97_EA_SPDIF) {
 794                        snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */
 795                }
 796        }
 797        mutex_unlock(&ac97->reg_mutex);
 798
 799        return change;
 800}
 801
 802static int snd_ac97_put_spsa(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 803{
 804        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 805        int reg = kcontrol->private_value & 0xff;
 806        int shift = (kcontrol->private_value >> 8) & 0xff;
 807        int mask = (kcontrol->private_value >> 16) & 0xff;
 808        // int invert = (kcontrol->private_value >> 24) & 0xff;
 809        unsigned short value, old, new;
 810        int change;
 811
 812        value = (ucontrol->value.integer.value[0] & mask);
 813
 814        mutex_lock(&ac97->reg_mutex);
 815        mask <<= shift;
 816        value <<= shift;
 817        old = snd_ac97_read_cache(ac97, reg);
 818        new = (old & ~mask) | value;
 819        change = old != new;
 820
 821        if (change) {
 822                unsigned short extst = snd_ac97_read_cache(ac97, AC97_EXTENDED_STATUS);
 823                snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0); /* turn off */
 824                change = snd_ac97_update_bits_nolock(ac97, reg, mask, value);
 825                if (extst & AC97_EA_SPDIF)
 826                        snd_ac97_update_bits_nolock(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */
 827        }
 828        mutex_unlock(&ac97->reg_mutex);
 829        return change;
 830}
 831
 832static const struct snd_kcontrol_new snd_ac97_controls_spdif[5] = {
 833        {
 834                .access = SNDRV_CTL_ELEM_ACCESS_READ,
 835                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 836                .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,CON_MASK),
 837                .info = snd_ac97_spdif_mask_info,
 838                .get = snd_ac97_spdif_cmask_get,
 839        },
 840        {
 841                .access = SNDRV_CTL_ELEM_ACCESS_READ,
 842                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 843                .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,PRO_MASK),
 844                .info = snd_ac97_spdif_mask_info,
 845                .get = snd_ac97_spdif_pmask_get,
 846        },
 847        {
 848                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 849                .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT),
 850                .info = snd_ac97_spdif_mask_info,
 851                .get = snd_ac97_spdif_default_get,
 852                .put = snd_ac97_spdif_default_put,
 853        },
 854
 855        AC97_SINGLE(SNDRV_CTL_NAME_IEC958("",PLAYBACK,SWITCH),AC97_EXTENDED_STATUS, 2, 1, 0),
 856        {
 857                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 858                .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,NONE) "AC97-SPSA",
 859                .info = snd_ac97_info_volsw,
 860                .get = snd_ac97_get_volsw,
 861                .put = snd_ac97_put_spsa,
 862                .private_value = AC97_SINGLE_VALUE(AC97_EXTENDED_STATUS, 4, 3, 0)
 863        },
 864};
 865
 866#define AD18XX_PCM_BITS(xname, codec, lshift, rshift, mask) \
 867{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_ac97_ad18xx_pcm_info_bits, \
 868  .get = snd_ac97_ad18xx_pcm_get_bits, .put = snd_ac97_ad18xx_pcm_put_bits, \
 869  .private_value = (codec) | ((lshift) << 8) | ((rshift) << 12) | ((mask) << 16) }
 870
 871static int snd_ac97_ad18xx_pcm_info_bits(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 872{
 873        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 874        int mask = (kcontrol->private_value >> 16) & 0x0f;
 875        int lshift = (kcontrol->private_value >> 8) & 0x0f;
 876        int rshift = (kcontrol->private_value >> 12) & 0x0f;
 877
 878        uinfo->type = mask == 1 ? SNDRV_CTL_ELEM_TYPE_BOOLEAN : SNDRV_CTL_ELEM_TYPE_INTEGER;
 879        if (lshift != rshift && (ac97->flags & AC97_STEREO_MUTES))
 880                uinfo->count = 2;
 881        else
 882                uinfo->count = 1;
 883        uinfo->value.integer.min = 0;
 884        uinfo->value.integer.max = mask;
 885        return 0;
 886}
 887
 888static int snd_ac97_ad18xx_pcm_get_bits(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 889{
 890        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 891        int codec = kcontrol->private_value & 3;
 892        int lshift = (kcontrol->private_value >> 8) & 0x0f;
 893        int rshift = (kcontrol->private_value >> 12) & 0x0f;
 894        int mask = (kcontrol->private_value >> 16) & 0xff;
 895        
 896        ucontrol->value.integer.value[0] = mask - ((ac97->spec.ad18xx.pcmreg[codec] >> lshift) & mask);
 897        if (lshift != rshift && (ac97->flags & AC97_STEREO_MUTES))
 898                ucontrol->value.integer.value[1] = mask - ((ac97->spec.ad18xx.pcmreg[codec] >> rshift) & mask);
 899        return 0;
 900}
 901
 902static int snd_ac97_ad18xx_pcm_put_bits(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 903{
 904        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 905        int codec = kcontrol->private_value & 3;
 906        int lshift = (kcontrol->private_value >> 8) & 0x0f;
 907        int rshift = (kcontrol->private_value >> 12) & 0x0f;
 908        int mask = (kcontrol->private_value >> 16) & 0xff;
 909        unsigned short val, valmask;
 910        
 911        val = (mask - (ucontrol->value.integer.value[0] & mask)) << lshift;
 912        valmask = mask << lshift;
 913        if (lshift != rshift && (ac97->flags & AC97_STEREO_MUTES)) {
 914                val |= (mask - (ucontrol->value.integer.value[1] & mask)) << rshift;
 915                valmask |= mask << rshift;
 916        }
 917        return snd_ac97_ad18xx_update_pcm_bits(ac97, codec, valmask, val);
 918}
 919
 920#define AD18XX_PCM_VOLUME(xname, codec) \
 921{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .info = snd_ac97_ad18xx_pcm_info_volume, \
 922  .get = snd_ac97_ad18xx_pcm_get_volume, .put = snd_ac97_ad18xx_pcm_put_volume, \
 923  .private_value = codec }
 924
 925static int snd_ac97_ad18xx_pcm_info_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 926{
 927        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 928        uinfo->count = 2;
 929        uinfo->value.integer.min = 0;
 930        uinfo->value.integer.max = 31;
 931        return 0;
 932}
 933
 934static int snd_ac97_ad18xx_pcm_get_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 935{
 936        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 937        int codec = kcontrol->private_value & 3;
 938        
 939        mutex_lock(&ac97->page_mutex);
 940        ucontrol->value.integer.value[0] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 0) & 31);
 941        ucontrol->value.integer.value[1] = 31 - ((ac97->spec.ad18xx.pcmreg[codec] >> 8) & 31);
 942        mutex_unlock(&ac97->page_mutex);
 943        return 0;
 944}
 945
 946static int snd_ac97_ad18xx_pcm_put_volume(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 947{
 948        struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
 949        int codec = kcontrol->private_value & 3;
 950        unsigned short val1, val2;
 951        
 952        val1 = 31 - (ucontrol->value.integer.value[0] & 31);
 953        val2 = 31 - (ucontrol->value.integer.value[1] & 31);
 954        return snd_ac97_ad18xx_update_pcm_bits(ac97, codec, 0x1f1f, (val1 << 8) | val2);
 955}
 956
 957static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_pcm[2] = {
 958AD18XX_PCM_BITS("PCM Playback Switch", 0, 15, 7, 1),
 959AD18XX_PCM_VOLUME("PCM Playback Volume", 0)
 960};
 961
 962static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_surround[2] = {
 963AD18XX_PCM_BITS("Surround Playback Switch", 1, 15, 7, 1),
 964AD18XX_PCM_VOLUME("Surround Playback Volume", 1)
 965};
 966
 967static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_center[2] = {
 968AD18XX_PCM_BITS("Center Playback Switch", 2, 15, 15, 1),
 969AD18XX_PCM_BITS("Center Playback Volume", 2, 8, 8, 31)
 970};
 971
 972static const struct snd_kcontrol_new snd_ac97_controls_ad18xx_lfe[2] = {
 973AD18XX_PCM_BITS("LFE Playback Switch", 2, 7, 7, 1),
 974AD18XX_PCM_BITS("LFE Playback Volume", 2, 0, 0, 31)
 975};
 976
 977/*
 978 *
 979 */
 980
 981static void snd_ac97_powerdown(struct snd_ac97 *ac97);
 982
 983static int snd_ac97_bus_free(struct snd_ac97_bus *bus)
 984{
 985        if (bus) {
 986                snd_ac97_bus_proc_done(bus);
 987                kfree(bus->pcms);
 988                if (bus->private_free)
 989                        bus->private_free(bus);
 990                kfree(bus);
 991        }
 992        return 0;
 993}
 994
 995static int snd_ac97_bus_dev_free(struct snd_device *device)
 996{
 997        struct snd_ac97_bus *bus = device->device_data;
 998        return snd_ac97_bus_free(bus);
 999}
1000
1001static int snd_ac97_free(struct snd_ac97 *ac97)
1002{
1003        if (ac97) {
1004#ifdef CONFIG_SND_AC97_POWER_SAVE
1005                cancel_delayed_work(&ac97->power_work);
1006                flush_scheduled_work();
1007#endif
1008                snd_ac97_proc_done(ac97);
1009                if (ac97->bus)
1010                        ac97->bus->codec[ac97->num] = NULL;
1011                if (ac97->private_free)
1012                        ac97->private_free(ac97);
1013                kfree(ac97);
1014        }
1015        return 0;
1016}
1017
1018static int snd_ac97_dev_free(struct snd_device *device)
1019{
1020        struct snd_ac97 *ac97 = device->device_data;
1021        snd_ac97_powerdown(ac97); /* for avoiding click noises during shut down */
1022        return snd_ac97_free(ac97);
1023}
1024
1025static int snd_ac97_try_volume_mix(struct snd_ac97 * ac97, int reg)
1026{
1027        unsigned short val, mask = 0x8000;
1028
1029        if (! snd_ac97_valid_reg(ac97, reg))
1030                return 0;
1031
1032        switch (reg) {
1033        case AC97_MASTER_TONE:
1034                return ac97->caps & 0x04 ? 1 : 0;
1035        case AC97_HEADPHONE:
1036                return ac97->caps & 0x10 ? 1 : 0;
1037        case AC97_REC_GAIN_MIC:
1038                return ac97->caps & 0x01 ? 1 : 0;
1039        case AC97_3D_CONTROL:
1040                if (ac97->caps & 0x7c00) {
1041                        val = snd_ac97_read(ac97, reg);
1042                        /* if nonzero - fixed and we can't set it */
1043                        return val == 0;
1044                }
1045                return 0;
1046        case AC97_CENTER_LFE_MASTER:    /* center */
1047                if ((ac97->ext_id & AC97_EI_CDAC) == 0)
1048                        return 0;
1049                break;
1050        case AC97_CENTER_LFE_MASTER+1:  /* lfe */
1051                if ((ac97->ext_id & AC97_EI_LDAC) == 0)
1052                        return 0;
1053                reg = AC97_CENTER_LFE_MASTER;
1054                mask = 0x0080;
1055                break;
1056        case AC97_SURROUND_MASTER:
1057                if ((ac97->ext_id & AC97_EI_SDAC) == 0)
1058                        return 0;
1059                break;
1060        }
1061
1062        val = snd_ac97_read(ac97, reg);
1063        if (!(val & mask)) {
1064                /* nothing seems to be here - mute flag is not set */
1065                /* try another test */
1066                snd_ac97_write_cache(ac97, reg, val | mask);
1067                val = snd_ac97_read(ac97, reg);
1068                val = snd_ac97_read(ac97, reg);
1069                if (!(val & mask))
1070                        return 0;       /* nothing here */
1071        }
1072        return 1;               /* success, useable */
1073}
1074
1075static void check_volume_resolution(struct snd_ac97 *ac97, int reg, unsigned char *lo_max, unsigned char *hi_max)
1076{
1077        unsigned short cbit[3] = { 0x20, 0x10, 0x01 };
1078        unsigned char max[3] = { 63, 31, 15 };
1079        int i;
1080
1081        /* first look up the static resolution table */
1082        if (ac97->res_table) {
1083                const struct snd_ac97_res_table *tbl;
1084                for (tbl = ac97->res_table; tbl->reg; tbl++) {
1085                        if (tbl->reg == reg) {
1086                                *lo_max = tbl->bits & 0xff;
1087                                *hi_max = (tbl->bits >> 8) & 0xff;
1088                                return;
1089                        }
1090                }
1091        }
1092
1093        *lo_max = *hi_max = 0;
1094        for (i = 0 ; i < ARRAY_SIZE(cbit); i++) {
1095                unsigned short val;
1096                snd_ac97_write(ac97, reg, 0x8080 | cbit[i] | (cbit[i] << 8));
1097                /* Do the read twice due to buffers on some ac97 codecs.
1098                 * e.g. The STAC9704 returns exactly what you wrote to the register
1099                 * if you read it immediately. This causes the detect routine to fail.
1100                 */
1101                val = snd_ac97_read(ac97, reg);
1102                val = snd_ac97_read(ac97, reg);
1103                if (! *lo_max && (val & 0x7f) == cbit[i])
1104                        *lo_max = max[i];
1105                if (! *hi_max && ((val >> 8) & 0x7f) == cbit[i])
1106                        *hi_max = max[i];
1107                if (*lo_max && *hi_max)
1108                        break;
1109        }
1110}
1111
1112static int snd_ac97_try_bit(struct snd_ac97 * ac97, int reg, int bit)
1113{
1114        unsigned short mask, val, orig, res;
1115
1116        mask = 1 << bit;
1117        orig = snd_ac97_read(ac97, reg);
1118        val = orig ^ mask;
1119        snd_ac97_write(ac97, reg, val);
1120        res = snd_ac97_read(ac97, reg);
1121        snd_ac97_write_cache(ac97, reg, orig);
1122        return res == val;
1123}
1124
1125/* check the volume resolution of center/lfe */
1126static void snd_ac97_change_volume_params2(struct snd_ac97 * ac97, int reg, int shift, unsigned char *max)
1127{
1128        unsigned short val, val1;
1129
1130        *max = 63;
1131        val = 0x8080 | (0x20 << shift);
1132        snd_ac97_write(ac97, reg, val);
1133        val1 = snd_ac97_read(ac97, reg);
1134        if (val != val1) {
1135                *max = 31;
1136        }
1137        /* reset volume to zero */
1138        snd_ac97_write_cache(ac97, reg, 0x8080);
1139}
1140
1141static inline int printable(unsigned int x)
1142{
1143        x &= 0xff;
1144        if (x < ' ' || x >= 0x71) {
1145                if (x <= 0x89)
1146                        return x - 0x71 + 'A';
1147                return '?';
1148        }
1149        return x;
1150}
1151
1152static struct snd_kcontrol *snd_ac97_cnew(const struct snd_kcontrol_new *_template,
1153                                          struct snd_ac97 * ac97)
1154{
1155        struct snd_kcontrol_new template;
1156        memcpy(&template, _template, sizeof(template));
1157        template.index = ac97->num;
1158        return snd_ctl_new1(&template, ac97);
1159}
1160
1161/*
1162 * create mute switch(es) for normal stereo controls
1163 */
1164static int snd_ac97_cmute_new_stereo(struct snd_card *card, char *name, int reg,
1165                                     int check_stereo, int check_amix,
1166                                     struct snd_ac97 *ac97)
1167{
1168        struct snd_kcontrol *kctl;
1169        int err;
1170        unsigned short val, val1, mute_mask;
1171
1172        if (! snd_ac97_valid_reg(ac97, reg))
1173                return 0;
1174
1175        mute_mask = 0x8000;
1176        val = snd_ac97_read(ac97, reg);
1177        if (check_stereo || (ac97->flags & AC97_STEREO_MUTES)) {
1178                /* check whether both mute bits work */
1179                val1 = val | 0x8080;
1180                snd_ac97_write(ac97, reg, val1);
1181                if (val1 == snd_ac97_read(ac97, reg))
1182                        mute_mask = 0x8080;
1183        }
1184        if (mute_mask == 0x8080) {
1185                struct snd_kcontrol_new tmp = AC97_DOUBLE(name, reg, 15, 7, 1, 1);
1186                if (check_amix)
1187                        tmp.private_value |= (1 << 30);
1188                tmp.index = ac97->num;
1189                kctl = snd_ctl_new1(&tmp, ac97);
1190        } else {
1191                struct snd_kcontrol_new tmp = AC97_SINGLE(name, reg, 15, 1, 1);
1192                if (check_amix)
1193                        tmp.private_value |= (1 << 30);
1194                tmp.index = ac97->num;
1195                kctl = snd_ctl_new1(&tmp, ac97);
1196        }
1197        err = snd_ctl_add(card, kctl);
1198        if (err < 0)
1199                return err;
1200        /* mute as default */
1201        snd_ac97_write_cache(ac97, reg, val | mute_mask);
1202        return 0;
1203}
1204
1205/*
1206 * set dB information
1207 */
1208static const DECLARE_TLV_DB_SCALE(db_scale_4bit, -4500, 300, 0);
1209static const DECLARE_TLV_DB_SCALE(db_scale_5bit, -4650, 150, 0);
1210static const DECLARE_TLV_DB_SCALE(db_scale_6bit, -9450, 150, 0);
1211static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0);
1212static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0);
1213
1214static const unsigned int *find_db_scale(unsigned int maxval)
1215{
1216        switch (maxval) {
1217        case 0x0f: return db_scale_4bit;
1218        case 0x1f: return db_scale_5bit;
1219        case 0x3f: return db_scale_6bit;
1220        }
1221        return NULL;
1222}
1223
1224static void set_tlv_db_scale(struct snd_kcontrol *kctl, const unsigned int *tlv)
1225{
1226        kctl->tlv.p = tlv;
1227        if (tlv)
1228                kctl->vd[0].access |= SNDRV_CTL_ELEM_ACCESS_TLV_READ;
1229}
1230
1231/*
1232 * create a volume for normal stereo/mono controls
1233 */
1234static int snd_ac97_cvol_new(struct snd_card *card, char *name, int reg, unsigned int lo_max,
1235                             unsigned int hi_max, struct snd_ac97 *ac97)
1236{
1237        int err;
1238        struct snd_kcontrol *kctl;
1239
1240        if (! snd_ac97_valid_reg(ac97, reg))
1241                return 0;
1242        if (hi_max) {
1243                /* invert */
1244                struct snd_kcontrol_new tmp = AC97_DOUBLE(name, reg, 8, 0, lo_max, 1);
1245                tmp.index = ac97->num;
1246                kctl = snd_ctl_new1(&tmp, ac97);
1247        } else {
1248                /* invert */
1249                struct snd_kcontrol_new tmp = AC97_SINGLE(name, reg, 0, lo_max, 1);
1250                tmp.index = ac97->num;
1251                kctl = snd_ctl_new1(&tmp, ac97);
1252        }
1253        if (reg >= AC97_PHONE && reg <= AC97_PCM)
1254                set_tlv_db_scale(kctl, db_scale_5bit_12db_max);
1255        else
1256                set_tlv_db_scale(kctl, find_db_scale(lo_max));
1257        err = snd_ctl_add(card, kctl);
1258        if (err < 0)
1259                return err;
1260        snd_ac97_write_cache(ac97, reg,
1261                             (snd_ac97_read(ac97, reg) & 0x8080) |
1262                             lo_max | (hi_max << 8));
1263        return 0;
1264}
1265
1266/*
1267 * create a mute-switch and a volume for normal stereo/mono controls
1268 */
1269static int snd_ac97_cmix_new_stereo(struct snd_card *card, const char *pfx,
1270                                    int reg, int check_stereo, int check_amix,
1271                                    struct snd_ac97 *ac97)
1272{
1273        int err;
1274        char name[44];
1275        unsigned char lo_max, hi_max;
1276
1277        if (! snd_ac97_valid_reg(ac97, reg))
1278                return 0;
1279
1280        if (snd_ac97_try_bit(ac97, reg, 15)) {
1281                sprintf(name, "%s Switch", pfx);
1282                if ((err = snd_ac97_cmute_new_stereo(card, name, reg,
1283                                                     check_stereo, check_amix,
1284                                                     ac97)) < 0)
1285                        return err;
1286        }
1287        check_volume_resolution(ac97, reg, &lo_max, &hi_max);
1288        if (lo_max) {
1289                sprintf(name, "%s Volume", pfx);
1290                if ((err = snd_ac97_cvol_new(card, name, reg, lo_max, hi_max, ac97)) < 0)
1291                        return err;
1292        }
1293        return 0;
1294}
1295
1296#define snd_ac97_cmix_new(card, pfx, reg, acheck, ac97) \
1297        snd_ac97_cmix_new_stereo(card, pfx, reg, 0, acheck, ac97)
1298#define snd_ac97_cmute_new(card, name, reg, acheck, ac97) \
1299        snd_ac97_cmute_new_stereo(card, name, reg, 0, acheck, ac97)
1300
1301static unsigned int snd_ac97_determine_spdif_rates(struct snd_ac97 *ac97);
1302
1303static int snd_ac97_mixer_build(struct snd_ac97 * ac97)
1304{
1305        struct snd_card *card = ac97->bus->card;
1306        struct snd_kcontrol *kctl;
1307        int err;
1308        unsigned int idx;
1309        unsigned char max;
1310
1311        /* build master controls */
1312        /* AD claims to remove this control from AD1887, although spec v2.2 does not allow this */
1313        if (snd_ac97_try_volume_mix(ac97, AC97_MASTER)) {
1314                if (ac97->flags & AC97_HAS_NO_MASTER_VOL)
1315                        err = snd_ac97_cmute_new(card, "Master Playback Switch",
1316                                                 AC97_MASTER, 0, ac97);
1317                else
1318                        err = snd_ac97_cmix_new(card, "Master Playback",
1319                                                AC97_MASTER, 0, ac97);
1320                if (err < 0)
1321                        return err;
1322        }
1323
1324        ac97->regs[AC97_CENTER_LFE_MASTER] = 0x8080;
1325
1326        /* build center controls */
1327        if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER)) 
1328                && !(ac97->flags & AC97_AD_MULTI)) {
1329                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_center[0], ac97))) < 0)
1330                        return err;
1331                if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_center[1], ac97))) < 0)
1332                        return err;
1333                snd_ac97_change_volume_params2(ac97, AC97_CENTER_LFE_MASTER, 0, &max);
1334                kctl->private_value &= ~(0xff << 16);
1335                kctl->private_value |= (int)max << 16;
1336                set_tlv_db_scale(kctl, find_db_scale(max));
1337                snd_ac97_write_cache(ac97, AC97_CENTER_LFE_MASTER, ac97->regs[AC97_CENTER_LFE_MASTER] | max);
1338        }
1339
1340        /* build LFE controls */
1341        if ((snd_ac97_try_volume_mix(ac97, AC97_CENTER_LFE_MASTER+1))
1342                && !(ac97->flags & AC97_AD_MULTI)) {
1343                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_lfe[0], ac97))) < 0)
1344                        return err;
1345                if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_lfe[1], ac97))) < 0)
1346                        return err;
1347                snd_ac97_change_volume_params2(ac97, AC97_CENTER_LFE_MASTER, 8, &max);
1348                kctl->private_value &= ~(0xff << 16);
1349                kctl->private_value |= (int)max << 16;
1350                set_tlv_db_scale(kctl, find_db_scale(max));
1351                snd_ac97_write_cache(ac97, AC97_CENTER_LFE_MASTER, ac97->regs[AC97_CENTER_LFE_MASTER] | max << 8);
1352        }
1353
1354        /* build surround controls */
1355        if ((snd_ac97_try_volume_mix(ac97, AC97_SURROUND_MASTER)) 
1356                && !(ac97->flags & AC97_AD_MULTI)) {
1357                /* Surround Master (0x38) is with stereo mutes */
1358                if ((err = snd_ac97_cmix_new_stereo(card, "Surround Playback",
1359                                                    AC97_SURROUND_MASTER, 1, 0,
1360                                                    ac97)) < 0)
1361                        return err;
1362        }
1363
1364        /* build headphone controls */
1365        if (snd_ac97_try_volume_mix(ac97, AC97_HEADPHONE)) {
1366                if ((err = snd_ac97_cmix_new(card, "Headphone Playback",
1367                                             AC97_HEADPHONE, 0, ac97)) < 0)
1368                        return err;
1369        }
1370        
1371        /* build master mono controls */
1372        if (snd_ac97_try_volume_mix(ac97, AC97_MASTER_MONO)) {
1373                if ((err = snd_ac97_cmix_new(card, "Master Mono Playback",
1374                                             AC97_MASTER_MONO, 0, ac97)) < 0)
1375                        return err;
1376        }
1377        
1378        /* build master tone controls */
1379        if (!(ac97->flags & AC97_HAS_NO_TONE)) {
1380                if (snd_ac97_try_volume_mix(ac97, AC97_MASTER_TONE)) {
1381                        for (idx = 0; idx < 2; idx++) {
1382                                if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_tone[idx], ac97))) < 0)
1383                                        return err;
1384                                if (ac97->id == AC97_ID_YMF743 ||
1385                                    ac97->id == AC97_ID_YMF753) {
1386                                        kctl->private_value &= ~(0xff << 16);
1387                                        kctl->private_value |= 7 << 16;
1388                                }
1389                        }
1390                        snd_ac97_write_cache(ac97, AC97_MASTER_TONE, 0x0f0f);
1391                }
1392        }
1393        
1394        /* build PC Speaker controls */
1395        if (!(ac97->flags & AC97_HAS_NO_PC_BEEP) && 
1396                ((ac97->flags & AC97_HAS_PC_BEEP) ||
1397            snd_ac97_try_volume_mix(ac97, AC97_PC_BEEP))) {
1398                for (idx = 0; idx < 2; idx++)
1399                        if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_pc_beep[idx], ac97))) < 0)
1400                                return err;
1401                set_tlv_db_scale(kctl, db_scale_4bit);
1402                snd_ac97_write_cache(ac97, AC97_PC_BEEP,
1403                                     snd_ac97_read(ac97, AC97_PC_BEEP) | 0x801e);
1404        }
1405        
1406        /* build Phone controls */
1407        if (!(ac97->flags & AC97_HAS_NO_PHONE)) {
1408                if (snd_ac97_try_volume_mix(ac97, AC97_PHONE)) {
1409                        if ((err = snd_ac97_cmix_new(card, "Phone Playback",
1410                                                     AC97_PHONE, 1, ac97)) < 0)
1411                                return err;
1412                }
1413        }
1414        
1415        /* build MIC controls */
1416        if (!(ac97->flags & AC97_HAS_NO_MIC)) {
1417                if (snd_ac97_try_volume_mix(ac97, AC97_MIC)) {
1418                        if ((err = snd_ac97_cmix_new(card, "Mic Playback",
1419                                                     AC97_MIC, 1, ac97)) < 0)
1420                                return err;
1421                        if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_mic_boost, ac97))) < 0)
1422                                return err;
1423                }
1424        }
1425
1426        /* build Line controls */
1427        if (snd_ac97_try_volume_mix(ac97, AC97_LINE)) {
1428                if ((err = snd_ac97_cmix_new(card, "Line Playback",
1429                                             AC97_LINE, 1, ac97)) < 0)
1430                        return err;
1431        }
1432        
1433        /* build CD controls */
1434        if (!(ac97->flags & AC97_HAS_NO_CD)) {
1435                if (snd_ac97_try_volume_mix(ac97, AC97_CD)) {
1436                        if ((err = snd_ac97_cmix_new(card, "CD Playback",
1437                                                     AC97_CD, 1, ac97)) < 0)
1438                                return err;
1439                }
1440        }
1441        
1442        /* build Video controls */
1443        if (!(ac97->flags & AC97_HAS_NO_VIDEO)) {
1444                if (snd_ac97_try_volume_mix(ac97, AC97_VIDEO)) {
1445                        if ((err = snd_ac97_cmix_new(card, "Video Playback",
1446                                                     AC97_VIDEO, 1, ac97)) < 0)
1447                                return err;
1448                }
1449        }
1450
1451        /* build Aux controls */
1452        if (!(ac97->flags & AC97_HAS_NO_AUX)) {
1453                if (snd_ac97_try_volume_mix(ac97, AC97_AUX)) {
1454                        if ((err = snd_ac97_cmix_new(card, "Aux Playback",
1455                                                     AC97_AUX, 1, ac97)) < 0)
1456                                return err;
1457                }
1458        }
1459
1460        /* build PCM controls */
1461        if (ac97->flags & AC97_AD_MULTI) {
1462                unsigned short init_val;
1463                if (ac97->flags & AC97_STEREO_MUTES)
1464                        init_val = 0x9f9f;
1465                else
1466                        init_val = 0x9f1f;
1467                for (idx = 0; idx < 2; idx++)
1468                        if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_pcm[idx], ac97))) < 0)
1469                                return err;
1470                set_tlv_db_scale(kctl, db_scale_5bit);
1471                ac97->spec.ad18xx.pcmreg[0] = init_val;
1472                if (ac97->scaps & AC97_SCAP_SURROUND_DAC) {
1473                        for (idx = 0; idx < 2; idx++)
1474                                if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_surround[idx], ac97))) < 0)
1475                                        return err;
1476                        set_tlv_db_scale(kctl, db_scale_5bit);
1477                        ac97->spec.ad18xx.pcmreg[1] = init_val;
1478                }
1479                if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC) {
1480                        for (idx = 0; idx < 2; idx++)
1481                                if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_center[idx], ac97))) < 0)
1482                                        return err;
1483                        set_tlv_db_scale(kctl, db_scale_5bit);
1484                        for (idx = 0; idx < 2; idx++)
1485                                if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_ad18xx_lfe[idx], ac97))) < 0)
1486                                        return err;
1487                        set_tlv_db_scale(kctl, db_scale_5bit);
1488                        ac97->spec.ad18xx.pcmreg[2] = init_val;
1489                }
1490                snd_ac97_write_cache(ac97, AC97_PCM, init_val);
1491        } else {
1492                if (!(ac97->flags & AC97_HAS_NO_STD_PCM)) {
1493                        if (ac97->flags & AC97_HAS_NO_PCM_VOL)
1494                                err = snd_ac97_cmute_new(card,
1495                                                         "PCM Playback Switch",
1496                                                         AC97_PCM, 0, ac97);
1497                        else
1498                                err = snd_ac97_cmix_new(card, "PCM Playback",
1499                                                        AC97_PCM, 0, ac97);
1500                        if (err < 0)
1501                                return err;
1502                }
1503        }
1504
1505        /* build Capture controls */
1506        if (!(ac97->flags & AC97_HAS_NO_REC_GAIN)) {
1507                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_control_capture_src, ac97))) < 0)
1508                        return err;
1509                if (snd_ac97_try_bit(ac97, AC97_REC_GAIN, 15)) {
1510                        err = snd_ac97_cmute_new(card, "Capture Switch",
1511                                                 AC97_REC_GAIN, 0, ac97);
1512                        if (err < 0)
1513                                return err;
1514                }
1515                if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_control_capture_vol, ac97))) < 0)
1516                        return err;
1517                set_tlv_db_scale(kctl, db_scale_rec_gain);
1518                snd_ac97_write_cache(ac97, AC97_REC_SEL, 0x0000);
1519                snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x0000);
1520        }
1521        /* build MIC Capture controls */
1522        if (snd_ac97_try_volume_mix(ac97, AC97_REC_GAIN_MIC)) {
1523                for (idx = 0; idx < 2; idx++)
1524                        if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_mic_capture[idx], ac97))) < 0)
1525                                return err;
1526                set_tlv_db_scale(kctl, db_scale_rec_gain);
1527                snd_ac97_write_cache(ac97, AC97_REC_GAIN_MIC, 0x0000);
1528        }
1529
1530        /* build PCM out path & mute control */
1531        if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 15)) {
1532                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_PCM_OUT], ac97))) < 0)
1533                        return err;
1534        }
1535
1536        /* build Simulated Stereo Enhancement control */
1537        if (ac97->caps & 0x0008) {
1538                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_STEREO_ENHANCEMENT], ac97))) < 0)
1539                        return err;
1540        }
1541
1542        /* build 3D Stereo Enhancement control */
1543        if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 13)) {
1544                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_3D], ac97))) < 0)
1545                        return err;
1546        }
1547
1548        /* build Loudness control */
1549        if (ac97->caps & 0x0020) {
1550                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_LOUDNESS], ac97))) < 0)
1551                        return err;
1552        }
1553
1554        /* build Mono output select control */
1555        if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 9)) {
1556                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_MONO], ac97))) < 0)
1557                        return err;
1558        }
1559
1560        /* build Mic select control */
1561        if (snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 8)) {
1562                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_MIC], ac97))) < 0)
1563                        return err;
1564        }
1565
1566        /* build ADC/DAC loopback control */
1567        if (enable_loopback && snd_ac97_try_bit(ac97, AC97_GENERAL_PURPOSE, 7)) {
1568                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_general[AC97_GENERAL_LOOPBACK], ac97))) < 0)
1569                        return err;
1570        }
1571
1572        snd_ac97_update_bits(ac97, AC97_GENERAL_PURPOSE, ~AC97_GP_DRSS_MASK, 0x0000);
1573
1574        /* build 3D controls */
1575        if (ac97->build_ops->build_3d) {
1576                ac97->build_ops->build_3d(ac97);
1577        } else {
1578                if (snd_ac97_try_volume_mix(ac97, AC97_3D_CONTROL)) {
1579                        unsigned short val;
1580                        val = 0x0707;
1581                        snd_ac97_write(ac97, AC97_3D_CONTROL, val);
1582                        val = snd_ac97_read(ac97, AC97_3D_CONTROL);
1583                        val = val == 0x0606;
1584                        if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_3d[0], ac97))) < 0)
1585                                return err;
1586                        if (val)
1587                                kctl->private_value = AC97_3D_CONTROL | (9 << 8) | (7 << 16);
1588                        if ((err = snd_ctl_add(card, kctl = snd_ac97_cnew(&snd_ac97_controls_3d[1], ac97))) < 0)
1589                                return err;
1590                        if (val)
1591                                kctl->private_value = AC97_3D_CONTROL | (1 << 8) | (7 << 16);
1592                        snd_ac97_write_cache(ac97, AC97_3D_CONTROL, 0x0000);
1593                }
1594        }
1595
1596        /* build S/PDIF controls */
1597
1598        /* Hack for ASUS P5P800-VM, which does not indicate S/PDIF capability */
1599        if (ac97->subsystem_vendor == 0x1043 &&
1600            ac97->subsystem_device == 0x810f)
1601                ac97->ext_id |= AC97_EI_SPDIF;
1602
1603        if ((ac97->ext_id & AC97_EI_SPDIF) && !(ac97->scaps & AC97_SCAP_NO_SPDIF)) {
1604                if (ac97->build_ops->build_spdif) {
1605                        if ((err = ac97->build_ops->build_spdif(ac97)) < 0)
1606                                return err;
1607                } else {
1608                        for (idx = 0; idx < 5; idx++)
1609                                if ((err = snd_ctl_add(card, snd_ac97_cnew(&snd_ac97_controls_spdif[idx], ac97))) < 0)
1610                                        return err;
1611                        if (ac97->build_ops->build_post_spdif) {
1612                                if ((err = ac97->build_ops->build_post_spdif(ac97)) < 0)
1613                                        return err;
1614                        }
1615                        /* set default PCM S/PDIF params */
1616                        /* consumer,PCM audio,no copyright,no preemphasis,PCM coder,original,48000Hz */
1617                        snd_ac97_write_cache(ac97, AC97_SPDIF, 0x2a20);
1618                        ac97->rates[AC97_RATES_SPDIF] = snd_ac97_determine_spdif_rates(ac97);
1619                }
1620                ac97->spdif_status = SNDRV_PCM_DEFAULT_CON_SPDIF;
1621        }
1622        
1623        /* build chip specific controls */
1624        if (ac97->build_ops->build_specific)
1625                if ((err = ac97->build_ops->build_specific(ac97)) < 0)
1626                        return err;
1627
1628        if (snd_ac97_try_bit(ac97, AC97_POWERDOWN, 15)) {
1629                kctl = snd_ac97_cnew(&snd_ac97_control_eapd, ac97);
1630                if (! kctl)
1631                        return -ENOMEM;
1632                if (ac97->scaps & AC97_SCAP_INV_EAPD)
1633                        set_inv_eapd(ac97, kctl);
1634                if ((err = snd_ctl_add(card, kctl)) < 0)
1635                        return err;
1636        }
1637
1638        return 0;
1639}
1640
1641static int snd_ac97_modem_build(struct snd_card *card, struct snd_ac97 * ac97)
1642{
1643        int err, idx;
1644
1645        //printk("AC97_GPIO_CFG = %x\n",snd_ac97_read(ac97,AC97_GPIO_CFG));
1646        snd_ac97_write(ac97, AC97_GPIO_CFG, 0xffff & ~(AC97_GPIO_LINE1_OH));
1647        snd_ac97_write(ac97, AC97_GPIO_POLARITY, 0xffff & ~(AC97_GPIO_LINE1_OH));
1648        snd_ac97_write(ac97, AC97_GPIO_STICKY, 0xffff);
1649        snd_ac97_write(ac97, AC97_GPIO_WAKEUP, 0x0);
1650        snd_ac97_write(ac97, AC97_MISC_AFE, 0x0);
1651
1652        /* build modem switches */
1653        for (idx = 0; idx < ARRAY_SIZE(snd_ac97_controls_modem_switches); idx++)
1654                if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_ac97_controls_modem_switches[idx], ac97))) < 0)
1655                        return err;
1656
1657        /* build chip specific controls */
1658        if (ac97->build_ops->build_specific)
1659                if ((err = ac97->build_ops->build_specific(ac97)) < 0)
1660                        return err;
1661
1662        return 0;
1663}
1664
1665static int snd_ac97_test_rate(struct snd_ac97 *ac97, int reg, int shadow_reg, int rate)
1666{
1667        unsigned short val;
1668        unsigned int tmp;
1669
1670        tmp = ((unsigned int)rate * ac97->bus->clock) / 48000;
1671        snd_ac97_write_cache(ac97, reg, tmp & 0xffff);
1672        if (shadow_reg)
1673                snd_ac97_write_cache(ac97, shadow_reg, tmp & 0xffff);
1674        val = snd_ac97_read(ac97, reg);
1675        return val == (tmp & 0xffff);
1676}
1677
1678static void snd_ac97_determine_rates(struct snd_ac97 *ac97, int reg, int shadow_reg, unsigned int *r_result)
1679{
1680        unsigned int result = 0;
1681        unsigned short saved;
1682
1683        if (ac97->bus->no_vra) {
1684                *r_result = SNDRV_PCM_RATE_48000;
1685                if ((ac97->flags & AC97_DOUBLE_RATE) &&
1686                    reg == AC97_PCM_FRONT_DAC_RATE)
1687                        *r_result |= SNDRV_PCM_RATE_96000;
1688                return;
1689        }
1690
1691        saved = snd_ac97_read(ac97, reg);
1692        if ((ac97->ext_id & AC97_EI_DRA) && reg == AC97_PCM_FRONT_DAC_RATE)
1693                snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS,
1694                                     AC97_EA_DRA, 0);
1695        /* test a non-standard rate */
1696        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 11000))
1697                result |= SNDRV_PCM_RATE_CONTINUOUS;
1698        /* let's try to obtain standard rates */
1699        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 8000))
1700                result |= SNDRV_PCM_RATE_8000;
1701        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 11025))
1702                result |= SNDRV_PCM_RATE_11025;
1703        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 16000))
1704                result |= SNDRV_PCM_RATE_16000;
1705        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 22050))
1706                result |= SNDRV_PCM_RATE_22050;
1707        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 32000))
1708                result |= SNDRV_PCM_RATE_32000;
1709        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 44100))
1710                result |= SNDRV_PCM_RATE_44100;
1711        if (snd_ac97_test_rate(ac97, reg, shadow_reg, 48000))
1712                result |= SNDRV_PCM_RATE_48000;
1713        if ((ac97->flags & AC97_DOUBLE_RATE) &&
1714            reg == AC97_PCM_FRONT_DAC_RATE) {
1715                /* test standard double rates */
1716                snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS,
1717                                     AC97_EA_DRA, AC97_EA_DRA);
1718                if (snd_ac97_test_rate(ac97, reg, shadow_reg, 64000 / 2))
1719                        result |= SNDRV_PCM_RATE_64000;
1720                if (snd_ac97_test_rate(ac97, reg, shadow_reg, 88200 / 2))
1721                        result |= SNDRV_PCM_RATE_88200;
1722                if (snd_ac97_test_rate(ac97, reg, shadow_reg, 96000 / 2))
1723                        result |= SNDRV_PCM_RATE_96000;
1724                /* some codecs don't support variable double rates */
1725                if (!snd_ac97_test_rate(ac97, reg, shadow_reg, 76100 / 2))
1726                        result &= ~SNDRV_PCM_RATE_CONTINUOUS;
1727                snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS,
1728                                     AC97_EA_DRA, 0);
1729        }
1730        /* restore the default value */
1731        snd_ac97_write_cache(ac97, reg, saved);
1732        if (shadow_reg)
1733                snd_ac97_write_cache(ac97, shadow_reg, saved);
1734        *r_result = result;
1735}
1736
1737/* check AC97_SPDIF register to accept which sample rates */
1738static unsigned int snd_ac97_determine_spdif_rates(struct snd_ac97 *ac97)
1739{
1740        unsigned int result = 0;
1741        int i;
1742        static unsigned short ctl_bits[] = {
1743                AC97_SC_SPSR_44K, AC97_SC_SPSR_32K, AC97_SC_SPSR_48K
1744        };
1745        static unsigned int rate_bits[] = {
1746                SNDRV_PCM_RATE_44100, SNDRV_PCM_RATE_32000, SNDRV_PCM_RATE_48000
1747        };
1748
1749        for (i = 0; i < (int)ARRAY_SIZE(ctl_bits); i++) {
1750                snd_ac97_update_bits(ac97, AC97_SPDIF, AC97_SC_SPSR_MASK, ctl_bits[i]);
1751                if ((snd_ac97_read(ac97, AC97_SPDIF) & AC97_SC_SPSR_MASK) == ctl_bits[i])
1752                        result |= rate_bits[i];
1753        }
1754        return result;
1755}
1756
1757/* look for the codec id table matching with the given id */
1758static const struct ac97_codec_id *look_for_codec_id(const struct ac97_codec_id *table,
1759                                                     unsigned int id)
1760{
1761        const struct ac97_codec_id *pid;
1762
1763        for (pid = table; pid->id; pid++)
1764                if (pid->id == (id & pid->mask))
1765                        return pid;
1766        return NULL;
1767}
1768
1769void snd_ac97_get_name(struct snd_ac97 *ac97, unsigned int id, char *name, int modem)
1770{
1771        const struct ac97_codec_id *pid;
1772
1773        sprintf(name, "0x%x %c%c%c", id,
1774                printable(id >> 24),
1775                printable(id >> 16),
1776                printable(id >> 8));
1777        pid = look_for_codec_id(snd_ac97_codec_id_vendors, id);
1778        if (! pid)
1779                return;
1780
1781        strcpy(name, pid->name);
1782        if (ac97 && pid->patch) {
1783                if ((modem && (pid->flags & AC97_MODEM_PATCH)) ||
1784                    (! modem && ! (pid->flags & AC97_MODEM_PATCH)))
1785                        pid->patch(ac97);
1786        } 
1787
1788        pid = look_for_codec_id(snd_ac97_codec_ids, id);
1789        if (pid) {
1790                strcat(name, " ");
1791                strcat(name, pid->name);
1792                if (pid->mask != 0xffffffff)
1793                        sprintf(name + strlen(name), " rev %d", id & ~pid->mask);
1794                if (ac97 && pid->patch) {
1795                        if ((modem && (pid->flags & AC97_MODEM_PATCH)) ||
1796                            (! modem && ! (pid->flags & AC97_MODEM_PATCH)))
1797                                pid->patch(ac97);
1798                }
1799        } else
1800                sprintf(name + strlen(name), " id %x", id & 0xff);
1801}
1802
1803/**
1804 * snd_ac97_get_short_name - retrieve codec name
1805 * @ac97: the codec instance
1806 *
1807 * Returns the short identifying name of the codec.
1808 */
1809const char *snd_ac97_get_short_name(struct snd_ac97 *ac97)
1810{
1811        const struct ac97_codec_id *pid;
1812
1813        for (pid = snd_ac97_codec_ids; pid->id; pid++)
1814                if (pid->id == (ac97->id & pid->mask))
1815                        return pid->name;
1816        return "unknown codec";
1817}
1818
1819EXPORT_SYMBOL(snd_ac97_get_short_name);
1820
1821/* wait for a while until registers are accessible after RESET
1822 * return 0 if ok, negative not ready
1823 */
1824static int ac97_reset_wait(struct snd_ac97 *ac97, int timeout, int with_modem)
1825{
1826        unsigned long end_time;
1827        unsigned short val;
1828
1829        end_time = jiffies + timeout;
1830        do {
1831                
1832                /* use preliminary reads to settle the communication */
1833                snd_ac97_read(ac97, AC97_RESET);
1834                snd_ac97_read(ac97, AC97_VENDOR_ID1);
1835                snd_ac97_read(ac97, AC97_VENDOR_ID2);
1836                /* modem? */
1837                if (with_modem) {
1838                        val = snd_ac97_read(ac97, AC97_EXTENDED_MID);
1839                        if (val != 0xffff && (val & 1) != 0)
1840                                return 0;
1841                }
1842                if (ac97->scaps & AC97_SCAP_DETECT_BY_VENDOR) {
1843                        /* probably only Xbox issue - all registers are read as zero */
1844                        val = snd_ac97_read(ac97, AC97_VENDOR_ID1);
1845                        if (val != 0 && val != 0xffff)
1846                                return 0;
1847                } else {
1848                        /* because the PCM or MASTER volume registers can be modified,
1849                         * the REC_GAIN register is used for tests
1850                         */
1851                        /* test if we can write to the record gain volume register */
1852                        snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a05);
1853                        if ((snd_ac97_read(ac97, AC97_REC_GAIN) & 0x7fff) == 0x0a05)
1854                                return 0;
1855                }
1856                schedule_timeout_uninterruptible(1);
1857        } while (time_after_eq(end_time, jiffies));
1858        return -ENODEV;
1859}
1860
1861/**
1862 * snd_ac97_bus - create an AC97 bus component
1863 * @card: the card instance
1864 * @num: the bus number
1865 * @ops: the bus callbacks table
1866 * @private_data: private data pointer for the new instance
1867 * @rbus: the pointer to store the new AC97 bus instance.
1868 *
1869 * Creates an AC97 bus component.  An struct snd_ac97_bus instance is newly
1870 * allocated and initialized.
1871 *
1872 * The ops table must include valid callbacks (at least read and
1873 * write).  The other callbacks, wait and reset, are not mandatory.
1874 * 
1875 * The clock is set to 48000.  If another clock is needed, set
1876 * (*rbus)->clock manually.
1877 *
1878 * The AC97 bus instance is registered as a low-level device, so you don't
1879 * have to release it manually.
1880 *
1881 * Returns zero if successful, or a negative error code on failure.
1882 */
1883int snd_ac97_bus(struct snd_card *card, int num, struct snd_ac97_bus_ops *ops,
1884                 void *private_data, struct snd_ac97_bus **rbus)
1885{
1886        int err;
1887        struct snd_ac97_bus *bus;
1888        static struct snd_device_ops dev_ops = {
1889                .dev_free =     snd_ac97_bus_dev_free,
1890        };
1891
1892        snd_assert(card != NULL, return -EINVAL);
1893        snd_assert(rbus != NULL, return -EINVAL);
1894        bus = kzalloc(sizeof(*bus), GFP_KERNEL);
1895        if (bus == NULL)
1896                return -ENOMEM;
1897        bus->card = card;
1898        bus->num = num;
1899        bus->ops = ops;
1900        bus->private_data = private_data;
1901        bus->clock = 48000;
1902        spin_lock_init(&bus->bus_lock);
1903        snd_ac97_bus_proc_init(bus);
1904        if ((err = snd_device_new(card, SNDRV_DEV_BUS, bus, &dev_ops)) < 0) {
1905                snd_ac97_bus_free(bus);
1906                return err;
1907        }
1908        *rbus = bus;
1909        return 0;
1910}
1911
1912EXPORT_SYMBOL(snd_ac97_bus);
1913
1914/* stop no dev release warning */
1915static void ac97_device_release(struct device * dev)
1916{
1917}
1918
1919/* register ac97 codec to bus */
1920static int snd_ac97_dev_register(struct snd_device *device)
1921{
1922        struct snd_ac97 *ac97 = device->device_data;
1923        int err;
1924
1925        ac97->dev.bus = &ac97_bus_type;
1926        ac97->dev.parent = ac97->bus->card->dev;
1927        ac97->dev.release = ac97_device_release;
1928        snprintf(ac97->dev.bus_id, BUS_ID_SIZE, "%d-%d:%s",
1929                 ac97->bus->card->number, ac97->num,
1930                 snd_ac97_get_short_name(ac97));
1931        if ((err = device_register(&ac97->dev)) < 0) {
1932                snd_printk(KERN_ERR "Can't register ac97 bus\n");
1933                ac97->dev.bus = NULL;
1934                return err;
1935        }
1936        return 0;
1937}
1938
1939/* disconnect ac97 codec */
1940static int snd_ac97_dev_disconnect(struct snd_device *device)
1941{
1942        struct snd_ac97 *ac97 = device->device_data;
1943        if (ac97->dev.bus)
1944                device_unregister(&ac97->dev);
1945        return 0;
1946}
1947
1948/* build_ops to do nothing */
1949static struct snd_ac97_build_ops null_build_ops;
1950
1951#ifdef CONFIG_SND_AC97_POWER_SAVE
1952static void do_update_power(struct work_struct *work)
1953{
1954        update_power_regs(
1955                container_of(work, struct snd_ac97, power_work.work));
1956}
1957#endif
1958
1959/**
1960 * snd_ac97_mixer - create an Codec97 component
1961 * @bus: the AC97 bus which codec is attached to
1962 * @template: the template of ac97, including index, callbacks and
1963 *         the private data.
1964 * @rac97: the pointer to store the new ac97 instance.
1965 *
1966 * Creates an Codec97 component.  An struct snd_ac97 instance is newly
1967 * allocated and initialized from the template.  The codec
1968 * is then initialized by the standard procedure.
1969 *
1970 * The template must include the codec number (num) and address (addr),
1971 * and the private data (private_data).
1972 * 
1973 * The ac97 instance is registered as a low-level device, so you don't
1974 * have to release it manually.
1975 *
1976 * Returns zero if successful, or a negative error code on failure.
1977 */
1978int snd_ac97_mixer(struct snd_ac97_bus *bus, struct snd_ac97_template *template, struct snd_ac97 **rac97)
1979{
1980        int err;
1981        struct snd_ac97 *ac97;
1982        struct snd_card *card;
1983        char name[64];
1984        unsigned long end_time;
1985        unsigned int reg;
1986        const struct ac97_codec_id *pid;
1987        static struct snd_device_ops ops = {
1988                .dev_free =     snd_ac97_dev_free,
1989                .dev_register = snd_ac97_dev_register,
1990                .dev_disconnect =       snd_ac97_dev_disconnect,
1991        };
1992
1993        snd_assert(rac97 != NULL, return -EINVAL);
1994        *rac97 = NULL;
1995        snd_assert(bus != NULL && template != NULL, return -EINVAL);
1996        snd_assert(template->num < 4 && bus->codec[template->num] == NULL, return -EINVAL);
1997
1998        card = bus->card;
1999        ac97 = kzalloc(sizeof(*ac97), GFP_KERNEL);
2000        if (ac97 == NULL)
2001                return -ENOMEM;
2002        ac97->private_data = template->private_data;
2003        ac97->private_free = template->private_free;
2004        ac97->bus = bus;
2005        ac97->pci = template->pci;
2006        ac97->num = template->num;
2007        ac97->addr = template->addr;
2008        ac97->scaps = template->scaps;
2009        ac97->res_table = template->res_table;
2010        bus->codec[ac97->num] = ac97;
2011        mutex_init(&ac97->reg_mutex);
2012        mutex_init(&ac97->page_mutex);
2013#ifdef CONFIG_SND_AC97_POWER_SAVE
2014        INIT_DELAYED_WORK(&ac97->power_work, do_update_power);
2015#endif
2016
2017#ifdef CONFIG_PCI
2018        if (ac97->pci) {
2019                pci_read_config_word(ac97->pci, PCI_SUBSYSTEM_VENDOR_ID, &ac97->subsystem_vendor);
2020                pci_read_config_word(ac97->pci, PCI_SUBSYSTEM_ID, &ac97->subsystem_device);
2021        }
2022#endif
2023        if (bus->ops->reset) {
2024                bus->ops->reset(ac97);
2025                goto __access_ok;
2026        }
2027
2028        ac97->id = snd_ac97_read(ac97, AC97_VENDOR_ID1) << 16;
2029        ac97->id |= snd_ac97_read(ac97, AC97_VENDOR_ID2);
2030        if (ac97->id && ac97->id != (unsigned int)-1) {
2031                pid = look_for_codec_id(snd_ac97_codec_ids, ac97->id);
2032                if (pid && (pid->flags & AC97_DEFAULT_POWER_OFF))
2033                        goto __access_ok;
2034        }
2035
2036        /* reset to defaults */
2037        if (!(ac97->scaps & AC97_SCAP_SKIP_AUDIO))
2038                snd_ac97_write(ac97, AC97_RESET, 0);
2039        if (!(ac97->scaps & AC97_SCAP_SKIP_MODEM))
2040                snd_ac97_write(ac97, AC97_EXTENDED_MID, 0);
2041        if (bus->ops->wait)
2042                bus->ops->wait(ac97);
2043        else {
2044                udelay(50);
2045                if (ac97->scaps & AC97_SCAP_SKIP_AUDIO)
2046                        err = ac97_reset_wait(ac97, msecs_to_jiffies(500), 1);
2047                else {
2048                        err = ac97_reset_wait(ac97, msecs_to_jiffies(500), 0);
2049                        if (err < 0)
2050                                err = ac97_reset_wait(ac97,
2051                                                      msecs_to_jiffies(500), 1);
2052                }
2053                if (err < 0) {
2054                        snd_printk(KERN_WARNING "AC'97 %d does not respond - RESET\n", ac97->num);
2055                        /* proceed anyway - it's often non-critical */
2056                }
2057        }
2058      __access_ok:
2059        ac97->id = snd_ac97_read(ac97, AC97_VENDOR_ID1) << 16;
2060        ac97->id |= snd_ac97_read(ac97, AC97_VENDOR_ID2);
2061        if (! (ac97->scaps & AC97_SCAP_DETECT_BY_VENDOR) &&
2062            (ac97->id == 0x00000000 || ac97->id == 0xffffffff)) {
2063                snd_printk(KERN_ERR "AC'97 %d access is not valid [0x%x], removing mixer.\n", ac97->num, ac97->id);
2064                snd_ac97_free(ac97);
2065                return -EIO;
2066        }
2067        pid = look_for_codec_id(snd_ac97_codec_ids, ac97->id);
2068        if (pid)
2069                ac97->flags |= pid->flags;
2070        
2071        /* test for AC'97 */
2072        if (!(ac97->scaps & AC97_SCAP_SKIP_AUDIO) && !(ac97->scaps & AC97_SCAP_AUDIO)) {
2073                /* test if we can write to the record gain volume register */
2074                snd_ac97_write_cache(ac97, AC97_REC_GAIN, 0x8a06);
2075                if (((err = snd_ac97_read(ac97, AC97_REC_GAIN)) & 0x7fff) == 0x0a06)
2076                        ac97->scaps |= AC97_SCAP_AUDIO;
2077        }
2078        if (ac97->scaps & AC97_SCAP_AUDIO) {
2079                ac97->caps = snd_ac97_read(ac97, AC97_RESET);
2080                ac97->ext_id = snd_ac97_read(ac97, AC97_EXTENDED_ID);
2081                if (ac97->ext_id == 0xffff)     /* invalid combination */
2082                        ac97->ext_id = 0;
2083        }
2084
2085        /* test for MC'97 */
2086        if (!(ac97->scaps & AC97_SCAP_SKIP_MODEM) && !(ac97->scaps & AC97_SCAP_MODEM)) {
2087                ac97->ext_mid = snd_ac97_read(ac97, AC97_EXTENDED_MID);
2088                if (ac97->ext_mid == 0xffff)    /* invalid combination */
2089                        ac97->ext_mid = 0;
2090                if (ac97->ext_mid & 1)
2091                        ac97->scaps |= AC97_SCAP_MODEM;
2092        }
2093
2094        if (!ac97_is_audio(ac97) && !ac97_is_modem(ac97)) {
2095                if (!(ac97->scaps & (AC97_SCAP_SKIP_AUDIO|AC97_SCAP_SKIP_MODEM)))
2096                        snd_printk(KERN_ERR "AC'97 %d access error (not audio or modem codec)\n", ac97->num);
2097                snd_ac97_free(ac97);
2098                return -EACCES;
2099        }
2100
2101        if (bus->ops->reset) // FIXME: always skipping?
2102                goto __ready_ok;
2103
2104        /* FIXME: add powerdown control */
2105        if (ac97_is_audio(ac97)) {
2106                /* nothing should be in powerdown mode */
2107                snd_ac97_write_cache(ac97, AC97_POWERDOWN, 0);
2108                if (! (ac97->flags & AC97_DEFAULT_POWER_OFF)) {
2109                        snd_ac97_write_cache(ac97, AC97_RESET, 0); /* reset to defaults */
2110                        udelay(100);
2111                        snd_ac97_write_cache(ac97, AC97_POWERDOWN, 0);
2112                }
2113                /* nothing should be in powerdown mode */
2114                snd_ac97_write_cache(ac97, AC97_GENERAL_PURPOSE, 0);
2115                end_time = jiffies + msecs_to_jiffies(100);
2116                do {
2117                        if ((snd_ac97_read(ac97, AC97_POWERDOWN) & 0x0f) == 0x0f)
2118                                goto __ready_ok;
2119                        schedule_timeout_uninterruptible(1);
2120                } while (time_after_eq(end_time, jiffies));
2121                snd_printk(KERN_WARNING "AC'97 %d analog subsections not ready\n", ac97->num);
2122        }
2123
2124        /* FIXME: add powerdown control */
2125        if (ac97_is_modem(ac97)) {
2126                unsigned char tmp;
2127
2128                /* nothing should be in powerdown mode */
2129                /* note: it's important to set the rate at first */
2130                tmp = AC97_MEA_GPIO;
2131                if (ac97->ext_mid & AC97_MEI_LINE1) {
2132                        snd_ac97_write_cache(ac97, AC97_LINE1_RATE, 8000);
2133                        tmp |= AC97_MEA_ADC1 | AC97_MEA_DAC1;
2134                }
2135                if (ac97->ext_mid & AC97_MEI_LINE2) {
2136                        snd_ac97_write_cache(ac97, AC97_LINE2_RATE, 8000);
2137                        tmp |= AC97_MEA_ADC2 | AC97_MEA_DAC2;
2138                }
2139                if (ac97->ext_mid & AC97_MEI_HANDSET) {
2140                        snd_ac97_write_cache(ac97, AC97_HANDSET_RATE, 8000);
2141                        tmp |= AC97_MEA_HADC | AC97_MEA_HDAC;
2142                }
2143                snd_ac97_write_cache(ac97, AC97_EXTENDED_MSTATUS, 0);
2144                udelay(100);
2145                /* nothing should be in powerdown mode */
2146                snd_ac97_write_cache(ac97, AC97_EXTENDED_MSTATUS, 0);
2147                end_time = jiffies + msecs_to_jiffies(100);
2148                do {
2149                        if ((snd_ac97_read(ac97, AC97_EXTENDED_MSTATUS) & tmp) == tmp)
2150                                goto __ready_ok;
2151                        schedule_timeout_uninterruptible(1);
2152                } while (time_after_eq(end_time, jiffies));
2153                snd_printk(KERN_WARNING "MC'97 %d converters and GPIO not ready (0x%x)\n", ac97->num, snd_ac97_read(ac97, AC97_EXTENDED_MSTATUS));
2154        }
2155        
2156      __ready_ok:
2157        if (ac97_is_audio(ac97))
2158                ac97->addr = (ac97->ext_id & AC97_EI_ADDR_MASK) >> AC97_EI_ADDR_SHIFT;
2159        else
2160                ac97->addr = (ac97->ext_mid & AC97_MEI_ADDR_MASK) >> AC97_MEI_ADDR_SHIFT;
2161        if (ac97->ext_id & 0x01c9) {    /* L/R, MIC, SDAC, LDAC VRA support */
2162                reg = snd_ac97_read(ac97, AC97_EXTENDED_STATUS);
2163                reg |= ac97->ext_id & 0x01c0; /* LDAC/SDAC/CDAC */
2164                if (! bus->no_vra)
2165                        reg |= ac97->ext_id & 0x0009; /* VRA/VRM */
2166                snd_ac97_write_cache(ac97, AC97_EXTENDED_STATUS, reg);
2167        }
2168        if ((ac97->ext_id & AC97_EI_DRA) && bus->dra) {
2169                /* Intel controllers require double rate data to be put in
2170                 * slots 7+8, so let's hope the codec supports it. */
2171                snd_ac97_update_bits(ac97, AC97_GENERAL_PURPOSE, AC97_GP_DRSS_MASK, AC97_GP_DRSS_78);
2172                if ((snd_ac97_read(ac97, AC97_GENERAL_PURPOSE) & AC97_GP_DRSS_MASK) == AC97_GP_DRSS_78)
2173                        ac97->flags |= AC97_DOUBLE_RATE;
2174                /* restore to slots 10/11 to avoid the confliction with surrounds */
2175                snd_ac97_update_bits(ac97, AC97_GENERAL_PURPOSE, AC97_GP_DRSS_MASK, 0);
2176        }
2177        if (ac97->ext_id & AC97_EI_VRA) {       /* VRA support */
2178                snd_ac97_determine_rates(ac97, AC97_PCM_FRONT_DAC_RATE, 0, &ac97->rates[AC97_RATES_FRONT_DAC]);
2179                snd_ac97_determine_rates(ac97, AC97_PCM_LR_ADC_RATE, 0, &ac97->rates[AC97_RATES_ADC]);
2180        } else {
2181                ac97->rates[AC97_RATES_FRONT_DAC] = SNDRV_PCM_RATE_48000;
2182                if (ac97->flags & AC97_DOUBLE_RATE)
2183                        ac97->rates[AC97_RATES_FRONT_DAC] |= SNDRV_PCM_RATE_96000;
2184                ac97->rates[AC97_RATES_ADC] = SNDRV_PCM_RATE_48000;
2185        }
2186        if (ac97->ext_id & AC97_EI_SPDIF) {
2187                /* codec specific code (patch) should override these values */
2188                ac97->rates[AC97_RATES_SPDIF] = SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_32000;
2189        }
2190        if (ac97->ext_id & AC97_EI_VRM) {       /* MIC VRA support */
2191                snd_ac97_determine_rates(ac97, AC97_PCM_MIC_ADC_RATE, 0, &ac97->rates[AC97_RATES_MIC_ADC]);
2192        } else {
2193                ac97->rates[AC97_RATES_MIC_ADC] = SNDRV_PCM_RATE_48000;
2194        }
2195        if (ac97->ext_id & AC97_EI_SDAC) {      /* SDAC support */
2196                snd_ac97_determine_rates(ac97, AC97_PCM_SURR_DAC_RATE, AC97_PCM_FRONT_DAC_RATE, &ac97->rates[AC97_RATES_SURR_DAC]);
2197                ac97->scaps |= AC97_SCAP_SURROUND_DAC;
2198        }
2199        if (ac97->ext_id & AC97_EI_LDAC) {      /* LDAC support */
2200                snd_ac97_determine_rates(ac97, AC97_PCM_LFE_DAC_RATE, AC97_PCM_FRONT_DAC_RATE, &ac97->rates[AC97_RATES_LFE_DAC]);
2201                ac97->scaps |= AC97_SCAP_CENTER_LFE_DAC;
2202        }
2203        /* additional initializations */
2204        if (bus->ops->init)
2205                bus->ops->init(ac97);
2206        snd_ac97_get_name(ac97, ac97->id, name, !ac97_is_audio(ac97));
2207        snd_ac97_get_name(NULL, ac97->id, name, !ac97_is_audio(ac97));  // ac97->id might be changed in the special setup code
2208        if (! ac97->build_ops)
2209                ac97->build_ops = &null_build_ops;
2210
2211        if (ac97_is_audio(ac97)) {
2212                char comp[16];
2213                if (card->mixername[0] == '\0') {
2214                        strcpy(card->mixername, name);
2215                } else {
2216                        if (strlen(card->mixername) + 1 + strlen(name) + 1 <= sizeof(card->mixername)) {
2217                                strcat(card->mixername, ",");
2218                                strcat(card->mixername, name);
2219                        }
2220                }
2221                sprintf(comp, "AC97a:%08x", ac97->id);
2222                if ((err = snd_component_add(card, comp)) < 0) {
2223                        snd_ac97_free(ac97);
2224                        return err;
2225                }
2226                if (snd_ac97_mixer_build(ac97) < 0) {
2227                        snd_ac97_free(ac97);
2228                        return -ENOMEM;
2229                }
2230        }
2231        if (ac97_is_modem(ac97)) {
2232                char comp[16];
2233                if (card->mixername[0] == '\0') {
2234                        strcpy(card->mixername, name);
2235                } else {
2236                        if (strlen(card->mixername) + 1 + strlen(name) + 1 <= sizeof(card->mixername)) {
2237                                strcat(card->mixername, ",");
2238                                strcat(card->mixername, name);
2239                        }
2240                }
2241                sprintf(comp, "AC97m:%08x", ac97->id);
2242                if ((err = snd_component_add(card, comp)) < 0) {
2243                        snd_ac97_free(ac97);
2244                        return err;
2245                }
2246                if (snd_ac97_modem_build(card, ac97) < 0) {
2247                        snd_ac97_free(ac97);
2248                        return -ENOMEM;
2249                }
2250        }
2251        if (ac97_is_audio(ac97))
2252                update_power_regs(ac97);
2253        snd_ac97_proc_init(ac97);
2254        if ((err = snd_device_new(card, SNDRV_DEV_CODEC, ac97, &ops)) < 0) {
2255                snd_ac97_free(ac97);
2256                return err;
2257        }
2258        *rac97 = ac97;
2259        return 0;
2260}
2261
2262EXPORT_SYMBOL(snd_ac97_mixer);
2263
2264/*
2265 * Power down the chip.
2266 *
2267 * MASTER and HEADPHONE registers are muted but the register cache values
2268 * are not changed, so that the values can be restored in snd_ac97_resume().
2269 */
2270static void snd_ac97_powerdown(struct snd_ac97 *ac97)
2271{
2272        unsigned short power;
2273
2274        if (ac97_is_audio(ac97)) {
2275                /* some codecs have stereo mute bits */
2276                snd_ac97_write(ac97, AC97_MASTER, 0x9f9f);
2277                snd_ac97_write(ac97, AC97_HEADPHONE, 0x9f9f);
2278        }
2279
2280        /* surround, CLFE, mic powerdown */
2281        power = ac97->regs[AC97_EXTENDED_STATUS];
2282        if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
2283                power |= AC97_EA_PRJ;
2284        if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
2285                power |= AC97_EA_PRI | AC97_EA_PRK;
2286        power |= AC97_EA_PRL;
2287        snd_ac97_write(ac97, AC97_EXTENDED_STATUS, power);
2288
2289        /* powerdown external amplifier */
2290        if (ac97->scaps & AC97_SCAP_INV_EAPD)
2291                power = ac97->regs[AC97_POWERDOWN] & ~AC97_PD_EAPD;
2292        else if (! (ac97->scaps & AC97_SCAP_EAPD_LED))
2293                power = ac97->regs[AC97_POWERDOWN] | AC97_PD_EAPD;
2294        power |= AC97_PD_PR6;   /* Headphone amplifier powerdown */
2295        power |= AC97_PD_PR0 | AC97_PD_PR1;     /* ADC & DAC powerdown */
2296        snd_ac97_write(ac97, AC97_POWERDOWN, power);
2297        udelay(100);
2298        power |= AC97_PD_PR2 | AC97_PD_PR3;     /* Analog Mixer powerdown */
2299        snd_ac97_write(ac97, AC97_POWERDOWN, power);
2300        if (ac97_is_power_save_mode(ac97)) {
2301                udelay(100);
2302                /* AC-link powerdown, internal Clk disable */
2303                /* FIXME: this may cause click noises on some boards */
2304                power |= AC97_PD_PR4 | AC97_PD_PR5;
2305                snd_ac97_write(ac97, AC97_POWERDOWN, power);
2306        }
2307}
2308
2309
2310struct ac97_power_reg {
2311        unsigned short reg;
2312        unsigned short power_reg;
2313        unsigned short mask;
2314};
2315
2316enum { PWIDX_ADC, PWIDX_FRONT, PWIDX_CLFE, PWIDX_SURR, PWIDX_MIC, PWIDX_SIZE };
2317
2318static struct ac97_power_reg power_regs[PWIDX_SIZE] = {
2319        [PWIDX_ADC] = { AC97_PCM_LR_ADC_RATE, AC97_POWERDOWN, AC97_PD_PR0},
2320        [PWIDX_FRONT] = { AC97_PCM_FRONT_DAC_RATE, AC97_POWERDOWN, AC97_PD_PR1},
2321        [PWIDX_CLFE] = { AC97_PCM_LFE_DAC_RATE, AC97_EXTENDED_STATUS,
2322                         AC97_EA_PRI | AC97_EA_PRK},
2323        [PWIDX_SURR] = { AC97_PCM_SURR_DAC_RATE, AC97_EXTENDED_STATUS,
2324                         AC97_EA_PRJ},
2325        [PWIDX_MIC] = { AC97_PCM_MIC_ADC_RATE, AC97_EXTENDED_STATUS,
2326                        AC97_EA_PRL},
2327};
2328
2329#ifdef CONFIG_SND_AC97_POWER_SAVE
2330/**
2331 * snd_ac97_update_power - update the powerdown register
2332 * @ac97: the codec instance
2333 * @reg: the rate register, e.g. AC97_PCM_FRONT_DAC_RATE
2334 * @powerup: non-zero when power up the part
2335 *
2336 * Update the AC97 powerdown register bits of the given part.
2337 */
2338int snd_ac97_update_power(struct snd_ac97 *ac97, int reg, int powerup)
2339{
2340        int i;
2341
2342        if (! ac97)
2343                return 0;
2344
2345        if (reg) {
2346                /* SPDIF requires DAC power, too */
2347                if (reg == AC97_SPDIF)
2348                        reg = AC97_PCM_FRONT_DAC_RATE;
2349                for (i = 0; i < PWIDX_SIZE; i++) {
2350                        if (power_regs[i].reg == reg) {
2351                                if (powerup)
2352                                        ac97->power_up |= (1 << i);
2353                                else
2354                                        ac97->power_up &= ~(1 << i);
2355                                break;
2356                        }
2357                }
2358        }
2359
2360        if (ac97_is_power_save_mode(ac97) && !powerup)
2361                /* adjust power-down bits after two seconds delay
2362                 * (for avoiding loud click noises for many (OSS) apps
2363                 *  that open/close frequently)
2364                 */
2365                schedule_delayed_work(&ac97->power_work,
2366                                      msecs_to_jiffies(2000));
2367        else {
2368                cancel_delayed_work(&ac97->power_work);
2369                update_power_regs(ac97);
2370        }
2371
2372        return 0;
2373}
2374
2375EXPORT_SYMBOL(snd_ac97_update_power);
2376#endif /* CONFIG_SND_AC97_POWER_SAVE */
2377
2378static void update_power_regs(struct snd_ac97 *ac97)
2379{
2380        unsigned int power_up, bits;
2381        int i;
2382
2383        power_up = (1 << PWIDX_FRONT) | (1 << PWIDX_ADC);
2384        power_up |= (1 << PWIDX_MIC);
2385        if (ac97->scaps & AC97_SCAP_SURROUND_DAC)
2386                power_up |= (1 << PWIDX_SURR);
2387        if (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC)
2388                power_up |= (1 << PWIDX_CLFE);
2389#ifdef CONFIG_SND_AC97_POWER_SAVE
2390        if (ac97_is_power_save_mode(ac97))
2391                power_up = ac97->power_up;
2392#endif
2393        if (power_up) {
2394                if (ac97->regs[AC97_POWERDOWN] & AC97_PD_PR2) {
2395                        /* needs power-up analog mix and vref */
2396                        snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2397                                             AC97_PD_PR3, 0);
2398                        msleep(1);
2399                        snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2400                                             AC97_PD_PR2, 0);
2401                }
2402        }
2403        for (i = 0; i < PWIDX_SIZE; i++) {
2404                if (power_up & (1 << i))
2405                        bits = 0;
2406                else
2407                        bits = power_regs[i].mask;
2408                snd_ac97_update_bits(ac97, power_regs[i].power_reg,
2409                                     power_regs[i].mask, bits);
2410        }
2411        if (! power_up) {
2412                if (! (ac97->regs[AC97_POWERDOWN] & AC97_PD_PR2)) {
2413                        /* power down analog mix and vref */
2414                        snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2415                                             AC97_PD_PR2, AC97_PD_PR2);
2416                        snd_ac97_update_bits(ac97, AC97_POWERDOWN,
2417                                             AC97_PD_PR3, AC97_PD_PR3);
2418                }
2419        }
2420}
2421
2422
2423#ifdef CONFIG_PM
2424/**
2425 * snd_ac97_suspend - General suspend function for AC97 codec
2426 * @ac97: the ac97 instance
2427 *
2428 * Suspends the codec, power down the chip.
2429 */
2430void snd_ac97_suspend(struct snd_ac97 *ac97)
2431{
2432        if (! ac97)
2433                return;
2434        if (ac97->build_ops->suspend)
2435                ac97->build_ops->suspend(ac97);
2436#ifdef CONFIG_SND_AC97_POWER_SAVE
2437        cancel_delayed_work(&ac97->power_work);
2438        flush_scheduled_work();
2439#endif
2440        snd_ac97_powerdown(ac97);
2441}
2442
2443EXPORT_SYMBOL(snd_ac97_suspend);
2444
2445/*
2446 * restore ac97 status
2447 */
2448static void snd_ac97_restore_status(struct snd_ac97 *ac97)
2449{
2450        int i;
2451
2452        for (i = 2; i < 0x7c ; i += 2) {
2453                if (i == AC97_POWERDOWN || i == AC97_EXTENDED_ID)
2454                        continue;
2455                /* restore only accessible registers
2456                 * some chip (e.g. nm256) may hang up when unsupported registers
2457                 * are accessed..!
2458                 */
2459                if (test_bit(i, ac97->reg_accessed)) {
2460                        snd_ac97_write(ac97, i, ac97->regs[i]);
2461                        snd_ac97_read(ac97, i);
2462                }
2463        }
2464}
2465
2466/*
2467 * restore IEC958 status
2468 */
2469static void snd_ac97_restore_iec958(struct snd_ac97 *ac97)
2470{
2471        if (ac97->ext_id & AC97_EI_SPDIF) {
2472                if (ac97->regs[AC97_EXTENDED_STATUS] & AC97_EA_SPDIF) {
2473                        /* reset spdif status */
2474                        snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, 0);
2475                        snd_ac97_write(ac97, AC97_EXTENDED_STATUS, ac97->regs[AC97_EXTENDED_STATUS]);
2476                        if (ac97->flags & AC97_CS_SPDIF)
2477                                snd_ac97_write(ac97, AC97_CSR_SPDIF, ac97->regs[AC97_CSR_SPDIF]);
2478                        else
2479                                snd_ac97_write(ac97, AC97_SPDIF, ac97->regs[AC97_SPDIF]);
2480                        snd_ac97_update_bits(ac97, AC97_EXTENDED_STATUS, AC97_EA_SPDIF, AC97_EA_SPDIF); /* turn on again */
2481                }
2482        }
2483}
2484
2485/**
2486 * snd_ac97_resume - General resume function for AC97 codec
2487 * @ac97: the ac97 instance
2488 *
2489 * Do the standard resume procedure, power up and restoring the
2490 * old register values.
2491 */
2492void snd_ac97_resume(struct snd_ac97 *ac97)
2493{
2494        unsigned long end_time;
2495
2496        if (! ac97)
2497                return;
2498
2499        if (ac97->bus->ops->reset) {
2500                ac97->bus->ops->reset(ac97);
2501                goto  __reset_ready;
2502        }
2503
2504        snd_ac97_write(ac97, AC97_POWERDOWN, 0);
2505        if (! (ac97->flags & AC97_DEFAULT_POWER_OFF)) {
2506                if (!(ac97->scaps & AC97_SCAP_SKIP_AUDIO))
2507                        snd_ac97_write(ac97, AC97_RESET, 0);
2508                else if (!(ac97->scaps & AC97_SCAP_SKIP_MODEM))
2509                        snd_ac97_write(ac97, AC97_EXTENDED_MID, 0);
2510                udelay(100);
2511                snd_ac97_write(ac97, AC97_POWERDOWN, 0);
2512        }
2513        snd_ac97_write(ac97, AC97_GENERAL_PURPOSE, 0);
2514
2515        snd_ac97_write(ac97, AC97_POWERDOWN, ac97->regs[AC97_POWERDOWN]);
2516        if (ac97_is_audio(ac97)) {
2517                ac97->bus->ops->write(ac97, AC97_MASTER, 0x8101);
2518                end_time = jiffies + msecs_to_jiffies(100);
2519                do {
2520                        if (snd_ac97_read(ac97, AC97_MASTER) == 0x8101)
2521                                break;
2522                        schedule_timeout_uninterruptible(1);
2523                } while (time_after_eq(end_time, jiffies));
2524                /* FIXME: extra delay */
2525                ac97->bus->ops->write(ac97, AC97_MASTER, 0x8000);
2526                if (snd_ac97_read(ac97, AC97_MASTER) != 0x8000)
2527                        msleep(250);
2528        } else {
2529                end_time = jiffies + msecs_to_jiffies(100);
2530                do {
2531                        unsigned short val = snd_ac97_read(ac97, AC97_EXTENDED_MID);
2532                        if (val != 0xffff && (val & 1) != 0)
2533                                break;
2534                        schedule_timeout_uninterruptible(1);
2535                } while (time_after_eq(end_time, jiffies));
2536        }
2537__reset_ready:
2538
2539        if (ac97->bus->ops->init)
2540                ac97->bus->ops->init(ac97);
2541
2542        if (ac97->build_ops->resume)
2543                ac97->build_ops->resume(ac97);
2544        else {
2545                snd_ac97_restore_status(ac97);
2546                snd_ac97_restore_iec958(ac97);
2547        }
2548}
2549
2550EXPORT_SYMBOL(snd_ac97_resume);
2551#endif
2552
2553
2554/*
2555 * Hardware tuning
2556 */
2557static void set_ctl_name(char *dst, const char *src, const char *suffix)
2558{
2559        if (suffix)
2560                sprintf(dst, "%s %s", src, suffix);
2561        else
2562                strcpy(dst, src);
2563}       
2564
2565/* remove the control with the given name and optional suffix */
2566static int snd_ac97_remove_ctl(struct snd_ac97 *ac97, const char *name,
2567                               const char *suffix)
2568{
2569        struct snd_ctl_elem_id id;
2570        memset(&id, 0, sizeof(id));
2571        set_ctl_name(id.name, name, suffix);
2572        id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2573        return snd_ctl_remove_id(ac97->bus->card, &id);
2574}
2575
2576static struct snd_kcontrol *ctl_find(struct snd_ac97 *ac97, const char *name, const char *suffix)
2577{
2578        struct snd_ctl_elem_id sid;
2579        memset(&sid, 0, sizeof(sid));
2580        set_ctl_name(sid.name, name, suffix);
2581        sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2582        return snd_ctl_find_id(ac97->bus->card, &sid);
2583}
2584
2585/* rename the control with the given name and optional suffix */
2586static int snd_ac97_rename_ctl(struct snd_ac97 *ac97, const char *src,
2587                               const char *dst, const char *suffix)
2588{
2589        struct snd_kcontrol *kctl = ctl_find(ac97, src, suffix);
2590        if (kctl) {
2591                set_ctl_name(kctl->id.name, dst, suffix);
2592                return 0;
2593        }
2594        return -ENOENT;
2595}
2596
2597/* rename both Volume and Switch controls - don't check the return value */
2598static void snd_ac97_rename_vol_ctl(struct snd_ac97 *ac97, const char *src,
2599                                    const char *dst)
2600{
2601        snd_ac97_rename_ctl(ac97, src, dst, "Switch");
2602        snd_ac97_rename_ctl(ac97, src, dst, "Volume");
2603}
2604
2605/* swap controls */
2606static int snd_ac97_swap_ctl(struct snd_ac97 *ac97, const char *s1,
2607                             const char *s2, const char *suffix)
2608{
2609        struct snd_kcontrol *kctl1, *kctl2;
2610        kctl1 = ctl_find(ac97, s1, suffix);
2611        kctl2 = ctl_find(ac97, s2, suffix);
2612        if (kctl1 && kctl2) {
2613                set_ctl_name(kctl1->id.name, s2, suffix);
2614                set_ctl_name(kctl2->id.name, s1, suffix);
2615                return 0;
2616        }
2617        return -ENOENT;
2618}
2619
2620#if 1
2621/* bind hp and master controls instead of using only hp control */
2622static int bind_hp_volsw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2623{
2624        int err = snd_ac97_put_volsw(kcontrol, ucontrol);
2625        if (err > 0) {
2626                unsigned long priv_saved = kcontrol->private_value;
2627                kcontrol->private_value = (kcontrol->private_value & ~0xff) | AC97_HEADPHONE;
2628                snd_ac97_put_volsw(kcontrol, ucontrol);
2629                kcontrol->private_value = priv_saved;
2630        }
2631        return err;
2632}
2633
2634/* ac97 tune: bind Master and Headphone controls */
2635static int tune_hp_only(struct snd_ac97 *ac97)
2636{
2637        struct snd_kcontrol *msw = ctl_find(ac97, "Master Playback Switch", NULL);
2638        struct snd_kcontrol *mvol = ctl_find(ac97, "Master Playback Volume", NULL);
2639        if (! msw || ! mvol)
2640                return -ENOENT;
2641        msw->put = bind_hp_volsw_put;
2642        mvol->put = bind_hp_volsw_put;
2643        snd_ac97_remove_ctl(ac97, "Headphone Playback", "Switch");
2644        snd_ac97_remove_ctl(ac97, "Headphone Playback", "Volume");
2645        return 0;
2646}
2647
2648#else
2649/* ac97 tune: use Headphone control as master */
2650static int tune_hp_only(struct snd_ac97 *ac97)
2651{
2652        if (ctl_find(ac97, "Headphone Playback Switch", NULL) == NULL)
2653                return -ENOENT;
2654        snd_ac97_remove_ctl(ac97, "Master Playback", "Switch");
2655        snd_ac97_remove_ctl(ac97, "Master Playback", "Volume");
2656        snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Master Playback");
2657        return 0;
2658}
2659#endif
2660
2661/* ac97 tune: swap Headphone and Master controls */
2662static int tune_swap_hp(struct snd_ac97 *ac97)
2663{
2664        if (ctl_find(ac97, "Headphone Playback Switch", NULL) == NULL)
2665                return -ENOENT;
2666        snd_ac97_rename_vol_ctl(ac97, "Master Playback", "Line-Out Playback");
2667        snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Master Playback");
2668        return 0;
2669}
2670
2671/* ac97 tune: swap Surround and Master controls */
2672static int tune_swap_surround(struct snd_ac97 *ac97)
2673{
2674        if (snd_ac97_swap_ctl(ac97, "Master Playback", "Surround Playback", "Switch") ||
2675            snd_ac97_swap_ctl(ac97, "Master Playback", "Surround Playback", "Volume"))
2676                return -ENOENT;
2677        return 0;
2678}
2679
2680/* ac97 tune: set up mic sharing for AD codecs */
2681static int tune_ad_sharing(struct snd_ac97 *ac97)
2682{
2683        unsigned short scfg;
2684        if ((ac97->id & 0xffffff00) != 0x41445300) {
2685                snd_printk(KERN_ERR "ac97_quirk AD_SHARING is only for AD codecs\n");
2686                return -EINVAL;
2687        }
2688        /* Turn on OMS bit to route microphone to back panel */
2689        scfg = snd_ac97_read(ac97, AC97_AD_SERIAL_CFG);
2690        snd_ac97_write_cache(ac97, AC97_AD_SERIAL_CFG, scfg | 0x0200);
2691        return 0;
2692}
2693
2694static const struct snd_kcontrol_new snd_ac97_alc_jack_detect = 
2695AC97_SINGLE("Jack Detect", AC97_ALC650_CLOCK, 5, 1, 0);
2696
2697/* ac97 tune: set up ALC jack-select */
2698static int tune_alc_jack(struct snd_ac97 *ac97)
2699{
2700        if ((ac97->id & 0xffffff00) != 0x414c4700) {
2701                snd_printk(KERN_ERR "ac97_quirk ALC_JACK is only for Realtek codecs\n");
2702                return -EINVAL;
2703        }
2704        snd_ac97_update_bits(ac97, 0x7a, 0x20, 0x20); /* select jack detect function */
2705        snd_ac97_update_bits(ac97, 0x7a, 0x01, 0x01); /* Line-out auto mute */
2706        if (ac97->id == AC97_ID_ALC658D)
2707                snd_ac97_update_bits(ac97, 0x74, 0x0800, 0x0800);
2708        return snd_ctl_add(ac97->bus->card, snd_ac97_cnew(&snd_ac97_alc_jack_detect, ac97));
2709}
2710
2711/* ac97 tune: inversed EAPD bit */
2712static int tune_inv_eapd(struct snd_ac97 *ac97)
2713{
2714        struct snd_kcontrol *kctl = ctl_find(ac97, "External Amplifier", NULL);
2715        if (! kctl)
2716                return -ENOENT;
2717        set_inv_eapd(ac97, kctl);
2718        return 0;
2719}
2720
2721static int master_mute_sw_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
2722{
2723        int err = snd_ac97_put_volsw(kcontrol, ucontrol);
2724        if (err > 0) {
2725                struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
2726                int shift = (kcontrol->private_value >> 8) & 0x0f;
2727                int rshift = (kcontrol->private_value >> 12) & 0x0f;
2728                unsigned short mask;
2729                if (shift != rshift)
2730                        mask = 0x8080;
2731                else
2732                        mask = 0x8000;
2733                snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000,
2734                                     (ac97->regs[AC97_MASTER] & mask) == mask ?
2735                                     0x8000 : 0);
2736        }
2737        return err;
2738}
2739
2740/* ac97 tune: EAPD controls mute LED bound with the master mute */
2741static int tune_mute_led(struct snd_ac97 *ac97)
2742{
2743        struct snd_kcontrol *msw = ctl_find(ac97, "Master Playback Switch", NULL);
2744        if (! msw)
2745                return -ENOENT;
2746        msw->put = master_mute_sw_put;
2747        snd_ac97_remove_ctl(ac97, "External Amplifier", NULL);
2748        snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000, 0x8000); /* mute LED on */
2749        ac97->scaps |= AC97_SCAP_EAPD_LED;
2750        return 0;
2751}
2752
2753static int hp_master_mute_sw_put(struct snd_kcontrol *kcontrol,
2754                                 struct snd_ctl_elem_value *ucontrol)
2755{
2756        int err = bind_hp_volsw_put(kcontrol, ucontrol);
2757        if (err > 0) {
2758                struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
2759                int shift = (kcontrol->private_value >> 8) & 0x0f;
2760                int rshift = (kcontrol->private_value >> 12) & 0x0f;
2761                unsigned short mask;
2762                if (shift != rshift)
2763                        mask = 0x8080;
2764                else
2765                        mask = 0x8000;
2766                snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000,
2767                                     (ac97->regs[AC97_MASTER] & mask) == mask ?
2768                                     0x8000 : 0);
2769        }
2770        return err;
2771}
2772
2773static int tune_hp_mute_led(struct snd_ac97 *ac97)
2774{
2775        struct snd_kcontrol *msw = ctl_find(ac97, "Master Playback Switch", NULL);
2776        struct snd_kcontrol *mvol = ctl_find(ac97, "Master Playback Volume", NULL);
2777        if (! msw || ! mvol)
2778                return -ENOENT;
2779        msw->put = hp_master_mute_sw_put;
2780        mvol->put = bind_hp_volsw_put;
2781        snd_ac97_remove_ctl(ac97, "External Amplifier", NULL);
2782        snd_ac97_remove_ctl(ac97, "Headphone Playback", "Switch");
2783        snd_ac97_remove_ctl(ac97, "Headphone Playback", "Volume");
2784        snd_ac97_update_bits(ac97, AC97_POWERDOWN, 0x8000, 0x8000); /* mute LED on */
2785        return 0;
2786}
2787
2788struct quirk_table {
2789        const char *name;
2790        int (*func)(struct snd_ac97 *);
2791};
2792
2793static struct quirk_table applicable_quirks[] = {
2794        { "none", NULL },
2795        { "hp_only", tune_hp_only },
2796        { "swap_hp", tune_swap_hp },
2797        { "swap_surround", tune_swap_surround },
2798        { "ad_sharing", tune_ad_sharing },
2799        { "alc_jack", tune_alc_jack },
2800        { "inv_eapd", tune_inv_eapd },
2801        { "mute_led", tune_mute_led },
2802        { "hp_mute_led", tune_hp_mute_led },
2803};
2804
2805/* apply the quirk with the given type */
2806static int apply_quirk(struct snd_ac97 *ac97, int type)
2807{
2808        if (type <= 0)
2809                return 0;
2810        else if (type >= ARRAY_SIZE(applicable_quirks))
2811                return -EINVAL;
2812        if (applicable_quirks[type].func)
2813                return applicable_quirks[type].func(ac97);
2814        return 0;
2815}
2816
2817/* apply the quirk with the given name */
2818static int apply_quirk_str(struct snd_ac97 *ac97, const char *typestr)
2819{
2820        int i;
2821        struct quirk_table *q;
2822
2823        for (i = 0; i < ARRAY_SIZE(applicable_quirks); i++) {
2824                q = &applicable_quirks[i];
2825                if (q->name && ! strcmp(typestr, q->name))
2826                        return apply_quirk(ac97, i);
2827        }
2828        /* for compatibility, accept the numbers, too */
2829        if (*typestr >= '0' && *typestr <= '9')
2830                return apply_quirk(ac97, (int)simple_strtoul(typestr, NULL, 10));
2831        return -EINVAL;
2832}
2833
2834/**
2835 * snd_ac97_tune_hardware - tune up the hardware
2836 * @ac97: the ac97 instance
2837 * @quirk: quirk list
2838 * @override: explicit quirk value (overrides the list if non-NULL)
2839 *
2840 * Do some workaround for each pci device, such as renaming of the
2841 * headphone (true line-out) control as "Master".
2842 * The quirk-list must be terminated with a zero-filled entry.
2843 *
2844 * Returns zero if successful, or a negative error code on failure.
2845 */
2846
2847int snd_ac97_tune_hardware(struct snd_ac97 *ac97, struct ac97_quirk *quirk, const char *override)
2848{
2849        int result;
2850
2851        /* quirk overriden? */
2852        if (override && strcmp(override, "-1") && strcmp(override, "default")) {
2853                result = apply_quirk_str(ac97, override);
2854                if (result < 0)
2855                        snd_printk(KERN_ERR "applying quirk type %s failed (%d)\n", override, result);
2856                return result;
2857        }
2858
2859        if (! quirk)
2860                return -EINVAL;
2861
2862        for (; quirk->subvendor; quirk++) {
2863                if (quirk->subvendor != ac97->subsystem_vendor)
2864                        continue;
2865                if ((! quirk->mask && quirk->subdevice == ac97->subsystem_device) ||
2866                    quirk->subdevice == (quirk->mask & ac97->subsystem_device)) {
2867                        if (quirk->codec_id && quirk->codec_id != ac97->id)
2868                                continue;
2869                        snd_printdd("ac97 quirk for %s (%04x:%04x)\n", quirk->name, ac97->subsystem_vendor, ac97->subsystem_device);
2870                        result = apply_quirk(ac97, quirk->type);
2871                        if (result < 0)
2872                                snd_printk(KERN_ERR "applying quirk type %d for %s failed (%d)\n", quirk->type, quirk->name, result);
2873                        return result;
2874                }
2875        }
2876        return 0;
2877}
2878
2879EXPORT_SYMBOL(snd_ac97_tune_hardware);
2880
2881/*
2882 *  INIT part
2883 */
2884
2885static int __init alsa_ac97_init(void)
2886{
2887        return 0;
2888}
2889
2890static void __exit alsa_ac97_exit(void)
2891{
2892}
2893
2894module_init(alsa_ac97_init)
2895module_exit(alsa_ac97_exit)
2896