diff options
-rw-r--r-- | include/sound/uda134x.h | 1 | ||||
-rw-r--r-- | sound/soc/codecs/ad193x.c | 56 | ||||
-rw-r--r-- | sound/soc/codecs/uda134x.c | 13 | ||||
-rw-r--r-- | sound/soc/codecs/wm8974.c | 2 | ||||
-rw-r--r-- | sound/soc/codecs/wm8994.c | 5 | ||||
-rw-r--r-- | sound/soc/soc-jack.c | 5 |
6 files changed, 51 insertions, 31 deletions
diff --git a/include/sound/uda134x.h b/include/sound/uda134x.h index 475ef8bb7dcd..509efb050176 100644 --- a/include/sound/uda134x.h +++ b/include/sound/uda134x.h | |||
@@ -21,6 +21,7 @@ struct uda134x_platform_data { | |||
21 | #define UDA134X_UDA1340 1 | 21 | #define UDA134X_UDA1340 1 |
22 | #define UDA134X_UDA1341 2 | 22 | #define UDA134X_UDA1341 2 |
23 | #define UDA134X_UDA1344 3 | 23 | #define UDA134X_UDA1344 3 |
24 | #define UDA134X_UDA1345 4 | ||
24 | }; | 25 | }; |
25 | 26 | ||
26 | #endif /* _UDA134X_H */ | 27 | #endif /* _UDA134X_H */ |
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c index 7ed787e2e519..c8ca1142b2f4 100644 --- a/sound/soc/codecs/ad193x.c +++ b/sound/soc/codecs/ad193x.c | |||
@@ -46,13 +46,13 @@ static const struct soc_enum ad193x_deemp_enum = | |||
46 | 46 | ||
47 | static const struct snd_kcontrol_new ad193x_snd_controls[] = { | 47 | static const struct snd_kcontrol_new ad193x_snd_controls[] = { |
48 | /* DAC volume control */ | 48 | /* DAC volume control */ |
49 | SOC_DOUBLE_R("DAC1 Volume", AD193X_DAC_L1_VOL, | 49 | SOC_DOUBLE_R("DAC1 Volume", AD193X_DAC_L1_VOL, |
50 | AD193X_DAC_R1_VOL, 0, 0xFF, 1), | 50 | AD193X_DAC_R1_VOL, 0, 0xFF, 1), |
51 | SOC_DOUBLE_R("DAC2 Volume", AD193X_DAC_L2_VOL, | 51 | SOC_DOUBLE_R("DAC2 Volume", AD193X_DAC_L2_VOL, |
52 | AD193X_DAC_R2_VOL, 0, 0xFF, 1), | 52 | AD193X_DAC_R2_VOL, 0, 0xFF, 1), |
53 | SOC_DOUBLE_R("DAC3 Volume", AD193X_DAC_L3_VOL, | 53 | SOC_DOUBLE_R("DAC3 Volume", AD193X_DAC_L3_VOL, |
54 | AD193X_DAC_R3_VOL, 0, 0xFF, 1), | 54 | AD193X_DAC_R3_VOL, 0, 0xFF, 1), |
55 | SOC_DOUBLE_R("DAC4 Volume", AD193X_DAC_L4_VOL, | 55 | SOC_DOUBLE_R("DAC4 Volume", AD193X_DAC_L4_VOL, |
56 | AD193X_DAC_R4_VOL, 0, 0xFF, 1), | 56 | AD193X_DAC_R4_VOL, 0, 0xFF, 1), |
57 | 57 | ||
58 | /* ADC switch control */ | 58 | /* ADC switch control */ |
@@ -163,9 +163,10 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
163 | unsigned int fmt) | 163 | unsigned int fmt) |
164 | { | 164 | { |
165 | struct snd_soc_codec *codec = codec_dai->codec; | 165 | struct snd_soc_codec *codec = codec_dai->codec; |
166 | int adc_reg, dac_reg; | 166 | int adc_reg1, adc_reg2, dac_reg; |
167 | 167 | ||
168 | adc_reg = snd_soc_read(codec, AD193X_ADC_CTRL2); | 168 | adc_reg1 = snd_soc_read(codec, AD193X_ADC_CTRL1); |
169 | adc_reg2 = snd_soc_read(codec, AD193X_ADC_CTRL2); | ||
169 | dac_reg = snd_soc_read(codec, AD193X_DAC_CTRL1); | 170 | dac_reg = snd_soc_read(codec, AD193X_DAC_CTRL1); |
170 | 171 | ||
171 | /* At present, the driver only support AUX ADC mode(SND_SOC_DAIFMT_I2S | 172 | /* At present, the driver only support AUX ADC mode(SND_SOC_DAIFMT_I2S |
@@ -173,12 +174,12 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
173 | */ | 174 | */ |
174 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 175 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
175 | case SND_SOC_DAIFMT_I2S: | 176 | case SND_SOC_DAIFMT_I2S: |
176 | adc_reg &= ~AD193X_ADC_SERFMT_MASK; | 177 | adc_reg1 &= ~AD193X_ADC_SERFMT_MASK; |
177 | adc_reg |= AD193X_ADC_SERFMT_TDM; | 178 | adc_reg1 |= AD193X_ADC_SERFMT_TDM; |
178 | break; | 179 | break; |
179 | case SND_SOC_DAIFMT_DSP_A: | 180 | case SND_SOC_DAIFMT_DSP_A: |
180 | adc_reg &= ~AD193X_ADC_SERFMT_MASK; | 181 | adc_reg1 &= ~AD193X_ADC_SERFMT_MASK; |
181 | adc_reg |= AD193X_ADC_SERFMT_AUX; | 182 | adc_reg1 |= AD193X_ADC_SERFMT_AUX; |
182 | break; | 183 | break; |
183 | default: | 184 | default: |
184 | return -EINVAL; | 185 | return -EINVAL; |
@@ -186,27 +187,27 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
186 | 187 | ||
187 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | 188 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { |
188 | case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */ | 189 | case SND_SOC_DAIFMT_NB_NF: /* normal bit clock + frame */ |
189 | adc_reg &= ~AD193X_ADC_LEFT_HIGH; | 190 | adc_reg2 &= ~AD193X_ADC_LEFT_HIGH; |
190 | adc_reg &= ~AD193X_ADC_BCLK_INV; | 191 | adc_reg2 &= ~AD193X_ADC_BCLK_INV; |
191 | dac_reg &= ~AD193X_DAC_LEFT_HIGH; | 192 | dac_reg &= ~AD193X_DAC_LEFT_HIGH; |
192 | dac_reg &= ~AD193X_DAC_BCLK_INV; | 193 | dac_reg &= ~AD193X_DAC_BCLK_INV; |
193 | break; | 194 | break; |
194 | case SND_SOC_DAIFMT_NB_IF: /* normal bclk + invert frm */ | 195 | case SND_SOC_DAIFMT_NB_IF: /* normal bclk + invert frm */ |
195 | adc_reg |= AD193X_ADC_LEFT_HIGH; | 196 | adc_reg2 |= AD193X_ADC_LEFT_HIGH; |
196 | adc_reg &= ~AD193X_ADC_BCLK_INV; | 197 | adc_reg2 &= ~AD193X_ADC_BCLK_INV; |
197 | dac_reg |= AD193X_DAC_LEFT_HIGH; | 198 | dac_reg |= AD193X_DAC_LEFT_HIGH; |
198 | dac_reg &= ~AD193X_DAC_BCLK_INV; | 199 | dac_reg &= ~AD193X_DAC_BCLK_INV; |
199 | break; | 200 | break; |
200 | case SND_SOC_DAIFMT_IB_NF: /* invert bclk + normal frm */ | 201 | case SND_SOC_DAIFMT_IB_NF: /* invert bclk + normal frm */ |
201 | adc_reg &= ~AD193X_ADC_LEFT_HIGH; | 202 | adc_reg2 &= ~AD193X_ADC_LEFT_HIGH; |
202 | adc_reg |= AD193X_ADC_BCLK_INV; | 203 | adc_reg2 |= AD193X_ADC_BCLK_INV; |
203 | dac_reg &= ~AD193X_DAC_LEFT_HIGH; | 204 | dac_reg &= ~AD193X_DAC_LEFT_HIGH; |
204 | dac_reg |= AD193X_DAC_BCLK_INV; | 205 | dac_reg |= AD193X_DAC_BCLK_INV; |
205 | break; | 206 | break; |
206 | 207 | ||
207 | case SND_SOC_DAIFMT_IB_IF: /* invert bclk + frm */ | 208 | case SND_SOC_DAIFMT_IB_IF: /* invert bclk + frm */ |
208 | adc_reg |= AD193X_ADC_LEFT_HIGH; | 209 | adc_reg2 |= AD193X_ADC_LEFT_HIGH; |
209 | adc_reg |= AD193X_ADC_BCLK_INV; | 210 | adc_reg2 |= AD193X_ADC_BCLK_INV; |
210 | dac_reg |= AD193X_DAC_LEFT_HIGH; | 211 | dac_reg |= AD193X_DAC_LEFT_HIGH; |
211 | dac_reg |= AD193X_DAC_BCLK_INV; | 212 | dac_reg |= AD193X_DAC_BCLK_INV; |
212 | break; | 213 | break; |
@@ -216,26 +217,26 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
216 | 217 | ||
217 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 218 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
218 | case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */ | 219 | case SND_SOC_DAIFMT_CBM_CFM: /* codec clk & frm master */ |
219 | adc_reg |= AD193X_ADC_LCR_MASTER; | 220 | adc_reg2 |= AD193X_ADC_LCR_MASTER; |
220 | adc_reg |= AD193X_ADC_BCLK_MASTER; | 221 | adc_reg2 |= AD193X_ADC_BCLK_MASTER; |
221 | dac_reg |= AD193X_DAC_LCR_MASTER; | 222 | dac_reg |= AD193X_DAC_LCR_MASTER; |
222 | dac_reg |= AD193X_DAC_BCLK_MASTER; | 223 | dac_reg |= AD193X_DAC_BCLK_MASTER; |
223 | break; | 224 | break; |
224 | case SND_SOC_DAIFMT_CBS_CFM: /* codec clk slave & frm master */ | 225 | case SND_SOC_DAIFMT_CBS_CFM: /* codec clk slave & frm master */ |
225 | adc_reg |= AD193X_ADC_LCR_MASTER; | 226 | adc_reg2 |= AD193X_ADC_LCR_MASTER; |
226 | adc_reg &= ~AD193X_ADC_BCLK_MASTER; | 227 | adc_reg2 &= ~AD193X_ADC_BCLK_MASTER; |
227 | dac_reg |= AD193X_DAC_LCR_MASTER; | 228 | dac_reg |= AD193X_DAC_LCR_MASTER; |
228 | dac_reg &= ~AD193X_DAC_BCLK_MASTER; | 229 | dac_reg &= ~AD193X_DAC_BCLK_MASTER; |
229 | break; | 230 | break; |
230 | case SND_SOC_DAIFMT_CBM_CFS: /* codec clk master & frame slave */ | 231 | case SND_SOC_DAIFMT_CBM_CFS: /* codec clk master & frame slave */ |
231 | adc_reg &= ~AD193X_ADC_LCR_MASTER; | 232 | adc_reg2 &= ~AD193X_ADC_LCR_MASTER; |
232 | adc_reg |= AD193X_ADC_BCLK_MASTER; | 233 | adc_reg2 |= AD193X_ADC_BCLK_MASTER; |
233 | dac_reg &= ~AD193X_DAC_LCR_MASTER; | 234 | dac_reg &= ~AD193X_DAC_LCR_MASTER; |
234 | dac_reg |= AD193X_DAC_BCLK_MASTER; | 235 | dac_reg |= AD193X_DAC_BCLK_MASTER; |
235 | break; | 236 | break; |
236 | case SND_SOC_DAIFMT_CBS_CFS: /* codec clk & frm slave */ | 237 | case SND_SOC_DAIFMT_CBS_CFS: /* codec clk & frm slave */ |
237 | adc_reg &= ~AD193X_ADC_LCR_MASTER; | 238 | adc_reg2 &= ~AD193X_ADC_LCR_MASTER; |
238 | adc_reg &= ~AD193X_ADC_BCLK_MASTER; | 239 | adc_reg2 &= ~AD193X_ADC_BCLK_MASTER; |
239 | dac_reg &= ~AD193X_DAC_LCR_MASTER; | 240 | dac_reg &= ~AD193X_DAC_LCR_MASTER; |
240 | dac_reg &= ~AD193X_DAC_BCLK_MASTER; | 241 | dac_reg &= ~AD193X_DAC_BCLK_MASTER; |
241 | break; | 242 | break; |
@@ -243,7 +244,8 @@ static int ad193x_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
243 | return -EINVAL; | 244 | return -EINVAL; |
244 | } | 245 | } |
245 | 246 | ||
246 | snd_soc_write(codec, AD193X_ADC_CTRL2, adc_reg); | 247 | snd_soc_write(codec, AD193X_ADC_CTRL1, adc_reg1); |
248 | snd_soc_write(codec, AD193X_ADC_CTRL2, adc_reg2); | ||
247 | snd_soc_write(codec, AD193X_DAC_CTRL1, dac_reg); | 249 | snd_soc_write(codec, AD193X_DAC_CTRL1, dac_reg); |
248 | 250 | ||
249 | return 0; | 251 | return 0; |
diff --git a/sound/soc/codecs/uda134x.c b/sound/soc/codecs/uda134x.c index 20deaca8e107..2f4d7287fa3c 100644 --- a/sound/soc/codecs/uda134x.c +++ b/sound/soc/codecs/uda134x.c | |||
@@ -431,6 +431,14 @@ SOC_ENUM("PCM Playback De-emphasis", uda134x_mixer_enum[1]), | |||
431 | SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0), | 431 | SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0), |
432 | }; | 432 | }; |
433 | 433 | ||
434 | static const struct snd_kcontrol_new uda1345_snd_controls[] = { | ||
435 | SOC_SINGLE("Master Playback Volume", UDA134X_DATA000, 0, 0x3F, 1), | ||
436 | |||
437 | SOC_ENUM("PCM Playback De-emphasis", uda134x_mixer_enum[1]), | ||
438 | |||
439 | SOC_SINGLE("DC Filter Enable Switch", UDA134X_STATUS0, 0, 1, 0), | ||
440 | }; | ||
441 | |||
434 | static struct snd_soc_dai_ops uda134x_dai_ops = { | 442 | static struct snd_soc_dai_ops uda134x_dai_ops = { |
435 | .startup = uda134x_startup, | 443 | .startup = uda134x_startup, |
436 | .shutdown = uda134x_shutdown, | 444 | .shutdown = uda134x_shutdown, |
@@ -486,6 +494,7 @@ static int uda134x_soc_probe(struct platform_device *pdev) | |||
486 | case UDA134X_UDA1340: | 494 | case UDA134X_UDA1340: |
487 | case UDA134X_UDA1341: | 495 | case UDA134X_UDA1341: |
488 | case UDA134X_UDA1344: | 496 | case UDA134X_UDA1344: |
497 | case UDA134X_UDA1345: | ||
489 | break; | 498 | break; |
490 | default: | 499 | default: |
491 | printk(KERN_ERR "UDA134X SoC codec: " | 500 | printk(KERN_ERR "UDA134X SoC codec: " |
@@ -551,6 +560,10 @@ static int uda134x_soc_probe(struct platform_device *pdev) | |||
551 | ret = snd_soc_add_controls(codec, uda1341_snd_controls, | 560 | ret = snd_soc_add_controls(codec, uda1341_snd_controls, |
552 | ARRAY_SIZE(uda1341_snd_controls)); | 561 | ARRAY_SIZE(uda1341_snd_controls)); |
553 | break; | 562 | break; |
563 | case UDA134X_UDA1345: | ||
564 | ret = snd_soc_add_controls(codec, uda1345_snd_controls, | ||
565 | ARRAY_SIZE(uda1345_snd_controls)); | ||
566 | break; | ||
554 | default: | 567 | default: |
555 | printk(KERN_ERR "%s unknown codec type: %d", | 568 | printk(KERN_ERR "%s unknown codec type: %d", |
556 | __func__, pd->model); | 569 | __func__, pd->model); |
diff --git a/sound/soc/codecs/wm8974.c b/sound/soc/codecs/wm8974.c index 1e4da32c4078..270eb956294f 100644 --- a/sound/soc/codecs/wm8974.c +++ b/sound/soc/codecs/wm8974.c | |||
@@ -180,7 +180,7 @@ SOC_SINGLE("ADC 128x Oversampling Switch", WM8974_ADC, 8, 1, 0), | |||
180 | static const struct snd_kcontrol_new wm8974_speaker_mixer_controls[] = { | 180 | static const struct snd_kcontrol_new wm8974_speaker_mixer_controls[] = { |
181 | SOC_DAPM_SINGLE("Line Bypass Switch", WM8974_SPKMIX, 1, 1, 0), | 181 | SOC_DAPM_SINGLE("Line Bypass Switch", WM8974_SPKMIX, 1, 1, 0), |
182 | SOC_DAPM_SINGLE("Aux Playback Switch", WM8974_SPKMIX, 5, 1, 0), | 182 | SOC_DAPM_SINGLE("Aux Playback Switch", WM8974_SPKMIX, 5, 1, 0), |
183 | SOC_DAPM_SINGLE("PCM Playback Switch", WM8974_SPKMIX, 0, 1, 1), | 183 | SOC_DAPM_SINGLE("PCM Playback Switch", WM8974_SPKMIX, 0, 1, 0), |
184 | }; | 184 | }; |
185 | 185 | ||
186 | /* Mono Output Mixer */ | 186 | /* Mono Output Mixer */ |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index cdfbfb633f30..f04a116e678b 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -1769,6 +1769,11 @@ static int configure_aif_clock(struct snd_soc_codec *codec, int aif) | |||
1769 | dev_dbg(codec->dev, "Dividing AIF%d clock to %dHz\n", | 1769 | dev_dbg(codec->dev, "Dividing AIF%d clock to %dHz\n", |
1770 | aif + 1, rate); | 1770 | aif + 1, rate); |
1771 | } | 1771 | } |
1772 | |||
1773 | if (rate && rate < 3000000) | ||
1774 | dev_warn(codec->dev, "AIF%dCLK is %dHz, should be >=3MHz for optimal performance\n", | ||
1775 | aif + 1, rate); | ||
1776 | |||
1772 | wm8994->aifclk[aif] = rate; | 1777 | wm8994->aifclk[aif] = rate; |
1773 | 1778 | ||
1774 | snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1 + offset, | 1779 | snd_soc_update_bits(codec, WM8994_AIF1_CLOCKING_1 + offset, |
diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index f8fd22cc70bc..29159e1781d0 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c | |||
@@ -64,10 +64,9 @@ void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask) | |||
64 | int enable; | 64 | int enable; |
65 | int oldstatus; | 65 | int oldstatus; |
66 | 66 | ||
67 | if (!jack) { | 67 | if (!jack) |
68 | WARN_ON_ONCE(!jack); | ||
69 | return; | 68 | return; |
70 | } | 69 | |
71 | codec = jack->card->codec; | 70 | codec = jack->card->codec; |
72 | 71 | ||
73 | mutex_lock(&codec->mutex); | 72 | mutex_lock(&codec->mutex); |