Linux Audio

Check our new training course

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