ASoC: fsl_ssi: Fix clock control issue in master mode
The test case is arecord -Dhw:0 -d 10 -f S16_LE -r 48000 -c 2 temp.wav & aplay -Dhw:0 -d 30 -f S16_LE -r 48000 -c 2 test.wav There will be error after end of arecord: aplay: pcm_write:2051: write error: Input/output error Capture and Playback work in parallel in master mode, one substream stops, the other substream is impacted, the reason is that clock is disabled wrongly. The clock's reference count is not increased when second substream starts, the hw_param() function returns in the beginning because first substream is enabled, then in end of first substream, the hw_free() disables the clock. This patch is to move the clock enablement to the place before checking of the device enablement in hw_param(). Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> Link: https://lore.kernel.org/r/1567012817-12625-1-git-send-email-shengjiu.wang@nxp.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
d2ac1fe034
commit
696d05225c
@ -799,15 +799,6 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
|
||||
u32 wl = SSI_SxCCR_WL(sample_size);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* SSI is properly configured if it is enabled and running in
|
||||
* the synchronous mode; Note that AC97 mode is an exception
|
||||
* that should set separate configurations for STCCR and SRCCR
|
||||
* despite running in the synchronous mode.
|
||||
*/
|
||||
if (ssi->streams && ssi->synchronous)
|
||||
return 0;
|
||||
|
||||
if (fsl_ssi_is_i2s_master(ssi)) {
|
||||
ret = fsl_ssi_set_bclk(substream, dai, hw_params);
|
||||
if (ret)
|
||||
@ -823,6 +814,15 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* SSI is properly configured if it is enabled and running in
|
||||
* the synchronous mode; Note that AC97 mode is an exception
|
||||
* that should set separate configurations for STCCR and SRCCR
|
||||
* despite running in the synchronous mode.
|
||||
*/
|
||||
if (ssi->streams && ssi->synchronous)
|
||||
return 0;
|
||||
|
||||
if (!fsl_ssi_is_ac97(ssi)) {
|
||||
/*
|
||||
* Keep the ssi->i2s_net intact while having a local variable
|
||||
|
Loading…
Reference in New Issue
Block a user