• Shengjiu Wang's avatar
    ALSA: dmaengine_pcm: terminate dmaengine before synchronize · 6a7db25a
    Shengjiu Wang authored
    When dmaengine supports pause function, in suspend state,
    dmaengine_pause() is called instead of dmaengine_terminate_async(),
    
    In end of playback stream, the runtime->state will go to
    SNDRV_PCM_STATE_DRAINING, if system suspend & resume happen
    at this time, application will not resume playback stream, the
    stream will be closed directly, the dmaengine_terminate_async()
    will not be called before the dmaengine_synchronize(), which
    violates the call sequence for dmaengine_synchronize().
    
    This behavior also happens for capture streams, but there is no
    SNDRV_PCM_STATE_DRAINING state for capture. So use
    dmaengine_tx_status() to check the DMA status if the status is
    DMA_PAUSED, then call dmaengine_terminate_async() to terminate
    dmaengine before dmaengine_synchronize().
    Signed-off-by: default avatarShengjiu Wang <shengjiu.wang@nxp.com>
    Link: https://patch.msgid.link/1718851218-27803-1-git-send-email-shengjiu.wang@nxp.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    6a7db25a
pcm_dmaengine.c 14.4 KB