Skip to content

Commit

Permalink
ASoC: fsl_spdif: Add core clock control for DMA access
Browse files Browse the repository at this point in the history
Regmap is able to enable/disable the core clock automatically each time
it's going to access the registers. But for DMA cases during playback or
recording, it's totally beyong control of regmap. So we have to open the
clock manually.

Signed-off-by: Nicolin Chen <Guangyu.Chen@freescale.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
  • Loading branch information
Nicolin Chen authored and Mark Brown committed Apr 24, 2014
1 parent c9eaa44 commit 08f7336
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion sound/soc/fsl/fsl_spdif.c
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ struct fsl_spdif_priv {
u8 rxclk_src;
struct clk *txclk[SPDIF_TXRATE_MAX];
struct clk *rxclk;
struct clk *coreclk;
struct snd_dmaengine_dai_dma_data dma_params_tx;
struct snd_dmaengine_dai_dma_data dma_params_rx;

Expand Down Expand Up @@ -423,10 +424,16 @@ static int fsl_spdif_startup(struct snd_pcm_substream *substream,

/* Reset module and interrupts only for first initialization */
if (!cpu_dai->active) {
ret = clk_prepare_enable(spdif_priv->coreclk);
if (ret) {
dev_err(&pdev->dev, "failed to enable core clock\n");
return ret;
}

ret = spdif_softreset(spdif_priv);
if (ret) {
dev_err(&pdev->dev, "failed to soft reset\n");
return ret;
goto err;
}

/* Disable all the interrupts */
Expand Down Expand Up @@ -454,6 +461,11 @@ static int fsl_spdif_startup(struct snd_pcm_substream *substream,
regmap_update_bits(regmap, REG_SPDIF_SCR, SCR_LOW_POWER, 0);

return 0;

err:
clk_disable_unprepare(spdif_priv->coreclk);

return ret;
}

static void fsl_spdif_shutdown(struct snd_pcm_substream *substream,
Expand Down Expand Up @@ -484,6 +496,7 @@ static void fsl_spdif_shutdown(struct snd_pcm_substream *substream,
spdif_intr_status_clear(spdif_priv);
regmap_update_bits(regmap, REG_SPDIF_SCR,
SCR_LOW_POWER, SCR_LOW_POWER);
clk_disable_unprepare(spdif_priv->coreclk);
}
}

Expand Down Expand Up @@ -1134,6 +1147,13 @@ static int fsl_spdif_probe(struct platform_device *pdev)
return ret;
}

/* Get core clock for data register access via DMA */
spdif_priv->coreclk = devm_clk_get(&pdev->dev, "core");
if (IS_ERR(spdif_priv->coreclk)) {
dev_err(&pdev->dev, "no core clock in devicetree\n");
return PTR_ERR(spdif_priv->coreclk);
}

/* Select clock source for rx/tx clock */
spdif_priv->rxclk = devm_clk_get(&pdev->dev, "rxtx1");
if (IS_ERR(spdif_priv->rxclk)) {
Expand Down

0 comments on commit 08f7336

Please sign in to comment.