aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Mack <daniel@zonque.org>2018-05-30 15:45:56 -0400
committerMark Brown <broonie@kernel.org>2018-06-01 06:27:26 -0400
commite9be4ffd4f40fcb18209dc5120233f2d11a24b6a (patch)
treecf5acc06e1a53ac4fcfbe9d7162f877cdfc5efeb
parentf9e0b4afd4e9b19e95158962d81b5b776d57ca06 (diff)
ASoC: simple-card: set cpu dai clk in hw_params
The simple-card driver currently accepts a clock node in the cpu dai sub-node and only uses it as an alternative to the 'system-clock-frequency' property to get the current frequency. This patch adds another use of the passed clock node. If mclk-fs is specified, the clocks in cpu and codec dai sub-nodes will be set to the calculated rate (stream rate * mclk_fs) in hw_params. This allows platforms to pass tuneable clocks as phandle that will automatically be set to the right rates. Signed-off-by: Daniel Mack <daniel@zonque.org> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--Documentation/devicetree/bindings/sound/simple-card.txt5
-rw-r--r--sound/soc/generic/simple-card.c21
2 files changed, 26 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/sound/simple-card.txt b/Documentation/devicetree/bindings/sound/simple-card.txt
index 17c13e74667d..a4c72d09cd45 100644
--- a/Documentation/devicetree/bindings/sound/simple-card.txt
+++ b/Documentation/devicetree/bindings/sound/simple-card.txt
@@ -86,6 +86,11 @@ Optional CPU/CODEC subnodes properties:
86 in dai startup() and disabled with 86 in dai startup() and disabled with
87 clk_disable_unprepare() in dai 87 clk_disable_unprepare() in dai
88 shutdown(). 88 shutdown().
89 If a clock is specified and a
90 multiplication factor is given with
91 mclk-fs, the clock will be set to the
92 calculated mclk frequency when the
93 stream starts.
89- system-clock-direction-out : specifies clock direction as 'out' on 94- system-clock-direction-out : specifies clock direction as 'out' on
90 initialization. It is useful for some aCPUs with 95 initialization. It is useful for some aCPUs with
91 fixed clocks. 96 fixed clocks.
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index 6959a74a6f49..4a516c428b3d 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -135,6 +135,18 @@ static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
135 asoc_simple_card_clk_disable(&dai_props->codec_dai); 135 asoc_simple_card_clk_disable(&dai_props->codec_dai);
136} 136}
137 137
138static int asoc_simple_set_clk_rate(struct asoc_simple_dai *simple_dai,
139 unsigned long rate)
140{
141 if (!simple_dai->clk)
142 return 0;
143
144 if (clk_get_rate(simple_dai->clk) == rate)
145 return 0;
146
147 return clk_set_rate(simple_dai->clk, rate);
148}
149
138static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream, 150static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
139 struct snd_pcm_hw_params *params) 151 struct snd_pcm_hw_params *params)
140{ 152{
@@ -154,6 +166,15 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
154 166
155 if (mclk_fs) { 167 if (mclk_fs) {
156 mclk = params_rate(params) * mclk_fs; 168 mclk = params_rate(params) * mclk_fs;
169
170 ret = asoc_simple_set_clk_rate(&dai_props->codec_dai, mclk);
171 if (ret < 0)
172 return ret;
173
174 ret = asoc_simple_set_clk_rate(&dai_props->cpu_dai, mclk);
175 if (ret < 0)
176 return ret;
177
157 ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk, 178 ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
158 SND_SOC_CLOCK_IN); 179 SND_SOC_CLOCK_IN);
159 if (ret && ret != -ENOTSUPP) 180 if (ret && ret != -ENOTSUPP)