• Lars-Peter Clausen's avatar
    ASoC: wm8753: Integrate capacitor charging into the DAPM sequence · 35afd922
    Lars-Peter Clausen authored
    When being powered on, either initially on probe or when resuming from
    suspend, the wm8971 configures the device for quick output capacitor
    charging. Since the charging can take a rather long time (up to multiple
    seconds) it is done asynchronously without blocking. A delayed work item is
    run once the charging is finished and the device is switched to the target
    bias level.
    
    This all done asynchronously to the regular DAPM sequence accessing the same
    data structures and registers without any looking, which can lead to race
    conditions. Furthermore this potentially delays the start of stream on the
    CODEC while the rest of the system is already up and running, meaning the
    first bytes of audio are lost. It also does no comply with the assumption of
    the DAPM core that if set_bias_level() returned successfully the device will
    be at the requested bias level.
    
    This patch slightly refactors things and makes sure that the caps charging
    is properly integrated into the DAPM sequence. When transitioning from
    SND_SOC_BIAS_OFF to SND_SOC_BIAS_STANDBY the part will be put into fast
    charging mode and a work item will be scheduled that puts it back into
    standby charging once the charging period has elapsed. If a playback or
    capture stream is started while charging is in progress the driver will now
    wait in SND_SOC_BIAS_PREPARE until the charging is done. This makes sure
    that charging is done asynchronously in the background when the chip is
    idle, but at the same time makes sure that playback/capture is not started
    before the charging is done.
    Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Acked-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    35afd922
wm8753.c 46.6 KB