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

Commit 512ad27d authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Greg Kroah-Hartman
Browse files

USB audio gadget: Prefix all macro definitions with UAC_ in linux/usb/audio.h



linux/usb/audio.h is a public header file that includes definitions
exported to userspace. To avoid namespace clashes, prefix all macro
definitions with UAC_. Existing macros and structures prefixed with
USB_AC_ and USB_AS_ are renamed for consistency.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@skynet.be>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 315ad302
Loading
Loading
Loading
Loading
+12 −12
Original line number Original line Diff line number Diff line
@@ -106,20 +106,20 @@ static int audio_set_endpoint_req(struct usb_configuration *c,
			ctrl->bRequest, w_value, len, ep);
			ctrl->bRequest, w_value, len, ep);


	switch (ctrl->bRequest) {
	switch (ctrl->bRequest) {
	case SET_CUR:
	case UAC_SET_CUR:
		value = 0;
		value = 0;
		break;
		break;


	case SET_MIN:
	case UAC_SET_MIN:
		break;
		break;


	case SET_MAX:
	case UAC_SET_MAX:
		break;
		break;


	case SET_RES:
	case UAC_SET_RES:
		break;
		break;


	case SET_MEM:
	case UAC_SET_MEM:
		break;
		break;


	default:
	default:
@@ -142,13 +142,13 @@ static int audio_get_endpoint_req(struct usb_configuration *c,
			ctrl->bRequest, w_value, len, ep);
			ctrl->bRequest, w_value, len, ep);


	switch (ctrl->bRequest) {
	switch (ctrl->bRequest) {
	case GET_CUR:
	case UAC_GET_CUR:
	case GET_MIN:
	case UAC_GET_MIN:
	case GET_MAX:
	case UAC_GET_MAX:
	case GET_RES:
	case UAC_GET_RES:
		value = 3;
		value = 3;
		break;
		break;
	case GET_MEM:
	case UAC_GET_MEM:
		break;
		break;
	default:
	default:
		break;
		break;
@@ -171,11 +171,11 @@ audio_setup(struct usb_configuration *c, const struct usb_ctrlrequest *ctrl)
	 * Audio class messages; interface activation uses set_alt().
	 * Audio class messages; interface activation uses set_alt().
	 */
	 */
	switch (ctrl->bRequestType) {
	switch (ctrl->bRequestType) {
	case USB_AUDIO_SET_ENDPOINT:
	case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
		value = audio_set_endpoint_req(c, ctrl);
		value = audio_set_endpoint_req(c, ctrl);
		break;
		break;


	case USB_AUDIO_GET_ENDPOINT:
	case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_ENDPOINT:
		value = audio_get_endpoint_req(c, ctrl);
		value = audio_get_endpoint_req(c, ctrl);
		break;
		break;


+40 −40
Original line number Original line Diff line number Diff line
@@ -50,16 +50,16 @@ static struct usb_interface_descriptor ac_interface_desc __initdata = {
	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOCONTROL,
	.bInterfaceSubClass =	USB_SUBCLASS_AUDIOCONTROL,
};
};


DECLARE_USB_AC_HEADER_DESCRIPTOR(2);
DECLARE_UAC_AC_HEADER_DESCRIPTOR(2);


#define USB_DT_AC_HEADER_LENGH	USB_DT_AC_HEADER_SIZE(F_AUDIO_NUM_INTERFACES)
#define UAC_DT_AC_HEADER_LENGTH	UAC_DT_AC_HEADER_SIZE(F_AUDIO_NUM_INTERFACES)
/* B.3.2  Class-Specific AC Interface Descriptor */
/* B.3.2  Class-Specific AC Interface Descriptor */
static struct usb_ac_header_descriptor_2 ac_header_desc = {
static struct uac_ac_header_descriptor_2 ac_header_desc = {
	.bLength =		USB_DT_AC_HEADER_LENGH,
	.bLength =		UAC_DT_AC_HEADER_LENGTH,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorSubtype =	HEADER,
	.bDescriptorSubtype =	UAC_HEADER,
	.bcdADC =		__constant_cpu_to_le16(0x0100),
	.bcdADC =		__constant_cpu_to_le16(0x0100),
	.wTotalLength =		__constant_cpu_to_le16(USB_DT_AC_HEADER_LENGH),
	.wTotalLength =		__constant_cpu_to_le16(UAC_DT_AC_HEADER_LENGTH),
	.bInCollection =	F_AUDIO_NUM_INTERFACES,
	.bInCollection =	F_AUDIO_NUM_INTERFACES,
	.baInterfaceNr = {
	.baInterfaceNr = {
		[0] =		F_AUDIO_AC_INTERFACE,
		[0] =		F_AUDIO_AC_INTERFACE,
@@ -68,33 +68,33 @@ static struct usb_ac_header_descriptor_2 ac_header_desc = {
};
};


#define INPUT_TERMINAL_ID	1
#define INPUT_TERMINAL_ID	1
static struct usb_input_terminal_descriptor input_terminal_desc = {
static struct uac_input_terminal_descriptor input_terminal_desc = {
	.bLength =		USB_DT_AC_INPUT_TERMINAL_SIZE,
	.bLength =		UAC_DT_INPUT_TERMINAL_SIZE,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorSubtype =	INPUT_TERMINAL,
	.bDescriptorSubtype =	UAC_INPUT_TERMINAL,
	.bTerminalID =		INPUT_TERMINAL_ID,
	.bTerminalID =		INPUT_TERMINAL_ID,
	.wTerminalType =	USB_AC_TERMINAL_STREAMING,
	.wTerminalType =	UAC_TERMINAL_STREAMING,
	.bAssocTerminal =	0,
	.bAssocTerminal =	0,
	.wChannelConfig =	0x3,
	.wChannelConfig =	0x3,
};
};


DECLARE_USB_AC_FEATURE_UNIT_DESCRIPTOR(0);
DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(0);


#define FEATURE_UNIT_ID		2
#define FEATURE_UNIT_ID		2
static struct usb_ac_feature_unit_descriptor_0 feature_unit_desc = {
static struct uac_feature_unit_descriptor_0 feature_unit_desc = {
	.bLength		= USB_DT_AC_FEATURE_UNIT_SIZE(0),
	.bLength		= UAC_DT_FEATURE_UNIT_SIZE(0),
	.bDescriptorType	= USB_DT_CS_INTERFACE,
	.bDescriptorType	= USB_DT_CS_INTERFACE,
	.bDescriptorSubtype	= FEATURE_UNIT,
	.bDescriptorSubtype	= UAC_FEATURE_UNIT,
	.bUnitID		= FEATURE_UNIT_ID,
	.bUnitID		= FEATURE_UNIT_ID,
	.bSourceID		= INPUT_TERMINAL_ID,
	.bSourceID		= INPUT_TERMINAL_ID,
	.bControlSize		= 2,
	.bControlSize		= 2,
	.bmaControls[0]		= (FU_MUTE | FU_VOLUME),
	.bmaControls[0]		= (UAC_FU_MUTE | UAC_FU_VOLUME),
};
};


static struct usb_audio_control mute_control = {
static struct usb_audio_control mute_control = {
	.list = LIST_HEAD_INIT(mute_control.list),
	.list = LIST_HEAD_INIT(mute_control.list),
	.name = "Mute Control",
	.name = "Mute Control",
	.type = MUTE_CONTROL,
	.type = UAC_MUTE_CONTROL,
	/* Todo: add real Mute control code */
	/* Todo: add real Mute control code */
	.set = generic_set_cmd,
	.set = generic_set_cmd,
	.get = generic_get_cmd,
	.get = generic_get_cmd,
@@ -103,7 +103,7 @@ static struct usb_audio_control mute_control = {
static struct usb_audio_control volume_control = {
static struct usb_audio_control volume_control = {
	.list = LIST_HEAD_INIT(volume_control.list),
	.list = LIST_HEAD_INIT(volume_control.list),
	.name = "Volume Control",
	.name = "Volume Control",
	.type = VOLUME_CONTROL,
	.type = UAC_VOLUME_CONTROL,
	/* Todo: add real Volume control code */
	/* Todo: add real Volume control code */
	.set = generic_set_cmd,
	.set = generic_set_cmd,
	.get = generic_get_cmd,
	.get = generic_get_cmd,
@@ -113,17 +113,17 @@ static struct usb_audio_control_selector feature_unit = {
	.list = LIST_HEAD_INIT(feature_unit.list),
	.list = LIST_HEAD_INIT(feature_unit.list),
	.id = FEATURE_UNIT_ID,
	.id = FEATURE_UNIT_ID,
	.name = "Mute & Volume Control",
	.name = "Mute & Volume Control",
	.type = FEATURE_UNIT,
	.type = UAC_FEATURE_UNIT,
	.desc = (struct usb_descriptor_header *)&feature_unit_desc,
	.desc = (struct usb_descriptor_header *)&feature_unit_desc,
};
};


#define OUTPUT_TERMINAL_ID	3
#define OUTPUT_TERMINAL_ID	3
static struct usb_output_terminal_descriptor output_terminal_desc = {
static struct uac_output_terminal_descriptor output_terminal_desc = {
	.bLength		= USB_DT_AC_OUTPUT_TERMINAL_SIZE,
	.bLength		= UAC_DT_OUTPUT_TERMINAL_SIZE,
	.bDescriptorType	= USB_DT_CS_INTERFACE,
	.bDescriptorType	= USB_DT_CS_INTERFACE,
	.bDescriptorSubtype	= OUTPUT_TERMINAL,
	.bDescriptorSubtype	= UAC_OUTPUT_TERMINAL,
	.bTerminalID		= OUTPUT_TERMINAL_ID,
	.bTerminalID		= OUTPUT_TERMINAL_ID,
	.wTerminalType		= USB_AC_OUTPUT_TERMINAL_SPEAKER,
	.wTerminalType		= UAC_OUTPUT_TERMINAL_SPEAKER,
	.bAssocTerminal		= FEATURE_UNIT_ID,
	.bAssocTerminal		= FEATURE_UNIT_ID,
	.bSourceID		= FEATURE_UNIT_ID,
	.bSourceID		= FEATURE_UNIT_ID,
};
};
@@ -148,22 +148,22 @@ static struct usb_interface_descriptor as_interface_alt_1_desc = {
};
};


/* B.4.2  Class-Specific AS Interface Descriptor */
/* B.4.2  Class-Specific AS Interface Descriptor */
static struct usb_as_header_descriptor as_header_desc = {
static struct uac_as_header_descriptor as_header_desc = {
	.bLength =		USB_DT_AS_HEADER_SIZE,
	.bLength =		UAC_DT_AS_HEADER_SIZE,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorSubtype =	AS_GENERAL,
	.bDescriptorSubtype =	UAC_AS_GENERAL,
	.bTerminalLink =	INPUT_TERMINAL_ID,
	.bTerminalLink =	INPUT_TERMINAL_ID,
	.bDelay =		1,
	.bDelay =		1,
	.wFormatTag =		USB_AS_AUDIO_FORMAT_TYPE_I_PCM,
	.wFormatTag =		UAC_FORMAT_TYPE_I_PCM,
};
};


DECLARE_USB_AS_FORMAT_TYPE_I_DISCRETE_DESC(1);
DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1);


static struct usb_as_formate_type_i_discrete_descriptor_1 as_type_i_desc = {
static struct uac_format_type_i_discrete_descriptor_1 as_type_i_desc = {
	.bLength =		USB_AS_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
	.bLength =		UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(1),
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorSubtype =	FORMAT_TYPE,
	.bDescriptorSubtype =	UAC_FORMAT_TYPE,
	.bFormatType =		USB_AS_FORMAT_TYPE_I,
	.bFormatType =		UAC_FORMAT_TYPE_I,
	.bSubframeSize =	2,
	.bSubframeSize =	2,
	.bBitResolution =	16,
	.bBitResolution =	16,
	.bSamFreqType =		1,
	.bSamFreqType =		1,
@@ -181,10 +181,10 @@ static struct usb_endpoint_descriptor as_out_ep_desc __initdata = {
};
};


/* Class-specific AS ISO OUT Endpoint Descriptor */
/* Class-specific AS ISO OUT Endpoint Descriptor */
static struct usb_as_iso_endpoint_descriptor as_iso_out_desc __initdata = {
static struct uac_iso_endpoint_descriptor as_iso_out_desc __initdata = {
	.bLength =		USB_AS_ISO_ENDPOINT_DESC_SIZE,
	.bLength =		UAC_ISO_ENDPOINT_DESC_SIZE,
	.bDescriptorType =	USB_DT_CS_ENDPOINT,
	.bDescriptorType =	USB_DT_CS_ENDPOINT,
	.bDescriptorSubtype =	EP_GENERAL,
	.bDescriptorSubtype =	UAC_EP_GENERAL,
	.bmAttributes = 	1,
	.bmAttributes = 	1,
	.bLockDelayUnits =	1,
	.bLockDelayUnits =	1,
	.wLockDelay =		__constant_cpu_to_le16(1),
	.wLockDelay =		__constant_cpu_to_le16(1),
@@ -456,11 +456,11 @@ f_audio_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
	 * Audio class messages; interface activation uses set_alt().
	 * Audio class messages; interface activation uses set_alt().
	 */
	 */
	switch (ctrl->bRequestType) {
	switch (ctrl->bRequestType) {
	case USB_AUDIO_SET_INTF:
	case USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE:
		value = audio_set_intf_req(f, ctrl);
		value = audio_set_intf_req(f, ctrl);
		break;
		break;


	case USB_AUDIO_GET_INTF:
	case USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE:
		value = audio_get_intf_req(f, ctrl);
		value = audio_get_intf_req(f, ctrl);
		break;
		break;


@@ -642,10 +642,10 @@ int __init control_selector_init(struct f_audio *audio)
	list_add(&mute_control.list, &feature_unit.control);
	list_add(&mute_control.list, &feature_unit.control);
	list_add(&volume_control.list, &feature_unit.control);
	list_add(&volume_control.list, &feature_unit.control);


	volume_control.data[_CUR] = 0xffc0;
	volume_control.data[UAC__CUR] = 0xffc0;
	volume_control.data[_MIN] = 0xe3a0;
	volume_control.data[UAC__MIN] = 0xe3a0;
	volume_control.data[_MAX] = 0xfff0;
	volume_control.data[UAC__MAX] = 0xfff0;
	volume_control.data[_RES] = 0x0030;
	volume_control.data[UAC__RES] = 0x0030;


	return 0;
	return 0;
}
}
+4 −4
Original line number Original line Diff line number Diff line
@@ -191,7 +191,7 @@ module_param(qlen, uint, S_IRUGO);
#define GMIDI_MS_INTERFACE	1
#define GMIDI_MS_INTERFACE	1
#define GMIDI_NUM_INTERFACES	2
#define GMIDI_NUM_INTERFACES	2


DECLARE_USB_AC_HEADER_DESCRIPTOR(1);
DECLARE_UAC_AC_HEADER_DESCRIPTOR(1);
DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(1);
DECLARE_USB_MIDI_OUT_JACK_DESCRIPTOR(1);
DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(1);
DECLARE_USB_MS_ENDPOINT_DESCRIPTOR(1);


@@ -237,12 +237,12 @@ static const struct usb_interface_descriptor ac_interface_desc = {
};
};


/* B.3.2  Class-Specific AC Interface Descriptor */
/* B.3.2  Class-Specific AC Interface Descriptor */
static const struct usb_ac_header_descriptor_1 ac_header_desc = {
static const struct uac_ac_header_descriptor_1 ac_header_desc = {
	.bLength =		USB_DT_AC_HEADER_SIZE(1),
	.bLength =		UAC_DT_AC_HEADER_SIZE(1),
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorType =	USB_DT_CS_INTERFACE,
	.bDescriptorSubtype =	USB_MS_HEADER,
	.bDescriptorSubtype =	USB_MS_HEADER,
	.bcdADC =		cpu_to_le16(0x0100),
	.bcdADC =		cpu_to_le16(0x0100),
	.wTotalLength =		cpu_to_le16(USB_DT_AC_HEADER_SIZE(1)),
	.wTotalLength =		cpu_to_le16(UAC_DT_AC_HEADER_SIZE(1)),
	.bInCollection =	1,
	.bInCollection =	1,
	.baInterfaceNr = {
	.baInterfaceNr = {
		[0] =		GMIDI_MS_INTERFACE,
		[0] =		GMIDI_MS_INTERFACE,
+132 −126
Original line number Original line Diff line number Diff line
@@ -25,80 +25,77 @@
#define USB_SUBCLASS_AUDIOSTREAMING	0x02
#define USB_SUBCLASS_AUDIOSTREAMING	0x02
#define USB_SUBCLASS_MIDISTREAMING	0x03
#define USB_SUBCLASS_MIDISTREAMING	0x03


/* A.5 Audio Class-Specific AC interface Descriptor Subtypes*/
/* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */
#define HEADER				0x01
#define UAC_HEADER			0x01
#define INPUT_TERMINAL			0x02
#define UAC_INPUT_TERMINAL		0x02
#define OUTPUT_TERMINAL			0x03
#define UAC_OUTPUT_TERMINAL		0x03
#define MIXER_UNIT			0x04
#define UAC_MIXER_UNIT			0x04
#define SELECTOR_UNIT			0x05
#define UAC_SELECTOR_UNIT		0x05
#define FEATURE_UNIT			0x06
#define UAC_FEATURE_UNIT		0x06
#define PROCESSING_UNIT			0x07
#define UAC_PROCESSING_UNIT		0x07
#define EXTENSION_UNIT			0x08
#define UAC_EXTENSION_UNIT		0x08


#define AS_GENERAL			0x01
/* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */
#define FORMAT_TYPE			0x02
#define UAC_AS_GENERAL			0x01
#define FORMAT_SPECIFIC			0x03
#define UAC_FORMAT_TYPE			0x02

#define UAC_FORMAT_SPECIFIC		0x03
#define EP_GENERAL			0x01


/* A.8 Audio Class-Specific Endpoint Descriptor Subtypes */
#define MS_GENERAL			0x01
#define UAC_EP_GENERAL			0x01
#define MIDI_IN_JACK			0x02

#define MIDI_OUT_JACK			0x03
/* A.9 Audio Class-Specific Request Codes */

#define UAC_SET_			0x00
/* cs endpoint attributes */
#define UAC_GET_			0x80
#define EP_CS_ATTR_SAMPLE_RATE		0x01

#define EP_CS_ATTR_PITCH_CONTROL	0x02
#define UAC__CUR			0x1
#define EP_CS_ATTR_FILL_MAX		0x80
#define UAC__MIN			0x2

#define UAC__MAX			0x3
/* Audio Class specific Request Codes */
#define UAC__RES			0x4
#define USB_AUDIO_SET_INTF		0x21
#define UAC__MEM			0x5
#define USB_AUDIO_SET_ENDPOINT		0x22

#define USB_AUDIO_GET_INTF		0xa1
#define UAC_SET_CUR			(UAC_SET_ | UAC__CUR)
#define USB_AUDIO_GET_ENDPOINT		0xa2
#define UAC_GET_CUR			(UAC_GET_ | UAC__CUR)

#define UAC_SET_MIN			(UAC_SET_ | UAC__MIN)
#define SET_	0x00
#define UAC_GET_MIN			(UAC_GET_ | UAC__MIN)
#define GET_	0x80
#define UAC_SET_MAX			(UAC_SET_ | UAC__MAX)

#define UAC_GET_MAX			(UAC_GET_ | UAC__MAX)
#define _CUR	0x1
#define UAC_SET_RES			(UAC_SET_ | UAC__RES)
#define _MIN	0x2
#define UAC_GET_RES			(UAC_GET_ | UAC__RES)
#define _MAX	0x3
#define UAC_SET_MEM			(UAC_SET_ | UAC__MEM)
#define _RES	0x4
#define UAC_GET_MEM			(UAC_GET_ | UAC__MEM)
#define _MEM	0x5


#define UAC_GET_STAT			0xff
#define SET_CUR		(SET_ | _CUR)

#define GET_CUR		(GET_ | _CUR)
/* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */
#define SET_MIN		(SET_ | _MIN)
#define UAC_MS_HEADER			0x01
#define GET_MIN		(GET_ | _MIN)
#define UAC_MIDI_IN_JACK		0x02
#define SET_MAX		(SET_ | _MAX)
#define UAC_MIDI_OUT_JACK		0x03
#define GET_MAX		(GET_ | _MAX)

#define SET_RES		(SET_ | _RES)
/* MIDI - A.1 MS Class-Specific Endpoint Descriptor Subtypes */
#define GET_RES		(GET_ | _RES)
#define UAC_MS_GENERAL			0x01
#define SET_MEM		(SET_ | _MEM)

#define GET_MEM		(GET_ | _MEM)
/* Terminals - 2.1 USB Terminal Types */

#define UAC_TERMINAL_UNDEFINED		0x100
#define GET_STAT	0xff
#define UAC_TERMINAL_STREAMING		0x101

#define UAC_TERMINAL_VENDOR_SPEC	0x1FF
#define USB_AC_TERMINAL_UNDEFINED	0x100
#define USB_AC_TERMINAL_STREAMING	0x101
#define USB_AC_TERMINAL_VENDOR_SPEC	0x1FF


/* Terminal Control Selectors */
/* Terminal Control Selectors */
/* 4.3.2  Class-Specific AC Interface Descriptor */
/* 4.3.2  Class-Specific AC Interface Descriptor */
struct usb_ac_header_descriptor {
struct uac_ac_header_descriptor {
	__u8  bLength;			/* 8 + n */
	__u8  bLength;			/* 8 + n */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorSubtype;	/* USB_MS_HEADER */
	__u8  bDescriptorSubtype;	/* UAC_MS_HEADER */
	__le16 bcdADC;			/* 0x0100 */
	__le16 bcdADC;			/* 0x0100 */
	__le16 wTotalLength;		/* includes Unit and Terminal desc. */
	__le16 wTotalLength;		/* includes Unit and Terminal desc. */
	__u8  bInCollection;		/* n */
	__u8  bInCollection;		/* n */
	__u8  baInterfaceNr[];		/* [n] */
	__u8  baInterfaceNr[];		/* [n] */
} __attribute__ ((packed));
} __attribute__ ((packed));


#define USB_DT_AC_HEADER_SIZE(n)	(8 + (n))
#define UAC_DT_AC_HEADER_SIZE(n)	(8 + (n))


/* As above, but more useful for defining your own descriptors: */
/* As above, but more useful for defining your own descriptors: */
#define DECLARE_USB_AC_HEADER_DESCRIPTOR(n) 			\
#define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n) 			\
struct usb_ac_header_descriptor_##n {				\
struct uac_ac_header_descriptor_##n {				\
	__u8  bLength;						\
	__u8  bLength;						\
	__u8  bDescriptorType;					\
	__u8  bDescriptorType;					\
	__u8  bDescriptorSubtype;				\
	__u8  bDescriptorSubtype;				\
@@ -109,7 +106,7 @@ struct usb_ac_header_descriptor_##n { \
} __attribute__ ((packed))
} __attribute__ ((packed))


/* 4.3.2.1 Input Terminal Descriptor */
/* 4.3.2.1 Input Terminal Descriptor */
struct usb_input_terminal_descriptor {
struct uac_input_terminal_descriptor {
	__u8  bLength;			/* in bytes: 12 */
	__u8  bLength;			/* in bytes: 12 */
	__u8  bDescriptorType;		/* CS_INTERFACE descriptor type */
	__u8  bDescriptorType;		/* CS_INTERFACE descriptor type */
	__u8  bDescriptorSubtype;	/* INPUT_TERMINAL descriptor subtype */
	__u8  bDescriptorSubtype;	/* INPUT_TERMINAL descriptor subtype */
@@ -122,18 +119,19 @@ struct usb_input_terminal_descriptor {
	__u8  iTerminal;
	__u8  iTerminal;
} __attribute__ ((packed));
} __attribute__ ((packed));


#define USB_DT_AC_INPUT_TERMINAL_SIZE			12
#define UAC_DT_INPUT_TERMINAL_SIZE			12


#define USB_AC_INPUT_TERMINAL_UNDEFINED			0x200
/* Terminals - 2.2 Input Terminal Types */
#define USB_AC_INPUT_TERMINAL_MICROPHONE		0x201
#define UAC_INPUT_TERMINAL_UNDEFINED			0x200
#define USB_AC_INPUT_TERMINAL_DESKTOP_MICROPHONE	0x202
#define UAC_INPUT_TERMINAL_MICROPHONE			0x201
#define USB_AC_INPUT_TERMINAL_PERSONAL_MICROPHONE	0x203
#define UAC_INPUT_TERMINAL_DESKTOP_MICROPHONE		0x202
#define USB_AC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE	0x204
#define UAC_INPUT_TERMINAL_PERSONAL_MICROPHONE		0x203
#define USB_AC_INPUT_TERMINAL_MICROPHONE_ARRAY		0x205
#define UAC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE		0x204
#define USB_AC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY	0x206
#define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY		0x205
#define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY	0x206


/* 4.3.2.2 Output Terminal Descriptor */
/* 4.3.2.2 Output Terminal Descriptor */
struct usb_output_terminal_descriptor {
struct uac_output_terminal_descriptor {
	__u8  bLength;			/* in bytes: 9 */
	__u8  bLength;			/* in bytes: 9 */
	__u8  bDescriptorType;		/* CS_INTERFACE descriptor type */
	__u8  bDescriptorType;		/* CS_INTERFACE descriptor type */
	__u8  bDescriptorSubtype;	/* OUTPUT_TERMINAL descriptor subtype */
	__u8  bDescriptorSubtype;	/* OUTPUT_TERMINAL descriptor subtype */
@@ -144,23 +142,24 @@ struct usb_output_terminal_descriptor {
	__u8  iTerminal;
	__u8  iTerminal;
} __attribute__ ((packed));
} __attribute__ ((packed));


#define USB_DT_AC_OUTPUT_TERMINAL_SIZE				9
#define UAC_DT_OUTPUT_TERMINAL_SIZE			9


#define USB_AC_OUTPUT_TERMINAL_UNDEFINED			0x300
/* Terminals - 2.3 Output Terminal Types */
#define USB_AC_OUTPUT_TERMINAL_SPEAKER				0x301
#define UAC_OUTPUT_TERMINAL_UNDEFINED			0x300
#define USB_AC_OUTPUT_TERMINAL_HEADPHONES			0x302
#define UAC_OUTPUT_TERMINAL_SPEAKER			0x301
#define USB_AC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO	0x303
#define UAC_OUTPUT_TERMINAL_HEADPHONES			0x302
#define USB_AC_OUTPUT_TERMINAL_DESKTOP_SPEAKER			0x304
#define UAC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO	0x303
#define USB_AC_OUTPUT_TERMINAL_ROOM_SPEAKER			0x305
#define UAC_OUTPUT_TERMINAL_DESKTOP_SPEAKER		0x304
#define USB_AC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER		0x306
#define UAC_OUTPUT_TERMINAL_ROOM_SPEAKER		0x305
#define USB_AC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER		0x307
#define UAC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER	0x306
#define UAC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER	0x307


/* Set bControlSize = 2 as default setting */
/* Set bControlSize = 2 as default setting */
#define USB_DT_AC_FEATURE_UNIT_SIZE(ch)		(7 + ((ch) + 1) * 2)
#define UAC_DT_FEATURE_UNIT_SIZE(ch)		(7 + ((ch) + 1) * 2)


/* As above, but more useful for defining your own descriptors: */
/* As above, but more useful for defining your own descriptors: */
#define DECLARE_USB_AC_FEATURE_UNIT_DESCRIPTOR(ch) 		\
#define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch) 		\
struct usb_ac_feature_unit_descriptor_##ch {			\
struct uac_feature_unit_descriptor_##ch {			\
	__u8  bLength;						\
	__u8  bLength;						\
	__u8  bDescriptorType;					\
	__u8  bDescriptorType;					\
	__u8  bDescriptorSubtype;				\
	__u8  bDescriptorSubtype;				\
@@ -172,7 +171,7 @@ struct usb_ac_feature_unit_descriptor_##ch { \
} __attribute__ ((packed))
} __attribute__ ((packed))


/* 4.5.2 Class-Specific AS Interface Descriptor */
/* 4.5.2 Class-Specific AS Interface Descriptor */
struct usb_as_header_descriptor {
struct uac_as_header_descriptor {
	__u8  bLength;			/* in bytes: 7 */
	__u8  bLength;			/* in bytes: 7 */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorSubtype;	/* AS_GENERAL */
	__u8  bDescriptorSubtype;	/* AS_GENERAL */
@@ -181,16 +180,17 @@ struct usb_as_header_descriptor {
	__le16 wFormatTag;		/* The Audio Data Format */
	__le16 wFormatTag;		/* The Audio Data Format */
} __attribute__ ((packed));
} __attribute__ ((packed));


#define USB_DT_AS_HEADER_SIZE		7
#define UAC_DT_AS_HEADER_SIZE		7


#define USB_AS_AUDIO_FORMAT_TYPE_I_UNDEFINED	0x0
/* Formats - A.1.1 Audio Data Format Type I Codes */
#define USB_AS_AUDIO_FORMAT_TYPE_I_PCM		0x1
#define UAC_FORMAT_TYPE_I_UNDEFINED	0x0
#define USB_AS_AUDIO_FORMAT_TYPE_I_PCM8		0x2
#define UAC_FORMAT_TYPE_I_PCM		0x1
#define USB_AS_AUDIO_FORMAT_TYPE_I_IEEE_FLOAT	0x3
#define UAC_FORMAT_TYPE_I_PCM8		0x2
#define USB_AS_AUDIO_FORMAT_TYPE_I_ALAW		0x4
#define UAC_FORMAT_TYPE_I_IEEE_FLOAT	0x3
#define USB_AS_AUDIO_FORMAT_TYPE_I_MULAW	0x5
#define UAC_FORMAT_TYPE_I_ALAW		0x4
#define UAC_FORMAT_TYPE_I_MULAW		0x5


struct usb_as_format_type_i_continuous_descriptor {
struct uac_format_type_i_continuous_descriptor {
	__u8  bLength;			/* in bytes: 8 + (ns * 3) */
	__u8  bLength;			/* in bytes: 8 + (ns * 3) */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorSubtype;	/* FORMAT_TYPE */
	__u8  bDescriptorSubtype;	/* FORMAT_TYPE */
@@ -203,9 +203,9 @@ struct usb_as_format_type_i_continuous_descriptor {
	__u8  tUpperSamFreq[3];
	__u8  tUpperSamFreq[3];
} __attribute__ ((packed));
} __attribute__ ((packed));


#define USB_AS_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE	14
#define UAC_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE	14


struct usb_as_formate_type_i_discrete_descriptor {
struct uac_format_type_i_discrete_descriptor {
	__u8  bLength;			/* in bytes: 8 + (ns * 3) */
	__u8  bLength;			/* in bytes: 8 + (ns * 3) */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
	__u8  bDescriptorSubtype;	/* FORMAT_TYPE */
	__u8  bDescriptorSubtype;	/* FORMAT_TYPE */
@@ -217,8 +217,8 @@ struct usb_as_formate_type_i_discrete_descriptor {
	__u8  tSamFreq[][3];
	__u8  tSamFreq[][3];
} __attribute__ ((packed));
} __attribute__ ((packed));


#define DECLARE_USB_AS_FORMAT_TYPE_I_DISCRETE_DESC(n) 		\
#define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n) 		\
struct usb_as_formate_type_i_discrete_descriptor_##n {		\
struct uac_format_type_i_discrete_descriptor_##n {		\
	__u8  bLength;						\
	__u8  bLength;						\
	__u8  bDescriptorType;					\
	__u8  bDescriptorType;					\
	__u8  bDescriptorSubtype;				\
	__u8  bDescriptorSubtype;				\
@@ -230,14 +230,15 @@ struct usb_as_formate_type_i_discrete_descriptor_##n { \
	__u8  tSamFreq[n][3];					\
	__u8  tSamFreq[n][3];					\
} __attribute__ ((packed))
} __attribute__ ((packed))


#define USB_AS_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n)	(8 + (n * 3))
#define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n)	(8 + (n * 3))


#define USB_AS_FORMAT_TYPE_UNDEFINED	0x0
/* Formats - A.2 Format Type Codes */
#define USB_AS_FORMAT_TYPE_I		0x1
#define UAC_FORMAT_TYPE_UNDEFINED	0x0
#define USB_AS_FORMAT_TYPE_II		0x2
#define UAC_FORMAT_TYPE_I		0x1
#define USB_AS_FORMAT_TYPE_III		0x3
#define UAC_FORMAT_TYPE_II		0x2
#define UAC_FORMAT_TYPE_III		0x3


struct usb_as_iso_endpoint_descriptor {
struct uac_iso_endpoint_descriptor {
	__u8  bLength;			/* in bytes: 7 */
	__u8  bLength;			/* in bytes: 7 */
	__u8  bDescriptorType;		/* USB_DT_CS_ENDPOINT */
	__u8  bDescriptorType;		/* USB_DT_CS_ENDPOINT */
	__u8  bDescriptorSubtype;	/* EP_GENERAL */
	__u8  bDescriptorSubtype;	/* EP_GENERAL */
@@ -245,30 +246,35 @@ struct usb_as_iso_endpoint_descriptor {
	__u8  bLockDelayUnits;
	__u8  bLockDelayUnits;
	__le16 wLockDelay;
	__le16 wLockDelay;
};
};
#define USB_AS_ISO_ENDPOINT_DESC_SIZE	7
#define UAC_ISO_ENDPOINT_DESC_SIZE	7


#define FU_CONTROL_UNDEFINED		0x00
#define UAC_EP_CS_ATTR_SAMPLE_RATE	0x01
#define MUTE_CONTROL			0x01
#define UAC_EP_CS_ATTR_PITCH_CONTROL	0x02
#define VOLUME_CONTROL			0x02
#define UAC_EP_CS_ATTR_FILL_MAX		0x80
#define BASS_CONTROL			0x03

#define MID_CONTROL			0x04
/* A.10.2 Feature Unit Control Selectors */
#define TREBLE_CONTROL			0x05
#define UAC_FU_CONTROL_UNDEFINED	0x00
#define GRAPHIC_EQUALIZER_CONTROL	0x06
#define UAC_MUTE_CONTROL		0x01
#define AUTOMATIC_GAIN_CONTROL		0x07
#define UAC_VOLUME_CONTROL		0x02
#define DELAY_CONTROL			0x08
#define UAC_BASS_CONTROL		0x03
#define BASS_BOOST_CONTROL		0x09
#define UAC_MID_CONTROL			0x04
#define LOUDNESS_CONTROL		0x0a
#define UAC_TREBLE_CONTROL		0x05

#define UAC_GRAPHIC_EQUALIZER_CONTROL	0x06
#define FU_MUTE		(1 << (MUTE_CONTROL - 1))
#define UAC_AUTOMATIC_GAIN_CONTROL	0x07
#define FU_VOLUME	(1 << (VOLUME_CONTROL - 1))
#define UAC_DELAY_CONTROL		0x08
#define FU_BASS		(1 << (BASS_CONTROL - 1))
#define UAC_BASS_BOOST_CONTROL		0x09
#define FU_MID		(1 << (MID_CONTROL - 1))
#define UAC_LOUDNESS_CONTROL		0x0a
#define FU_TREBLE	(1 << (TREBLE_CONTROL - 1))

#define FU_GRAPHIC_EQ	(1 << (GRAPHIC_EQUALIZER_CONTROL - 1))
#define UAC_FU_MUTE		(1 << (UAC_MUTE_CONTROL - 1))
#define FU_AUTO_GAIN	(1 << (AUTOMATIC_GAIN_CONTROL - 1))
#define UAC_FU_VOLUME		(1 << (UAC_VOLUME_CONTROL - 1))
#define FU_DELAY	(1 << (DELAY_CONTROL - 1))
#define UAC_FU_BASS		(1 << (UAC_BASS_CONTROL - 1))
#define FU_BASS_BOOST	(1 << (BASS_BOOST_CONTROL - 1))
#define UAC_FU_MID		(1 << (UAC_MID_CONTROL - 1))
#define FU_LOUDNESS	(1 << (LOUDNESS_CONTROL - 1))
#define UAC_FU_TREBLE		(1 << (UAC_TREBLE_CONTROL - 1))
#define UAC_FU_GRAPHIC_EQ	(1 << (UAC_GRAPHIC_EQUALIZER_CONTROL - 1))
#define UAC_FU_AUTO_GAIN	(1 << (UAC_AUTOMATIC_GAIN_CONTROL - 1))
#define UAC_FU_DELAY		(1 << (UAC_DELAY_CONTROL - 1))
#define UAC_FU_BASS_BOOST	(1 << (UAC_BASS_BOOST_CONTROL - 1))
#define UAC_FU_LOUDNESS		(1 << (UAC_LOUDNESS_CONTROL - 1))


struct usb_audio_control {
struct usb_audio_control {
	struct list_head list;
	struct list_head list;