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