Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+7 −17
Original line number Diff line number Diff line
@@ -2755,7 +2755,7 @@ static int create_fixed_stream_quirk(snd_usb_audio_t *chip,
/*
 * 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,
				       const snd_usb_audio_quirk_t *quirk)
{
@@ -2765,24 +2765,14 @@ static int create_standard_interface_quirk(snd_usb_audio_t *chip,

	alts = &iface->altsetting[0];
	altsd = get_iface_desc(alts);
	switch (quirk->type) {
	case QUIRK_AUDIO_STANDARD_INTERFACE:
	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) {
		snd_printk(KERN_ERR "cannot setup if %d: error %d\n",
			   altsd->bInterfaceNumber, err);
		return err;
	}
	/* reset the current interface */
	usb_set_interface(chip->dev, altsd->bInterfaceNumber, 0);
	return 0;
}

@@ -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_EMAGIC] = 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_EDIROL_UA700_UA25] = create_ua700_ua25_quirk,
		[QUIRK_AUDIO_EDIROL_UA1000] = create_ua1000_quirk,
+38 −39
Original line number Diff line number Diff line
@@ -1550,10 +1550,10 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip,

	/* detect the endpoint(s) to use */
	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);
	} else {
		switch (quirk->type) {
		break;
	case QUIRK_MIDI_FIXED_ENDPOINT:
		memcpy(&endpoints[0], quirk->data,
		       sizeof(snd_usb_midi_endpoint_info_t));
@@ -1590,7 +1590,6 @@ int snd_usb_create_midi_interface(snd_usb_audio_t* chip,
		err = -ENXIO;
		break;
	}
	}
	if (err < 0) {
		kfree(umidi);
		return err;