Skip to content

Commit ce01726

Browse files
Cryolitiatiwai
authored andcommitted
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>
1 parent 329bdcb commit ce01726

File tree

3 files changed

+144
-30
lines changed

3 files changed

+144
-30
lines changed

sound/usb/quirks.c

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2443,6 +2443,84 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = {
24432443
{} /* terminator */
24442444
};
24452445

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+
24462524
void snd_usb_init_quirk_flags(struct snd_usb_audio *chip)
24472525
{
24482526
const struct usb_audio_quirk_flags_table *p;
@@ -2451,10 +2529,7 @@ void snd_usb_init_quirk_flags(struct snd_usb_audio *chip)
24512529
if (chip->usb_id == p->id ||
24522530
(!USB_ID_PRODUCT(p->id) &&
24532531
USB_ID_VENDOR(chip->usb_id) == USB_ID_VENDOR(p->id))) {
2454-
usb_audio_dbg(chip,
2455-
"Set quirk_flags 0x%x for device %04x:%04x\n",
2456-
p->flags, USB_ID_VENDOR(chip->usb_id),
2457-
USB_ID_PRODUCT(chip->usb_id));
2532+
snd_usb_apply_flag_dbg("builtin table", chip, p->flags);
24582533
chip->quirk_flags |= p->flags;
24592534
return;
24602535
}

sound/usb/quirks.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ void snd_usb_audioformat_attributes_quirk(struct snd_usb_audio *chip,
4848
struct audioformat *fp,
4949
int stream);
5050

51+
void snd_usb_apply_flag_dbg(const char *reason,
52+
struct snd_usb_audio *chip,
53+
unsigned long flag);
54+
5155
void snd_usb_init_quirk_flags(struct snd_usb_audio *chip);
5256

57+
const char *snd_usb_quirk_flag_find_name(unsigned long flag);
58+
u32 snd_usb_quirk_flags_from_name(const char *name);
59+
5360
#endif /* __USBAUDIO_QUIRKS_H */

sound/usb/usbaudio.h

Lines changed: 58 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -226,31 +226,63 @@ extern bool snd_usb_skip_validation;
226226
* Similar to QUIRK_FLAG_MIXER_PLAYBACK_MIN_MUTE, but for capture streams
227227
*/
228228

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)
255287

256288
#endif /* __USBAUDIO_H */

0 commit comments

Comments
 (0)