linux/sound/soc/codecs/wm8753.c
<<
>>
Prefs
   1/*
   2 * wm8753.c  --  WM8753 ALSA Soc Audio driver
   3 *
   4 * Copyright 2003-11 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 * Notes:
  13 *  The WM8753 is a low power, high quality stereo codec with integrated PCM
  14 *  codec designed for portable digital telephony applications.
  15 *
  16 * Dual DAI:-
  17 *
  18 * This driver support 2 DAI PCM's. This makes the default PCM available for
  19 * HiFi audio (e.g. MP3, ogg) playback/capture and the other PCM available for
  20 * voice.
  21 *
  22 * Please note that the voice PCM can be connected directly to a Bluetooth
  23 * codec or GSM modem and thus cannot be read or written to, although it is
  24 * available to be configured with snd_hw_params(), etc and kcontrols in the
  25 * normal alsa manner.
  26 *
  27 * Fast DAI switching:-
  28 *
  29 * The driver can now fast switch between the DAI configurations via a
  30 * an alsa kcontrol. This allows the PCM to remain open.
  31 *
  32 */
  33
  34#include <linux/module.h>
  35#include <linux/kernel.h>
  36#include <linux/init.h>
  37#include <linux/delay.h>
  38#include <linux/pm.h>
  39#include <linux/i2c.h>
  40#include <linux/of_device.h>
  41#include <linux/regmap.h>
  42#include <linux/spi/spi.h>
  43#include <linux/slab.h>
  44#include <sound/core.h>
  45#include <sound/pcm.h>
  46#include <sound/pcm_params.h>
  47#include <sound/soc.h>
  48#include <sound/initval.h>
  49#include <sound/tlv.h>
  50#include <asm/div64.h>
  51
  52#include "wm8753.h"
  53
  54static int caps_charge = 2000;
  55module_param(caps_charge, int, 0);
  56MODULE_PARM_DESC(caps_charge, "WM8753 cap charge time (msecs)");
  57
  58static int wm8753_hifi_write_dai_fmt(struct snd_soc_codec *codec,
  59                unsigned int fmt);
  60static int wm8753_voice_write_dai_fmt(struct snd_soc_codec *codec,
  61                unsigned int fmt);
  62
  63/*
  64 * wm8753 register cache
  65 * We can't read the WM8753 register space when we
  66 * are using 2 wire for device control, so we cache them instead.
  67 */
  68static const struct reg_default wm8753_reg_defaults[] = {
  69        { 0x00, 0x0000 },
  70        { 0x01, 0x0008 },
  71        { 0x02, 0x0000 },
  72        { 0x03, 0x000a },
  73        { 0x04, 0x000a },
  74        { 0x05, 0x0033 },
  75        { 0x06, 0x0000 },
  76        { 0x07, 0x0007 },
  77        { 0x08, 0x00ff },
  78        { 0x09, 0x00ff },
  79        { 0x0a, 0x000f },
  80        { 0x0b, 0x000f },
  81        { 0x0c, 0x007b },
  82        { 0x0d, 0x0000 },
  83        { 0x0e, 0x0032 },
  84        { 0x0f, 0x0000 },
  85        { 0x10, 0x00c3 },
  86        { 0x11, 0x00c3 },
  87        { 0x12, 0x00c0 },
  88        { 0x13, 0x0000 },
  89        { 0x14, 0x0000 },
  90        { 0x15, 0x0000 },
  91        { 0x16, 0x0000 },
  92        { 0x17, 0x0000 },
  93        { 0x18, 0x0000 },
  94        { 0x19, 0x0000 },
  95        { 0x1a, 0x0000 },
  96        { 0x1b, 0x0000 },
  97        { 0x1c, 0x0000 },
  98        { 0x1d, 0x0000 },
  99        { 0x1e, 0x0000 },
 100        { 0x1f, 0x0000 },
 101        { 0x20, 0x0055 },
 102        { 0x21, 0x0005 },
 103        { 0x22, 0x0050 },
 104        { 0x23, 0x0055 },
 105        { 0x24, 0x0050 },
 106        { 0x25, 0x0055 },
 107        { 0x26, 0x0050 },
 108        { 0x27, 0x0055 },
 109        { 0x28, 0x0079 },
 110        { 0x29, 0x0079 },
 111        { 0x2a, 0x0079 },
 112        { 0x2b, 0x0079 },
 113        { 0x2c, 0x0079 },
 114        { 0x2d, 0x0000 },
 115        { 0x2e, 0x0000 },
 116        { 0x2f, 0x0000 },
 117        { 0x30, 0x0000 },
 118        { 0x31, 0x0097 },
 119        { 0x32, 0x0097 },
 120        { 0x33, 0x0000 },
 121        { 0x34, 0x0004 },
 122        { 0x35, 0x0000 },
 123        { 0x36, 0x0083 },
 124        { 0x37, 0x0024 },
 125        { 0x38, 0x01ba },
 126        { 0x39, 0x0000 },
 127        { 0x3a, 0x0083 },
 128        { 0x3b, 0x0024 },
 129        { 0x3c, 0x01ba },
 130        { 0x3d, 0x0000 },
 131        { 0x3e, 0x0000 },
 132        { 0x3f, 0x0000 },
 133};
 134
 135static bool wm8753_volatile(struct device *dev, unsigned int reg)
 136{
 137        return reg == WM8753_RESET;
 138}
 139
 140/* codec private data */
 141struct wm8753_priv {
 142        struct regmap *regmap;
 143        unsigned int sysclk;
 144        unsigned int pcmclk;
 145
 146        unsigned int voice_fmt;
 147        unsigned int hifi_fmt;
 148
 149        int dai_func;
 150        struct delayed_work charge_work;
 151};
 152
 153#define wm8753_reset(c) snd_soc_write(c, WM8753_RESET, 0)
 154
 155/*
 156 * WM8753 Controls
 157 */
 158static const char *wm8753_base[] = {"Linear Control", "Adaptive Boost"};
 159static const char *wm8753_base_filter[] =
 160        {"130Hz @ 48kHz", "200Hz @ 48kHz", "100Hz @ 16kHz", "400Hz @ 48kHz",
 161        "100Hz @ 8kHz", "200Hz @ 8kHz"};
 162static const char *wm8753_treble[] = {"8kHz", "4kHz"};
 163static const char *wm8753_alc_func[] = {"Off", "Right", "Left", "Stereo"};
 164static const char *wm8753_ng_type[] = {"Constant PGA Gain", "Mute ADC Output"};
 165static const char *wm8753_3d_func[] = {"Capture", "Playback"};
 166static const char *wm8753_3d_uc[] = {"2.2kHz", "1.5kHz"};
 167static const char *wm8753_3d_lc[] = {"200Hz", "500Hz"};
 168static const char *wm8753_deemp[] = {"None", "32kHz", "44.1kHz", "48kHz"};
 169static const char *wm8753_mono_mix[] = {"Stereo", "Left", "Right", "Mono"};
 170static const char *wm8753_dac_phase[] = {"Non Inverted", "Inverted"};
 171static const char *wm8753_line_mix[] = {"Line 1 + 2", "Line 1 - 2",
 172        "Line 1", "Line 2"};
 173static const char *wm8753_mono_mux[] = {"Line Mix", "Rx Mix"};
 174static const char *wm8753_right_mux[] = {"Line 2", "Rx Mix"};
 175static const char *wm8753_left_mux[] = {"Line 1", "Rx Mix"};
 176static const char *wm8753_rxmsel[] = {"RXP - RXN", "RXP + RXN", "RXP", "RXN"};
 177static const char *wm8753_sidetone_mux[] = {"Left PGA", "Mic 1", "Mic 2",
 178        "Right PGA"};
 179static const char *wm8753_mono2_src[] = {"Inverted Mono 1", "Left", "Right",
 180        "Left + Right"};
 181static const char *wm8753_out3[] = {"VREF", "ROUT2", "Left + Right"};
 182static const char *wm8753_out4[] = {"VREF", "Capture ST", "LOUT2"};
 183static const char *wm8753_radcsel[] = {"PGA", "Line or RXP-RXN", "Sidetone"};
 184static const char *wm8753_ladcsel[] = {"PGA", "Line or RXP-RXN", "Line"};
 185static const char *wm8753_mono_adc[] = {"Stereo", "Analogue Mix Left",
 186        "Analogue Mix Right", "Digital Mono Mix"};
 187static const char *wm8753_adc_hp[] = {"3.4Hz @ 48kHz", "82Hz @ 16k",
 188        "82Hz @ 8kHz", "170Hz @ 8kHz"};
 189static const char *wm8753_adc_filter[] = {"HiFi", "Voice"};
 190static const char *wm8753_mic_sel[] = {"Mic 1", "Mic 2", "Mic 3"};
 191static const char *wm8753_dai_mode[] = {"DAI 0", "DAI 1", "DAI 2", "DAI 3"};
 192static const char *wm8753_dat_sel[] = {"Stereo", "Left ADC", "Right ADC",
 193        "Channel Swap"};
 194static const char *wm8753_rout2_phase[] = {"Non Inverted", "Inverted"};
 195
 196static const struct soc_enum wm8753_enum[] = {
 197SOC_ENUM_SINGLE(WM8753_BASS, 7, 2, wm8753_base),
 198SOC_ENUM_SINGLE(WM8753_BASS, 4, 6, wm8753_base_filter),
 199SOC_ENUM_SINGLE(WM8753_TREBLE, 6, 2, wm8753_treble),
 200SOC_ENUM_SINGLE(WM8753_ALC1, 7, 4, wm8753_alc_func),
 201SOC_ENUM_SINGLE(WM8753_NGATE, 1, 2, wm8753_ng_type),
 202SOC_ENUM_SINGLE(WM8753_3D, 7, 2, wm8753_3d_func),
 203SOC_ENUM_SINGLE(WM8753_3D, 6, 2, wm8753_3d_uc),
 204SOC_ENUM_SINGLE(WM8753_3D, 5, 2, wm8753_3d_lc),
 205SOC_ENUM_SINGLE(WM8753_DAC, 1, 4, wm8753_deemp),
 206SOC_ENUM_SINGLE(WM8753_DAC, 4, 4, wm8753_mono_mix),
 207SOC_ENUM_SINGLE(WM8753_DAC, 6, 2, wm8753_dac_phase),
 208SOC_ENUM_SINGLE(WM8753_INCTL1, 3, 4, wm8753_line_mix),
 209SOC_ENUM_SINGLE(WM8753_INCTL1, 2, 2, wm8753_mono_mux),
 210SOC_ENUM_SINGLE(WM8753_INCTL1, 1, 2, wm8753_right_mux),
 211SOC_ENUM_SINGLE(WM8753_INCTL1, 0, 2, wm8753_left_mux),
 212SOC_ENUM_SINGLE(WM8753_INCTL2, 6, 4, wm8753_rxmsel),
 213SOC_ENUM_SINGLE(WM8753_INCTL2, 4, 4, wm8753_sidetone_mux),
 214SOC_ENUM_SINGLE(WM8753_OUTCTL, 7, 4, wm8753_mono2_src),
 215SOC_ENUM_SINGLE(WM8753_OUTCTL, 0, 3, wm8753_out3),
 216SOC_ENUM_SINGLE(WM8753_ADCTL2, 7, 3, wm8753_out4),
 217SOC_ENUM_SINGLE(WM8753_ADCIN, 2, 3, wm8753_radcsel),
 218SOC_ENUM_SINGLE(WM8753_ADCIN, 0, 3, wm8753_ladcsel),
 219SOC_ENUM_SINGLE(WM8753_ADCIN, 4, 4, wm8753_mono_adc),
 220SOC_ENUM_SINGLE(WM8753_ADC, 2, 4, wm8753_adc_hp),
 221SOC_ENUM_SINGLE(WM8753_ADC, 4, 2, wm8753_adc_filter),
 222SOC_ENUM_SINGLE(WM8753_MICBIAS, 6, 3, wm8753_mic_sel),
 223SOC_ENUM_SINGLE(WM8753_IOCTL, 2, 4, wm8753_dai_mode),
 224SOC_ENUM_SINGLE(WM8753_ADC, 7, 4, wm8753_dat_sel),
 225SOC_ENUM_SINGLE(WM8753_OUTCTL, 2, 2, wm8753_rout2_phase),
 226};
 227
 228
 229static int wm8753_get_dai(struct snd_kcontrol *kcontrol,
 230        struct snd_ctl_elem_value *ucontrol)
 231{
 232        struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
 233        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
 234
 235        ucontrol->value.enumerated.item[0] = wm8753->dai_func;
 236        return 0;
 237}
 238
 239static int wm8753_set_dai(struct snd_kcontrol *kcontrol,
 240        struct snd_ctl_elem_value *ucontrol)
 241{
 242        struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
 243        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
 244        u16 ioctl;
 245
 246        if (wm8753->dai_func == ucontrol->value.enumerated.item[0])
 247                return 0;
 248
 249        if (snd_soc_codec_is_active(codec))
 250                return -EBUSY;
 251
 252        ioctl = snd_soc_read(codec, WM8753_IOCTL);
 253
 254        wm8753->dai_func = ucontrol->value.enumerated.item[0];
 255
 256        if (((ioctl >> 2) & 0x3) == wm8753->dai_func)
 257                return 1;
 258
 259        ioctl = (ioctl & 0x1f3) | (wm8753->dai_func << 2);
 260        snd_soc_write(codec, WM8753_IOCTL, ioctl);
 261
 262
 263        wm8753_hifi_write_dai_fmt(codec, wm8753->hifi_fmt);
 264        wm8753_voice_write_dai_fmt(codec, wm8753->voice_fmt);
 265
 266        return 1;
 267}
 268
 269static const DECLARE_TLV_DB_SCALE(rec_mix_tlv, -1500, 300, 0);
 270static const DECLARE_TLV_DB_SCALE(mic_preamp_tlv, 1200, 600, 0);
 271static const DECLARE_TLV_DB_SCALE(adc_tlv, -9750, 50, 1);
 272static const DECLARE_TLV_DB_SCALE(dac_tlv, -12750, 50, 1);
 273static const DECLARE_TLV_DB_RANGE(out_tlv,
 274        /* 0000000 - 0101111 = "Analogue mute" */
 275        0, 48, TLV_DB_SCALE_ITEM(-25500, 0, 0),
 276        48, 127, TLV_DB_SCALE_ITEM(-7300, 100, 0)
 277);
 278static const DECLARE_TLV_DB_SCALE(mix_tlv, -1500, 300, 0);
 279static const DECLARE_TLV_DB_SCALE(voice_mix_tlv, -1200, 300, 0);
 280static const DECLARE_TLV_DB_SCALE(pga_tlv, -1725, 75, 0);
 281
 282static const struct snd_kcontrol_new wm8753_snd_controls[] = {
 283SOC_SINGLE("Hi-Fi DAC Left/Right channel Swap", WM8753_HIFI, 5, 1, 0),
 284SOC_DOUBLE_R_TLV("PCM Volume", WM8753_LDAC, WM8753_RDAC, 0, 255, 0, dac_tlv),
 285
 286SOC_DOUBLE_R_TLV("ADC Capture Volume", WM8753_LADC, WM8753_RADC, 0, 255, 0,
 287                 adc_tlv),
 288
 289SOC_DOUBLE_R_TLV("Headphone Playback Volume", WM8753_LOUT1V, WM8753_ROUT1V,
 290                 0, 127, 0, out_tlv),
 291SOC_DOUBLE_R_TLV("Speaker Playback Volume", WM8753_LOUT2V, WM8753_ROUT2V, 0,
 292                 127, 0, out_tlv),
 293
 294SOC_SINGLE_TLV("Mono Playback Volume", WM8753_MOUTV, 0, 127, 0, out_tlv),
 295
 296SOC_DOUBLE_R_TLV("Bypass Playback Volume", WM8753_LOUTM1, WM8753_ROUTM1, 4, 7,
 297                 1, mix_tlv),
 298SOC_DOUBLE_R_TLV("Sidetone Playback Volume", WM8753_LOUTM2, WM8753_ROUTM2, 4,
 299                 7, 1, mix_tlv),
 300SOC_DOUBLE_R_TLV("Voice Playback Volume", WM8753_LOUTM2, WM8753_ROUTM2, 0, 7,
 301                 1, voice_mix_tlv),
 302
 303SOC_DOUBLE_R("Headphone Playback ZC Switch", WM8753_LOUT1V, WM8753_ROUT1V, 7,
 304             1, 0),
 305SOC_DOUBLE_R("Speaker Playback ZC Switch", WM8753_LOUT2V, WM8753_ROUT2V, 7,
 306             1, 0),
 307
 308SOC_SINGLE_TLV("Mono Bypass Playback Volume", WM8753_MOUTM1, 4, 7, 1, mix_tlv),
 309SOC_SINGLE_TLV("Mono Sidetone Playback Volume", WM8753_MOUTM2, 4, 7, 1,
 310               mix_tlv),
 311SOC_SINGLE_TLV("Mono Voice Playback Volume", WM8753_MOUTM2, 0, 7, 1,
 312               voice_mix_tlv),
 313SOC_SINGLE("Mono Playback ZC Switch", WM8753_MOUTV, 7, 1, 0),
 314
 315SOC_ENUM("Bass Boost", wm8753_enum[0]),
 316SOC_ENUM("Bass Filter", wm8753_enum[1]),
 317SOC_SINGLE("Bass Volume", WM8753_BASS, 0, 15, 1),
 318
 319SOC_SINGLE("Treble Volume", WM8753_TREBLE, 0, 15, 1),
 320SOC_ENUM("Treble Cut-off", wm8753_enum[2]),
 321
 322SOC_DOUBLE_TLV("Sidetone Capture Volume", WM8753_RECMIX1, 0, 4, 7, 1,
 323               rec_mix_tlv),
 324SOC_SINGLE_TLV("Voice Sidetone Capture Volume", WM8753_RECMIX2, 0, 7, 1,
 325               rec_mix_tlv),
 326
 327SOC_DOUBLE_R_TLV("Capture Volume", WM8753_LINVOL, WM8753_RINVOL, 0, 63, 0,
 328                 pga_tlv),
 329SOC_DOUBLE_R("Capture ZC Switch", WM8753_LINVOL, WM8753_RINVOL, 6, 1, 0),
 330SOC_DOUBLE_R("Capture Switch", WM8753_LINVOL, WM8753_RINVOL, 7, 1, 1),
 331
 332SOC_ENUM("Capture Filter Select", wm8753_enum[23]),
 333SOC_ENUM("Capture Filter Cut-off", wm8753_enum[24]),
 334SOC_SINGLE("Capture Filter Switch", WM8753_ADC, 0, 1, 1),
 335
 336SOC_SINGLE("ALC Capture Target Volume", WM8753_ALC1, 0, 7, 0),
 337SOC_SINGLE("ALC Capture Max Volume", WM8753_ALC1, 4, 7, 0),
 338SOC_ENUM("ALC Capture Function", wm8753_enum[3]),
 339SOC_SINGLE("ALC Capture ZC Switch", WM8753_ALC2, 8, 1, 0),
 340SOC_SINGLE("ALC Capture Hold Time", WM8753_ALC2, 0, 15, 1),
 341SOC_SINGLE("ALC Capture Decay Time", WM8753_ALC3, 4, 15, 1),
 342SOC_SINGLE("ALC Capture Attack Time", WM8753_ALC3, 0, 15, 0),
 343SOC_SINGLE("ALC Capture NG Threshold", WM8753_NGATE, 3, 31, 0),
 344SOC_ENUM("ALC Capture NG Type", wm8753_enum[4]),
 345SOC_SINGLE("ALC Capture NG Switch", WM8753_NGATE, 0, 1, 0),
 346
 347SOC_ENUM("3D Function", wm8753_enum[5]),
 348SOC_ENUM("3D Upper Cut-off", wm8753_enum[6]),
 349SOC_ENUM("3D Lower Cut-off", wm8753_enum[7]),
 350SOC_SINGLE("3D Volume", WM8753_3D, 1, 15, 0),
 351SOC_SINGLE("3D Switch", WM8753_3D, 0, 1, 0),
 352
 353SOC_SINGLE("Capture 6dB Attenuate", WM8753_ADCTL1, 2, 1, 0),
 354SOC_SINGLE("Playback 6dB Attenuate", WM8753_ADCTL1, 1, 1, 0),
 355
 356SOC_ENUM("De-emphasis", wm8753_enum[8]),
 357SOC_ENUM("Playback Mono Mix", wm8753_enum[9]),
 358SOC_ENUM("Playback Phase", wm8753_enum[10]),
 359
 360SOC_SINGLE_TLV("Mic2 Capture Volume", WM8753_INCTL1, 7, 3, 0, mic_preamp_tlv),
 361SOC_SINGLE_TLV("Mic1 Capture Volume", WM8753_INCTL1, 5, 3, 0, mic_preamp_tlv),
 362
 363SOC_ENUM_EXT("DAI Mode", wm8753_enum[26], wm8753_get_dai, wm8753_set_dai),
 364
 365SOC_ENUM("ADC Data Select", wm8753_enum[27]),
 366SOC_ENUM("ROUT2 Phase", wm8753_enum[28]),
 367};
 368
 369/*
 370 * _DAPM_ Controls
 371 */
 372
 373/* Left Mixer */
 374static const struct snd_kcontrol_new wm8753_left_mixer_controls[] = {
 375SOC_DAPM_SINGLE("Voice Playback Switch", WM8753_LOUTM2, 8, 1, 0),
 376SOC_DAPM_SINGLE("Sidetone Playback Switch", WM8753_LOUTM2, 7, 1, 0),
 377SOC_DAPM_SINGLE("Left Playback Switch", WM8753_LOUTM1, 8, 1, 0),
 378SOC_DAPM_SINGLE("Bypass Playback Switch", WM8753_LOUTM1, 7, 1, 0),
 379};
 380
 381/* Right mixer */
 382static const struct snd_kcontrol_new wm8753_right_mixer_controls[] = {
 383SOC_DAPM_SINGLE("Voice Playback Switch", WM8753_ROUTM2, 8, 1, 0),
 384SOC_DAPM_SINGLE("Sidetone Playback Switch", WM8753_ROUTM2, 7, 1, 0),
 385SOC_DAPM_SINGLE("Right Playback Switch", WM8753_ROUTM1, 8, 1, 0),
 386SOC_DAPM_SINGLE("Bypass Playback Switch", WM8753_ROUTM1, 7, 1, 0),
 387};
 388
 389/* Mono mixer */
 390static const struct snd_kcontrol_new wm8753_mono_mixer_controls[] = {
 391SOC_DAPM_SINGLE("Left Playback Switch", WM8753_MOUTM1, 8, 1, 0),
 392SOC_DAPM_SINGLE("Right Playback Switch", WM8753_MOUTM2, 8, 1, 0),
 393SOC_DAPM_SINGLE("Voice Playback Switch", WM8753_MOUTM2, 3, 1, 0),
 394SOC_DAPM_SINGLE("Sidetone Playback Switch", WM8753_MOUTM2, 7, 1, 0),
 395SOC_DAPM_SINGLE("Bypass Playback Switch", WM8753_MOUTM1, 7, 1, 0),
 396};
 397
 398/* Mono 2 Mux */
 399static const struct snd_kcontrol_new wm8753_mono2_controls =
 400SOC_DAPM_ENUM("Route", wm8753_enum[17]);
 401
 402/* Out 3 Mux */
 403static const struct snd_kcontrol_new wm8753_out3_controls =
 404SOC_DAPM_ENUM("Route", wm8753_enum[18]);
 405
 406/* Out 4 Mux */
 407static const struct snd_kcontrol_new wm8753_out4_controls =
 408SOC_DAPM_ENUM("Route", wm8753_enum[19]);
 409
 410/* ADC Mono Mix */
 411static const struct snd_kcontrol_new wm8753_adc_mono_controls =
 412SOC_DAPM_ENUM("Route", wm8753_enum[22]);
 413
 414/* Record mixer */
 415static const struct snd_kcontrol_new wm8753_record_mixer_controls[] = {
 416SOC_DAPM_SINGLE("Voice Capture Switch", WM8753_RECMIX2, 3, 1, 0),
 417SOC_DAPM_SINGLE("Left Capture Switch", WM8753_RECMIX1, 3, 1, 0),
 418SOC_DAPM_SINGLE("Right Capture Switch", WM8753_RECMIX1, 7, 1, 0),
 419};
 420
 421/* Left ADC mux */
 422static const struct snd_kcontrol_new wm8753_adc_left_controls =
 423SOC_DAPM_ENUM("Route", wm8753_enum[21]);
 424
 425/* Right ADC mux */
 426static const struct snd_kcontrol_new wm8753_adc_right_controls =
 427SOC_DAPM_ENUM("Route", wm8753_enum[20]);
 428
 429/* MIC mux */
 430static const struct snd_kcontrol_new wm8753_mic_mux_controls =
 431SOC_DAPM_ENUM("Route", wm8753_enum[16]);
 432
 433/* ALC mixer */
 434static const struct snd_kcontrol_new wm8753_alc_mixer_controls[] = {
 435SOC_DAPM_SINGLE("Line Capture Switch", WM8753_INCTL2, 3, 1, 0),
 436SOC_DAPM_SINGLE("Mic2 Capture Switch", WM8753_INCTL2, 2, 1, 0),
 437SOC_DAPM_SINGLE("Mic1 Capture Switch", WM8753_INCTL2, 1, 1, 0),
 438SOC_DAPM_SINGLE("Rx Capture Switch", WM8753_INCTL2, 0, 1, 0),
 439};
 440
 441/* Left Line mux */
 442static const struct snd_kcontrol_new wm8753_line_left_controls =
 443SOC_DAPM_ENUM("Route", wm8753_enum[14]);
 444
 445/* Right Line mux */
 446static const struct snd_kcontrol_new wm8753_line_right_controls =
 447SOC_DAPM_ENUM("Route", wm8753_enum[13]);
 448
 449/* Mono Line mux */
 450static const struct snd_kcontrol_new wm8753_line_mono_controls =
 451SOC_DAPM_ENUM("Route", wm8753_enum[12]);
 452
 453/* Line mux and mixer */
 454static const struct snd_kcontrol_new wm8753_line_mux_mix_controls =
 455SOC_DAPM_ENUM("Route", wm8753_enum[11]);
 456
 457/* Rx mux and mixer */
 458static const struct snd_kcontrol_new wm8753_rx_mux_mix_controls =
 459SOC_DAPM_ENUM("Route", wm8753_enum[15]);
 460
 461/* Mic Selector Mux */
 462static const struct snd_kcontrol_new wm8753_mic_sel_mux_controls =
 463SOC_DAPM_ENUM("Route", wm8753_enum[25]);
 464
 465static const struct snd_soc_dapm_widget wm8753_dapm_widgets[] = {
 466SND_SOC_DAPM_MICBIAS("Mic Bias", WM8753_PWR1, 5, 0),
 467SND_SOC_DAPM_MIXER("Left Mixer", WM8753_PWR4, 0, 0,
 468        &wm8753_left_mixer_controls[0], ARRAY_SIZE(wm8753_left_mixer_controls)),
 469SND_SOC_DAPM_PGA("Left Out 1", WM8753_PWR3, 8, 0, NULL, 0),
 470SND_SOC_DAPM_PGA("Left Out 2", WM8753_PWR3, 6, 0, NULL, 0),
 471SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", WM8753_PWR1, 3, 0),
 472SND_SOC_DAPM_OUTPUT("LOUT1"),
 473SND_SOC_DAPM_OUTPUT("LOUT2"),
 474SND_SOC_DAPM_MIXER("Right Mixer", WM8753_PWR4, 1, 0,
 475        &wm8753_right_mixer_controls[0], ARRAY_SIZE(wm8753_right_mixer_controls)),
 476SND_SOC_DAPM_PGA("Right Out 1", WM8753_PWR3, 7, 0, NULL, 0),
 477SND_SOC_DAPM_PGA("Right Out 2", WM8753_PWR3, 5, 0, NULL, 0),
 478SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", WM8753_PWR1, 2, 0),
 479SND_SOC_DAPM_OUTPUT("ROUT1"),
 480SND_SOC_DAPM_OUTPUT("ROUT2"),
 481SND_SOC_DAPM_MIXER("Mono Mixer", WM8753_PWR4, 2, 0,
 482        &wm8753_mono_mixer_controls[0], ARRAY_SIZE(wm8753_mono_mixer_controls)),
 483SND_SOC_DAPM_PGA("Mono Out 1", WM8753_PWR3, 2, 0, NULL, 0),
 484SND_SOC_DAPM_PGA("Mono Out 2", WM8753_PWR3, 1, 0, NULL, 0),
 485SND_SOC_DAPM_DAC("Voice DAC", "Voice Playback", WM8753_PWR1, 4, 0),
 486SND_SOC_DAPM_OUTPUT("MONO1"),
 487SND_SOC_DAPM_MUX("Mono 2 Mux", SND_SOC_NOPM, 0, 0, &wm8753_mono2_controls),
 488SND_SOC_DAPM_OUTPUT("MONO2"),
 489SND_SOC_DAPM_MIXER("Out3 Left + Right", SND_SOC_NOPM, 0, 0, NULL, 0),
 490SND_SOC_DAPM_MUX("Out3 Mux", SND_SOC_NOPM, 0, 0, &wm8753_out3_controls),
 491SND_SOC_DAPM_PGA("Out 3", WM8753_PWR3, 4, 0, NULL, 0),
 492SND_SOC_DAPM_OUTPUT("OUT3"),
 493SND_SOC_DAPM_MUX("Out4 Mux", SND_SOC_NOPM, 0, 0, &wm8753_out4_controls),
 494SND_SOC_DAPM_PGA("Out 4", WM8753_PWR3, 3, 0, NULL, 0),
 495SND_SOC_DAPM_OUTPUT("OUT4"),
 496SND_SOC_DAPM_MIXER("Playback Mixer", WM8753_PWR4, 3, 0,
 497        &wm8753_record_mixer_controls[0],
 498        ARRAY_SIZE(wm8753_record_mixer_controls)),
 499SND_SOC_DAPM_ADC("Left ADC", "Left Capture", WM8753_PWR2, 3, 0),
 500SND_SOC_DAPM_ADC("Right ADC", "Right Capture", WM8753_PWR2, 2, 0),
 501SND_SOC_DAPM_MUX("Capture Left Mixer", SND_SOC_NOPM, 0, 0,
 502        &wm8753_adc_mono_controls),
 503SND_SOC_DAPM_MUX("Capture Right Mixer", SND_SOC_NOPM, 0, 0,
 504        &wm8753_adc_mono_controls),
 505SND_SOC_DAPM_MUX("Capture Left Mux", SND_SOC_NOPM, 0, 0,
 506        &wm8753_adc_left_controls),
 507SND_SOC_DAPM_MUX("Capture Right Mux", SND_SOC_NOPM, 0, 0,
 508        &wm8753_adc_right_controls),
 509SND_SOC_DAPM_MUX("Mic Sidetone Mux", SND_SOC_NOPM, 0, 0,
 510        &wm8753_mic_mux_controls),
 511SND_SOC_DAPM_PGA("Left Capture Volume", WM8753_PWR2, 5, 0, NULL, 0),
 512SND_SOC_DAPM_PGA("Right Capture Volume", WM8753_PWR2, 4, 0, NULL, 0),
 513SND_SOC_DAPM_MIXER("ALC Mixer", WM8753_PWR2, 6, 0,
 514        &wm8753_alc_mixer_controls[0], ARRAY_SIZE(wm8753_alc_mixer_controls)),
 515SND_SOC_DAPM_MUX("Line Left Mux", SND_SOC_NOPM, 0, 0,
 516        &wm8753_line_left_controls),
 517SND_SOC_DAPM_MUX("Line Right Mux", SND_SOC_NOPM, 0, 0,
 518        &wm8753_line_right_controls),
 519SND_SOC_DAPM_MUX("Line Mono Mux", SND_SOC_NOPM, 0, 0,
 520        &wm8753_line_mono_controls),
 521SND_SOC_DAPM_MUX("Line Mixer", WM8753_PWR2, 0, 0,
 522        &wm8753_line_mux_mix_controls),
 523SND_SOC_DAPM_MUX("Rx Mixer", WM8753_PWR2, 1, 0,
 524        &wm8753_rx_mux_mix_controls),
 525SND_SOC_DAPM_PGA("Mic 1 Volume", WM8753_PWR2, 8, 0, NULL, 0),
 526SND_SOC_DAPM_PGA("Mic 2 Volume", WM8753_PWR2, 7, 0, NULL, 0),
 527SND_SOC_DAPM_MUX("Mic Selection Mux", SND_SOC_NOPM, 0, 0,
 528        &wm8753_mic_sel_mux_controls),
 529SND_SOC_DAPM_INPUT("LINE1"),
 530SND_SOC_DAPM_INPUT("LINE2"),
 531SND_SOC_DAPM_INPUT("RXP"),
 532SND_SOC_DAPM_INPUT("RXN"),
 533SND_SOC_DAPM_INPUT("ACIN"),
 534SND_SOC_DAPM_OUTPUT("ACOP"),
 535SND_SOC_DAPM_INPUT("MIC1N"),
 536SND_SOC_DAPM_INPUT("MIC1"),
 537SND_SOC_DAPM_INPUT("MIC2N"),
 538SND_SOC_DAPM_INPUT("MIC2"),
 539SND_SOC_DAPM_VMID("VREF"),
 540};
 541
 542static const struct snd_soc_dapm_route wm8753_dapm_routes[] = {
 543        /* left mixer */
 544        {"Left Mixer", "Left Playback Switch", "Left DAC"},
 545        {"Left Mixer", "Voice Playback Switch", "Voice DAC"},
 546        {"Left Mixer", "Sidetone Playback Switch", "Mic Sidetone Mux"},
 547        {"Left Mixer", "Bypass Playback Switch", "Line Left Mux"},
 548
 549        /* right mixer */
 550        {"Right Mixer", "Right Playback Switch", "Right DAC"},
 551        {"Right Mixer", "Voice Playback Switch", "Voice DAC"},
 552        {"Right Mixer", "Sidetone Playback Switch", "Mic Sidetone Mux"},
 553        {"Right Mixer", "Bypass Playback Switch", "Line Right Mux"},
 554
 555        /* mono mixer */
 556        {"Mono Mixer", "Voice Playback Switch", "Voice DAC"},
 557        {"Mono Mixer", "Left Playback Switch", "Left DAC"},
 558        {"Mono Mixer", "Right Playback Switch", "Right DAC"},
 559        {"Mono Mixer", "Sidetone Playback Switch", "Mic Sidetone Mux"},
 560        {"Mono Mixer", "Bypass Playback Switch", "Line Mono Mux"},
 561
 562        /* left out */
 563        {"Left Out 1", NULL, "Left Mixer"},
 564        {"Left Out 2", NULL, "Left Mixer"},
 565        {"LOUT1", NULL, "Left Out 1"},
 566        {"LOUT2", NULL, "Left Out 2"},
 567
 568        /* right out */
 569        {"Right Out 1", NULL, "Right Mixer"},
 570        {"Right Out 2", NULL, "Right Mixer"},
 571        {"ROUT1", NULL, "Right Out 1"},
 572        {"ROUT2", NULL, "Right Out 2"},
 573
 574        /* mono 1 out */
 575        {"Mono Out 1", NULL, "Mono Mixer"},
 576        {"MONO1", NULL, "Mono Out 1"},
 577
 578        /* mono 2 out */
 579        {"Mono 2 Mux", "Left + Right", "Out3 Left + Right"},
 580        {"Mono 2 Mux", "Inverted Mono 1", "MONO1"},
 581        {"Mono 2 Mux", "Left", "Left Mixer"},
 582        {"Mono 2 Mux", "Right", "Right Mixer"},
 583        {"Mono Out 2", NULL, "Mono 2 Mux"},
 584        {"MONO2", NULL, "Mono Out 2"},
 585
 586        /* out 3 */
 587        {"Out3 Left + Right", NULL, "Left Mixer"},
 588        {"Out3 Left + Right", NULL, "Right Mixer"},
 589        {"Out3 Mux", "VREF", "VREF"},
 590        {"Out3 Mux", "Left + Right", "Out3 Left + Right"},
 591        {"Out3 Mux", "ROUT2", "ROUT2"},
 592        {"Out 3", NULL, "Out3 Mux"},
 593        {"OUT3", NULL, "Out 3"},
 594
 595        /* out 4 */
 596        {"Out4 Mux", "VREF", "VREF"},
 597        {"Out4 Mux", "Capture ST", "Playback Mixer"},
 598        {"Out4 Mux", "LOUT2", "LOUT2"},
 599        {"Out 4", NULL, "Out4 Mux"},
 600        {"OUT4", NULL, "Out 4"},
 601
 602        /* record mixer  */
 603        {"Playback Mixer", "Left Capture Switch", "Left Mixer"},
 604        {"Playback Mixer", "Voice Capture Switch", "Mono Mixer"},
 605        {"Playback Mixer", "Right Capture Switch", "Right Mixer"},
 606
 607        /* Mic/SideTone Mux */
 608        {"Mic Sidetone Mux", "Left PGA", "Left Capture Volume"},
 609        {"Mic Sidetone Mux", "Right PGA", "Right Capture Volume"},
 610        {"Mic Sidetone Mux", "Mic 1", "Mic 1 Volume"},
 611        {"Mic Sidetone Mux", "Mic 2", "Mic 2 Volume"},
 612
 613        /* Capture Left Mux */
 614        {"Capture Left Mux", "PGA", "Left Capture Volume"},
 615        {"Capture Left Mux", "Line or RXP-RXN", "Line Left Mux"},
 616        {"Capture Left Mux", "Line", "LINE1"},
 617
 618        /* Capture Right Mux */
 619        {"Capture Right Mux", "PGA", "Right Capture Volume"},
 620        {"Capture Right Mux", "Line or RXP-RXN", "Line Right Mux"},
 621        {"Capture Right Mux", "Sidetone", "Playback Mixer"},
 622
 623        /* Mono Capture mixer-mux */
 624        {"Capture Right Mixer", "Stereo", "Capture Right Mux"},
 625        {"Capture Left Mixer", "Stereo", "Capture Left Mux"},
 626        {"Capture Left Mixer", "Analogue Mix Left", "Capture Left Mux"},
 627        {"Capture Left Mixer", "Analogue Mix Left", "Capture Right Mux"},
 628        {"Capture Right Mixer", "Analogue Mix Right", "Capture Left Mux"},
 629        {"Capture Right Mixer", "Analogue Mix Right", "Capture Right Mux"},
 630        {"Capture Left Mixer", "Digital Mono Mix", "Capture Left Mux"},
 631        {"Capture Left Mixer", "Digital Mono Mix", "Capture Right Mux"},
 632        {"Capture Right Mixer", "Digital Mono Mix", "Capture Left Mux"},
 633        {"Capture Right Mixer", "Digital Mono Mix", "Capture Right Mux"},
 634
 635        /* ADC */
 636        {"Left ADC", NULL, "Capture Left Mixer"},
 637        {"Right ADC", NULL, "Capture Right Mixer"},
 638
 639        /* Left Capture Volume */
 640        {"Left Capture Volume", NULL, "ACIN"},
 641
 642        /* Right Capture Volume */
 643        {"Right Capture Volume", NULL, "Mic 2 Volume"},
 644
 645        /* ALC Mixer */
 646        {"ALC Mixer", "Line Capture Switch", "Line Mixer"},
 647        {"ALC Mixer", "Mic2 Capture Switch", "Mic 2 Volume"},
 648        {"ALC Mixer", "Mic1 Capture Switch", "Mic 1 Volume"},
 649        {"ALC Mixer", "Rx Capture Switch", "Rx Mixer"},
 650
 651        /* Line Left Mux */
 652        {"Line Left Mux", "Line 1", "LINE1"},
 653        {"Line Left Mux", "Rx Mix", "Rx Mixer"},
 654
 655        /* Line Right Mux */
 656        {"Line Right Mux", "Line 2", "LINE2"},
 657        {"Line Right Mux", "Rx Mix", "Rx Mixer"},
 658
 659        /* Line Mono Mux */
 660        {"Line Mono Mux", "Line Mix", "Line Mixer"},
 661        {"Line Mono Mux", "Rx Mix", "Rx Mixer"},
 662
 663        /* Line Mixer/Mux */
 664        {"Line Mixer", "Line 1 + 2", "LINE1"},
 665        {"Line Mixer", "Line 1 - 2", "LINE1"},
 666        {"Line Mixer", "Line 1 + 2", "LINE2"},
 667        {"Line Mixer", "Line 1 - 2", "LINE2"},
 668        {"Line Mixer", "Line 1", "LINE1"},
 669        {"Line Mixer", "Line 2", "LINE2"},
 670
 671        /* Rx Mixer/Mux */
 672        {"Rx Mixer", "RXP - RXN", "RXP"},
 673        {"Rx Mixer", "RXP + RXN", "RXP"},
 674        {"Rx Mixer", "RXP - RXN", "RXN"},
 675        {"Rx Mixer", "RXP + RXN", "RXN"},
 676        {"Rx Mixer", "RXP", "RXP"},
 677        {"Rx Mixer", "RXN", "RXN"},
 678
 679        /* Mic 1 Volume */
 680        {"Mic 1 Volume", NULL, "MIC1N"},
 681        {"Mic 1 Volume", NULL, "Mic Selection Mux"},
 682
 683        /* Mic 2 Volume */
 684        {"Mic 2 Volume", NULL, "MIC2N"},
 685        {"Mic 2 Volume", NULL, "MIC2"},
 686
 687        /* Mic Selector Mux */
 688        {"Mic Selection Mux", "Mic 1", "MIC1"},
 689        {"Mic Selection Mux", "Mic 2", "MIC2N"},
 690        {"Mic Selection Mux", "Mic 3", "MIC2"},
 691
 692        /* ACOP */
 693        {"ACOP", NULL, "ALC Mixer"},
 694};
 695
 696/* PLL divisors */
 697struct _pll_div {
 698        u32 div2:1;
 699        u32 n:4;
 700        u32 k:24;
 701};
 702
 703/* The size in bits of the pll divide multiplied by 10
 704 * to allow rounding later */
 705#define FIXED_PLL_SIZE ((1 << 22) * 10)
 706
 707static void pll_factors(struct _pll_div *pll_div, unsigned int target,
 708        unsigned int source)
 709{
 710        u64 Kpart;
 711        unsigned int K, Ndiv, Nmod;
 712
 713        Ndiv = target / source;
 714        if (Ndiv < 6) {
 715                source >>= 1;
 716                pll_div->div2 = 1;
 717                Ndiv = target / source;
 718        } else
 719                pll_div->div2 = 0;
 720
 721        if ((Ndiv < 6) || (Ndiv > 12))
 722                printk(KERN_WARNING
 723                        "wm8753: unsupported N = %u\n", Ndiv);
 724
 725        pll_div->n = Ndiv;
 726        Nmod = target % source;
 727        Kpart = FIXED_PLL_SIZE * (long long)Nmod;
 728
 729        do_div(Kpart, source);
 730
 731        K = Kpart & 0xFFFFFFFF;
 732
 733        /* Check if we need to round */
 734        if ((K % 10) >= 5)
 735                K += 5;
 736
 737        /* Move down to proper range now rounding is done */
 738        K /= 10;
 739
 740        pll_div->k = K;
 741}
 742
 743static int wm8753_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
 744                int source, unsigned int freq_in, unsigned int freq_out)
 745{
 746        u16 reg, enable;
 747        int offset;
 748        struct snd_soc_codec *codec = codec_dai->codec;
 749
 750        if (pll_id < WM8753_PLL1 || pll_id > WM8753_PLL2)
 751                return -ENODEV;
 752
 753        if (pll_id == WM8753_PLL1) {
 754                offset = 0;
 755                enable = 0x10;
 756                reg = snd_soc_read(codec, WM8753_CLOCK) & 0xffef;
 757        } else {
 758                offset = 4;
 759                enable = 0x8;
 760                reg = snd_soc_read(codec, WM8753_CLOCK) & 0xfff7;
 761        }
 762
 763        if (!freq_in || !freq_out) {
 764                /* disable PLL  */
 765                snd_soc_write(codec, WM8753_PLL1CTL1 + offset, 0x0026);
 766                snd_soc_write(codec, WM8753_CLOCK, reg);
 767                return 0;
 768        } else {
 769                u16 value = 0;
 770                struct _pll_div pll_div;
 771
 772                pll_factors(&pll_div, freq_out * 8, freq_in);
 773
 774                /* set up N and K PLL divisor ratios */
 775                /* bits 8:5 = PLL_N, bits 3:0 = PLL_K[21:18] */
 776                value = (pll_div.n << 5) + ((pll_div.k & 0x3c0000) >> 18);
 777                snd_soc_write(codec, WM8753_PLL1CTL2 + offset, value);
 778
 779                /* bits 8:0 = PLL_K[17:9] */
 780                value = (pll_div.k & 0x03fe00) >> 9;
 781                snd_soc_write(codec, WM8753_PLL1CTL3 + offset, value);
 782
 783                /* bits 8:0 = PLL_K[8:0] */
 784                value = pll_div.k & 0x0001ff;
 785                snd_soc_write(codec, WM8753_PLL1CTL4 + offset, value);
 786
 787                /* set PLL as input and enable */
 788                snd_soc_write(codec, WM8753_PLL1CTL1 + offset, 0x0027 |
 789                        (pll_div.div2 << 3));
 790                snd_soc_write(codec, WM8753_CLOCK, reg | enable);
 791        }
 792        return 0;
 793}
 794
 795struct _coeff_div {
 796        u32 mclk;
 797        u32 rate;
 798        u8 sr:5;
 799        u8 usb:1;
 800};
 801
 802/* codec hifi mclk (after PLL) clock divider coefficients */
 803static const struct _coeff_div coeff_div[] = {
 804        /* 8k */
 805        {12288000, 8000, 0x6, 0x0},
 806        {11289600, 8000, 0x16, 0x0},
 807        {18432000, 8000, 0x7, 0x0},
 808        {16934400, 8000, 0x17, 0x0},
 809        {12000000, 8000, 0x6, 0x1},
 810
 811        /* 11.025k */
 812        {11289600, 11025, 0x18, 0x0},
 813        {16934400, 11025, 0x19, 0x0},
 814        {12000000, 11025, 0x19, 0x1},
 815
 816        /* 16k */
 817        {12288000, 16000, 0xa, 0x0},
 818        {18432000, 16000, 0xb, 0x0},
 819        {12000000, 16000, 0xa, 0x1},
 820
 821        /* 22.05k */
 822        {11289600, 22050, 0x1a, 0x0},
 823        {16934400, 22050, 0x1b, 0x0},
 824        {12000000, 22050, 0x1b, 0x1},
 825
 826        /* 32k */
 827        {12288000, 32000, 0xc, 0x0},
 828        {18432000, 32000, 0xd, 0x0},
 829        {12000000, 32000, 0xa, 0x1},
 830
 831        /* 44.1k */
 832        {11289600, 44100, 0x10, 0x0},
 833        {16934400, 44100, 0x11, 0x0},
 834        {12000000, 44100, 0x11, 0x1},
 835
 836        /* 48k */
 837        {12288000, 48000, 0x0, 0x0},
 838        {18432000, 48000, 0x1, 0x0},
 839        {12000000, 48000, 0x0, 0x1},
 840
 841        /* 88.2k */
 842        {11289600, 88200, 0x1e, 0x0},
 843        {16934400, 88200, 0x1f, 0x0},
 844        {12000000, 88200, 0x1f, 0x1},
 845
 846        /* 96k */
 847        {12288000, 96000, 0xe, 0x0},
 848        {18432000, 96000, 0xf, 0x0},
 849        {12000000, 96000, 0xe, 0x1},
 850};
 851
 852static int get_coeff(int mclk, int rate)
 853{
 854        int i;
 855
 856        for (i = 0; i < ARRAY_SIZE(coeff_div); i++) {
 857                if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
 858                        return i;
 859        }
 860        return -EINVAL;
 861}
 862
 863/*
 864 * Clock after PLL and dividers
 865 */
 866static int wm8753_set_dai_sysclk(struct snd_soc_dai *codec_dai,
 867                int clk_id, unsigned int freq, int dir)
 868{
 869        struct snd_soc_codec *codec = codec_dai->codec;
 870        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
 871
 872        switch (freq) {
 873        case 11289600:
 874        case 12000000:
 875        case 12288000:
 876        case 16934400:
 877        case 18432000:
 878                if (clk_id == WM8753_MCLK) {
 879                        wm8753->sysclk = freq;
 880                        return 0;
 881                } else if (clk_id == WM8753_PCMCLK) {
 882                        wm8753->pcmclk = freq;
 883                        return 0;
 884                }
 885                break;
 886        }
 887        return -EINVAL;
 888}
 889
 890/*
 891 * Set's ADC and Voice DAC format.
 892 */
 893static int wm8753_vdac_adc_set_dai_fmt(struct snd_soc_codec *codec,
 894                unsigned int fmt)
 895{
 896        u16 voice = snd_soc_read(codec, WM8753_PCM) & 0x01ec;
 897
 898        /* interface format */
 899        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 900        case SND_SOC_DAIFMT_I2S:
 901                voice |= 0x0002;
 902                break;
 903        case SND_SOC_DAIFMT_RIGHT_J:
 904                break;
 905        case SND_SOC_DAIFMT_LEFT_J:
 906                voice |= 0x0001;
 907                break;
 908        case SND_SOC_DAIFMT_DSP_A:
 909                voice |= 0x0003;
 910                break;
 911        case SND_SOC_DAIFMT_DSP_B:
 912                voice |= 0x0013;
 913                break;
 914        default:
 915                return -EINVAL;
 916        }
 917
 918        snd_soc_write(codec, WM8753_PCM, voice);
 919        return 0;
 920}
 921
 922/*
 923 * Set PCM DAI bit size and sample rate.
 924 */
 925static int wm8753_pcm_hw_params(struct snd_pcm_substream *substream,
 926                                struct snd_pcm_hw_params *params,
 927                                struct snd_soc_dai *dai)
 928{
 929        struct snd_soc_codec *codec = dai->codec;
 930        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
 931        u16 voice = snd_soc_read(codec, WM8753_PCM) & 0x01f3;
 932        u16 srate = snd_soc_read(codec, WM8753_SRATE1) & 0x017f;
 933
 934        /* bit size */
 935        switch (params_width(params)) {
 936        case 16:
 937                break;
 938        case 20:
 939                voice |= 0x0004;
 940                break;
 941        case 24:
 942                voice |= 0x0008;
 943                break;
 944        case 32:
 945                voice |= 0x000c;
 946                break;
 947        }
 948
 949        /* sample rate */
 950        if (params_rate(params) * 384 == wm8753->pcmclk)
 951                srate |= 0x80;
 952        snd_soc_write(codec, WM8753_SRATE1, srate);
 953
 954        snd_soc_write(codec, WM8753_PCM, voice);
 955        return 0;
 956}
 957
 958/*
 959 * Set's PCM dai fmt and BCLK.
 960 */
 961static int wm8753_pcm_set_dai_fmt(struct snd_soc_codec *codec,
 962                unsigned int fmt)
 963{
 964        u16 voice, ioctl;
 965
 966        voice = snd_soc_read(codec, WM8753_PCM) & 0x011f;
 967        ioctl = snd_soc_read(codec, WM8753_IOCTL) & 0x015d;
 968
 969        /* set master/slave audio interface */
 970        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
 971        case SND_SOC_DAIFMT_CBS_CFS:
 972                break;
 973        case SND_SOC_DAIFMT_CBM_CFM:
 974                ioctl |= 0x2;
 975        case SND_SOC_DAIFMT_CBM_CFS:
 976                voice |= 0x0040;
 977                break;
 978        default:
 979                return -EINVAL;
 980        }
 981
 982        /* clock inversion */
 983        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
 984        case SND_SOC_DAIFMT_DSP_A:
 985        case SND_SOC_DAIFMT_DSP_B:
 986                /* frame inversion not valid for DSP modes */
 987                switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
 988                case SND_SOC_DAIFMT_NB_NF:
 989                        break;
 990                case SND_SOC_DAIFMT_IB_NF:
 991                        voice |= 0x0080;
 992                        break;
 993                default:
 994                        return -EINVAL;
 995                }
 996                break;
 997        case SND_SOC_DAIFMT_I2S:
 998        case SND_SOC_DAIFMT_RIGHT_J:
 999        case SND_SOC_DAIFMT_LEFT_J:
