linux/sound/soc/codecs/wm9713.c
<<
>>
Prefs
   1/*
   2 * wm9713.c  --  ALSA Soc WM9713 codec support
   3 *
   4 * Copyright 2006 Wolfson Microelectronics PLC.
   5 * Author: Liam Girdwood <lrg@slimlogic.co.uk>
   6 *
   7 *  This program is free software; you can redistribute  it and/or modify it
   8 *  under  the terms of  the GNU General  Public License as published by the
   9 *  Free Software Foundation;  either version 2 of the  License, or (at your
  10 *  option) any later version.
  11 *
  12 *  Features:-
  13 *
  14 *   o Support for AC97 Codec, Voice DAC and Aux DAC
  15 *   o Support for DAPM
  16 */
  17
  18#include <linux/init.h>
  19#include <linux/slab.h>
  20#include <linux/module.h>
  21#include <linux/device.h>
  22#include <sound/core.h>
  23#include <sound/pcm.h>
  24#include <sound/ac97_codec.h>
  25#include <sound/initval.h>
  26#include <sound/pcm_params.h>
  27#include <sound/tlv.h>
  28#include <sound/soc.h>
  29
  30#include "wm9713.h"
  31
  32struct wm9713_priv {
  33        u32 pll_in; /* PLL input frequency */
  34};
  35
  36static unsigned int ac97_read(struct snd_soc_codec *codec,
  37        unsigned int reg);
  38static int ac97_write(struct snd_soc_codec *codec,
  39        unsigned int reg, unsigned int val);
  40
  41/*
  42 * WM9713 register cache
  43 * Reg 0x3c bit 15 is used by touch driver.
  44 */
  45static const u16 wm9713_reg[] = {
  46        0x6174, 0x8080, 0x8080, 0x8080,
  47        0xc880, 0xe808, 0xe808, 0x0808,
  48        0x00da, 0x8000, 0xd600, 0xaaa0,
  49        0xaaa0, 0xaaa0, 0x0000, 0x0000,
  50        0x0f0f, 0x0040, 0x0000, 0x7f00,
  51        0x0405, 0x0410, 0xbb80, 0xbb80,
  52        0x0000, 0xbb80, 0x0000, 0x4523,
  53        0x0000, 0x2000, 0x7eff, 0xffff,
  54        0x0000, 0x0000, 0x0080, 0x0000,
  55        0x0000, 0x0000, 0xfffe, 0xffff,
  56        0x0000, 0x0000, 0x0000, 0xfffe,
  57        0x4000, 0x0000, 0x0000, 0x0000,
  58        0xb032, 0x3e00, 0x0000, 0x0000,
  59        0x0000, 0x0000, 0x0000, 0x0000,
  60        0x0000, 0x0000, 0x0000, 0x0006,
  61        0x0001, 0x0000, 0x574d, 0x4c13,
  62        0x0000, 0x0000, 0x0000
  63};
  64
  65/* virtual HP mixers regs */
  66#define HPL_MIXER       0x80
  67#define HPR_MIXER       0x82
  68#define MICB_MUX        0x82
  69
  70static const char *wm9713_mic_mixer[] = {"Stereo", "Mic 1", "Mic 2", "Mute"};
  71static const char *wm9713_rec_mux[] = {"Stereo", "Left", "Right", "Mute"};
  72static const char *wm9713_rec_src[] =
  73        {"Mic 1", "Mic 2", "Line", "Mono In", "Headphone", "Speaker",
  74        "Mono Out", "Zh"};
  75static const char *wm9713_rec_gain[] = {"+1.5dB Steps", "+0.75dB Steps"};
  76static const char *wm9713_alc_select[] = {"None", "Left", "Right", "Stereo"};
  77static const char *wm9713_mono_pga[] = {"Vmid", "Zh", "Mono", "Inv",
  78        "Mono Vmid", "Inv Vmid"};
  79static const char *wm9713_spk_pga[] =
  80        {"Vmid", "Zh", "Headphone", "Speaker", "Inv", "Headphone Vmid",
  81        "Speaker Vmid", "Inv Vmid"};
  82static const char *wm9713_hp_pga[] = {"Vmid", "Zh", "Headphone",
  83        "Headphone Vmid"};
  84static const char *wm9713_out3_pga[] = {"Vmid", "Zh", "Inv 1", "Inv 1 Vmid"};
  85static const char *wm9713_out4_pga[] = {"Vmid", "Zh", "Inv 2", "Inv 2 Vmid"};
  86static const char *wm9713_dac_inv[] =
  87        {"Off", "Mono", "Speaker", "Left Headphone", "Right Headphone",
  88        "Headphone Mono", "NC", "Vmid"};
  89static const char *wm9713_bass[] = {"Linear Control", "Adaptive Boost"};
  90static const char *wm9713_ng_type[] = {"Constant Gain", "Mute"};
  91static const char *wm9713_mic_select[] = {"Mic 1", "Mic 2 A", "Mic 2 B"};
  92static const char *wm9713_micb_select[] = {"MPB", "MPA"};
  93
  94static const struct soc_enum wm9713_enum[] = {
  95SOC_ENUM_SINGLE(AC97_LINE, 3, 4, wm9713_mic_mixer), /* record mic mixer 0 */
  96SOC_ENUM_SINGLE(AC97_VIDEO, 14, 4, wm9713_rec_mux), /* record mux hp 1 */
  97SOC_ENUM_SINGLE(AC97_VIDEO, 9, 4, wm9713_rec_mux),  /* record mux mono 2 */
  98SOC_ENUM_SINGLE(AC97_VIDEO, 3, 8, wm9713_rec_src),  /* record mux left 3 */
  99SOC_ENUM_SINGLE(AC97_VIDEO, 0, 8, wm9713_rec_src),  /* record mux right 4*/
 100SOC_ENUM_DOUBLE(AC97_CD, 14, 6, 2, wm9713_rec_gain), /* record step size 5 */
 101SOC_ENUM_SINGLE(AC97_PCI_SVID, 14, 4, wm9713_alc_select), /* alc source select 6*/
 102SOC_ENUM_SINGLE(AC97_REC_GAIN, 14, 4, wm9713_mono_pga), /* mono input select 7 */
 103SOC_ENUM_SINGLE(AC97_REC_GAIN, 11, 8, wm9713_spk_pga), /* speaker left input select 8 */
 104SOC_ENUM_SINGLE(AC97_REC_GAIN, 8, 8, wm9713_spk_pga), /* speaker right input select 9 */
 105SOC_ENUM_SINGLE(AC97_REC_GAIN, 6, 3, wm9713_hp_pga), /* headphone left input 10 */
 106SOC_ENUM_SINGLE(AC97_REC_GAIN, 4, 3, wm9713_hp_pga), /* headphone right input 11 */
 107SOC_ENUM_SINGLE(AC97_REC_GAIN, 2, 4, wm9713_out3_pga), /* out 3 source 12 */
 108SOC_ENUM_SINGLE(AC97_REC_GAIN, 0, 4, wm9713_out4_pga), /* out 4 source 13 */
 109SOC_ENUM_SINGLE(AC97_REC_GAIN_MIC, 13, 8, wm9713_dac_inv), /* dac invert 1 14 */
 110SOC_ENUM_SINGLE(AC97_REC_GAIN_MIC, 10, 8, wm9713_dac_inv), /* dac invert 2 15 */
 111SOC_ENUM_SINGLE(AC97_GENERAL_PURPOSE, 15, 2, wm9713_bass), /* bass control 16 */
 112SOC_ENUM_SINGLE(AC97_PCI_SVID, 5, 2, wm9713_ng_type), /* noise gate type 17 */
 113SOC_ENUM_SINGLE(AC97_3D_CONTROL, 12, 3, wm9713_mic_select), /* mic selection 18 */
 114SOC_ENUM_SINGLE(MICB_MUX, 0, 2, wm9713_micb_select), /* mic selection 19 */
 115};
 116
 117static const DECLARE_TLV_DB_SCALE(out_tlv, -4650, 150, 0);
 118static const DECLARE_TLV_DB_SCALE(main_tlv, -3450, 150, 0);
 119static const DECLARE_TLV_DB_SCALE(misc_tlv, -1500, 300, 0);
 120static unsigned int mic_tlv[] = {
 121        TLV_DB_RANGE_HEAD(2),
 122        0, 2, TLV_DB_SCALE_ITEM(1200, 600, 0),
 123        3, 3, TLV_DB_SCALE_ITEM(3000, 0, 0),
 124};
 125
 126static const struct snd_kcontrol_new wm9713_snd_ac97_controls[] = {
 127SOC_DOUBLE_TLV("Speaker Playback Volume", AC97_MASTER, 8, 0, 31, 1, out_tlv),
 128SOC_DOUBLE("Speaker Playback Switch", AC97_MASTER, 15, 7, 1, 1),
 129SOC_DOUBLE_TLV("Headphone Playback Volume", AC97_HEADPHONE, 8, 0, 31, 1,
 130               out_tlv),
 131SOC_DOUBLE("Headphone Playback Switch", AC97_HEADPHONE, 15, 7, 1, 1),
 132SOC_DOUBLE_TLV("Line In Volume", AC97_PC_BEEP, 8, 0, 31, 1, main_tlv),
 133SOC_DOUBLE_TLV("PCM Playback Volume", AC97_PHONE, 8, 0, 31, 1, main_tlv),
 134SOC_SINGLE_TLV("Mic 1 Volume", AC97_MIC, 8, 31, 1, main_tlv),
 135SOC_SINGLE_TLV("Mic 2 Volume", AC97_MIC, 0, 31, 1, main_tlv),
 136SOC_SINGLE_TLV("Mic 1 Preamp Volume", AC97_3D_CONTROL, 10, 3, 0, mic_tlv),
 137SOC_SINGLE_TLV("Mic 2 Preamp Volume", AC97_3D_CONTROL, 12, 3, 0, mic_tlv),
 138
 139SOC_SINGLE("Mic Boost (+20dB) Switch", AC97_LINE, 5, 1, 0),
 140SOC_SINGLE("Mic Headphone Mixer Volume", AC97_LINE, 0, 7, 1),
 141
 142SOC_SINGLE("Capture Switch", AC97_CD, 15, 1, 1),
 143SOC_ENUM("Capture Volume Steps", wm9713_enum[5]),
 144SOC_DOUBLE("Capture Volume", AC97_CD, 8, 0, 31, 0),
 145SOC_SINGLE("Capture ZC Switch", AC97_CD, 7, 1, 0),
 146
 147SOC_SINGLE_TLV("Capture to Headphone Volume", AC97_VIDEO, 11, 7, 1, misc_tlv),
 148SOC_SINGLE("Capture to Mono Boost (+20dB) Switch", AC97_VIDEO, 8, 1, 0),
 149SOC_SINGLE("Capture ADC Boost (+20dB) Switch", AC97_VIDEO, 6, 1, 0),
 150
 151SOC_SINGLE("ALC Target Volume", AC97_CODEC_CLASS_REV, 12, 15, 0),
 152SOC_SINGLE("ALC Hold Time", AC97_CODEC_CLASS_REV, 8, 15, 0),
 153SOC_SINGLE("ALC Decay Time", AC97_CODEC_CLASS_REV, 4, 15, 0),
 154SOC_SINGLE("ALC Attack Time", AC97_CODEC_CLASS_REV, 0, 15, 0),
 155SOC_ENUM("ALC Function", wm9713_enum[6]),
 156SOC_SINGLE("ALC Max Volume", AC97_PCI_SVID, 11, 7, 0),
 157SOC_SINGLE("ALC ZC Timeout", AC97_PCI_SVID, 9, 3, 0),
 158SOC_SINGLE("ALC ZC Switch", AC97_PCI_SVID, 8, 1, 0),
 159SOC_SINGLE("ALC NG Switch", AC97_PCI_SVID, 7, 1, 0),
 160SOC_ENUM("ALC NG Type", wm9713_enum[17]),
 161SOC_SINGLE("ALC NG Threshold", AC97_PCI_SVID, 0, 31, 0),
 162
 163SOC_DOUBLE("Speaker Playback ZC Switch", AC97_MASTER, 14, 6, 1, 0),
 164SOC_DOUBLE("Headphone Playback ZC Switch", AC97_HEADPHONE, 14, 6, 1, 0),
 165
 166SOC_SINGLE("Out4 Playback Switch", AC97_MASTER_MONO, 15, 1, 1),
 167SOC_SINGLE("Out4 Playback ZC Switch", AC97_MASTER_MONO, 14, 1, 0),
 168SOC_SINGLE_TLV("Out4 Playback Volume", AC97_MASTER_MONO, 8, 31, 1, out_tlv),
 169
 170SOC_SINGLE("Out3 Playback Switch", AC97_MASTER_MONO, 7, 1, 1),
 171SOC_SINGLE("Out3 Playback ZC Switch", AC97_MASTER_MONO, 6, 1, 0),
 172SOC_SINGLE_TLV("Out3 Playback Volume", AC97_MASTER_MONO, 0, 31, 1, out_tlv),
 173
 174SOC_SINGLE_TLV("Mono Capture Volume", AC97_MASTER_TONE, 8, 31, 1, main_tlv),
 175SOC_SINGLE("Mono Playback Switch", AC97_MASTER_TONE, 7, 1, 1),
 176SOC_SINGLE("Mono Playback ZC Switch", AC97_MASTER_TONE, 6, 1, 0),
 177SOC_SINGLE_TLV("Mono Playback Volume", AC97_MASTER_TONE, 0, 31, 1, out_tlv),
 178
 179SOC_SINGLE_TLV("Headphone Mixer Beep Playback Volume", AC97_AUX, 12, 7, 1,
 180               misc_tlv),
 181SOC_SINGLE_TLV("Speaker Mixer Beep Playback Volume", AC97_AUX, 8, 7, 1,
 182               misc_tlv),
 183SOC_SINGLE_TLV("Mono Mixer Beep Playback Volume", AC97_AUX, 4, 7, 1, misc_tlv),
 184
 185SOC_SINGLE_TLV("Voice Playback Headphone Volume", AC97_PCM, 12, 7, 1,
 186               misc_tlv),
 187SOC_SINGLE("Voice Playback Master Volume", AC97_PCM, 8, 7, 1),
 188SOC_SINGLE("Voice Playback Mono Volume", AC97_PCM, 4, 7, 1),
 189
 190SOC_SINGLE_TLV("Headphone Mixer Aux Playback Volume", AC97_REC_SEL, 12, 7, 1,
 191               misc_tlv),
 192
 193SOC_SINGLE_TLV("Speaker Mixer Voice Playback Volume", AC97_PCM, 8, 7, 1,
 194               misc_tlv),
 195SOC_SINGLE_TLV("Speaker Mixer Aux Playback Volume", AC97_REC_SEL, 8, 7, 1,
 196               misc_tlv),
 197
 198SOC_SINGLE_TLV("Mono Mixer Voice Playback Volume", AC97_PCM, 4, 7, 1,
 199               misc_tlv),
 200SOC_SINGLE_TLV("Mono Mixer Aux Playback Volume", AC97_REC_SEL, 4, 7, 1,
 201               misc_tlv),
 202
 203SOC_SINGLE("Aux Playback Headphone Volume", AC97_REC_SEL, 12, 7, 1),
 204SOC_SINGLE("Aux Playback Master Volume", AC97_REC_SEL, 8, 7, 1),
 205
 206SOC_ENUM("Bass Control", wm9713_enum[16]),
 207SOC_SINGLE("Bass Cut-off Switch", AC97_GENERAL_PURPOSE, 12, 1, 1),
 208SOC_SINGLE("Tone Cut-off Switch", AC97_GENERAL_PURPOSE, 4, 1, 1),
 209SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_GENERAL_PURPOSE, 6, 1, 0),
 210SOC_SINGLE("Bass Volume", AC97_GENERAL_PURPOSE, 8, 15, 1),
 211SOC_SINGLE("Tone Volume", AC97_GENERAL_PURPOSE, 0, 15, 1),
 212
 213SOC_SINGLE("3D Upper Cut-off Switch", AC97_REC_GAIN_MIC, 5, 1, 0),
 214SOC_SINGLE("3D Lower Cut-off Switch", AC97_REC_GAIN_MIC, 4, 1, 0),
 215SOC_SINGLE("3D Depth", AC97_REC_GAIN_MIC, 0, 15, 1),
 216};
 217
 218static int wm9713_voice_shutdown(struct snd_soc_dapm_widget *w,
 219                                 struct snd_kcontrol *kcontrol, int event)
 220{
 221        struct snd_soc_codec *codec = w->codec;
 222        u16 status, rate;
 223
 224        BUG_ON(event != SND_SOC_DAPM_PRE_PMD);
 225
 226        /* Gracefully shut down the voice interface. */
 227        status = ac97_read(codec, AC97_EXTENDED_MID) | 0x1000;
 228        rate = ac97_read(codec, AC97_HANDSET_RATE) & 0xF0FF;
 229        ac97_write(codec, AC97_HANDSET_RATE, rate | 0x0200);
 230        schedule_timeout_interruptible(msecs_to_jiffies(1));
 231        ac97_write(codec, AC97_HANDSET_RATE, rate | 0x0F00);
 232        ac97_write(codec, AC97_EXTENDED_MID, status);
 233
 234        return 0;
 235}
 236
 237
 238/* We have to create a fake left and right HP mixers because
 239 * the codec only has a single control that is shared by both channels.
 240 * This makes it impossible to determine the audio path using the current
 241 * register map, thus we add a new (virtual) register to help determine the
 242 * audio route within the device.
 243 */
 244static int mixer_event(struct snd_soc_dapm_widget *w,
 245        struct snd_kcontrol *kcontrol, int event)
 246{
 247        u16 l, r, beep, tone, phone, rec, pcm, aux;
 248
 249        l = ac97_read(w->codec, HPL_MIXER);
 250        r = ac97_read(w->codec, HPR_MIXER);
 251        beep = ac97_read(w->codec, AC97_PC_BEEP);
 252        tone = ac97_read(w->codec, AC97_MASTER_TONE);
 253        phone = ac97_read(w->codec, AC97_PHONE);
 254        rec = ac97_read(w->codec, AC97_REC_SEL);
 255        pcm = ac97_read(w->codec, AC97_PCM);
 256        aux = ac97_read(w->codec, AC97_AUX);
 257
 258        if (event & SND_SOC_DAPM_PRE_REG)
 259                return 0;
 260        if ((l & 0x1) || (r & 0x1))
 261                ac97_write(w->codec, AC97_PC_BEEP, beep & 0x7fff);
 262        else
 263                ac97_write(w->codec, AC97_PC_BEEP, beep | 0x8000);
 264
 265        if ((l & 0x2) || (r & 0x2))
 266                ac97_write(w->codec, AC97_MASTER_TONE, tone & 0x7fff);
 267        else
 268                ac97_write(w->codec, AC97_MASTER_TONE, tone | 0x8000);
 269
 270        if ((l & 0x4) || (r & 0x4))
 271                ac97_write(w->codec, AC97_PHONE, phone & 0x7fff);
 272        else
 273                ac97_write(w->codec, AC97_PHONE, phone | 0x8000);
 274
 275        if ((l & 0x8) || (r & 0x8))
 276                ac97_write(w->codec, AC97_REC_SEL, rec & 0x7fff);
 277        else
 278                ac97_write(w->codec, AC97_REC_SEL, rec | 0x8000);
 279
 280        if ((l & 0x10) || (r & 0x10))
 281                ac97_write(w->codec, AC97_PCM, pcm & 0x7fff);
 282        else
 283                ac97_write(w->codec, AC97_PCM, pcm | 0x8000);
 284
 285        if ((l & 0x20) || (r & 0x20))
 286                ac97_write(w->codec, AC97_AUX, aux & 0x7fff);
 287        else
 288                ac97_write(w->codec, AC97_AUX, aux | 0x8000);
 289
 290        return 0;
 291}
 292
 293/* Left Headphone Mixers */
 294static const struct snd_kcontrol_new wm9713_hpl_mixer_controls[] = {
 295SOC_DAPM_SINGLE("Beep Playback Switch", HPL_MIXER, 5, 1, 0),
 296SOC_DAPM_SINGLE("Voice Playback Switch", HPL_MIXER, 4, 1, 0),
 297SOC_DAPM_SINGLE("Aux Playback Switch", HPL_MIXER, 3, 1, 0),
 298SOC_DAPM_SINGLE("PCM Playback Switch", HPL_MIXER, 2, 1, 0),
 299SOC_DAPM_SINGLE("MonoIn Playback Switch", HPL_MIXER, 1, 1, 0),
 300SOC_DAPM_SINGLE("Bypass Playback Switch", HPL_MIXER, 0, 1, 0),
 301};
 302
 303/* Right Headphone Mixers */
 304static const struct snd_kcontrol_new wm9713_hpr_mixer_controls[] = {
 305SOC_DAPM_SINGLE("Beep Playback Switch", HPR_MIXER, 5, 1, 0),
 306SOC_DAPM_SINGLE("Voice Playback Switch", HPR_MIXER, 4, 1, 0),
 307SOC_DAPM_SINGLE("Aux Playback Switch", HPR_MIXER, 3, 1, 0),
 308SOC_DAPM_SINGLE("PCM Playback Switch", HPR_MIXER, 2, 1, 0),
 309SOC_DAPM_SINGLE("MonoIn Playback Switch", HPR_MIXER, 1, 1, 0),
 310SOC_DAPM_SINGLE("Bypass Playback Switch", HPR_MIXER, 0, 1, 0),
 311};
 312
 313/* headphone capture mux */
 314static const struct snd_kcontrol_new wm9713_hp_rec_mux_controls =
 315SOC_DAPM_ENUM("Route", wm9713_enum[1]);
 316
 317/* headphone mic mux */
 318static const struct snd_kcontrol_new wm9713_hp_mic_mux_controls =
 319SOC_DAPM_ENUM("Route", wm9713_enum[0]);
 320
 321/* Speaker Mixer */
 322static const struct snd_kcontrol_new wm9713_speaker_mixer_controls[] = {
 323SOC_DAPM_SINGLE("Beep Playback Switch", AC97_AUX, 11, 1, 1),
 324SOC_DAPM_SINGLE("Voice Playback Switch", AC97_PCM, 11, 1, 1),
 325SOC_DAPM_SINGLE("Aux Playback Switch", AC97_REC_SEL, 11, 1, 1),
 326SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PHONE, 14, 1, 1),
 327SOC_DAPM_SINGLE("MonoIn Playback Switch", AC97_MASTER_TONE, 14, 1, 1),
 328SOC_DAPM_SINGLE("Bypass Playback Switch", AC97_PC_BEEP, 14, 1, 1),
 329};
 330
 331/* Mono Mixer */
 332static const struct snd_kcontrol_new wm9713_mono_mixer_controls[] = {
 333SOC_DAPM_SINGLE("Beep Playback Switch", AC97_AUX, 7, 1, 1),
 334SOC_DAPM_SINGLE("Voice Playback Switch", AC97_PCM, 7, 1, 1),
 335SOC_DAPM_SINGLE("Aux Playback Switch", AC97_REC_SEL, 7, 1, 1),
 336SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PHONE, 13, 1, 1),
 337SOC_DAPM_SINGLE("MonoIn Playback Switch", AC97_MASTER_TONE, 13, 1, 1),
 338SOC_DAPM_SINGLE("Bypass Playback Switch", AC97_PC_BEEP, 13, 1, 1),
 339SOC_DAPM_SINGLE("Mic 1 Sidetone Switch", AC97_LINE, 7, 1, 1),
 340SOC_DAPM_SINGLE("Mic 2 Sidetone Switch", AC97_LINE, 6, 1, 1),
 341};
 342
 343/* mono mic mux */
 344static const struct snd_kcontrol_new wm9713_mono_mic_mux_controls =
 345SOC_DAPM_ENUM("Route", wm9713_enum[2]);
 346
 347/* mono output mux */
 348static const struct snd_kcontrol_new wm9713_mono_mux_controls =
 349SOC_DAPM_ENUM("Route", wm9713_enum[7]);
 350
 351/* speaker left output mux */
 352static const struct snd_kcontrol_new wm9713_hp_spkl_mux_controls =
 353SOC_DAPM_ENUM("Route", wm9713_enum[8]);
 354
 355/* speaker right output mux */
 356static const struct snd_kcontrol_new wm9713_hp_spkr_mux_controls =
 357SOC_DAPM_ENUM("Route", wm9713_enum[9]);
 358
 359/* headphone left output mux */
 360static const struct snd_kcontrol_new wm9713_hpl_out_mux_controls =
 361SOC_DAPM_ENUM("Route", wm9713_enum[10]);
 362
 363/* headphone right output mux */
 364static const struct snd_kcontrol_new wm9713_hpr_out_mux_controls =
 365SOC_DAPM_ENUM("Route", wm9713_enum[11]);
 366
 367/* Out3 mux */
 368static const struct snd_kcontrol_new wm9713_out3_mux_controls =
 369SOC_DAPM_ENUM("Route", wm9713_enum[12]);
 370
 371/* Out4 mux */
 372static const struct snd_kcontrol_new wm9713_out4_mux_controls =
 373SOC_DAPM_ENUM("Route", wm9713_enum[13]);
 374
 375/* DAC inv mux 1 */
 376static const struct snd_kcontrol_new wm9713_dac_inv1_mux_controls =
 377SOC_DAPM_ENUM("Route", wm9713_enum[14]);
 378
 379/* DAC inv mux 2 */
 380static const struct snd_kcontrol_new wm9713_dac_inv2_mux_controls =
 381SOC_DAPM_ENUM("Route", wm9713_enum[15]);
 382
 383/* Capture source left */
 384static const struct snd_kcontrol_new wm9713_rec_srcl_mux_controls =
 385SOC_DAPM_ENUM("Route", wm9713_enum[3]);
 386
 387/* Capture source right */
 388static const struct snd_kcontrol_new wm9713_rec_srcr_mux_controls =
 389SOC_DAPM_ENUM("Route", wm9713_enum[4]);
 390
 391/* mic source */
 392static const struct snd_kcontrol_new wm9713_mic_sel_mux_controls =
 393SOC_DAPM_ENUM("Route", wm9713_enum[18]);
 394
 395/* mic source B virtual control */
 396static const struct snd_kcontrol_new wm9713_micb_sel_mux_controls =
 397SOC_DAPM_ENUM("Route", wm9713_enum[19]);
 398
 399static const struct snd_soc_dapm_widget wm9713_dapm_widgets[] = {
 400SND_SOC_DAPM_MUX("Capture Headphone Mux", SND_SOC_NOPM, 0, 0,
 401        &wm9713_hp_rec_mux_controls),
 402SND_SOC_DAPM_MUX("Sidetone Mux", SND_SOC_NOPM, 0, 0,
 403        &wm9713_hp_mic_mux_controls),
 404SND_SOC_DAPM_MUX("Capture Mono Mux", SND_SOC_NOPM, 0, 0,
 405        &wm9713_mono_mic_mux_controls),
 406SND_SOC_DAPM_MUX("Mono Out Mux", SND_SOC_NOPM, 0, 0,
 407        &wm9713_mono_mux_controls),
 408SND_SOC_DAPM_MUX("Left Speaker Out Mux", SND_SOC_NOPM, 0, 0,
 409        &wm9713_hp_spkl_mux_controls),
 410SND_SOC_DAPM_MUX("Right Speaker Out Mux", SND_SOC_NOPM, 0, 0,
 411        &wm9713_hp_spkr_mux_controls),
 412SND_SOC_DAPM_MUX("Left Headphone Out Mux", SND_SOC_NOPM, 0, 0,
 413        &wm9713_hpl_out_mux_controls),
 414SND_SOC_DAPM_MUX("Right Headphone Out Mux", SND_SOC_NOPM, 0, 0,
 415        &wm9713_hpr_out_mux_controls),
 416SND_SOC_DAPM_MUX("Out 3 Mux", SND_SOC_NOPM, 0, 0,
 417        &wm9713_out3_mux_controls),
 418SND_SOC_DAPM_MUX("Out 4 Mux", SND_SOC_NOPM, 0, 0,
 419        &wm9713_out4_mux_controls),
 420SND_SOC_DAPM_MUX("DAC Inv Mux 1", SND_SOC_NOPM, 0, 0,
 421        &wm9713_dac_inv1_mux_controls),
 422SND_SOC_DAPM_MUX("DAC Inv Mux 2", SND_SOC_NOPM, 0, 0,
 423        &wm9713_dac_inv2_mux_controls),
 424SND_SOC_DAPM_MUX("Left Capture Source", SND_SOC_NOPM, 0, 0,
 425        &wm9713_rec_srcl_mux_controls),
 426SND_SOC_DAPM_MUX("Right Capture Source", SND_SOC_NOPM, 0, 0,
 427        &wm9713_rec_srcr_mux_controls),
 428SND_SOC_DAPM_MUX("Mic A Source", SND_SOC_NOPM, 0, 0,
 429        &wm9713_mic_sel_mux_controls),
 430SND_SOC_DAPM_MUX("Mic B Source", SND_SOC_NOPM, 0, 0,
 431        &wm9713_micb_sel_mux_controls),
 432SND_SOC_DAPM_MIXER_E("Left HP Mixer", AC97_EXTENDED_MID, 3, 1,
 433        &wm9713_hpl_mixer_controls[0], ARRAY_SIZE(wm9713_hpl_mixer_controls),
 434        mixer_event, SND_SOC_DAPM_POST_REG),
 435SND_SOC_DAPM_MIXER_E("Right HP Mixer", AC97_EXTENDED_MID, 2, 1,
 436        &wm9713_hpr_mixer_controls[0], ARRAY_SIZE(wm9713_hpr_mixer_controls),
 437        mixer_event, SND_SOC_DAPM_POST_REG),
 438SND_SOC_DAPM_MIXER("Mono Mixer", AC97_EXTENDED_MID, 0, 1,
 439        &wm9713_mono_mixer_controls[0], ARRAY_SIZE(wm9713_mono_mixer_controls)),
 440SND_SOC_DAPM_MIXER("Speaker Mixer", AC97_EXTENDED_MID, 1, 1,
 441        &wm9713_speaker_mixer_controls[0],
 442        ARRAY_SIZE(wm9713_speaker_mixer_controls)),
 443SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", AC97_EXTENDED_MID, 7, 1),
 444SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", AC97_EXTENDED_MID, 6, 1),
 445SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
 446SND_SOC_DAPM_MIXER("HP Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
 447SND_SOC_DAPM_MIXER("Line Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
 448SND_SOC_DAPM_MIXER("Capture Mixer", SND_SOC_NOPM, 0, 0, NULL, 0),
 449SND_SOC_DAPM_DAC_E("Voice DAC", "Voice Playback", AC97_EXTENDED_MID, 12, 1,
 450                   wm9713_voice_shutdown, SND_SOC_DAPM_PRE_PMD),
 451SND_SOC_DAPM_DAC("Aux DAC", "Aux Playback", AC97_EXTENDED_MID, 11, 1),
 452SND_SOC_DAPM_PGA("Left ADC", AC97_EXTENDED_MID, 5, 1, NULL, 0),
 453SND_SOC_DAPM_PGA("Right ADC", AC97_EXTENDED_MID, 4, 1, NULL, 0),
 454SND_SOC_DAPM_ADC("Left HiFi ADC", "Left HiFi Capture", SND_SOC_NOPM, 0, 0),
 455SND_SOC_DAPM_ADC("Right HiFi ADC", "Right HiFi Capture", SND_SOC_NOPM, 0, 0),
 456SND_SOC_DAPM_ADC("Left Voice ADC", "Left Voice Capture", SND_SOC_NOPM, 0, 0),
 457SND_SOC_DAPM_ADC("Right Voice ADC", "Right Voice Capture", SND_SOC_NOPM, 0, 0),
 458SND_SOC_DAPM_PGA("Left Headphone", AC97_EXTENDED_MSTATUS, 10, 1, NULL, 0),
 459SND_SOC_DAPM_PGA("Right Headphone", AC97_EXTENDED_MSTATUS, 9, 1, NULL, 0),
 460SND_SOC_DAPM_PGA("Left Speaker", AC97_EXTENDED_MSTATUS, 8, 1, NULL, 0),
 461SND_SOC_DAPM_PGA("Right Speaker", AC97_EXTENDED_MSTATUS, 7, 1, NULL, 0),
 462SND_SOC_DAPM_PGA("Out 3", AC97_EXTENDED_MSTATUS, 11, 1, NULL, 0),
 463SND_SOC_DAPM_PGA("Out 4", AC97_EXTENDED_MSTATUS, 12, 1, NULL, 0),
 464SND_SOC_DAPM_PGA("Mono Out", AC97_EXTENDED_MSTATUS, 13, 1, NULL, 0),
 465SND_SOC_DAPM_PGA("Left Line In", AC97_EXTENDED_MSTATUS, 6, 1, NULL, 0),
 466SND_SOC_DAPM_PGA("Right Line In", AC97_EXTENDED_MSTATUS, 5, 1, NULL, 0),
 467SND_SOC_DAPM_PGA("Mono In", AC97_EXTENDED_MSTATUS, 4, 1, NULL, 0),
 468SND_SOC_DAPM_PGA("Mic A PGA", AC97_EXTENDED_MSTATUS, 3, 1, NULL, 0),
 469SND_SOC_DAPM_PGA("Mic B PGA", AC97_EXTENDED_MSTATUS, 2, 1, NULL, 0),
 470SND_SOC_DAPM_PGA("Mic A Pre Amp", AC97_EXTENDED_MSTATUS, 1, 1, NULL, 0),
 471SND_SOC_DAPM_PGA("Mic B Pre Amp", AC97_EXTENDED_MSTATUS, 0, 1, NULL, 0),
 472SND_SOC_DAPM_MICBIAS("Mic Bias", AC97_EXTENDED_MSTATUS, 14, 1),
 473SND_SOC_DAPM_OUTPUT("MONO"),
 474SND_SOC_DAPM_OUTPUT("HPL"),
 475SND_SOC_DAPM_OUTPUT("HPR"),
 476SND_SOC_DAPM_OUTPUT("SPKL"),
 477SND_SOC_DAPM_OUTPUT("SPKR"),
 478SND_SOC_DAPM_OUTPUT("OUT3"),
 479SND_SOC_DAPM_OUTPUT("OUT4"),
 480SND_SOC_DAPM_INPUT("LINEL"),
 481SND_SOC_DAPM_INPUT("LINER"),
 482SND_SOC_DAPM_INPUT("MONOIN"),
 483SND_SOC_DAPM_INPUT("PCBEEP"),
 484SND_SOC_DAPM_INPUT("MIC1"),
 485SND_SOC_DAPM_INPUT("MIC2A"),
 486SND_SOC_DAPM_INPUT("MIC2B"),
 487SND_SOC_DAPM_VMID("VMID"),
 488};
 489
 490static const struct snd_soc_dapm_route audio_map[] = {
 491        /* left HP mixer */
 492        {"Left HP Mixer", "Beep Playback Switch",    "PCBEEP"},
 493        {"Left HP Mixer", "Voice Playback Switch",   "Voice DAC"},
 494        {"Left HP Mixer", "Aux Playback Switch",     "Aux DAC"},
 495        {"Left HP Mixer", "Bypass Playback Switch",  "Left Line In"},
 496        {"Left HP Mixer", "PCM Playback Switch",     "Left DAC"},
 497        {"Left HP Mixer", "MonoIn Playback Switch",  "Mono In"},
 498        {"Left HP Mixer", NULL,  "Capture Headphone Mux"},
 499
 500        /* right HP mixer */
 501        {"Right HP Mixer", "Beep Playback Switch",    "PCBEEP"},
 502        {"Right HP Mixer", "Voice Playback Switch",   "Voice DAC"},
 503        {"Right HP Mixer", "Aux Playback Switch",     "Aux DAC"},
 504        {"Right HP Mixer", "Bypass Playback Switch",  "Right Line In"},
 505        {"Right HP Mixer", "PCM Playback Switch",     "Right DAC"},
 506        {"Right HP Mixer", "MonoIn Playback Switch",  "Mono In"},
 507        {"Right HP Mixer", NULL,  "Capture Headphone Mux"},
 508
 509        /* virtual mixer - mixes left & right channels for spk and mono */
 510        {"AC97 Mixer", NULL, "Left DAC"},
 511        {"AC97 Mixer", NULL, "Right DAC"},
 512        {"Line Mixer", NULL, "Right Line In"},
 513        {"Line Mixer", NULL, "Left Line In"},
 514        {"HP Mixer", NULL, "Left HP Mixer"},
 515        {"HP Mixer", NULL, "Right HP Mixer"},
 516        {"Capture Mixer", NULL, "Left Capture Source"},
 517        {"Capture Mixer", NULL, "Right Capture Source"},
 518
 519        /* speaker mixer */
 520        {"Speaker Mixer", "Beep Playback Switch",    "PCBEEP"},
 521        {"Speaker Mixer", "Voice Playback Switch",   "Voice DAC"},
 522        {"Speaker Mixer", "Aux Playback Switch",     "Aux DAC"},
 523        {"Speaker Mixer", "Bypass Playback Switch",  "Line Mixer"},
 524        {"Speaker Mixer", "PCM Playback Switch",     "AC97 Mixer"},
 525        {"Speaker Mixer", "MonoIn Playback Switch",  "Mono In"},
 526
 527        /* mono mixer */
 528        {"Mono Mixer", "Beep Playback Switch",    "PCBEEP"},
 529        {"Mono Mixer", "Voice Playback Switch",   "Voice DAC"},
 530        {"Mono Mixer", "Aux Playback Switch",     "Aux DAC"},
 531        {"Mono Mixer", "Bypass Playback Switch",  "Line Mixer"},
 532        {"Mono Mixer", "PCM Playback Switch",     "AC97 Mixer"},
 533        {"Mono Mixer", "Mic 1 Sidetone Switch", "Mic A PGA"},
 534        {"Mono Mixer", "Mic 2 Sidetone Switch", "Mic B PGA"},
 535        {"Mono Mixer", NULL,  "Capture Mono Mux"},
 536
 537        /* DAC inv mux 1 */
 538        {"DAC Inv Mux 1", "Mono", "Mono Mixer"},
 539        {"DAC Inv Mux 1", "Speaker", "Speaker Mixer"},
 540        {"DAC Inv Mux 1", "Left Headphone", "Left HP Mixer"},
 541        {"DAC Inv Mux 1", "Right Headphone", "Right HP Mixer"},
 542        {"DAC Inv Mux 1", "Headphone Mono", "HP Mixer"},
 543
 544        /* DAC inv mux 2 */
 545        {"DAC Inv Mux 2", "Mono", "Mono Mixer"},
 546        {"DAC Inv Mux 2", "Speaker", "Speaker Mixer"},
 547        {"DAC Inv Mux 2", "Left Headphone", "Left HP Mixer"},
 548        {"DAC Inv Mux 2", "Right Headphone", "Right HP Mixer"},
 549        {"DAC Inv Mux 2", "Headphone Mono", "HP Mixer"},
 550
 551        /* headphone left mux */
 552        {"Left Headphone Out Mux", "Headphone", "Left HP Mixer"},
 553
 554        /* headphone right mux */
 555        {"Right Headphone Out Mux", "Headphone", "Right HP Mixer"},
 556
 557        /* speaker left mux */
 558        {"Left Speaker Out Mux", "Headphone", "Left HP Mixer"},
 559        {"Left Speaker Out Mux", "Speaker", "Speaker Mixer"},
 560        {"Left Speaker Out Mux", "Inv", "DAC Inv Mux 1"},
 561
 562        /* speaker right mux */
 563        {"Right Speaker Out Mux", "Headphone", "Right HP Mixer"},
 564        {"Right Speaker Out Mux", "Speaker", "Speaker Mixer"},
 565        {"Right Speaker Out Mux", "Inv", "DAC Inv Mux 2"},
 566
 567        /* mono mux */
 568        {"Mono Out Mux", "Mono", "Mono Mixer"},
 569        {"Mono Out Mux", "Inv", "DAC Inv Mux 1"},
 570
 571        /* out 3 mux */
 572        {"Out 3 Mux", "Inv 1", "DAC Inv Mux 1"},
 573
 574        /* out 4 mux */
 575        {"Out 4 Mux", "Inv 2", "DAC Inv Mux 2"},
 576
 577        /* output pga */
 578        {"HPL", NULL, "Left Headphone"},
 579        {"Left Headphone", NULL, "Left Headphone Out Mux"},
 580        {"HPR", NULL, "Right Headphone"},
 581        {"Right Headphone", NULL, "Right Headphone Out Mux"},
 582        {"OUT3", NULL, "Out 3"},
 583        {"Out 3", NULL, "Out 3 Mux"},
 584        {"OUT4", NULL, "Out 4"},
 585        {"Out 4", NULL, "Out 4 Mux"},
 586        {"SPKL", NULL, "Left Speaker"},
 587        {"Left Speaker", NULL, "Left Speaker Out Mux"},
 588        {"SPKR", NULL, "Right Speaker"},
 589        {"Right Speaker", NULL, "Right Speaker Out Mux"},
 590        {"MONO", NULL, "Mono Out"},
 591        {"Mono Out", NULL, "Mono Out Mux"},
 592
 593        /* input pga */
 594        {"Left Line In", NULL, "LINEL"},
 595        {"Right Line In", NULL, "LINER"},
 596        {"Mono In", NULL, "MONOIN"},
 597        {"Mic A PGA", NULL, "Mic A Pre Amp"},
 598        {"Mic B PGA", NULL, "Mic B Pre Amp"},
 599
 600        /* left capture select */
 601        {"Left Capture Source", "Mic 1", "Mic A Pre Amp"},
 602        {"Left Capture Source", "Mic 2", "Mic B Pre Amp"},
 603        {"Left Capture Source", "Line", "LINEL"},
 604        {"Left Capture Source", "Mono In", "MONOIN"},
 605        {"Left Capture Source", "Headphone", "Left HP Mixer"},
 606        {"Left Capture Source", "Speaker", "Speaker Mixer"},
 607        {"Left Capture Source", "Mono Out", "Mono Mixer"},
 608
 609        /* right capture select */
 610        {"Right Capture Source", "Mic 1", "Mic A Pre Amp"},
 611        {"Right Capture Source", "Mic 2", "Mic B Pre Amp"},
 612        {"Right Capture Source", "Line", "LINER"},
 613        {"Right Capture Source", "Mono In", "MONOIN"},
 614        {"Right Capture Source", "Headphone", "Right HP Mixer"},
 615        {"Right Capture Source", "Speaker", "Speaker Mixer"},
 616        {"Right Capture Source", "Mono Out", "Mono Mixer"},
 617
 618        /* left ADC */
 619        {"Left ADC", NULL, "Left Capture Source"},
 620        {"Left Voice ADC", NULL, "Left ADC"},
 621        {"Left HiFi ADC", NULL, "Left ADC"},
 622
 623        /* right ADC */
 624        {"Right ADC", NULL, "Right Capture Source"},
 625        {"Right Voice ADC", NULL, "Right ADC"},
 626        {"Right HiFi ADC", NULL, "Right ADC"},
 627
 628        /* mic */
 629        {"Mic A Pre Amp", NULL, "Mic A Source"},
 630        {"Mic A Source", "Mic 1", "MIC1"},
 631        {"Mic A Source", "Mic 2 A", "MIC2A"},
 632        {"Mic A Source", "Mic 2 B", "Mic B Source"},
 633        {"Mic B Pre Amp", "MPB", "Mic B Source"},
 634        {"Mic B Source", NULL, "MIC2B"},
 635
 636        /* headphone capture */
 637        {"Capture Headphone Mux", "Stereo", "Capture Mixer"},
 638        {"Capture Headphone Mux", "Left", "Left Capture Source"},
 639        {"Capture Headphone Mux", "Right", "Right Capture Source"},
 640
 641        /* mono capture */
 642        {"Capture Mono Mux", "Stereo", "Capture Mixer"},
 643        {"Capture Mono Mux", "Left", "Left Capture Source"},
 644        {"Capture Mono Mux", "Right", "Right Capture Source"},
 645};
 646
 647static int wm9713_add_widgets(struct snd_soc_codec *codec)
 648{
 649        struct snd_soc_dapm_context *dapm = &codec->dapm;
 650
 651        snd_soc_dapm_new_controls(dapm, wm9713_dapm_widgets,
 652                                  ARRAY_SIZE(wm9713_dapm_widgets));
 653
 654        snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map));
 655
 656        return 0;
 657}
 658
 659static unsigned int ac97_read(struct snd_soc_codec *codec,
 660        unsigned int reg)
 661{
 662        u16 *cache = codec->reg_cache;
 663
 664        if (reg == AC97_RESET || reg == AC97_GPIO_STATUS ||
 665                reg == AC97_VENDOR_ID1 || reg == AC97_VENDOR_ID2 ||
 666                reg == AC97_CD)
 667                return soc_ac97_ops.read(codec->ac97, reg);
 668        else {
 669                reg = reg >> 1;
 670
 671                if (reg >= (ARRAY_SIZE(wm9713_reg)))
 672                        return -EIO;
 673
 674                return cache[reg];
 675        }
 676}
 677
 678static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
 679        unsigned int val)
 680{
 681        u16 *cache = codec->reg_cache;
 682        if (reg < 0x7c)
 683                soc_ac97_ops.write(codec->ac97, reg, val);
 684        reg = reg >> 1;
 685        if (reg < (ARRAY_SIZE(wm9713_reg)))
 686                cache[reg] = val;
 687
 688        return 0;
 689}
 690
 691/* PLL divisors */
 692struct _pll_div {
 693        u32 divsel:1;
 694        u32 divctl:1;
 695        u32 lf:1;
 696        u32 n:4;
 697        u32 k:24;
 698};
 699
 700/* The size in bits of the PLL divide multiplied by 10
 701 * to allow rounding later */
 702#define FIXED_PLL_SIZE ((1 << 22) * 10)
 703
 704static void pll_factors(struct _pll_div *pll_div, unsigned int source)
 705{
 706        u64 Kpart;
 707        unsigned int K, Ndiv, Nmod, target;
 708
 709        /* The the PLL output is always 98.304MHz. */
 710        target = 98304000;
 711
 712        /* If the input frequency is over 14.4MHz then scale it down. */
 713        if (source > 14400000) {
 714                source >>= 1;
 715                pll_div->divsel = 1;
 716
 717                if (source > 14400000) {
 718                        source >>= 1;
 719                        pll_div->divctl = 1;
 720                } else
 721                        pll_div->divctl = 0;
 722
 723        } else {
 724                pll_div->divsel = 0;
 725                pll_div->divctl = 0;
 726        }
 727
 728        /* Low frequency sources require an additional divide in the
 729         * loop.
 730         */
 731        if (source < 8192000) {
 732                pll_div->lf = 1;
 733                target >>= 2;
 734        } else
 735                pll_div->lf = 0;
 736
 737        Ndiv = target / source;
 738        if ((Ndiv < 5) || (Ndiv > 12))
 739                printk(KERN_WARNING
 740                        "WM9713 PLL N value %u out of recommended range!\n",
 741                        Ndiv);
 742
 743        pll_div->n = Ndiv;
 744        Nmod = target % source;
 745        Kpart = FIXED_PLL_SIZE * (long long)Nmod;
 746
 747        do_div(Kpart, source);
 748
 749        K = Kpart & 0xFFFFFFFF;
 750
 751        /* Check if we need to round */
 752        if ((K % 10) >= 5)
 753                K += 5;
 754
 755        /* Move down to proper range now rounding is done */
 756        K /= 10;
 757
 758        pll_div->k = K;
 759}
 760
 761/**
 762 * Please note that changing the PLL input frequency may require
 763 * resynchronisation with the AC97 controller.
 764 */
 765static int wm9713_set_pll(struct snd_soc_codec *codec,
 766        int pll_id, unsigned int freq_in, unsigned int freq_out)
 767{
 768        struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
 769        u16 reg, reg2;
 770        struct _pll_div pll_div;
 771
 772        /* turn PLL off ? */
 773        if (freq_in == 0) {
 774                /* disable PLL power and select ext source */
 775                reg = ac97_read(codec, AC97_HANDSET_RATE);
 776                ac97_write(codec, AC97_HANDSET_RATE, reg | 0x0080);
 777                reg = ac97_read(codec, AC97_EXTENDED_MID);
 778                ac97_write(codec, AC97_EXTENDED_MID, reg | 0x0200);
 779                wm9713->pll_in = 0;
 780                return 0;
 781        }
 782
 783        pll_factors(&pll_div, freq_in);
 784
 785        if (pll_div.k == 0) {
 786                reg = (pll_div.n << 12) | (pll_div.lf << 11) |
 787                        (pll_div.divsel << 9) | (pll_div.divctl << 8);
 788                ac97_write(codec, AC97_LINE1_LEVEL, reg);
 789        } else {
 790                /* write the fractional k to the reg 0x46 pages */
 791                reg2 = (pll_div.n << 12) | (pll_div.lf << 11) | (1 << 10) |
 792                        (pll_div.divsel << 9) | (pll_div.divctl << 8);
 793
 794                /* K [21:20] */
 795                reg = reg2 | (0x5 << 4) | (pll_div.k >> 20);
 796                ac97_write(codec, AC97_LINE1_LEVEL, reg);
 797
 798                /* K [19:16] */
 799                reg = reg2 | (0x4 << 4) | ((pll_div.k >> 16) & 0xf);
 800                ac97_write(codec, AC97_LINE1_LEVEL, reg);
 801
 802                /* K [15:12] */
 803                reg = reg2 | (0x3 << 4) | ((pll_div.k >> 12) & 0xf);
 804                ac97_write(codec, AC97_LINE1_LEVEL, reg);
 805
 806                /* K [11:8] */
 807                reg = reg2 | (0x2 << 4) | ((pll_div.k >> 8) & 0xf);
 808                ac97_write(codec, AC97_LINE1_LEVEL, reg);
 809
 810                /* K [7:4] */
 811                reg = reg2 | (0x1 << 4) | ((pll_div.k >> 4) & 0xf);
 812                ac97_write(codec, AC97_LINE1_LEVEL, reg);
 813
 814                reg = reg2 | (0x0 << 4) | (pll_div.k & 0xf); /* K [3:0] */
 815                ac97_write(codec, AC97_LINE1_LEVEL, reg);
 816        }
 817
 818        /* turn PLL on and select as source */
 819        reg = ac97_read(codec, AC97_EXTENDED_MID);
 820        ac97_write(codec, AC97_EXTENDED_MID, reg & 0xfdff);
 821        reg = ac97_read(codec, AC97_HANDSET_RATE);
 822        ac97_write(codec, AC97_HANDSET_RATE, reg & 0xff7f);
 823        wm9713->pll_in = freq_in;
 824
 825        /* wait 10ms AC97 link frames for the link to stabilise */
 826        schedule_timeout_interruptible(msecs_to_jiffies(10));
 827        return 0;
 828}
 829
 830static int wm9713_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
 831                int source, unsigned int freq_in, unsigned int freq_out)
 832{
 833        struct snd_soc_codec *codec = codec_dai->codec;
 834        return wm9713_set_pll(codec, pll_id, freq_in, freq_out);
 835}
 836
 837/*
 838 * Tristate the PCM DAI lines, tristate can be disabled by calling
 839 * wm9713_set_dai_fmt()
 840 */
 841static int wm9713_set_dai_tristate(struct snd_soc_dai *codec_dai,
 842        int tristate)
 843{
 844        struct snd_soc_codec *codec = codec_dai->codec;
 845        u16 reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0x9fff;
 846
 847        if (tristate)
 848                ac97_write(codec, AC97_CENTER_LFE_MASTER, reg);
 849
 850        return 0;
 851}
 852
 853/*
 854 * Configure WM9713 clock dividers.
 855 * Voice DAC needs 256 FS
 856 */
 857static int wm9713_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
 858                int div_id, int div)
 859{
 860        struct snd_soc_codec *codec = codec_dai->codec;
 861        u16 reg;
 862
 863        switch (div_id) {
 864        case WM9713_PCMCLK_DIV:
 865                reg = ac97_read(codec, AC97_HANDSET_RATE) & 0xf0ff;
 866                ac97_write(codec, AC97_HANDSET_RATE, reg | div);
 867                break;
 868        case WM9713_CLKA_MULT:
 869                reg = ac97_read(codec, AC97_HANDSET_RATE) & 0xfffd;
 870                ac97_write(codec, AC97_HANDSET_RATE, reg | div);
 871                break;
 872        case WM9713_CLKB_MULT:
 873                reg = ac97_read(codec, AC97_HANDSET_RATE) & 0xfffb;
 874                ac97_write(codec, AC97_HANDSET_RATE, reg | div);
 875                break;
 876        case WM9713_HIFI_DIV:
 877                reg = ac97_read(codec, AC97_HANDSET_RATE) & 0x8fff;
 878                ac97_write(codec, AC97_HANDSET_RATE, reg | div);
 879                break;
 880        case WM9713_PCMBCLK_DIV:
 881                reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0xf1ff;
 882                ac97_write(codec, AC97_CENTER_LFE_MASTER, reg | div);
 883                break;
 884        case WM9713_PCMCLK_PLL_DIV:
 885                reg = ac97_read(codec, AC97_LINE1_LEVEL) & 0xff80;
 886                ac97_write(codec, AC97_LINE1_LEVEL, reg | 0x60 | div);
 887                break;
 888        case WM9713_HIFI_PLL_DIV:
 889                reg = ac97_read(codec, AC97_LINE1_LEVEL) & 0xff80;
 890                ac97_write(codec, AC97_LINE1_LEVEL, reg | 0x70 | div);
 891                break;
 892        default:
 893                return -EINVAL;
 894        }
 895
 896        return 0;
 897}
 898
 899static int wm9713_set_dai_fmt(struct snd_soc_dai *codec_dai,
 900                unsigned int fmt)
 901{
 902        struct snd_soc_codec *codec = codec_dai->codec;
 903        u16 gpio = ac97_read(codec, AC97_GPIO_CFG) & 0xffc5;
 904        u16 reg = 0x8000;
 905
 906        /* clock masters */
 907        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 908        case SND_SOC_DAIFMT_CBM_CFM:
 909                reg |= 0x4000;
 910                gpio |= 0x0010;
 911                break;
 912        case SND_SOC_DAIFMT_CBM_CFS:
 913                reg |= 0x6000;
 914                gpio |= 0x0018;
 915                break;
 916        case SND_SOC_DAIFMT_CBS_CFS:
 917                reg |= 0x2000;
 918                gpio |= 0x001a;
 919                break;
 920        case SND_SOC_DAIFMT_CBS_CFM:
 921                gpio |= 0x0012;
 922                break;
 923        }
 924
 925        /* clock inversion */
 926        switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 927        case SND_SOC_DAIFMT_IB_IF:
 928                reg |= 0x00c0;
 929                break;
 930        case SND_SOC_DAIFMT_IB_NF:
 931                reg |= 0x0080;
 932                break;
 933        case SND_SOC_DAIFMT_NB_IF:
 934                reg |= 0x0040;
 935                break;
 936        }
 937
 938        /* DAI format */
 939        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 940        case SND_SOC_DAIFMT_I2S:
 941                reg |= 0x0002;
 942                break;
 943        case SND_SOC_DAIFMT_RIGHT_J:
 944                break;
 945        case SND_SOC_DAIFMT_LEFT_J:
 946                reg |= 0x0001;
 947                break;
 948        case SND_SOC_DAIFMT_DSP_A:
 949                reg |= 0x0003;
 950                break;
 951        case SND_SOC_DAIFMT_DSP_B:
 952                reg |= 0x0043;
 953                break;
 954        }
 955
 956        ac97_write(codec, AC97_GPIO_CFG, gpio);
 957        ac97_write(codec, AC97_CENTER_LFE_MASTER, reg);
 958        return 0;
 959}
 960
 961static int wm9713_pcm_hw_params(struct snd_pcm_substream *substream,
 962                                struct snd_pcm_hw_params *params,
 963                                struct snd_soc_dai *dai)
 964{
 965        struct snd_soc_codec *codec = dai->codec;
 966        u16 reg = ac97_read(codec, AC97_CENTER_LFE_MASTER) & 0xfff3;
 967
 968        switch (params_format(params)) {
 969        case SNDRV_PCM_FORMAT_S16_LE:
 970                break;
 971        case SNDRV_PCM_FORMAT_S20_3LE:
 972                reg |= 0x0004;
 973                break;
 974        case SNDRV_PCM_FORMAT_S24_LE:
 975                reg |= 0x0008;
 976                break;
 977        case SNDRV_PCM_FORMAT_S32_LE:
 978                reg |= 0x000c;
 979                break;
 980        }
 981
 982        /* enable PCM interface in master mode */
 983        ac97_write(codec, AC97_CENTER_LFE_MASTER, reg);
 984        return 0;
 985}
 986
 987static int ac97_hifi_prepare(struct snd_pcm_substream *substream,
 988                             struct snd_soc_dai *dai)
 989{
 990        struct snd_soc_codec *codec = dai->codec;
 991        struct snd_pcm_runtime *runtime = substream->runtime;
 992        int reg;
 993        u16 vra;
 994
 995        vra = ac97_read(codec, AC97_EXTENDED_STATUS);
 996        ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
 997
 998        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
 999                reg = AC97_PCM_FRONT_DAC_RATE;
1000        else
1001                reg = AC97_PCM_LR_ADC_RATE;
1002
1003        return ac97_write(codec, reg, runtime->rate);
1004}
1005
1006static int ac97_aux_prepare(struct snd_pcm_substream *substream,
1007                            struct snd_soc_dai *dai)
1008{
1009        struct snd_soc_codec *codec = dai->codec;
1010        struct snd_pcm_runtime *runtime = substream->runtime;
1011        u16 vra, xsle;
1012
1013        vra = ac97_read(codec, AC97_EXTENDED_STATUS);
1014        ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
1015        xsle = ac97_read(codec, AC97_PCI_SID);
1016        ac97_write(codec, AC97_PCI_SID, xsle | 0x8000);
1017
1018        if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
1019                return -ENODEV;
1020
1021        return ac97_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate);
1022}
1023
1024#define WM9713_RATES (SNDRV_PCM_RATE_8000  |    \
1025                      SNDRV_PCM_RATE_11025 |    \
1026                      SNDRV_PCM_RATE_22050 |    \
1027                      SNDRV_PCM_RATE_44100 |    \
1028                      SNDRV_PCM_RATE_48000)
1029
1030#define WM9713_PCM_RATES (SNDRV_PCM_RATE_8000  |        \
1031                          SNDRV_PCM_RATE_11025 |        \
1032                          SNDRV_PCM_RATE_16000 |        \
1033                          SNDRV_PCM_RATE_22050 |        \
1034                          SNDRV_PCM_RATE_44100 |        \
1035                          SNDRV_PCM_RATE_48000)
1036
1037#define WM9713_PCM_FORMATS \
1038        (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
1039         SNDRV_PCM_FORMAT_S24_LE)
1040
1041static struct snd_soc_dai_ops wm9713_dai_ops_hifi = {
1042        .prepare        = ac97_hifi_prepare,
1043        .set_clkdiv     = wm9713_set_dai_clkdiv,
1044        .set_pll        = wm9713_set_dai_pll,
1045};
1046
1047static struct snd_soc_dai_ops wm9713_dai_ops_aux = {
1048        .prepare        = ac97_aux_prepare,
1049        .set_clkdiv     = wm9713_set_dai_clkdiv,
1050        .set_pll        = wm9713_set_dai_pll,
1051};
1052
1053static struct snd_soc_dai_ops wm9713_dai_ops_voice = {
1054        .hw_params      = wm9713_pcm_hw_params,
1055        .set_clkdiv     = wm9713_set_dai_clkdiv,
1056        .set_pll        = wm9713_set_dai_pll,
1057        .set_fmt        = wm9713_set_dai_fmt,
1058        .set_tristate   = wm9713_set_dai_tristate,
1059};
1060
1061static struct snd_soc_dai_driver wm9713_dai[] = {
1062{
1063        .name = "wm9713-hifi",
1064        .ac97_control = 1,
1065        .playback = {
1066                .stream_name = "HiFi Playback",
1067                .channels_min = 1,
1068                .channels_max = 2,
1069                .rates = WM9713_RATES,
1070                .formats = SND_SOC_STD_AC97_FMTS,},
1071        .capture = {
1072                .stream_name = "HiFi Capture",
1073                .channels_min = 1,
1074                .channels_max = 2,
1075                .rates = WM9713_RATES,
1076                .formats = SND_SOC_STD_AC97_FMTS,},
1077        .ops = &wm9713_dai_ops_hifi,
1078        },
1079        {
1080        .name = "wm9713-aux",
1081        .playback = {
1082                .stream_name = "Aux Playback",
1083                .channels_min = 1,
1084                .channels_max = 1,
1085                .rates = WM9713_RATES,
1086                .formats = SND_SOC_STD_AC97_FMTS,},
1087        .ops = &wm9713_dai_ops_aux,
1088        },
1089        {
1090        .name = "wm9713-voice",
1091        .playback = {
1092                .stream_name = "Voice Playback",
1093                .channels_min = 1,
1094                .channels_max = 1,
1095                .rates = WM9713_PCM_RATES,
1096                .formats = WM9713_PCM_FORMATS,},
1097        .capture = {
1098                .stream_name = "Voice Capture",
1099                .channels_min = 1,
1100                .channels_max = 2,
1101                .rates = WM9713_PCM_RATES,
1102                .formats = WM9713_PCM_FORMATS,},
1103        .ops = &wm9713_dai_ops_voice,
1104        .symmetric_rates = 1,
1105        },
1106};
1107
1108int wm9713_reset(struct snd_soc_codec *codec, int try_warm)
1109{
1110        if (try_warm && soc_ac97_ops.warm_reset) {
1111                soc_ac97_ops.warm_reset(codec->ac97);
1112                if (ac97_read(codec, 0) == wm9713_reg[0])
1113                        return 1;
1114        }
1115
1116        soc_ac97_ops.reset(codec->ac97);
1117        if (soc_ac97_ops.warm_reset)
1118                soc_ac97_ops.warm_reset(codec->ac97);
1119        if (ac97_read(codec, 0) != wm9713_reg[0])
1120                return -EIO;
1121        return 0;
1122}
1123EXPORT_SYMBOL_GPL(wm9713_reset);
1124
1125static int wm9713_set_bias_level(struct snd_soc_codec *codec,
1126                                 enum snd_soc_bias_level level)
1127{
1128        u16 reg;
1129
1130        switch (level) {
1131        case SND_SOC_BIAS_ON:
1132                /* enable thermal shutdown */
1133                reg = ac97_read(codec, AC97_EXTENDED_MID) & 0x1bff;
1134                ac97_write(codec, AC97_EXTENDED_MID, reg);
1135                break;
1136        case SND_SOC_BIAS_PREPARE:
1137                break;
1138        case SND_SOC_BIAS_STANDBY:
1139                /* enable master bias and vmid */
1140                reg = ac97_read(codec, AC97_EXTENDED_MID) & 0x3bff;
1141                ac97_write(codec, AC97_EXTENDED_MID, reg);
1142                ac97_write(codec, AC97_POWERDOWN, 0x0000);
1143                break;
1144        case SND_SOC_BIAS_OFF:
1145                /* disable everything including AC link */
1146                ac97_write(codec, AC97_EXTENDED_MID, 0xffff);
1147                ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);
1148                ac97_write(codec, AC97_POWERDOWN, 0xffff);
1149                break;
1150        }
1151        codec->dapm.bias_level = level;
1152        return 0;
1153}
1154
1155static int wm9713_soc_suspend(struct snd_soc_codec *codec,
1156        pm_message_t state)
1157{
1158        u16 reg;
1159
1160        /* Disable everything except touchpanel - that will be handled
1161         * by the touch driver and left disabled if touch is not in
1162         * use. */
1163        reg = ac97_read(codec, AC97_EXTENDED_MID);
1164        ac97_write(codec, AC97_EXTENDED_MID, reg | 0x7fff);
1165        ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);
1166        ac97_write(codec, AC97_POWERDOWN, 0x6f00);
1167        ac97_write(codec, AC97_POWERDOWN, 0xffff);
1168
1169        return 0;
1170}
1171
1172static int wm9713_soc_resume(struct snd_soc_codec *codec)
1173{
1174        struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
1175        int i, ret;
1176        u16 *cache = codec->reg_cache;
1177
1178        ret = wm9713_reset(codec, 1);
1179        if (ret < 0) {
1180                printk(KERN_ERR "could not reset AC97 codec\n");
1181                return ret;
1182        }
1183
1184        wm9713_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
1185
1186        /* do we need to re-start the PLL ? */
1187        if (wm9713->pll_in)
1188                wm9713_set_pll(codec, 0, wm9713->pll_in, 0);
1189
1190        /* only synchronise the codec if warm reset failed */
1191        if (ret == 0) {
1192                for (i = 2; i < ARRAY_SIZE(wm9713_reg) << 1; i += 2) {
1193                        if (i == AC97_POWERDOWN || i == AC97_EXTENDED_MID ||
1194                                i == AC97_EXTENDED_MSTATUS || i > 0x66)
1195                                continue;
1196                        soc_ac97_ops.write(codec->ac97, i, cache[i>>1]);
1197                }
1198        }
1199
1200        return ret;
1201}
1202
1203static int wm9713_soc_probe(struct snd_soc_codec *codec)
1204{
1205        struct wm9713_priv *wm9713;
1206        int ret = 0, reg;
1207
1208        wm9713 = kzalloc(sizeof(struct wm9713_priv), GFP_KERNEL);
1209        if (wm9713 == NULL)
1210                return -ENOMEM;
1211        snd_soc_codec_set_drvdata(codec, wm9713);
1212
1213        ret = snd_soc_new_ac97_codec(codec, &soc_ac97_ops, 0);
1214        if (ret < 0)
1215                goto codec_err;
1216
1217        /* do a cold reset for the controller and then try
1218         * a warm reset followed by an optional cold reset for codec */
1219        wm9713_reset(codec, 0);
1220        ret = wm9713_reset(codec, 1);
1221        if (ret < 0) {
1222                printk(KERN_ERR "Failed to reset WM9713: AC97 link error\n");
1223                goto reset_err;
1224        }
1225
1226        wm9713_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
1227
1228        /* unmute the adc - move to kcontrol */
1229        reg = ac97_read(codec, AC97_CD) & 0x7fff;
1230        ac97_write(codec, AC97_CD, reg);
1231
1232        snd_soc_add_controls(codec, wm9713_snd_ac97_controls,
1233                                ARRAY_SIZE(wm9713_snd_ac97_controls));
1234        wm9713_add_widgets(codec);
1235
1236        return 0;
1237
1238reset_err:
1239        snd_soc_free_ac97_codec(codec);
1240codec_err:
1241        kfree(wm9713);
1242        return ret;
1243}
1244
1245static int wm9713_soc_remove(struct snd_soc_codec *codec)
1246{
1247        struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec);
1248        snd_soc_free_ac97_codec(codec);
1249        kfree(wm9713);
1250        return 0;
1251}
1252
1253static struct snd_soc_codec_driver soc_codec_dev_wm9713 = {
1254        .probe =        wm9713_soc_probe,
1255        .remove =       wm9713_soc_remove,
1256        .suspend =      wm9713_soc_suspend,
1257        .resume =       wm9713_soc_resume,
1258        .read = ac97_read,
1259        .write = ac97_write,
1260        .set_bias_level = wm9713_set_bias_level,
1261        .reg_cache_size = ARRAY_SIZE(wm9713_reg),
1262        .reg_word_size = sizeof(u16),
1263        .reg_cache_step = 2,
1264        .reg_cache_default = wm9713_reg,
1265};
1266
1267static __devinit int wm9713_probe(struct platform_device *pdev)
1268{
1269        return snd_soc_register_codec(&pdev->dev,
1270                        &soc_codec_dev_wm9713, wm9713_dai, ARRAY_SIZE(wm9713_dai));
1271}
1272
1273static int __devexit wm9713_remove(struct platform_device *pdev)
1274{
1275        snd_soc_unregister_codec(&pdev->dev);
1276        return 0;
1277}
1278
1279static struct platform_driver wm9713_codec_driver = {
1280        .driver = {
1281                        .name = "wm9713-codec",
1282                        .owner = THIS_MODULE,
1283        },
1284
1285        .probe = wm9713_probe,
1286        .remove = __devexit_p(wm9713_remove),
1287};
1288
1289static int __init wm9713_init(void)
1290{
1291        return platform_driver_register(&wm9713_codec_driver);
1292}
1293module_init(wm9713_init);
1294
1295static void __exit wm9713_exit(void)
1296{
1297        platform_driver_unregister(&wm9713_codec_driver);
1298}
1299module_exit(wm9713_exit);
1300
1301MODULE_DESCRIPTION("ASoC WM9713/WM9714 driver");
1302MODULE_AUTHOR("Liam Girdwood");
1303MODULE_LICENSE("GPL");
1304