Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ALSA: usb-audio: add two-way convert between name and bit for QUIRK_FLAG_*

Define quirk flags enum and its name.

Add helper for converting between quirk flags' name and bit.
- snd_usb_quirk_flag_find_name()
- snd_usb_quirk_flags_from_name()

Add helper for printing debug: log snd_usb_apply_flag_dbg()

Co-developed-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Cryolitia PukNgae <cryolitia@uniontech.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

authored by

Cryolitia PukNgae and committed by
Takashi Iwai
ce017262 329bdcbb

+144 -30
+79 -4
sound/usb/quirks.c
··· 2443 2443 {} /* terminator */ 2444 2444 }; 2445 2445 2446 + #define QUIRK_STRING_ENTRY(x) \ 2447 + [QUIRK_TYPE_ ## x] = __stringify(x) 2448 + 2449 + static const char *const snd_usb_audio_quirk_flag_names[] = { 2450 + QUIRK_STRING_ENTRY(GET_SAMPLE_RATE), 2451 + QUIRK_STRING_ENTRY(SHARE_MEDIA_DEVICE), 2452 + QUIRK_STRING_ENTRY(ALIGN_TRANSFER), 2453 + QUIRK_STRING_ENTRY(TX_LENGTH), 2454 + QUIRK_STRING_ENTRY(PLAYBACK_FIRST), 2455 + QUIRK_STRING_ENTRY(SKIP_CLOCK_SELECTOR), 2456 + QUIRK_STRING_ENTRY(IGNORE_CLOCK_SOURCE), 2457 + QUIRK_STRING_ENTRY(ITF_USB_DSD_DAC), 2458 + QUIRK_STRING_ENTRY(CTL_MSG_DELAY), 2459 + QUIRK_STRING_ENTRY(CTL_MSG_DELAY_1M), 2460 + QUIRK_STRING_ENTRY(CTL_MSG_DELAY_5M), 2461 + QUIRK_STRING_ENTRY(IFACE_DELAY), 2462 + QUIRK_STRING_ENTRY(VALIDATE_RATES), 2463 + QUIRK_STRING_ENTRY(DISABLE_AUTOSUSPEND), 2464 + QUIRK_STRING_ENTRY(IGNORE_CTL_ERROR), 2465 + QUIRK_STRING_ENTRY(DSD_RAW), 2466 + QUIRK_STRING_ENTRY(SET_IFACE_FIRST), 2467 + QUIRK_STRING_ENTRY(GENERIC_IMPLICIT_FB), 2468 + QUIRK_STRING_ENTRY(SKIP_IMPLICIT_FB), 2469 + QUIRK_STRING_ENTRY(IFACE_SKIP_CLOSE), 2470 + QUIRK_STRING_ENTRY(FORCE_IFACE_RESET), 2471 + QUIRK_STRING_ENTRY(FIXED_RATE), 2472 + QUIRK_STRING_ENTRY(MIC_RES_16), 2473 + QUIRK_STRING_ENTRY(MIC_RES_384), 2474 + QUIRK_STRING_ENTRY(MIXER_PLAYBACK_MIN_MUTE), 2475 + QUIRK_STRING_ENTRY(MIXER_CAPTURE_MIN_MUTE), 2476 + NULL 2477 + }; 2478 + 2479 + const char *snd_usb_quirk_flag_find_name(unsigned long index) 2480 + { 2481 + if (index >= ARRAY_SIZE(snd_usb_audio_quirk_flag_names)) 2482 + return NULL; 2483 + 2484 + return snd_usb_audio_quirk_flag_names[index]; 2485 + } 2486 + 2487 + u32 snd_usb_quirk_flags_from_name(const char *name) 2488 + { 2489 + int i; 2490 + 2491 + if (!name || !*name) 2492 + return 0; 2493 + 2494 + for (i = 0; snd_usb_audio_quirk_flag_names[i]; i++) { 2495 + if (strcasecmp(name, snd_usb_audio_quirk_flag_names[i]) == 0) 2496 + return BIT_U32(i); 2497 + } 2498 + 2499 + return 0; 2500 + } 2501 + 2502 + void snd_usb_apply_flag_dbg(const char *reason, 2503 + struct snd_usb_audio *chip, 2504 + unsigned long flag) 2505 + { 2506 + unsigned long bit; 2507 + 2508 + for_each_set_bit(bit, &flag, BYTES_TO_BITS(sizeof(flag))) { 2509 + const char *name = snd_usb_audio_quirk_flag_names[bit]; 2510 + 2511 + if (name) 2512 + usb_audio_dbg(chip, 2513 + "From %s apply quirk flag %s for device %04x:%04x\n", 2514 + reason, name, USB_ID_VENDOR(chip->usb_id), 2515 + USB_ID_PRODUCT(chip->usb_id)); 2516 + else 2517 + usb_audio_warn(chip, 2518 + "From %s apply unknown quirk flag 0x%lx for device %04x:%04x\n", 2519 + reason, bit, USB_ID_VENDOR(chip->usb_id), 2520 + USB_ID_PRODUCT(chip->usb_id)); 2521 + } 2522 + } 2523 + 2446 2524 void snd_usb_init_quirk_flags(struct snd_usb_audio *chip) 2447 2525 { 2448 2526 const struct usb_audio_quirk_flags_table *p; ··· 2529 2451 if (chip->usb_id == p->id || 2530 2452 (!USB_ID_PRODUCT(p->id) && 2531 2453 USB_ID_VENDOR(chip->usb_id) == USB_ID_VENDOR(p->id))) { 2532 - usb_audio_dbg(chip, 2533 - "Set quirk_flags 0x%x for device %04x:%04x\n", 2534 - p->flags, USB_ID_VENDOR(chip->usb_id), 2535 - USB_ID_PRODUCT(chip->usb_id)); 2454 + snd_usb_apply_flag_dbg("builtin table", chip, p->flags); 2536 2455 chip->quirk_flags |= p->flags; 2537 2456 return; 2538 2457 }
+7
sound/usb/quirks.h
··· 48 48 struct audioformat *fp, 49 49 int stream); 50 50 51 + void snd_usb_apply_flag_dbg(const char *reason, 52 + struct snd_usb_audio *chip, 53 + unsigned long flag); 54 + 51 55 void snd_usb_init_quirk_flags(struct snd_usb_audio *chip); 56 + 57 + const char *snd_usb_quirk_flag_find_name(unsigned long flag); 58 + u32 snd_usb_quirk_flags_from_name(const char *name); 52 59 53 60 #endif /* __USBAUDIO_QUIRKS_H */
+58 -26
sound/usb/usbaudio.h
··· 226 226 * Similar to QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE, but for capture streams 227 227 */ 228 228 229 - #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0) 230 - #define QUIRK_FLAG_SHARE_MEDIA_DEVICE (1U << 1) 231 - #define QUIRK_FLAG_ALIGN_TRANSFER (1U << 2) 232 - #define QUIRK_FLAG_TX_LENGTH (1U << 3) 233 - #define QUIRK_FLAG_PLAYBACK_FIRST (1U << 4) 234 - #define QUIRK_FLAG_SKIP_CLOCK_SELECTOR (1U << 5) 235 - #define QUIRK_FLAG_IGNORE_CLOCK_SOURCE (1U << 6) 236 - #define QUIRK_FLAG_ITF_USB_DSD_DAC (1U << 7) 237 - #define QUIRK_FLAG_CTL_MSG_DELAY (1U << 8) 238 - #define QUIRK_FLAG_CTL_MSG_DELAY_1M (1U << 9) 239 - #define QUIRK_FLAG_CTL_MSG_DELAY_5M (1U << 10) 240 - #define QUIRK_FLAG_IFACE_DELAY (1U << 11) 241 - #define QUIRK_FLAG_VALIDATE_RATES (1U << 12) 242 - #define QUIRK_FLAG_DISABLE_AUTOSUSPEND (1U << 13) 243 - #define QUIRK_FLAG_IGNORE_CTL_ERROR (1U << 14) 244 - #define QUIRK_FLAG_DSD_RAW (1U << 15) 245 - #define QUIRK_FLAG_SET_IFACE_FIRST (1U << 16) 246 - #define QUIRK_FLAG_GENERIC_IMPLICIT_FB (1U << 17) 247 - #define QUIRK_FLAG_SKIP_IMPLICIT_FB (1U << 18) 248 - #define QUIRK_FLAG_IFACE_SKIP_CLOSE (1U << 19) 249 - #define QUIRK_FLAG_FORCE_IFACE_RESET (1U << 20) 250 - #define QUIRK_FLAG_FIXED_RATE (1U << 21) 251 - #define QUIRK_FLAG_MIC_RES_16 (1U << 22) 252 - #define QUIRK_FLAG_MIC_RES_384 (1U << 23) 253 - #define QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE (1U << 24) 254 - #define QUIRK_FLAG_MIXER_CAPTURE_MIN_MUTE (1U << 25) 229 + enum { 230 + QUIRK_TYPE_GET_SAMPLE_RATE = 0, 231 + QUIRK_TYPE_SHARE_MEDIA_DEVICE = 1, 232 + QUIRK_TYPE_ALIGN_TRANSFER = 2, 233 + QUIRK_TYPE_TX_LENGTH = 3, 234 + QUIRK_TYPE_PLAYBACK_FIRST = 4, 235 + QUIRK_TYPE_SKIP_CLOCK_SELECTOR = 5, 236 + QUIRK_TYPE_IGNORE_CLOCK_SOURCE = 6, 237 + QUIRK_TYPE_ITF_USB_DSD_DAC = 7, 238 + QUIRK_TYPE_CTL_MSG_DELAY = 8, 239 + QUIRK_TYPE_CTL_MSG_DELAY_1M = 9, 240 + QUIRK_TYPE_CTL_MSG_DELAY_5M = 10, 241 + QUIRK_TYPE_IFACE_DELAY = 11, 242 + QUIRK_TYPE_VALIDATE_RATES = 12, 243 + QUIRK_TYPE_DISABLE_AUTOSUSPEND = 13, 244 + QUIRK_TYPE_IGNORE_CTL_ERROR = 14, 245 + QUIRK_TYPE_DSD_RAW = 15, 246 + QUIRK_TYPE_SET_IFACE_FIRST = 16, 247 + QUIRK_TYPE_GENERIC_IMPLICIT_FB = 17, 248 + QUIRK_TYPE_SKIP_IMPLICIT_FB = 18, 249 + QUIRK_TYPE_IFACE_SKIP_CLOSE = 19, 250 + QUIRK_TYPE_FORCE_IFACE_RESET = 20, 251 + QUIRK_TYPE_FIXED_RATE = 21, 252 + QUIRK_TYPE_MIC_RES_16 = 22, 253 + QUIRK_TYPE_MIC_RES_384 = 23, 254 + QUIRK_TYPE_MIXER_PLAYBACK_MIN_MUTE = 24, 255 + QUIRK_TYPE_MIXER_CAPTURE_MIN_MUTE = 25, 256 + /* Please also edit snd_usb_audio_quirk_flag_names */ 257 + }; 258 + 259 + #define QUIRK_FLAG(x) BIT_U32(QUIRK_TYPE_ ## x) 260 + 261 + #define QUIRK_FLAG_GET_SAMPLE_RATE QUIRK_FLAG(GET_SAMPLE_RATE) 262 + #define QUIRK_FLAG_SHARE_MEDIA_DEVICE QUIRK_FLAG(SHARE_MEDIA_DEVICE) 263 + #define QUIRK_FLAG_ALIGN_TRANSFER QUIRK_FLAG(ALIGN_TRANSFER) 264 + #define QUIRK_FLAG_TX_LENGTH QUIRK_FLAG(TX_LENGTH) 265 + #define QUIRK_FLAG_PLAYBACK_FIRST QUIRK_FLAG(PLAYBACK_FIRST) 266 + #define QUIRK_FLAG_SKIP_CLOCK_SELECTOR QUIRK_FLAG(SKIP_CLOCK_SELECTOR) 267 + #define QUIRK_FLAG_IGNORE_CLOCK_SOURCE QUIRK_FLAG(IGNORE_CLOCK_SOURCE) 268 + #define QUIRK_FLAG_ITF_USB_DSD_DAC QUIRK_FLAG(ITF_USB_DSD_DAC) 269 + #define QUIRK_FLAG_CTL_MSG_DELAY QUIRK_FLAG(CTL_MSG_DELAY) 270 + #define QUIRK_FLAG_CTL_MSG_DELAY_1M QUIRK_FLAG(CTL_MSG_DELAY_1M) 271 + #define QUIRK_FLAG_CTL_MSG_DELAY_5M QUIRK_FLAG(CTL_MSG_DELAY_5M) 272 + #define QUIRK_FLAG_IFACE_DELAY QUIRK_FLAG(IFACE_DELAY) 273 + #define QUIRK_FLAG_VALIDATE_RATES QUIRK_FLAG(VALIDATE_RATES) 274 + #define QUIRK_FLAG_DISABLE_AUTOSUSPEND QUIRK_FLAG(DISABLE_AUTOSUSPEND) 275 + #define QUIRK_FLAG_IGNORE_CTL_ERROR QUIRK_FLAG(IGNORE_CTL_ERROR) 276 + #define QUIRK_FLAG_DSD_RAW QUIRK_FLAG(DSD_RAW) 277 + #define QUIRK_FLAG_SET_IFACE_FIRST QUIRK_FLAG(SET_IFACE_FIRST) 278 + #define QUIRK_FLAG_GENERIC_IMPLICIT_FB QUIRK_FLAG(GENERIC_IMPLICIT_FB) 279 + #define QUIRK_FLAG_SKIP_IMPLICIT_FB QUIRK_FLAG(SKIP_IMPLICIT_FB) 280 + #define QUIRK_FLAG_IFACE_SKIP_CLOSE QUIRK_FLAG(IFACE_SKIP_CLOSE) 281 + #define QUIRK_FLAG_FORCE_IFACE_RESET QUIRK_FLAG(FORCE_IFACE_RESET) 282 + #define QUIRK_FLAG_FIXED_RATE QUIRK_FLAG(FIXED_RATE) 283 + #define QUIRK_FLAG_MIC_RES_16 QUIRK_FLAG(MIC_RES_16) 284 + #define QUIRK_FLAG_MIC_RES_384 QUIRK_FLAG(MIC_RES_384) 285 + #define QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE QUIRK_FLAG(MIXER_PLAYBACK_MIN_MUTE) 286 + #define QUIRK_FLAG_MIXER_CAPTURE_MIN_MUTE QUIRK_FLAG(MIXER_CAPTURE_MIN_MUTE) 255 287 256 288 #endif /* __USBAUDIO_H */