aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/fsl
diff options
context:
space:
mode:
authorNicolin Chen <Guangyu.Chen@freescale.com>2014-03-31 23:17:07 -0400
committerMark Brown <broonie@linaro.org>2014-04-14 12:26:05 -0400
commit8abba5d64835c636d97ac0009ab7430ed832cb93 (patch)
tree76c002e8c80b6ed8a4859c2dbf9b1ea5edc2ab8e /sound/soc/fsl
parente6b398465821fb8e08d208bd4ef2b5b73ce87b58 (diff)
ASoC: fsl_sai: Separately enable interrupts for Tx and Rx streams
We only enable one side interrupt for each stream since over/underrun on the opposite stream would be resulted from what we previously did, enabling TERE but remaining FRDE disabled, even though the xrun on the opposite direction will not break the current stream. Signed-off-by: Nicolin Chen <Guangyu.Chen@freescale.com> Acked-by: Xiubo Li <Li.Xiubo@freescale.com> Signed-off-by: Mark Brown <broonie@linaro.org>
Diffstat (limited to 'sound/soc/fsl')
-rw-r--r--sound/soc/fsl/fsl_sai.c8
-rw-r--r--sound/soc/fsl/fsl_sai.h1
2 files changed, 7 insertions, 2 deletions
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c
index 80cca7bb2a11..21de5bd1c9c5 100644
--- a/sound/soc/fsl/fsl_sai.c
+++ b/sound/soc/fsl/fsl_sai.c
@@ -396,6 +396,8 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
396 } 396 }
397 397
398 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx), 398 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx),
399 FSL_SAI_CSR_xIE_MASK, FSL_SAI_FLAGS);
400 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx),
399 FSL_SAI_CSR_FRDE, FSL_SAI_CSR_FRDE); 401 FSL_SAI_CSR_FRDE, FSL_SAI_CSR_FRDE);
400 break; 402 break;
401 case SNDRV_PCM_TRIGGER_STOP: 403 case SNDRV_PCM_TRIGGER_STOP:
@@ -403,6 +405,8 @@ static int fsl_sai_trigger(struct snd_pcm_substream *substream, int cmd,
403 case SNDRV_PCM_TRIGGER_PAUSE_PUSH: 405 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
404 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx), 406 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx),
405 FSL_SAI_CSR_FRDE, 0); 407 FSL_SAI_CSR_FRDE, 0);
408 regmap_update_bits(sai->regmap, FSL_SAI_xCSR(tx),
409 FSL_SAI_CSR_xIE_MASK, 0);
406 410
407 if (!(tcsr & FSL_SAI_CSR_FRDE || rcsr & FSL_SAI_CSR_FRDE)) { 411 if (!(tcsr & FSL_SAI_CSR_FRDE || rcsr & FSL_SAI_CSR_FRDE)) {
408 regmap_update_bits(sai->regmap, FSL_SAI_TCSR, 412 regmap_update_bits(sai->regmap, FSL_SAI_TCSR,
@@ -463,8 +467,8 @@ static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai)
463{ 467{
464 struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev); 468 struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev);
465 469
466 regmap_update_bits(sai->regmap, FSL_SAI_TCSR, 0xffffffff, FSL_SAI_FLAGS); 470 regmap_update_bits(sai->regmap, FSL_SAI_TCSR, 0xffffffff, 0x0);
467 regmap_update_bits(sai->regmap, FSL_SAI_RCSR, 0xffffffff, FSL_SAI_FLAGS); 471 regmap_update_bits(sai->regmap, FSL_SAI_RCSR, 0xffffffff, 0x0);
468 regmap_update_bits(sai->regmap, FSL_SAI_TCR1, FSL_SAI_CR1_RFW_MASK, 472 regmap_update_bits(sai->regmap, FSL_SAI_TCR1, FSL_SAI_CR1_RFW_MASK,
469 FSL_SAI_MAXBURST_TX * 2); 473 FSL_SAI_MAXBURST_TX * 2);
470 regmap_update_bits(sai->regmap, FSL_SAI_RCR1, FSL_SAI_CR1_RFW_MASK, 474 regmap_update_bits(sai->regmap, FSL_SAI_RCR1, FSL_SAI_CR1_RFW_MASK,
diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h
index 64b6fe72cd08..be26d46ee737 100644
--- a/sound/soc/fsl/fsl_sai.h
+++ b/sound/soc/fsl/fsl_sai.h
@@ -58,6 +58,7 @@
58#define FSL_SAI_CSR_FWF BIT(17) 58#define FSL_SAI_CSR_FWF BIT(17)
59#define FSL_SAI_CSR_FRF BIT(16) 59#define FSL_SAI_CSR_FRF BIT(16)
60#define FSL_SAI_CSR_xIE_SHIFT 8 60#define FSL_SAI_CSR_xIE_SHIFT 8
61#define FSL_SAI_CSR_xIE_MASK (0x1f << FSL_SAI_CSR_xIE_SHIFT)
61#define FSL_SAI_CSR_WSIE BIT(12) 62#define FSL_SAI_CSR_WSIE BIT(12)
62#define FSL_SAI_CSR_SEIE BIT(11) 63#define FSL_SAI_CSR_SEIE BIT(11)
63#define FSL_SAI_CSR_FEIE BIT(10) 64#define FSL_SAI_CSR_FEIE BIT(10)