From: Sasha Levin Date: Mon, 17 Oct 2022 09:36:36 +0000 (-0400) Subject: Drop alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch X-Git-Tag: v5.4.219~31^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=14344dab6ffed41c13652eab6ad099d93fe793d8;p=thirdparty%2Fkernel%2Fstable-queue.git Drop alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch Signed-off-by: Sasha Levin --- 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 index 64cf04a78a0..00000000000 --- a/queue-5.19/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch +++ /dev/null @@ -1,345 +0,0 @@ -From 7ece01c95251b46c43f46d36e4344827e849fcd5 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -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 - -[ 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 -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 -Signed-off-by: Sasha Levin ---- - 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 - diff --git a/queue-5.19/series b/queue-5.19/series index 1d6dc92b2f9..cab0c79acca 100644 --- a/queue-5.19/series +++ b/queue-5.19/series @@ -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 index 48a4fb2853f..00000000000 --- a/queue-6.0/alsa-usb-audio-split-endpoint-setups-for-hw_params-a.patch +++ /dev/null @@ -1,345 +0,0 @@ -From e9c127906f179a83ac7127486144883d68e22e17 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -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 - -[ 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 -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 -Signed-off-by: Sasha Levin ---- - 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 - diff --git a/queue-6.0/series b/queue-6.0/series index bb2a3229462..495622b35f6 100644 --- a/queue-6.0/series +++ b/queue-6.0/series @@ -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