aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/usb
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/usb')
-rw-r--r--include/linux/usb/audio.h129
1 files changed, 119 insertions, 10 deletions
diff --git a/include/linux/usb/audio.h b/include/linux/usb/audio.h
index cdad728543ae..bc78a83d0f48 100644
--- a/include/linux/usb/audio.h
+++ b/include/linux/usb/audio.h
@@ -181,6 +181,125 @@ struct uac_feature_unit_descriptor_##ch { \
181 __u8 iFeature; \ 181 __u8 iFeature; \
182} __attribute__ ((packed)) 182} __attribute__ ((packed))
183 183
184/* 4.3.2.3 Mixer Unit Descriptor */
185struct uac_mixer_unit_descriptor {
186 __u8 bLength;
187 __u8 bDescriptorType;
188 __u8 bDescriptorSubtype;
189 __u8 bUnitID;
190 __u8 bNrInPins;
191 __u8 baSourceID[];
192} __attribute__ ((packed));
193
194static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc)
195{
196 return desc->baSourceID[desc->bNrInPins];
197}
198
199static inline __u16 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc)
200{
201 return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
202 desc->baSourceID[desc->bNrInPins + 1];
203}
204
205static inline __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc)
206{
207 return desc->baSourceID[desc->bNrInPins + 3];
208}
209
210static inline __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc)
211{
212 return &desc->baSourceID[desc->bNrInPins + 4];
213}
214
215static inline __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc)
216{
217 __u8 *raw = (__u8 *) desc;
218 return raw[desc->bLength - 1];
219}
220
221/* 4.3.2.4 Selector Unit Descriptor */
222struct uac_selector_unit_descriptor {
223 __u8 bLength;
224 __u8 bDescriptorType;
225 __u8 bDescriptorSubtype;
226 __u8 bUintID;
227 __u8 bNrInPins;
228 __u8 baSourceID[];
229} __attribute__ ((packed));
230
231static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc)
232{
233 __u8 *raw = (__u8 *) desc;
234 return raw[desc->bLength - 1];
235}
236
237/* 4.3.2.5 Feature Unit Descriptor */
238struct uac_feature_unit_descriptor {
239 __u8 bLength;
240 __u8 bDescriptorType;
241 __u8 bDescriptorSubtype;
242 __u8 bUnitID;
243 __u8 bSourceID;
244 __u8 bControlSize;
245 __u8 bmaControls[0]; /* variable length */
246} __attribute__((packed));
247
248static inline __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc)
249{
250 __u8 *raw = (__u8 *) desc;
251 return raw[desc->bLength - 1];
252}
253
254/* 4.3.2.6 Processing Unit Descriptors */
255struct uac_processing_unit_descriptor {
256 __u8 bLength;
257 __u8 bDescriptorType;
258 __u8 bDescriptorSubtype;
259 __u8 bUnitID;
260 __u16 wProcessType;
261 __u8 bNrInPins;
262 __u8 baSourceID[];
263} __attribute__ ((packed));
264
265static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc)
266{
267 return desc->baSourceID[desc->bNrInPins];
268}
269
270static inline __u16 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc)
271{
272 return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
273 desc->baSourceID[desc->bNrInPins + 1];
274}
275
276static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc)
277{
278 return desc->baSourceID[desc->bNrInPins + 3];
279}
280
281static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc)
282{
283 return desc->baSourceID[desc->bNrInPins + 4];
284}
285
286static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc)
287{
288 return &desc->baSourceID[desc->bNrInPins + 5];
289}
290
291static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc)
292{
293 __u8 control_size = uac_processing_unit_bControlSize(desc);
294 return desc->baSourceID[desc->bNrInPins + control_size];
295}
296
297static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc)
298{
299 __u8 control_size = uac_processing_unit_bControlSize(desc);
300 return &desc->baSourceID[desc->bNrInPins + control_size + 1];
301}
302
184/* 4.5.2 Class-Specific AS Interface Descriptor */ 303/* 4.5.2 Class-Specific AS Interface Descriptor */
185struct uac_as_header_descriptor_v1 { 304struct uac_as_header_descriptor_v1 {
186 __u8 bLength; /* in bytes: 7 */ 305 __u8 bLength; /* in bytes: 7 */
@@ -315,16 +434,6 @@ struct uac_iso_endpoint_descriptor {
315 434
316/* A.10.2 Feature Unit Control Selectors */ 435/* A.10.2 Feature Unit Control Selectors */
317 436
318struct uac_feature_unit_descriptor {
319 __u8 bLength;
320 __u8 bDescriptorType;
321 __u8 bDescriptorSubtype;
322 __u8 bUnitID;
323 __u8 bSourceID;
324 __u8 bControlSize;
325 __u8 controls[0]; /* variable length */
326} __attribute__((packed));
327
328#define UAC_FU_CONTROL_UNDEFINED 0x00 437#define UAC_FU_CONTROL_UNDEFINED 0x00
329#define UAC_MUTE_CONTROL 0x01 438#define UAC_MUTE_CONTROL 0x01
330#define UAC_VOLUME_CONTROL 0x02 439#define UAC_VOLUME_CONTROL 0x02