From b9668d7af2016b052dd5ac7c8ccb64303935bb86 Mon Sep 17 00:00:00 2001 From: Daniel Baluta Date: Tue, 27 Nov 2018 10:44:13 +0200 Subject: MLK-20095-3: ASoC: fsl: dsp: Add ASRC clocks We enable the ASRC clocks from CPU side. We only need the following clocks: "mem", "ipg" and "asrc0..3". Signed-off-by: Daniel Baluta Reviewed-by: Shengjiu Wang --- sound/soc/fsl/fsl_dsp_cpu.c | 47 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) (limited to 'sound/soc/fsl/fsl_dsp_cpu.c') diff --git a/sound/soc/fsl/fsl_dsp_cpu.c b/sound/soc/fsl/fsl_dsp_cpu.c index c203b70160f4..4903deb3efd7 100644 --- a/sound/soc/fsl/fsl_dsp_cpu.c +++ b/sound/soc/fsl/fsl_dsp_cpu.c @@ -47,7 +47,8 @@ static const struct snd_soc_component_driver audio_dsp_component = { static int dsp_audio_probe(struct platform_device *pdev) { struct fsl_dsp_audio *dsp_audio; - int ret; + int i, ret; + char tmp[16]; dsp_audio = devm_kzalloc(&pdev->dev, sizeof(*dsp_audio), GFP_KERNEL); if (dsp_audio == NULL) @@ -73,6 +74,27 @@ static int dsp_audio_probe(struct platform_device *pdev) dsp_audio->m_clk = NULL; } + dsp_audio->asrc_mem_clk = devm_clk_get(&pdev->dev, "mem"); + if (IS_ERR(dsp_audio->asrc_mem_clk)) { + dev_err(&pdev->dev, "failed to get mem clock\n"); + dsp_audio->asrc_mem_clk = NULL; + } + + dsp_audio->asrc_ipg_clk = devm_clk_get(&pdev->dev, "ipg"); + if (IS_ERR(dsp_audio->asrc_ipg_clk)) { + dev_err(&pdev->dev, "failed to get ipg clock\n"); + dsp_audio->asrc_ipg_clk = NULL; + } + + for (i = 0; i < ASRC_CLK_MAX_NUM; i++) { + sprintf(tmp, "asrck_%x", i); + dsp_audio->asrck_clk[i] = devm_clk_get(&pdev->dev, tmp); + if (IS_ERR(dsp_audio->asrck_clk[i])) { + dev_err(&pdev->dev, "failed to get %s clock\n", tmp); + dsp_audio->asrck_clk[i] = NULL; + } + } + pm_runtime_enable(&pdev->dev); /* now register audio DSP platform driver */ @@ -100,7 +122,7 @@ static int dsp_audio_remove(struct platform_device *pdev) static int dsp_runtime_resume(struct device *dev) { struct fsl_dsp_audio *dsp_audio = dev_get_drvdata(dev); - int ret; + int i, ret; ret = clk_prepare_enable(dsp_audio->bus_clk); if (ret) { @@ -114,13 +136,34 @@ static int dsp_runtime_resume(struct device *dev) return ret; } + ret = clk_prepare_enable(dsp_audio->asrc_mem_clk); + if (ret < 0) + dev_err(dev, "Failed to enable asrc_mem_clk ret = %d\n", ret); + + ret = clk_prepare_enable(dsp_audio->asrc_ipg_clk); + if (ret < 0) + dev_err(dev, "Failed to enable asrc_ipg_clk ret = %d\n", ret); + + for (i = 0; i < ASRC_CLK_MAX_NUM; i++) { + ret = clk_prepare_enable(dsp_audio->asrck_clk[i]); + if (ret < 0) + dev_err(dev, "failed to prepare arc clk %d\n", i); + } + return ret; } static int dsp_runtime_suspend(struct device *dev) { + int i; struct fsl_dsp_audio *dsp_audio = dev_get_drvdata(dev); + for (i = 0; i < ASRC_CLK_MAX_NUM; i++) + clk_disable_unprepare(dsp_audio->asrck_clk[i]); + + clk_disable_unprepare(dsp_audio->asrc_ipg_clk); + clk_disable_unprepare(dsp_audio->asrc_mem_clk); + clk_disable_unprepare(dsp_audio->m_clk); clk_disable_unprepare(dsp_audio->bus_clk); -- cgit v1.2.3