Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: ti: davinci-i2s: Link free-run mode to SND_SOC_DAIFMT_[GATED/CONT]

McBSP has free-running mode where serial clocks continue to run during
emulation halts. This mode is always enabled by the driver.

Set free-running mode when SND_SOC_DAIFMT_CONT is selected by DAI
format, unset it when SND_SOC_DAIFMT_GATED is selected.

Signed-off-by: Bastien Curutchet <bastien.curutchet@bootlin.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@gmail.com>
Link: https://msgid.link/r/20240402071213.11671-11-bastien.curutchet@bootlin.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Bastien Curutchet and committed by
Mark Brown
091b440f 94d57c54

+20 -2
+20 -2
sound/soc/ti/davinci-i2s.c
··· 280 280 { 281 281 struct davinci_mcbsp_dev *dev = snd_soc_dai_get_drvdata(cpu_dai); 282 282 unsigned int pcr; 283 + unsigned int spcr; 283 284 unsigned int srgr; 284 285 bool inv_fs = false; 285 286 /* Attention srgr is updated by hw_params! */ ··· 289 288 DAVINCI_MCBSP_SRGR_FWID(DEFAULT_BITPERSAMPLE - 1); 290 289 291 290 dev->fmt = fmt; 291 + 292 + spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG); 293 + switch (fmt & SND_SOC_DAIFMT_CLOCK_MASK) { 294 + case SND_SOC_DAIFMT_CONT: 295 + spcr |= DAVINCI_MCBSP_SPCR_FREE; 296 + dev_dbg(dev->dev, "Free-running mode ON\n"); 297 + break; 298 + case SND_SOC_DAIFMT_GATED: 299 + spcr &= ~DAVINCI_MCBSP_SPCR_FREE; 300 + dev_dbg(dev->dev, "Free-running mode OFF\n"); 301 + break; 302 + default: 303 + dev_err(dev->dev, "Invalid clock gating\n"); 304 + return -EINVAL; 305 + } 306 + davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); 307 + 292 308 /* set master/slave audio interface */ 293 309 switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) { 294 310 case SND_SOC_DAIFMT_BP_FP: ··· 470 452 /* general line settings */ 471 453 spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG); 472 454 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { 473 - spcr |= DAVINCI_MCBSP_SPCR_RINTM(3) | DAVINCI_MCBSP_SPCR_FREE; 455 + spcr |= DAVINCI_MCBSP_SPCR_RINTM(3); 474 456 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); 475 457 } else { 476 - spcr |= DAVINCI_MCBSP_SPCR_XINTM(3) | DAVINCI_MCBSP_SPCR_FREE; 458 + spcr |= DAVINCI_MCBSP_SPCR_XINTM(3); 477 459 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); 478 460 } 479 461