xref: /OK3568_Linux_fs/kernel/include/linux/usb/audio-v3.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2017 Ruslan Bilovol <ruslan.bilovol@gmail.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This file holds USB constants and structures defined
6*4882a593Smuzhiyun  * by the USB DEVICE CLASS DEFINITION FOR AUDIO DEVICES Release 3.0.
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef __LINUX_USB_AUDIO_V3_H
10*4882a593Smuzhiyun #define __LINUX_USB_AUDIO_V3_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/types.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun  * v1.0, v2.0 and v3.0 of this standard have many things in common. For the rest
16*4882a593Smuzhiyun  * of the definitions, please refer to audio.h and audio-v2.h
17*4882a593Smuzhiyun  */
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* All High Capability descriptors have these 2 fields at the beginning */
20*4882a593Smuzhiyun struct uac3_hc_descriptor_header {
21*4882a593Smuzhiyun 	__le16 wLength;
22*4882a593Smuzhiyun 	__u8 bDescriptorType;
23*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
24*4882a593Smuzhiyun 	__le16 wDescriptorID;
25*4882a593Smuzhiyun } __attribute__ ((packed));
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /* 4.3.1 CLUSTER DESCRIPTOR HEADER */
28*4882a593Smuzhiyun struct uac3_cluster_header_descriptor {
29*4882a593Smuzhiyun 	__le16 wLength;
30*4882a593Smuzhiyun 	__u8 bDescriptorType;
31*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
32*4882a593Smuzhiyun 	__le16 wDescriptorID;
33*4882a593Smuzhiyun 	__u8 bNrChannels;
34*4882a593Smuzhiyun } __attribute__ ((packed));
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* 4.3.2.1 SEGMENTS */
37*4882a593Smuzhiyun struct uac3_cluster_segment_descriptor {
38*4882a593Smuzhiyun 	__le16 wLength;
39*4882a593Smuzhiyun 	__u8 bSegmentType;
40*4882a593Smuzhiyun 	/* __u8[0]; segment-specific data */
41*4882a593Smuzhiyun } __attribute__ ((packed));
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /* 4.3.2.1.1 END SEGMENT */
44*4882a593Smuzhiyun struct uac3_cluster_end_segment_descriptor {
45*4882a593Smuzhiyun 	__le16 wLength;
46*4882a593Smuzhiyun 	__u8 bSegmentType;		/* Constant END_SEGMENT */
47*4882a593Smuzhiyun } __attribute__ ((packed));
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun /* 4.3.2.1.3.1 INFORMATION SEGMENT */
50*4882a593Smuzhiyun struct uac3_cluster_information_segment_descriptor {
51*4882a593Smuzhiyun 	__le16 wLength;
52*4882a593Smuzhiyun 	__u8 bSegmentType;
53*4882a593Smuzhiyun 	__u8 bChPurpose;
54*4882a593Smuzhiyun 	__u8 bChRelationship;
55*4882a593Smuzhiyun 	__u8 bChGroupID;
56*4882a593Smuzhiyun } __attribute__ ((packed));
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* 4.5.2 CLASS-SPECIFIC AC INTERFACE DESCRIPTOR */
59*4882a593Smuzhiyun struct uac3_ac_header_descriptor {
60*4882a593Smuzhiyun 	__u8 bLength;			/* 10 */
61*4882a593Smuzhiyun 	__u8 bDescriptorType;		/* CS_INTERFACE descriptor type */
62*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;	/* HEADER descriptor subtype */
63*4882a593Smuzhiyun 	__u8 bCategory;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	/* includes Clock Source, Unit, Terminal, and Power Domain desc. */
66*4882a593Smuzhiyun 	__le16 wTotalLength;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	__le32 bmControls;
69*4882a593Smuzhiyun } __attribute__ ((packed));
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun /* 4.5.2.1 INPUT TERMINAL DESCRIPTOR */
72*4882a593Smuzhiyun struct uac3_input_terminal_descriptor {
73*4882a593Smuzhiyun 	__u8 bLength;
74*4882a593Smuzhiyun 	__u8 bDescriptorType;
75*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
76*4882a593Smuzhiyun 	__u8 bTerminalID;
77*4882a593Smuzhiyun 	__le16 wTerminalType;
78*4882a593Smuzhiyun 	__u8 bAssocTerminal;
79*4882a593Smuzhiyun 	__u8 bCSourceID;
80*4882a593Smuzhiyun 	__le32 bmControls;
81*4882a593Smuzhiyun 	__le16 wClusterDescrID;
82*4882a593Smuzhiyun 	__le16 wExTerminalDescrID;
83*4882a593Smuzhiyun 	__le16 wConnectorsDescrID;
84*4882a593Smuzhiyun 	__le16 wTerminalDescrStr;
85*4882a593Smuzhiyun } __attribute__((packed));
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /* 4.5.2.2 OUTPUT TERMINAL DESCRIPTOR */
88*4882a593Smuzhiyun struct uac3_output_terminal_descriptor {
89*4882a593Smuzhiyun 	__u8 bLength;
90*4882a593Smuzhiyun 	__u8 bDescriptorType;
91*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
92*4882a593Smuzhiyun 	__u8 bTerminalID;
93*4882a593Smuzhiyun 	__le16 wTerminalType;
94*4882a593Smuzhiyun 	__u8 bAssocTerminal;
95*4882a593Smuzhiyun 	__u8 bSourceID;
96*4882a593Smuzhiyun 	__u8 bCSourceID;
97*4882a593Smuzhiyun 	__le32 bmControls;
98*4882a593Smuzhiyun 	__le16 wExTerminalDescrID;
99*4882a593Smuzhiyun 	__le16 wConnectorsDescrID;
100*4882a593Smuzhiyun 	__le16 wTerminalDescrStr;
101*4882a593Smuzhiyun } __attribute__((packed));
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /* 4.5.2.7 FEATURE UNIT DESCRIPTOR */
104*4882a593Smuzhiyun struct uac3_feature_unit_descriptor {
105*4882a593Smuzhiyun 	__u8 bLength;
106*4882a593Smuzhiyun 	__u8 bDescriptorType;
107*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
108*4882a593Smuzhiyun 	__u8 bUnitID;
109*4882a593Smuzhiyun 	__u8 bSourceID;
110*4882a593Smuzhiyun 	/* bmaControls is actually u32,
111*4882a593Smuzhiyun 	 * but u8 is needed for the hybrid parser */
112*4882a593Smuzhiyun 	__u8 bmaControls[]; /* variable length */
113*4882a593Smuzhiyun 	/* wFeatureDescrStr omitted */
114*4882a593Smuzhiyun } __attribute__((packed));
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define UAC3_DT_FEATURE_UNIT_SIZE(ch)		(7 + ((ch) + 1) * 4)
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /* As above, but more useful for defining your own descriptors */
119*4882a593Smuzhiyun #define DECLARE_UAC3_FEATURE_UNIT_DESCRIPTOR(ch)		\
120*4882a593Smuzhiyun struct uac3_feature_unit_descriptor_##ch {			\
121*4882a593Smuzhiyun 	__u8 bLength;						\
122*4882a593Smuzhiyun 	__u8 bDescriptorType;					\
123*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;				\
124*4882a593Smuzhiyun 	__u8 bUnitID;						\
125*4882a593Smuzhiyun 	__u8 bSourceID;						\
126*4882a593Smuzhiyun 	__le32 bmaControls[ch + 1];				\
127*4882a593Smuzhiyun 	__le16 wFeatureDescrStr;				\
128*4882a593Smuzhiyun } __attribute__ ((packed))
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* 4.5.2.12 CLOCK SOURCE DESCRIPTOR */
131*4882a593Smuzhiyun struct uac3_clock_source_descriptor {
132*4882a593Smuzhiyun 	__u8 bLength;
133*4882a593Smuzhiyun 	__u8 bDescriptorType;
134*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
135*4882a593Smuzhiyun 	__u8 bClockID;
136*4882a593Smuzhiyun 	__u8 bmAttributes;
137*4882a593Smuzhiyun 	__le32 bmControls;
138*4882a593Smuzhiyun 	__u8 bReferenceTerminal;
139*4882a593Smuzhiyun 	__le16 wClockSourceStr;
140*4882a593Smuzhiyun } __attribute__((packed));
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /* bmAttribute fields */
143*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_TYPE_EXT	0x0
144*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_TYPE_INT	0x1
145*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_ASYNC		(0 << 2)
146*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE_SYNCED_TO_SOF	(1 << 1)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /* 4.5.2.13 CLOCK SELECTOR DESCRIPTOR */
149*4882a593Smuzhiyun struct uac3_clock_selector_descriptor {
150*4882a593Smuzhiyun 	__u8 bLength;
151*4882a593Smuzhiyun 	__u8 bDescriptorType;
152*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
153*4882a593Smuzhiyun 	__u8 bClockID;
154*4882a593Smuzhiyun 	__u8 bNrInPins;
155*4882a593Smuzhiyun 	__u8 baCSourceID[];
156*4882a593Smuzhiyun 	/* bmControls and wCSelectorDescrStr omitted */
157*4882a593Smuzhiyun } __attribute__((packed));
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* 4.5.2.14 CLOCK MULTIPLIER DESCRIPTOR */
160*4882a593Smuzhiyun struct uac3_clock_multiplier_descriptor {
161*4882a593Smuzhiyun 	__u8 bLength;
162*4882a593Smuzhiyun 	__u8 bDescriptorType;
163*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
164*4882a593Smuzhiyun 	__u8 bClockID;
165*4882a593Smuzhiyun 	__u8 bCSourceID;
166*4882a593Smuzhiyun 	__le32 bmControls;
167*4882a593Smuzhiyun 	__le16 wCMultiplierDescrStr;
168*4882a593Smuzhiyun } __attribute__((packed));
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /* 4.5.2.15 POWER DOMAIN DESCRIPTOR */
171*4882a593Smuzhiyun struct uac3_power_domain_descriptor {
172*4882a593Smuzhiyun 	__u8 bLength;
173*4882a593Smuzhiyun 	__u8 bDescriptorType;
174*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
175*4882a593Smuzhiyun 	__u8 bPowerDomainID;
176*4882a593Smuzhiyun 	__le16 waRecoveryTime1;
177*4882a593Smuzhiyun 	__le16 waRecoveryTime2;
178*4882a593Smuzhiyun 	__u8 bNrEntities;
179*4882a593Smuzhiyun 	__u8 baEntityID[];
180*4882a593Smuzhiyun 	/* wPDomainDescrStr omitted */
181*4882a593Smuzhiyun } __attribute__((packed));
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /* As above, but more useful for defining your own descriptors */
184*4882a593Smuzhiyun #define DECLARE_UAC3_POWER_DOMAIN_DESCRIPTOR(n)			\
185*4882a593Smuzhiyun struct uac3_power_domain_descriptor_##n {			\
186*4882a593Smuzhiyun 	__u8 bLength;						\
187*4882a593Smuzhiyun 	__u8 bDescriptorType;					\
188*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;				\
189*4882a593Smuzhiyun 	__u8 bPowerDomainID;					\
190*4882a593Smuzhiyun 	__le16 waRecoveryTime1;					\
191*4882a593Smuzhiyun 	__le16 waRecoveryTime2;					\
192*4882a593Smuzhiyun 	__u8 bNrEntities;					\
193*4882a593Smuzhiyun 	__u8 baEntityID[n];					\
194*4882a593Smuzhiyun 	__le16 wPDomainDescrStr;					\
195*4882a593Smuzhiyun } __attribute__ ((packed))
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun /* 4.7.2 CLASS-SPECIFIC AS INTERFACE DESCRIPTOR */
198*4882a593Smuzhiyun struct uac3_as_header_descriptor {
199*4882a593Smuzhiyun 	__u8 bLength;
200*4882a593Smuzhiyun 	__u8 bDescriptorType;
201*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
202*4882a593Smuzhiyun 	__u8 bTerminalLink;
203*4882a593Smuzhiyun 	__le32 bmControls;
204*4882a593Smuzhiyun 	__le16 wClusterDescrID;
205*4882a593Smuzhiyun 	__le64 bmFormats;
206*4882a593Smuzhiyun 	__u8 bSubslotSize;
207*4882a593Smuzhiyun 	__u8 bBitResolution;
208*4882a593Smuzhiyun 	__le16 bmAuxProtocols;
209*4882a593Smuzhiyun 	__u8 bControlSize;
210*4882a593Smuzhiyun } __attribute__((packed));
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun #define UAC3_FORMAT_TYPE_I_RAW_DATA	(1 << 6)
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /* 4.8.1.2 CLASS-SPECIFIC AS ISOCHRONOUS AUDIO DATA ENDPOINT DESCRIPTOR */
215*4882a593Smuzhiyun struct uac3_iso_endpoint_descriptor {
216*4882a593Smuzhiyun 	__u8 bLength;
217*4882a593Smuzhiyun 	__u8 bDescriptorType;
218*4882a593Smuzhiyun 	__u8 bDescriptorSubtype;
219*4882a593Smuzhiyun 	__le32 bmControls;
220*4882a593Smuzhiyun 	__u8 bLockDelayUnits;
221*4882a593Smuzhiyun 	__le16 wLockDelay;
222*4882a593Smuzhiyun } __attribute__((packed));
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /* 5.2.1.6.1 INSERTION CONTROL PARAMETER BLOCK */
225*4882a593Smuzhiyun struct uac3_insertion_ctl_blk {
226*4882a593Smuzhiyun 	__u8 bSize;
227*4882a593Smuzhiyun 	__u8 bmConInserted;
228*4882a593Smuzhiyun } __attribute__ ((packed));
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun /* 6.1 INTERRUPT DATA MESSAGE */
231*4882a593Smuzhiyun struct uac3_interrupt_data_msg {
232*4882a593Smuzhiyun 	__u8 bInfo;
233*4882a593Smuzhiyun 	__u8 bSourceType;
234*4882a593Smuzhiyun 	__le16 wValue;
235*4882a593Smuzhiyun 	__le16 wIndex;
236*4882a593Smuzhiyun } __attribute__((packed));
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun /* A.2 AUDIO AUDIO FUNCTION SUBCLASS CODES */
239*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_UNDEFINED	0x00
240*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_FULL_ADC_3_0	0x01
241*4882a593Smuzhiyun /* BADD profiles */
242*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_GENERIC_IO	0x20
243*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_HEADPHONE	0x21
244*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_SPEAKER		0x22
245*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_MICROPHONE	0x23
246*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_HEADSET		0x24
247*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_HEADSET_ADAPTER	0x25
248*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_SPEAKERPHONE	0x26
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun /* A.7 AUDIO FUNCTION CATEGORY CODES */
251*4882a593Smuzhiyun #define UAC3_FUNCTION_SUBCLASS_UNDEFINED	0x00
252*4882a593Smuzhiyun #define UAC3_FUNCTION_DESKTOP_SPEAKER		0x01
253*4882a593Smuzhiyun #define UAC3_FUNCTION_HOME_THEATER		0x02
254*4882a593Smuzhiyun #define UAC3_FUNCTION_MICROPHONE		0x03
255*4882a593Smuzhiyun #define UAC3_FUNCTION_HEADSET			0x04
256*4882a593Smuzhiyun #define UAC3_FUNCTION_TELEPHONE			0x05
257*4882a593Smuzhiyun #define UAC3_FUNCTION_CONVERTER			0x06
258*4882a593Smuzhiyun #define UAC3_FUNCTION_SOUND_RECORDER		0x07
259*4882a593Smuzhiyun #define UAC3_FUNCTION_IO_BOX			0x08
260*4882a593Smuzhiyun #define UAC3_FUNCTION_MUSICAL_INSTRUMENT	0x09
261*4882a593Smuzhiyun #define UAC3_FUNCTION_PRO_AUDIO			0x0a
262*4882a593Smuzhiyun #define UAC3_FUNCTION_AUDIO_VIDEO		0x0b
263*4882a593Smuzhiyun #define UAC3_FUNCTION_CONTROL_PANEL		0x0c
264*4882a593Smuzhiyun #define UAC3_FUNCTION_HEADPHONE			0x0d
265*4882a593Smuzhiyun #define UAC3_FUNCTION_GENERIC_SPEAKER		0x0e
266*4882a593Smuzhiyun #define UAC3_FUNCTION_HEADSET_ADAPTER		0x0f
267*4882a593Smuzhiyun #define UAC3_FUNCTION_SPEAKERPHONE		0x10
268*4882a593Smuzhiyun #define UAC3_FUNCTION_OTHER			0xff
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /* A.8 AUDIO CLASS-SPECIFIC DESCRIPTOR TYPES */
271*4882a593Smuzhiyun #define UAC3_CS_UNDEFINED		0x20
272*4882a593Smuzhiyun #define UAC3_CS_DEVICE			0x21
273*4882a593Smuzhiyun #define UAC3_CS_CONFIGURATION		0x22
274*4882a593Smuzhiyun #define UAC3_CS_STRING			0x23
275*4882a593Smuzhiyun #define UAC3_CS_INTERFACE		0x24
276*4882a593Smuzhiyun #define UAC3_CS_ENDPOINT		0x25
277*4882a593Smuzhiyun #define UAC3_CS_CLUSTER			0x26
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun /* A.10 CLUSTER DESCRIPTOR SEGMENT TYPES */
280*4882a593Smuzhiyun #define UAC3_SEGMENT_UNDEFINED		0x00
281*4882a593Smuzhiyun #define UAC3_CLUSTER_DESCRIPTION	0x01
282*4882a593Smuzhiyun #define UAC3_CLUSTER_VENDOR_DEFINED	0x1F
283*4882a593Smuzhiyun #define UAC3_CHANNEL_INFORMATION	0x20
284*4882a593Smuzhiyun #define UAC3_CHANNEL_AMBISONIC		0x21
285*4882a593Smuzhiyun #define UAC3_CHANNEL_DESCRIPTION	0x22
286*4882a593Smuzhiyun #define UAC3_CHANNEL_VENDOR_DEFINED	0xFE
287*4882a593Smuzhiyun #define UAC3_END_SEGMENT		0xFF
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun /* A.11 CHANNEL PURPOSE DEFINITIONS */
290*4882a593Smuzhiyun #define UAC3_PURPOSE_UNDEFINED		0x00
291*4882a593Smuzhiyun #define UAC3_PURPOSE_GENERIC_AUDIO	0x01
292*4882a593Smuzhiyun #define UAC3_PURPOSE_VOICE		0x02
293*4882a593Smuzhiyun #define UAC3_PURPOSE_SPEECH		0x03
294*4882a593Smuzhiyun #define UAC3_PURPOSE_AMBIENT		0x04
295*4882a593Smuzhiyun #define UAC3_PURPOSE_REFERENCE		0x05
296*4882a593Smuzhiyun #define UAC3_PURPOSE_ULTRASONIC		0x06
297*4882a593Smuzhiyun #define UAC3_PURPOSE_VIBROKINETIC	0x07
298*4882a593Smuzhiyun #define UAC3_PURPOSE_NON_AUDIO		0xFF
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun /* A.12 CHANNEL RELATIONSHIP DEFINITIONS */
301*4882a593Smuzhiyun #define UAC3_CH_RELATIONSHIP_UNDEFINED	0x00
302*4882a593Smuzhiyun #define UAC3_CH_MONO			0x01
303*4882a593Smuzhiyun #define UAC3_CH_LEFT			0x02
304*4882a593Smuzhiyun #define UAC3_CH_RIGHT			0x03
305*4882a593Smuzhiyun #define UAC3_CH_ARRAY			0x04
306*4882a593Smuzhiyun #define UAC3_CH_PATTERN_X		0x20
307*4882a593Smuzhiyun #define UAC3_CH_PATTERN_Y		0x21
308*4882a593Smuzhiyun #define UAC3_CH_PATTERN_A		0x22
309*4882a593Smuzhiyun #define UAC3_CH_PATTERN_B		0x23
310*4882a593Smuzhiyun #define UAC3_CH_PATTERN_M		0x24
311*4882a593Smuzhiyun #define UAC3_CH_PATTERN_S		0x25
312*4882a593Smuzhiyun #define UAC3_CH_FRONT_LEFT		0x80
313*4882a593Smuzhiyun #define UAC3_CH_FRONT_RIGHT		0x81
314*4882a593Smuzhiyun #define UAC3_CH_FRONT_CENTER		0x82
315*4882a593Smuzhiyun #define UAC3_CH_FRONT_LEFT_OF_CENTER	0x83
316*4882a593Smuzhiyun #define UAC3_CH_FRONT_RIGHT_OF_CENTER	0x84
317*4882a593Smuzhiyun #define UAC3_CH_FRONT_WIDE_LEFT		0x85
318*4882a593Smuzhiyun #define UAC3_CH_FRONT_WIDE_RIGHT	0x86
319*4882a593Smuzhiyun #define UAC3_CH_SIDE_LEFT		0x87
320*4882a593Smuzhiyun #define UAC3_CH_SIDE_RIGHT		0x88
321*4882a593Smuzhiyun #define UAC3_CH_SURROUND_ARRAY_LEFT	0x89
322*4882a593Smuzhiyun #define UAC3_CH_SURROUND_ARRAY_RIGHT	0x8A
323*4882a593Smuzhiyun #define UAC3_CH_BACK_LEFT		0x8B
324*4882a593Smuzhiyun #define UAC3_CH_BACK_RIGHT		0x8C
325*4882a593Smuzhiyun #define UAC3_CH_BACK_CENTER		0x8D
326*4882a593Smuzhiyun #define UAC3_CH_BACK_LEFT_OF_CENTER	0x8E
327*4882a593Smuzhiyun #define UAC3_CH_BACK_RIGHT_OF_CENTER	0x8F
328*4882a593Smuzhiyun #define UAC3_CH_BACK_WIDE_LEFT		0x90
329*4882a593Smuzhiyun #define UAC3_CH_BACK_WIDE_RIGHT		0x91
330*4882a593Smuzhiyun #define UAC3_CH_TOP_CENTER		0x92
331*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_LEFT		0x93
332*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_RIGHT		0x94
333*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_CENTER	0x95
334*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_LOC		0x96
335*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_ROC		0x97
336*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_WIDE_LEFT	0x98
337*4882a593Smuzhiyun #define UAC3_CH_TOP_FRONT_WIDE_RIGHT	0x99
338*4882a593Smuzhiyun #define UAC3_CH_TOP_SIDE_LEFT		0x9A
339*4882a593Smuzhiyun #define UAC3_CH_TOP_SIDE_RIGHT		0x9B
340*4882a593Smuzhiyun #define UAC3_CH_TOP_SURR_ARRAY_LEFT	0x9C
341*4882a593Smuzhiyun #define UAC3_CH_TOP_SURR_ARRAY_RIGHT	0x9D
342*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_LEFT		0x9E
343*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_RIGHT		0x9F
344*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_CENTER		0xA0
345*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_LOC		0xA1
346*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_ROC		0xA2
347*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_WIDE_LEFT	0xA3
348*4882a593Smuzhiyun #define UAC3_CH_TOP_BACK_WIDE_RIGHT	0xA4
349*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_CENTER		0xA5
350*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_LEFT	0xA6
351*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_RIGHT	0xA7
352*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_CENTER	0xA8
353*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_LOC	0xA9
354*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_ROC	0xAA
355*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_WIDE_LEFT	0xAB
356*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_FRONT_WIDE_RIGHT	0xAC
357*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SIDE_LEFT	0xAD
358*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SIDE_RIGHT	0xAE
359*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SURR_ARRAY_LEFT	0xAF
360*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_SURR_ARRAY_RIGHT	0xB0
361*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_LEFT	0xB1
362*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_RIGHT	0xB2
363*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_CENTER	0xB3
364*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_LOC		0xB4
365*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_ROC		0xB5
366*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_WIDE_LEFT	0xB6
367*4882a593Smuzhiyun #define UAC3_CH_BOTTOM_BACK_WIDE_RIGHT	0xB7
368*4882a593Smuzhiyun #define UAC3_CH_LOW_FREQUENCY_EFFECTS	0xB8
369*4882a593Smuzhiyun #define UAC3_CH_LFE_LEFT		0xB9
370*4882a593Smuzhiyun #define UAC3_CH_LFE_RIGHT		0xBA
371*4882a593Smuzhiyun #define UAC3_CH_HEADPHONE_LEFT		0xBB
372*4882a593Smuzhiyun #define UAC3_CH_HEADPHONE_RIGHT		0xBC
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun /* A.15 AUDIO CLASS-SPECIFIC AC INTERFACE DESCRIPTOR SUBTYPES */
375*4882a593Smuzhiyun /* see audio.h for the rest, which is identical to v1 */
376*4882a593Smuzhiyun #define UAC3_EXTENDED_TERMINAL		0x04
377*4882a593Smuzhiyun #define UAC3_MIXER_UNIT			0x05
378*4882a593Smuzhiyun #define UAC3_SELECTOR_UNIT		0x06
379*4882a593Smuzhiyun #define UAC3_FEATURE_UNIT		0x07
380*4882a593Smuzhiyun #define UAC3_EFFECT_UNIT		0x08
381*4882a593Smuzhiyun #define UAC3_PROCESSING_UNIT		0x09
382*4882a593Smuzhiyun #define UAC3_EXTENSION_UNIT		0x0a
383*4882a593Smuzhiyun #define UAC3_CLOCK_SOURCE		0x0b
384*4882a593Smuzhiyun #define UAC3_CLOCK_SELECTOR		0x0c
385*4882a593Smuzhiyun #define UAC3_CLOCK_MULTIPLIER		0x0d
386*4882a593Smuzhiyun #define UAC3_SAMPLE_RATE_CONVERTER	0x0e
387*4882a593Smuzhiyun #define UAC3_CONNECTORS			0x0f
388*4882a593Smuzhiyun #define UAC3_POWER_DOMAIN		0x10
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun /* A.20 PROCESSING UNIT PROCESS TYPES */
391*4882a593Smuzhiyun #define UAC3_PROCESS_UNDEFINED		0x00
392*4882a593Smuzhiyun #define UAC3_PROCESS_UP_DOWNMIX		0x01
393*4882a593Smuzhiyun #define UAC3_PROCESS_STEREO_EXTENDER	0x02
394*4882a593Smuzhiyun #define UAC3_PROCESS_MULTI_FUNCTION	0x03
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun /* A.22 AUDIO CLASS-SPECIFIC REQUEST CODES */
397*4882a593Smuzhiyun /* see audio-v2.h for the rest, which is identical to v2 */
398*4882a593Smuzhiyun #define UAC3_CS_REQ_INTEN			0x04
399*4882a593Smuzhiyun #define UAC3_CS_REQ_STRING			0x05
400*4882a593Smuzhiyun #define UAC3_CS_REQ_HIGH_CAPABILITY_DESCRIPTOR	0x06
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun /* A.23.1 AUDIOCONTROL INTERFACE CONTROL SELECTORS */
403*4882a593Smuzhiyun #define UAC3_AC_CONTROL_UNDEFINED		0x00
404*4882a593Smuzhiyun #define UAC3_AC_ACTIVE_INTERFACE_CONTROL	0x01
405*4882a593Smuzhiyun #define UAC3_AC_POWER_DOMAIN_CONTROL		0x02
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun /* A.23.5 TERMINAL CONTROL SELECTORS */
408*4882a593Smuzhiyun #define UAC3_TE_UNDEFINED			0x00
409*4882a593Smuzhiyun #define UAC3_TE_INSERTION			0x01
410*4882a593Smuzhiyun #define UAC3_TE_OVERLOAD			0x02
411*4882a593Smuzhiyun #define UAC3_TE_UNDERFLOW			0x03
412*4882a593Smuzhiyun #define UAC3_TE_OVERFLOW			0x04
413*4882a593Smuzhiyun #define UAC3_TE_LATENCY 			0x05
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun /* A.23.10 PROCESSING UNITS CONTROL SELECTROS */
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun /* Up/Down Mixer */
418*4882a593Smuzhiyun #define UAC3_UD_MODE_SELECT			0x01
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun /* Stereo Extender */
421*4882a593Smuzhiyun #define UAC3_EXT_WIDTH_CONTROL			0x01
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun /* BADD predefined Unit/Terminal values */
425*4882a593Smuzhiyun #define UAC3_BADD_IT_ID1	1  /* Input Terminal ID1: bTerminalID = 1 */
426*4882a593Smuzhiyun #define UAC3_BADD_FU_ID2	2  /* Feature Unit ID2: bUnitID = 2 */
427*4882a593Smuzhiyun #define UAC3_BADD_OT_ID3	3  /* Output Terminal ID3: bTerminalID = 3 */
428*4882a593Smuzhiyun #define UAC3_BADD_IT_ID4	4  /* Input Terminal ID4: bTerminalID = 4 */
429*4882a593Smuzhiyun #define UAC3_BADD_FU_ID5	5  /* Feature Unit ID5: bUnitID = 5 */
430*4882a593Smuzhiyun #define UAC3_BADD_OT_ID6	6  /* Output Terminal ID6: bTerminalID = 6 */
431*4882a593Smuzhiyun #define UAC3_BADD_FU_ID7	7  /* Feature Unit ID7: bUnitID = 7 */
432*4882a593Smuzhiyun #define UAC3_BADD_MU_ID8	8  /* Mixer Unit ID8: bUnitID = 8 */
433*4882a593Smuzhiyun #define UAC3_BADD_CS_ID9	9  /* Clock Source Entity ID9: bClockID = 9 */
434*4882a593Smuzhiyun #define UAC3_BADD_PD_ID10	10 /* Power Domain ID10: bPowerDomainID = 10 */
435*4882a593Smuzhiyun #define UAC3_BADD_PD_ID11	11 /* Power Domain ID11: bPowerDomainID = 11 */
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun /* BADD wMaxPacketSize of AS endpoints */
438*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_16		0x0060
439*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_16		0x0062
440*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_MONO_24		0x0090
441*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_MONO_24		0x0093
442*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_16		0x00C0
443*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_16		0x00C4
444*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_SYNC_STEREO_24		0x0120
445*4882a593Smuzhiyun #define UAC3_BADD_EP_MAXPSIZE_ASYNC_STEREO_24		0x0126
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun /* BADD sample rate is always fixed to 48kHz */
448*4882a593Smuzhiyun #define UAC3_BADD_SAMPLING_RATE				48000
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun /* BADD power domains recovery times in 50us increments */
451*4882a593Smuzhiyun #define UAC3_BADD_PD_RECOVER_D1D0			0x0258	/* 30ms */
452*4882a593Smuzhiyun #define UAC3_BADD_PD_RECOVER_D2D0			0x1770	/* 300ms */
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun #endif /* __LINUX_USB_AUDIO_V3_H */
455