/* * MCLK/SCLK need to be ON early for a successful synchronization of * codec internal clock. And the clocks are turned off during @@ -91,38 +108,48 @@ static int platform_clock_control(struct
snd_soc_dapm_widget *w,
*/
switch (event) { case SND_SOC_DAPM_PRE_PMU:
ret = clk_set_rate(priv->mclk, 24000000); if (ret < 0) {/* Enable MCLK */
dev_err(card->dev, "Can't set rate for mclk, err: %d\n",
ret);
return ret;
dev_err(card->dev, "Can't set rate for mclk for ssp%d,
err: %d\n",
ssp_num, ret);
return ret;
nit-pick: alignment is off for the 'return ret'.
my bad... will change that
}
ret = clk_prepare_enable(priv->mclk);
if (ret < 0) {
dev_err(card->dev, "Can't enable mclk, err: %d\n",
ret);
return ret;
if (!__clk_is_enabled(priv->mclk)) {
/* Enable MCLK */
ret = clk_prepare_enable(priv->mclk);
That seems correct since you share the mclk between two resources but see [1] below
if (ret < 0) {
dev_err(card->dev, "Can't enable mclk for
ssp%d, err: %d\n",
ssp_num, ret);
return ret;
}}
/* Enable SCLK */
ret = clk_set_rate(priv->sclk, 3072000);
if (ret < 0) {ret = clk_set_rate(sclk, sclk_rate);
dev_err(card->dev, "Can't set rate for sclk, err: %d\n",
ret);
dev_err(card->dev, "Can't set rate for sclk for ssp%d,
err: %d\n",
}ssp_num, ret); clk_disable_unprepare(priv->mclk); return ret;
ret = clk_prepare_enable(priv->sclk);
if (ret < 0) {
dev_err(card->dev, "Can't enable sclk, err: %d\n", ret);
clk_disable_unprepare(priv->mclk);
if (!__clk_is_enabled(sclk)) {
Why do you need this test? the sclocks are not shared? see also [2] below
My thought process was if the clock is already enabled, then we don't have to enable it. Isee your point, I can skip this check. This check will always be true.
/* Enable SCLK */
ret = clk_prepare_enable(sclk);
if (ret < 0) {
dev_err(card->dev, "Can't enable sclk for
ssp%d, err: %d\n",
ssp_num, ret);
clk_disable_unprepare(priv->mclk);
return ret;
} break; case SND_SOC_DAPM_POST_PMD:}
clk_disable_unprepare(priv->mclk);
clk_disable_unprepare(priv->sclk);
if (__clk_is_enabled(priv->mclk))
clk_disable_unprepare(priv->mclk);
[1] this seems wrong in case you have two SSPs working, and stop one. This would turn off the mclk while one of the two SSPs is still working.
For this platform we use either headset or dmic. There is no way we can record simultaneously using different devices. So disabling mclk might not be harmful here. But this case will always be true too :).
if (__clk_is_enabled(sclk))
[2] Again is this test needed since sclk is not shared between SSPs
Same thought process to check if its enabled or not. Will remove that.
clk_disable_unprepare(sclk);