diff options
Diffstat (limited to 'sound/soc/codecs/wm8731.c')
-rw-r--r-- | sound/soc/codecs/wm8731.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index 19844fc8cb1..56f54083874 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c | |||
@@ -46,6 +46,7 @@ struct wm8731_priv { | |||
46 | struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES]; | 46 | struct regulator_bulk_data supplies[WM8731_NUM_SUPPLIES]; |
47 | u16 reg_cache[WM8731_CACHEREGNUM]; | 47 | u16 reg_cache[WM8731_CACHEREGNUM]; |
48 | unsigned int sysclk; | 48 | unsigned int sysclk; |
49 | int sysclk_type; | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | 52 | ||
@@ -110,6 +111,7 @@ static const struct snd_kcontrol_new wm8731_input_mux_controls = | |||
110 | SOC_DAPM_ENUM("Input Select", wm8731_enum[0]); | 111 | SOC_DAPM_ENUM("Input Select", wm8731_enum[0]); |
111 | 112 | ||
112 | static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = { | 113 | static const struct snd_soc_dapm_widget wm8731_dapm_widgets[] = { |
114 | SND_SOC_DAPM_SUPPLY("OSC", WM8731_PWR, 5, 1, NULL, 0), | ||
113 | SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, | 115 | SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, |
114 | &wm8731_output_mixer_controls[0], | 116 | &wm8731_output_mixer_controls[0], |
115 | ARRAY_SIZE(wm8731_output_mixer_controls)), | 117 | ARRAY_SIZE(wm8731_output_mixer_controls)), |
@@ -127,7 +129,18 @@ SND_SOC_DAPM_INPUT("RLINEIN"), | |||
127 | SND_SOC_DAPM_INPUT("LLINEIN"), | 129 | SND_SOC_DAPM_INPUT("LLINEIN"), |
128 | }; | 130 | }; |
129 | 131 | ||
132 | static int wm8731_check_osc(struct snd_soc_dapm_widget *source, | ||
133 | struct snd_soc_dapm_widget *sink) | ||
134 | { | ||
135 | struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(source->codec); | ||
136 | |||
137 | return wm8731->sysclk_type == WM8731_SYSCLK_MCLK; | ||
138 | } | ||
139 | |||
130 | static const struct snd_soc_dapm_route intercon[] = { | 140 | static const struct snd_soc_dapm_route intercon[] = { |
141 | {"DAC", NULL, "OSC", wm8731_check_osc}, | ||
142 | {"ADC", NULL, "OSC", wm8731_check_osc}, | ||
143 | |||
131 | /* output mixer */ | 144 | /* output mixer */ |
132 | {"Output Mixer", "Line Bypass Switch", "Line Input"}, | 145 | {"Output Mixer", "Line Bypass Switch", "Line Input"}, |
133 | {"Output Mixer", "HiFi Playback Switch", "DAC"}, | 146 | {"Output Mixer", "HiFi Playback Switch", "DAC"}, |
@@ -285,6 +298,15 @@ static int wm8731_set_dai_sysclk(struct snd_soc_dai *codec_dai, | |||
285 | struct snd_soc_codec *codec = codec_dai->codec; | 298 | struct snd_soc_codec *codec = codec_dai->codec; |
286 | struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); | 299 | struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); |
287 | 300 | ||
301 | switch (clk_id) { | ||
302 | case WM8731_SYSCLK_XTAL: | ||
303 | case WM8731_SYSCLK_MCLK: | ||
304 | wm8731->sysclk_type = clk_id; | ||
305 | break; | ||
306 | default: | ||
307 | return -EINVAL; | ||
308 | } | ||
309 | |||
288 | switch (freq) { | 310 | switch (freq) { |
289 | case 11289600: | 311 | case 11289600: |
290 | case 12000000: | 312 | case 12000000: |
@@ -292,9 +314,14 @@ static int wm8731_set_dai_sysclk(struct snd_soc_dai *codec_dai, | |||
292 | case 16934400: | 314 | case 16934400: |
293 | case 18432000: | 315 | case 18432000: |
294 | wm8731->sysclk = freq; | 316 | wm8731->sysclk = freq; |
295 | return 0; | 317 | break; |
318 | default: | ||
319 | return -EINVAL; | ||
296 | } | 320 | } |
297 | return -EINVAL; | 321 | |
322 | snd_soc_dapm_sync(codec); | ||
323 | |||
324 | return 0; | ||
298 | } | 325 | } |
299 | 326 | ||
300 | 327 | ||