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

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

[ALSA] usb-audio - change quirk type handling



USB generic driver
Make the quirk type an enum instead of a #defined integer, and use a
table for the quirk constructor functions instead of a big switch
statement.

Signed-off-by: default avatarClemens Ladisch <clemens@ladisch.de>
parent f38275fe
Loading
Loading
Loading
Loading
+34 −25
Original line number Diff line number Diff line
@@ -2735,7 +2735,8 @@ static int create_standard_interface_quirk(snd_usb_audio_t *chip,
 * to detect the sample rate is by looking at wMaxPacketSize.
 */
static int create_ua700_ua25_quirk(snd_usb_audio_t *chip,
				   struct usb_interface *iface)
				   struct usb_interface *iface,
				   const snd_usb_audio_quirk_t *quirk)
{
	static const struct audioformat ua_format = {
		.format = SNDRV_PCM_FORMAT_S24_3LE,
@@ -2826,7 +2827,9 @@ static int create_ua700_ua25_quirk(snd_usb_audio_t *chip,
/*
 * Create a stream for an Edirol UA-1000 interface.
 */
static int create_ua1000_quirk(snd_usb_audio_t *chip, struct usb_interface *iface)
static int create_ua1000_quirk(snd_usb_audio_t *chip,
			       struct usb_interface *iface,
			       const snd_usb_audio_quirk_t *quirk)
{
	static const struct audioformat ua1000_format = {
		.format = SNDRV_PCM_FORMAT_S32_LE,
@@ -2903,6 +2906,13 @@ static int create_composite_quirk(snd_usb_audio_t *chip,
	return 0;
}

static int ignore_interface_quirk(snd_usb_audio_t *chip,
				  struct usb_interface *iface,
				  const snd_usb_audio_quirk_t *quirk)
{
	return 0;
}


/*
 * boot quirks
@@ -2965,29 +2975,28 @@ static int snd_usb_create_quirk(snd_usb_audio_t *chip,
				struct usb_interface *iface,
				const snd_usb_audio_quirk_t *quirk)
{
	switch (quirk->type) {
	case QUIRK_MIDI_FIXED_ENDPOINT:
	case QUIRK_MIDI_YAMAHA:
	case QUIRK_MIDI_MIDIMAN:
	case QUIRK_MIDI_NOVATION:
	case QUIRK_MIDI_RAW:
	case QUIRK_MIDI_EMAGIC:
	case QUIRK_MIDI_MIDITECH:
		return snd_usb_create_midi_interface(chip, iface, quirk);
	case QUIRK_COMPOSITE:
		return create_composite_quirk(chip, iface, quirk);
	case QUIRK_AUDIO_FIXED_ENDPOINT:
		return create_fixed_stream_quirk(chip, iface, quirk);
	case QUIRK_AUDIO_STANDARD_INTERFACE:
	case QUIRK_MIDI_STANDARD_INTERFACE:
		return create_standard_interface_quirk(chip, iface, quirk);
	case QUIRK_AUDIO_EDIROL_UA700_UA25:
		return create_ua700_ua25_quirk(chip, iface);
	case QUIRK_AUDIO_EDIROL_UA1000:
		return create_ua1000_quirk(chip, iface);
	case QUIRK_IGNORE_INTERFACE:
		return 0;
	default:
	typedef int (*quirk_func_t)(snd_usb_audio_t *, struct usb_interface *,
				    const snd_usb_audio_quirk_t *);
	static const quirk_func_t quirk_funcs[] = {
		[QUIRK_IGNORE_INTERFACE] = ignore_interface_quirk,
		[QUIRK_COMPOSITE] = create_composite_quirk,
		[QUIRK_MIDI_STANDARD_INTERFACE] = snd_usb_create_midi_interface,
		[QUIRK_MIDI_FIXED_ENDPOINT] = snd_usb_create_midi_interface,
		[QUIRK_MIDI_YAMAHA] = snd_usb_create_midi_interface,
		[QUIRK_MIDI_MIDIMAN] = snd_usb_create_midi_interface,
		[QUIRK_MIDI_NOVATION] = snd_usb_create_midi_interface,
		[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_FIXED_ENDPOINT] = create_fixed_stream_quirk,
		[QUIRK_AUDIO_EDIROL_UA700_UA25] = create_ua700_ua25_quirk,
		[QUIRK_AUDIO_EDIROL_UA1000] = create_ua1000_quirk,
	};

	if (quirk->type < QUIRK_TYPE_COUNT) {
		return quirk_funcs[quirk->type](chip, iface, quirk);
	} else {
		snd_printd(KERN_ERR "invalid quirk type %d\n", quirk->type);
		return -ENXIO;
	}
+19 −16
Original line number Diff line number Diff line
@@ -153,21 +153,24 @@ struct snd_usb_audio {
#define QUIRK_NO_INTERFACE		-2
#define QUIRK_ANY_INTERFACE		-1

/* quirk type */
#define QUIRK_MIDI_FIXED_ENDPOINT	0
#define QUIRK_MIDI_YAMAHA		1
#define QUIRK_MIDI_MIDIMAN		2
#define QUIRK_COMPOSITE			3
#define QUIRK_AUDIO_FIXED_ENDPOINT	4
#define QUIRK_AUDIO_STANDARD_INTERFACE	5
#define QUIRK_MIDI_STANDARD_INTERFACE	6
#define QUIRK_AUDIO_EDIROL_UA700_UA25	7
#define QUIRK_AUDIO_EDIROL_UA1000	8
#define QUIRK_IGNORE_INTERFACE		9
#define QUIRK_MIDI_NOVATION		10
#define QUIRK_MIDI_RAW			11
#define QUIRK_MIDI_EMAGIC		12
#define QUIRK_MIDI_MIDITECH		13
enum quirk_type {
	QUIRK_IGNORE_INTERFACE,
	QUIRK_COMPOSITE,
	QUIRK_MIDI_STANDARD_INTERFACE,
	QUIRK_MIDI_FIXED_ENDPOINT,
	QUIRK_MIDI_YAMAHA,
	QUIRK_MIDI_MIDIMAN,
	QUIRK_MIDI_NOVATION,
	QUIRK_MIDI_RAW,
	QUIRK_MIDI_EMAGIC,
	QUIRK_MIDI_MIDITECH,
	QUIRK_AUDIO_STANDARD_INTERFACE,
	QUIRK_AUDIO_FIXED_ENDPOINT,
	QUIRK_AUDIO_EDIROL_UA700_UA25,
	QUIRK_AUDIO_EDIROL_UA1000,

	QUIRK_TYPE_COUNT
};

typedef struct snd_usb_audio_quirk snd_usb_audio_quirk_t;
typedef struct snd_usb_midi_endpoint_info snd_usb_midi_endpoint_info_t;
@@ -176,7 +179,7 @@ struct snd_usb_audio_quirk {
	const char *vendor_name;
	const char *product_name;
	int16_t ifnum;
	int16_t type;
	uint16_t type;
	const void *data;
};