diff options
Diffstat (limited to 'include/uapi/linux/usb/audio.h')
| -rw-r--r-- | include/uapi/linux/usb/audio.h | 49 |
1 files changed, 40 insertions, 9 deletions
diff --git a/include/uapi/linux/usb/audio.h b/include/uapi/linux/usb/audio.h index 74e520fb944f..ddc5396800aa 100644 --- a/include/uapi/linux/usb/audio.h +++ b/include/uapi/linux/usb/audio.h | |||
| @@ -390,33 +390,64 @@ static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_ | |||
| 390 | static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc, | 390 | static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc, |
| 391 | int protocol) | 391 | int protocol) |
| 392 | { | 392 | { |
| 393 | return (protocol == UAC_VERSION_1) ? | 393 | switch (protocol) { |
| 394 | desc->baSourceID[desc->bNrInPins + 4] : | 394 | case UAC_VERSION_1: |
| 395 | 2; /* in UAC2, this value is constant */ | 395 | return desc->baSourceID[desc->bNrInPins + 4]; |
| 396 | case UAC_VERSION_2: | ||
| 397 | return 2; /* in UAC2, this value is constant */ | ||
| 398 | case UAC_VERSION_3: | ||
| 399 | return 4; /* in UAC3, this value is constant */ | ||
| 400 | default: | ||
| 401 | return 1; | ||
| 402 | } | ||
| 396 | } | 403 | } |
| 397 | 404 | ||
| 398 | static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, | 405 | static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc, |
| 399 | int protocol) | 406 | int protocol) |
| 400 | { | 407 | { |
| 401 | return (protocol == UAC_VERSION_1) ? | 408 | switch (protocol) { |
| 402 | &desc->baSourceID[desc->bNrInPins + 5] : | 409 | case UAC_VERSION_1: |
| 403 | &desc->baSourceID[desc->bNrInPins + 6]; | 410 | return &desc->baSourceID[desc->bNrInPins + 5]; |
| 411 | case UAC_VERSION_2: | ||
| 412 | return &desc->baSourceID[desc->bNrInPins + 6]; | ||
| 413 | case UAC_VERSION_3: | ||
| 414 | return &desc->baSourceID[desc->bNrInPins + 2]; | ||
| 415 | default: | ||
| 416 | return NULL; | ||
| 417 | } | ||
| 404 | } | 418 | } |
| 405 | 419 | ||
| 406 | static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, | 420 | static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc, |
| 407 | int protocol) | 421 | int protocol) |
| 408 | { | 422 | { |
| 409 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); | 423 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); |
| 410 | return *(uac_processing_unit_bmControls(desc, protocol) | 424 | |
| 411 | + control_size); | 425 | switch (protocol) { |
| 426 | case UAC_VERSION_1: | ||
| 427 | case UAC_VERSION_2: | ||
| 428 | default: | ||
| 429 | return *(uac_processing_unit_bmControls(desc, protocol) | ||
| 430 | + control_size); | ||
| 431 | case UAC_VERSION_3: | ||
| 432 | return 0; /* UAC3 does not have this field */ | ||
| 433 | } | ||
| 412 | } | 434 | } |
| 413 | 435 | ||
| 414 | static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc, | 436 | static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc, |
| 415 | int protocol) | 437 | int protocol) |
| 416 | { | 438 | { |
| 417 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); | 439 | __u8 control_size = uac_processing_unit_bControlSize(desc, protocol); |
| 418 | return uac_processing_unit_bmControls(desc, protocol) | 440 | |
| 441 | switch (protocol) { | ||
| 442 | case UAC_VERSION_1: | ||
| 443 | case UAC_VERSION_2: | ||
| 444 | default: | ||
| 445 | return uac_processing_unit_bmControls(desc, protocol) | ||
| 419 | + control_size + 1; | 446 | + control_size + 1; |
| 447 | case UAC_VERSION_3: | ||
| 448 | return uac_processing_unit_bmControls(desc, protocol) | ||
| 449 | + control_size; | ||
| 450 | } | ||
| 420 | } | 451 | } |
| 421 | 452 | ||
| 422 | /* 4.5.2 Class-Specific AS Interface Descriptor */ | 453 | /* 4.5.2 Class-Specific AS Interface Descriptor */ |
