Commit d1bda045 authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela

[ALSA] usb-audio: simplify MIDI quirk handling

Modules: USB generic driver

Simplify the handling of MIDI quirks by treating an interface without
quirks as a QUIRK_MIDI_STANDARD_INTERFACE.

This also fixes the bug where a MIDI_STANDARD quirk would not be
recognized.
Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent 5747e540
...@@ -2755,7 +2755,7 @@ static int create_fixed_stream_quirk(snd_usb_audio_t *chip, ...@@ -2755,7 +2755,7 @@ static int create_fixed_stream_quirk(snd_usb_audio_t *chip,
/* /*
* create a stream for an interface with proper descriptors * create a stream for an interface with proper descriptors
*/ */
static int create_standard_interface_quirk(snd_usb_audio_t *chip, static int create_standard_audio_quirk(snd_usb_audio_t *chip,
struct usb_interface *iface, struct usb_interface *iface,
const snd_usb_audio_quirk_t *quirk) const snd_usb_audio_quirk_t *quirk)
{ {
...@@ -2765,24 +2765,14 @@ static int create_standard_interface_quirk(snd_usb_audio_t *chip, ...@@ -2765,24 +2765,14 @@ static int create_standard_interface_quirk(snd_usb_audio_t *chip,
alts = &iface->altsetting[0]; alts = &iface->altsetting[0];
altsd = get_iface_desc(alts); altsd = get_iface_desc(alts);
switch (quirk->type) {
case QUIRK_AUDIO_STANDARD_INTERFACE:
err = parse_audio_endpoints(chip, altsd->bInterfaceNumber); err = parse_audio_endpoints(chip, altsd->bInterfaceNumber);
if (!err)
usb_set_interface(chip->dev, altsd->bInterfaceNumber, 0); /* reset the current interface */
break;
case QUIRK_MIDI_STANDARD_INTERFACE:
err = snd_usb_create_midi_interface(chip, iface, NULL);
break;
default:
snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
return -ENXIO;
}
if (err < 0) { if (err < 0) {
snd_printk(KERN_ERR "cannot setup if %d: error %d\n", snd_printk(KERN_ERR "cannot setup if %d: error %d\n",
altsd->bInterfaceNumber, err); altsd->bInterfaceNumber, err);
return err; return err;
} }
/* reset the current interface */
usb_set_interface(chip->dev, altsd->bInterfaceNumber, 0);
return 0; return 0;
} }
...@@ -3044,7 +3034,7 @@ static int snd_usb_create_quirk(snd_usb_audio_t *chip, ...@@ -3044,7 +3034,7 @@ static int snd_usb_create_quirk(snd_usb_audio_t *chip,
[QUIRK_MIDI_RAW] = snd_usb_create_midi_interface, [QUIRK_MIDI_RAW] = snd_usb_create_midi_interface,
[QUIRK_MIDI_EMAGIC] = snd_usb_create_midi_interface, [QUIRK_MIDI_EMAGIC] = snd_usb_create_midi_interface,
[QUIRK_MIDI_MIDITECH] = snd_usb_create_midi_interface, [QUIRK_MIDI_MIDITECH] = snd_usb_create_midi_interface,
[QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_interface_quirk, [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk,
[QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk, [QUIRK_AUDIO_FIXED_ENDPOINT] = create_fixed_stream_quirk,
[QUIRK_AUDIO_EDIROL_UA700_UA25] = create_ua700_ua25_quirk, [QUIRK_AUDIO_EDIROL_UA700_UA25] = create_ua700_ua25_quirk,
[QUIRK_AUDIO_EDIROL_UA1000] = create_ua1000_quirk, [QUIRK_AUDIO_EDIROL_UA1000] = create_ua1000_quirk,
......
...@@ -1550,10 +1550,10 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip, ...@@ -1550,10 +1550,10 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip,
/* detect the endpoint(s) to use */ /* detect the endpoint(s) to use */
memset(endpoints, 0, sizeof(endpoints)); memset(endpoints, 0, sizeof(endpoints));
if (!quirk) { switch (quirk ? quirk->type : QUIRK_MIDI_STANDARD_INTERFACE) {
case QUIRK_MIDI_STANDARD_INTERFACE:
err = snd_usbmidi_get_ms_info(umidi, endpoints); err = snd_usbmidi_get_ms_info(umidi, endpoints);
} else { break;
switch (quirk->type) {
case QUIRK_MIDI_FIXED_ENDPOINT: case QUIRK_MIDI_FIXED_ENDPOINT:
memcpy(&endpoints[0], quirk->data, memcpy(&endpoints[0], quirk->data,
sizeof(snd_usb_midi_endpoint_info_t)); sizeof(snd_usb_midi_endpoint_info_t));
...@@ -1590,7 +1590,6 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip, ...@@ -1590,7 +1590,6 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip,
err = -ENXIO; err = -ENXIO;
break; break;
} }
}
if (err < 0) { if (err < 0) {
kfree(umidi); kfree(umidi);
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment