mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-28 07:13:34 +00:00
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>
This commit is contained in:
parent
cc4c670a41
commit
85e9e76638
1 changed files with 40 additions and 10 deletions
|
@ -42,6 +42,7 @@ static int speyside_set_bias_level(struct snd_soc_card *card,
|
||||||
pr_err("Failed to stop FLL\n");
|
pr_err("Failed to stop FLL\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -50,6 +51,45 @@ static int speyside_set_bias_level(struct snd_soc_card *card,
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
static int speyside_hw_params(struct snd_pcm_substream *substream,
|
static int speyside_hw_params(struct snd_pcm_substream *substream,
|
||||||
struct snd_pcm_hw_params *params)
|
struct snd_pcm_hw_params *params)
|
||||||
{
|
{
|
||||||
|
@ -70,16 +110,6 @@ static int speyside_hw_params(struct snd_pcm_substream *substream,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue