diff options
author | Daniel Baluta <daniel.baluta@nxp.com> | 2018-11-27 10:44:13 +0200 |
---|---|---|
committer | Dong Aisheng <aisheng.dong@nxp.com> | 2019-11-25 15:52:14 +0800 |
commit | b9668d7af2016b052dd5ac7c8ccb64303935bb86 (patch) | |
tree | 03909654b1b28b7a66b99268fa5c1e0c10eb35d1 /sound/soc/fsl/fsl_dsp_cpu.c | |
parent | 1ac4dce34cf9962638a8f7378a0ca8db50517325 (diff) |
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 <daniel.baluta@nxp.com>
Reviewed-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Diffstat (limited to 'sound/soc/fsl/fsl_dsp_cpu.c')
-rw-r--r-- | sound/soc/fsl/fsl_dsp_cpu.c | 47 |
1 files changed, 45 insertions, 2 deletions
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); |