McBSP has free-running mode where serial clocks continue to run during emulation halts. This mode is always enabled by the driver.
Disable this free-running mode according to the 'ti,disable-free-run' device-tree property.
Signed-off-by: Bastien Curutchet bastien.curutchet@bootlin.com --- sound/soc/ti/davinci-i2s.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/sound/soc/ti/davinci-i2s.c b/sound/soc/ti/davinci-i2s.c index 2c19e45b6b54..67307e75f2a8 100644 --- a/sound/soc/ti/davinci-i2s.c +++ b/sound/soc/ti/davinci-i2s.c @@ -165,6 +165,7 @@ struct davinci_mcbsp_dev { int slot_width;
bool sync_err; + bool free_run; };
static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, @@ -444,11 +445,13 @@ static int davinci_i2s_hw_params(struct snd_pcm_substream *substream,
/* general line settings */ spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG); + if (dev->free_run) + spcr |= DAVINCI_MCBSP_SPCR_FREE; if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - spcr |= DAVINCI_MCBSP_SPCR_RINTM(3) | DAVINCI_MCBSP_SPCR_FREE; + spcr |= DAVINCI_MCBSP_SPCR_RINTM(3); davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); } else { - spcr |= DAVINCI_MCBSP_SPCR_XINTM(3) | DAVINCI_MCBSP_SPCR_FREE; + spcr |= DAVINCI_MCBSP_SPCR_XINTM(3); davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); }
@@ -766,6 +769,7 @@ static int davinci_i2s_probe(struct platform_device *pdev)
dev->base = io_base;
+ dev->free_run = !of_property_read_bool(pdev->dev.of_node, "ti,disable-free-run"); dev->sync_err = of_property_read_bool(pdev->dev.of_node, "ti,enable-sync-err");
/* setup DMA, first TX, then RX */