An error occurred fetching the project authors.
  1. 20 Sep, 2017 2 commits
  2. 20 Jan, 2017 1 commit
  3. 17 Jan, 2017 1 commit
    • Linus Walleij's avatar
      ASoC: dapm: handle probe deferrals · 37e1df8c
      Linus Walleij authored
      This starts to handle probe deferrals on regulators and clocks
      on the ASoC DAPM.
      
      I came to this patch after audio stopped working on Ux500 ages
      ago and I finally looked into it to see what is wrong. I had
      messages like this in the console since a while back:
      
      ab8500-codec.0: ASoC: Failed to request audioclk: -517
      ab8500-codec.0: ASoC: Failed to create DAPM control audioclk
      ab8500-codec.0: Failed to create new controls -12
      snd-soc-mop500.0: ASoC: failed to instantiate card -12
      snd-soc-mop500.0: Error: snd_soc_register_card failed (-12)!
      snd-soc-mop500: probe of snd-soc-mop500.0 failed with error -12
      
      Apparently because the widget table for the codec looks like
      this (sound/soc/codecs/ab8500-codec.c):
      
      static const struct snd_soc_dapm_widget ab8500_dapm_widgets[] = {
      
              /* Clocks */
              SND_SOC_DAPM_CLOCK_SUPPLY("audioclk"),
      
              /* Regulators */
              SND_SOC_DAPM_REGULATOR_SUPPLY("V-AUD", 0, 0),
              SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC1", 0, 0),
              SND_SOC_DAPM_REGULATOR_SUPPLY("V-AMIC2", 0, 0),
              SND_SOC_DAPM_REGULATOR_SUPPLY("V-DMIC", 0, 0),
      
      So when we call snd_soc_register_codec() and any of these widgets
      get a deferred probe we do not get an -EPROBE_DEFER (-517) back as
      we should and instead we just fail. Apparently the code assumes
      that clocks and regulators must be available at this point and
      not defer.
      
      After this patch it rather looks like this:
      
      ab8500-codec.0: Failed to create new controls -517
      snd-soc-mop500.0: ASoC: failed to instantiate card -517
      snd-soc-mop500.0: Error: snd_soc_register_card failed (-517)!
      (...)
      abx500-clk.0: registered clocks for ab850x
      snd-soc-mop500.0: ab8500-codec-dai.0 <-> ux500-msp-i2s.1 mapping ok
      snd-soc-mop500.0: ab8500-codec-dai.1 <-> ux500-msp-i2s.3 mapping ok
      
      I'm pretty happy about the patch as it it, but I'm a bit
      uncertain on how to proceed: there are a lot of users of the
      external functions snd_soc_dapm_new_control() (111 sites)
      and that will now return an occassional error pointer, which
      is not handled in the calling sites.
      
      I want an indication from the maintainers whether I should just
      go in and augment all these call sites, or if deferred probe
      is frowned upon when it leads to this much overhead.
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      37e1df8c
  4. 02 Nov, 2016 2 commits
    • Chen-Yu Tsai's avatar
      ASoC: dapm: Implement stereo mixer control support · e7aa450f
      Chen-Yu Tsai authored
      While DAPM is mono or single channel, its controls can be shared between
      widgets, such as sharing one stereo mixer control between the left and
      right channel widgets. An example such as the following routes
      
          [Line In Left]----------<Line In Playback Switch>-------[Left Mixer]
                                                ^
                ^           ^                   |                      ^
             (inputs)    (paths)   <shared stereo mixer control>   (outputs)
                v           v                   |                      v
                                                v
          [Line In Right]---------<Line In Playback Switch>-------[Right Mixer]
      
      where we have separate widgets and paths for the left and right channels
      from "Line In" to "Mixer", but a shared stereo mixer control for the
      2 paths.
      
      This patch introduces support for such shared mixer controls, allowing
      more than 1 path to be attached to a single stereo control, and being
      able to control left/right channels independently.
      Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      e7aa450f
    • Chen-Yu Tsai's avatar
      ASoC: dapm: Support second register for DAPM control updates · e411b0b5
      Chen-Yu Tsai authored
      To support double channel shared controls split across 2 registers, one
      for each channel, we must be able to update both registers together.
      
      Add a second set of register fields to struct snd_soc_dapm_update, and
      update the DAPM control writeback (put) callbacks to support this.
      
      For codecs that use custom events which call into DAPM to do updates,
      also clear struct snd_soc_dapm_update before using it, so the second
      set of fields remains clean.
      Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      e411b0b5
  5. 01 Sep, 2016 3 commits
  6. 16 Aug, 2016 1 commit
  7. 27 Jul, 2016 1 commit
    • Nicolin Chen's avatar
      ASoC: dapm: Add a dummy snd_pcm_runtime to avoid NULL pointer access · 8053f216
      Nicolin Chen authored
      The SND_SOC_DAPM_PRE_PMU case would call startup()/hw_params() that
      might access substream->runtime through other functions.
      
      For example:
      
      Unable to handle kernel NULL pointer dereference at virtual address
      [....]
      PC is at snd_pcm_hw_rule_add+0x24/0x1b0
      LR is at snd_pcm_hw_constraint_list+0x20/0x28
      [....]
      Process arecord (pid: 424, stack limit = 0xffffffc1ecaf0020)
      Call trace:
      [<ffffffc00086be68>] snd_pcm_hw_rule_add+0x24/0x1b0
      [<ffffffc00086c014>] snd_pcm_hw_constraint_list+0x20/0x28
      [<ffffffc0008b47a4>] cs53l30_pcm_startup+0x24/0x30
      [<ffffffc0008a6260>] snd_soc_dai_link_event+0x290/0x354
      [<ffffffc0008a7528>] dapm_seq_check_event.isra.31+0x134/0x2c8
      [<ffffffc0008a7768>] dapm_seq_run_coalesced+0x94/0x1c8
      [<ffffffc0008a7940>] dapm_seq_run+0xa4/0x404
      [<ffffffc0008a8bac>] dapm_power_widgets+0x524/0x984
      [<ffffffc0008ab1c4>] snd_soc_dapm_stream_event+0x8c/0xa8
      [<ffffffc0008ac7f4>] soc_pcm_prepare+0x10c/0x1ec
      [<ffffffc000865b9c>] snd_pcm_do_prepare+0x1c/0x38
      [<ffffffc000865600>] snd_pcm_action_single+0x40/0x88
      [<ffffffc0008656b8>] snd_pcm_action_nonatomic+0x70/0x90
      [<ffffffc000868d28>] snd_pcm_common_ioctl1+0xb6c/0xdd8
      [<ffffffc000869508>] snd_pcm_capture_ioctl1+0x200/0x334
      [<ffffffc00086a084>] snd_pcm_ioctl_compat+0x648/0x95c
      [<ffffffc0001ff4b4>] compat_SyS_ioctl+0xac/0xfc4
      [<ffffffc000084cf0>] el0_svc_naked+0x24/0x28
      ---[ end trace 0dc4f99c2759c35c ]---
      
      So this patch adds a dummy runtime for the original dummy substream
      to merely avoid the NULL pointer access.
      Signed-off-by: default avatarNicolin Chen <nicoleotsuka@gmail.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      8053f216
  8. 05 Jul, 2016 1 commit
  9. 15 Jun, 2016 1 commit
  10. 30 May, 2016 1 commit
    • Piotr Stankiewicz's avatar
      ASoC: dapm: support user-defined stop condition in dai_get_connected_widgets · 6742064a
      Piotr Stankiewicz authored
      Certain situations may warrant examining DAPM paths only to a certain
      arbitrary point, as opposed to always following them to the end. For
      instance, when establishing a connection between a front-end DAI link
      and a back-end DAI link in a DPCM path, it does not make sense to walk
      the DAPM graph beyond the first widget associated with a back-end link.
      
      This patch introduces a mechanism which lets a user of
      dai_get_connected_widgets supply a function which will be called for
      every node during the graph walk. When invoked, this function can
      execute arbitrary logic to decide whether the walk, given a DAPM widget
      and walk direction, should be terminated at that point or continued
      as normal.
      Signed-off-by: default avatarPiotr Stankiewicz <piotrs@opensource.wolfsonmicro.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      6742064a
  11. 18 Mar, 2016 1 commit
  12. 05 Mar, 2016 1 commit
  13. 01 Mar, 2016 1 commit
  14. 04 Feb, 2016 1 commit
  15. 02 Dec, 2015 1 commit
    • Charles Keepax's avatar
      ASoC: dapm: Make enable/disable_pin work with always on widgets · 20bb0184
      Charles Keepax authored
      Always on widgets currently have some odd interactions with DAPM.
      Enabling/disabling a widget (snd_soc_dapm_enable_pin) then connecting
      it to a path works as expected, ie. when the widget is disabled the
      path doesn't power up and it does when the widget is enabled. However
      once in a path enabling the widget does not cause anything to power
      up, dapm_widget_set_power will return the current power state of the
      widget as 1, meaning we never check peer power states.
      
      This patch updates dapm_always_on_check_power to return w->connected
      such that it is effected by snd_soc_dapm_enable_pin and the like.
      Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      20bb0184
  16. 25 Nov, 2015 1 commit
  17. 18 Nov, 2015 1 commit
    • Mengdong Lin's avatar
      ASoC: Change the PCM runtime array to a list · 1a497983
      Mengdong Lin authored
      Currently the number of DAI links is statically defined by the machine
      driver at build time using an array. This makes it difficult to shrink/
      grow the number of DAI links at runtime in order to reflect any changes
      in topology.
      
      We can change the DAI link array in the core to a list so that PCMs and
      FE DAI links can be added and deleted at runtime to reflect changes in
      use case and DSP topology. The machine driver can still register DAI links
      as an array.
      
      As the 1st step, this patch change the PCM runtime array to a list. A new
      PCM runtime is added to the list when a DAI link is bound successfully.
      
      Later patches will further implement the DAI link list.
      
      More:
      - define snd_soc_new/free_pcm_runtime() to create/free a runtime.
      - define soc_add_pcm_runtime() to add a runtime to the rtd list.
      - define soc_remove_pcm_runtimes() to clean up the runtime list.
      
      - traverse the rtd list to probe the link components and dais.
      
      - Add a field "num" to PCM runtime struct, used to specify the device
        number when creating the pcm device, and for a soc card to access
        its dai_props array.
      
      - The following 3rd party machine/platform drivers iterate the rtd list
        to check the runtimes:
        sound/soc/intel/atom/sst-mfld-platform-pcm.c
        sound/soc/intel/boards/cht_bsw_rt5645.c
        sound/soc/intel/boards/cht_bsw_rt5672.c
        sound/soc/intel/boards/cht_bsw_max98090_ti.c
      Signed-off-by: default avatarMengdong Lin <mengdong.lin@linux.intel.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      1a497983
  18. 10 Nov, 2015 1 commit
  19. 22 Oct, 2015 3 commits
  20. 11 Sep, 2015 1 commit
  21. 28 Aug, 2015 1 commit
  22. 13 Aug, 2015 3 commits
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Consolidate path trace events · 6e588a0d
      Lars-Peter Clausen authored
      The snd_soc_dapm_input_path and snd_soc_dapm_output_path trace events are
      identical except for the direction. Instead of having two events have a
      single one that has a field that contains the direction.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      6e588a0d
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Consolidate input and output path handling · a3423b02
      Lars-Peter Clausen authored
      After the recent cleanups and generalizations of the DAPM algorithm the
      handling of input and output paths is now fully symmetric. This means by
      making some slight changes to the data structure and using arrays with one
      entry for each direction, rather than separate fields, it is possible to
      create a generic implementation that is capable of handling both input and
      output paths.
      
      Unfortunately this generalization significantly increases the code size on
      the hot path of is_connected_{input,output}_ep() and
      dapm_widget_invalidate_{input,output}_paths(), which has a negative impact
      on the overall performance. The inner loops of those functions are quite
      small and the generic implementation adds extra pointer arithmetic in a few
      places.
      
      Testing on ARM shows that the combined code size of the specialized
      functions is about 50% larger than the generalized function in relative
      numbers. But in absolute numbers its less than 200 bytes, which is still
      quite small. On the other hand the generalized function increases the
      execution time of dapm_power_one_widget() by 30%. Given that this function
      is one of the most often called functions of the DAPM framework the
      trade-off of getting better performance at expense of generating slightly
      larger code at seems to be worth it.
      
      To avoid this still keep two versions of these functions around, one for
      input and one for output. But have a generic implementation of the
      algorithm which gets inlined by those two versions. And then let the
      compiler take care of optimizing it and removing he extra instructions.
      
      This still reduces the source code size as well as the makes making changes
      to the implementation more straight forward since the same change does no
      longer need to be done in two separate places. Also on the slow paths we
      can use a generic implementations that handle both input and output paths.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      a3423b02
    • Lars-Peter Clausen's avatar
      ASoC: dapm: dapm_dai_get_connected_widgets: Fix missing mutex unlock · 30abbe77
      Lars-Peter Clausen authored
      Make sure to unlock the DAPM mutex when dapm_widget_list_create() fails.
      
      This means the function will now generate a trace_snd_soc_dapm_connected
      event, even if the creation of the list fails. But that was the behavior
      before the patch that introduced the unlock issue, so that should be fine.
      
      Fixes: 1ce43acf ("ASoC: dapm: Simplify list creation in dapm_dai_get_connected_widgets()")
      Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      30abbe77
  23. 29 Jul, 2015 3 commits
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Add widget path iterators · e63bfd45
      Lars-Peter Clausen authored
      Add helper iterator macros for iterating over the source and sink paths of
      widget. This will make it easier to change the implementation later on.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      e63bfd45
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Simplify list creation in dapm_dai_get_connected_widgets() · 1ce43acf
      Lars-Peter Clausen authored
      When running dapm_dai_get_connected_widgets() currently in
      is_connected_{input,output}_ep() for each widget that gets added the array
      is resized and the code also loops over all existing entries to avoid
      adding a widget multiple times.
      
      The former can be avoided by collecting the widgets in a linked list and
      only once we have all widgets allocate the array.
      
      The later can be avoided by changing when the widget is added. Currently it
      is added when walking the neighbor lists of a widget. Since a widget can be
      neighbors with multiple other widgets it could get added twice and hence
      the check is necessary. But the main body of is_connected_{input,output}_ep
      is guaranteed to be only executed at most once per widget. So adding the
      widget to the list at the beginning of the function automatically makes
      sure that each widget gets only added once. The only difference is that
      using this method the starting point itself will also end up on the list,
      but it can easily be skipped when creating the array.
      
      Overall this reduces the code size and speeds things slightly up.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      1ce43acf
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Drop always true checks · 787126eb
      Lars-Peter Clausen authored
      list_first_entry() always returns non NULL and since the code previously
      checked that list is not empty it will also be a valid pointer. Furthermore
      a path has always a sink or a source widget. So both checks are redundant
      and can be removed.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      787126eb
  24. 21 Jul, 2015 3 commits
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Avoid duplicating immutable strings · 48068961
      Lars-Peter Clausen authored
      When creating a new widget from a template the name string of the template
      is duplicated for the newly created widget. This is necessary because in
      some cases the string might be stored on the stack or other volatile
      memory locations.
      
      But most of the time the string is static const data, which means it is
      possible to use it directly without having to worry that it might get freed
      or changed.
      
      Use kstrdup_const() to handle duplicating the string. This function is
      capable of detecting whether a string is immutable and if it is returns the
      input without duplicating it. This will slightly reduce the runtime memory
      footprint of DAPM and also speed up initialization.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      48068961
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Add helper function to free a widget · b97e2698
      Lars-Peter Clausen authored
      snd_soc_tplg_widget_remove_all() has a verbatim copy of an older version of
      the widget freeing code from dapm_free_widgets(). Add a new helper function
      that takes care of freeing a widget and use it in both places.
      
      This removes the duplicated code and also makes sure that future changes to
      the widget freeing code only have to be made in one location.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      b97e2698
    • Lars-Peter Clausen's avatar
      ASoC: dapm: Don't add prefix to widget stream name · a798c24a
      Lars-Peter Clausen authored
      Commit fdb6eb0a ("ASoC: dapm: Modify widget stream name according to
      prefix") fixed the case where a DAPM route between a DAI widget and a
      DAC/ADC/AIF widget with a matching stream name was not created when the
      DAPM context was using a prefix.
      
      Unfortunately the patch introduced a few issues on its own like leaking the
      dynamically allocated stream name memory and also not checking whether the
      allocation succeeded in the first place.
      
      It is also incomplete in that it still does not handle the case where
      stream name of the widget is a substring of the stream name of the DAI,
      which is explicitly allowed and works fine if no DAPM prefix is used.
      
      Revert the commit and take a slightly different approach to solving the
      issue. Instead of comparing the widget's stream name to the name of the DAI
      widget compare it to the stream name of the DAI widget. The stream name of
      the DAI widget is identical to the name of the DAI widget except that it
      wont have the DAPM prefix added. So this approach behaves identical
      regardless to whether the DAPM context uses a prefix or not.
      
      We don't have to worry about potentially matching with a widget with the
      same stream name, but from a different DAPM context with a different
      prefix, since the code already makes sure that both the DAI widget and the
      matched widget are from the same DAPM context.
      
      Fixes: fdb6eb0a ("ASoC: dapm: Modify widget stream name according to prefix")
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Cc: stable@vger.kernel.org
      a798c24a
  25. 08 Jul, 2015 1 commit
  26. 07 Jul, 2015 2 commits
    • Shengjiu Wang's avatar
      ASoC: core: Don't probe the component which is dummy · 6e78108b
      Shengjiu Wang authored
      Dummy dai can be used by multiple sound card. But it only belong to one
      card's dapm list. If another card use it, there will be dapm_assert_locked
      warning.
      
      [   20.015782] WARNING: CPU: 1 PID: 661 at sound/soc/soc-dapm.c:124 dapm_assert_locked.isra.36+0x4c/0x58()
      [   20.025249] Modules linked in:
      [   20.028349] CPU: 1 PID: 661 Comm: aplay Not tainted 4.1.0-rc6-next-20150605-00004-gaee05d8-dirty #92
      [   20.037528] Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
      [   20.044110] Backtrace:
      [   20.046614] [<80012e00>] (dump_backtrace) from [<80012fa0>] (show_stack+0x18/0x1c)
      [   20.054229]  r6:809e8060 r5:00000000 r4:00000000 r3:00000000
      [   20.060002] [<80012f88>] (show_stack) from [<807a0f74>] (dump_stack+0x80/0x9c)
      [   20.067293] [<807a0ef4>] (dump_stack) from [<8002b144>] (warn_slowpath_common+0x7c/0xb4)
      [   20.075427]  r5:0000007c r4:00000000
      [   20.079065] [<8002b0c8>] (warn_slowpath_common) from [<8002b1a0>] (warn_slowpath_null+0x24/0x2c)
      [   20.087898]  r8:00000001 r7:88007c28 r6:ed94a680 r5:809e83e4 r4:ed83d6c0
      [   20.094747] [<8002b17c>] (warn_slowpath_null) from [<8058403c>] (dapm_assert_locked.isra.36+0x4c/0x58)
      [   20.104101] [<80583ff0>] (dapm_assert_locked.isra.36) from [<805842ec>] (dapm_mark_dirty+0x64/0xa4)
      [   20.113165] [<80584288>] (dapm_mark_dirty) from [<805853a8>] (soc_dapm_dai_stream_event.isra.42+0x30/0xc8)
      [   20.122863]  r8:ed9b5dbc r7:00000000 r6:00000001 r5:00000001 r4:ed83d6c0
      [   20.129706] [<80585378>] (soc_dapm_dai_stream_event.isra.42) from [<80587e28>] (snd_soc_dapm_stream_event+0x78/0xa0)
      [   20.140264]  r5:ee2ee62c r4:00000001
      [   20.143918] [<80587db0>] (snd_soc_dapm_stream_event) from [<8058957c>] (soc_pcm_prepare+0x138/0x21c)
      [   20.153058]  r8:ed8d9480 r7:00000000 r6:ed9b0e00 r5:00000001 r4:ee2ee62c r3:00000000
      ...
      
      This patch is to not probe the dummy component in soc_probe_component. Then
      there is no widget created for dummy DAI, and also don't need to check the
      dummy dai in dapm_connect_dai_link_widgets().
      Signed-off-by: default avatarShengjiu Wang <shengjiu.wang@freescale.com>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      6e78108b
    • Lars-Peter Clausen's avatar
      ASoC: dapm_widget_show_codec: Use component instead of CODEC · b3c25fb7
      Lars-Peter Clausen authored
      There is nothing snd_soc_codec specific in this function, just use
      snd_soc_component instead.
      
      With this also the last reference of snd_soc_codec form soc-dapm.c.
      Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      b3c25fb7
  27. 06 Jul, 2015 1 commit