ALSA: usb-audio: Skip setting clock selector for single connections
authorAlexander Tsoy <alexander@tsoy.me>
Tue, 23 Jan 2024 13:46:35 +0000 (16:46 +0300)
committerTakashi Iwai <tiwai@suse.de>
Tue, 23 Jan 2024 14:10:25 +0000 (15:10 +0100)
Since commit 086b957cc17f5 ("ALSA: usb-audio: Skip the clock selector
inquiry for single connections") we are already skipping clock selector
inquiry if only one clock source is connected, but we are still sending
a set request. Lets skip that too.

This should fix errors when setting a sample rate on devices that don't
have any controls present within the clock selector. An example of such
device is the new revision of MOTU M Series (07fd:000b):

      AudioControl Interface Descriptor:
        bLength                 8
        bDescriptorType        36
        bDescriptorSubtype     11 (CLOCK_SELECTOR)
        bClockID                1
        bNrInPins               1
        baCSourceID(0)          2
        bmControls           0x00
        iClockSelector          0

Perhaps we also should check if clock selectors are readable and writeable
like we already do for clock sources, but this is out of scope of this
patch.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=217601
Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
Link: https://lore.kernel.org/r/20240123134635.54026-1-alexander@tsoy.me
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/clock.c

index 33db334e6556674414047b1a1d660ec3e8083100..94e4aaeafe588464496dbfcecf761033b21a0990 100644 (file)
@@ -325,7 +325,8 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip,
                                              visited, validate);
                if (ret > 0) {
                        /* Skip setting clock selector again for some devices */
-                       if (chip->quirk_flags & QUIRK_FLAG_SKIP_CLOCK_SELECTOR)
+                       if (chip->quirk_flags & QUIRK_FLAG_SKIP_CLOCK_SELECTOR ||
+                           pins == 1)
                                return ret;
                        err = uac_clock_selector_set_val(chip, entity_id, cur);
                        if (err < 0)