11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds #ifndef __USBAUDIO_H 31da177e4SLinus Torvalds #define __USBAUDIO_H 41da177e4SLinus Torvalds /* 51da177e4SLinus Torvalds * (Tentative) USB Audio Driver for ALSA 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de> 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 1027d10f56SClemens Ladisch /* handling of USB vendor/product ID pairs as 32-bit numbers */ 111ef87159SBorislav Petkov #define USB_ID(vendor, product) (((unsigned int)(vendor) << 16) | (product)) 1227d10f56SClemens Ladisch #define USB_ID_VENDOR(id) ((id) >> 16) 1327d10f56SClemens Ladisch #define USB_ID_PRODUCT(id) ((u16)(id)) 1427d10f56SClemens Ladisch 151da177e4SLinus Torvalds /* 16e5779998SDaniel Mack * 171da177e4SLinus Torvalds */ 181da177e4SLinus Torvalds 1966354f18SShuah Khan struct media_device; 2066354f18SShuah Khan struct media_intf_devnode; 2166354f18SShuah Khan 2288d8822dSTakashi Iwai #define MAX_CARD_INTERFACES 16 2388d8822dSTakashi Iwai 241da177e4SLinus Torvalds struct snd_usb_audio { 251da177e4SLinus Torvalds int index; 261da177e4SLinus Torvalds struct usb_device *dev; 2786e07d34STakashi Iwai struct snd_card *card; 2888d8822dSTakashi Iwai struct usb_interface *intf[MAX_CARD_INTERFACES]; 2927d10f56SClemens Ladisch u32 usb_id; 3097991108SKai-Heng Feng uint16_t quirk_type; 31596580d0SDaniel Mack struct mutex mutex; 32862b2509STakashi Iwai unsigned int system_suspend; 3347ab1545STakashi Iwai atomic_t active; 3447ab1545STakashi Iwai atomic_t shutdown; 3547ab1545STakashi Iwai atomic_t usage_count; 3647ab1545STakashi Iwai wait_queue_head_t shutdown_wait; 374d4dee0aSTakashi Iwai unsigned int quirk_flags; 38a4aad563STakashi Iwai unsigned int need_delayed_register:1; /* warn for delayed registration */ 391da177e4SLinus Torvalds int num_interfaces; 406392dcd1STakashi Iwai int last_iface; 41f85bf29cSOliver Neukum int num_suspended_intf; 4257dd5414STakashi Iwai int sample_rate_read_error; 431da177e4SLinus Torvalds 4417156f23SRuslan Bilovol int badd_profile; /* UAC3 BADD profile */ 4517156f23SRuslan Bilovol 461da177e4SLinus Torvalds struct list_head pcm_list; /* list of pcm streams */ 478fdff6a3SDaniel Mack struct list_head ep_list; /* list of audio-related endpoints */ 4800272c61STakashi Iwai struct list_head iface_ref_list; /* list of interface refcounts */ 49c11117b6STakashi Iwai struct list_head clock_ref_list; /* list of clock refcounts */ 501da177e4SLinus Torvalds int pcm_devs; 511da177e4SLinus Torvalds 52bb1bf4faSTakashi Iwai unsigned int num_rawmidis; /* number of created rawmidi devices */ 531da177e4SLinus Torvalds struct list_head midi_list; /* list of midi interfaces */ 54ff49d1dfSTakashi Iwai struct list_head midi_v2_list; /* list of MIDI 2 interfaces */ 551da177e4SLinus Torvalds 5684957a8aSClemens Ladisch struct list_head mixer_list; /* list of mixer interfaces */ 57e5779998SDaniel Mack 58e5779998SDaniel Mack int setup; /* from the 'device_setup' module param */ 5962abd092STakashi Iwai bool generic_implicit_fb; /* from the 'implicit_fb' module param */ 60ef02e29bSEldad Zack bool autoclock; /* from the 'autoclock' module param */ 6179f920fbSDaniel Mack 624801bee7STakashi Iwai bool lowlatency; /* from the 'lowlatency' module param */ 6379f920fbSDaniel Mack struct usb_host_interface *ctrl_intf; /* the audio control interface */ 6466354f18SShuah Khan struct media_device *media_dev; 6566354f18SShuah Khan struct media_intf_devnode *ctl_intf_media_devnode; 661da177e4SLinus Torvalds }; 671da177e4SLinus Torvalds 685fb45414STakashi Iwai #define USB_AUDIO_IFACE_UNUSED ((void *)-1L) 695fb45414STakashi Iwai 700ba41d91STakashi Iwai #define usb_audio_err(chip, fmt, args...) \ 710ba41d91STakashi Iwai dev_err(&(chip)->dev->dev, fmt, ##args) 722db2be56SChris Down #define usb_audio_err_ratelimited(chip, fmt, args...) \ 732db2be56SChris Down dev_err_ratelimited(&(chip)->dev->dev, fmt, ##args) 740ba41d91STakashi Iwai #define usb_audio_warn(chip, fmt, args...) \ 750ba41d91STakashi Iwai dev_warn(&(chip)->dev->dev, fmt, ##args) 760ba41d91STakashi Iwai #define usb_audio_info(chip, fmt, args...) \ 770ba41d91STakashi Iwai dev_info(&(chip)->dev->dev, fmt, ##args) 780ba41d91STakashi Iwai #define usb_audio_dbg(chip, fmt, args...) \ 790ba41d91STakashi Iwai dev_dbg(&(chip)->dev->dev, fmt, ##args) 800ba41d91STakashi Iwai 811da177e4SLinus Torvalds /* 821da177e4SLinus Torvalds * Information about devices with broken descriptors 831da177e4SLinus Torvalds */ 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds /* special values for .ifnum */ 86d7631453STakashi Iwai #define QUIRK_NODEV_INTERFACE -3 /* return -ENODEV */ 871da177e4SLinus Torvalds #define QUIRK_NO_INTERFACE -2 881da177e4SLinus Torvalds #define QUIRK_ANY_INTERFACE -1 891da177e4SLinus Torvalds 90854af957SClemens Ladisch enum quirk_type { 91854af957SClemens Ladisch QUIRK_IGNORE_INTERFACE, 92854af957SClemens Ladisch QUIRK_COMPOSITE, 93aafe77ccSClemens Ladisch QUIRK_AUTODETECT, 94854af957SClemens Ladisch QUIRK_MIDI_STANDARD_INTERFACE, 95854af957SClemens Ladisch QUIRK_MIDI_FIXED_ENDPOINT, 96854af957SClemens Ladisch QUIRK_MIDI_YAMAHA, 97aafe77ccSClemens Ladisch QUIRK_MIDI_ROLAND, 98854af957SClemens Ladisch QUIRK_MIDI_MIDIMAN, 99854af957SClemens Ladisch QUIRK_MIDI_NOVATION, 100c7f57216SClemens Ladisch QUIRK_MIDI_RAW_BYTES, 101854af957SClemens Ladisch QUIRK_MIDI_EMAGIC, 102cc7a59bdSClemens Ladisch QUIRK_MIDI_CME, 1034434ade8SKrzysztof Foltman QUIRK_MIDI_AKAI, 104030a07e4SKarsten Wiese QUIRK_MIDI_US122L, 1051ef0e0a0SKristian Amlie QUIRK_MIDI_FTDI, 1061ca8b201SClemens Ladisch QUIRK_MIDI_CH345, 107854af957SClemens Ladisch QUIRK_AUDIO_STANDARD_INTERFACE, 108854af957SClemens Ladisch QUIRK_AUDIO_FIXED_ENDPOINT, 109310e0dc0SPedro Lopez-Cabanillas QUIRK_AUDIO_EDIROL_UAXX, 110014950b0SDaniel Mack QUIRK_AUDIO_STANDARD_MIXER, 111854af957SClemens Ladisch 112854af957SClemens Ladisch QUIRK_TYPE_COUNT 113854af957SClemens Ladisch }; 1141da177e4SLinus Torvalds 1151da177e4SLinus Torvalds struct snd_usb_audio_quirk { 1161da177e4SLinus Torvalds const char *vendor_name; 1171da177e4SLinus Torvalds const char *product_name; 1181da177e4SLinus Torvalds int16_t ifnum; 119854af957SClemens Ladisch uint16_t type; 1201da177e4SLinus Torvalds const void *data; 1211da177e4SLinus Torvalds }; 1221da177e4SLinus Torvalds 123f4950882SJulian Anastasov #define combine_word(s) ((*(s)) | ((unsigned int)(s)[1] << 8)) 1241da177e4SLinus Torvalds #define combine_triple(s) (combine_word(s) | ((unsigned int)(s)[2] << 16)) 1251da177e4SLinus Torvalds #define combine_quad(s) (combine_triple(s) | ((unsigned int)(s)[3] << 24)) 1261da177e4SLinus Torvalds 12747ab1545STakashi Iwai int snd_usb_lock_shutdown(struct snd_usb_audio *chip); 12847ab1545STakashi Iwai void snd_usb_unlock_shutdown(struct snd_usb_audio *chip); 12947ab1545STakashi Iwai 130f274baa4STakashi Iwai extern bool snd_usb_use_vmalloc; 131f35ef592STakashi Iwai extern bool snd_usb_skip_validation; 132f274baa4STakashi Iwai 1334d4dee0aSTakashi Iwai /* 1344d4dee0aSTakashi Iwai * Driver behavior quirk flags, stored in chip->quirk_flags 1354d4dee0aSTakashi Iwai * 1364d4dee0aSTakashi Iwai * QUIRK_FLAG_GET_SAMPLE_RATE: 1374d4dee0aSTakashi Iwai * Skip reading sample rate for devices, as some devices behave inconsistently 1384d4dee0aSTakashi Iwai * or return error 139ce47d47eSTakashi Iwai * QUIRK_FLAG_SHARE_MEDIA_DEVICE: 140ce47d47eSTakashi Iwai * Create Media Controller API entries 141af158a7fSTakashi Iwai * QUIRK_FLAG_ALIGN_TRANSFER: 142af158a7fSTakashi Iwai * Allow alignment on audio sub-slot (channel samples) rather than on audio 143af158a7fSTakashi Iwai * slots (audio frames) 144c1b034a4STakashi Iwai * QUIRK_TX_LENGTH: 145c1b034a4STakashi Iwai * Add length specifier to transfers 146019c7f91STakashi Iwai * QUIRK_FLAG_PLAYBACK_FIRST: 147019c7f91STakashi Iwai * Start playback stream at first even in implement feedback mode 148f21dca85STakashi Iwai * QUIRK_FLAG_SKIP_CLOCK_SELECTOR: 149f21dca85STakashi Iwai * Skip clock selector setup; the device may reset to invalid state 150f21dca85STakashi Iwai * QUIRK_FLAG_IGNORE_CLOCK_SOURCE: 151f21dca85STakashi Iwai * Ignore errors from clock source search; i.e. hardcoded clock 1522de00d5aSTakashi Iwai * QUIRK_FLAG_ITF_USB_DSD_DAC: 1532de00d5aSTakashi Iwai * Indicates the device is for ITF-USB DSD based DACs that need a vendor cmd 1542de00d5aSTakashi Iwai * to switch between PCM and native DSD mode 155f7483854STakashi Iwai * QUIRK_FLAG_CTL_MSG_DELAY: 156f7483854STakashi Iwai * Add a delay of 20ms at each control message handling 157f7483854STakashi Iwai * QUIRK_FLAG_CTL_MSG_DELAY_1M: 158f7483854STakashi Iwai * Add a delay of 1-2ms at each control message handling 159f7483854STakashi Iwai * QUIRK_FLAG_CTL_MSG_DELAY_5M: 160f7483854STakashi Iwai * Add a delay of 5-6ms at each control message handling 1611f074fe5STakashi Iwai * QUIRK_FLAG_IFACE_DELAY: 1621f074fe5STakashi Iwai * Add a delay of 50ms at each interface setup 1638bfe17adSTakashi Iwai * QUIRK_FLAG_VALIDATE_RATES: 1648bfe17adSTakashi Iwai * Perform sample rate validations at probe 16544e6fc64STakashi Iwai * QUIRK_FLAG_DISABLE_AUTOSUSPEND: 16644e6fc64STakashi Iwai * Disable runtime PM autosuspend 1673c69dc91STakashi Iwai * QUIRK_FLAG_IGNORE_CTL_ERROR: 1683c69dc91STakashi Iwai * Ignore errors for mixer access 16968e851eeSTakashi Iwai * QUIRK_FLAG_DSD_RAW: 17068e851eeSTakashi Iwai * Support generic DSD raw U32_BE format 1716e413409STakashi Iwai * QUIRK_FLAG_SET_IFACE_FIRST: 1726e413409STakashi Iwai * Set up the interface at first like UAC1 1730f1f7a66STakashi Iwai * QUIRK_FLAG_GENERIC_IMPLICIT_FB 1740f1f7a66STakashi Iwai * Apply the generic implicit feedback sync mode (same as implicit_fb=1 option) 1750f1f7a66STakashi Iwai * QUIRK_FLAG_SKIP_IMPLICIT_FB 1760f1f7a66STakashi Iwai * Don't apply implicit feedback sync mode 177bf990c10SAi Chao * QUIRK_FLAG_IFACE_SKIP_CLOSE 178bf990c10SAi Chao * Don't closed interface during setting sample rate 17967df411dSJohn Keeping * QUIRK_FLAG_FORCE_IFACE_RESET 18067df411dSJohn Keeping * Force an interface reset whenever stopping & restarting a stream 18167df411dSJohn Keeping * (e.g. after xrun) 182fd28941cSJaroslav Kysela * QUIRK_FLAG_FIXED_RATE 183fd28941cSJaroslav Kysela * Do not set PCM rate (frequency) when only one rate is available 184fd28941cSJaroslav Kysela * for the given endpoint. 185*83c45de6STakashi Iwai * QUIRK_FLAG_MIC_RES_16 and QUIRK_FLAG_MIC_RES_384 186*83c45de6STakashi Iwai * Set the fixed resolution for Mic Capture Volume (mostly for webcams) 1874d4dee0aSTakashi Iwai */ 1884d4dee0aSTakashi Iwai 1894d4dee0aSTakashi Iwai #define QUIRK_FLAG_GET_SAMPLE_RATE (1U << 0) 190ce47d47eSTakashi Iwai #define QUIRK_FLAG_SHARE_MEDIA_DEVICE (1U << 1) 191af158a7fSTakashi Iwai #define QUIRK_FLAG_ALIGN_TRANSFER (1U << 2) 192c1b034a4STakashi Iwai #define QUIRK_FLAG_TX_LENGTH (1U << 3) 193019c7f91STakashi Iwai #define QUIRK_FLAG_PLAYBACK_FIRST (1U << 4) 194f21dca85STakashi Iwai #define QUIRK_FLAG_SKIP_CLOCK_SELECTOR (1U << 5) 195f21dca85STakashi Iwai #define QUIRK_FLAG_IGNORE_CLOCK_SOURCE (1U << 6) 1962de00d5aSTakashi Iwai #define QUIRK_FLAG_ITF_USB_DSD_DAC (1U << 7) 197f7483854STakashi Iwai #define QUIRK_FLAG_CTL_MSG_DELAY (1U << 8) 198f7483854STakashi Iwai #define QUIRK_FLAG_CTL_MSG_DELAY_1M (1U << 9) 199f7483854STakashi Iwai #define QUIRK_FLAG_CTL_MSG_DELAY_5M (1U << 10) 2001f074fe5STakashi Iwai #define QUIRK_FLAG_IFACE_DELAY (1U << 11) 2018bfe17adSTakashi Iwai #define QUIRK_FLAG_VALIDATE_RATES (1U << 12) 20244e6fc64STakashi Iwai #define QUIRK_FLAG_DISABLE_AUTOSUSPEND (1U << 13) 2033c69dc91STakashi Iwai #define QUIRK_FLAG_IGNORE_CTL_ERROR (1U << 14) 20468e851eeSTakashi Iwai #define QUIRK_FLAG_DSD_RAW (1U << 15) 2056e413409STakashi Iwai #define QUIRK_FLAG_SET_IFACE_FIRST (1U << 16) 2060f1f7a66STakashi Iwai #define QUIRK_FLAG_GENERIC_IMPLICIT_FB (1U << 17) 2070f1f7a66STakashi Iwai #define QUIRK_FLAG_SKIP_IMPLICIT_FB (1U << 18) 208bf990c10SAi Chao #define QUIRK_FLAG_IFACE_SKIP_CLOSE (1U << 19) 20967df411dSJohn Keeping #define QUIRK_FLAG_FORCE_IFACE_RESET (1U << 20) 210fd28941cSJaroslav Kysela #define QUIRK_FLAG_FIXED_RATE (1U << 21) 211*83c45de6STakashi Iwai #define QUIRK_FLAG_MIC_RES_16 (1U << 22) 212*83c45de6STakashi Iwai #define QUIRK_FLAG_MIC_RES_384 (1U << 23) 2134d4dee0aSTakashi Iwai 2141da177e4SLinus Torvalds #endif /* __USBAUDIO_H */ 215