• Nicolin Chen's avatar
    ASoC: fsl_sai: Fix buggy configurations in trigger() · e6b39846
    Nicolin Chen authored
    The current trigger() has two crucial problems:
    1) The DMA request enabling operations (FSL_SAI_CSR_FRDE) for Tx and Rx are
       now totally exclusive: It would fail to run simultaneous Tx-Rx cases.
    2) The TERE disabling operation depends on an incorrect condition -- active
       reference count that only gets increased in snd_pcm_open() and decreased
       in snd_pcm_close(): The TERE would never get cleared.
    
    So this patch overwrites the trigger function by following these rules:
    A) We continue to support tx-async-while-rx-sync-to-tx case alone, which's
       originally limited by this fsl_sai driver, but we make the code easy to
       modify for the further support of the opposite case.
    B) We enable both TE and RE for PLAYBACK stream or CAPTURE stream but only
       enabling the DMA request bit (FSL_SAI_CSR_FRDE) of the current direction
       due to the requirement of SAI -- For tx-async-while-rx-sync-to-tx case,
       the receiver is enabled only when both the transmitter and receiver are
       enabled.
    
    Tested cases:
    a) aplay test.wav -d5
    b) arecord -r44100 -c2 -fS16_LE test.wav -d5
    c) arecord -r44100 -c2 -fS16_LE -d5 | aplay
    d) (aplay test2.wav &); sleep 1; arecord -r44100 -c2 -fS16_LE test.wav -d1
    e) (arecord -r44100 -c2 -fS16_LE test.wav -d5 &); sleep 1; aplay test.wav -d1
    Signed-off-by: default avatarNicolin Chen <Guangyu.Chen@freescale.com>
    Acked-by: default avatarXiubo Li <Li.Xiubo@freescale.com>
    Signed-off-by: default avatarMark Brown <broonie@linaro.org>
    e6b39846
fsl_sai.h 4.65 KB