Currently we bail out when the device returns an error or an invalid value for the current clock selector value via uac_clock_selector_get_val(). But it's possible that the device is really uninitialized and waits for the setup of the proper route at first.
For handling such a case, this patch lets the driver dealing with the error or the invalid error more gracefully, choosing the clock source automatically instead.
Signed-off-by: Takashi Iwai tiwai@suse.de --- sound/usb/clock.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/sound/usb/clock.c b/sound/usb/clock.c index 48a79f1b6233..772478c725c2 100644 --- a/sound/usb/clock.c +++ b/sound/usb/clock.c @@ -299,8 +299,11 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, /* the entity ID we are looking for is a selector. * find out what it currently selects */ ret = uac_clock_selector_get_val(chip, clock_id); - if (ret < 0) - return ret; + if (ret < 0) { + if (!chip->autoclock) + return ret; + goto find_others; + }
/* Selector values are one-based */
@@ -309,7 +312,10 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, "%s(): selector reported illegal value, id %d, ret %d\n", __func__, clock_id, ret);
- return -EINVAL; + if (!chip->autoclock) + return -EINVAL; + ret = 0; + goto find_others; }
find_source: @@ -326,6 +332,7 @@ static int __uac_clock_find_source(struct snd_usb_audio *chip, if (!validate || ret > 0 || !chip->autoclock) return ret;
+ find_others: /* The current clock source is invalid, try others. */ for (i = 1; i <= pins; i++) { if (i == cur)