diff options
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/fsl/fsl_esai.c | 11 | ||||
-rw-r--r-- | sound/soc/fsl/fsl_esai.h | 1 | ||||
-rw-r--r-- | sound/soc/fsl/fsl_spdif.c | 10 |
3 files changed, 21 insertions, 1 deletions
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c index 221b4e49ed60..72165238e4ac 100644 --- a/sound/soc/fsl/fsl_esai.c +++ b/sound/soc/fsl/fsl_esai.c @@ -294,6 +294,7 @@ static int fsl_esai_startup(struct snd_pcm_substream *substream, struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai); clk_enable(esai->clk); + clk_prepare_enable(esai->dmaclk); if (!cpu_dai->active) { writel(ESAI_GPIO_ESAI, esai->base + ESAI_PRRC); writel(ESAI_GPIO_ESAI, esai->base + ESAI_PCRC); @@ -438,6 +439,7 @@ static void fsl_esai_shutdown(struct snd_pcm_substream *substream, { struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai); + clk_disable_unprepare(esai->dmaclk); clk_disable(esai->clk); } @@ -576,7 +578,7 @@ static int fsl_esai_probe(struct platform_device *pdev) } esai->flags = flag; - esai->clk = devm_clk_get(&pdev->dev, NULL); + esai->clk = devm_clk_get(&pdev->dev, "core"); if (IS_ERR(esai->clk)) { ret = PTR_ERR(esai->clk); dev_err(&pdev->dev, "Cannot get the clock: %d\n", ret); @@ -584,6 +586,13 @@ static int fsl_esai_probe(struct platform_device *pdev) } clk_prepare(esai->clk); + esai->dmaclk = devm_clk_get(&pdev->dev, "dma"); + if (IS_ERR(esai->dmaclk)) { + ret = PTR_ERR(esai->dmaclk); + dev_err(&pdev->dev, "Cannot get dma clock: %d\n", ret); + goto failed_get_resource; + } + ret = of_address_to_resource(np, 0, &res); if (ret) { dev_err(&pdev->dev, "could not determine device resources\n"); diff --git a/sound/soc/fsl/fsl_esai.h b/sound/soc/fsl/fsl_esai.h index 32ff624af860..f0b6198a69a6 100644 --- a/sound/soc/fsl/fsl_esai.h +++ b/sound/soc/fsl/fsl_esai.h @@ -318,6 +318,7 @@ struct fsl_esai { struct clk *clk; + struct clk *dmaclk; void __iomem *base; int irq; unsigned int flags; diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c index 10e5c7568c4e..99480fe77f4f 100644 --- a/sound/soc/fsl/fsl_spdif.c +++ b/sound/soc/fsl/fsl_spdif.c @@ -83,6 +83,7 @@ struct fsl_spdif_priv { struct clk *txclk[SPDIF_TXRATE_MAX]; struct clk *rxclk; struct clk *sysclk; + struct clk *dmaclk; struct snd_dmaengine_dai_dma_data dma_params_tx; struct snd_dmaengine_dai_dma_data dma_params_rx; @@ -425,6 +426,7 @@ static int fsl_spdif_startup(struct snd_pcm_substream *substream, int ret; pm_runtime_get_sync(cpu_dai->dev); + clk_prepare_enable(spdif_priv->dmaclk); /* Reset module and interrupts only for first initialization */ if (!cpu_dai->active) { @@ -491,6 +493,7 @@ static void fsl_spdif_shutdown(struct snd_pcm_substream *substream, SCR_LOW_POWER, SCR_LOW_POWER); } + clk_disable_unprepare(spdif_priv->dmaclk); pm_runtime_put_sync(cpu_dai->dev); } @@ -1159,6 +1162,13 @@ static int fsl_spdif_probe(struct platform_device *pdev) return PTR_ERR(spdif_priv->sysclk); } + /* Get dma clock for dma script operation */ + spdif_priv->dmaclk = devm_clk_get(&pdev->dev, "dma"); + if (IS_ERR(spdif_priv->dmaclk)) { + dev_err(&pdev->dev, "no dma clock in devicetree\n"); + return PTR_ERR(spdif_priv->dmaclk); + } + /* Select clock source for rx/tx clock */ spdif_priv->rxclk = devm_clk_get(&pdev->dev, "rxtx1"); if (IS_ERR(spdif_priv->rxclk)) { |