15 #include <linux/module.h>
20 #include <linux/i2c.h>
23 #include <linux/slab.h>
46 static const struct reg_default wm8711_reg_defaults[] = {
47 { 0, 0x0079 }, { 1, 0x0079 }, { 2, 0x000a }, { 3, 0x0008 },
48 { 4, 0x009f }, { 5, 0x000a }, { 6, 0x0000 }, { 7, 0x0000 },
51 static bool wm8711_volatile(
struct device *
dev,
unsigned int reg)
61 #define wm8711_reset(c) snd_soc_write(c, WM8711_RESET, 0)
82 &wm8711_output_mixer_controls[0],
93 {
"Output Mixer",
"Line Bypass Switch",
"Line Input"},
94 {
"Output Mixer",
"HiFi Playback Switch",
"DAC"},
97 {
"RHPOUT",
NULL,
"Output Mixer"},
98 {
"ROUT",
NULL,
"Output Mixer"},
99 {
"LHPOUT",
NULL,
"Output Mixer"},
100 {
"LOUT",
NULL,
"Output Mixer"},
113 static const struct _coeff_div coeff_div[] = {
115 {12288000, 48000, 256, 0x0, 0x0, 0x0},
116 {18432000, 48000, 384, 0x0, 0x1, 0x0},
117 {12000000, 48000, 250, 0x0, 0x0, 0x1},
120 {12288000, 32000, 384, 0x6, 0x0, 0x0},
121 {18432000, 32000, 576, 0x6, 0x1, 0x0},
122 {12000000, 32000, 375, 0x6, 0x0, 0x1},
125 {12288000, 8000, 1536, 0x3, 0x0, 0x0},
126 {18432000, 8000, 2304, 0x3, 0x1, 0x0},
127 {11289600, 8000, 1408, 0xb, 0x0, 0x0},
128 {16934400, 8000, 2112, 0xb, 0x1, 0x0},
129 {12000000, 8000, 1500, 0x3, 0x0, 0x1},
132 {12288000, 96000, 128, 0x7, 0x0, 0x0},
133 {18432000, 96000, 192, 0x7, 0x1, 0x0},
134 {12000000, 96000, 125, 0x7, 0x0, 0x1},
137 {11289600, 44100, 256, 0x8, 0x0, 0x0},
138 {16934400, 44100, 384, 0x8, 0x1, 0x0},
139 {12000000, 44100, 272, 0x8, 0x1, 0x1},
142 {11289600, 88200, 128, 0xf, 0x0, 0x0},
143 {16934400, 88200, 192, 0xf, 0x1, 0x0},
144 {12000000, 88200, 136, 0xf, 0x1, 0x1},
147 static inline int get_coeff(
int mclk,
int rate)
152 if (coeff_div[i].rate == rate && coeff_div[i].mclk == mclk)
163 struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
166 u16 srate = (coeff_div[
i].
sr << 2) |
167 (coeff_div[i].bosr << 1) | coeff_div[
i].
usb;
223 static int wm8711_set_dai_sysclk(
struct snd_soc_dai *codec_dai,
224 int clk_id,
unsigned int freq,
int dir)
227 struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
241 static int wm8711_set_dai_fmt(
struct snd_soc_dai *codec_dai,
300 static int wm8711_set_bias_level(
struct snd_soc_codec *codec,
303 struct wm8711_priv *wm8711 = snd_soc_codec_get_drvdata(codec);
327 #define WM8711_RATES SNDRV_PCM_RATE_8000_96000
329 #define WM8711_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
330 SNDRV_PCM_FMTBIT_S24_LE)
333 .prepare = wm8711_pcm_prepare,
334 .hw_params = wm8711_hw_params,
335 .shutdown = wm8711_shutdown,
336 .digital_mute = wm8711_mute,
337 .set_sysclk = wm8711_set_dai_sysclk,
338 .set_fmt = wm8711_set_dai_fmt,
342 .name =
"wm8711-hifi",
344 .stream_name =
"Playback",
372 dev_err(codec->
dev,
"Failed to set cache I/O: %d\n", ret);
378 dev_err(codec->
dev,
"Failed to issue reset\n");
400 .probe = wm8711_probe,
401 .remove = wm8711_remove,
402 .suspend = wm8711_suspend,
403 .resume = wm8711_resume,
404 .set_bias_level = wm8711_set_bias_level,
405 .controls = wm8711_snd_controls,
406 .num_controls =
ARRAY_SIZE(wm8711_snd_controls),
407 .dapm_widgets = wm8711_dapm_widgets,
408 .num_dapm_widgets =
ARRAY_SIZE(wm8711_dapm_widgets),
409 .dapm_routes = wm8711_intercon,
410 .num_dapm_routes =
ARRAY_SIZE(wm8711_intercon),
414 { .compatible =
"wlf,wm8711", },
419 static const struct regmap_config wm8711_regmap = {
424 .reg_defaults = wm8711_reg_defaults,
425 .num_reg_defaults =
ARRAY_SIZE(wm8711_reg_defaults),
428 .volatile_reg = wm8711_volatile,
431 #if defined(CONFIG_SPI_MASTER)
443 if (IS_ERR(wm8711->
regmap))
444 return PTR_ERR(wm8711->
regmap);
446 spi_set_drvdata(spi, wm8711);
449 &soc_codec_dev_wm8711, &wm8711_dai, 1);
461 static struct spi_driver wm8711_spi_driver = {
465 .of_match_table = wm8711_of_match,
467 .probe = wm8711_spi_probe,
472 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
485 if (IS_ERR(wm8711->
regmap))
486 return PTR_ERR(wm8711->
regmap);
488 i2c_set_clientdata(client, wm8711);
491 &soc_codec_dev_wm8711, &wm8711_dai, 1);
508 static struct i2c_driver wm8711_i2c_driver = {
512 .of_match_table = wm8711_of_match,
514 .probe = wm8711_i2c_probe,
516 .id_table = wm8711_i2c_id,
520 static int __init wm8711_modinit(
void)
523 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
524 ret = i2c_add_driver(&wm8711_i2c_driver);
530 #if defined(CONFIG_SPI_MASTER)
541 static void __exit wm8711_exit(
void)
543 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
546 #if defined(CONFIG_SPI_MASTER)
547 spi_unregister_driver(&wm8711_spi_driver);