lkml.org 
[lkml]   [2019]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 158/313] ASoC: fsl_ssi: Fix clock control issue in master mode
    Date
    From: Shengjiu Wang <shengjiu.wang@nxp.com>

    [ Upstream commit 696d05225cebffd172008d212657be90e823eac0 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    sound/soc/fsl/fsl_ssi.c | 18 +++++++++---------
    1 file changed, 9 insertions(+), 9 deletions(-)

    diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c
    index 09b2967befd96..d83be26d64467 100644
    --- a/sound/soc/fsl/fsl_ssi.c
    +++ b/sound/soc/fsl/fsl_ssi.c
    @@ -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
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-10-03 18:31    [W:2.411 / U:0.212 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site