diff options
author | Jan200101 <sentrycraft123@gmail.com> | 2022-10-06 23:02:35 +0200 |
---|---|---|
committer | Jan200101 <sentrycraft123@gmail.com> | 2022-10-06 23:02:35 +0200 |
commit | 6cc93e0191281aa5241c81edea40a7ef8cf4ca4d (patch) | |
tree | 84f2fa22f5cf2c264c6fba9e15721066dfc0b2dd /SOURCES/ALSA:-usb-audio:-Split-endpoint-setups-for-hw_params-and-prepare.patch | |
parent | 1f205a7894e0fd5cebfc54fef0f61160b085e8e7 (diff) | |
download | kernel-fsync-6cc93e0191281aa5241c81edea40a7ef8cf4ca4d.tar.gz kernel-fsync-6cc93e0191281aa5241c81edea40a7ef8cf4ca4d.zip |
kernel 5.19.14
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.patch | 200 |
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 - |