diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-06-06 18:12:44 (GMT) |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-06-06 20:47:28 (GMT) |
commit | 85e9e766380fe40e1937b8316e8aa867544f09f1 (patch) | |
tree | 8a5dc0bec9d4f2bf2018f4a2a8462f31e2f46223 /sound/soc/samsung | |
parent | cc4c670a416a36464443f465f0ddbdc9940d16dd (diff) | |
download | linux-85e9e766380fe40e1937b8316e8aa867544f09f1.tar.xz |
ASoC: Manage Speyside system clocking only in bias management
Now that the CODEC driver supports it defer configuration of the system
clock until bias management which is a much more idiomatic place to do
system power control and makes things a lot more happy when we're using
both interfaces.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@ti.com>
Diffstat (limited to 'sound/soc/samsung')
-rw-r--r-- | sound/soc/samsung/speyside.c | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/sound/soc/samsung/speyside.c b/sound/soc/samsung/speyside.c index 99fb033..2515dba 100644 --- a/sound/soc/samsung/speyside.c +++ b/sound/soc/samsung/speyside.c @@ -42,11 +42,51 @@ static int speyside_set_bias_level(struct snd_soc_card *card, pr_err("Failed to stop FLL\n"); return ret; } + break; + + default: + break; + } + + return 0; +} + +static int speyside_set_bias_level_post(struct snd_soc_card *card, + struct snd_soc_dapm_context *dapm, + enum snd_soc_bias_level level) +{ + struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; + int ret; + + if (dapm->dev != codec_dai->dev) + return 0; + + switch (level) { + case SND_SOC_BIAS_PREPARE: + if (card->dapm.bias_level == SND_SOC_BIAS_STANDBY) { + ret = snd_soc_dai_set_pll(codec_dai, 0, + WM8915_FLL_MCLK2, + 32768, 48000 * 256); + if (ret < 0) { + pr_err("Failed to start FLL\n"); + return ret; + } + + ret = snd_soc_dai_set_sysclk(codec_dai, + WM8915_SYSCLK_FLL, + 48000 * 256, + SND_SOC_CLOCK_IN); + if (ret < 0) + return ret; + } + break; default: break; } + card->dapm.bias_level = level; + return 0; } @@ -70,16 +110,6 @@ static int speyside_hw_params(struct snd_pcm_substream *substream, if (ret < 0) return ret; - ret = snd_soc_dai_set_pll(codec_dai, 0, WM8915_FLL_MCLK2, - 32768, 256 * 48000); - if (ret < 0) - return ret; - - ret = snd_soc_dai_set_sysclk(codec_dai, WM8915_SYSCLK_FLL, - 256 * 48000, SND_SOC_CLOCK_IN); - if (ret < 0) - return ret; - return 0; } |