Thanks, Dr. Iwai! I haven't tested the finalized patch yet, but I'll give it a shot on top of 5.12-rc7. Should be OK, nevertheless thorough testing is always a good idea. Regards, Geraldo Em Ter, 13 de abr de 2021 05:41, Takashi Iwai <tiwai@xxxxxxx> escreveu: > In the current code, we have some assumption that the audio clock > selector has been set up implicitly and don't want to touch it unless > it's really needed for the fallback autoclock setup. This works for > most devices but some seem having a problem. Partially this was > covered for the devices with a single connector at the initialization > phase (commit 086b957cc17f "ALSA: usb-audio: Skip the clock selector > inquiry for single connections"), but also there are cases where the > wrong clock set up is kept silently. The latter seems to be the cause > of the noises on Behringer devices. > > In this patch, we explicitly set up the audio clock selector whenever > the appropriate node is found. > > Reported-by: Geraldo Nascimento <geraldogabriel@xxxxxxxxx> > BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=199327 > Link: > https://lore.kernel.org/r/CAEsQvcvF7LnO8PxyyCxuRCx=7jNeSCvFAd-+dE0g_rd1rOxxdw@xxxxxxxxxxxxxx > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Takashi Iwai <tiwai@xxxxxxx> > --- > sound/usb/clock.c | 18 ++++++++++++++---- > 1 file changed, 14 insertions(+), 4 deletions(-) > > diff --git a/sound/usb/clock.c b/sound/usb/clock.c > index a746802d0ac3..17bbde73d4d1 100644 > --- a/sound/usb/clock.c > +++ b/sound/usb/clock.c > @@ -296,7 +296,7 @@ static int __uac_clock_find_source(struct > snd_usb_audio *chip, > > selector = snd_usb_find_clock_selector(chip->ctrl_intf, entity_id); > if (selector) { > - int ret, i, cur; > + int ret, i, cur, err; > > if (selector->bNrInPins == 1) { > ret = 1; > @@ -324,13 +324,17 @@ static int __uac_clock_find_source(struct > snd_usb_audio *chip, > ret = __uac_clock_find_source(chip, fmt, > selector->baCSourceID[ret - > 1], > visited, validate); > + if (ret > 0) { > + err = uac_clock_selector_set_val(chip, entity_id, > cur); > + if (err < 0) > + return err; > + } > + > if (!validate || ret > 0 || !chip->autoclock) > return ret; > > /* The current clock source is invalid, try others. */ > for (i = 1; i <= selector->bNrInPins; i++) { > - int err; > - > if (i == cur) > continue; > > @@ -396,7 +400,7 @@ static int __uac3_clock_find_source(struct > snd_usb_audio *chip, > > selector = snd_usb_find_clock_selector_v3(chip->ctrl_intf, > entity_id); > if (selector) { > - int ret, i, cur; > + int ret, i, cur, err; > > /* the entity ID we are looking for is a selector. > * find out what it currently selects */ > @@ -418,6 +422,12 @@ static int __uac3_clock_find_source(struct > snd_usb_audio *chip, > ret = __uac3_clock_find_source(chip, fmt, > selector->baCSourceID[ret - > 1], > visited, validate); > + if (ret > 0) { > + err = uac_clock_selector_set_val(chip, entity_id, > cur); > + if (err < 0) > + return err; > + } > + > if (!validate || ret > 0 || !chip->autoclock) > return ret; > > -- > 2.26.2 > >