aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShengjiu Wang <b02247@freescale.com>2014-04-10 02:50:15 -0400
committerNitin Garg <nitin.garg@freescale.com>2014-04-16 09:58:20 -0400
commitbf7902d0cae3d90dfda6e9f6e463955dfde9c382 (patch)
tree992b8750f4ac5a396cbcf3a63eb9fb97f70a9550
parent24bd975f29aef39658f50ca9805e272795538eae (diff)
ENGR00307835-1 ASoC: fsl: refine esai driver for sync mode
1. PCRC and PRRC should be set after the setting of control register according the RM. Then no need init TCCR and RCCR in init function. Signed-off-by: Shengjiu Wang <b02247@freescale.com>
-rw-r--r--sound/soc/fsl/fsl_esai.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
index 44ba41072b37..6f6adcec7d41 100644
--- a/sound/soc/fsl/fsl_esai.c
+++ b/sound/soc/fsl/fsl_esai.c
@@ -307,10 +307,7 @@ static int fsl_esai_startup(struct snd_pcm_substream *substream,
307 307
308 clk_enable(esai->clk); 308 clk_enable(esai->clk);
309 clk_prepare_enable(esai->dmaclk); 309 clk_prepare_enable(esai->dmaclk);
310 if (!cpu_dai->active) { 310
311 writel(ESAI_GPIO_ESAI, esai->base + ESAI_PRRC);
312 writel(ESAI_GPIO_ESAI, esai->base + ESAI_PCRC);
313 }
314 ESAI_DUMP(); 311 ESAI_DUMP();
315 return 0; 312 return 0;
316} 313}
@@ -431,19 +428,29 @@ static int fsl_esai_hw_params(struct snd_pcm_substream *substream,
431 struct snd_soc_dai *cpu_dai) 428 struct snd_soc_dai *cpu_dai)
432{ 429{
433 struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai); 430 struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai);
431 int ret = 0;
434 432
435 /* Tx/Rx config */ 433 /* Tx/Rx config */
436 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 434 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
437 if (readl(esai->base + ESAI_TCR) & ESAI_TCR_TE0) 435 if (readl(esai->base + ESAI_TCR) & ESAI_TCR_TE0)
438 return 0; 436 return 0;
439 437
440 return fsl_esai_hw_tx_params(substream, params, cpu_dai); 438 ret = fsl_esai_hw_tx_params(substream, params, cpu_dai);
441 } else { 439 } else {
442 if (readl(esai->base + ESAI_RCR) & ESAI_RCR_RE1) 440 if (readl(esai->base + ESAI_RCR) & ESAI_RCR_RE1)
443 return 0; 441 return 0;
444 442
445 return fsl_esai_hw_rx_params(substream, params, cpu_dai); 443 ret = fsl_esai_hw_rx_params(substream, params, cpu_dai);
446 } 444 }
445
446 /*
447 * PRRC and PCRC should be set after control register has been set,
448 * before the trigger() be called, according the reference manual.
449 */
450 writel(ESAI_GPIO_ESAI, esai->base + ESAI_PRRC);
451 writel(ESAI_GPIO_ESAI, esai->base + ESAI_PCRC);
452
453 return ret;
447} 454}
448 455
449static void fsl_esai_shutdown(struct snd_pcm_substream *substream, 456static void fsl_esai_shutdown(struct snd_pcm_substream *substream,
@@ -451,6 +458,11 @@ static void fsl_esai_shutdown(struct snd_pcm_substream *substream,
451{ 458{
452 struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai); 459 struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai);
453 460
461 if (!cpu_dai->active) {
462 writel(0, esai->base + ESAI_PRRC);
463 writel(0, esai->base + ESAI_PCRC);
464 }
465
454 clk_disable_unprepare(esai->dmaclk); 466 clk_disable_unprepare(esai->dmaclk);
455 clk_disable(esai->clk); 467 clk_disable(esai->clk);
456} 468}