summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorBaoyou Xie <baoyou.xie@linaro.org>2017-02-08 22:12:58 -0500
committerMark Brown <broonie@kernel.org>2017-02-09 12:26:21 -0500
commit66ead502af7de65d1e555189cdca8f47eddac400 (patch)
treeefc84847e579f6cf2b8e0bdb132f8b244dcf7e61 /sound
parentb5f18ba89391da7a92605dc76822580d13e2ef74 (diff)
ASoC: zx-i2s: introduce pclk for zx2967 family
The pclk is necessary for zx2967 I2S controller. the driver currently doesn't handle it. This is something we need to fix. In turn, the driver supports zx296718's I2S controller. By the way, this patch also change the clock name from tx to wclk to make it clear. Signed-off-by: Baoyou Xie <baoyou.xie@linaro.org> Reviewed-by: Shawn Guo <shawnguo@kernel.org> Reviewed-by: Jun Nie <jun.nie@linaro.org> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/zte/zx-i2s.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/sound/soc/zte/zx-i2s.c b/sound/soc/zte/zx-i2s.c
index ed7a56d1ef54..a865f37c2a56 100644
--- a/sound/soc/zte/zx-i2s.c
+++ b/sound/soc/zte/zx-i2s.c
@@ -95,7 +95,8 @@
95struct zx_i2s_info { 95struct zx_i2s_info {
96 struct snd_dmaengine_dai_dma_data dma_playback; 96 struct snd_dmaengine_dai_dma_data dma_playback;
97 struct snd_dmaengine_dai_dma_data dma_capture; 97 struct snd_dmaengine_dai_dma_data dma_capture;
98 struct clk *dai_clk; 98 struct clk *dai_wclk;
99 struct clk *dai_pclk;
99 void __iomem *reg_base; 100 void __iomem *reg_base;
100 int master; 101 int master;
101 resource_size_t mapbase; 102 resource_size_t mapbase;
@@ -275,8 +276,9 @@ static int zx_i2s_hw_params(struct snd_pcm_substream *substream,
275 writel_relaxed(val, i2s->reg_base + ZX_I2S_TIMING_CTRL); 276 writel_relaxed(val, i2s->reg_base + ZX_I2S_TIMING_CTRL);
276 277
277 if (i2s->master) 278 if (i2s->master)
278 ret = clk_set_rate(i2s->dai_clk, 279 ret = clk_set_rate(i2s->dai_wclk,
279 params_rate(params) * ch_num * CLK_RAT); 280 params_rate(params) * ch_num * CLK_RAT);
281
280 return ret; 282 return ret;
281} 283}
282 284
@@ -328,8 +330,19 @@ static int zx_i2s_startup(struct snd_pcm_substream *substream,
328 struct snd_soc_dai *dai) 330 struct snd_soc_dai *dai)
329{ 331{
330 struct zx_i2s_info *zx_i2s = dev_get_drvdata(dai->dev); 332 struct zx_i2s_info *zx_i2s = dev_get_drvdata(dai->dev);
333 int ret;
334
335 ret = clk_prepare_enable(zx_i2s->dai_wclk);
336 if (ret)
337 return ret;
338
339 ret = clk_prepare_enable(zx_i2s->dai_pclk);
340 if (ret) {
341 clk_disable_unprepare(zx_i2s->dai_wclk);
342 return ret;
343 }
331 344
332 return clk_prepare_enable(zx_i2s->dai_clk); 345 return ret;
333} 346}
334 347
335static void zx_i2s_shutdown(struct snd_pcm_substream *substream, 348static void zx_i2s_shutdown(struct snd_pcm_substream *substream,
@@ -337,7 +350,8 @@ static void zx_i2s_shutdown(struct snd_pcm_substream *substream,
337{ 350{
338 struct zx_i2s_info *zx_i2s = dev_get_drvdata(dai->dev); 351 struct zx_i2s_info *zx_i2s = dev_get_drvdata(dai->dev);
339 352
340 clk_disable_unprepare(zx_i2s->dai_clk); 353 clk_disable_unprepare(zx_i2s->dai_wclk);
354 clk_disable_unprepare(zx_i2s->dai_pclk);
341} 355}
342 356
343static struct snd_soc_dai_ops zx_i2s_dai_ops = { 357static struct snd_soc_dai_ops zx_i2s_dai_ops = {
@@ -381,10 +395,16 @@ static int zx_i2s_probe(struct platform_device *pdev)
381 if (!zx_i2s) 395 if (!zx_i2s)
382 return -ENOMEM; 396 return -ENOMEM;
383 397
384 zx_i2s->dai_clk = devm_clk_get(&pdev->dev, "tx"); 398 zx_i2s->dai_wclk = devm_clk_get(&pdev->dev, "wclk");
385 if (IS_ERR(zx_i2s->dai_clk)) { 399 if (IS_ERR(zx_i2s->dai_wclk)) {
386 dev_err(&pdev->dev, "Fail to get clk\n"); 400 dev_err(&pdev->dev, "Fail to get wclk\n");
387 return PTR_ERR(zx_i2s->dai_clk); 401 return PTR_ERR(zx_i2s->dai_wclk);
402 }
403
404 zx_i2s->dai_pclk = devm_clk_get(&pdev->dev, "pclk");
405 if (IS_ERR(zx_i2s->dai_pclk)) {
406 dev_err(&pdev->dev, "Fail to get pclk\n");
407 return PTR_ERR(zx_i2s->dai_pclk);
388 } 408 }
389 409
390 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 410 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);