113 lines
3.2 KiB
Diff
113 lines
3.2 KiB
Diff
From 6c92e60d3e402e1fcbd1bfa11185c995ce41d190 Mon Sep 17 00:00:00 2001
|
|
From: Romuald JEANNE <romuald.jeanne@st.com>
|
|
Date: Mon, 10 Dec 2018 15:47:43 +0100
|
|
Subject: [PATCH 42/52] ARM: stm32mp1-r0-rc3: SOUND
|
|
|
|
---
|
|
sound/soc/stm/stm32_sai_sub.c | 58 ++++++++++++++++++++++++++++++-------------
|
|
1 file changed, 41 insertions(+), 17 deletions(-)
|
|
|
|
diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c
|
|
index 1f23ca4..3f0540a 100644
|
|
--- a/sound/soc/stm/stm32_sai_sub.c
|
|
+++ b/sound/soc/stm/stm32_sai_sub.c
|
|
@@ -313,6 +313,23 @@ static int stm32_sai_set_clk_div(struct stm32_sai_sub_data *sai,
|
|
return ret;
|
|
}
|
|
|
|
+static int stm32_sai_set_parent_clock(struct stm32_sai_sub_data *sai,
|
|
+ unsigned int rate)
|
|
+{
|
|
+ struct platform_device *pdev = sai->pdev;
|
|
+ struct clk *parent_clk = sai->pdata->clk_x8k;
|
|
+ int ret;
|
|
+
|
|
+ if (!(rate % 11025))
|
|
+ parent_clk = sai->pdata->clk_x11k;
|
|
+
|
|
+ ret = clk_set_parent(sai->sai_ck, parent_clk);
|
|
+ if (ret)
|
|
+ dev_err(&pdev->dev, "Set parent clock returned: %d\n", ret);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static long stm32_sai_mclk_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long *prate)
|
|
{
|
|
@@ -492,25 +509,26 @@ static int stm32_sai_set_sysclk(struct snd_soc_dai *cpu_dai,
|
|
struct stm32_sai_sub_data *sai = snd_soc_dai_get_drvdata(cpu_dai);
|
|
int ret;
|
|
|
|
- if (dir == SND_SOC_CLOCK_OUT) {
|
|
+ if (dir == SND_SOC_CLOCK_OUT && sai->sai_mclk) {
|
|
ret = regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX,
|
|
SAI_XCR1_NODIV,
|
|
(unsigned int)~SAI_XCR1_NODIV);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
- dev_dbg(cpu_dai->dev, "SAI MCLK frequency is %uHz\n", freq);
|
|
- sai->mclk_rate = freq;
|
|
+ /* If master clock is used, set parent clock now */
|
|
+ ret = stm32_sai_set_parent_clock(sai, freq);
|
|
+ if (ret)
|
|
+ return ret;
|
|
|
|
- if (sai->sai_mclk) {
|
|
- ret = clk_set_rate_exclusive(sai->sai_mclk,
|
|
- sai->mclk_rate);
|
|
- if (ret) {
|
|
- dev_err(cpu_dai->dev,
|
|
- "Could not set mclk rate\n");
|
|
- return ret;
|
|
- }
|
|
+ ret = clk_set_rate_exclusive(sai->sai_mclk, freq);
|
|
+ if (ret) {
|
|
+ dev_err(cpu_dai->dev, "Could not set mclk rate\n");
|
|
+ return ret;
|
|
}
|
|
+
|
|
+ dev_dbg(cpu_dai->dev, "SAI MCLK frequency is %uHz\n", freq);
|
|
+ sai->mclk_rate = freq;
|
|
}
|
|
|
|
return 0;
|
|
@@ -906,11 +924,13 @@ static int stm32_sai_configure_clock(struct snd_soc_dai *cpu_dai,
|
|
int cr1, mask, div = 0;
|
|
int sai_clk_rate, mclk_ratio, den;
|
|
unsigned int rate = params_rate(params);
|
|
+ int ret;
|
|
|
|
- if (!(rate % 11025))
|
|
- clk_set_parent(sai->sai_ck, sai->pdata->clk_x11k);
|
|
- else
|
|
- clk_set_parent(sai->sai_ck, sai->pdata->clk_x8k);
|
|
+ if (!sai->sai_mclk) {
|
|
+ ret = stm32_sai_set_parent_clock(sai, rate);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
sai_clk_rate = clk_get_rate(sai->sai_ck);
|
|
|
|
if (STM_SAI_IS_F4(sai->pdata)) {
|
|
@@ -1064,9 +1084,13 @@ static void stm32_sai_shutdown(struct snd_pcm_substream *substream,
|
|
regmap_update_bits(sai->regmap, STM_SAI_CR1_REGX, SAI_XCR1_NODIV,
|
|
SAI_XCR1_NODIV);
|
|
|
|
- clk_disable_unprepare(sai->sai_ck);
|
|
+ /* Release mclk rate only if rate was actually set */
|
|
+ if (sai->mclk_rate) {
|
|
+ clk_rate_exclusive_put(sai->sai_mclk);
|
|
+ sai->mclk_rate = 0;
|
|
+ }
|
|
|
|
- clk_rate_exclusive_put(sai->sai_mclk);
|
|
+ clk_disable_unprepare(sai->sai_ck);
|
|
|
|
sai->substream = NULL;
|
|
}
|
|
--
|
|
2.7.4
|
|
|