ALSA: usb-audio: Allow multiple entries for the same iface in composite quirk
authorTakashi Iwai <tiwai@suse.de>
Sun, 9 Nov 2014 17:21:23 +0000 (18:21 +0100)
committerTakashi Iwai <tiwai@suse.de>
Sun, 9 Nov 2014 17:21:23 +0000 (18:21 +0100)
Currently the composite quirk doesn't work when multiple entries are
assigned to the same interface because it marks the interface as
claimed then checks whether the interface has been already claimed for
the secondary entry.  But, if you look at the code, you'll notice that
multiple entries are allowed if the entry is the current interface;
i.e. the current behavior is anyway inconsistent, and this is an
unintended shortcoming.

This patch fixes the problem by marking the relevant interfaces as
claimed after applying the all composite entries.  This fix will be
needed for the upcoming enhancements for Digidesign Mbox 1 quirks.

Reviewed-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/quirks.c

index d2aa45a8d89546b378fa05fc94750a35f6fe5c18..e9ff3a6c60e434e6d2f7f63db08ce7fd9df17905 100644 (file)
@@ -58,9 +58,17 @@ static int create_composite_quirk(struct snd_usb_audio *chip,
                err = snd_usb_create_quirk(chip, iface, driver, quirk);
                if (err < 0)
                        return err;
-               if (quirk->ifnum != probed_ifnum)
+       }
+
+       for (quirk = quirk->data; quirk->ifnum >= 0; ++quirk) {
+               iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
+               if (!iface)
+                       continue;
+               if (quirk->ifnum != probed_ifnum &&
+                   !usb_interface_claimed(iface))
                        usb_driver_claim_interface(driver, iface, (void *)-1L);
        }
+
        return 0;
 }