]> git.baikalelectronics.ru Git - kernel.git/commit
ASoC: Prevent pop_wait overwrite
authorMisael Lopez Cruz <misael.lopez@ti.com>
Thu, 13 Dec 2012 18:23:05 +0000 (12:23 -0600)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Sat, 15 Dec 2012 14:45:09 +0000 (23:45 +0900)
commitc2541a72228abac3eb3c16ace0635ff94354d1fe
tree88cc04ca2ff1f66f36561e559886fc8cbeeaca6e
parent95db02af6e5d6140cba81d28ac65bf83005e493b
ASoC: Prevent pop_wait overwrite

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: Misael Lopez Cruz <misael.lopez@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
include/sound/soc-dai.h
include/sound/soc.h
sound/soc/soc-compress.c
sound/soc/soc-pcm.c