• Misael Lopez Cruz's avatar
    ASoC: Prevent pop_wait overwrite · 9bffb1fb
    Misael Lopez Cruz authored
    pop_wait is used to determine if a deferred playback close
    needs to be cancelled when the a PCM is open or if after
    the power-down delay expires it needs to run. pop_wait is
    associated with the CODEC DAI, so the CODEC DAI must be
    unique. This holds true for most CODECs, except for the
    dummy CODEC and its DAI.
    
    In DAI links with non-unique dummy CODECs (e.g. front-ends),
    pop_wait can be overwritten by another DAI link using also a
    dummy CODEC. Failure to cancel a deferred close can cause
    mute due to the DAPM STOP event sent in the deferred work.
    
    One scenario where pop_wait is overwritten and causing mute
    is below (where hw:0,0 and hw:0,1 are two front-ends with
    default pmdown_time = 5 secs):
    
    aplay /dev/urandom -D hw:0,0 -c 2 -r 48000 -f S16_LE -d 1
    sleep 1
    aplay /dev/urandom -D hw:0,1 -c 2 -r 48000 -f S16_LE -d 3 &
    aplay /dev/urandom -D hw:0,0 -c 2 -r 48000 -f S16_LE
    
    Since CODECs may not be unique, pop_wait is moved to the PCM
    runtime structure. Creating separate dummy CODECs for each
    DAI link can also solve the problem, but at this point it's
    only pop_wait variable in the CODEC DAI that has negative
    effects by not being unique.
    Signed-off-by: default avatarMisael Lopez Cruz <misael.lopez@ti.com>
    Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
    9bffb1fb
soc.h 39.9 KB