19 #include <linux/module.h>
21 #include <linux/kernel.h>
25 #include <linux/i2c.h>
28 #include <linux/slab.h>
39 #define WM8900_REG_RESET 0x0
40 #define WM8900_REG_ID 0x0
41 #define WM8900_REG_POWER1 0x1
42 #define WM8900_REG_POWER2 0x2
43 #define WM8900_REG_POWER3 0x3
44 #define WM8900_REG_AUDIO1 0x4
45 #define WM8900_REG_AUDIO2 0x5
46 #define WM8900_REG_CLOCKING1 0x6
47 #define WM8900_REG_CLOCKING2 0x7
48 #define WM8900_REG_AUDIO3 0x8
49 #define WM8900_REG_AUDIO4 0x9
50 #define WM8900_REG_DACCTRL 0xa
51 #define WM8900_REG_LDAC_DV 0xb
52 #define WM8900_REG_RDAC_DV 0xc
53 #define WM8900_REG_SIDETONE 0xd
54 #define WM8900_REG_ADCCTRL 0xe
55 #define WM8900_REG_LADC_DV 0xf
56 #define WM8900_REG_RADC_DV 0x10
57 #define WM8900_REG_GPIO 0x12
58 #define WM8900_REG_INCTL 0x15
59 #define WM8900_REG_LINVOL 0x16
60 #define WM8900_REG_RINVOL 0x17
61 #define WM8900_REG_INBOOSTMIX1 0x18
62 #define WM8900_REG_INBOOSTMIX2 0x19
63 #define WM8900_REG_ADCPATH 0x1a
64 #define WM8900_REG_AUXBOOST 0x1b
65 #define WM8900_REG_ADDCTL 0x1e
66 #define WM8900_REG_FLLCTL1 0x24
67 #define WM8900_REG_FLLCTL2 0x25
68 #define WM8900_REG_FLLCTL3 0x26
69 #define WM8900_REG_FLLCTL4 0x27
70 #define WM8900_REG_FLLCTL5 0x28
71 #define WM8900_REG_FLLCTL6 0x29
72 #define WM8900_REG_LOUTMIXCTL1 0x2c
73 #define WM8900_REG_ROUTMIXCTL1 0x2d
74 #define WM8900_REG_BYPASS1 0x2e
75 #define WM8900_REG_BYPASS2 0x2f
76 #define WM8900_REG_AUXOUT_CTL 0x30
77 #define WM8900_REG_LOUT1CTL 0x33
78 #define WM8900_REG_ROUT1CTL 0x34
79 #define WM8900_REG_LOUT2CTL 0x35
80 #define WM8900_REG_ROUT2CTL 0x36
81 #define WM8900_REG_HPCTL1 0x3a
82 #define WM8900_REG_OUTBIASCTL 0x73
84 #define WM8900_MAXREG 0x80
86 #define WM8900_REG_ADDCTL_OUT1_DIS 0x80
87 #define WM8900_REG_ADDCTL_OUT2_DIS 0x40
88 #define WM8900_REG_ADDCTL_VMID_DIS 0x20
89 #define WM8900_REG_ADDCTL_BIAS_SRC 0x10
90 #define WM8900_REG_ADDCTL_VMID_SOFTST 0x04
91 #define WM8900_REG_ADDCTL_TEMP_SD 0x02
93 #define WM8900_REG_GPIO_TEMP_ENA 0x2
95 #define WM8900_REG_POWER1_STARTUP_BIAS_ENA 0x0100
96 #define WM8900_REG_POWER1_BIAS_ENA 0x0008
97 #define WM8900_REG_POWER1_VMID_BUF_ENA 0x0004
98 #define WM8900_REG_POWER1_FLL_ENA 0x0040
100 #define WM8900_REG_POWER2_SYSCLK_ENA 0x8000
101 #define WM8900_REG_POWER2_ADCL_ENA 0x0002
102 #define WM8900_REG_POWER2_ADCR_ENA 0x0001
104 #define WM8900_REG_POWER3_DACL_ENA 0x0002
105 #define WM8900_REG_POWER3_DACR_ENA 0x0001
107 #define WM8900_REG_AUDIO1_AIF_FMT_MASK 0x0018
108 #define WM8900_REG_AUDIO1_LRCLK_INV 0x0080
109 #define WM8900_REG_AUDIO1_BCLK_INV 0x0100
111 #define WM8900_REG_CLOCKING1_BCLK_DIR 0x1
112 #define WM8900_REG_CLOCKING1_MCLK_SRC 0x100
113 #define WM8900_REG_CLOCKING1_BCLK_MASK 0x01e
114 #define WM8900_REG_CLOCKING1_OPCLK_MASK 0x7000
116 #define WM8900_REG_CLOCKING2_ADC_CLKDIV 0xe0
117 #define WM8900_REG_CLOCKING2_DAC_CLKDIV 0x1c
119 #define WM8900_REG_DACCTRL_MUTE 0x004
120 #define WM8900_REG_DACCTRL_DAC_SB_FILT 0x100
121 #define WM8900_REG_DACCTRL_AIF_LRCLKRATE 0x400
123 #define WM8900_REG_AUDIO3_ADCLRC_DIR 0x0800
125 #define WM8900_REG_AUDIO4_DACLRC_DIR 0x0800
127 #define WM8900_REG_FLLCTL1_OSC_ENA 0x100
129 #define WM8900_REG_FLLCTL6_FLL_SLOW_LOCK_REF 0x100
131 #define WM8900_REG_HPCTL1_HP_IPSTAGE_ENA 0x80
132 #define WM8900_REG_HPCTL1_HP_OPSTAGE_ENA 0x40
133 #define WM8900_REG_HPCTL1_HP_CLAMP_IP 0x20
134 #define WM8900_REG_HPCTL1_HP_CLAMP_OP 0x10
135 #define WM8900_REG_HPCTL1_HP_SHORT 0x08
136 #define WM8900_REG_HPCTL1_HP_SHORT2 0x04
138 #define WM8900_LRC_MASK 0x03ff
151 static const struct reg_default wm8900_reg_defaults[] = {
209 static bool wm8900_volatile_register(
struct device *
dev,
unsigned int reg)
304 static const char *mic_bias_level_txt[] = {
"0.9*AVDD",
"0.65*AVDD" };
306 static const struct soc_enum mic_bias_level =
309 static const char *dac_mute_rate_txt[] = {
"Fast",
"Slow" };
311 static const struct soc_enum dac_mute_rate =
314 static const char *dac_deemphasis_txt[] = {
315 "Disabled",
"32kHz",
"44.1kHz",
"48kHz"
318 static const struct soc_enum dac_deemphasis =
321 static const char *adc_hpf_cut_txt[] = {
322 "Hi-fi mode",
"Voice mode 1",
"Voice mode 2",
"Voice mode 3"
325 static const struct soc_enum adc_hpf_cut =
328 static const char *lr_txt[] = {
332 static const struct soc_enum aifl_src =
335 static const struct soc_enum aifr_src =
338 static const struct soc_enum dacl_src =
341 static const struct soc_enum dacr_src =
344 static const char *sidetone_txt[] = {
345 "Disabled",
"Left ADC",
"Right ADC"
348 static const struct soc_enum dacl_sidetone =
351 static const struct soc_enum dacr_sidetone =
355 SOC_ENUM(
"Mic Bias Level", mic_bias_level),
368 SOC_ENUM(
"DAC Mute Rate", dac_mute_rate),
370 SOC_ENUM(
"DAC Deemphasis", dac_deemphasis),
375 SOC_ENUM(
"ADC HPF Cut-Off", adc_hpf_cut),
381 SOC_ENUM(
"Left Digital Audio Source", aifl_src),
382 SOC_ENUM(
"Right Digital Audio Source", aifr_src),
386 SOC_ENUM(
"Left DAC Source", dacl_src),
387 SOC_ENUM(
"Right DAC Source", dacr_src),
388 SOC_ENUM(
"Left DAC Sidetone", dacl_sidetone),
389 SOC_ENUM(
"Right DAC Sidetone", dacr_sidetone),
430 0, 63, 0, out_pga_tlv),
438 0, 63, 0, out_pga_tlv),
496 static const char *wm8900_lp_mux[] = {
"Disabled",
"Enabled" };
498 static const struct soc_enum wm8900_lineout2_lp_mux =
526 wm8900_linpga_controls,
529 wm8900_rinpga_controls,
533 wm8900_linmix_controls,
536 wm8900_rinmix_controls,
561 wm8900_loutmix_controls,
564 wm8900_routmix_controls,
571 {
"Left Input PGA",
"LINPUT1 Switch",
"LINPUT1"},
572 {
"Left Input PGA",
"LINPUT2 Switch",
"LINPUT2"},
573 {
"Left Input PGA",
"LINPUT3 Switch",
"LINPUT3"},
575 {
"Right Input PGA",
"RINPUT1 Switch",
"RINPUT1"},
576 {
"Right Input PGA",
"RINPUT2 Switch",
"RINPUT2"},
577 {
"Right Input PGA",
"RINPUT3 Switch",
"RINPUT3"},
579 {
"Left Input Mixer",
"LINPUT2 Switch",
"LINPUT2"},
580 {
"Left Input Mixer",
"LINPUT3 Switch",
"LINPUT3"},
581 {
"Left Input Mixer",
"AUX Switch",
"AUX"},
582 {
"Left Input Mixer",
"Input PGA Switch",
"Left Input PGA"},
584 {
"Right Input Mixer",
"RINPUT2 Switch",
"RINPUT2"},
585 {
"Right Input Mixer",
"RINPUT3 Switch",
"RINPUT3"},
586 {
"Right Input Mixer",
"AUX Switch",
"AUX"},
587 {
"Right Input Mixer",
"Input PGA Switch",
"Right Input PGA"},
589 {
"ADCL",
NULL,
"Left Input Mixer"},
590 {
"ADCR",
NULL,
"Right Input Mixer"},
593 {
"LINEOUT1L",
NULL,
"LINEOUT1L PGA"},
594 {
"LINEOUT1L PGA",
NULL,
"Left Output Mixer"},
595 {
"LINEOUT1R",
NULL,
"LINEOUT1R PGA"},
596 {
"LINEOUT1R PGA",
NULL,
"Right Output Mixer"},
598 {
"LINEOUT2L PGA",
NULL,
"Left Output Mixer"},
599 {
"LINEOUT2 LP",
"Disabled",
"LINEOUT2L PGA"},
600 {
"LINEOUT2 LP",
"Enabled",
"Left Output Mixer"},
601 {
"LINEOUT2L",
NULL,
"LINEOUT2 LP"},
603 {
"LINEOUT2R PGA",
NULL,
"Right Output Mixer"},
604 {
"LINEOUT2 LP",
"Disabled",
"LINEOUT2R PGA"},
605 {
"LINEOUT2 LP",
"Enabled",
"Right Output Mixer"},
606 {
"LINEOUT2R",
NULL,
"LINEOUT2 LP"},
608 {
"Left Output Mixer",
"LINPUT3 Bypass Switch",
"LINPUT3"},
609 {
"Left Output Mixer",
"AUX Bypass Switch",
"AUX"},
610 {
"Left Output Mixer",
"Left Input Mixer Switch",
"Left Input Mixer"},
611 {
"Left Output Mixer",
"Right Input Mixer Switch",
"Right Input Mixer"},
612 {
"Left Output Mixer",
"DACL Switch",
"DACL"},
614 {
"Right Output Mixer",
"RINPUT3 Bypass Switch",
"RINPUT3"},
615 {
"Right Output Mixer",
"AUX Bypass Switch",
"AUX"},
616 {
"Right Output Mixer",
"Left Input Mixer Switch",
"Left Input Mixer"},
617 {
"Right Output Mixer",
"Right Input Mixer Switch",
"Right Input Mixer"},
618 {
"Right Output Mixer",
"DACR Switch",
"DACR"},
627 {
"Headphone Amplifier",
NULL,
"LINEOUT2 LP"},
628 {
"Headphone Amplifier",
NULL,
"LINEOUT2 LP"},
629 {
"HP_L",
NULL,
"Headphone Amplifier"},
630 {
"HP_R",
NULL,
"Headphone Amplifier"},
685 #define FIXED_FLL_SIZE ((1 << 16) * 10)
691 unsigned int K, Ndiv, Nmod,
target;
700 while (target < 90000000) {
705 if (target > 100000000)
707 " Fout=%u\n", target, Fref, Fout);
710 "Fref=%u, Fout=%u, target=%u\n",
711 div, Fref, Fout, target);
722 Ndiv = target / Fref;
730 Nmod = (target / fll_div->
fll_ratio) % Fref;
737 K = Kpart & 0xFFFFFFFF;
752 int fll_id,
unsigned int freq_in,
unsigned int freq_out)
754 struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec);
757 if (wm8900->
fll_in == freq_in && wm8900->
fll_out == freq_out)
765 if (!freq_in || !freq_out) {
815 static int wm8900_set_dai_pll(
struct snd_soc_dai *codec_dai,
int pll_id,
816 int source,
unsigned int freq_in,
unsigned int freq_out)
818 return wm8900_set_fll(codec_dai->
codec, pll_id, freq_in, freq_out);
821 static int wm8900_set_dai_clkdiv(
struct snd_soc_dai *codec_dai,
863 static int wm8900_set_dai_fmt(
struct snd_soc_dai *codec_dai,
867 unsigned int clocking1, aif1, aif3, aif4;
925 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
943 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
976 static int wm8900_digital_mute(
struct snd_soc_dai *codec_dai,
int mute)
993 #define WM8900_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
994 SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 |\
995 SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000)
997 #define WM8900_PCM_FORMATS \
998 (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \
999 SNDRV_PCM_FORMAT_S24_LE)
1002 .hw_params = wm8900_hw_params,
1003 .set_clkdiv = wm8900_set_dai_clkdiv,
1004 .set_pll = wm8900_set_dai_pll,
1005 .set_fmt = wm8900_set_dai_fmt,
1006 .digital_mute = wm8900_digital_mute,
1010 .name =
"wm8900-hifi",
1012 .stream_name =
"HiFi Playback",
1019 .stream_name =
"HiFi Capture",
1025 .ops = &wm8900_dai_ops,
1028 static int wm8900_set_bias_level(
struct snd_soc_codec *codec,
1123 struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec);
1129 ret = wm8900_set_fll(codec, 0, 0, 0);
1145 struct wm8900_priv *wm8900 = snd_soc_codec_get_drvdata(codec);
1148 wm8900_reset(codec);
1152 dev_err(codec->
dev,
"Failed to restore cache: %d\n", ret);
1160 int fll_out = wm8900->
fll_out;
1161 int fll_in = wm8900->
fll_in;
1166 ret = wm8900_set_fll(codec, 0, fll_in, fll_out);
1168 dev_err(codec->
dev,
"Failed to restart FLL\n");
1182 dev_err(codec->
dev,
"Failed to set cache I/O: %d\n", ret);
1187 if (reg != 0x8900) {
1188 dev_err(codec->
dev,
"Device is not a WM8900 - ID %x\n", reg);
1192 wm8900_reset(codec);
1223 .probe = wm8900_probe,
1224 .remove = wm8900_remove,
1225 .suspend = wm8900_suspend,
1226 .resume = wm8900_resume,
1227 .set_bias_level = wm8900_set_bias_level,
1229 .controls = wm8900_snd_controls,
1230 .num_controls =
ARRAY_SIZE(wm8900_snd_controls),
1231 .dapm_widgets = wm8900_dapm_widgets,
1232 .num_dapm_widgets =
ARRAY_SIZE(wm8900_dapm_widgets),
1233 .dapm_routes = wm8900_dapm_routes,
1234 .num_dapm_routes =
ARRAY_SIZE(wm8900_dapm_routes),
1237 static const struct regmap_config wm8900_regmap = {
1242 .reg_defaults = wm8900_reg_defaults,
1243 .num_reg_defaults =
ARRAY_SIZE(wm8900_reg_defaults),
1246 .volatile_reg = wm8900_volatile_register,
1249 #if defined(CONFIG_SPI_MASTER)
1261 if (IS_ERR(wm8900->
regmap))
1262 return PTR_ERR(wm8900->
regmap);
1264 spi_set_drvdata(spi, wm8900);
1267 &soc_codec_dev_wm8900, &wm8900_dai, 1);
1278 static struct spi_driver wm8900_spi_driver = {
1283 .probe = wm8900_spi_probe,
1288 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
1301 if (IS_ERR(wm8900->
regmap))
1302 return PTR_ERR(wm8900->
regmap);
1304 i2c_set_clientdata(i2c, wm8900);
1307 &soc_codec_dev_wm8900, &wm8900_dai, 1);
1324 static struct i2c_driver wm8900_i2c_driver = {
1329 .probe = wm8900_i2c_probe,
1331 .id_table = wm8900_i2c_id,
1335 static int __init wm8900_modinit(
void)
1338 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
1339 ret = i2c_add_driver(&wm8900_i2c_driver);
1345 #if defined(CONFIG_SPI_MASTER)
1356 static void __exit wm8900_exit(
void)
1358 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
1361 #if defined(CONFIG_SPI_MASTER)
1362 spi_unregister_driver(&wm8900_spi_driver);