1. 31 8月, 2013 2 次提交
  2. 11 8月, 2013 2 次提交
  3. 05 8月, 2013 1 次提交
    • L
      ASoC: dapm: Implement mixer input auto-disable · 57295073
      Lars-Peter Clausen 提交于
      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: NLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: NMark Brown <broonie@linaro.org>
      57295073
  4. 30 7月, 2013 1 次提交
  5. 27 6月, 2013 1 次提交
  6. 17 4月, 2013 1 次提交
  7. 28 3月, 2013 3 次提交
  8. 15 3月, 2013 1 次提交
  9. 13 3月, 2013 1 次提交
  10. 08 3月, 2013 1 次提交
  11. 27 1月, 2013 1 次提交
  12. 14 1月, 2013 1 次提交
  13. 21 12月, 2012 1 次提交
  14. 15 12月, 2012 1 次提交
    • M
      ASoC: Prevent pop_wait overwrite · 9bffb1fb
      Misael Lopez Cruz 提交于
      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: NMisael Lopez Cruz <misael.lopez@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      9bffb1fb
  15. 19 9月, 2012 1 次提交
  16. 21 8月, 2012 1 次提交
  17. 23 6月, 2012 1 次提交
  18. 03 6月, 2012 2 次提交
    • A
      ASoC: core: Add single controls with specified range of values · 6c9d8cf6
      Adam Thomson 提交于
      Control type added for cases where a specific range of values
      within a register are required for control.
      
      Added convenience macros:
      
      SOC_SINGLE_RANGE
      SOC_SINGLE_RANGE_TLV
      
      Added accessor implementations:
      
      snd_soc_info_volsw_range
      snd_soc_put_volsw_range
      snd_soc_get_volsw_range
      Signed-off-by: NMichal Hajduk <Michal.Hajduk@diasemi.com>
      Signed-off-by: NAdam Thomson <Adam.Thomson@diasemi.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      6c9d8cf6
    • S
      ASoC: make snd_soc_dai_link more symmetrical · bc92657a
      Stephen Warren 提交于
      Prior to this patch, the CPU side of a DAI link was specified using a
      single name. Often, this was the result of calling dev_name() on the
      device providing the DAI, but in the case of a CPU DAI driver that
      provided multiple DAIs, it needed to mix together both the device name
      and some device-relative name, in order to form a single globally unique
      name.
      
      However, the CODEC side of the DAI link was specified using separate
      fields for device (name or OF node) and device-relative DAI name.
      
      This patch allows the CPU side of a DAI link to be specified in the same
      way as the CODEC side, separating concepts of device and device-relative
      DAI name.
      
      I believe this will be important in multi-codec and/or dynamic PCM
      scenarios, where a single CPU driver provides multiple DAIs, while also
      booting using device tree, with accompanying desire not to hard-code the
      CPU side device's name into the original .cpu_dai_name field.
      
      Ideally, both the CPU DAI and CODEC DAI loops in soc_bind_dai_link()
      would now be identical. However, two things prevent that at present:
      
      1) The need to save rtd->codec for the CODEC side, which means we have
      to search for the CODEC explicitly, and not just the CODEC side DAI.
      
      2) Since we know the CODEC side DAI is part of a codec, and not just
      a standalone DAI, it's slightly more efficient to convert .codec_name/
      .codec_of_node into a codec first, and then compare each DAI's .codec
      field, since this avoids strcmp() on each DAI's CODEC's name within
      the loop.
      
      However, the two loops are essentially semantically equivalent.
      Signed-off-by: NStephen Warren <swarren@nvidia.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      bc92657a
  19. 27 4月, 2012 4 次提交
    • L
      ASoC: dpcm: Add bespoke trigger() · 07bf84aa
      Liam Girdwood 提交于
      Some on SoC DSP HW is very tightly coupled with DMA and DAI drivers. It's
      necessary to allow some flexability wrt to PCM operations here so that we
      can define a bespoke DPCM trigger() PCM operation for such HW.
      
      A bespoke DPCM trigger() allows exact ordering and timing of component
      triggering by allowing a component driver to manage the final enable
      and disable configurations without adding extra complexity to other
      component drivers. e.g. The McPDM DAI and ABE are tightly coupled on
      OMAP4 so we have a bespoke trigger to manage the trigger to improve
      performance and reduce complexity when triggering new McPDM BEs.
      Signed-off-by: NLiam Girdwood <lrg@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      07bf84aa
    • L
      ASoC: dpcm: Add API for DAI link substream and runtime lookup · 47c88fff
      Liam Girdwood 提交于
      Some component drivers will need to be able to look up their
      DAI link substream and RTD data. Provide a mechanism for this.
      Signed-off-by: NLiam Girdwood <lrg@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      47c88fff
    • L
      ASoC: dpcm: Add debugFS support for DPCM · f86dcef8
      Liam Girdwood 提交于
      Add debugFS files for DPCM link management information.
      Signed-off-by: NLiam Girdwood <lrg@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      f86dcef8
    • L
      ASoC: dpcm: Add Dynamic PCM core operations. · 01d7584c
      Liam Girdwood 提交于
      The Dynamic PCM core allows digital audio data to be dynamically
      routed between different ALSA PCMs and DAI links on SoC CPUs with
      on chip DSP devices. e.g. audio data could be played on pcm:0,0 and
      routed to any (or all) SoC DAI links.
      
      Dynamic PCM introduces the concept of Front End (FE) PCMs and Back
      End (BE) PCMs. The FE PCMs are normal ALSA PCM devices except that
      they can dynamically route digital audio data to any supported BE
      PCM. A BE PCM has no ALSA device, but represents a DAI link and it's
      substream and audio HW parameters.
      
      e.g. pcm:0,0 routing digital data to 2 external codecs.
      
      FE pcm:0,0  ----> BE (McBSP.0) ----> CODEC 0
                   +--> BE (McPDM.0) ----> CODEC 1
      
      e.g. pcm:0,0 and pcm:0,1 routing digital data to 1 external codec.
      
      FE pcm:0,0 ---
                   +--> BE (McBSP.0) ----> CODEC
      FE pcm:0,1 ---
      
      The digital audio routing is controlled by the usual ALSA method
      of mixer kcontrols. Dynamic PCM uses a DAPM graph to work out the
      routing based upon the mixer settings and configures the BE PCMs
      based on routing and the FE HW params.
      
      DPCM is designed so that most ASoC component drivers will need no
      modification at all. It's intended that existing CODEC, DAI and
      platform drivers can be used in DPCM based audio devices without
      any changes. However, there will be some cases where minor changes
      are required (e.g. for very tightly coupled HW) and there are
      helpers to support this too.
      
      Somethimes the HW params of a FE and BE do not match or are
      incompatible, so in these cases the machine driver can reconfigure
      any hw_params and make any DSP perform sample rate / format conversion.
      
      This patch adds the core DPCM code and contains :-
      
       o The FE and BE PCM operations.
       o FE and BE DAI link support.
       o FE and BE PCM creation.
       o BE support API.
       o BE and FE link management.
      Signed-off-by: NLiam Girdwood <lrg@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      01d7584c
  20. 24 4月, 2012 2 次提交
  21. 17 4月, 2012 1 次提交
    • M
      ASoC: core: Support transparent CODEC<->CODEC DAI links · c74184ed
      Mark Brown 提交于
      Rather than having the user half start a stream but avoid any DMA to
      trigger data flow on links which don't pass through the CPU create a
      DAPM route between the two DAI widgets using a hw_params configuration
      provided by the machine driver with the new 'params' member of the
      dai_link struct.  If no configuration is provided in the dai_link then
      use the old style even for CODEC<->CODEC links to avoid breaking
      systems.
      
      This greatly simplifies the userspace usage of such links, making them
      as simple as analogue connections with the stream configuration being
      completely transparent to them.
      
      This is achieved by defining a new dai_link widget type which is created
      when CODECs are linked and triggering the configuration of the link via
      the normal PCM operations from there.  It is expected that the bias
      level callbacks will be used for clock configuration.
      
      Currently only the DAI format, rate and channel count can be configured
      and currently the only DAI operations which can be called are hw_params
      and digital_mute().  This corresponds well to the majority of CODEC
      drivers which only use other callbacks for constraint setting but there
      is obviously much room for extension here.  We can't simply call
      hw_params() on startup as things like the system clocking configuration
      may change at runtime and in future it will be desirable to offer some
      configurability of the link parameters.
      
      At present we are also restricted to a single DAPM link for the entire
      DAI.  Once we have better support for channel mapping it would also be
      desirable to extend this feature so that we can propagate per-channel
      power state over the link.
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      Acked-by: NLiam Girdwood <lrg@ti.com>
      c74184ed
  22. 03 4月, 2012 1 次提交
  23. 01 4月, 2012 5 次提交
    • M
      ASoC: core: Use driver core probe deferral · b19e6e7b
      Mark Brown 提交于
      In version 3.4 the driver core acquired probe deferral which is a core way
      of doing essentially the same thing as ASoC has been doing since forever
      to make sure that all the devices needed to make up the card are present
      without needing open coding in the subsystem.
      
      Make basic use of this probe deferral mechanism for the cards, removing the
      need to handle partially instantiated cards. We should be able to remove
      even more code than this, though some of the checks we're currently doing
      should stay since they're about things like suppressing unneeded DAPM runs
      rather than deferring probes.
      
      In order to avoid robustness issues with our teardown paths (which do need
      quite a bit of TLC) add a check for aux_devs prior to attempting to set
      things up, this means that we've got a reasonable idea that everything will
      be there before we start. As with the removal of partial instantiation
      support more work will be needed to make this work neatly.
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      Acked-by: NLiam Girdwood <lrg@ti.com>
      b19e6e7b
    • M
      ASoC: jack: Push locking for jacks down to the jack · 2667b4b8
      Mark Brown 提交于
      Currently operations on jack reporting take the CODEC mutex both to protect
      the current jack status and also to protect the DAPM run which is triggered
      on status updates. Since the addition of a DAPM-specific lock we no longer
      need to worry about locking DAPM as it has its own finer grained lock so
      create a per jack lock to take care of the jack status.
      
      This is both cleaner where the jack isn't specifically associated with a
      CODEC and clearer as it's much more obvious what the lock is protecting.
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      2667b4b8
    • L
      ASoC: core: Rename card mutex subclass to better align with usage · 6874a918
      Liam Girdwood 提交于
      Change SND_SOC_CARD_CLASS_PCM to SND_SOC_CARD_CLASS_RUNTIME to better
      describe all uses for this mutex subclass and align with DAPM too.
      Signed-off-by: NLiam Girdwood <lrg@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      6874a918
    • L
      ASoC: dapm: Use DAPM mutex for DAPM ops instead of codec mutex · a73fb2df
      Liam Girdwood 提交于
      It has now become necessary to use a DAPM mutex instead of the codec
      mutex to lock the DAPM operations. This is due to the recent multi
      component support and forth coming Dynamic PCM updates.
      
      Currently we lock DAPM operations with the codec mutex of the calling
      RTD context. However, DAPM operations can span the whole card context
      and all components.
      
      This patch updates the DAPM operations that use the codec mutex to
      now use the DAPM mutex PCM subclass for all DAPM ops.
      
      We also add a mutex subclass for DAPM init and PCM operations.
      Signed-off-by: NLiam Girdwood <lrg@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      a73fb2df
    • L
      ASoC: core: Add card mutex locking subclasses · 01b9d99a
      Liam Girdwood 提交于
      This is the first part of a change that is intended to improve
      ASoC locking protection for DAPM and PCM operations.
      
      This part of the series adds a mutex class for the soc_card mutex. The
      SND_SOC_CARD_CLASS_INIT class is used for card initialisation only whilst the
      SND_SOC_CARD_CLASS_PCM class is used for the forth coming Dynamic
      PCM operations. The new mutex classes are required otherwise we will see a false
      positive mutex deadlock warning between the card initialisation and the PCM
      operations (something that would never deadlock in real life).
      Signed-off-by: NLiam Girdwood <lrg@ti.com>
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      01b9d99a
  24. 07 3月, 2012 1 次提交
  25. 22 2月, 2012 2 次提交
    • M
      ASoC: core: Add support for masking out parts of coefficient blocks · f831b055
      Mark Brown 提交于
      Chip designers frequently include things like the enable and disable
      controls for algorithms in the register blocks which also hold the
      coefficients. Since it's desirable to split out the enable/disable
      control from userspace the plain SND_SOC_BYTES() isn't optimal for
      these devices.
      
      Add a SND_SOC_BYTES_MASK() which allows a bitmask from the first word
      of the block to be excluded from the control. This supports the needs
      of devices I've looked at and lets us have a reasonably simple API.
      Further controls can be added in future if that's needed.
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      Acked-by: NLiam Girdwood <lrg@ti.com>
      f831b055
    • M
      ASoC: core: Add SND_SOC_BYTES control for coefficient blocks · 71d08516
      Mark Brown 提交于
      Allow devices to export blocks of registers to the application layer,
      intended for use for reading and writing coefficient data which can't
      usefully be worked with by the kernel at runtime (for example, due to
      requiring complex and expensive calculations or being the results of
      callibration procedures). Currently drivers are using platform data to
      provide configurations for coefficient blocks which isn't at all
      convenient for runtime management or configuration development.
      
      Currently only devices using regmap are supported, an error will be
      generated for any attempt to work with a byte control on a non-regmap
      device. There's no fundamental block to other devices so support could
      be added if required.
      Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      Acked-by: NLiam Girdwood <lrg@ti.com>
      71d08516
  26. 18 2月, 2012 1 次提交