linux/sound/i2c/other/ak4xxx-adda.c
<<
>>
Prefs
   1/*
   2 *   ALSA driver for AK4524 / AK4528 / AK4529 / AK4355 / AK4358 / AK4381
   3 *   AD and DA converters
   4 *
   5 *      Copyright (c) 2000-2004 Jaroslav Kysela <perex@perex.cz>,
   6 *                              Takashi Iwai <tiwai@suse.de>
   7 *
   8 *   This program is free software; you can redistribute it and/or modify
   9 *   it under the terms of the GNU General Public License as published by
  10 *   the Free Software Foundation; either version 2 of the License, or
  11 *   (at your option) any later version.
  12 *
  13 *   This program is distributed in the hope that it will be useful,
  14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 *   GNU General Public License for more details.
  17 *
  18 *   You should have received a copy of the GNU General Public License
  19 *   along with this program; if not, write to the Free Software
  20 *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21 *
  22 */
  23
  24#include <asm/io.h>
  25#include <linux/delay.h>
  26#include <linux/interrupt.h>
  27#include <linux/init.h>
  28#include <linux/module.h>
  29#include <sound/core.h>
  30#include <sound/control.h>
  31#include <sound/tlv.h>
  32#include <sound/ak4xxx-adda.h>
  33#include <sound/info.h>
  34
  35MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.de>");
  36MODULE_DESCRIPTION("Routines for control of AK452x / AK43xx  AD/DA converters");
  37MODULE_LICENSE("GPL");
  38
  39/* write the given register and save the data to the cache */
  40void snd_akm4xxx_write(struct snd_akm4xxx *ak, int chip, unsigned char reg,
  41                       unsigned char val)
  42{
  43        ak->ops.lock(ak, chip);
  44        ak->ops.write(ak, chip, reg, val);
  45
  46        /* save the data */
  47        snd_akm4xxx_set(ak, chip, reg, val);
  48        ak->ops.unlock(ak, chip);
  49}
  50
  51EXPORT_SYMBOL(snd_akm4xxx_write);
  52
  53/* reset procedure for AK4524 and AK4528 */
  54static void ak4524_reset(struct snd_akm4xxx *ak, int state)
  55{
  56        unsigned int chip;
  57        unsigned char reg;
  58
  59        for (chip = 0; chip < ak->num_dacs/2; chip++) {
  60                snd_akm4xxx_write(ak, chip, 0x01, state ? 0x00 : 0x03);
  61                if (state)
  62                        continue;
  63                /* DAC volumes */
  64                for (reg = 0x04; reg < ak->total_regs; reg++)
  65                        snd_akm4xxx_write(ak, chip, reg,
  66                                          snd_akm4xxx_get(ak, chip, reg));
  67        }
  68}
  69
  70/* reset procedure for AK4355 and AK4358 */
  71static void ak435X_reset(struct snd_akm4xxx *ak, int state)
  72{
  73        unsigned char reg;
  74
  75        if (state) {
  76                snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
  77                return;
  78        }
  79        for (reg = 0x00; reg < ak->total_regs; reg++)
  80                if (reg != 0x01)
  81                        snd_akm4xxx_write(ak, 0, reg,
  82                                          snd_akm4xxx_get(ak, 0, reg));
  83        snd_akm4xxx_write(ak, 0, 0x01, 0x01); /* un-reset, unmute */
  84}
  85
  86/* reset procedure for AK4381 */
  87static void ak4381_reset(struct snd_akm4xxx *ak, int state)
  88{
  89        unsigned int chip;
  90        unsigned char reg;
  91        for (chip = 0; chip < ak->num_dacs/2; chip++) {
  92                snd_akm4xxx_write(ak, chip, 0x00, state ? 0x0c : 0x0f);
  93                if (state)
  94                        continue;
  95                for (reg = 0x01; reg < ak->total_regs; reg++)
  96                        snd_akm4xxx_write(ak, chip, reg,
  97                                          snd_akm4xxx_get(ak, chip, reg));
  98        }
  99}
 100
 101/*
 102 * reset the AKM codecs
 103 * @state: 1 = reset codec, 0 = restore the registers
 104 *
 105 * assert the reset operation and restores the register values to the chips.
 106 */
 107void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
 108{
 109        switch (ak->type) {
 110        case SND_AK4524:
 111        case SND_AK4528:
 112        case SND_AK4620:
 113                ak4524_reset(ak, state);
 114                break;
 115        case SND_AK4529:
 116                /* FIXME: needed for ak4529? */
 117                break;
 118        case SND_AK4355:
 119                ak435X_reset(ak, state);
 120                break;
 121        case SND_AK4358:
 122                ak435X_reset(ak, state);
 123                break;
 124        case SND_AK4381:
 125                ak4381_reset(ak, state);
 126                break;
 127        default:
 128                break;
 129        }
 130}
 131
 132EXPORT_SYMBOL(snd_akm4xxx_reset);
 133
 134
 135/*
 136 * Volume conversion table for non-linear volumes
 137 * from -63.5dB (mute) to 0dB step 0.5dB
 138 *
 139 * Used for AK4524/AK4620 input/ouput attenuation, AK4528, and
 140 * AK5365 input attenuation
 141 */
 142static const unsigned char vol_cvt_datt[128] = {
 143        0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04,
 144        0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06,
 145        0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x0a,
 146        0x0a, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f,
 147        0x10, 0x10, 0x11, 0x12, 0x12, 0x13, 0x13, 0x14,
 148        0x15, 0x16, 0x17, 0x17, 0x18, 0x19, 0x1a, 0x1c,
 149        0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x23,
 150        0x24, 0x25, 0x26, 0x28, 0x29, 0x2a, 0x2b, 0x2d,
 151        0x2e, 0x30, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
 152        0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3e, 0x3f, 0x40,
 153        0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x48, 0x4a,
 154        0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54,
 155        0x55, 0x56, 0x58, 0x59, 0x5b, 0x5c, 0x5e, 0x5f,
 156        0x60, 0x61, 0x62, 0x64, 0x65, 0x66, 0x67, 0x69,
 157        0x6a, 0x6c, 0x6d, 0x6f, 0x70, 0x71, 0x72, 0x73,
 158        0x75, 0x76, 0x77, 0x79, 0x7a, 0x7c, 0x7d, 0x7f,
 159};
 160
 161/*
 162 * dB tables
 163 */
 164static const DECLARE_TLV_DB_SCALE(db_scale_vol_datt, -6350, 50, 1);
 165static const DECLARE_TLV_DB_SCALE(db_scale_8bit, -12750, 50, 1);
 166static const DECLARE_TLV_DB_SCALE(db_scale_7bit, -6350, 50, 1);
 167static const DECLARE_TLV_DB_LINEAR(db_scale_linear, TLV_DB_GAIN_MUTE, 0);
 168
 169/*
 170 * initialize all the ak4xxx chips
 171 */
 172void snd_akm4xxx_init(struct snd_akm4xxx *ak)
 173{
 174        static const unsigned char inits_ak4524[] = {
 175                0x00, 0x07, /* 0: all power up */
 176                0x01, 0x00, /* 1: ADC/DAC reset */
 177                0x02, 0x60, /* 2: 24bit I2S */
 178                0x03, 0x19, /* 3: deemphasis off */
 179                0x01, 0x03, /* 1: ADC/DAC enable */
 180                0x04, 0x00, /* 4: ADC left muted */
 181                0x05, 0x00, /* 5: ADC right muted */
 182                0x06, 0x00, /* 6: DAC left muted */
 183                0x07, 0x00, /* 7: DAC right muted */
 184                0xff, 0xff
 185        };
 186        static const unsigned char inits_ak4528[] = {
 187                0x00, 0x07, /* 0: all power up */
 188                0x01, 0x00, /* 1: ADC/DAC reset */
 189                0x02, 0x60, /* 2: 24bit I2S */
 190                0x03, 0x0d, /* 3: deemphasis off, turn LR highpass filters on */
 191                0x01, 0x03, /* 1: ADC/DAC enable */
 192                0x04, 0x00, /* 4: ADC left muted */
 193                0x05, 0x00, /* 5: ADC right muted */
 194                0xff, 0xff
 195        };
 196        static const unsigned char inits_ak4529[] = {
 197                0x09, 0x01, /* 9: ATS=0, RSTN=1 */
 198                0x0a, 0x3f, /* A: all power up, no zero/overflow detection */
 199                0x00, 0x0c, /* 0: TDM=0, 24bit I2S, SMUTE=0 */
 200                0x01, 0x00, /* 1: ACKS=0, ADC, loop off */
 201                0x02, 0xff, /* 2: LOUT1 muted */
 202                0x03, 0xff, /* 3: ROUT1 muted */
 203                0x04, 0xff, /* 4: LOUT2 muted */
 204                0x05, 0xff, /* 5: ROUT2 muted */
 205                0x06, 0xff, /* 6: LOUT3 muted */
 206                0x07, 0xff, /* 7: ROUT3 muted */
 207                0x0b, 0xff, /* B: LOUT4 muted */
 208                0x0c, 0xff, /* C: ROUT4 muted */
 209                0x08, 0x55, /* 8: deemphasis all off */
 210                0xff, 0xff
 211        };
 212        static const unsigned char inits_ak4355[] = {
 213                0x01, 0x02, /* 1: reset and soft-mute */
 214                0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
 215                             * disable DZF, sharp roll-off, RSTN#=0 */
 216                0x02, 0x0e, /* 2: DA's power up, normal speed, RSTN#=0 */
 217                // 0x02, 0x2e, /* quad speed */
 218                0x03, 0x01, /* 3: de-emphasis off */
 219                0x04, 0x00, /* 4: LOUT1 volume muted */
 220                0x05, 0x00, /* 5: ROUT1 volume muted */
 221                0x06, 0x00, /* 6: LOUT2 volume muted */
 222                0x07, 0x00, /* 7: ROUT2 volume muted */
 223                0x08, 0x00, /* 8: LOUT3 volume muted */
 224                0x09, 0x00, /* 9: ROUT3 volume muted */
 225                0x0a, 0x00, /* a: DATT speed=0, ignore DZF */
 226                0x01, 0x01, /* 1: un-reset, unmute */
 227                0xff, 0xff
 228        };
 229        static const unsigned char inits_ak4358[] = {
 230                0x01, 0x02, /* 1: reset and soft-mute */
 231                0x00, 0x06, /* 0: mode3(i2s), disable auto-clock detect,
 232                             * disable DZF, sharp roll-off, RSTN#=0 */
 233                0x02, 0x4e, /* 2: DA's power up, normal speed, RSTN#=0 */
 234                /* 0x02, 0x6e,*/ /* quad speed */
 235                0x03, 0x01, /* 3: de-emphasis off */
 236                0x04, 0x00, /* 4: LOUT1 volume muted */
 237                0x05, 0x00, /* 5: ROUT1 volume muted */
 238                0x06, 0x00, /* 6: LOUT2 volume muted */
 239                0x07, 0x00, /* 7: ROUT2 volume muted */
 240                0x08, 0x00, /* 8: LOUT3 volume muted */
 241                0x09, 0x00, /* 9: ROUT3 volume muted */
 242                0x0b, 0x00, /* b: LOUT4 volume muted */
 243                0x0c, 0x00, /* c: ROUT4 volume muted */
 244                0x0a, 0x00, /* a: DATT speed=0, ignore DZF */
 245                0x01, 0x01, /* 1: un-reset, unmute */
 246                0xff, 0xff
 247        };
 248        static const unsigned char inits_ak4381[] = {
 249                0x00, 0x0c, /* 0: mode3(i2s), disable auto-clock detect */
 250                0x01, 0x02, /* 1: de-emphasis off, normal speed,
 251                             * sharp roll-off, DZF off */
 252                // 0x01, 0x12, /* quad speed */
 253                0x02, 0x00, /* 2: DZF disabled */
 254                0x03, 0x00, /* 3: LATT 0 */
 255                0x04, 0x00, /* 4: RATT 0 */
 256                0x00, 0x0f, /* 0: power-up, un-reset */
 257                0xff, 0xff
 258        };
 259        static const unsigned char inits_ak4620[] = {
 260                0x00, 0x07, /* 0: normal */
 261                0x01, 0x00, /* 0: reset */
 262                0x01, 0x02, /* 1: RSTAD */
 263                0x01, 0x03, /* 1: RSTDA */
 264                0x01, 0x0f, /* 1: normal */
 265                0x02, 0x60, /* 2: 24bit I2S */
 266                0x03, 0x01, /* 3: deemphasis off */
 267                0x04, 0x00, /* 4: LIN muted */
 268                0x05, 0x00, /* 5: RIN muted */
 269                0x06, 0x00, /* 6: LOUT muted */
 270                0x07, 0x00, /* 7: ROUT muted */
 271                0xff, 0xff
 272        };
 273
 274        int chip;
 275        const unsigned char *ptr, *inits;
 276        unsigned char reg, data;
 277
 278        memset(ak->images, 0, sizeof(ak->images));
 279        memset(ak->volumes, 0, sizeof(ak->volumes));
 280
 281        switch (ak->type) {
 282        case SND_AK4524:
 283                inits = inits_ak4524;
 284                ak->num_chips = ak->num_dacs / 2;
 285                ak->name = "ak4524";
 286                ak->total_regs = 0x08;
 287                break;
 288        case SND_AK4528:
 289                inits = inits_ak4528;
 290                ak->num_chips = ak->num_dacs / 2;
 291                ak->name = "ak4528";
 292                ak->total_regs = 0x06;
 293                break;
 294        case SND_AK4529:
 295                inits = inits_ak4529;
 296                ak->num_chips = 1;
 297                ak->name = "ak4529";
 298                ak->total_regs = 0x0d;
 299                break;
 300        case SND_AK4355:
 301                inits = inits_ak4355;
 302                ak->num_chips = 1;
 303                ak->name = "ak4355";
 304                ak->total_regs = 0x0b;
 305                break;
 306        case SND_AK4358:
 307                inits = inits_ak4358;
 308                ak->num_chips = 1;
 309                ak->name = "ak4358";
 310                ak->total_regs = 0x10;
 311                break;
 312        case SND_AK4381:
 313                inits = inits_ak4381;
 314                ak->num_chips = ak->num_dacs / 2;
 315                ak->name = "ak4381";
 316                ak->total_regs = 0x05;
 317                break;
 318        case SND_AK5365:
 319                /* FIXME: any init sequence? */
 320                ak->num_chips = 1;
 321                ak->name = "ak5365";
 322                ak->total_regs = 0x08;
 323                return;
 324        case SND_AK4620:
 325                inits = inits_ak4620;
 326                ak->num_chips = ak->num_dacs / 2;
 327                ak->name = "ak4620";
 328                ak->total_regs = 0x08;
 329                break;
 330        default:
 331                snd_BUG();
 332                return;
 333        }
 334
 335        for (chip = 0; chip < ak->num_chips; chip++) {
 336                ptr = inits;
 337                while (*ptr != 0xff) {
 338                        reg = *ptr++;
 339                        data = *ptr++;
 340                        snd_akm4xxx_write(ak, chip, reg, data);
 341                        udelay(10);
 342                }
 343        }
 344}
 345
 346EXPORT_SYMBOL(snd_akm4xxx_init);
 347
 348/*
 349 * Mixer callbacks
 350 */
 351#define AK_IPGA                         (1<<20) /* including IPGA */
 352#define AK_VOL_CVT                      (1<<21) /* need dB conversion */
 353#define AK_NEEDSMSB                     (1<<22) /* need MSB update bit */
 354#define AK_INVERT                       (1<<23) /* data is inverted */
 355#define AK_GET_CHIP(val)                (((val) >> 8) & 0xff)
 356#define AK_GET_ADDR(val)                ((val) & 0xff)
 357#define AK_GET_SHIFT(val)               (((val) >> 16) & 0x0f)
 358#define AK_GET_VOL_CVT(val)             (((val) >> 21) & 1)
 359#define AK_GET_IPGA(val)                (((val) >> 20) & 1)
 360#define AK_GET_NEEDSMSB(val)            (((val) >> 22) & 1)
 361#define AK_GET_INVERT(val)              (((val) >> 23) & 1)
 362#define AK_GET_MASK(val)                (((val) >> 24) & 0xff)
 363#define AK_COMPOSE(chip,addr,shift,mask) \
 364        (((chip) << 8) | (addr) | ((shift) << 16) | ((mask) << 24))
 365
 366static int snd_akm4xxx_volume_info(struct snd_kcontrol *kcontrol,
 367                                   struct snd_ctl_elem_info *uinfo)
 368{
 369        unsigned int mask = AK_GET_MASK(kcontrol->private_value);
 370
 371        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 372        uinfo->count = 1;
 373        uinfo->value.integer.min = 0;
 374        uinfo->value.integer.max = mask;
 375        return 0;
 376}
 377
 378static int snd_akm4xxx_volume_get(struct snd_kcontrol *kcontrol,
 379                                  struct snd_ctl_elem_value *ucontrol)
 380{
 381        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 382        int chip = AK_GET_CHIP(kcontrol->private_value);
 383        int addr = AK_GET_ADDR(kcontrol->private_value);
 384
 385        ucontrol->value.integer.value[0] = snd_akm4xxx_get_vol(ak, chip, addr);
 386        return 0;
 387}
 388
 389static int put_ak_reg(struct snd_kcontrol *kcontrol, int addr,
 390                      unsigned char nval)
 391{
 392        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 393        unsigned int mask = AK_GET_MASK(kcontrol->private_value);
 394        int chip = AK_GET_CHIP(kcontrol->private_value);
 395
 396        if (snd_akm4xxx_get_vol(ak, chip, addr) == nval)
 397                return 0;
 398
 399        snd_akm4xxx_set_vol(ak, chip, addr, nval);
 400        if (AK_GET_VOL_CVT(kcontrol->private_value) && nval < 128)
 401                nval = vol_cvt_datt[nval];
 402        if (AK_GET_IPGA(kcontrol->private_value) && nval >= 128)
 403                nval++; /* need to correct + 1 since both 127 and 128 are 0dB */
 404        if (AK_GET_INVERT(kcontrol->private_value))
 405                nval = mask - nval;
 406        if (AK_GET_NEEDSMSB(kcontrol->private_value))
 407                nval |= 0x80;
 408        /* printk(KERN_DEBUG "DEBUG - AK writing reg: chip %x addr %x,
 409           nval %x\n", chip, addr, nval); */
 410        snd_akm4xxx_write(ak, chip, addr, nval);
 411        return 1;
 412}
 413
 414static int snd_akm4xxx_volume_put(struct snd_kcontrol *kcontrol,
 415                                  struct snd_ctl_elem_value *ucontrol)
 416{
 417        unsigned int mask = AK_GET_MASK(kcontrol->private_value);
 418        unsigned int val = ucontrol->value.integer.value[0];
 419        if (val > mask)
 420                return -EINVAL;
 421        return put_ak_reg(kcontrol, AK_GET_ADDR(kcontrol->private_value), val);
 422}
 423
 424static int snd_akm4xxx_stereo_volume_info(struct snd_kcontrol *kcontrol,
 425                                          struct snd_ctl_elem_info *uinfo)
 426{
 427        unsigned int mask = AK_GET_MASK(kcontrol->private_value);
 428
 429        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 430        uinfo->count = 2;
 431        uinfo->value.integer.min = 0;
 432        uinfo->value.integer.max = mask;
 433        return 0;
 434}
 435
 436static int snd_akm4xxx_stereo_volume_get(struct snd_kcontrol *kcontrol,
 437                                         struct snd_ctl_elem_value *ucontrol)
 438{
 439        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 440        int chip = AK_GET_CHIP(kcontrol->private_value);
 441        int addr = AK_GET_ADDR(kcontrol->private_value);
 442
 443        ucontrol->value.integer.value[0] = snd_akm4xxx_get_vol(ak, chip, addr);
 444        ucontrol->value.integer.value[1] = snd_akm4xxx_get_vol(ak, chip, addr+1);
 445        return 0;
 446}
 447
 448static int snd_akm4xxx_stereo_volume_put(struct snd_kcontrol *kcontrol,
 449                                         struct snd_ctl_elem_value *ucontrol)
 450{
 451        int addr = AK_GET_ADDR(kcontrol->private_value);
 452        unsigned int mask = AK_GET_MASK(kcontrol->private_value);
 453        unsigned int val[2];
 454        int change;
 455
 456        val[0] = ucontrol->value.integer.value[0];
 457        val[1] = ucontrol->value.integer.value[1];
 458        if (val[0] > mask || val[1] > mask)
 459                return -EINVAL;
 460        change = put_ak_reg(kcontrol, addr, val[0]);
 461        change |= put_ak_reg(kcontrol, addr + 1, val[1]);
 462        return change;
 463}
 464
 465static int snd_akm4xxx_deemphasis_info(struct snd_kcontrol *kcontrol,
 466                                       struct snd_ctl_elem_info *uinfo)
 467{
 468        static const char * const texts[4] = {
 469                "44.1kHz", "Off", "48kHz", "32kHz",
 470        };
 471        return snd_ctl_enum_info(uinfo, 1, 4, texts);
 472}
 473
 474static int snd_akm4xxx_deemphasis_get(struct snd_kcontrol *kcontrol,
 475                                      struct snd_ctl_elem_value *ucontrol)
 476{
 477        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 478        int chip = AK_GET_CHIP(kcontrol->private_value);
 479        int addr = AK_GET_ADDR(kcontrol->private_value);
 480        int shift = AK_GET_SHIFT(kcontrol->private_value);
 481        ucontrol->value.enumerated.item[0] =
 482                (snd_akm4xxx_get(ak, chip, addr) >> shift) & 3;
 483        return 0;
 484}
 485
 486static int snd_akm4xxx_deemphasis_put(struct snd_kcontrol *kcontrol,
 487                                      struct snd_ctl_elem_value *ucontrol)
 488{
 489        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 490        int chip = AK_GET_CHIP(kcontrol->private_value);
 491        int addr = AK_GET_ADDR(kcontrol->private_value);
 492        int shift = AK_GET_SHIFT(kcontrol->private_value);
 493        unsigned char nval = ucontrol->value.enumerated.item[0] & 3;
 494        int change;
 495        
 496        nval = (nval << shift) |
 497                (snd_akm4xxx_get(ak, chip, addr) & ~(3 << shift));
 498        change = snd_akm4xxx_get(ak, chip, addr) != nval;
 499        if (change)
 500                snd_akm4xxx_write(ak, chip, addr, nval);
 501        return change;
 502}
 503
 504#define ak4xxx_switch_info      snd_ctl_boolean_mono_info
 505
 506static int ak4xxx_switch_get(struct snd_kcontrol *kcontrol,
 507                             struct snd_ctl_elem_value *ucontrol)
 508{
 509        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 510        int chip = AK_GET_CHIP(kcontrol->private_value);
 511        int addr = AK_GET_ADDR(kcontrol->private_value);
 512        int shift = AK_GET_SHIFT(kcontrol->private_value);
 513        int invert = AK_GET_INVERT(kcontrol->private_value);
 514        /* we observe the (1<<shift) bit only */
 515        unsigned char val = snd_akm4xxx_get(ak, chip, addr) & (1<<shift);
 516        if (invert)
 517                val = ! val;
 518        ucontrol->value.integer.value[0] = (val & (1<<shift)) != 0;
 519        return 0;
 520}
 521
 522static int ak4xxx_switch_put(struct snd_kcontrol *kcontrol,
 523                             struct snd_ctl_elem_value *ucontrol)
 524{
 525        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 526        int chip = AK_GET_CHIP(kcontrol->private_value);
 527        int addr = AK_GET_ADDR(kcontrol->private_value);
 528        int shift = AK_GET_SHIFT(kcontrol->private_value);
 529        int invert = AK_GET_INVERT(kcontrol->private_value);
 530        long flag = ucontrol->value.integer.value[0];
 531        unsigned char val, oval;
 532        int change;
 533
 534        if (invert)
 535                flag = ! flag;
 536        oval = snd_akm4xxx_get(ak, chip, addr);
 537        if (flag)
 538                val = oval | (1<<shift);
 539        else
 540                val = oval & ~(1<<shift);
 541        change = (oval != val);
 542        if (change)
 543                snd_akm4xxx_write(ak, chip, addr, val);
 544        return change;
 545}
 546
 547#define AK5365_NUM_INPUTS 5
 548
 549static int ak4xxx_capture_num_inputs(struct snd_akm4xxx *ak, int mixer_ch)
 550{
 551        int num_names;
 552        const char **input_names;
 553
 554        input_names = ak->adc_info[mixer_ch].input_names;
 555        num_names = 0;
 556        while (num_names < AK5365_NUM_INPUTS && input_names[num_names])
 557                ++num_names;
 558        return num_names;
 559}
 560
 561static int ak4xxx_capture_source_info(struct snd_kcontrol *kcontrol,
 562                                      struct snd_ctl_elem_info *uinfo)
 563{
 564        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 565        int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
 566        unsigned int num_names;
 567
 568        num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
 569        if (!num_names)
 570                return -EINVAL;
 571        return snd_ctl_enum_info(uinfo, 1, num_names,
 572                                 ak->adc_info[mixer_ch].input_names);
 573}
 574
 575static int ak4xxx_capture_source_get(struct snd_kcontrol *kcontrol,
 576                                     struct snd_ctl_elem_value *ucontrol)
 577{
 578        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 579        int chip = AK_GET_CHIP(kcontrol->private_value);
 580        int addr = AK_GET_ADDR(kcontrol->private_value);
 581        int mask = AK_GET_MASK(kcontrol->private_value);
 582        unsigned char val;
 583
 584        val = snd_akm4xxx_get(ak, chip, addr) & mask;
 585        ucontrol->value.enumerated.item[0] = val;
 586        return 0;
 587}
 588
 589static int ak4xxx_capture_source_put(struct snd_kcontrol *kcontrol,
 590                                     struct snd_ctl_elem_value *ucontrol)
 591{
 592        struct snd_akm4xxx *ak = snd_kcontrol_chip(kcontrol);
 593        int mixer_ch = AK_GET_SHIFT(kcontrol->private_value);
 594        int chip = AK_GET_CHIP(kcontrol->private_value);
 595        int addr = AK_GET_ADDR(kcontrol->private_value);
 596        int mask = AK_GET_MASK(kcontrol->private_value);
 597        unsigned char oval, val;
 598        int num_names = ak4xxx_capture_num_inputs(ak, mixer_ch);
 599
 600        if (ucontrol->value.enumerated.item[0] >= num_names)
 601                return -EINVAL;
 602
 603        oval = snd_akm4xxx_get(ak, chip, addr);
 604        val = oval & ~mask;
 605        val |= ucontrol->value.enumerated.item[0] & mask;
 606        if (val != oval) {
 607                snd_akm4xxx_write(ak, chip, addr, val);
 608                return 1;
 609        }
 610        return 0;
 611}
 612
 613/*
 614 * build AK4xxx controls
 615 */
 616
 617static int build_dac_controls(struct snd_akm4xxx *ak)
 618{
 619        int idx, err, mixer_ch, num_stereo;
 620        struct snd_kcontrol_new knew;
 621
 622        mixer_ch = 0;
 623        for (idx = 0; idx < ak->num_dacs; ) {
 624                /* mute control for Revolution 7.1 - AK4381 */
 625                if (ak->type == SND_AK4381 
 626                                &&  ak->dac_info[mixer_ch].switch_name) {
 627                        memset(&knew, 0, sizeof(knew));
 628                        knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
 629                        knew.count = 1;
 630                        knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE;
 631                        knew.name = ak->dac_info[mixer_ch].switch_name;
 632                        knew.info = ak4xxx_switch_info;
 633                        knew.get = ak4xxx_switch_get;
 634                        knew.put = ak4xxx_switch_put;
 635                        knew.access = 0;
 636                        /* register 1, bit 0 (SMUTE): 0 = normal operation,
 637                           1 = mute */
 638                        knew.private_value =
 639                                AK_COMPOSE(idx/2, 1, 0, 0) | AK_INVERT;
 640                        err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
 641                        if (err < 0)
 642                                return err;
 643                }
 644                memset(&knew, 0, sizeof(knew));
 645                if (! ak->dac_info || ! ak->dac_info[mixer_ch].name) {
 646                        knew.name = "DAC Volume";
 647                        knew.index = mixer_ch + ak->idx_offset * 2;
 648                        num_stereo = 1;
 649                } else {
 650                        knew.name = ak->dac_info[mixer_ch].name;
 651                        num_stereo = ak->dac_info[mixer_ch].num_channels;
 652                }
 653                knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
 654                knew.count = 1;
 655                knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
 656                        SNDRV_CTL_ELEM_ACCESS_TLV_READ;
 657                if (num_stereo == 2) {
 658                        knew.info = snd_akm4xxx_stereo_volume_info;
 659                        knew.get = snd_akm4xxx_stereo_volume_get;
 660                        knew.put = snd_akm4xxx_stereo_volume_put;
 661                } else {
 662                        knew.info = snd_akm4xxx_volume_info;
 663                        knew.get = snd_akm4xxx_volume_get;
 664                        knew.put = snd_akm4xxx_volume_put;
 665                }
 666                switch (ak->type) {
 667                case SND_AK4524:
 668                        /* register 6 & 7 */
 669                        knew.private_value =
 670                                AK_COMPOSE(idx/2, (idx%2) + 6, 0, 127) |
 671                                AK_VOL_CVT;
 672                        knew.tlv.p = db_scale_vol_datt;
 673                        break;
 674                case SND_AK4528:
 675                        /* register 4 & 5 */
 676                        knew.private_value =
 677                                AK_COMPOSE(idx/2, (idx%2) + 4, 0, 127) |
 678                                AK_VOL_CVT;
 679                        knew.tlv.p = db_scale_vol_datt;
 680                        break;
 681                case SND_AK4529: {
 682                        /* registers 2-7 and b,c */
 683                        int val = idx < 6 ? idx + 2 : (idx - 6) + 0xb;
 684                        knew.private_value =
 685                                AK_COMPOSE(0, val, 0, 255) | AK_INVERT;
 686                        knew.tlv.p = db_scale_8bit;
 687                        break;
 688                }
 689                case SND_AK4355:
 690                        /* register 4-9, chip #0 only */
 691                        knew.private_value = AK_COMPOSE(0, idx + 4, 0, 255);
 692                        knew.tlv.p = db_scale_8bit;
 693                        break;
 694                case SND_AK4358: {
 695                        /* register 4-9 and 11-12, chip #0 only */
 696                        int  addr = idx < 6 ? idx + 4 : idx + 5;
 697                        knew.private_value =
 698                                AK_COMPOSE(0, addr, 0, 127) | AK_NEEDSMSB;
 699                        knew.tlv.p = db_scale_7bit;
 700                        break;
 701                }
 702                case SND_AK4381:
 703                        /* register 3 & 4 */
 704                        knew.private_value =
 705                                AK_COMPOSE(idx/2, (idx%2) + 3, 0, 255);
 706                        knew.tlv.p = db_scale_linear;
 707                        break;
 708                case SND_AK4620:
 709                        /* register 6 & 7 */
 710                        knew.private_value =
 711                                AK_COMPOSE(idx/2, (idx%2) + 6, 0, 255);
 712                        knew.tlv.p = db_scale_linear;
 713                        break;
 714                default:
 715                        return -EINVAL;
 716                }
 717
 718                err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
 719                if (err < 0)
 720                        return err;
 721
 722                idx += num_stereo;
 723                mixer_ch++;
 724        }
 725        return 0;
 726}
 727
 728static int build_adc_controls(struct snd_akm4xxx *ak)
 729{
 730        int idx, err, mixer_ch, num_stereo, max_steps;
 731        struct snd_kcontrol_new knew;
 732
 733        mixer_ch = 0;
 734        if (ak->type == SND_AK4528)
 735                return 0;       /* no controls */
 736        for (idx = 0; idx < ak->num_adcs;) {
 737                memset(&knew, 0, sizeof(knew));
 738                if (! ak->adc_info || ! ak->adc_info[mixer_ch].name) {
 739                        knew.name = "ADC Volume";
 740                        knew.index = mixer_ch + ak->idx_offset * 2;
 741                        num_stereo = 1;
 742                } else {
 743                        knew.name = ak->adc_info[mixer_ch].name;
 744                        num_stereo = ak->adc_info[mixer_ch].num_channels;
 745                }
 746                knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
 747                knew.count = 1;
 748                knew.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
 749                        SNDRV_CTL_ELEM_ACCESS_TLV_READ;
 750                if (num_stereo == 2) {
 751                        knew.info = snd_akm4xxx_stereo_volume_info;
 752                        knew.get = snd_akm4xxx_stereo_volume_get;
 753                        knew.put = snd_akm4xxx_stereo_volume_put;
 754                } else {
 755                        knew.info = snd_akm4xxx_volume_info;
 756                        knew.get = snd_akm4xxx_volume_get;
 757                        knew.put = snd_akm4xxx_volume_put;
 758                }
 759                /* register 4 & 5 */
 760                if (ak->type == SND_AK5365)
 761                        max_steps = 152;
 762                else
 763                        max_steps = 164;
 764                knew.private_value =
 765                        AK_COMPOSE(idx/2, (idx%2) + 4, 0, max_steps) |
 766                        AK_VOL_CVT | AK_IPGA;
 767                knew.tlv.p = db_scale_vol_datt;
 768                err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
 769                if (err < 0)
 770                        return err;
 771
 772                if (ak->type == SND_AK5365 && (idx % 2) == 0) {
 773                        if (! ak->adc_info || 
 774                            ! ak->adc_info[mixer_ch].switch_name) {
 775                                knew.name = "Capture Switch";
 776                                knew.index = mixer_ch + ak->idx_offset * 2;
 777                        } else
 778                                knew.name = ak->adc_info[mixer_ch].switch_name;
 779                        knew.info = ak4xxx_switch_info;
 780                        knew.get = ak4xxx_switch_get;
 781                        knew.put = ak4xxx_switch_put;
 782                        knew.access = 0;
 783                        /* register 2, bit 0 (SMUTE): 0 = normal operation,
 784                           1 = mute */
 785                        knew.private_value =
 786                                AK_COMPOSE(idx/2, 2, 0, 0) | AK_INVERT;
 787                        err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
 788                        if (err < 0)
 789                                return err;
 790
 791                        memset(&knew, 0, sizeof(knew));
 792                        knew.name = ak->adc_info[mixer_ch].selector_name;
 793                        if (!knew.name) {
 794                                knew.name = "Capture Channel";
 795                                knew.index = mixer_ch + ak->idx_offset * 2;
 796                        }
 797
 798                        knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
 799                        knew.info = ak4xxx_capture_source_info;
 800                        knew.get = ak4xxx_capture_source_get;
 801                        knew.put = ak4xxx_capture_source_put;
 802                        knew.access = 0;
 803                        /* input selector control: reg. 1, bits 0-2.
 804                         * mis-use 'shift' to pass mixer_ch */
 805                        knew.private_value
 806                                = AK_COMPOSE(idx/2, 1, mixer_ch, 0x07);
 807                        err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
 808                        if (err < 0)
 809                                return err;
 810                }
 811
 812                idx += num_stereo;
 813                mixer_ch++;
 814        }
 815        return 0;
 816}
 817
 818static int build_deemphasis(struct snd_akm4xxx *ak, int num_emphs)
 819{
 820        int idx, err;
 821        struct snd_kcontrol_new knew;
 822
 823        for (idx = 0; idx < num_emphs; idx++) {
 824                memset(&knew, 0, sizeof(knew));
 825                knew.name = "Deemphasis";
 826                knew.index = idx + ak->idx_offset;
 827                knew.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
 828                knew.count = 1;
 829                knew.info = snd_akm4xxx_deemphasis_info;
 830                knew.get = snd_akm4xxx_deemphasis_get;
 831                knew.put = snd_akm4xxx_deemphasis_put;
 832                switch (ak->type) {
 833                case SND_AK4524:
 834                case SND_AK4528:
 835                case SND_AK4620:
 836                        /* register 3 */
 837                        knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
 838                        break;
 839                case SND_AK4529: {
 840                        int shift = idx == 3 ? 6 : (2 - idx) * 2;
 841                        /* register 8 with shift */
 842                        knew.private_value = AK_COMPOSE(0, 8, shift, 0);
 843                        break;
 844                }
 845                case SND_AK4355:
 846                case SND_AK4358:
 847                        knew.private_value = AK_COMPOSE(idx, 3, 0, 0);
 848                        break;
 849                case SND_AK4381:
 850                        knew.private_value = AK_COMPOSE(idx, 1, 1, 0);
 851                        break;
 852                default:
 853                        return -EINVAL;
 854                }
 855                err = snd_ctl_add(ak->card, snd_ctl_new1(&knew, ak));
 856                if (err < 0)
 857                        return err;
 858        }
 859        return 0;
 860}
 861
 862#ifdef CONFIG_PROC_FS
 863static void proc_regs_read(struct snd_info_entry *entry,
 864                struct snd_info_buffer *buffer)
 865{
 866        struct snd_akm4xxx *ak = entry->private_data;
 867        int reg, val, chip;
 868        for (chip = 0; chip < ak->num_chips; chip++) {
 869                for (reg = 0; reg < ak->total_regs; reg++) {
 870                        val =  snd_akm4xxx_get(ak, chip, reg);
 871                        snd_iprintf(buffer, "chip %d: 0x%02x = 0x%02x\n", chip,
 872                                        reg, val);
 873                }
 874        }
 875}
 876
 877static int proc_init(struct snd_akm4xxx *ak)
 878{
 879        struct snd_info_entry *entry;
 880        int err;
 881        err = snd_card_proc_new(ak->card, ak->name, &entry);
 882        if (err < 0)
 883                return err;
 884        snd_info_set_text_ops(entry, ak, proc_regs_read);
 885        return 0;
 886}
 887#else /* !CONFIG_PROC_FS */
 888static int proc_init(struct snd_akm4xxx *ak) { return 0; }
 889#endif
 890
 891int snd_akm4xxx_build_controls(struct snd_akm4xxx *ak)
 892{
 893        int err, num_emphs;
 894
 895        err = build_dac_controls(ak);
 896        if (err < 0)
 897                return err;
 898
 899        err = build_adc_controls(ak);
 900        if (err < 0)
 901                return err;
 902        if (ak->type == SND_AK4355 || ak->type == SND_AK4358)
 903                num_emphs = 1;
 904        else if (ak->type == SND_AK4620)
 905                num_emphs = 0;
 906        else
 907                num_emphs = ak->num_dacs / 2;
 908        err = build_deemphasis(ak, num_emphs);
 909        if (err < 0)
 910                return err;
 911        err = proc_init(ak);
 912        if (err < 0)
 913                return err;
 914
 915        return 0;
 916}
 917EXPORT_SYMBOL(snd_akm4xxx_build_controls);
 918
 919static int __init alsa_akm4xxx_module_init(void)
 920{
 921        return 0;
 922}
 923        
 924static void __exit alsa_akm4xxx_module_exit(void)
 925{
 926}
 927        
 928module_init(alsa_akm4xxx_module_init)
 929module_exit(alsa_akm4xxx_module_exit)
 930