aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs')
-rw-r--r--sound/soc/codecs/Kconfig11
-rw-r--r--sound/soc/codecs/Makefile4
-rw-r--r--sound/soc/codecs/da7213.c151
-rw-r--r--sound/soc/codecs/da732x.c167
-rw-r--r--sound/soc/codecs/da9055.c92
-rw-r--r--sound/soc/codecs/tlv320aic23-i2c.c59
-rw-r--r--sound/soc/codecs/tlv320aic23-spi.c57
-rw-r--r--sound/soc/codecs/tlv320aic23.c67
-rw-r--r--sound/soc/codecs/tlv320aic23.h6
9 files changed, 358 insertions, 256 deletions
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 9a6b98de4e29..cf7f169adb12 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -80,7 +80,8 @@ config SND_SOC_ALL_CODECS
80 select SND_SOC_STA529 if I2C 80 select SND_SOC_STA529 if I2C
81 select SND_SOC_STAC9766 if SND_SOC_AC97_BUS 81 select SND_SOC_STAC9766 if SND_SOC_AC97_BUS
82 select SND_SOC_TAS5086 if I2C 82 select SND_SOC_TAS5086 if I2C
83 select SND_SOC_TLV320AIC23 if I2C 83 select SND_SOC_TLV320AIC23_I2C if I2C
84 select SND_SOC_TLV320AIC23_SPI if SPI_MASTER
84 select SND_SOC_TLV320AIC26 if SPI_MASTER 85 select SND_SOC_TLV320AIC26 if SPI_MASTER
85 select SND_SOC_TLV320AIC32X4 if I2C 86 select SND_SOC_TLV320AIC32X4 if I2C
86 select SND_SOC_TLV320AIC3X if I2C 87 select SND_SOC_TLV320AIC3X if I2C
@@ -422,6 +423,14 @@ config SND_SOC_TAS5086
422config SND_SOC_TLV320AIC23 423config SND_SOC_TLV320AIC23
423 tristate 424 tristate
424 425
426config SND_SOC_TLV320AIC23_I2C
427 tristate
428 select SND_SOC_TLV320AIC23
429
430config SND_SOC_TLV320AIC23_SPI
431 tristate
432 select SND_SOC_TLV320AIC23
433
425config SND_SOC_TLV320AIC26 434config SND_SOC_TLV320AIC26
426 tristate 435 tristate
427 depends on SPI 436 depends on SPI
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 2a773b855572..08540dae0090 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -73,6 +73,8 @@ snd-soc-sta529-objs := sta529.o
73snd-soc-stac9766-objs := stac9766.o 73snd-soc-stac9766-objs := stac9766.o
74snd-soc-tas5086-objs := tas5086.o 74snd-soc-tas5086-objs := tas5086.o
75snd-soc-tlv320aic23-objs := tlv320aic23.o 75snd-soc-tlv320aic23-objs := tlv320aic23.o
76snd-soc-tlv320aic23-i2c-objs := tlv320aic23-i2c.o
77snd-soc-tlv320aic23-spi-objs := tlv320aic23-spi.o
76snd-soc-tlv320aic26-objs := tlv320aic26.o 78snd-soc-tlv320aic26-objs := tlv320aic26.o
77snd-soc-tlv320aic3x-objs := tlv320aic3x.o 79snd-soc-tlv320aic3x-objs := tlv320aic3x.o
78snd-soc-tlv320aic32x4-objs := tlv320aic32x4.o 80snd-soc-tlv320aic32x4-objs := tlv320aic32x4.o
@@ -213,6 +215,8 @@ obj-$(CONFIG_SND_SOC_STA529) += snd-soc-sta529.o
213obj-$(CONFIG_SND_SOC_STAC9766) += snd-soc-stac9766.o 215obj-$(CONFIG_SND_SOC_STAC9766) += snd-soc-stac9766.o
214obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o 216obj-$(CONFIG_SND_SOC_TAS5086) += snd-soc-tas5086.o
215obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o 217obj-$(CONFIG_SND_SOC_TLV320AIC23) += snd-soc-tlv320aic23.o
218obj-$(CONFIG_SND_SOC_TLV320AIC23_I2C) += snd-soc-tlv320aic23-i2c.o
219obj-$(CONFIG_SND_SOC_TLV320AIC23_SPI) += snd-soc-tlv320aic23-spi.o
216obj-$(CONFIG_SND_SOC_TLV320AIC26) += snd-soc-tlv320aic26.o 220obj-$(CONFIG_SND_SOC_TLV320AIC26) += snd-soc-tlv320aic26.o
217obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o 221obj-$(CONFIG_SND_SOC_TLV320AIC3X) += snd-soc-tlv320aic3x.o
218obj-$(CONFIG_SND_SOC_TLV320AIC32X4) += snd-soc-tlv320aic32x4.o 222obj-$(CONFIG_SND_SOC_TLV320AIC32X4) += snd-soc-tlv320aic32x4.o
diff --git a/sound/soc/codecs/da7213.c b/sound/soc/codecs/da7213.c
index 0c77e7ad7423..439d10387f10 100644
--- a/sound/soc/codecs/da7213.c
+++ b/sound/soc/codecs/da7213.c
@@ -63,30 +63,30 @@ static const char * const da7213_voice_hpf_corner_txt[] = {
63 "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz" 63 "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz"
64}; 64};
65 65
66static const struct soc_enum da7213_dac_voice_hpf_corner = 66static SOC_ENUM_SINGLE_DECL(da7213_dac_voice_hpf_corner,
67 SOC_ENUM_SINGLE(DA7213_DAC_FILTERS1, DA7213_VOICE_HPF_CORNER_SHIFT, 67 DA7213_DAC_FILTERS1,
68 DA7213_VOICE_HPF_CORNER_MAX, 68 DA7213_VOICE_HPF_CORNER_SHIFT,
69 da7213_voice_hpf_corner_txt); 69 da7213_voice_hpf_corner_txt);
70 70
71static const struct soc_enum da7213_adc_voice_hpf_corner = 71static SOC_ENUM_SINGLE_DECL(da7213_adc_voice_hpf_corner,
72 SOC_ENUM_SINGLE(DA7213_ADC_FILTERS1, DA7213_VOICE_HPF_CORNER_SHIFT, 72 DA7213_ADC_FILTERS1,
73 DA7213_VOICE_HPF_CORNER_MAX, 73 DA7213_VOICE_HPF_CORNER_SHIFT,
74 da7213_voice_hpf_corner_txt); 74 da7213_voice_hpf_corner_txt);
75 75
76/* ADC and DAC high pass filter cutoff value */ 76/* ADC and DAC high pass filter cutoff value */
77static const char * const da7213_audio_hpf_corner_txt[] = { 77static const char * const da7213_audio_hpf_corner_txt[] = {
78 "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000" 78 "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000"
79}; 79};
80 80
81static const struct soc_enum da7213_dac_audio_hpf_corner = 81static SOC_ENUM_SINGLE_DECL(da7213_dac_audio_hpf_corner,
82 SOC_ENUM_SINGLE(DA7213_DAC_FILTERS1, DA7213_AUDIO_HPF_CORNER_SHIFT, 82 DA7213_DAC_FILTERS1
83 DA7213_AUDIO_HPF_CORNER_MAX, 83 , DA7213_AUDIO_HPF_CORNER_SHIFT,
84 da7213_audio_hpf_corner_txt); 84 da7213_audio_hpf_corner_txt);
85 85
86static const struct soc_enum da7213_adc_audio_hpf_corner = 86static SOC_ENUM_SINGLE_DECL(da7213_adc_audio_hpf_corner,
87 SOC_ENUM_SINGLE(DA7213_ADC_FILTERS1, DA7213_AUDIO_HPF_CORNER_SHIFT, 87 DA7213_ADC_FILTERS1,
88 DA7213_AUDIO_HPF_CORNER_MAX, 88 DA7213_AUDIO_HPF_CORNER_SHIFT,
89 da7213_audio_hpf_corner_txt); 89 da7213_audio_hpf_corner_txt);
90 90
91/* Gain ramping rate value */ 91/* Gain ramping rate value */
92static const char * const da7213_gain_ramp_rate_txt[] = { 92static const char * const da7213_gain_ramp_rate_txt[] = {
@@ -94,52 +94,50 @@ static const char * const da7213_gain_ramp_rate_txt[] = {
94 "nominal rate / 32" 94 "nominal rate / 32"
95}; 95};
96 96
97static const struct soc_enum da7213_gain_ramp_rate = 97static SOC_ENUM_SINGLE_DECL(da7213_gain_ramp_rate,
98 SOC_ENUM_SINGLE(DA7213_GAIN_RAMP_CTRL, DA7213_GAIN_RAMP_RATE_SHIFT, 98 DA7213_GAIN_RAMP_CTRL,
99 DA7213_GAIN_RAMP_RATE_MAX, da7213_gain_ramp_rate_txt); 99 DA7213_GAIN_RAMP_RATE_SHIFT,
100 da7213_gain_ramp_rate_txt);
100 101
101/* DAC noise gate setup time value */ 102/* DAC noise gate setup time value */
102static const char * const da7213_dac_ng_setup_time_txt[] = { 103static const char * const da7213_dac_ng_setup_time_txt[] = {
103 "256 samples", "512 samples", "1024 samples", "2048 samples" 104 "256 samples", "512 samples", "1024 samples", "2048 samples"
104}; 105};
105 106
106static const struct soc_enum da7213_dac_ng_setup_time = 107static SOC_ENUM_SINGLE_DECL(da7213_dac_ng_setup_time,
107 SOC_ENUM_SINGLE(DA7213_DAC_NG_SETUP_TIME, 108 DA7213_DAC_NG_SETUP_TIME,
108 DA7213_DAC_NG_SETUP_TIME_SHIFT, 109 DA7213_DAC_NG_SETUP_TIME_SHIFT,
109 DA7213_DAC_NG_SETUP_TIME_MAX, 110 da7213_dac_ng_setup_time_txt);
110 da7213_dac_ng_setup_time_txt);
111 111
112/* DAC noise gate rampup rate value */ 112/* DAC noise gate rampup rate value */
113static const char * const da7213_dac_ng_rampup_txt[] = { 113static const char * const da7213_dac_ng_rampup_txt[] = {
114 "0.02 ms/dB", "0.16 ms/dB" 114 "0.02 ms/dB", "0.16 ms/dB"
115}; 115};
116 116
117static const struct soc_enum da7213_dac_ng_rampup_rate = 117static SOC_ENUM_SINGLE_DECL(da7213_dac_ng_rampup_rate,
118 SOC_ENUM_SINGLE(DA7213_DAC_NG_SETUP_TIME, 118 DA7213_DAC_NG_SETUP_TIME,
119 DA7213_DAC_NG_RAMPUP_RATE_SHIFT, 119 DA7213_DAC_NG_RAMPUP_RATE_SHIFT,
120 DA7213_DAC_NG_RAMP_RATE_MAX, 120 da7213_dac_ng_rampup_txt);
121 da7213_dac_ng_rampup_txt);
122 121
123/* DAC noise gate rampdown rate value */ 122/* DAC noise gate rampdown rate value */
124static const char * const da7213_dac_ng_rampdown_txt[] = { 123static const char * const da7213_dac_ng_rampdown_txt[] = {
125 "0.64 ms/dB", "20.48 ms/dB" 124 "0.64 ms/dB", "20.48 ms/dB"
126}; 125};
127 126
128static const struct soc_enum da7213_dac_ng_rampdown_rate = 127static SOC_ENUM_SINGLE_DECL(da7213_dac_ng_rampdown_rate,
129 SOC_ENUM_SINGLE(DA7213_DAC_NG_SETUP_TIME, 128 DA7213_DAC_NG_SETUP_TIME,
130 DA7213_DAC_NG_RAMPDN_RATE_SHIFT, 129 DA7213_DAC_NG_RAMPDN_RATE_SHIFT,
131 DA7213_DAC_NG_RAMP_RATE_MAX, 130 da7213_dac_ng_rampdown_txt);
132 da7213_dac_ng_rampdown_txt);
133 131
134/* DAC soft mute rate value */ 132/* DAC soft mute rate value */
135static const char * const da7213_dac_soft_mute_rate_txt[] = { 133static const char * const da7213_dac_soft_mute_rate_txt[] = {
136 "1", "2", "4", "8", "16", "32", "64" 134 "1", "2", "4", "8", "16", "32", "64"
137}; 135};
138 136
139static const struct soc_enum da7213_dac_soft_mute_rate = 137static SOC_ENUM_SINGLE_DECL(da7213_dac_soft_mute_rate,
140 SOC_ENUM_SINGLE(DA7213_DAC_FILTERS5, DA7213_DAC_SOFTMUTE_RATE_SHIFT, 138 DA7213_DAC_FILTERS5,
141 DA7213_DAC_SOFTMUTE_RATE_MAX, 139 DA7213_DAC_SOFTMUTE_RATE_SHIFT,
142 da7213_dac_soft_mute_rate_txt); 140 da7213_dac_soft_mute_rate_txt);
143 141
144/* ALC Attack Rate select */ 142/* ALC Attack Rate select */
145static const char * const da7213_alc_attack_rate_txt[] = { 143static const char * const da7213_alc_attack_rate_txt[] = {
@@ -147,9 +145,10 @@ static const char * const da7213_alc_attack_rate_txt[] = {
147 "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" 145 "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
148}; 146};
149 147
150static const struct soc_enum da7213_alc_attack_rate = 148static SOC_ENUM_SINGLE_DECL(da7213_alc_attack_rate,
151 SOC_ENUM_SINGLE(DA7213_ALC_CTRL2, DA7213_ALC_ATTACK_SHIFT, 149 DA7213_ALC_CTRL2,
152 DA7213_ALC_ATTACK_MAX, da7213_alc_attack_rate_txt); 150 DA7213_ALC_ATTACK_SHIFT,
151 da7213_alc_attack_rate_txt);
153 152
154/* ALC Release Rate select */ 153/* ALC Release Rate select */
155static const char * const da7213_alc_release_rate_txt[] = { 154static const char * const da7213_alc_release_rate_txt[] = {
@@ -157,9 +156,10 @@ static const char * const da7213_alc_release_rate_txt[] = {
157 "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" 156 "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
158}; 157};
159 158
160static const struct soc_enum da7213_alc_release_rate = 159static SOC_ENUM_SINGLE_DECL(da7213_alc_release_rate,
161 SOC_ENUM_SINGLE(DA7213_ALC_CTRL2, DA7213_ALC_RELEASE_SHIFT, 160 DA7213_ALC_CTRL2,
162 DA7213_ALC_RELEASE_MAX, da7213_alc_release_rate_txt); 161 DA7213_ALC_RELEASE_SHIFT,
162 da7213_alc_release_rate_txt);
163 163
164/* ALC Hold Time select */ 164/* ALC Hold Time select */
165static const char * const da7213_alc_hold_time_txt[] = { 165static const char * const da7213_alc_hold_time_txt[] = {
@@ -168,22 +168,25 @@ static const char * const da7213_alc_hold_time_txt[] = {
168 "253952/fs", "507904/fs", "1015808/fs", "2031616/fs" 168 "253952/fs", "507904/fs", "1015808/fs", "2031616/fs"
169}; 169};
170 170
171static const struct soc_enum da7213_alc_hold_time = 171static SOC_ENUM_SINGLE_DECL(da7213_alc_hold_time,
172 SOC_ENUM_SINGLE(DA7213_ALC_CTRL3, DA7213_ALC_HOLD_SHIFT, 172 DA7213_ALC_CTRL3,
173 DA7213_ALC_HOLD_MAX, da7213_alc_hold_time_txt); 173 DA7213_ALC_HOLD_SHIFT,
174 da7213_alc_hold_time_txt);
174 175
175/* ALC Input Signal Tracking rate select */ 176/* ALC Input Signal Tracking rate select */
176static const char * const da7213_alc_integ_rate_txt[] = { 177static const char * const da7213_alc_integ_rate_txt[] = {
177 "1/4", "1/16", "1/256", "1/65536" 178 "1/4", "1/16", "1/256", "1/65536"
178}; 179};
179 180
180static const struct soc_enum da7213_alc_integ_attack_rate = 181static SOC_ENUM_SINGLE_DECL(da7213_alc_integ_attack_rate,
181 SOC_ENUM_SINGLE(DA7213_ALC_CTRL3, DA7213_ALC_INTEG_ATTACK_SHIFT, 182 DA7213_ALC_CTRL3,
182 DA7213_ALC_INTEG_MAX, da7213_alc_integ_rate_txt); 183 DA7213_ALC_INTEG_ATTACK_SHIFT,
184 da7213_alc_integ_rate_txt);
183 185
184static const struct soc_enum da7213_alc_integ_release_rate = 186static SOC_ENUM_SINGLE_DECL(da7213_alc_integ_release_rate,
185 SOC_ENUM_SINGLE(DA7213_ALC_CTRL3, DA7213_ALC_INTEG_RELEASE_SHIFT, 187 DA7213_ALC_CTRL3,
186 DA7213_ALC_INTEG_MAX, da7213_alc_integ_rate_txt); 188 DA7213_ALC_INTEG_RELEASE_SHIFT,
189 da7213_alc_integ_rate_txt);
187 190
188 191
189/* 192/*
@@ -584,15 +587,17 @@ static const char * const da7213_mic_amp_in_sel_txt[] = {
584 "Differential", "MIC_P", "MIC_N" 587 "Differential", "MIC_P", "MIC_N"
585}; 588};
586 589
587static const struct soc_enum da7213_mic_1_amp_in_sel = 590static SOC_ENUM_SINGLE_DECL(da7213_mic_1_amp_in_sel,
588 SOC_ENUM_SINGLE(DA7213_MIC_1_CTRL, DA7213_MIC_AMP_IN_SEL_SHIFT, 591 DA7213_MIC_1_CTRL,
589 DA7213_MIC_AMP_IN_SEL_MAX, da7213_mic_amp_in_sel_txt); 592 DA7213_MIC_AMP_IN_SEL_SHIFT,
593 da7213_mic_amp_in_sel_txt);
590static const struct snd_kcontrol_new da7213_mic_1_amp_in_sel_mux = 594static const struct snd_kcontrol_new da7213_mic_1_amp_in_sel_mux =
591 SOC_DAPM_ENUM("Mic 1 Amp Source MUX", da7213_mic_1_amp_in_sel); 595 SOC_DAPM_ENUM("Mic 1 Amp Source MUX", da7213_mic_1_amp_in_sel);
592 596
593static const struct soc_enum da7213_mic_2_amp_in_sel = 597static SOC_ENUM_SINGLE_DECL(da7213_mic_2_amp_in_sel,
594 SOC_ENUM_SINGLE(DA7213_MIC_2_CTRL, DA7213_MIC_AMP_IN_SEL_SHIFT, 598 DA7213_MIC_2_CTRL,
595 DA7213_MIC_AMP_IN_SEL_MAX, da7213_mic_amp_in_sel_txt); 599 DA7213_MIC_AMP_IN_SEL_SHIFT,
600 da7213_mic_amp_in_sel_txt);
596static const struct snd_kcontrol_new da7213_mic_2_amp_in_sel_mux = 601static const struct snd_kcontrol_new da7213_mic_2_amp_in_sel_mux =
597 SOC_DAPM_ENUM("Mic 2 Amp Source MUX", da7213_mic_2_amp_in_sel); 602 SOC_DAPM_ENUM("Mic 2 Amp Source MUX", da7213_mic_2_amp_in_sel);
598 603
@@ -601,15 +606,17 @@ static const char * const da7213_dai_src_txt[] = {
601 "ADC Left", "ADC Right", "DAI Input Left", "DAI Input Right" 606 "ADC Left", "ADC Right", "DAI Input Left", "DAI Input Right"
602}; 607};
603 608
604static const struct soc_enum da7213_dai_l_src = 609static SOC_ENUM_SINGLE_DECL(da7213_dai_l_src,
605 SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAI, DA7213_DAI_L_SRC_SHIFT, 610 DA7213_DIG_ROUTING_DAI,
606 DA7213_DAI_SRC_MAX, da7213_dai_src_txt); 611 DA7213_DAI_L_SRC_SHIFT,
612 da7213_dai_src_txt);
607static const struct snd_kcontrol_new da7213_dai_l_src_mux = 613static const struct snd_kcontrol_new da7213_dai_l_src_mux =
608 SOC_DAPM_ENUM("DAI Left Source MUX", da7213_dai_l_src); 614 SOC_DAPM_ENUM("DAI Left Source MUX", da7213_dai_l_src);
609 615
610static const struct soc_enum da7213_dai_r_src = 616static SOC_ENUM_SINGLE_DECL(da7213_dai_r_src,
611 SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAI, DA7213_DAI_R_SRC_SHIFT, 617 DA7213_DIG_ROUTING_DAI,
612 DA7213_DAI_SRC_MAX, da7213_dai_src_txt); 618 DA7213_DAI_R_SRC_SHIFT,
619 da7213_dai_src_txt);
613static const struct snd_kcontrol_new da7213_dai_r_src_mux = 620static const struct snd_kcontrol_new da7213_dai_r_src_mux =
614 SOC_DAPM_ENUM("DAI Right Source MUX", da7213_dai_r_src); 621 SOC_DAPM_ENUM("DAI Right Source MUX", da7213_dai_r_src);
615 622
@@ -619,15 +626,17 @@ static const char * const da7213_dac_src_txt[] = {
619 "DAI Input Right" 626 "DAI Input Right"
620}; 627};
621 628
622static const struct soc_enum da7213_dac_l_src = 629static SOC_ENUM_SINGLE_DECL(da7213_dac_l_src,
623 SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAC, DA7213_DAC_L_SRC_SHIFT, 630 DA7213_DIG_ROUTING_DAC,
624 DA7213_DAC_SRC_MAX, da7213_dac_src_txt); 631 DA7213_DAC_L_SRC_SHIFT,
632 da7213_dac_src_txt);
625static const struct snd_kcontrol_new da7213_dac_l_src_mux = 633static const struct snd_kcontrol_new da7213_dac_l_src_mux =
626 SOC_DAPM_ENUM("DAC Left Source MUX", da7213_dac_l_src); 634 SOC_DAPM_ENUM("DAC Left Source MUX", da7213_dac_l_src);
627 635
628static const struct soc_enum da7213_dac_r_src = 636static SOC_ENUM_SINGLE_DECL(da7213_dac_r_src,
629 SOC_ENUM_SINGLE(DA7213_DIG_ROUTING_DAC, DA7213_DAC_R_SRC_SHIFT, 637 DA7213_DIG_ROUTING_DAC,
630 DA7213_DAC_SRC_MAX, da7213_dac_src_txt); 638 DA7213_DAC_R_SRC_SHIFT,
639 da7213_dac_src_txt);
631static const struct snd_kcontrol_new da7213_dac_r_src_mux = 640static const struct snd_kcontrol_new da7213_dac_r_src_mux =
632 SOC_DAPM_ENUM("DAC Right Source MUX", da7213_dac_r_src); 641 SOC_DAPM_ENUM("DAC Right Source MUX", da7213_dac_r_src);
633 642
diff --git a/sound/soc/codecs/da732x.c b/sound/soc/codecs/da732x.c
index f4d965ebc29e..4d1c302f5a76 100644
--- a/sound/soc/codecs/da732x.c
+++ b/sound/soc/codecs/da732x.c
@@ -269,81 +269,65 @@ static const char *da732x_hpf_voice[] = {
269 "150Hz", "200Hz", "300Hz", "400Hz" 269 "150Hz", "200Hz", "300Hz", "400Hz"
270}; 270};
271 271
272static const struct soc_enum da732x_dac1_hpf_mode_enum[] = { 272static SOC_ENUM_SINGLE_DECL(da732x_dac1_hpf_mode_enum,
273 SOC_ENUM_SINGLE(DA732X_REG_DAC1_HPF, DA732X_HPF_MODE_SHIFT, 273 DA732X_REG_DAC1_HPF, DA732X_HPF_MODE_SHIFT,
274 DA732X_HPF_MODE_MAX, da732x_hpf_mode) 274 da732x_hpf_mode);
275};
276
277static const struct soc_enum da732x_dac2_hpf_mode_enum[] = {
278 SOC_ENUM_SINGLE(DA732X_REG_DAC2_HPF, DA732X_HPF_MODE_SHIFT,
279 DA732X_HPF_MODE_MAX, da732x_hpf_mode)
280};
281 275
282static const struct soc_enum da732x_dac3_hpf_mode_enum[] = { 276static SOC_ENUM_SINGLE_DECL(da732x_dac2_hpf_mode_enum,
283 SOC_ENUM_SINGLE(DA732X_REG_DAC3_HPF, DA732X_HPF_MODE_SHIFT, 277 DA732X_REG_DAC2_HPF, DA732X_HPF_MODE_SHIFT,
284 DA732X_HPF_MODE_MAX, da732x_hpf_mode) 278 da732x_hpf_mode);
285};
286 279
287static const struct soc_enum da732x_adc1_hpf_mode_enum[] = { 280static SOC_ENUM_SINGLE_DECL(da732x_dac3_hpf_mode_enum,
288 SOC_ENUM_SINGLE(DA732X_REG_ADC1_HPF, DA732X_HPF_MODE_SHIFT, 281 DA732X_REG_DAC3_HPF, DA732X_HPF_MODE_SHIFT,
289 DA732X_HPF_MODE_MAX, da732x_hpf_mode) 282 da732x_hpf_mode);
290};
291 283
292static const struct soc_enum da732x_adc2_hpf_mode_enum[] = { 284static SOC_ENUM_SINGLE_DECL(da732x_adc1_hpf_mode_enum,
293 SOC_ENUM_SINGLE(DA732X_REG_ADC2_HPF, DA732X_HPF_MODE_SHIFT, 285 DA732X_REG_ADC1_HPF, DA732X_HPF_MODE_SHIFT,
294 DA732X_HPF_MODE_MAX, da732x_hpf_mode) 286 da732x_hpf_mode);
295};
296 287
297static const struct soc_enum da732x_dac1_hp_filter_enum[] = { 288static SOC_ENUM_SINGLE_DECL(da732x_adc2_hpf_mode_enum,
298 SOC_ENUM_SINGLE(DA732X_REG_DAC1_HPF, DA732X_HPF_MUSIC_SHIFT, 289 DA732X_REG_ADC2_HPF, DA732X_HPF_MODE_SHIFT,
299 DA732X_HPF_MUSIC_MAX, da732x_hpf_music) 290 da732x_hpf_mode);
300};
301 291
302static const struct soc_enum da732x_dac2_hp_filter_enum[] = { 292static SOC_ENUM_SINGLE_DECL(da732x_dac1_hp_filter_enum,
303 SOC_ENUM_SINGLE(DA732X_REG_DAC2_HPF, DA732X_HPF_MUSIC_SHIFT, 293 DA732X_REG_DAC1_HPF, DA732X_HPF_MUSIC_SHIFT,
304 DA732X_HPF_MUSIC_MAX, da732x_hpf_music) 294 da732x_hpf_music);
305};
306 295
307static const struct soc_enum da732x_dac3_hp_filter_enum[] = { 296static SOC_ENUM_SINGLE_DECL(da732x_dac2_hp_filter_enum,
308 SOC_ENUM_SINGLE(DA732X_REG_DAC3_HPF, DA732X_HPF_MUSIC_SHIFT, 297 DA732X_REG_DAC2_HPF, DA732X_HPF_MUSIC_SHIFT,
309 DA732X_HPF_MUSIC_MAX, da732x_hpf_music) 298 da732x_hpf_music);
310};
311 299
312static const struct soc_enum da732x_adc1_hp_filter_enum[] = { 300static SOC_ENUM_SINGLE_DECL(da732x_dac3_hp_filter_enum,
313 SOC_ENUM_SINGLE(DA732X_REG_ADC1_HPF, DA732X_HPF_MUSIC_SHIFT, 301 DA732X_REG_DAC3_HPF, DA732X_HPF_MUSIC_SHIFT,
314 DA732X_HPF_MUSIC_MAX, da732x_hpf_music) 302 da732x_hpf_music);
315};
316 303
317static const struct soc_enum da732x_adc2_hp_filter_enum[] = { 304static SOC_ENUM_SINGLE_DECL(da732x_adc1_hp_filter_enum,
318 SOC_ENUM_SINGLE(DA732X_REG_ADC2_HPF, DA732X_HPF_MUSIC_SHIFT, 305 DA732X_REG_ADC1_HPF, DA732X_HPF_MUSIC_SHIFT,
319 DA732X_HPF_MUSIC_MAX, da732x_hpf_music) 306 da732x_hpf_music);
320};
321 307
322static const struct soc_enum da732x_dac1_voice_filter_enum[] = { 308static SOC_ENUM_SINGLE_DECL(da732x_adc2_hp_filter_enum,
323 SOC_ENUM_SINGLE(DA732X_REG_DAC1_HPF, DA732X_HPF_VOICE_SHIFT, 309 DA732X_REG_ADC2_HPF, DA732X_HPF_MUSIC_SHIFT,
324 DA732X_HPF_VOICE_MAX, da732x_hpf_voice) 310 da732x_hpf_music);
325};
326 311
327static const struct soc_enum da732x_dac2_voice_filter_enum[] = { 312static SOC_ENUM_SINGLE_DECL(da732x_dac1_voice_filter_enum,
328 SOC_ENUM_SINGLE(DA732X_REG_DAC2_HPF, DA732X_HPF_VOICE_SHIFT, 313 DA732X_REG_DAC1_HPF, DA732X_HPF_VOICE_SHIFT,
329 DA732X_HPF_VOICE_MAX, da732x_hpf_voice) 314 da732x_hpf_voice);
330};
331 315
332static const struct soc_enum da732x_dac3_voice_filter_enum[] = { 316static SOC_ENUM_SINGLE_DECL(da732x_dac2_voice_filter_enum,
333 SOC_ENUM_SINGLE(DA732X_REG_DAC3_HPF, DA732X_HPF_VOICE_SHIFT, 317 DA732X_REG_DAC2_HPF, DA732X_HPF_VOICE_SHIFT,
334 DA732X_HPF_VOICE_MAX, da732x_hpf_voice) 318 da732x_hpf_voice);
335};
336 319
337static const struct soc_enum da732x_adc1_voice_filter_enum[] = { 320static SOC_ENUM_SINGLE_DECL(da732x_dac3_voice_filter_enum,
338 SOC_ENUM_SINGLE(DA732X_REG_ADC1_HPF, DA732X_HPF_VOICE_SHIFT, 321 DA732X_REG_DAC3_HPF, DA732X_HPF_VOICE_SHIFT,
339 DA732X_HPF_VOICE_MAX, da732x_hpf_voice) 322 da732x_hpf_voice);
340};
341 323
342static const struct soc_enum da732x_adc2_voice_filter_enum[] = { 324static SOC_ENUM_SINGLE_DECL(da732x_adc1_voice_filter_enum,
343 SOC_ENUM_SINGLE(DA732X_REG_ADC2_HPF, DA732X_HPF_VOICE_SHIFT, 325 DA732X_REG_ADC1_HPF, DA732X_HPF_VOICE_SHIFT,
344 DA732X_HPF_VOICE_MAX, da732x_hpf_voice) 326 da732x_hpf_voice);
345};
346 327
328static SOC_ENUM_SINGLE_DECL(da732x_adc2_voice_filter_enum,
329 DA732X_REG_ADC2_HPF, DA732X_HPF_VOICE_SHIFT,
330 da732x_hpf_voice);
347 331
348static int da732x_hpf_set(struct snd_kcontrol *kcontrol, 332static int da732x_hpf_set(struct snd_kcontrol *kcontrol,
349 struct snd_ctl_elem_value *ucontrol) 333 struct snd_ctl_elem_value *ucontrol)
@@ -714,65 +698,65 @@ static const char *enable_text[] = {
714}; 698};
715 699
716/* ADC1LMUX */ 700/* ADC1LMUX */
717static const struct soc_enum adc1l_enum = 701static SOC_ENUM_SINGLE_DECL(adc1l_enum,
718 SOC_ENUM_SINGLE(DA732X_REG_INP_MUX, DA732X_ADC1L_MUX_SEL_SHIFT, 702 DA732X_REG_INP_MUX, DA732X_ADC1L_MUX_SEL_SHIFT,
719 DA732X_ADCL_MUX_MAX, adcl_text); 703 adcl_text);
720static const struct snd_kcontrol_new adc1l_mux = 704static const struct snd_kcontrol_new adc1l_mux =
721 SOC_DAPM_ENUM("ADC Route", adc1l_enum); 705 SOC_DAPM_ENUM("ADC Route", adc1l_enum);
722 706
723/* ADC1RMUX */ 707/* ADC1RMUX */
724static const struct soc_enum adc1r_enum = 708static SOC_ENUM_SINGLE_DECL(adc1r_enum,
725 SOC_ENUM_SINGLE(DA732X_REG_INP_MUX, DA732X_ADC1R_MUX_SEL_SHIFT, 709 DA732X_REG_INP_MUX, DA732X_ADC1R_MUX_SEL_SHIFT,
726 DA732X_ADCR_MUX_MAX, adcr_text); 710 adcr_text);
727static const struct snd_kcontrol_new adc1r_mux = 711static const struct snd_kcontrol_new adc1r_mux =
728 SOC_DAPM_ENUM("ADC Route", adc1r_enum); 712 SOC_DAPM_ENUM("ADC Route", adc1r_enum);
729 713
730/* ADC2LMUX */ 714/* ADC2LMUX */
731static const struct soc_enum adc2l_enum = 715static SOC_ENUM_SINGLE_DECL(adc2l_enum,
732 SOC_ENUM_SINGLE(DA732X_REG_INP_MUX, DA732X_ADC2L_MUX_SEL_SHIFT, 716 DA732X_REG_INP_MUX, DA732X_ADC2L_MUX_SEL_SHIFT,
733 DA732X_ADCL_MUX_MAX, adcl_text); 717 adcl_text);
734static const struct snd_kcontrol_new adc2l_mux = 718static const struct snd_kcontrol_new adc2l_mux =
735 SOC_DAPM_ENUM("ADC Route", adc2l_enum); 719 SOC_DAPM_ENUM("ADC Route", adc2l_enum);
736 720
737/* ADC2RMUX */ 721/* ADC2RMUX */
738static const struct soc_enum adc2r_enum = 722static SOC_ENUM_SINGLE_DECL(adc2r_enum,
739 SOC_ENUM_SINGLE(DA732X_REG_INP_MUX, DA732X_ADC2R_MUX_SEL_SHIFT, 723 DA732X_REG_INP_MUX, DA732X_ADC2R_MUX_SEL_SHIFT,
740 DA732X_ADCR_MUX_MAX, adcr_text); 724 adcr_text);
741 725
742static const struct snd_kcontrol_new adc2r_mux = 726static const struct snd_kcontrol_new adc2r_mux =
743 SOC_DAPM_ENUM("ADC Route", adc2r_enum); 727 SOC_DAPM_ENUM("ADC Route", adc2r_enum);
744 728
745static const struct soc_enum da732x_hp_left_output = 729static SOC_ENUM_SINGLE_DECL(da732x_hp_left_output,
746 SOC_ENUM_SINGLE(DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN_SHIFT, 730 DA732X_REG_HPL, DA732X_HP_OUT_DAC_EN_SHIFT,
747 DA732X_DAC_EN_MAX, enable_text); 731 enable_text);
748 732
749static const struct snd_kcontrol_new hpl_mux = 733static const struct snd_kcontrol_new hpl_mux =
750 SOC_DAPM_ENUM("HPL Switch", da732x_hp_left_output); 734 SOC_DAPM_ENUM("HPL Switch", da732x_hp_left_output);
751 735
752static const struct soc_enum da732x_hp_right_output = 736static SOC_ENUM_SINGLE_DECL(da732x_hp_right_output,
753 SOC_ENUM_SINGLE(DA732X_REG_HPR, DA732X_HP_OUT_DAC_EN_SHIFT, 737 DA732X_REG_HPR, DA732X_HP_OUT_DAC_EN_SHIFT,
754 DA732X_DAC_EN_MAX, enable_text); 738 enable_text);
755 739
756static const struct snd_kcontrol_new hpr_mux = 740static const struct snd_kcontrol_new hpr_mux =
757 SOC_DAPM_ENUM("HPR Switch", da732x_hp_right_output); 741 SOC_DAPM_ENUM("HPR Switch", da732x_hp_right_output);
758 742
759static const struct soc_enum da732x_speaker_output = 743static SOC_ENUM_SINGLE_DECL(da732x_speaker_output,
760 SOC_ENUM_SINGLE(DA732X_REG_LIN3, DA732X_LOUT_DAC_EN_SHIFT, 744 DA732X_REG_LIN3, DA732X_LOUT_DAC_EN_SHIFT,
761 DA732X_DAC_EN_MAX, enable_text); 745 enable_text);
762 746
763static const struct snd_kcontrol_new spk_mux = 747static const struct snd_kcontrol_new spk_mux =
764 SOC_DAPM_ENUM("SPK Switch", da732x_speaker_output); 748 SOC_DAPM_ENUM("SPK Switch", da732x_speaker_output);
765 749
766static const struct soc_enum da732x_lout4_output = 750static SOC_ENUM_SINGLE_DECL(da732x_lout4_output,
767 SOC_ENUM_SINGLE(DA732X_REG_LIN4, DA732X_LOUT_DAC_EN_SHIFT, 751 DA732X_REG_LIN4, DA732X_LOUT_DAC_EN_SHIFT,
768 DA732X_DAC_EN_MAX, enable_text); 752 enable_text);
769 753
770static const struct snd_kcontrol_new lout4_mux = 754static const struct snd_kcontrol_new lout4_mux =
771 SOC_DAPM_ENUM("LOUT4 Switch", da732x_lout4_output); 755 SOC_DAPM_ENUM("LOUT4 Switch", da732x_lout4_output);
772 756
773static const struct soc_enum da732x_lout2_output = 757static SOC_ENUM_SINGLE_DECL(da732x_lout2_output,
774 SOC_ENUM_SINGLE(DA732X_REG_LIN2, DA732X_LOUT_DAC_EN_SHIFT, 758 DA732X_REG_LIN2, DA732X_LOUT_DAC_EN_SHIFT,
775 DA732X_DAC_EN_MAX, enable_text); 759 enable_text);
776 760
777static const struct snd_kcontrol_new lout2_mux = 761static const struct snd_kcontrol_new lout2_mux =
778 SOC_DAPM_ENUM("LOUT2 Switch", da732x_lout2_output); 762 SOC_DAPM_ENUM("LOUT2 Switch", da732x_lout2_output);
@@ -1499,8 +1483,8 @@ static int da732x_set_bias_level(struct snd_soc_codec *codec,
1499 1483
1500 da732x_hp_dc_offset_cancellation(codec); 1484 da732x_hp_dc_offset_cancellation(codec);
1501 1485
1502 regcache_cache_only(codec->control_data, false); 1486 regcache_cache_only(da732x->regmap, false);
1503 regcache_sync(codec->control_data); 1487 regcache_sync(da732x->regmap);
1504 } else { 1488 } else {
1505 snd_soc_update_bits(codec, DA732X_REG_BIAS_EN, 1489 snd_soc_update_bits(codec, DA732X_REG_BIAS_EN,
1506 DA732X_BIAS_BOOST_MASK, 1490 DA732X_BIAS_BOOST_MASK,
@@ -1511,7 +1495,7 @@ static int da732x_set_bias_level(struct snd_soc_codec *codec,
1511 } 1495 }
1512 break; 1496 break;
1513 case SND_SOC_BIAS_OFF: 1497 case SND_SOC_BIAS_OFF:
1514 regcache_cache_only(codec->control_data, true); 1498 regcache_cache_only(da732x->regmap, true);
1515 da732x_set_charge_pump(codec, DA732X_DISABLE_CP); 1499 da732x_set_charge_pump(codec, DA732X_DISABLE_CP);
1516 snd_soc_update_bits(codec, DA732X_REG_BIAS_EN, DA732X_BIAS_EN, 1500 snd_soc_update_bits(codec, DA732X_REG_BIAS_EN, DA732X_BIAS_EN,
1517 DA732X_BIAS_DIS); 1501 DA732X_BIAS_DIS);
@@ -1566,7 +1550,6 @@ static struct snd_soc_codec_driver soc_codec_dev_da732x = {
1566 .dapm_routes = da732x_dapm_routes, 1550 .dapm_routes = da732x_dapm_routes,
1567 .num_dapm_routes = ARRAY_SIZE(da732x_dapm_routes), 1551 .num_dapm_routes = ARRAY_SIZE(da732x_dapm_routes),
1568 .set_pll = da732x_set_dai_pll, 1552 .set_pll = da732x_set_dai_pll,
1569 .reg_cache_size = ARRAY_SIZE(da732x_reg_cache),
1570}; 1553};
1571 1554
1572static int da732x_i2c_probe(struct i2c_client *i2c, 1555static int da732x_i2c_probe(struct i2c_client *i2c,
diff --git a/sound/soc/codecs/da9055.c b/sound/soc/codecs/da9055.c
index 422812613a28..f118daa91234 100644
--- a/sound/soc/codecs/da9055.c
+++ b/sound/soc/codecs/da9055.c
@@ -18,6 +18,8 @@
18#include <linux/regmap.h> 18#include <linux/regmap.h>
19#include <linux/slab.h> 19#include <linux/slab.h>
20#include <linux/module.h> 20#include <linux/module.h>
21#include <linux/of.h>
22#include <linux/of_device.h>
21#include <sound/pcm.h> 23#include <sound/pcm.h>
22#include <sound/pcm_params.h> 24#include <sound/pcm_params.h>
23#include <sound/soc.h> 25#include <sound/soc.h>
@@ -321,22 +323,22 @@ static const char * const da9055_hpf_cutoff_txt[] = {
321 "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000" 323 "Fs/24000", "Fs/12000", "Fs/6000", "Fs/3000"
322}; 324};
323 325
324static const struct soc_enum da9055_dac_hpf_cutoff = 326static SOC_ENUM_SINGLE_DECL(da9055_dac_hpf_cutoff,
325 SOC_ENUM_SINGLE(DA9055_DAC_FILTERS1, 4, 4, da9055_hpf_cutoff_txt); 327 DA9055_DAC_FILTERS1, 4, da9055_hpf_cutoff_txt);
326 328
327static const struct soc_enum da9055_adc_hpf_cutoff = 329static SOC_ENUM_SINGLE_DECL(da9055_adc_hpf_cutoff,
328 SOC_ENUM_SINGLE(DA9055_ADC_FILTERS1, 4, 4, da9055_hpf_cutoff_txt); 330 DA9055_ADC_FILTERS1, 4, da9055_hpf_cutoff_txt);
329 331
330/* ADC and DAC voice mode (8kHz) high pass cutoff value */ 332/* ADC and DAC voice mode (8kHz) high pass cutoff value */
331static const char * const da9055_vf_cutoff_txt[] = { 333static const char * const da9055_vf_cutoff_txt[] = {
332 "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz" 334 "2.5Hz", "25Hz", "50Hz", "100Hz", "150Hz", "200Hz", "300Hz", "400Hz"
333}; 335};
334 336
335static const struct soc_enum da9055_dac_vf_cutoff = 337static SOC_ENUM_SINGLE_DECL(da9055_dac_vf_cutoff,
336 SOC_ENUM_SINGLE(DA9055_DAC_FILTERS1, 0, 8, da9055_vf_cutoff_txt); 338 DA9055_DAC_FILTERS1, 0, da9055_vf_cutoff_txt);
337 339
338static const struct soc_enum da9055_adc_vf_cutoff = 340static SOC_ENUM_SINGLE_DECL(da9055_adc_vf_cutoff,
339 SOC_ENUM_SINGLE(DA9055_ADC_FILTERS1, 0, 8, da9055_vf_cutoff_txt); 341 DA9055_ADC_FILTERS1, 0, da9055_vf_cutoff_txt);
340 342
341/* Gain ramping rate value */ 343/* Gain ramping rate value */
342static const char * const da9055_gain_ramping_txt[] = { 344static const char * const da9055_gain_ramping_txt[] = {
@@ -344,44 +346,44 @@ static const char * const da9055_gain_ramping_txt[] = {
344 "nominal rate / 8" 346 "nominal rate / 8"
345}; 347};
346 348
347static const struct soc_enum da9055_gain_ramping_rate = 349static SOC_ENUM_SINGLE_DECL(da9055_gain_ramping_rate,
348 SOC_ENUM_SINGLE(DA9055_GAIN_RAMP_CTRL, 0, 4, da9055_gain_ramping_txt); 350 DA9055_GAIN_RAMP_CTRL, 0, da9055_gain_ramping_txt);
349 351
350/* DAC noise gate setup time value */ 352/* DAC noise gate setup time value */
351static const char * const da9055_dac_ng_setup_time_txt[] = { 353static const char * const da9055_dac_ng_setup_time_txt[] = {
352 "256 samples", "512 samples", "1024 samples", "2048 samples" 354 "256 samples", "512 samples", "1024 samples", "2048 samples"
353}; 355};
354 356
355static const struct soc_enum da9055_dac_ng_setup_time = 357static SOC_ENUM_SINGLE_DECL(da9055_dac_ng_setup_time,
356 SOC_ENUM_SINGLE(DA9055_DAC_NG_SETUP_TIME, 0, 4, 358 DA9055_DAC_NG_SETUP_TIME, 0,
357 da9055_dac_ng_setup_time_txt); 359 da9055_dac_ng_setup_time_txt);
358 360
359/* DAC noise gate rampup rate value */ 361/* DAC noise gate rampup rate value */
360static const char * const da9055_dac_ng_rampup_txt[] = { 362static const char * const da9055_dac_ng_rampup_txt[] = {
361 "0.02 ms/dB", "0.16 ms/dB" 363 "0.02 ms/dB", "0.16 ms/dB"
362}; 364};
363 365
364static const struct soc_enum da9055_dac_ng_rampup_rate = 366static SOC_ENUM_SINGLE_DECL(da9055_dac_ng_rampup_rate,
365 SOC_ENUM_SINGLE(DA9055_DAC_NG_SETUP_TIME, 2, 2, 367 DA9055_DAC_NG_SETUP_TIME, 2,
366 da9055_dac_ng_rampup_txt); 368 da9055_dac_ng_rampup_txt);
367 369
368/* DAC noise gate rampdown rate value */ 370/* DAC noise gate rampdown rate value */
369static const char * const da9055_dac_ng_rampdown_txt[] = { 371static const char * const da9055_dac_ng_rampdown_txt[] = {
370 "0.64 ms/dB", "20.48 ms/dB" 372 "0.64 ms/dB", "20.48 ms/dB"
371}; 373};
372 374
373static const struct soc_enum da9055_dac_ng_rampdown_rate = 375static SOC_ENUM_SINGLE_DECL(da9055_dac_ng_rampdown_rate,
374 SOC_ENUM_SINGLE(DA9055_DAC_NG_SETUP_TIME, 3, 2, 376 DA9055_DAC_NG_SETUP_TIME, 3,
375 da9055_dac_ng_rampdown_txt); 377 da9055_dac_ng_rampdown_txt);
376 378
377/* DAC soft mute rate value */ 379/* DAC soft mute rate value */
378static const char * const da9055_dac_soft_mute_rate_txt[] = { 380static const char * const da9055_dac_soft_mute_rate_txt[] = {
379 "1", "2", "4", "8", "16", "32", "64" 381 "1", "2", "4", "8", "16", "32", "64"
380}; 382};
381 383
382static const struct soc_enum da9055_dac_soft_mute_rate = 384static SOC_ENUM_SINGLE_DECL(da9055_dac_soft_mute_rate,
383 SOC_ENUM_SINGLE(DA9055_DAC_FILTERS5, 4, 7, 385 DA9055_DAC_FILTERS5, 4,
384 da9055_dac_soft_mute_rate_txt); 386 da9055_dac_soft_mute_rate_txt);
385 387
386/* DAC routing select */ 388/* DAC routing select */
387static const char * const da9055_dac_src_txt[] = { 389static const char * const da9055_dac_src_txt[] = {
@@ -389,40 +391,40 @@ static const char * const da9055_dac_src_txt[] = {
389 "AIF input right" 391 "AIF input right"
390}; 392};
391 393
392static const struct soc_enum da9055_dac_l_src = 394static SOC_ENUM_SINGLE_DECL(da9055_dac_l_src,
393 SOC_ENUM_SINGLE(DA9055_DIG_ROUTING_DAC, 0, 4, da9055_dac_src_txt); 395 DA9055_DIG_ROUTING_DAC, 0, da9055_dac_src_txt);
394 396
395static const struct soc_enum da9055_dac_r_src = 397static SOC_ENUM_SINGLE_DECL(da9055_dac_r_src,
396 SOC_ENUM_SINGLE(DA9055_DIG_ROUTING_DAC, 4, 4, da9055_dac_src_txt); 398 DA9055_DIG_ROUTING_DAC, 4, da9055_dac_src_txt);
397 399
398/* MIC PGA Left source select */ 400/* MIC PGA Left source select */
399static const char * const da9055_mic_l_src_txt[] = { 401static const char * const da9055_mic_l_src_txt[] = {
400 "MIC1_P_N", "MIC1_P", "MIC1_N", "MIC2_L" 402 "MIC1_P_N", "MIC1_P", "MIC1_N", "MIC2_L"
401}; 403};
402 404
403static const struct soc_enum da9055_mic_l_src = 405static SOC_ENUM_SINGLE_DECL(da9055_mic_l_src,
404 SOC_ENUM_SINGLE(DA9055_MIXIN_L_SELECT, 4, 4, da9055_mic_l_src_txt); 406 DA9055_MIXIN_L_SELECT, 4, da9055_mic_l_src_txt);
405 407
406/* MIC PGA Right source select */ 408/* MIC PGA Right source select */
407static const char * const da9055_mic_r_src_txt[] = { 409static const char * const da9055_mic_r_src_txt[] = {
408 "MIC2_R_L", "MIC2_R", "MIC2_L" 410 "MIC2_R_L", "MIC2_R", "MIC2_L"
409}; 411};
410 412
411static const struct soc_enum da9055_mic_r_src = 413static SOC_ENUM_SINGLE_DECL(da9055_mic_r_src,
412 SOC_ENUM_SINGLE(DA9055_MIXIN_R_SELECT, 4, 3, da9055_mic_r_src_txt); 414 DA9055_MIXIN_R_SELECT, 4, da9055_mic_r_src_txt);
413 415
414/* ALC Input Signal Tracking rate select */ 416/* ALC Input Signal Tracking rate select */
415static const char * const da9055_signal_tracking_rate_txt[] = { 417static const char * const da9055_signal_tracking_rate_txt[] = {
416 "1/4", "1/16", "1/256", "1/65536" 418 "1/4", "1/16", "1/256", "1/65536"
417}; 419};
418 420
419static const struct soc_enum da9055_integ_attack_rate = 421static SOC_ENUM_SINGLE_DECL(da9055_integ_attack_rate,
420 SOC_ENUM_SINGLE(DA9055_ALC_CTRL3, 4, 4, 422 DA9055_ALC_CTRL3, 4,
421 da9055_signal_tracking_rate_txt); 423 da9055_signal_tracking_rate_txt);
422 424
423static const struct soc_enum da9055_integ_release_rate = 425static SOC_ENUM_SINGLE_DECL(da9055_integ_release_rate,
424 SOC_ENUM_SINGLE(DA9055_ALC_CTRL3, 6, 4, 426 DA9055_ALC_CTRL3, 6,
425 da9055_signal_tracking_rate_txt); 427 da9055_signal_tracking_rate_txt);
426 428
427/* ALC Attack Rate select */ 429/* ALC Attack Rate select */
428static const char * const da9055_attack_rate_txt[] = { 430static const char * const da9055_attack_rate_txt[] = {
@@ -430,8 +432,8 @@ static const char * const da9055_attack_rate_txt[] = {
430 "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" 432 "5632/fs", "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
431}; 433};
432 434
433static const struct soc_enum da9055_attack_rate = 435static SOC_ENUM_SINGLE_DECL(da9055_attack_rate,
434 SOC_ENUM_SINGLE(DA9055_ALC_CTRL2, 0, 13, da9055_attack_rate_txt); 436 DA9055_ALC_CTRL2, 0, da9055_attack_rate_txt);
435 437
436/* ALC Release Rate select */ 438/* ALC Release Rate select */
437static const char * const da9055_release_rate_txt[] = { 439static const char * const da9055_release_rate_txt[] = {
@@ -439,8 +441,8 @@ static const char * const da9055_release_rate_txt[] = {
439 "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs" 441 "11264/fs", "22528/fs", "45056/fs", "90112/fs", "180224/fs"
440}; 442};
441 443
442static const struct soc_enum da9055_release_rate = 444static SOC_ENUM_SINGLE_DECL(da9055_release_rate,
443 SOC_ENUM_SINGLE(DA9055_ALC_CTRL2, 4, 11, da9055_release_rate_txt); 445 DA9055_ALC_CTRL2, 4, da9055_release_rate_txt);
444 446
445/* ALC Hold Time select */ 447/* ALC Hold Time select */
446static const char * const da9055_hold_time_txt[] = { 448static const char * const da9055_hold_time_txt[] = {
@@ -449,8 +451,8 @@ static const char * const da9055_hold_time_txt[] = {
449 "253952/fs", "507904/fs", "1015808/fs", "2031616/fs" 451 "253952/fs", "507904/fs", "1015808/fs", "2031616/fs"
450}; 452};
451 453
452static const struct soc_enum da9055_hold_time = 454static SOC_ENUM_SINGLE_DECL(da9055_hold_time,
453 SOC_ENUM_SINGLE(DA9055_ALC_CTRL3, 0, 16, da9055_hold_time_txt); 455 DA9055_ALC_CTRL3, 0, da9055_hold_time_txt);
454 456
455static int da9055_get_alc_data(struct snd_soc_codec *codec, u8 reg_val) 457static int da9055_get_alc_data(struct snd_soc_codec *codec, u8 reg_val)
456{ 458{
@@ -1536,11 +1538,17 @@ static const struct i2c_device_id da9055_i2c_id[] = {
1536}; 1538};
1537MODULE_DEVICE_TABLE(i2c, da9055_i2c_id); 1539MODULE_DEVICE_TABLE(i2c, da9055_i2c_id);
1538 1540
1541static const struct of_device_id da9055_of_match[] = {
1542 { .compatible = "dlg,da9055-codec", },
1543 { }
1544};
1545
1539/* I2C codec control layer */ 1546/* I2C codec control layer */
1540static struct i2c_driver da9055_i2c_driver = { 1547static struct i2c_driver da9055_i2c_driver = {
1541 .driver = { 1548 .driver = {
1542 .name = "da9055-codec", 1549 .name = "da9055-codec",
1543 .owner = THIS_MODULE, 1550 .owner = THIS_MODULE,
1551 .of_match_table = of_match_ptr(da9055_of_match),
1544 }, 1552 },
1545 .probe = da9055_i2c_probe, 1553 .probe = da9055_i2c_probe,
1546 .remove = da9055_remove, 1554 .remove = da9055_remove,
diff --git a/sound/soc/codecs/tlv320aic23-i2c.c b/sound/soc/codecs/tlv320aic23-i2c.c
new file mode 100644
index 000000000000..20fc46092c2c
--- /dev/null
+++ b/sound/soc/codecs/tlv320aic23-i2c.c
@@ -0,0 +1,59 @@
1/*
2 * ALSA SoC TLV320AIC23 codec driver I2C interface
3 *
4 * Author: Arun KS, <arunks@mistralsolutions.com>
5 * Copyright: (C) 2008 Mistral Solutions Pvt Ltd.,
6 *
7 * Based on sound/soc/codecs/wm8731.c by Richard Purdie
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14#include <linux/i2c.h>
15#include <linux/module.h>
16#include <linux/regmap.h>
17#include <sound/soc.h>
18
19#include "tlv320aic23.h"
20
21static int tlv320aic23_i2c_probe(struct i2c_client *i2c,
22 const struct i2c_device_id *i2c_id)
23{
24 struct regmap *regmap;
25
26 if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
27 return -EINVAL;
28
29 regmap = devm_regmap_init_i2c(i2c, &tlv320aic23_regmap);
30 return tlv320aic23_probe(&i2c->dev, regmap);
31}
32
33static int __exit tlv320aic23_i2c_remove(struct i2c_client *i2c)
34{
35 snd_soc_unregister_codec(&i2c->dev);
36 return 0;
37}
38
39static const struct i2c_device_id tlv320aic23_id[] = {
40 {"tlv320aic23", 0},
41 {}
42};
43
44MODULE_DEVICE_TABLE(i2c, tlv320aic23_id);
45
46static struct i2c_driver tlv320aic23_i2c_driver = {
47 .driver = {
48 .name = "tlv320aic23-codec",
49 },
50 .probe = tlv320aic23_i2c_probe,
51 .remove = __exit_p(tlv320aic23_i2c_remove),
52 .id_table = tlv320aic23_id,
53};
54
55module_i2c_driver(tlv320aic23_i2c_driver);
56
57MODULE_DESCRIPTION("ASoC TLV320AIC23 codec driver I2C");
58MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>");
59MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/tlv320aic23-spi.c b/sound/soc/codecs/tlv320aic23-spi.c
new file mode 100644
index 000000000000..585aea436c6a
--- /dev/null
+++ b/sound/soc/codecs/tlv320aic23-spi.c
@@ -0,0 +1,57 @@
1/*
2 * ALSA SoC TLV320AIC23 codec driver SPI interface
3 *
4 * Author: Arun KS, <arunks@mistralsolutions.com>
5 * Copyright: (C) 2008 Mistral Solutions Pvt Ltd.,
6 *
7 * Based on sound/soc/codecs/wm8731.c by Richard Purdie
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14#include <linux/module.h>
15#include <linux/regmap.h>
16#include <linux/spi/spi.h>
17#include <sound/soc.h>
18
19#include "tlv320aic23.h"
20
21static int aic23_spi_probe(struct spi_device *spi)
22{
23 int ret;
24 struct regmap *regmap;
25
26 dev_dbg(&spi->dev, "probing tlv320aic23 spi device\n");
27
28 spi->bits_per_word = 16;
29 spi->mode = SPI_MODE_0;
30 ret = spi_setup(spi);
31 if (ret < 0)
32 return ret;
33
34 regmap = devm_regmap_init_spi(spi, &tlv320aic23_regmap);
35 return tlv320aic23_probe(&spi->dev, regmap);
36}
37
38static int aic23_spi_remove(struct spi_device *spi)
39{
40 snd_soc_unregister_codec(&spi->dev);
41 return 0;
42}
43
44static struct spi_driver aic23_spi = {
45 .driver = {
46 .name = "tlv320aic23",
47 .owner = THIS_MODULE,
48 },
49 .probe = aic23_spi_probe,
50 .remove = aic23_spi_remove,
51};
52
53module_spi_driver(aic23_spi);
54
55MODULE_DESCRIPTION("ASoC TLV320AIC23 codec driver SPI");
56MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>");
57MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c
index 458a6aed203e..27261e4b27c7 100644
--- a/sound/soc/codecs/tlv320aic23.c
+++ b/sound/soc/codecs/tlv320aic23.c
@@ -23,7 +23,6 @@
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/pm.h> 25#include <linux/pm.h>
26#include <linux/i2c.h>
27#include <linux/regmap.h> 26#include <linux/regmap.h>
28#include <linux/slab.h> 27#include <linux/slab.h>
29#include <sound/core.h> 28#include <sound/core.h>
@@ -51,7 +50,7 @@ static const struct reg_default tlv320aic23_reg[] = {
51 { 9, 0x0000 }, 50 { 9, 0x0000 },
52}; 51};
53 52
54static const struct regmap_config tlv320aic23_regmap = { 53const struct regmap_config tlv320aic23_regmap = {
55 .reg_bits = 7, 54 .reg_bits = 7,
56 .val_bits = 9, 55 .val_bits = 9,
57 56
@@ -64,16 +63,16 @@ static const struct regmap_config tlv320aic23_regmap = {
64static const char *rec_src_text[] = { "Line", "Mic" }; 63static const char *rec_src_text[] = { "Line", "Mic" };
65static const char *deemph_text[] = {"None", "32Khz", "44.1Khz", "48Khz"}; 64static const char *deemph_text[] = {"None", "32Khz", "44.1Khz", "48Khz"};
66 65
67static const struct soc_enum rec_src_enum = 66static SOC_ENUM_SINGLE_DECL(rec_src_enum,
68 SOC_ENUM_SINGLE(TLV320AIC23_ANLG, 2, 2, rec_src_text); 67 TLV320AIC23_ANLG, 2, rec_src_text);
69 68
70static const struct snd_kcontrol_new tlv320aic23_rec_src_mux_controls = 69static const struct snd_kcontrol_new tlv320aic23_rec_src_mux_controls =
71SOC_DAPM_ENUM("Input Select", rec_src_enum); 70SOC_DAPM_ENUM("Input Select", rec_src_enum);
72 71
73static const struct soc_enum tlv320aic23_rec_src = 72static SOC_ENUM_SINGLE_DECL(tlv320aic23_rec_src,
74 SOC_ENUM_SINGLE(TLV320AIC23_ANLG, 2, 2, rec_src_text); 73 TLV320AIC23_ANLG, 2, rec_src_text);
75static const struct soc_enum tlv320aic23_deemph = 74static SOC_ENUM_SINGLE_DECL(tlv320aic23_deemph,
76 SOC_ENUM_SINGLE(TLV320AIC23_DIGT, 1, 4, deemph_text); 75 TLV320AIC23_DIGT, 1, deemph_text);
77 76
78static const DECLARE_TLV_DB_SCALE(out_gain_tlv, -12100, 100, 0); 77static const DECLARE_TLV_DB_SCALE(out_gain_tlv, -12100, 100, 0);
79static const DECLARE_TLV_DB_SCALE(input_gain_tlv, -1725, 75, 0); 78static const DECLARE_TLV_DB_SCALE(input_gain_tlv, -1725, 75, 0);
@@ -557,7 +556,7 @@ static int tlv320aic23_resume(struct snd_soc_codec *codec)
557 return 0; 556 return 0;
558} 557}
559 558
560static int tlv320aic23_probe(struct snd_soc_codec *codec) 559static int tlv320aic23_codec_probe(struct snd_soc_codec *codec)
561{ 560{
562 int ret; 561 int ret;
563 562
@@ -604,7 +603,7 @@ static int tlv320aic23_remove(struct snd_soc_codec *codec)
604} 603}
605 604
606static struct snd_soc_codec_driver soc_codec_dev_tlv320aic23 = { 605static struct snd_soc_codec_driver soc_codec_dev_tlv320aic23 = {
607 .probe = tlv320aic23_probe, 606 .probe = tlv320aic23_codec_probe,
608 .remove = tlv320aic23_remove, 607 .remove = tlv320aic23_remove,
609 .suspend = tlv320aic23_suspend, 608 .suspend = tlv320aic23_suspend,
610 .resume = tlv320aic23_resume, 609 .resume = tlv320aic23_resume,
@@ -617,57 +616,25 @@ static struct snd_soc_codec_driver soc_codec_dev_tlv320aic23 = {
617 .num_dapm_routes = ARRAY_SIZE(tlv320aic23_intercon), 616 .num_dapm_routes = ARRAY_SIZE(tlv320aic23_intercon),
618}; 617};
619 618
620/* 619int tlv320aic23_probe(struct device *dev, struct regmap *regmap)
621 * If the i2c layer weren't so broken, we could pass this kind of data
622 * around
623 */
624static int tlv320aic23_codec_probe(struct i2c_client *i2c,
625 const struct i2c_device_id *i2c_id)
626{ 620{
627 struct aic23 *aic23; 621 struct aic23 *aic23;
628 int ret;
629 622
630 if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) 623 if (IS_ERR(regmap))
631 return -EINVAL; 624 return PTR_ERR(regmap);
632 625
633 aic23 = devm_kzalloc(&i2c->dev, sizeof(struct aic23), GFP_KERNEL); 626 aic23 = devm_kzalloc(dev, sizeof(struct aic23), GFP_KERNEL);
634 if (aic23 == NULL) 627 if (aic23 == NULL)
635 return -ENOMEM; 628 return -ENOMEM;
636 629
637 aic23->regmap = devm_regmap_init_i2c(i2c, &tlv320aic23_regmap); 630 aic23->regmap = regmap;
638 if (IS_ERR(aic23->regmap))
639 return PTR_ERR(aic23->regmap);
640 631
641 i2c_set_clientdata(i2c, aic23); 632 dev_set_drvdata(dev, aic23);
642 633
643 ret = snd_soc_register_codec(&i2c->dev, 634 return snd_soc_register_codec(dev, &soc_codec_dev_tlv320aic23,
644 &soc_codec_dev_tlv320aic23, &tlv320aic23_dai, 1); 635 &tlv320aic23_dai, 1);
645 return ret;
646}
647static int __exit tlv320aic23_i2c_remove(struct i2c_client *i2c)
648{
649 snd_soc_unregister_codec(&i2c->dev);
650 return 0;
651} 636}
652 637
653static const struct i2c_device_id tlv320aic23_id[] = {
654 {"tlv320aic23", 0},
655 {}
656};
657
658MODULE_DEVICE_TABLE(i2c, tlv320aic23_id);
659
660static struct i2c_driver tlv320aic23_i2c_driver = {
661 .driver = {
662 .name = "tlv320aic23-codec",
663 },
664 .probe = tlv320aic23_codec_probe,
665 .remove = __exit_p(tlv320aic23_i2c_remove),
666 .id_table = tlv320aic23_id,
667};
668
669module_i2c_driver(tlv320aic23_i2c_driver);
670
671MODULE_DESCRIPTION("ASoC TLV320AIC23 codec driver"); 638MODULE_DESCRIPTION("ASoC TLV320AIC23 codec driver");
672MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>"); 639MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>");
673MODULE_LICENSE("GPL"); 640MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/tlv320aic23.h b/sound/soc/codecs/tlv320aic23.h
index e804120bd3da..3a7235a04a89 100644
--- a/sound/soc/codecs/tlv320aic23.h
+++ b/sound/soc/codecs/tlv320aic23.h
@@ -12,6 +12,12 @@
12#ifndef _TLV320AIC23_H 12#ifndef _TLV320AIC23_H
13#define _TLV320AIC23_H 13#define _TLV320AIC23_H
14 14
15struct device;
16struct regmap_config;
17
18extern const struct regmap_config tlv320aic23_regmap;
19int tlv320aic23_probe(struct device *dev, struct regmap *regmap);
20
15/* Codec TLV320AIC23 */ 21/* Codec TLV320AIC23 */
16#define TLV320AIC23_LINVOL 0x00 22#define TLV320AIC23_LINVOL 0x00
17#define TLV320AIC23_RINVOL 0x01 23#define TLV320AIC23_RINVOL 0x01