At Sun, 09 Nov 2014 00:35:29 +1100, Damien Zammit wrote:
Hi Takashi,
On 07/11/14 01:15, Takashi Iwai wrote:
Hmm, can we achieve this without introducing the new audioformats thing, e.g. with COMPOSITE, instead?
I don't think COMPOSITE will work because the same interface has multiple endpoints. My code provides a framework for other devices with the same issue. I was told previously that this was the problem with getting my previous attempt into the kernel. Or is this doable without adding a struct?
I think the only point is the check in create_composite_quirk(), where it marks the iface as claimed and skips the next entry that has been already claimed. However, the current code looks inconsistent -- it allows multiple entries only if the iface matches with the current one. Fixing it like below would make things working.
It's a quick idea, so a bit more reviews would be needed, though. Clemens, what do you think?
BTW, I won't take a look at you v2 series. If the change above really works, I'll brush up the patch below properly, so that you can include in your new patch series.
Last but not least, please add maintainers to Cc when you post patches for reviewing.
thanks,
Takashi
--- --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -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; }