• Lars-Peter Clausen's avatar
    ASoC: dapm: Run widget updates for shared controls at the same time · ce6cfaf1
    Lars-Peter Clausen authored
    Currently when updating a control that is shared between multiple widgets the
    whole power-up/power-down sequence is being run once for each widget. The
    control register is updated during the first run, which means the CODEC internal
    routing is also updated for all widgets during this first run. The input and
    output paths for each widgets are only updated though during the respective run
    for that widget. This leads to a slight inconsistency between the CODEC's
    internal state and ASoC's state, which causes non optimal behavior in regard to
    click and pop avoidance.
    
    E.g. consider the following setup where two MUXs share the same control.
    
              +------+
     A1 ------|      |
              | MUX1 |----- C1
     B1 ------|      |
              +------+
                 |
      control ---+
                 |
              +------+
     A2 ------|      |
              | MUX2 |----- C2
     B2 ------|      |
              +------+
    
    If the control is updated to switch the MUXs from input A to input B with the
    current code the power-up/power-down sequence will look like this:
    
    Run soc_dapm_mux_update_power for MUX1
      Power-down A1
      Update MUXing
      Power-up B1
    
    Run soc_dapm_mux_update_power for MUX2
      Power-down A2
      (Update MUXing)
      Power-up B2
    
    Note that the second 'Update Muxing' is a no-op, since the register was already
    updated.
    
    While the preferred order for avoiding pops and clicks should be:
    
    Run soc_dapm_mux_update_power for control
      Power-down A1
      Power-down A2
      Update MUXing
      Power-up B1
      Power-up B2
    
    This patch changes the behavior to the later by running the updates for all
    widgets that the control is attached to at the same time.
    
    The new code is also a bit simpler since callers of
    soc_dapm_{mux,muxer}_update_power don't have to loop over each widget anymore
    and neither do we need to keep track for which of the kcontrol's widgets the
    current update is.
    Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Signed-off-by: default avatarMark Brown <broonie@linaro.org>
    ce6cfaf1
soc-dapm.h 25.4 KB