xref: /OK3568_Linux_fs/kernel/include/linux/usb/audio-v2.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2010 Daniel Mack <daniel@caiaq.de>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This software is distributed under the terms of the GNU General Public
6*4882a593Smuzhiyun  * License ("GPL") version 2, as published by the Free Software Foundation.
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * This file holds USB constants and structures defined
9*4882a593Smuzhiyun  * by the USB Device Class Definition for Audio Devices in version 2.0.
10*4882a593Smuzhiyun  * Comments below reference relevant sections of the documents contained
11*4882a593Smuzhiyun  * in http://www.usb.org/developers/devclass_docs/Audio2.0_final.zip
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifndef __LINUX_USB_AUDIO_V2_H
15*4882a593Smuzhiyun #define __LINUX_USB_AUDIO_V2_H
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <linux/types.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* v1.0 and v2.0 of this standard have many things in common. For the rest
20*4882a593Smuzhiyun  * of the definitions, please refer to audio.h */
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /*
23*4882a593Smuzhiyun  * bmControl field decoders
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  * From the USB Audio spec v2.0:
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  *   bmaControls() is a (ch+1)-element array of 4-byte bitmaps,
28*4882a593Smuzhiyun  *   each containing a set of bit pairs. If a Control is present,
29*4882a593Smuzhiyun  *   it must be Host readable. If a certain Control is not
30*4882a593Smuzhiyun  *   present then the bit pair must be set to 0b00.
31*4882a593Smuzhiyun  *   If a Control is present but read-only, the bit pair must be
32*4882a593Smuzhiyun  *   set to 0b01. If a Control is also Host programmable, the bit
33*4882a593Smuzhiyun  *   pair must be set to 0b11. The value 0b10 is not allowed.
34*4882a593Smuzhiyun  *
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun 
uac_v2v3_control_is_readable(u32 bmControls,u8 control)37*4882a593Smuzhiyun static inline bool uac_v2v3_control_is_readable(u32 bmControls, u8 control)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	return (bmControls >> ((control - 1) * 2)) & 0x1;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
uac_v2v3_control_is_writeable(u32 bmControls,u8 control)42*4882a593Smuzhiyun static inline bool uac_v2v3_control_is_writeable(u32 bmControls, u8 control)
43*4882a593Smuzhiyun {
44*4882a593Smuzhiyun 	return (bmControls >> ((control - 1) * 2)) & 0x2;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* 4.7.2 Class-Specific AC Interface Descriptor */
48*4882a593Smuzhiyun struct uac2_ac_header_descriptor {
49*4882a593Smuzhiyun 	__u8  bLength;			/* 9 */
50*4882a593Smuzhiyun 	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
51*4882a593Smuzhiyun 	__u8  bDescriptorSubtype;	/* UAC_MS_HEADER */
52*4882a593Smuzhiyun 	__le16 bcdADC;			/* 0x0200 */
53*4882a593Smuzhiyun 	__u8  bCategory;
54*4882a593Smuzhiyun 	__le16 wTotalLength;		/* includes Unit and Terminal desc. */
55*4882a593Smuzhiyun 	__u8  bmControls;
56*4882a593Smuzhiyun } __packed;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* 2.3.1.6 Type I Format Type Descriptor (Frmts20 final.pdf)*/
59*4882a593Smuzhiyun struct uac2_format_type_i_descriptor {
60*4882a593Smuzhiyun 	__u8  bLength;			/* in bytes: 6 */
61*4882a593Smuzhiyun 	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
62*4882a593Smuzhiyun 	__u8  bDescriptorSubtype;	/* FORMAT_TYPE */
63*4882a593Smuzhiyun 	__u8  bFormatType;		/* FORMAT_TYPE_1 */
64*4882a593Smuzhiyun 	__u8  bSubslotSize;		/* {1,2,3,4} */
65*4882a593Smuzhiyun 	__u8  bBitResolution;
66*4882a593Smuzhiyun } __packed;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* 4.7.2.1 Clock Source Descriptor */
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun struct uac_clock_source_descriptor {
71*4882a593Smuzhiyun 	__u8 bLength;
72*4882a593Smuzhiyun 	__u8 bDescriptorType;
73*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
74*4882a593Smuzhiyun 	__u8 bClockID;
75*4882a593Smuzhiyun 	__u8 bmAttributes;
76*4882a593Smuzhiyun 	__u8 bmControls;
77*4882a593Smuzhiyun 	__u8 bAssocTerminal;
78*4882a593Smuzhiyun 	__u8 iClockSource;
79*4882a593Smuzhiyun } __attribute__((packed));
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /* bmAttribute fields */
82*4882a593Smuzhiyun #define UAC_CLOCK_SOURCE_TYPE_EXT	0x0
83*4882a593Smuzhiyun #define UAC_CLOCK_SOURCE_TYPE_INT_FIXED	0x1
84*4882a593Smuzhiyun #define UAC_CLOCK_SOURCE_TYPE_INT_VAR	0x2
85*4882a593Smuzhiyun #define UAC_CLOCK_SOURCE_TYPE_INT_PROG	0x3
86*4882a593Smuzhiyun #define UAC_CLOCK_SOURCE_SYNCED_TO_SOF	(1 << 2)
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /* 4.7.2.2 Clock Source Descriptor */
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun struct uac_clock_selector_descriptor {
91*4882a593Smuzhiyun 	__u8 bLength;
92*4882a593Smuzhiyun 	__u8 bDescriptorType;
93*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
94*4882a593Smuzhiyun 	__u8 bClockID;
95*4882a593Smuzhiyun 	__u8 bNrInPins;
96*4882a593Smuzhiyun 	__u8 baCSourceID[];
97*4882a593Smuzhiyun 	/* bmControls and iClockSource omitted */
98*4882a593Smuzhiyun } __attribute__((packed));
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /* 4.7.2.3 Clock Multiplier Descriptor */
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct uac_clock_multiplier_descriptor {
103*4882a593Smuzhiyun 	__u8 bLength;
104*4882a593Smuzhiyun 	__u8 bDescriptorType;
105*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
106*4882a593Smuzhiyun 	__u8 bClockID;
107*4882a593Smuzhiyun 	__u8 bCSourceID;
108*4882a593Smuzhiyun 	__u8 bmControls;
109*4882a593Smuzhiyun 	__u8 iClockMultiplier;
110*4882a593Smuzhiyun } __attribute__((packed));
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /* 4.7.2.4 Input terminal descriptor */
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun struct uac2_input_terminal_descriptor {
115*4882a593Smuzhiyun 	__u8 bLength;
116*4882a593Smuzhiyun 	__u8 bDescriptorType;
117*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
118*4882a593Smuzhiyun 	__u8 bTerminalID;
119*4882a593Smuzhiyun 	__le16 wTerminalType;
120*4882a593Smuzhiyun 	__u8 bAssocTerminal;
121*4882a593Smuzhiyun 	__u8 bCSourceID;
122*4882a593Smuzhiyun 	__u8 bNrChannels;
123*4882a593Smuzhiyun 	__le32 bmChannelConfig;
124*4882a593Smuzhiyun 	__u8 iChannelNames;
125*4882a593Smuzhiyun 	__le16 bmControls;
126*4882a593Smuzhiyun 	__u8 iTerminal;
127*4882a593Smuzhiyun } __attribute__((packed));
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /* 4.7.2.5 Output terminal descriptor */
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun struct uac2_output_terminal_descriptor {
132*4882a593Smuzhiyun 	__u8 bLength;
133*4882a593Smuzhiyun 	__u8 bDescriptorType;
134*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
135*4882a593Smuzhiyun 	__u8 bTerminalID;
136*4882a593Smuzhiyun 	__le16 wTerminalType;
137*4882a593Smuzhiyun 	__u8 bAssocTerminal;
138*4882a593Smuzhiyun 	__u8 bSourceID;
139*4882a593Smuzhiyun 	__u8 bCSourceID;
140*4882a593Smuzhiyun 	__le16 bmControls;
141*4882a593Smuzhiyun 	__u8 iTerminal;
142*4882a593Smuzhiyun } __attribute__((packed));
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* 4.7.2.8 Feature Unit Descriptor */
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun struct uac2_feature_unit_descriptor {
149*4882a593Smuzhiyun 	__u8 bLength;
150*4882a593Smuzhiyun 	__u8 bDescriptorType;
151*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
152*4882a593Smuzhiyun 	__u8 bUnitID;
153*4882a593Smuzhiyun 	__u8 bSourceID;
154*4882a593Smuzhiyun 	/* bmaControls is actually u32,
155*4882a593Smuzhiyun 	 * but u8 is needed for the hybrid parser */
156*4882a593Smuzhiyun 	__u8 bmaControls[]; /* variable length */
157*4882a593Smuzhiyun } __attribute__((packed));
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define UAC2_DT_FEATURE_UNIT_SIZE(ch)		(6 + ((ch) + 1) * 4)
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /* As above, but more useful for defining your own descriptors: */
162*4882a593Smuzhiyun #define DECLARE_UAC2_FEATURE_UNIT_DESCRIPTOR(ch)		\
163*4882a593Smuzhiyun struct uac2_feature_unit_descriptor_##ch {			\
164*4882a593Smuzhiyun 	__u8  bLength;						\
165*4882a593Smuzhiyun 	__u8  bDescriptorType;					\
166*4882a593Smuzhiyun 	__u8  bDescriptorSubtype;				\
167*4882a593Smuzhiyun 	__u8  bUnitID;						\
168*4882a593Smuzhiyun 	__u8  bSourceID;					\
169*4882a593Smuzhiyun 	__le32 bmaControls[ch + 1];				\
170*4882a593Smuzhiyun 	__u8  iFeature;						\
171*4882a593Smuzhiyun } __packed
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /* 4.7.2.10 Effect Unit Descriptor */
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun struct uac2_effect_unit_descriptor {
176*4882a593Smuzhiyun 	__u8 bLength;
177*4882a593Smuzhiyun 	__u8 bDescriptorType;
178*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
179*4882a593Smuzhiyun 	__u8 bUnitID;
180*4882a593Smuzhiyun 	__le16 wEffectType;
181*4882a593Smuzhiyun 	__u8 bSourceID;
182*4882a593Smuzhiyun 	__u8 bmaControls[]; /* variable length */
183*4882a593Smuzhiyun } __attribute__((packed));
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /* 4.9.2 Class-Specific AS Interface Descriptor */
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun struct uac2_as_header_descriptor {
188*4882a593Smuzhiyun 	__u8 bLength;
189*4882a593Smuzhiyun 	__u8 bDescriptorType;
190*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
191*4882a593Smuzhiyun 	__u8 bTerminalLink;
192*4882a593Smuzhiyun 	__u8 bmControls;
193*4882a593Smuzhiyun 	__u8 bFormatType;
194*4882a593Smuzhiyun 	__le32 bmFormats;
195*4882a593Smuzhiyun 	__u8 bNrChannels;
196*4882a593Smuzhiyun 	__le32 bmChannelConfig;
197*4882a593Smuzhiyun 	__u8 iChannelNames;
198*4882a593Smuzhiyun } __attribute__((packed));
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun #define UAC2_FORMAT_TYPE_I_RAW_DATA	(1 << 31)
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun /* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun struct uac2_iso_endpoint_descriptor {
205*4882a593Smuzhiyun 	__u8  bLength;			/* in bytes: 8 */
206*4882a593Smuzhiyun 	__u8  bDescriptorType;		/* USB_DT_CS_ENDPOINT */
207*4882a593Smuzhiyun 	__u8  bDescriptorSubtype;	/* EP_GENERAL */
208*4882a593Smuzhiyun 	__u8  bmAttributes;
209*4882a593Smuzhiyun 	__u8  bmControls;
210*4882a593Smuzhiyun 	__u8  bLockDelayUnits;
211*4882a593Smuzhiyun 	__le16 wLockDelay;
212*4882a593Smuzhiyun } __attribute__((packed));
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun #define UAC2_CONTROL_PITCH		(3 << 0)
215*4882a593Smuzhiyun #define UAC2_CONTROL_DATA_OVERRUN	(3 << 2)
216*4882a593Smuzhiyun #define UAC2_CONTROL_DATA_UNDERRUN	(3 << 4)
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /* 5.2.5.4.2 Connector Control Parameter Block */
219*4882a593Smuzhiyun struct uac2_connectors_ctl_blk {
220*4882a593Smuzhiyun 	__u8 bNrChannels;
221*4882a593Smuzhiyun 	__le32 bmChannelConfig;
222*4882a593Smuzhiyun 	__u8 iChannelNames;
223*4882a593Smuzhiyun } __attribute__((packed));
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun /* 6.1 Interrupt Data Message */
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun #define UAC2_INTERRUPT_DATA_MSG_VENDOR	(1 << 0)
228*4882a593Smuzhiyun #define UAC2_INTERRUPT_DATA_MSG_EP	(1 << 1)
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun struct uac2_interrupt_data_msg {
231*4882a593Smuzhiyun 	__u8 bInfo;
232*4882a593Smuzhiyun 	__u8 bAttribute;
233*4882a593Smuzhiyun 	__le16 wValue;
234*4882a593Smuzhiyun 	__le16 wIndex;
235*4882a593Smuzhiyun } __attribute__((packed));
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /* A.7 Audio Function Category Codes */
238*4882a593Smuzhiyun #define UAC2_FUNCTION_SUBCLASS_UNDEFINED	0x00
239*4882a593Smuzhiyun #define UAC2_FUNCTION_DESKTOP_SPEAKER		0x01
240*4882a593Smuzhiyun #define UAC2_FUNCTION_HOME_THEATER		0x02
241*4882a593Smuzhiyun #define UAC2_FUNCTION_MICROPHONE		0x03
242*4882a593Smuzhiyun #define UAC2_FUNCTION_HEADSET			0x04
243*4882a593Smuzhiyun #define UAC2_FUNCTION_TELEPHONE			0x05
244*4882a593Smuzhiyun #define UAC2_FUNCTION_CONVERTER			0x06
245*4882a593Smuzhiyun #define UAC2_FUNCTION_SOUND_RECORDER		0x07
246*4882a593Smuzhiyun #define UAC2_FUNCTION_IO_BOX			0x08
247*4882a593Smuzhiyun #define UAC2_FUNCTION_MUSICAL_INSTRUMENT	0x09
248*4882a593Smuzhiyun #define UAC2_FUNCTION_PRO_AUDIO			0x0a
249*4882a593Smuzhiyun #define UAC2_FUNCTION_AUDIO_VIDEO		0x0b
250*4882a593Smuzhiyun #define UAC2_FUNCTION_CONTROL_PANEL		0x0c
251*4882a593Smuzhiyun #define UAC2_FUNCTION_OTHER			0xff
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun /* A.9 Audio Class-Specific AC Interface Descriptor Subtypes */
254*4882a593Smuzhiyun /* see audio.h for the rest, which is identical to v1 */
255*4882a593Smuzhiyun #define UAC2_EFFECT_UNIT			0x07
256*4882a593Smuzhiyun #define UAC2_PROCESSING_UNIT_V2		0x08
257*4882a593Smuzhiyun #define UAC2_EXTENSION_UNIT_V2		0x09
258*4882a593Smuzhiyun #define UAC2_CLOCK_SOURCE		0x0a
259*4882a593Smuzhiyun #define UAC2_CLOCK_SELECTOR		0x0b
260*4882a593Smuzhiyun #define UAC2_CLOCK_MULTIPLIER		0x0c
261*4882a593Smuzhiyun #define UAC2_SAMPLE_RATE_CONVERTER	0x0d
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun /* A.10 Audio Class-Specific AS Interface Descriptor Subtypes */
264*4882a593Smuzhiyun /* see audio.h for the rest, which is identical to v1 */
265*4882a593Smuzhiyun #define UAC2_ENCODER			0x03
266*4882a593Smuzhiyun #define UAC2_DECODER			0x04
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun /* A.11 Effect Unit Effect Types */
269*4882a593Smuzhiyun #define UAC2_EFFECT_UNDEFINED		0x00
270*4882a593Smuzhiyun #define UAC2_EFFECT_PARAM_EQ		0x01
271*4882a593Smuzhiyun #define UAC2_EFFECT_REVERB		0x02
272*4882a593Smuzhiyun #define UAC2_EFFECT_MOD_DELAY		0x03
273*4882a593Smuzhiyun #define UAC2_EFFECT_DYN_RANGE_COMP	0x04
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun /* A.12 Processing Unit Process Types */
276*4882a593Smuzhiyun #define UAC2_PROCESS_UNDEFINED		0x00
277*4882a593Smuzhiyun #define UAC2_PROCESS_UP_DOWNMIX		0x01
278*4882a593Smuzhiyun #define UAC2_PROCESS_DOLBY_PROLOCIC	0x02
279*4882a593Smuzhiyun #define UAC2_PROCESS_STEREO_EXTENDER	0x03
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun /* A.14 Audio Class-Specific Request Codes */
282*4882a593Smuzhiyun #define UAC2_CS_CUR			0x01
283*4882a593Smuzhiyun #define UAC2_CS_RANGE			0x02
284*4882a593Smuzhiyun #define UAC2_CS_MEM			0x03
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun /* A.15 Encoder Type Codes */
287*4882a593Smuzhiyun #define UAC2_ENCODER_UNDEFINED		0x00
288*4882a593Smuzhiyun #define UAC2_ENCODER_OTHER		0x01
289*4882a593Smuzhiyun #define UAC2_ENCODER_MPEG		0x02
290*4882a593Smuzhiyun #define UAC2_ENCODER_AC3		0x03
291*4882a593Smuzhiyun #define UAC2_ENCODER_WMA		0x04
292*4882a593Smuzhiyun #define UAC2_ENCODER_DTS		0x05
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun /* A.16 Decoder Type Codes */
295*4882a593Smuzhiyun #define UAC2_DECODER_UNDEFINED		0x00
296*4882a593Smuzhiyun #define UAC2_DECODER_OTHER		0x01
297*4882a593Smuzhiyun #define UAC2_DECODER_MPEG		0x02
298*4882a593Smuzhiyun #define UAC2_DECODER_AC3		0x03
299*4882a593Smuzhiyun #define UAC2_DECODER_WMA		0x04
300*4882a593Smuzhiyun #define UAC2_DECODER_DTS		0x05
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun /* A.17.1 Clock Source Control Selectors */
303*4882a593Smuzhiyun #define UAC2_CS_UNDEFINED		0x00
304*4882a593Smuzhiyun #define UAC2_CS_CONTROL_SAM_FREQ	0x01
305*4882a593Smuzhiyun #define UAC2_CS_CONTROL_CLOCK_VALID	0x02
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun /* A.17.2 Clock Selector Control Selectors */
308*4882a593Smuzhiyun #define UAC2_CX_UNDEFINED		0x00
309*4882a593Smuzhiyun #define UAC2_CX_CLOCK_SELECTOR		0x01
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /* A.17.3 Clock Multiplier Control Selectors */
312*4882a593Smuzhiyun #define UAC2_CM_UNDEFINED		0x00
313*4882a593Smuzhiyun #define UAC2_CM_NUMERATOR		0x01
314*4882a593Smuzhiyun #define UAC2_CM_DENOMINTATOR		0x02
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun /* A.17.4 Terminal Control Selectors */
317*4882a593Smuzhiyun #define UAC2_TE_UNDEFINED		0x00
318*4882a593Smuzhiyun #define UAC2_TE_COPY_PROTECT		0x01
319*4882a593Smuzhiyun #define UAC2_TE_CONNECTOR		0x02
320*4882a593Smuzhiyun #define UAC2_TE_OVERLOAD		0x03
321*4882a593Smuzhiyun #define UAC2_TE_CLUSTER			0x04
322*4882a593Smuzhiyun #define UAC2_TE_UNDERFLOW		0x05
323*4882a593Smuzhiyun #define UAC2_TE_OVERFLOW		0x06
324*4882a593Smuzhiyun #define UAC2_TE_LATENCY			0x07
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /* A.17.5 Mixer Control Selectors */
327*4882a593Smuzhiyun #define UAC2_MU_UNDEFINED		0x00
328*4882a593Smuzhiyun #define UAC2_MU_MIXER			0x01
329*4882a593Smuzhiyun #define UAC2_MU_CLUSTER			0x02
330*4882a593Smuzhiyun #define UAC2_MU_UNDERFLOW		0x03
331*4882a593Smuzhiyun #define UAC2_MU_OVERFLOW		0x04
332*4882a593Smuzhiyun #define UAC2_MU_LATENCY			0x05
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun /* A.17.6 Selector Control Selectors */
335*4882a593Smuzhiyun #define UAC2_SU_UNDEFINED		0x00
336*4882a593Smuzhiyun #define UAC2_SU_SELECTOR		0x01
337*4882a593Smuzhiyun #define UAC2_SU_LATENCY			0x02
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /* A.17.7 Feature Unit Control Selectors */
340*4882a593Smuzhiyun /* see audio.h for the rest, which is identical to v1 */
341*4882a593Smuzhiyun #define UAC2_FU_INPUT_GAIN		0x0b
342*4882a593Smuzhiyun #define UAC2_FU_INPUT_GAIN_PAD		0x0c
343*4882a593Smuzhiyun #define UAC2_FU_PHASE_INVERTER		0x0d
344*4882a593Smuzhiyun #define UAC2_FU_UNDERFLOW		0x0e
345*4882a593Smuzhiyun #define UAC2_FU_OVERFLOW		0x0f
346*4882a593Smuzhiyun #define UAC2_FU_LATENCY			0x10
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun /* A.17.8.1 Parametric Equalizer Section Effect Unit Control Selectors */
349*4882a593Smuzhiyun #define UAC2_PE_UNDEFINED		0x00
350*4882a593Smuzhiyun #define UAC2_PE_ENABLE			0x01
351*4882a593Smuzhiyun #define UAC2_PE_CENTERFREQ		0x02
352*4882a593Smuzhiyun #define UAC2_PE_QFACTOR			0x03
353*4882a593Smuzhiyun #define UAC2_PE_GAIN			0x04
354*4882a593Smuzhiyun #define UAC2_PE_UNDERFLOW		0x05
355*4882a593Smuzhiyun #define UAC2_PE_OVERFLOW		0x06
356*4882a593Smuzhiyun #define UAC2_PE_LATENCY			0x07
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun /* A.17.8.2 Reverberation Effect Unit Control Selectors */
359*4882a593Smuzhiyun #define UAC2_RV_UNDEFINED		0x00
360*4882a593Smuzhiyun #define UAC2_RV_ENABLE			0x01
361*4882a593Smuzhiyun #define UAC2_RV_TYPE			0x02
362*4882a593Smuzhiyun #define UAC2_RV_LEVEL			0x03
363*4882a593Smuzhiyun #define UAC2_RV_TIME			0x04
364*4882a593Smuzhiyun #define UAC2_RV_FEEDBACK		0x05
365*4882a593Smuzhiyun #define UAC2_RV_PREDELAY		0x06
366*4882a593Smuzhiyun #define UAC2_RV_DENSITY			0x07
367*4882a593Smuzhiyun #define UAC2_RV_HIFREQ_ROLLOFF		0x08
368*4882a593Smuzhiyun #define UAC2_RV_UNDERFLOW		0x09
369*4882a593Smuzhiyun #define UAC2_RV_OVERFLOW		0x0a
370*4882a593Smuzhiyun #define UAC2_RV_LATENCY			0x0b
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun /* A.17.8.3 Modulation Delay Effect Control Selectors */
373*4882a593Smuzhiyun #define UAC2_MD_UNDEFINED		0x00
374*4882a593Smuzhiyun #define UAC2_MD_ENABLE			0x01
375*4882a593Smuzhiyun #define UAC2_MD_BALANCE			0x02
376*4882a593Smuzhiyun #define UAC2_MD_RATE			0x03
377*4882a593Smuzhiyun #define UAC2_MD_DEPTH			0x04
378*4882a593Smuzhiyun #define UAC2_MD_TIME			0x05
379*4882a593Smuzhiyun #define UAC2_MD_FEEDBACK		0x06
380*4882a593Smuzhiyun #define UAC2_MD_UNDERFLOW		0x07
381*4882a593Smuzhiyun #define UAC2_MD_OVERFLOW		0x08
382*4882a593Smuzhiyun #define UAC2_MD_LATENCY			0x09
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun /* A.17.8.4 Dynamic Range Compressor Effect Unit Control Selectors */
385*4882a593Smuzhiyun #define UAC2_DR_UNDEFINED		0x00
386*4882a593Smuzhiyun #define UAC2_DR_ENABLE			0x01
387*4882a593Smuzhiyun #define UAC2_DR_COMPRESSION_RATE	0x02
388*4882a593Smuzhiyun #define UAC2_DR_MAXAMPL			0x03
389*4882a593Smuzhiyun #define UAC2_DR_THRESHOLD		0x04
390*4882a593Smuzhiyun #define UAC2_DR_ATTACK_TIME		0x05
391*4882a593Smuzhiyun #define UAC2_DR_RELEASE_TIME		0x06
392*4882a593Smuzhiyun #define UAC2_DR_UNDEFLOW		0x07
393*4882a593Smuzhiyun #define UAC2_DR_OVERFLOW		0x08
394*4882a593Smuzhiyun #define UAC2_DR_LATENCY			0x09
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun /* A.17.9.1 Up/Down-mix Processing Unit Control Selectors */
397*4882a593Smuzhiyun #define UAC2_UD_UNDEFINED		0x00
398*4882a593Smuzhiyun #define UAC2_UD_ENABLE			0x01
399*4882a593Smuzhiyun #define UAC2_UD_MODE_SELECT		0x02
400*4882a593Smuzhiyun #define UAC2_UD_CLUSTER			0x03
401*4882a593Smuzhiyun #define UAC2_UD_UNDERFLOW		0x04
402*4882a593Smuzhiyun #define UAC2_UD_OVERFLOW		0x05
403*4882a593Smuzhiyun #define UAC2_UD_LATENCY			0x06
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun /* A.17.9.2 Dolby Prologic[tm] Processing Unit Control Selectors */
406*4882a593Smuzhiyun #define UAC2_DP_UNDEFINED		0x00
407*4882a593Smuzhiyun #define UAC2_DP_ENABLE			0x01
408*4882a593Smuzhiyun #define UAC2_DP_MODE_SELECT		0x02
409*4882a593Smuzhiyun #define UAC2_DP_CLUSTER			0x03
410*4882a593Smuzhiyun #define UAC2_DP_UNDERFFLOW		0x04
411*4882a593Smuzhiyun #define UAC2_DP_OVERFLOW		0x05
412*4882a593Smuzhiyun #define UAC2_DP_LATENCY			0x06
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun /* A.17.9.3 Stereo Expander Processing Unit Control Selectors */
415*4882a593Smuzhiyun #define UAC2_ST_EXT_UNDEFINED		0x00
416*4882a593Smuzhiyun #define UAC2_ST_EXT_ENABLE		0x01
417*4882a593Smuzhiyun #define UAC2_ST_EXT_WIDTH		0x02
418*4882a593Smuzhiyun #define UAC2_ST_EXT_UNDEFLOW		0x03
419*4882a593Smuzhiyun #define UAC2_ST_EXT_OVERFLOW		0x04
420*4882a593Smuzhiyun #define UAC2_ST_EXT_LATENCY		0x05
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun /* A.17.10 Extension Unit Control Selectors */
423*4882a593Smuzhiyun #define UAC2_XU_UNDEFINED		0x00
424*4882a593Smuzhiyun #define UAC2_XU_ENABLE			0x01
425*4882a593Smuzhiyun #define UAC2_XU_CLUSTER			0x02
426*4882a593Smuzhiyun #define UAC2_XU_UNDERFLOW		0x03
427*4882a593Smuzhiyun #define UAC2_XU_OVERFLOW		0x04
428*4882a593Smuzhiyun #define UAC2_XU_LATENCY			0x05
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun /* A.17.11 AudioStreaming Interface Control Selectors */
431*4882a593Smuzhiyun #define UAC2_AS_UNDEFINED		0x00
432*4882a593Smuzhiyun #define UAC2_AS_ACT_ALT_SETTING		0x01
433*4882a593Smuzhiyun #define UAC2_AS_VAL_ALT_SETTINGS	0x02
434*4882a593Smuzhiyun #define UAC2_AS_AUDIO_DATA_FORMAT	0x03
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun /* A.17.12 Encoder Control Selectors */
437*4882a593Smuzhiyun #define UAC2_EN_UNDEFINED		0x00
438*4882a593Smuzhiyun #define UAC2_EN_BIT_RATE		0x01
439*4882a593Smuzhiyun #define UAC2_EN_QUALITY			0x02
440*4882a593Smuzhiyun #define UAC2_EN_VBR			0x03
441*4882a593Smuzhiyun #define UAC2_EN_TYPE			0x04
442*4882a593Smuzhiyun #define UAC2_EN_UNDERFLOW		0x05
443*4882a593Smuzhiyun #define UAC2_EN_OVERFLOW		0x06
444*4882a593Smuzhiyun #define UAC2_EN_ENCODER_ERROR		0x07
445*4882a593Smuzhiyun #define UAC2_EN_PARAM1			0x08
446*4882a593Smuzhiyun #define UAC2_EN_PARAM2			0x09
447*4882a593Smuzhiyun #define UAC2_EN_PARAM3			0x0a
448*4882a593Smuzhiyun #define UAC2_EN_PARAM4			0x0b
449*4882a593Smuzhiyun #define UAC2_EN_PARAM5			0x0c
450*4882a593Smuzhiyun #define UAC2_EN_PARAM6			0x0d
451*4882a593Smuzhiyun #define UAC2_EN_PARAM7			0x0e
452*4882a593Smuzhiyun #define UAC2_EN_PARAM8			0x0f
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun /* A.17.13.1 MPEG Decoder Control Selectors */
455*4882a593Smuzhiyun #define UAC2_MPEG_UNDEFINED		0x00
456*4882a593Smuzhiyun #define UAC2_MPEG_DUAL_CHANNEL		0x01
457*4882a593Smuzhiyun #define UAC2_MPEG_SECOND_STEREO		0x02
458*4882a593Smuzhiyun #define UAC2_MPEG_MULTILINGUAL		0x03
459*4882a593Smuzhiyun #define UAC2_MPEG_DYN_RANGE		0x04
460*4882a593Smuzhiyun #define UAC2_MPEG_SCALING		0x05
461*4882a593Smuzhiyun #define UAC2_MPEG_HILO_SCALING		0x06
462*4882a593Smuzhiyun #define UAC2_MPEG_UNDERFLOW		0x07
463*4882a593Smuzhiyun #define UAC2_MPEG_OVERFLOW		0x08
464*4882a593Smuzhiyun #define UAC2_MPEG_DECODER_ERROR		0x09
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun /* A17.13.2 AC3 Decoder Control Selectors */
467*4882a593Smuzhiyun #define UAC2_AC3_UNDEFINED		0x00
468*4882a593Smuzhiyun #define UAC2_AC3_MODE			0x01
469*4882a593Smuzhiyun #define UAC2_AC3_DYN_RANGE		0x02
470*4882a593Smuzhiyun #define UAC2_AC3_SCALING		0x03
471*4882a593Smuzhiyun #define UAC2_AC3_HILO_SCALING		0x04
472*4882a593Smuzhiyun #define UAC2_AC3_UNDERFLOW		0x05
473*4882a593Smuzhiyun #define UAC2_AC3_OVERFLOW		0x06
474*4882a593Smuzhiyun #define UAC2_AC3_DECODER_ERROR		0x07
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun /* A17.13.3 WMA Decoder Control Selectors */
477*4882a593Smuzhiyun #define UAC2_WMA_UNDEFINED		0x00
478*4882a593Smuzhiyun #define UAC2_WMA_UNDERFLOW		0x01
479*4882a593Smuzhiyun #define UAC2_WMA_OVERFLOW		0x02
480*4882a593Smuzhiyun #define UAC2_WMA_DECODER_ERROR		0x03
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun /* A17.13.4 DTS Decoder Control Selectors */
483*4882a593Smuzhiyun #define UAC2_DTS_UNDEFINED		0x00
484*4882a593Smuzhiyun #define UAC2_DTS_UNDERFLOW		0x01
485*4882a593Smuzhiyun #define UAC2_DTS_OVERFLOW		0x02
486*4882a593Smuzhiyun #define UAC2_DTS_DECODER_ERROR		0x03
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun /* A17.14 Endpoint Control Selectors */
489*4882a593Smuzhiyun #define UAC2_EP_CS_UNDEFINED		0x00
490*4882a593Smuzhiyun #define UAC2_EP_CS_PITCH		0x01
491*4882a593Smuzhiyun #define UAC2_EP_CS_DATA_OVERRUN		0x02
492*4882a593Smuzhiyun #define UAC2_EP_CS_DATA_UNDERRUN	0x03
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun #endif /* __LINUX_USB_AUDIO_V2_H */
495*4882a593Smuzhiyun 
496