30 Jul
2020
30 Jul
'20
7:36 p.m.
/* * 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'.
}
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
/* 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.
if (__clk_is_enabled(sclk))
[2] Again is this test needed since sclk is not shared between SSPs
clk_disable_unprepare(sclk);