]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Drop alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch
authorSasha Levin <sashal@kernel.org>
Mon, 17 Oct 2022 09:36:36 +0000 (05:36 -0400)
committerSasha Levin <sashal@kernel.org>
Mon, 17 Oct 2022 09:40:05 +0000 (05:40 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.19/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch [deleted file]
queue-5.19/series
queue-6.0/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch [deleted file]
queue-6.0/series

diff --git a/queue-5.19/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch b/queue-5.19/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch
deleted file mode 100644 (file)
index 64cf04a..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-From 7ece01c95251b46c43f46d36e4344827e849fcd5 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 20 Sep 2022 20:11:06 +0200
-Subject: ALSA: usb-audio: Split endpoint setups for hw_params and prepare
- (take#2)
-
-From: Takashi Iwai <tiwai@suse.de>
-
-[ Upstream commit 2be79d58645465351af5320eb14c70a94724c5ef ]
-
-This is a second attempt to fix the bug appearing on Android with the
-recent kernel; the first try was ff878b408a03 and reverted at commit
-79764ec772bc.
-
-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: bf6313a0ff76 ("ALSA: usb-audio: Refactor endpoint management")
-Fixes: ff878b408a03 ("ALSA: usb-audio: Split endpoint setups for hw_params and prepare")
-Reported-by: chihhao 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.de
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- sound/usb/endpoint.c | 76 +++++++++++++++++++++++++++-----------------
- sound/usb/endpoint.h |  6 ++--
- sound/usb/pcm.c      | 51 ++++++++++++-----------------
- 3 files changed, 70 insertions(+), 63 deletions(-)
-
-diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
-index 7a7f5ebafe4a..971c33937dca 100644
---- a/sound/usb/endpoint.c
-+++ b/sound/usb/endpoint.c
-@@ -40,6 +40,7 @@ struct snd_usb_clock_ref {
-       unsigned char clock;
-       atomic_t locked;
-       int rate;
-+      bool need_setup;
-       struct list_head list;
- };
-@@ -759,7 +760,8 @@ bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
-  * The endpoint needs to be closed via snd_usb_endpoint_close() later.
-  *
-  * Note that this function doesn't configure the endpoint.  The substream
-- * needs to set it up later via snd_usb_endpoint_configure().
-+ * needs to set it up later via snd_usb_endpoint_set_params() and
-+ * snd_usb_endpoint_prepare().
-  */
- struct snd_usb_endpoint *
- snd_usb_endpoint_open(struct snd_usb_audio *chip,
-@@ -1289,15 +1291,39 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep)
-       return -ENOMEM;
- }
-+/* update the rate of the referred clock; return the actual rate */
-+static int update_clock_ref_rate(struct snd_usb_audio *chip,
-+                               struct snd_usb_endpoint *ep)
-+{
-+      struct snd_usb_clock_ref *clock = ep->clock_ref;
-+      int rate = ep->cur_rate;
-+
-+      if (!clock || clock->rate == rate)
-+              return rate;
-+      if (clock->rate) {
-+              if (atomic_read(&clock->locked))
-+                      return clock->rate;
-+              if (clock->rate != rate) {
-+                      usb_audio_err(chip, "Mismatched sample rate %d vs %d for EP 0x%x\n",
-+                                    clock->rate, rate, ep->ep_num);
-+                      return clock->rate;
-+              }
-+      }
-+      clock->rate = rate;
-+      clock->need_setup = true;
-+      return rate;
-+}
-+
- /*
-  * snd_usb_endpoint_set_params: configure an snd_usb_endpoint
-  *
-+ * It's called either from hw_params callback.
-  * Determine the number of URBs to be used on this endpoint.
-  * An endpoint must be configured before it can be started.
-  * An endpoint that is already running can not be reconfigured.
-  */
--static int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
--                                     struct snd_usb_endpoint *ep)
-+int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
-+                              struct snd_usb_endpoint *ep)
- {
-       const struct audioformat *fmt = ep->cur_audiofmt;
-       int err;
-@@ -1349,49 +1375,46 @@ static int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
-       ep->maxframesize = ep->maxpacksize / ep->cur_frame_bytes;
-       ep->curframesize = ep->curpacksize / ep->cur_frame_bytes;
--      return 0;
-+      return update_clock_ref_rate(chip, ep);
- }
- static int init_sample_rate(struct snd_usb_audio *chip,
-                           struct snd_usb_endpoint *ep)
- {
-       struct snd_usb_clock_ref *clock = ep->clock_ref;
--      int err;
-+      int rate, err;
--      if (clock) {
--              if (atomic_read(&clock->locked))
--                      return 0;
--              if (clock->rate == ep->cur_rate)
--                      return 0;
--              if (clock->rate && clock->rate != ep->cur_rate) {
--                      usb_audio_dbg(chip, "Mismatched sample rate %d vs %d for EP 0x%x\n",
--                                    clock->rate, ep->cur_rate, ep->ep_num);
--                      return -EINVAL;
--              }
--      }
-+      rate = update_clock_ref_rate(chip, ep);
-+      if (rate < 0)
-+              return rate;
-+      if (clock && !clock->need_setup)
-+              return 0;
--      err = snd_usb_init_sample_rate(chip, ep->cur_audiofmt, ep->cur_rate);
--      if (err < 0)
-+      err = snd_usb_init_sample_rate(chip, ep->cur_audiofmt, rate);
-+      if (err < 0) {
-+              if (clock)
-+                      clock->rate = 0; /* reset rate */
-               return err;
-+      }
-       if (clock)
--              clock->rate = ep->cur_rate;
-+              clock->need_setup = false;
-       return 0;
- }
- /*
-- * snd_usb_endpoint_configure: Configure the endpoint
-+ * snd_usb_endpoint_prepare: Prepare the endpoint
-  *
-  * This function sets up the EP to be fully usable state.
-- * It's called either from hw_params or prepare callback.
-+ * It's called either from prepare callback.
-  * The function checks need_setup flag, and performs nothing unless needed,
-  * so it's safe to call this multiple times.
-  *
-  * This returns zero if unchanged, 1 if the configuration has changed,
-  * or a negative error code.
-  */
--int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
--                             struct snd_usb_endpoint *ep)
-+int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
-+                           struct snd_usb_endpoint *ep)
- {
-       bool iface_first;
-       int err = 0;
-@@ -1412,9 +1435,6 @@ int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
-                       if (err < 0)
-                               goto unlock;
-               }
--              err = snd_usb_endpoint_set_params(chip, ep);
--              if (err < 0)
--                      goto unlock;
-               goto done;
-       }
-@@ -1442,10 +1462,6 @@ int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
-       if (err < 0)
-               goto unlock;
--      err = snd_usb_endpoint_set_params(chip, ep);
--      if (err < 0)
--              goto unlock;
--
-       err = snd_usb_select_mode_quirk(chip, ep->cur_audiofmt);
-       if (err < 0)
-               goto unlock;
-diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h
-index 6a9af04cf175..e67ea28faa54 100644
---- a/sound/usb/endpoint.h
-+++ b/sound/usb/endpoint.h
-@@ -17,8 +17,10 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
-                     bool is_sync_ep);
- void snd_usb_endpoint_close(struct snd_usb_audio *chip,
-                           struct snd_usb_endpoint *ep);
--int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
--                             struct snd_usb_endpoint *ep);
-+int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
-+                              struct snd_usb_endpoint *ep);
-+int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
-+                           struct snd_usb_endpoint *ep);
- int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock);
- bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
-diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
-index e692ae04436a..0551d86b379f 100644
---- a/sound/usb/pcm.c
-+++ b/sound/usb/pcm.c
-@@ -433,35 +433,6 @@ static void close_endpoints(struct snd_usb_audio *chip,
-       }
- }
--static int configure_endpoints(struct snd_usb_audio *chip,
--                             struct snd_usb_substream *subs)
--{
--      int err;
--
--      if (subs->data_endpoint->need_setup) {
--              /* stop any running stream beforehand */
--              if (stop_endpoints(subs, false))
--                      sync_pending_stops(subs);
--              if (subs->sync_endpoint) {
--                      err = snd_usb_endpoint_configure(chip, subs->sync_endpoint);
--                      if (err < 0)
--                              return err;
--              }
--              err = snd_usb_endpoint_configure(chip, subs->data_endpoint);
--              if (err < 0)
--                      return err;
--              snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
--      } else {
--              if (subs->sync_endpoint) {
--                      err = snd_usb_endpoint_configure(chip, subs->sync_endpoint);
--                      if (err < 0)
--                              return err;
--              }
--      }
--
--      return 0;
--}
--
- /*
-  * hw_params callback
-  *
-@@ -551,7 +522,16 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
-       subs->cur_audiofmt = fmt;
-       mutex_unlock(&chip->mutex);
--      ret = configure_endpoints(chip, subs);
-+      if (!subs->data_endpoint->need_setup)
-+              goto unlock;
-+
-+      if (subs->sync_endpoint) {
-+              ret = snd_usb_endpoint_set_params(chip, subs->sync_endpoint);
-+              if (ret < 0)
-+                      goto unlock;
-+      }
-+
-+      ret = snd_usb_endpoint_set_params(chip, subs->data_endpoint);
-  unlock:
-       if (ret < 0)
-@@ -634,9 +614,18 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
-               goto unlock;
-       }
--      ret = configure_endpoints(chip, subs);
-+      if (subs->sync_endpoint) {
-+              ret = snd_usb_endpoint_prepare(chip, subs->sync_endpoint);
-+              if (ret < 0)
-+                      goto unlock;
-+      }
-+
-+      ret = snd_usb_endpoint_prepare(chip, subs->data_endpoint);
-       if (ret < 0)
-               goto unlock;
-+      else if (ret > 0)
-+              snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
-+      ret = 0;
-       /* reset the pointer */
-       subs->buffer_bytes = frames_to_bytes(runtime, runtime->buffer_size);
--- 
-2.35.1
-
index 1d6dc92b2f933b7e0fb823ecbf9e4a85ccceede0..cab0c79acca0d2616ea0bb0b2583be4c00b01682 100644 (file)
@@ -339,7 +339,6 @@ asoc-eureka-tlv320-hold-reference-returned-from-of_f.patch
 drm-msm-lookup-the-icc-paths-in-both-mdp5-dpu-and-md.patch
 drm-msm-dpu-index-dpu_kms-hw_vbif-using-vbif_idx.patch
 drm-msm-dp-correct-1.62g-link-rate-at-dp_catalog_ctr.patch
-alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch
 alsa-usb-audio-properly-refcounting-clock-rate.patch
 drm-vmwgfx-fix-memory-leak-in-vmw_mksstat_add_ioctl.patch
 virtio-gpu-fix-shift-wrapping-bug-in-virtio_gpu_fenc.patch
diff --git a/queue-6.0/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch b/queue-6.0/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch
deleted file mode 100644 (file)
index 48a4fb2..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-From e9c127906f179a83ac7127486144883d68e22e17 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 20 Sep 2022 20:11:06 +0200
-Subject: ALSA: usb-audio: Split endpoint setups for hw_params and prepare
- (take#2)
-
-From: Takashi Iwai <tiwai@suse.de>
-
-[ Upstream commit 2be79d58645465351af5320eb14c70a94724c5ef ]
-
-This is a second attempt to fix the bug appearing on Android with the
-recent kernel; the first try was ff878b408a03 and reverted at commit
-79764ec772bc.
-
-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: bf6313a0ff76 ("ALSA: usb-audio: Refactor endpoint management")
-Fixes: ff878b408a03 ("ALSA: usb-audio: Split endpoint setups for hw_params and prepare")
-Reported-by: chihhao 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.de
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- sound/usb/endpoint.c | 76 +++++++++++++++++++++++++++-----------------
- sound/usb/endpoint.h |  6 ++--
- sound/usb/pcm.c      | 51 ++++++++++++-----------------
- 3 files changed, 70 insertions(+), 63 deletions(-)
-
-diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
-index 6d8989482ade..f8a5329fb131 100644
---- a/sound/usb/endpoint.c
-+++ b/sound/usb/endpoint.c
-@@ -40,6 +40,7 @@ struct snd_usb_clock_ref {
-       unsigned char clock;
-       atomic_t locked;
-       int rate;
-+      bool need_setup;
-       struct list_head list;
- };
-@@ -759,7 +760,8 @@ bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
-  * The endpoint needs to be closed via snd_usb_endpoint_close() later.
-  *
-  * Note that this function doesn't configure the endpoint.  The substream
-- * needs to set it up later via snd_usb_endpoint_configure().
-+ * needs to set it up later via snd_usb_endpoint_set_params() and
-+ * snd_usb_endpoint_prepare().
-  */
- struct snd_usb_endpoint *
- snd_usb_endpoint_open(struct snd_usb_audio *chip,
-@@ -1289,15 +1291,39 @@ static int sync_ep_set_params(struct snd_usb_endpoint *ep)
-       return -ENOMEM;
- }
-+/* update the rate of the referred clock; return the actual rate */
-+static int update_clock_ref_rate(struct snd_usb_audio *chip,
-+                               struct snd_usb_endpoint *ep)
-+{
-+      struct snd_usb_clock_ref *clock = ep->clock_ref;
-+      int rate = ep->cur_rate;
-+
-+      if (!clock || clock->rate == rate)
-+              return rate;
-+      if (clock->rate) {
-+              if (atomic_read(&clock->locked))
-+                      return clock->rate;
-+              if (clock->rate != rate) {
-+                      usb_audio_err(chip, "Mismatched sample rate %d vs %d for EP 0x%x\n",
-+                                    clock->rate, rate, ep->ep_num);
-+                      return clock->rate;
-+              }
-+      }
-+      clock->rate = rate;
-+      clock->need_setup = true;
-+      return rate;
-+}
-+
- /*
-  * snd_usb_endpoint_set_params: configure an snd_usb_endpoint
-  *
-+ * It's called either from hw_params callback.
-  * Determine the number of URBs to be used on this endpoint.
-  * An endpoint must be configured before it can be started.
-  * An endpoint that is already running can not be reconfigured.
-  */
--static int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
--                                     struct snd_usb_endpoint *ep)
-+int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
-+                              struct snd_usb_endpoint *ep)
- {
-       const struct audioformat *fmt = ep->cur_audiofmt;
-       int err;
-@@ -1349,49 +1375,46 @@ static int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
-       ep->maxframesize = ep->maxpacksize / ep->cur_frame_bytes;
-       ep->curframesize = ep->curpacksize / ep->cur_frame_bytes;
--      return 0;
-+      return update_clock_ref_rate(chip, ep);
- }
- static int init_sample_rate(struct snd_usb_audio *chip,
-                           struct snd_usb_endpoint *ep)
- {
-       struct snd_usb_clock_ref *clock = ep->clock_ref;
--      int err;
-+      int rate, err;
--      if (clock) {
--              if (atomic_read(&clock->locked))
--                      return 0;
--              if (clock->rate == ep->cur_rate)
--                      return 0;
--              if (clock->rate && clock->rate != ep->cur_rate) {
--                      usb_audio_dbg(chip, "Mismatched sample rate %d vs %d for EP 0x%x\n",
--                                    clock->rate, ep->cur_rate, ep->ep_num);
--                      return -EINVAL;
--              }
--      }
-+      rate = update_clock_ref_rate(chip, ep);
-+      if (rate < 0)
-+              return rate;
-+      if (clock && !clock->need_setup)
-+              return 0;
--      err = snd_usb_init_sample_rate(chip, ep->cur_audiofmt, ep->cur_rate);
--      if (err < 0)
-+      err = snd_usb_init_sample_rate(chip, ep->cur_audiofmt, rate);
-+      if (err < 0) {
-+              if (clock)
-+                      clock->rate = 0; /* reset rate */
-               return err;
-+      }
-       if (clock)
--              clock->rate = ep->cur_rate;
-+              clock->need_setup = false;
-       return 0;
- }
- /*
-- * snd_usb_endpoint_configure: Configure the endpoint
-+ * snd_usb_endpoint_prepare: Prepare the endpoint
-  *
-  * This function sets up the EP to be fully usable state.
-- * It's called either from hw_params or prepare callback.
-+ * It's called either from prepare callback.
-  * The function checks need_setup flag, and performs nothing unless needed,
-  * so it's safe to call this multiple times.
-  *
-  * This returns zero if unchanged, 1 if the configuration has changed,
-  * or a negative error code.
-  */
--int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
--                             struct snd_usb_endpoint *ep)
-+int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
-+                           struct snd_usb_endpoint *ep)
- {
-       bool iface_first;
-       int err = 0;
-@@ -1412,9 +1435,6 @@ int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
-                       if (err < 0)
-                               goto unlock;
-               }
--              err = snd_usb_endpoint_set_params(chip, ep);
--              if (err < 0)
--                      goto unlock;
-               goto done;
-       }
-@@ -1442,10 +1462,6 @@ int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
-       if (err < 0)
-               goto unlock;
--      err = snd_usb_endpoint_set_params(chip, ep);
--      if (err < 0)
--              goto unlock;
--
-       err = snd_usb_select_mode_quirk(chip, ep->cur_audiofmt);
-       if (err < 0)
-               goto unlock;
-diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h
-index 6a9af04cf175..e67ea28faa54 100644
---- a/sound/usb/endpoint.h
-+++ b/sound/usb/endpoint.h
-@@ -17,8 +17,10 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
-                     bool is_sync_ep);
- void snd_usb_endpoint_close(struct snd_usb_audio *chip,
-                           struct snd_usb_endpoint *ep);
--int snd_usb_endpoint_configure(struct snd_usb_audio *chip,
--                             struct snd_usb_endpoint *ep);
-+int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
-+                              struct snd_usb_endpoint *ep);
-+int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
-+                           struct snd_usb_endpoint *ep);
- int snd_usb_endpoint_get_clock_rate(struct snd_usb_audio *chip, int clock);
- bool snd_usb_endpoint_compatible(struct snd_usb_audio *chip,
-diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
-index d45d1d7e6664..e721fc12acde 100644
---- a/sound/usb/pcm.c
-+++ b/sound/usb/pcm.c
-@@ -433,35 +433,6 @@ static void close_endpoints(struct snd_usb_audio *chip,
-       }
- }
--static int configure_endpoints(struct snd_usb_audio *chip,
--                             struct snd_usb_substream *subs)
--{
--      int err;
--
--      if (subs->data_endpoint->need_setup) {
--              /* stop any running stream beforehand */
--              if (stop_endpoints(subs, false))
--                      sync_pending_stops(subs);
--              if (subs->sync_endpoint) {
--                      err = snd_usb_endpoint_configure(chip, subs->sync_endpoint);
--                      if (err < 0)
--                              return err;
--              }
--              err = snd_usb_endpoint_configure(chip, subs->data_endpoint);
--              if (err < 0)
--                      return err;
--              snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
--      } else {
--              if (subs->sync_endpoint) {
--                      err = snd_usb_endpoint_configure(chip, subs->sync_endpoint);
--                      if (err < 0)
--                              return err;
--              }
--      }
--
--      return 0;
--}
--
- /*
-  * hw_params callback
-  *
-@@ -551,7 +522,16 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
-       subs->cur_audiofmt = fmt;
-       mutex_unlock(&chip->mutex);
--      ret = configure_endpoints(chip, subs);
-+      if (!subs->data_endpoint->need_setup)
-+              goto unlock;
-+
-+      if (subs->sync_endpoint) {
-+              ret = snd_usb_endpoint_set_params(chip, subs->sync_endpoint);
-+              if (ret < 0)
-+                      goto unlock;
-+      }
-+
-+      ret = snd_usb_endpoint_set_params(chip, subs->data_endpoint);
-  unlock:
-       if (ret < 0)
-@@ -634,9 +614,18 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
-               goto unlock;
-       }
--      ret = configure_endpoints(chip, subs);
-+      if (subs->sync_endpoint) {
-+              ret = snd_usb_endpoint_prepare(chip, subs->sync_endpoint);
-+              if (ret < 0)
-+                      goto unlock;
-+      }
-+
-+      ret = snd_usb_endpoint_prepare(chip, subs->data_endpoint);
-       if (ret < 0)
-               goto unlock;
-+      else if (ret > 0)
-+              snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
-+      ret = 0;
-       /* reset the pointer */
-       subs->buffer_bytes = frames_to_bytes(runtime, runtime->buffer_size);
--- 
-2.35.1
-
index bb2a322946212a887072323278fbb290cbacf898..495622b35f6a24cab3ca247668bc9146408dce09 100644 (file)
@@ -404,7 +404,6 @@ drm-msm-dpu-index-dpu_kms-hw_vbif-using-vbif_idx.patch
 drm-msm-dp-correct-1.62g-link-rate-at-dp_catalog_ctr.patch
 alsa-hda-hdmi-change-type-for-the-assigned-variable.patch
 alsa-hda-hdmi-fix-the-converter-allocation-for-the-s.patch
-alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch
 alsa-usb-audio-properly-refcounting-clock-rate.patch
 asoc-sof-ipc4-topology-free-the-ida-when-ipc-fails-i.patch
 drm-vmwgfx-fix-memory-leak-in-vmw_mksstat_add_ioctl.patch