1000                voice &= ~0x0010;
1001                switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1002                case SND_SOC_DAIFMT_NB_NF:
1003                        break;
1004                case SND_SOC_DAIFMT_IB_IF:
1005                        voice |= 0x0090;
1006                        break;
1007                case SND_SOC_DAIFMT_IB_NF:
1008                        voice |= 0x0080;
1009                        break;
1010                case SND_SOC_DAIFMT_NB_IF:
1011                        voice |= 0x0010;
1012                        break;
1013                default:
1014                        return -EINVAL;
1015                }
1016                break;
1017        default:
1018                return -EINVAL;
1019        }
1020
1021        snd_soc_write(codec, WM8753_PCM, voice);
1022        snd_soc_write(codec, WM8753_IOCTL, ioctl);
1023        return 0;
1024}
1025
1026static int wm8753_set_dai_clkdiv(struct snd_soc_dai *codec_dai,
1027                int div_id, int div)
1028{
1029        struct snd_soc_codec *codec = codec_dai->codec;
1030        u16 reg;
1031
1032        switch (div_id) {
1033        case WM8753_PCMDIV:
1034                reg = snd_soc_read(codec, WM8753_CLOCK) & 0x003f;
1035                snd_soc_write(codec, WM8753_CLOCK, reg | div);
1036                break;
1037        case WM8753_BCLKDIV:
1038                reg = snd_soc_read(codec, WM8753_SRATE2) & 0x01c7;
1039                snd_soc_write(codec, WM8753_SRATE2, reg | div);
1040                break;
1041        case WM8753_VXCLKDIV:
1042                reg = snd_soc_read(codec, WM8753_SRATE2) & 0x003f;
1043                snd_soc_write(codec, WM8753_SRATE2, reg | div);
1044                break;
1045        default:
1046                return -EINVAL;
1047        }
1048        return 0;
1049}
1050
1051/*
1052 * Set's HiFi DAC format.
1053 */
1054static int wm8753_hdac_set_dai_fmt(struct snd_soc_codec *codec,
1055                unsigned int fmt)
1056{
1057        u16 hifi = snd_soc_read(codec, WM8753_HIFI) & 0x01e0;
1058
1059        /* interface format */
1060        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1061        case SND_SOC_DAIFMT_I2S:
1062                hifi |= 0x0002;
1063                break;
1064        case SND_SOC_DAIFMT_RIGHT_J:
1065                break;
1066        case SND_SOC_DAIFMT_LEFT_J:
1067                hifi |= 0x0001;
1068                break;
1069        case SND_SOC_DAIFMT_DSP_A:
1070                hifi |= 0x0003;
1071                break;
1072        case SND_SOC_DAIFMT_DSP_B:
1073                hifi |= 0x0013;
1074                break;
1075        default:
1076                return -EINVAL;
1077        }
1078
1079        snd_soc_write(codec, WM8753_HIFI, hifi);
1080        return 0;
1081}
1082
1083/*
1084 * Set's I2S DAI format.
1085 */
1086static int wm8753_i2s_set_dai_fmt(struct snd_soc_codec *codec,
1087                unsigned int fmt)
1088{
1089        u16 ioctl, hifi;
1090
1091        hifi = snd_soc_read(codec, WM8753_HIFI) & 0x013f;
1092        ioctl = snd_soc_read(codec, WM8753_IOCTL) & 0x00ae;
1093
1094        /* set master/slave audio interface */
1095        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1096        case SND_SOC_DAIFMT_CBS_CFS:
1097                break;
1098        case SND_SOC_DAIFMT_CBM_CFM:
1099                ioctl |= 0x1;
1100        case SND_SOC_DAIFMT_CBM_CFS:
1101                hifi |= 0x0040;
1102                break;
1103        default:
1104                return -EINVAL;
1105        }
1106
1107        /* clock inversion */
1108        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1109        case SND_SOC_DAIFMT_DSP_A:
1110        case SND_SOC_DAIFMT_DSP_B:
1111                /* frame inversion not valid for DSP modes */
1112                switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1113                case SND_SOC_DAIFMT_NB_NF:
1114                        break;
1115                case SND_SOC_DAIFMT_IB_NF:
1116                        hifi |= 0x0080;
1117                        break;
1118                default:
1119                        return -EINVAL;
1120                }
1121                break;
1122        case SND_SOC_DAIFMT_I2S:
1123        case SND_SOC_DAIFMT_RIGHT_J:
1124        case SND_SOC_DAIFMT_LEFT_J:
1125                hifi &= ~0x0010;
1126                switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1127                case SND_SOC_DAIFMT_NB_NF:
1128                        break;
1129                case SND_SOC_DAIFMT_IB_IF:
1130                        hifi |= 0x0090;
1131                        break;
1132                case SND_SOC_DAIFMT_IB_NF:
1133                        hifi |= 0x0080;
1134                        break;
1135                case SND_SOC_DAIFMT_NB_IF:
1136                        hifi |= 0x0010;
1137                        break;
1138                default:
1139                        return -EINVAL;
1140                }
1141                break;
1142        default:
1143                return -EINVAL;
1144        }
1145
1146        snd_soc_write(codec, WM8753_HIFI, hifi);
1147        snd_soc_write(codec, WM8753_IOCTL, ioctl);
1148        return 0;
1149}
1150
1151/*
1152 * Set PCM DAI bit size and sample rate.
1153 */
1154static int wm8753_i2s_hw_params(struct snd_pcm_substream *substream,
1155                                struct snd_pcm_hw_params *params,
1156                                struct snd_soc_dai *dai)
1157{
1158        struct snd_soc_codec *codec = dai->codec;
1159        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1160        u16 srate = snd_soc_read(codec, WM8753_SRATE1) & 0x01c0;
1161        u16 hifi = snd_soc_read(codec, WM8753_HIFI) & 0x01f3;
1162        int coeff;
1163
1164        /* is digital filter coefficient valid ? */
1165        coeff = get_coeff(wm8753->sysclk, params_rate(params));
1166        if (coeff < 0) {
1167                printk(KERN_ERR "wm8753 invalid MCLK or rate\n");
1168                return coeff;
1169        }
1170        snd_soc_write(codec, WM8753_SRATE1, srate | (coeff_div[coeff].sr << 1) |
1171                coeff_div[coeff].usb);
1172
1173        /* bit size */
1174        switch (params_width(params)) {
1175        case 16:
1176                break;
1177        case 20:
1178                hifi |= 0x0004;
1179                break;
1180        case 24:
1181                hifi |= 0x0008;
1182                break;
1183        case 32:
1184                hifi |= 0x000c;
1185                break;
1186        }
1187
1188        snd_soc_write(codec, WM8753_HIFI, hifi);
1189        return 0;
1190}
1191
1192static int wm8753_mode1v_set_dai_fmt(struct snd_soc_codec *codec,
1193                unsigned int fmt)
1194{
1195        u16 clock;
1196
1197        /* set clk source as pcmclk */
1198        clock = snd_soc_read(codec, WM8753_CLOCK) & 0xfffb;
1199        snd_soc_write(codec, WM8753_CLOCK, clock);
1200
1201        return wm8753_vdac_adc_set_dai_fmt(codec, fmt);
1202}
1203
1204static int wm8753_mode1h_set_dai_fmt(struct snd_soc_codec *codec,
1205                unsigned int fmt)
1206{
1207        return wm8753_hdac_set_dai_fmt(codec, fmt);
1208}
1209
1210static int wm8753_mode2_set_dai_fmt(struct snd_soc_codec *codec,
1211                unsigned int fmt)
1212{
1213        u16 clock;
1214
1215        /* set clk source as pcmclk */
1216        clock = snd_soc_read(codec, WM8753_CLOCK) & 0xfffb;
1217        snd_soc_write(codec, WM8753_CLOCK, clock);
1218
1219        return wm8753_vdac_adc_set_dai_fmt(codec, fmt);
1220}
1221
1222static int wm8753_mode3_4_set_dai_fmt(struct snd_soc_codec *codec,
1223                unsigned int fmt)
1224{
1225        u16 clock;
1226
1227        /* set clk source as mclk */
1228        clock = snd_soc_read(codec, WM8753_CLOCK) & 0xfffb;
1229        snd_soc_write(codec, WM8753_CLOCK, clock | 0x4);
1230
1231        if (wm8753_hdac_set_dai_fmt(codec, fmt) < 0)
1232                return -EINVAL;
1233        return wm8753_vdac_adc_set_dai_fmt(codec, fmt);
1234}
1235
1236static int wm8753_hifi_write_dai_fmt(struct snd_soc_codec *codec,
1237                unsigned int fmt)
1238{
1239        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1240        int ret = 0;
1241
1242        switch (wm8753->dai_func) {
1243        case 0:
1244                ret = wm8753_mode1h_set_dai_fmt(codec, fmt);
1245                break;
1246        case 1:
1247                ret = wm8753_mode2_set_dai_fmt(codec, fmt);
1248                break;
1249        case 2:
1250        case 3:
1251                ret = wm8753_mode3_4_set_dai_fmt(codec, fmt);
1252                break;
1253        default:
1254                 break;
1255        }
1256        if (ret)
1257                return ret;
1258
1259        return wm8753_i2s_set_dai_fmt(codec, fmt);
1260}
1261
1262static int wm8753_hifi_set_dai_fmt(struct snd_soc_dai *codec_dai,
1263                unsigned int fmt)
1264{
1265        struct snd_soc_codec *codec = codec_dai->codec;
1266        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1267
1268        wm8753->hifi_fmt = fmt;
1269
1270        return wm8753_hifi_write_dai_fmt(codec, fmt);
1271};
1272
1273static int wm8753_voice_write_dai_fmt(struct snd_soc_codec *codec,
1274                unsigned int fmt)
1275{
1276        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1277        int ret = 0;
1278
1279        if (wm8753->dai_func != 0)
1280                return 0;
1281
1282        ret = wm8753_mode1v_set_dai_fmt(codec, fmt);
1283        if (ret)
1284                return ret;
1285        ret = wm8753_pcm_set_dai_fmt(codec, fmt);
1286        if (ret)
1287                return ret;
1288
1289        return 0;
1290};
1291
1292static int wm8753_voice_set_dai_fmt(struct snd_soc_dai *codec_dai,
1293                unsigned int fmt)
1294{
1295        struct snd_soc_codec *codec = codec_dai->codec;
1296        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1297
1298        wm8753->voice_fmt = fmt;
1299
1300        return wm8753_voice_write_dai_fmt(codec, fmt);
1301};
1302
1303static int wm8753_mute(struct snd_soc_dai *dai, int mute)
1304{
1305        struct snd_soc_codec *codec = dai->codec;
1306        u16 mute_reg = snd_soc_read(codec, WM8753_DAC) & 0xfff7;
1307        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1308
1309        /* the digital mute covers the HiFi and Voice DAC's on the WM8753.
1310         * make sure we check if they are not both active when we mute */
1311        if (mute && wm8753->dai_func == 1) {
1312                if (!snd_soc_codec_is_active(codec))
1313                        snd_soc_write(codec, WM8753_DAC, mute_reg | 0x8);
1314        } else {
1315                if (mute)
1316                        snd_soc_write(codec, WM8753_DAC, mute_reg | 0x8);
1317                else
1318                        snd_soc_write(codec, WM8753_DAC, mute_reg);
1319        }
1320
1321        return 0;
1322}
1323
1324static void wm8753_charge_work(struct work_struct *work)
1325{
1326        struct wm8753_priv *wm8753 =
1327                container_of(work, struct wm8753_priv, charge_work.work);
1328
1329        /* Set to 500k */
1330        regmap_update_bits(wm8753->regmap, WM8753_PWR1, 0x0180, 0x0100);
1331}
1332
1333static int wm8753_set_bias_level(struct snd_soc_codec *codec,
1334                                 enum snd_soc_bias_level level)
1335{
1336        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1337        u16 pwr_reg = snd_soc_read(codec, WM8753_PWR1) & 0xfe3e;
1338
1339        switch (level) {
1340        case SND_SOC_BIAS_ON:
1341                /* set vmid to 50k and unmute dac */
1342                snd_soc_write(codec, WM8753_PWR1, pwr_reg | 0x00c0);
1343                break;
1344        case SND_SOC_BIAS_PREPARE:
1345                /* Wait until fully charged */
1346                flush_delayed_work(&wm8753->charge_work);
1347                break;
1348        case SND_SOC_BIAS_STANDBY:
1349                if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
1350                        /* set vmid to 5k for quick power up */
1351                        snd_soc_write(codec, WM8753_PWR1, pwr_reg | 0x01c1);
1352                        schedule_delayed_work(&wm8753->charge_work,
1353                                msecs_to_jiffies(caps_charge));
1354                } else {
1355                        /* mute dac and set vmid to 500k, enable VREF */
1356                        snd_soc_write(codec, WM8753_PWR1, pwr_reg | 0x0141);
1357                }
1358                break;
1359        case SND_SOC_BIAS_OFF:
1360                cancel_delayed_work_sync(&wm8753->charge_work);
1361                snd_soc_write(codec, WM8753_PWR1, 0x0001);
1362                break;
1363        }
1364        return 0;
1365}
1366
1367#define WM8753_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
1368                SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
1369                SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |\
1370                SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
1371
1372#define WM8753_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1373        SNDRV_PCM_FMTBIT_S24_LE)
1374
1375/*
1376 * The WM8753 supports up to 4 different and mutually exclusive DAI
1377 * configurations. This gives 2 PCM's available for use, hifi and voice.
1378 * NOTE: The Voice PCM cannot play or capture audio to the CPU as it's DAI
1379 * is connected between the wm8753 and a BT codec or GSM modem.
1380 *
1381 * 1. Voice over PCM DAI - HIFI DAC over HIFI DAI
1382 * 2. Voice over HIFI DAI - HIFI disabled
1383 * 3. Voice disabled - HIFI over HIFI
1384 * 4. Voice disabled - HIFI over HIFI, uses voice DAI LRC for capture
1385 */
1386static const struct snd_soc_dai_ops wm8753_dai_ops_hifi_mode = {
1387        .hw_params      = wm8753_i2s_hw_params,
1388        .digital_mute   = wm8753_mute,
1389        .set_fmt        = wm8753_hifi_set_dai_fmt,
1390        .set_clkdiv     = wm8753_set_dai_clkdiv,
1391        .set_pll        = wm8753_set_dai_pll,
1392        .set_sysclk     = wm8753_set_dai_sysclk,
1393};
1394
1395static const struct snd_soc_dai_ops wm8753_dai_ops_voice_mode = {
1396        .hw_params      = wm8753_pcm_hw_params,
1397        .digital_mute   = wm8753_mute,
1398        .set_fmt        = wm8753_voice_set_dai_fmt,
1399        .set_clkdiv     = wm8753_set_dai_clkdiv,
1400        .set_pll        = wm8753_set_dai_pll,
1401        .set_sysclk     = wm8753_set_dai_sysclk,
1402};
1403
1404static struct snd_soc_dai_driver wm8753_dai[] = {
1405/* DAI HiFi mode 1 */
1406{       .name = "wm8753-hifi",
1407        .playback = {
1408                .stream_name = "HiFi Playback",
1409                .channels_min = 1,
1410                .channels_max = 2,
1411                .rates = WM8753_RATES,
1412                .formats = WM8753_FORMATS
1413        },
1414        .capture = { /* dummy for fast DAI switching */
1415                .stream_name = "Capture",
1416                .channels_min = 1,
1417                .channels_max = 2,
1418                .rates = WM8753_RATES,
1419                .formats = WM8753_FORMATS
1420        },
1421        .ops = &wm8753_dai_ops_hifi_mode,
1422},
1423/* DAI Voice mode 1 */
1424{       .name = "wm8753-voice",
1425        .playback = {
1426                .stream_name = "Voice Playback",
1427                .channels_min = 1,
1428                .channels_max = 1,
1429                .rates = WM8753_RATES,
1430                .formats = WM8753_FORMATS,
1431        },
1432        .capture = {
1433                .stream_name = "Capture",
1434                .channels_min = 1,
1435                .channels_max = 2,
1436                .rates = WM8753_RATES,
1437                .formats = WM8753_FORMATS,
1438        },
1439        .ops = &wm8753_dai_ops_voice_mode,
1440},
1441};
1442
1443static int wm8753_resume(struct snd_soc_codec *codec)
1444{
1445        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1446
1447        regcache_sync(wm8753->regmap);
1448
1449        return 0;
1450}
1451
1452static int wm8753_probe(struct snd_soc_codec *codec)
1453{
1454        struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
1455        int ret;
1456
1457        INIT_DELAYED_WORK(&wm8753->charge_work, wm8753_charge_work);
1458
1459        ret = wm8753_reset(codec);
1460        if (ret < 0) {
1461                dev_err(codec->dev, "Failed to issue reset: %d\n", ret);
1462                return ret;
1463        }
1464
1465        wm8753->dai_func = 0;
1466
1467        /* set the update bits */
1468        snd_soc_update_bits(codec, WM8753_LDAC, 0x0100, 0x0100);
1469        snd_soc_update_bits(codec, WM8753_RDAC, 0x0100, 0x0100);
1470        snd_soc_update_bits(codec, WM8753_LADC, 0x0100, 0x0100);
1471        snd_soc_update_bits(codec, WM8753_RADC, 0x0100, 0x0100);
1472        snd_soc_update_bits(codec, WM8753_LOUT1V, 0x0100, 0x0100);
1473        snd_soc_update_bits(codec, WM8753_ROUT1V, 0x0100, 0x0100);
1474        snd_soc_update_bits(codec, WM8753_LOUT2V, 0x0100, 0x0100);
1475        snd_soc_update_bits(codec, WM8753_ROUT2V, 0x0100, 0x0100);
1476        snd_soc_update_bits(codec, WM8753_LINVOL, 0x0100, 0x0100);
1477        snd_soc_update_bits(codec, WM8753_RINVOL, 0x0100, 0x0100);
1478
1479        return 0;
1480}
1481
1482static const struct snd_soc_codec_driver soc_codec_dev_wm8753 = {
1483        .probe =        wm8753_probe,
1484        .resume =       wm8753_resume,
1485        .set_bias_level = wm8753_set_bias_level,
1486        .suspend_bias_off = true,
1487
1488        .component_driver = {
1489                .controls               = wm8753_snd_controls,
1490                .num_controls           = ARRAY_SIZE(wm8753_snd_controls),
1491                .dapm_widgets           = wm8753_dapm_widgets,
1492                .num_dapm_widgets       = ARRAY_SIZE(wm8753_dapm_widgets),
1493                .dapm_routes            = wm8753_dapm_routes,
1494                .num_dapm_routes        = ARRAY_SIZE(wm8753_dapm_routes),
1495        },
1496};
1497
1498static const struct of_device_id wm8753_of_match[] = {
1499        { .compatible = "wlf,wm8753", },
1500        { }
1501};
1502MODULE_DEVICE_TABLE(of, wm8753_of_match);
1503
1504static const struct regmap_config wm8753_regmap = {
1505        .reg_bits = 7,
1506        .val_bits = 9,
1507
1508        .max_register = WM8753_ADCTL2,
1509        .volatile_reg = wm8753_volatile,
1510
1511        .cache_type = REGCACHE_RBTREE,
1512        .reg_defaults = wm8753_reg_defaults,
1513        .num_reg_defaults = ARRAY_SIZE(wm8753_reg_defaults),
1514};
1515
1516#if defined(CONFIG_SPI_MASTER)
1517static int wm8753_spi_probe(struct spi_device *spi)
1518{
1519        struct wm8753_priv *wm8753;
1520        int ret;
1521
1522        wm8753 = devm_kzalloc(&spi->dev, sizeof(struct wm8753_priv),
1523                              GFP_KERNEL);
1524        if (wm8753 == NULL)
1525                return -ENOMEM;
1526
1527        spi_set_drvdata(spi, wm8753);
1528
1529        wm8753->regmap = devm_regmap_init_spi(spi, &wm8753_regmap);
1530        if (IS_ERR(wm8753->regmap)) {
1531                ret = PTR_ERR(wm8753->regmap);
1532                dev_err(&spi->dev, "Failed to allocate register map: %d\n",
1533                        ret);
1534                return ret;
1535        }
1536
1537        ret = snd_soc_register_codec(&spi->dev, &soc_codec_dev_wm8753,
1538                                     wm8753_dai, ARRAY_SIZE(wm8753_dai));
1539        if (ret != 0)
1540                dev_err(&spi->dev, "Failed to register CODEC: %d\n", ret);
1541
1542        return ret;
1543}
1544
1545static int wm8753_spi_remove(struct spi_device *spi)
1546{
1547        snd_soc_unregister_codec(&spi->dev);
1548        return 0;
1549}
1550
1551static struct spi_driver wm8753_spi_driver = {
1552        .driver = {
1553                .name   = "wm8753",
1554                .of_match_table = wm8753_of_match,
1555        },
1556        .probe          = wm8753_spi_probe,
1557        .remove         = wm8753_spi_remove,
1558};
1559#endif /* CONFIG_SPI_MASTER */
1560
1561#if IS_ENABLED(CONFIG_I2C)
1562static int wm8753_i2c_probe(struct i2c_client *i2c,
1563                            const struct i2c_device_id *id)
1564{
1565        struct wm8753_priv *wm8753;
1566        int ret;
1567
1568        wm8753 = devm_kzalloc(&i2c->dev, sizeof(struct wm8753_priv),
1569                              GFP_KERNEL);
1570        if (wm8753 == NULL)
1571                return -ENOMEM;
1572
1573        i2c_set_clientdata(i2c, wm8753);
1574
1575        wm8753->regmap = devm_regmap_init_i2c(i2c, &wm8753_regmap);
1576        if (IS_ERR(wm8753->regmap)) {
1577                ret = PTR_ERR(wm8753->regmap);
1578                dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
1579                        ret);
1580                return ret;
1581        }
1582
1583        ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_wm8753,
1584                                     wm8753_dai, ARRAY_SIZE(wm8753_dai));
1585        if (ret != 0)
1586                dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
1587
1588        return ret;
1589}
1590
1591static int wm8753_i2c_remove(struct i2c_client *client)
1592{
1593        snd_soc_unregister_codec(&client->dev);
1594        return 0;
1595}
1596
1597static const struct i2c_device_id wm8753_i2c_id[] = {
1598        { "wm8753", 0 },
1599        { }
1600};
1601MODULE_DEVICE_TABLE(i2c, wm8753_i2c_id);
1602
1603static struct i2c_driver wm8753_i2c_driver = {
1604        .driver = {
1605                .name = "wm8753",
1606                .of_match_table = wm8753_of_match,
1607        },
1608        .probe =    wm8753_i2c_probe,
1609        .remove =   wm8753_i2c_remove,
1610        .id_table = wm8753_i2c_id,
1611};
1612#endif
1613
1614static int __init wm8753_modinit(void)
1615{
1616        int ret = 0;
1617#if IS_ENABLED(CONFIG_I2C)
1618        ret = i2c_add_driver(&wm8753_i2c_driver);
1619        if (ret != 0) {
1620                printk(KERN_ERR "Failed to register wm8753 I2C driver: %d\n",
1621                       ret);
1622        }
1623#endif
1624#if defined(CONFIG_SPI_MASTER)
1625        ret = spi_register_driver(&wm8753_spi_driver);
1626        if (ret != 0) {
1627                printk(KERN_ERR "Failed to register wm8753 SPI driver: %d\n",
1628                       ret);
1629        }
1630#endif
1631        return ret;
1632}
1633module_init(wm8753_modinit);
1634
1635static void __exit wm8753_exit(void)
1636{
1637#if IS_ENABLED(CONFIG_I2C)
1638        i2c_del_driver(&wm8753_i2c_driver);
1639#endif
1640#if defined(CONFIG_SPI_MASTER)
1641        spi_unregister_driver(&wm8753_spi_driver);
1642#endif
1643}
1644module_exit(wm8753_exit);
1645
1646MODULE_DESCRIPTION("ASoC WM8753 driver");
1647MODULE_AUTHOR("Liam Girdwood");
1648MODULE_LICENSE("GPL");
1649