aboutsummaryrefslogtreecommitdiff
path: root/SOURCES/ALSA:-usb-audio:-Split-endpoint-setups-for-hw_params-and-prepare.patch
diff options
context:
space:
mode:
Diffstat (limited to 'SOURCES/ALSA:-usb-audio:-Split-endpoint-setups-for-hw_params-and-prepare.patch')
-rw-r--r--SOURCES/ALSA:-usb-audio:-Split-endpoint-setups-for-hw_params-and-prepare.patch200
1 files changed, 0 insertions, 200 deletions
diff --git a/SOURCES/ALSA:-usb-audio:-Split-endpoint-setups-for-hw_params-and-prepare.patch b/SOURCES/ALSA:-usb-audio:-Split-endpoint-setups-for-hw_params-and-prepare.patch
deleted file mode 100644
index d23deb0..0000000
--- a/SOURCES/ALSA:-usb-audio:-Split-endpoint-setups-for-hw_params-and-prepare.patch
+++ /dev/null
@@ -1,200 +0,0 @@
-From 271f862ebc60b3a7ff1563654eb33cd4571c66aa Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Thu, 1 Sep 2022 14:41:36 +0200
-Subject: ALSA: usb-audio: Split endpoint setups for hw_params and prepare
-
-commit ff878b408a03bef5d610b7e2302702e16a53636e upstream.
-
-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.
-
-Fixes: bf6313a0ff76 ("ALSA: usb-audio: Refactor endpoint management")
-Cc: <stable@vger.kernel.org>
-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
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- sound/usb/endpoint.c | 23 +++++++++--------------
- sound/usb/endpoint.h | 6 ++++--
- sound/usb/pcm.c | 14 ++++++++++----
- 3 files changed, 23 insertions(+), 20 deletions(-)
-
-diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
-index f9c921683948d..ff9c7bbbc43fe 100644
---- a/sound/usb/endpoint.c
-+++ b/sound/usb/endpoint.c
-@@ -758,7 +758,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,
-@@ -1290,12 +1291,13 @@ out_of_memory:
- /*
- * 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;
-@@ -1378,18 +1380,18 @@ static int init_sample_rate(struct snd_usb_audio *chip,
- }
-
- /*
-- * 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;
-@@ -1410,9 +1412,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;
- }
-
-@@ -1440,10 +1439,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 6a9af04cf175a..e67ea28faa54f 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 e692ae04436a5..02035b545f9dd 100644
---- a/sound/usb/pcm.c
-+++ b/sound/usb/pcm.c
-@@ -443,17 +443,17 @@ static int configure_endpoints(struct snd_usb_audio *chip,
- if (stop_endpoints(subs, false))
- sync_pending_stops(subs);
- if (subs->sync_endpoint) {
-- err = snd_usb_endpoint_configure(chip, subs->sync_endpoint);
-+ err = snd_usb_endpoint_prepare(chip, subs->sync_endpoint);
- if (err < 0)
- return err;
- }
-- err = snd_usb_endpoint_configure(chip, subs->data_endpoint);
-+ err = snd_usb_endpoint_prepare(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);
-+ err = snd_usb_endpoint_prepare(chip, subs->sync_endpoint);
- if (err < 0)
- return err;
- }
-@@ -551,7 +551,13 @@ 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->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)
---
-cgit
-