12 #include <linux/module.h>
13 #include <linux/kernel.h>
14 #include <linux/i2c.h>
16 #include <linux/slab.h>
25 #define ADAV80X_PLAYBACK_CTRL 0x04
26 #define ADAV80X_AUX_IN_CTRL 0x05
27 #define ADAV80X_REC_CTRL 0x06
28 #define ADAV80X_AUX_OUT_CTRL 0x07
29 #define ADAV80X_DPATH_CTRL1 0x62
30 #define ADAV80X_DPATH_CTRL2 0x63
31 #define ADAV80X_DAC_CTRL1 0x64
32 #define ADAV80X_DAC_CTRL2 0x65
33 #define ADAV80X_DAC_CTRL3 0x66
34 #define ADAV80X_DAC_L_VOL 0x68
35 #define ADAV80X_DAC_R_VOL 0x69
36 #define ADAV80X_PGA_L_VOL 0x6c
37 #define ADAV80X_PGA_R_VOL 0x6d
38 #define ADAV80X_ADC_CTRL1 0x6e
39 #define ADAV80X_ADC_CTRL2 0x6f
40 #define ADAV80X_ADC_L_VOL 0x70
41 #define ADAV80X_ADC_R_VOL 0x71
42 #define ADAV80X_PLL_CTRL1 0x74
43 #define ADAV80X_PLL_CTRL2 0x75
44 #define ADAV80X_ICLK_CTRL1 0x76
45 #define ADAV80X_ICLK_CTRL2 0x77
46 #define ADAV80X_PLL_CLK_SRC 0x78
47 #define ADAV80X_PLL_OUTE 0x7a
49 #define ADAV80X_PLL_CLK_SRC_PLL_XIN(pll) 0x00
50 #define ADAV80X_PLL_CLK_SRC_PLL_MCLKI(pll) (0x40 << (pll))
51 #define ADAV80X_PLL_CLK_SRC_PLL_MASK(pll) (0x40 << (pll))
53 #define ADAV80X_ICLK_CTRL1_DAC_SRC(src) ((src) << 5)
54 #define ADAV80X_ICLK_CTRL1_ADC_SRC(src) ((src) << 2)
55 #define ADAV80X_ICLK_CTRL1_ICLK2_SRC(src) (src)
56 #define ADAV80X_ICLK_CTRL2_ICLK1_SRC(src) ((src) << 3)
58 #define ADAV80X_PLL_CTRL1_PLLDIV 0x10
59 #define ADAV80X_PLL_CTRL1_PLLPD(pll) (0x04 << (pll))
60 #define ADAV80X_PLL_CTRL1_XTLPD 0x02
62 #define ADAV80X_PLL_CTRL2_FIELD(pll, x) ((x) << ((pll) * 4))
64 #define ADAV80X_PLL_CTRL2_FS_48(pll) ADAV80X_PLL_CTRL2_FIELD((pll), 0x00)
65 #define ADAV80X_PLL_CTRL2_FS_32(pll) ADAV80X_PLL_CTRL2_FIELD((pll), 0x08)
66 #define ADAV80X_PLL_CTRL2_FS_44(pll) ADAV80X_PLL_CTRL2_FIELD((pll), 0x0c)
68 #define ADAV80X_PLL_CTRL2_SEL(pll) ADAV80X_PLL_CTRL2_FIELD((pll), 0x02)
69 #define ADAV80X_PLL_CTRL2_DOUB(pll) ADAV80X_PLL_CTRL2_FIELD((pll), 0x01)
70 #define ADAV80X_PLL_CTRL2_PLL_MASK(pll) ADAV80X_PLL_CTRL2_FIELD((pll), 0x0f)
72 #define ADAV80X_ADC_CTRL1_MODULATOR_MASK 0x80
73 #define ADAV80X_ADC_CTRL1_MODULATOR_128FS 0x00
74 #define ADAV80X_ADC_CTRL1_MODULATOR_64FS 0x80
76 #define ADAV80X_DAC_CTRL1_PD 0x80
78 #define ADAV80X_DAC_CTRL2_DIV1 0x00
79 #define ADAV80X_DAC_CTRL2_DIV1_5 0x10
80 #define ADAV80X_DAC_CTRL2_DIV2 0x20
81 #define ADAV80X_DAC_CTRL2_DIV3 0x30
82 #define ADAV80X_DAC_CTRL2_DIV_MASK 0x30
84 #define ADAV80X_DAC_CTRL2_INTERPOL_256FS 0x00
85 #define ADAV80X_DAC_CTRL2_INTERPOL_128FS 0x40
86 #define ADAV80X_DAC_CTRL2_INTERPOL_64FS 0x80
87 #define ADAV80X_DAC_CTRL2_INTERPOL_MASK 0xc0
89 #define ADAV80X_DAC_CTRL2_DEEMPH_NONE 0x00
90 #define ADAV80X_DAC_CTRL2_DEEMPH_44 0x01
91 #define ADAV80X_DAC_CTRL2_DEEMPH_32 0x02
92 #define ADAV80X_DAC_CTRL2_DEEMPH_48 0x03
93 #define ADAV80X_DAC_CTRL2_DEEMPH_MASK 0x01
95 #define ADAV80X_CAPTURE_MODE_MASTER 0x20
96 #define ADAV80X_CAPTURE_WORD_LEN24 0x00
97 #define ADAV80X_CAPTURE_WORD_LEN20 0x04
98 #define ADAV80X_CAPTRUE_WORD_LEN18 0x08
99 #define ADAV80X_CAPTURE_WORD_LEN16 0x0c
100 #define ADAV80X_CAPTURE_WORD_LEN_MASK 0x0c
102 #define ADAV80X_CAPTURE_MODE_LEFT_J 0x00
103 #define ADAV80X_CAPTURE_MODE_I2S 0x01
104 #define ADAV80X_CAPTURE_MODE_RIGHT_J 0x03
105 #define ADAV80X_CAPTURE_MODE_MASK 0x03
107 #define ADAV80X_PLAYBACK_MODE_MASTER 0x10
108 #define ADAV80X_PLAYBACK_MODE_LEFT_J 0x00
109 #define ADAV80X_PLAYBACK_MODE_I2S 0x01
110 #define ADAV80X_PLAYBACK_MODE_RIGHT_J_24 0x04
111 #define ADAV80X_PLAYBACK_MODE_RIGHT_J_20 0x05
112 #define ADAV80X_PLAYBACK_MODE_RIGHT_J_18 0x06
113 #define ADAV80X_PLAYBACK_MODE_RIGHT_J_16 0x07
114 #define ADAV80X_PLAYBACK_MODE_MASK 0x07
116 #define ADAV80X_PLL_OUTE_SYSCLKPD(x) BIT(2 - (x))
118 static u8 adav80x_default_regs[] = {
119 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0x80, 0x26, 0x00, 0x00,
120 0x02, 0x40, 0x20, 0x00, 0x09, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0x92, 0xb1, 0x37,
122 0x48, 0xd2, 0xfb, 0xca, 0xd2, 0x15, 0xe8, 0x29, 0xb9, 0x6a, 0xda, 0x2b,
123 0xb7, 0xc0, 0x11, 0x65, 0x5c, 0xf6, 0xff, 0x8d, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x00, 0x00,
126 0x00, 0xe8, 0x46, 0xe1, 0x5b, 0xd3, 0x43, 0x77, 0x93, 0xa7, 0x44, 0xee,
127 0x32, 0x12, 0xc0, 0x11, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x3f,
128 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x52, 0x00,
145 static const char *adav80x_mux_text[] = {
151 static const unsigned int adav80x_mux_values[] = {
155 #define ADAV80X_MUX_ENUM_DECL(name, reg, shift) \
156 SOC_VALUE_ENUM_DOUBLE_DECL(name, reg, shift, 7, \
157 ARRAY_SIZE(adav80x_mux_text), adav80x_mux_text, \
171 #define ADAV80X_MUX(name, ctrl) \
172 SND_SOC_DAPM_VALUE_MUX(name, SND_SOC_NOPM, 0, 0, ctrl)
187 ADAV80X_MUX(
"Aux Capture Select", &adav80x_aux_capture_mux_ctrl),
188 ADAV80X_MUX(
"Capture Select", &adav80x_capture_mux_ctrl),
230 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
237 {
"DAC Select",
"ADC",
"ADC" },
238 {
"DAC Select",
"Playback",
"AIFIN" },
239 {
"DAC Select",
"Aux Playback",
"AIFAUXIN" },
240 {
"DAC",
NULL,
"DAC Select" },
242 {
"Capture Select",
"ADC",
"ADC" },
243 {
"Capture Select",
"Playback",
"AIFIN" },
244 {
"Capture Select",
"Aux Playback",
"AIFAUXIN" },
245 {
"AIFOUT",
NULL,
"Capture Select" },
247 {
"Aux Capture Select",
"ADC",
"ADC" },
248 {
"Aux Capture Select",
"Playback",
"AIFIN" },
249 {
"Aux Capture Select",
"Aux Playback",
"AIFAUXIN" },
250 {
"AIFAUXOUT",
NULL,
"Aux Capture Select" },
252 {
"VOUTR",
NULL,
"DAC" },
253 {
"VOUTL",
NULL,
"DAC" },
255 {
"Left PGA",
NULL,
"VINL" },
256 {
"Right PGA",
NULL,
"VINR" },
257 {
"ADC",
NULL,
"Left PGA" },
258 {
"ADC",
NULL,
"Right PGA" },
260 {
"SYSCLK",
NULL,
"PLL1", adav80x_dapm_sysclk_check },
261 {
"SYSCLK",
NULL,
"PLL2", adav80x_dapm_sysclk_check },
262 {
"SYSCLK",
NULL,
"OSC", adav80x_dapm_sysclk_check },
263 {
"PLL1",
NULL,
"OSC", adav80x_dapm_pll_check },
264 {
"PLL2",
NULL,
"OSC", adav80x_dapm_pll_check },
266 {
"ADC",
NULL,
"SYSCLK" },
267 {
"DAC",
NULL,
"SYSCLK" },
268 {
"AIFOUT",
NULL,
"SYSCLK" },
269 {
"AIFAUXOUT",
NULL,
"SYSCLK" },
270 {
"AIFIN",
NULL,
"SYSCLK" },
271 {
"AIFAUXIN",
NULL,
"SYSCLK" },
276 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
280 switch (adav80x->
rate) {
305 static int adav80x_put_deemph(
struct snd_kcontrol *kcontrol,
309 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
310 unsigned int deemph = ucontrol->
value.enumerated.item[0];
317 return adav80x_set_deemph(codec);
320 static int adav80x_get_deemph(
struct snd_kcontrol *kcontrol,
324 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
326 ucontrol->
value.enumerated.item[0] = adav80x->
deemph;
348 adav80x_get_deemph, adav80x_put_deemph),
351 static unsigned int adav80x_port_ctrl_regs[2][2] = {
359 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
360 unsigned int capture = 0x00;
361 unsigned int playback = 0x00;
407 static int adav80x_set_adc_clock(
struct snd_soc_codec *codec,
408 unsigned int sample_rate)
412 if (sample_rate <= 48000)
423 static int adav80x_set_dac_clock(
struct snd_soc_codec *codec,
424 unsigned int sample_rate)
428 if (sample_rate <= 48000)
440 static int adav80x_set_capture_pcm_format(
struct snd_soc_codec *codec,
468 static int adav80x_set_playback_pcm_format(
struct snd_soc_codec *codec,
471 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
504 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
507 if (rate * 256 != adav80x->
sysclk)
511 adav80x_set_playback_pcm_format(codec, dai,
513 adav80x_set_dac_clock(codec, rate);
515 adav80x_set_capture_pcm_format(codec, dai,
517 adav80x_set_adc_clock(codec, rate);
520 adav80x_set_deemph(codec);
526 int clk_id,
int source,
527 unsigned int freq,
int dir)
529 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
545 if (adav80x->
clk_src != clk_id) {
546 unsigned int iclk_ctrl1, iclk_ctrl2;
601 static int adav80x_set_pll(
struct snd_soc_codec *codec,
int pll_id,
602 int source,
unsigned int freq_in,
unsigned int freq_out)
604 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
605 unsigned int pll_ctrl1 = 0;
606 unsigned int pll_ctrl2 = 0;
633 if (freq_out > 12288000) {
658 if (source != adav80x->
pll_src) {
675 static int adav80x_set_bias_level(
struct snd_soc_codec *codec,
702 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
715 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
722 .set_fmt = adav80x_set_dai_fmt,
723 .hw_params = adav80x_hw_params,
724 .startup = adav80x_dai_startup,
725 .shutdown = adav80x_dai_shutdown,
728 #define ADAV80X_PLAYBACK_RATES (SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
729 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | SNDRV_PCM_RATE_88200 | \
730 SNDRV_PCM_RATE_96000)
732 #define ADAV80X_CAPTURE_RATES (SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
734 #define ADAV80X_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE | \
735 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE)
739 .name =
"adav80x-hifi",
742 .stream_name =
"HiFi Playback",
749 .stream_name =
"HiFi Capture",
755 .ops = &adav80x_dai_ops,
758 .name =
"adav80x-aux",
761 .stream_name =
"Aux Playback",
768 .stream_name =
"Aux Capture",
774 .ops = &adav80x_dai_ops,
781 struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec);
785 dev_err(codec->
dev,
"failed to set cache I/O: %d\n", ret);
821 .probe = adav80x_probe,
822 .remove = adav80x_remove,
823 .suspend = adav80x_suspend,
824 .resume = adav80x_resume,
825 .set_bias_level = adav80x_set_bias_level,
827 .set_pll = adav80x_set_pll,
828 .set_sysclk = adav80x_set_sysclk,
830 .reg_word_size =
sizeof(
u8),
832 .reg_cache_default = adav80x_default_regs,
834 .controls = adav80x_controls,
836 .dapm_widgets = adav80x_dapm_widgets,
837 .num_dapm_widgets =
ARRAY_SIZE(adav80x_dapm_widgets),
838 .dapm_routes = adav80x_dapm_routes,
839 .num_dapm_routes =
ARRAY_SIZE(adav80x_dapm_routes),
845 struct adav80x *adav80x;
848 adav80x = kzalloc(
sizeof(*adav80x),
GFP_KERNEL);
870 #if defined(CONFIG_SPI_MASTER)
878 return adav80x_bus_remove(&spi->
dev);
881 static struct spi_driver adav80x_spi_driver = {
886 .probe = adav80x_spi_probe,
891 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
906 return adav80x_bus_remove(&client->
dev);
909 static struct i2c_driver adav80x_i2c_driver = {
914 .probe = adav80x_i2c_probe,
916 .id_table = adav80x_id,
920 static int __init adav80x_init(
void)
924 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
925 ret = i2c_add_driver(&adav80x_i2c_driver);
930 #if defined(CONFIG_SPI_MASTER)
938 static void __exit adav80x_exit(
void)
940 #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
943 #if defined(CONFIG_SPI_MASTER)
944 spi_unregister_driver(&adav80x_spi_driver);