diff options
Diffstat (limited to 'sound/usb/mixer.c')
-rw-r--r-- | sound/usb/mixer.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 638e7f738018..ca4739c3f650 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
@@ -715,8 +715,9 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ | |||
715 | case UAC2_CLOCK_SELECTOR: { | 715 | case UAC2_CLOCK_SELECTOR: { |
716 | struct uac_selector_unit_descriptor *d = p1; | 716 | struct uac_selector_unit_descriptor *d = p1; |
717 | /* call recursively to retrieve the channel info */ | 717 | /* call recursively to retrieve the channel info */ |
718 | if (check_input_term(state, d->baSourceID[0], term) < 0) | 718 | err = check_input_term(state, d->baSourceID[0], term); |
719 | return -ENODEV; | 719 | if (err < 0) |
720 | return err; | ||
720 | term->type = d->bDescriptorSubtype << 16; /* virtual type */ | 721 | term->type = d->bDescriptorSubtype << 16; /* virtual type */ |
721 | term->id = id; | 722 | term->id = id; |
722 | term->name = uac_selector_unit_iSelector(d); | 723 | term->name = uac_selector_unit_iSelector(d); |
@@ -725,7 +726,8 @@ static int check_input_term(struct mixer_build *state, int id, struct usb_audio_ | |||
725 | case UAC1_PROCESSING_UNIT: | 726 | case UAC1_PROCESSING_UNIT: |
726 | case UAC1_EXTENSION_UNIT: | 727 | case UAC1_EXTENSION_UNIT: |
727 | /* UAC2_PROCESSING_UNIT_V2 */ | 728 | /* UAC2_PROCESSING_UNIT_V2 */ |
728 | /* UAC2_EFFECT_UNIT */ { | 729 | /* UAC2_EFFECT_UNIT */ |
730 | case UAC2_EXTENSION_UNIT_V2: { | ||
729 | struct uac_processing_unit_descriptor *d = p1; | 731 | struct uac_processing_unit_descriptor *d = p1; |
730 | 732 | ||
731 | if (state->mixer->protocol == UAC_VERSION_2 && | 733 | if (state->mixer->protocol == UAC_VERSION_2 && |
@@ -1356,8 +1358,9 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void | |||
1356 | return err; | 1358 | return err; |
1357 | 1359 | ||
1358 | /* determine the input source type and name */ | 1360 | /* determine the input source type and name */ |
1359 | if (check_input_term(state, hdr->bSourceID, &iterm) < 0) | 1361 | err = check_input_term(state, hdr->bSourceID, &iterm); |
1360 | return -EINVAL; | 1362 | if (err < 0) |
1363 | return err; | ||
1361 | 1364 | ||
1362 | master_bits = snd_usb_combine_bytes(bmaControls, csize); | 1365 | master_bits = snd_usb_combine_bytes(bmaControls, csize); |
1363 | /* master configuration quirks */ | 1366 | /* master configuration quirks */ |
@@ -2052,6 +2055,8 @@ static int parse_audio_unit(struct mixer_build *state, int unitid) | |||
2052 | return parse_audio_extension_unit(state, unitid, p1); | 2055 | return parse_audio_extension_unit(state, unitid, p1); |
2053 | else /* UAC_VERSION_2 */ | 2056 | else /* UAC_VERSION_2 */ |
2054 | return parse_audio_processing_unit(state, unitid, p1); | 2057 | return parse_audio_processing_unit(state, unitid, p1); |
2058 | case UAC2_EXTENSION_UNIT_V2: | ||
2059 | return parse_audio_extension_unit(state, unitid, p1); | ||
2055 | default: | 2060 | default: |
2056 | snd_printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]); | 2061 | snd_printk(KERN_ERR "usbaudio: unit %u: unexpected type 0x%02x\n", unitid, p1[2]); |
2057 | return -EINVAL; | 2062 | return -EINVAL; |
@@ -2118,7 +2123,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | |||
2118 | state.oterm.type = le16_to_cpu(desc->wTerminalType); | 2123 | state.oterm.type = le16_to_cpu(desc->wTerminalType); |
2119 | state.oterm.name = desc->iTerminal; | 2124 | state.oterm.name = desc->iTerminal; |
2120 | err = parse_audio_unit(&state, desc->bSourceID); | 2125 | err = parse_audio_unit(&state, desc->bSourceID); |
2121 | if (err < 0) | 2126 | if (err < 0 && err != -EINVAL) |
2122 | return err; | 2127 | return err; |
2123 | } else { /* UAC_VERSION_2 */ | 2128 | } else { /* UAC_VERSION_2 */ |
2124 | struct uac2_output_terminal_descriptor *desc = p; | 2129 | struct uac2_output_terminal_descriptor *desc = p; |
@@ -2130,12 +2135,12 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) | |||
2130 | state.oterm.type = le16_to_cpu(desc->wTerminalType); | 2135 | state.oterm.type = le16_to_cpu(desc->wTerminalType); |
2131 | state.oterm.name = desc->iTerminal; | 2136 | state.oterm.name = desc->iTerminal; |
2132 | err = parse_audio_unit(&state, desc->bSourceID); | 2137 | err = parse_audio_unit(&state, desc->bSourceID); |
2133 | if (err < 0) | 2138 | if (err < 0 && err != -EINVAL) |
2134 | return err; | 2139 | return err; |
2135 | 2140 | ||
2136 | /* for UAC2, use the same approach to also add the clock selectors */ | 2141 | /* for UAC2, use the same approach to also add the clock selectors */ |
2137 | err = parse_audio_unit(&state, desc->bCSourceID); | 2142 | err = parse_audio_unit(&state, desc->bCSourceID); |
2138 | if (err < 0) | 2143 | if (err < 0 && err != -EINVAL) |
2139 | return err; | 2144 | return err; |
2140 | } | 2145 | } |
2141 | } | 2146 | } |