summaryrefslogtreecommitdiff
path: root/sound/soc/fsl/fsl_xcvr.c
diff options
context:
space:
mode:
authorViorel Suman <viorel.suman@nxp.com>2020-04-27 12:13:08 +0300
committerViorel Suman <viorel.suman@nxp.com>2020-04-27 14:43:37 +0300
commit660bbebb9c1fa3d5131b66445ef8b313a0159390 (patch)
tree227a15f1d2b04b36611895743daf963799eea52b /sound/soc/fsl/fsl_xcvr.c
parent11fbc93c2dbf5d11f6f6062a137ba625f6749461 (diff)
MLK-23567-3 ASoC: fsl_xcvr: release M0+ core prior raising interrupt
M0+ core must be released prior raising any interrupt to M0+ core, otherwise interrupt will be lost. Fixes: b16426007842 ("MLK-23567-2 ASoC: fsl_xcvr: enable SPDIF TX") Signed-off-by: Viorel Suman <viorel.suman@nxp.com> Reviewed-by: Shengjiu Wang <shengjiu.wang@nxp.com>
Diffstat (limited to 'sound/soc/fsl/fsl_xcvr.c')
-rw-r--r--sound/soc/fsl/fsl_xcvr.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/sound/soc/fsl/fsl_xcvr.c b/sound/soc/fsl/fsl_xcvr.c
index 6efec733c012..06fba208f19e 100644
--- a/sound/soc/fsl/fsl_xcvr.c
+++ b/sound/soc/fsl/fsl_xcvr.c
@@ -288,6 +288,25 @@ static int fsl_xcvr_prepare(struct snd_pcm_substream *substream,
u32 m_ctl = 0, v_ctl = 0, m_isr = 0, v_isr = 0, val;
int ret = 0;
+ if (tx && xcvr->mode == FSL_XCVR_MODE_SPDIF) {
+ val = FSL_XCVR_TX_DPTH_CTRL_BYPASS_FEM;
+ val |= FSL_XCVR_TX_DPTH_CTRL_FRM_FMT;
+ ret = regmap_write(xcvr->regmap, FSL_XCVR_TX_DPTH_CTRL_SET, val);
+ if (ret < 0) {
+ dev_err(dai->dev, "Failed to set TX_DPTH: %d\n", ret);
+ return ret;
+ }
+ } else {
+ /* Release M0+ reset */
+ ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
+ FSL_XCVR_EXT_CTRL_CORE_RESET, 0);
+ if (ret < 0) {
+ dev_err(dai->dev, "M0+ core release failed: %d\n", ret);
+ return ret;
+ }
+ mdelay(100);
+ }
+
ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
FSL_XCVR_IRQ_EARC_ALL, FSL_XCVR_IRQ_EARC_ALL);
if (ret < 0) {
@@ -336,24 +355,6 @@ static int fsl_xcvr_prepare(struct snd_pcm_substream *substream,
return ret;
}
- if (tx && xcvr->mode == FSL_XCVR_MODE_SPDIF) {
- val = FSL_XCVR_TX_DPTH_CTRL_BYPASS_FEM;
- val |= FSL_XCVR_TX_DPTH_CTRL_FRM_FMT;
- ret = regmap_write(xcvr->regmap, FSL_XCVR_TX_DPTH_CTRL_SET, val);
- if (ret < 0) {
- dev_err(dai->dev, "Failed to set TX_DPTH: %d\n", ret);
- return ret;
- }
- } else {
- /* Release M0+ reset */
- ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_CTRL,
- FSL_XCVR_EXT_CTRL_CORE_RESET, 0);
- if (ret < 0) {
- dev_err(dai->dev, "M0+ core release failed: %d\n", ret);
- return ret;
- }
- }
-
return 0;
}