1. 03 Oct, 2022 1 commit
  2. 01 Oct, 2022 2 commits
  3. 30 Sep, 2022 4 commits
  4. 29 Sep, 2022 4 commits
  5. 27 Sep, 2022 14 commits
  6. 26 Sep, 2022 2 commits
  7. 23 Sep, 2022 3 commits
  8. 22 Sep, 2022 6 commits
  9. 21 Sep, 2022 2 commits
  10. 20 Sep, 2022 2 commits
    • Takashi Iwai's avatar
      ALSA: usb-audio: Properly refcounting clock rate · 9a737e7f
      Takashi Iwai authored
      We fixed the bug introduced by the patch for managing the shared
      clocks at the commit 809f44a0 ("ALSA: usb-audio: Clear fixed clock
      rate at closing EP"), but it was merely a workaround.  By this change,
      the clock reference rate is cleared at each EP close, hence the still
      remaining EP may need a re-setup of rate unnecessarily.
      
      This patch introduces the proper refcounting for the clock reference
      object so that the clock setup is done only when needed.
      
      Fixes: 809f44a0 ("ALSA: usb-audio: Clear fixed clock rate at closing EP")
      Fixes: c11117b6 ("ALSA: usb-audio: Refcount multiple accesses on the single clock")
      Link: https://lore.kernel.org/r/20220920181126.4912-1-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      9a737e7f
    • Takashi Iwai's avatar
      ALSA: usb-audio: Split endpoint setups for hw_params and prepare (take#2) · 2be79d58
      Takashi Iwai authored
      This is a second attempt to fix the bug appearing on Android with the
      recent kernel; the first try was ff878b40 and reverted at commit
      79764ec7.
      
      The details taken from the v1 patch:
      
      One of the former changes for the endpoint management was the more
      consistent setup of endpoints at hw_params.
      snd_usb_endpoint_configure() is a single function that does the full
      setup, and it's called from both PCM hw_params and prepare callbacks.
      Although the EP setup at the prepare phase is usually skipped (by
      checking need_setup flag), it may be still effective in some cases
      like suspend/resume that requires the interface setup again.
      
      As it's a full and single setup, the invocation of
      snd_usb_endpoint_configure() includes not only the USB interface setup
      but also the buffer release and allocation.  OTOH, doing the buffer
      release and re-allocation at PCM prepare phase is rather superfluous,
      and better to be done only in the hw_params phase.
      
      For those optimizations, this patch splits the endpoint setup to two
      phases: snd_usb_endpoint_set_params() and snd_usb_endpoint_prepare(),
      to be called from hw_params and from prepare, respectively.
      
      Note that this patch changes the driver operation slightly,
      effectively moving the USB interface setup again to PCM prepare stage
      instead of hw_params stage, while the buffer allocation and such
      initializations are still done at hw_params stage.
      
      And, the change of the USB interface setup timing (moving to prepare)
      gave an interesting "fix", too: it was reported that the recent
      kernels caused silent output at the beginning on playbacks on some
      devices on Android, and this change casually fixed the regression.
      It seems that those devices are picky about the sample rate change (or
      the interface change?), and don't follow the too immediate rate
      changes.
      
      Meanwhile, Android operates the PCM in the following order:
      - open, then hw_params with the possibly highest sample rate
      - close without prepare
      - re-open, hw_params with the normal sample rate
      - prepare, and start streaming
      This procedure ended up the hw_params twice with different rates, and
      because the recent kernel did set up the sample rate twice one and
      after, it screwed up the device.  OTOH, the earlier kernels didn't set
      up the USB interface at hw_params, hence this problem didn't appear.
      
      Now, with this patch, the USB interface setup is again back to the
      prepare phase, and it works around the problem automagically.
      Although we should address the sample rate problem in a more solid
      way in future, let's keep things working as before for now.
      
      ***
      
      What's new in the take#2 patch:
      - The regression caused by the v1 patch (bko#216500) was due to the
        missing check of need_setup flag at hw_params.  Now the check is
        added, and the snd_usb_endpoint_set_params() call is skipped when
        the running EP is re-opened.
      
      - There was another bug in v1 where the clock reference rate wasn't
        updated at hw_params phase, which may lead to a lack of the proper
        hw constraints when an application doesn't issue the prepare but
        only the hw_params call.  This patch fixes it as well by tracking
        the clock rate change in the prepare callback with a new flag
        "need_update" for the clock reference object, just like others.
      
      - The configure_endpoints() are simplified and folded back into
        snd_usb_pcm_prepare().
      
      Fixes: bf6313a0 ("ALSA: usb-audio: Refactor endpoint management")
      Fixes: ff878b40 ("ALSA: usb-audio: Split endpoint setups for hw_params and prepare")
      Reported-by: default avatarchihhao chen <chihhao.chen@mediatek.com>
      Link: https://lore.kernel.org/r/87e6d6ae69d68dc588ac9acc8c0f24d6188375c3.camel@mediatek.com
      Link: https://lore.kernel.org/r/20220901124136.4984-1-tiwai@suse.de
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216500
      Link: https://lore.kernel.org/r/20220920181106.4894-1-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      2be79d58