• Lars-Peter Clausen's avatar
    ASoC: dapm: Implement mixer input auto-disable · 57295073
    Lars-Peter Clausen authored
    Some devices have the problem that if a internal audio signal source is disabled
    the output of the source becomes undefined or goes to a undesired state (E.g.
    DAC output goes to ground instead of VMID). In this case it is necessary, in
    order to avoid unwanted clicks and pops, to disable any mixer input the signal
    feeds into or to active a mute control along the path to the output. Often it is
    still desirable to expose the same mixer input control to userspace, so cerain
    paths can sill be disabled manually. This means we can not use conventional DAPM
    to manage the mixer input control. This patch implements a method for letting
    DAPM overwrite the state of a userspace visible control. I.e. DAPM will disable
    the control if the path on which the control sits becomes inactive. Userspace
    will then only see a cached copy of the controls state. Once DAPM powers the
    path up again it will sync the userspace setting with the hardware and give
    control back to userspace.
    
    To implement this a new widget type is introduced. One widget of this type will
    be created for each DAPM kcontrol which has the auto-disable feature enabled.
    For each path that is controlled by the kcontrol the widget will be connected to
    the source of that path. The new widget type behaves like a supply widget,
    which means it will power up if one of its sinks are powered up and will only
    power down if all of its sinks are powered down. In order to only have the mixer
    input enabled when the source signal is valid the new widget type will be
    disabled before all other widget types and only be enabled after all other
    widget types.
    
    E.g. consider the following simplified example. A DAC is connected to a mixer
    and the mixer has a control to enable or disable the signal from the DAC.
    
                         +-------+
      +-----+            |       |
      | DAC |-----[Ctrl]-| Mixer |
      +-----+       :    |       |
         |          :    +-------+
         |          :
        +-------------+
        | Ctrl widget |
        +-------------+
    
    If the control has the auto-disable feature enabled we'll create a widget for
    the control. This widget is connected to the DAC as it is the source for the
    mixer input. If the DAC powers up the control widget powers up and if the DAC
    powers down the control widget is powered down. As long as the control widget
    is powered down the hardware input control is kept disabled and if it is enabled
    userspace can freely change the control's state.
    Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Signed-off-by: default avatarMark Brown <broonie@linaro.org>
    57295073
soc.h 41.1 KB