1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun #ifndef __USBAUDIO_H 3*4882a593Smuzhiyun #define __USBAUDIO_H 4*4882a593Smuzhiyun /* 5*4882a593Smuzhiyun * (Tentative) USB Audio Driver for ALSA 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun /* handling of USB vendor/product ID pairs as 32-bit numbers */ 11*4882a593Smuzhiyun #define USB_ID(vendor, product) (((unsigned int)(vendor) << 16) | (product)) 12*4882a593Smuzhiyun #define USB_ID_VENDOR(id) ((id) >> 16) 13*4882a593Smuzhiyun #define USB_ID_PRODUCT(id) ((u16)(id)) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/android_kabi.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct media_device; 22*4882a593Smuzhiyun struct media_intf_devnode; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define MAX_CARD_INTERFACES 16 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct snd_usb_audio { 27*4882a593Smuzhiyun int index; 28*4882a593Smuzhiyun struct usb_device *dev; 29*4882a593Smuzhiyun struct snd_card *card; 30*4882a593Smuzhiyun struct usb_interface *intf[MAX_CARD_INTERFACES]; 31*4882a593Smuzhiyun u32 usb_id; 32*4882a593Smuzhiyun uint16_t quirk_type; 33*4882a593Smuzhiyun struct mutex mutex; 34*4882a593Smuzhiyun unsigned int system_suspend; 35*4882a593Smuzhiyun atomic_t active; 36*4882a593Smuzhiyun atomic_t shutdown; 37*4882a593Smuzhiyun atomic_t usage_count; 38*4882a593Smuzhiyun wait_queue_head_t shutdown_wait; 39*4882a593Smuzhiyun unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */ 40*4882a593Smuzhiyun unsigned int tx_length_quirk:1; /* Put length specifier in transfers */ 41*4882a593Smuzhiyun unsigned int setup_fmt_after_resume_quirk:1; /* setup the format to interface after resume */ 42*4882a593Smuzhiyun unsigned int need_delayed_register:1; /* warn for delayed registration */ 43*4882a593Smuzhiyun int num_interfaces; 44*4882a593Smuzhiyun int num_suspended_intf; 45*4882a593Smuzhiyun int sample_rate_read_error; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun int badd_profile; /* UAC3 BADD profile */ 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct list_head pcm_list; /* list of pcm streams */ 50*4882a593Smuzhiyun struct list_head ep_list; /* list of audio-related endpoints */ 51*4882a593Smuzhiyun int pcm_devs; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct list_head midi_list; /* list of midi interfaces */ 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct list_head mixer_list; /* list of mixer interfaces */ 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun int setup; /* from the 'device_setup' module param */ 58*4882a593Smuzhiyun bool autoclock; /* from the 'autoclock' module param */ 59*4882a593Smuzhiyun bool keep_iface; /* keep interface/altset after closing 60*4882a593Smuzhiyun * or parameter change 61*4882a593Smuzhiyun */ 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun struct usb_host_interface *ctrl_intf; /* the audio control interface */ 64*4882a593Smuzhiyun struct media_device *media_dev; 65*4882a593Smuzhiyun struct media_intf_devnode *ctl_intf_media_devnode; 66*4882a593Smuzhiyun struct mutex dev_lock; /* to protect any race with disconnect */ 67*4882a593Smuzhiyun int card_num; /* cache pcm card number to use upon disconnect */ 68*4882a593Smuzhiyun void (*disconnect_cb)(struct snd_usb_audio *chip); 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1); 71*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2); 72*4882a593Smuzhiyun ANDROID_KABI_RESERVE(3); 73*4882a593Smuzhiyun ANDROID_KABI_RESERVE(4); 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define USB_AUDIO_IFACE_UNUSED ((void *)-1L) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define usb_audio_err(chip, fmt, args...) \ 79*4882a593Smuzhiyun dev_err(&(chip)->dev->dev, fmt, ##args) 80*4882a593Smuzhiyun #define usb_audio_warn(chip, fmt, args...) \ 81*4882a593Smuzhiyun dev_warn(&(chip)->dev->dev, fmt, ##args) 82*4882a593Smuzhiyun #define usb_audio_info(chip, fmt, args...) \ 83*4882a593Smuzhiyun dev_info(&(chip)->dev->dev, fmt, ##args) 84*4882a593Smuzhiyun #define usb_audio_dbg(chip, fmt, args...) \ 85*4882a593Smuzhiyun dev_dbg(&(chip)->dev->dev, fmt, ##args) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* 88*4882a593Smuzhiyun * Information about devices with broken descriptors 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* special values for .ifnum */ 92*4882a593Smuzhiyun #define QUIRK_NO_INTERFACE -2 93*4882a593Smuzhiyun #define QUIRK_ANY_INTERFACE -1 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun enum quirk_type { 96*4882a593Smuzhiyun QUIRK_IGNORE_INTERFACE, 97*4882a593Smuzhiyun QUIRK_COMPOSITE, 98*4882a593Smuzhiyun QUIRK_AUTODETECT, 99*4882a593Smuzhiyun QUIRK_MIDI_STANDARD_INTERFACE, 100*4882a593Smuzhiyun QUIRK_MIDI_FIXED_ENDPOINT, 101*4882a593Smuzhiyun QUIRK_MIDI_YAMAHA, 102*4882a593Smuzhiyun QUIRK_MIDI_ROLAND, 103*4882a593Smuzhiyun QUIRK_MIDI_MIDIMAN, 104*4882a593Smuzhiyun QUIRK_MIDI_NOVATION, 105*4882a593Smuzhiyun QUIRK_MIDI_RAW_BYTES, 106*4882a593Smuzhiyun QUIRK_MIDI_EMAGIC, 107*4882a593Smuzhiyun QUIRK_MIDI_CME, 108*4882a593Smuzhiyun QUIRK_MIDI_AKAI, 109*4882a593Smuzhiyun QUIRK_MIDI_US122L, 110*4882a593Smuzhiyun QUIRK_MIDI_FTDI, 111*4882a593Smuzhiyun QUIRK_MIDI_CH345, 112*4882a593Smuzhiyun QUIRK_AUDIO_STANDARD_INTERFACE, 113*4882a593Smuzhiyun QUIRK_AUDIO_FIXED_ENDPOINT, 114*4882a593Smuzhiyun QUIRK_AUDIO_EDIROL_UAXX, 115*4882a593Smuzhiyun QUIRK_AUDIO_ALIGN_TRANSFER, 116*4882a593Smuzhiyun QUIRK_AUDIO_STANDARD_MIXER, 117*4882a593Smuzhiyun QUIRK_SETUP_FMT_AFTER_RESUME, 118*4882a593Smuzhiyun QUIRK_SETUP_DISABLE_AUTOSUSPEND, 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun QUIRK_TYPE_COUNT 121*4882a593Smuzhiyun }; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun struct snd_usb_audio_quirk { 124*4882a593Smuzhiyun const char *vendor_name; 125*4882a593Smuzhiyun const char *product_name; 126*4882a593Smuzhiyun int16_t ifnum; 127*4882a593Smuzhiyun uint16_t type; 128*4882a593Smuzhiyun bool shares_media_device; 129*4882a593Smuzhiyun const void *data; 130*4882a593Smuzhiyun }; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define combine_word(s) ((*(s)) | ((unsigned int)(s)[1] << 8)) 133*4882a593Smuzhiyun #define combine_triple(s) (combine_word(s) | ((unsigned int)(s)[2] << 16)) 134*4882a593Smuzhiyun #define combine_quad(s) (combine_triple(s) | ((unsigned int)(s)[3] << 24)) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun int snd_usb_lock_shutdown(struct snd_usb_audio *chip); 137*4882a593Smuzhiyun void snd_usb_unlock_shutdown(struct snd_usb_audio *chip); 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun extern bool snd_usb_use_vmalloc; 140*4882a593Smuzhiyun extern bool snd_usb_skip_validation; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun struct audioformat; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun enum snd_vendor_pcm_open_close { 145*4882a593Smuzhiyun SOUND_PCM_CLOSE = 0, 146*4882a593Smuzhiyun SOUND_PCM_OPEN, 147*4882a593Smuzhiyun }; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /** 150*4882a593Smuzhiyun * struct snd_usb_audio_vendor_ops - function callbacks for USB audio accelerators 151*4882a593Smuzhiyun * @connect: called when a new interface is found 152*4882a593Smuzhiyun * @disconnect: called when an interface is removed 153*4882a593Smuzhiyun * @set_interface: called when an interface is initialized 154*4882a593Smuzhiyun * @set_rate: called when the rate is set 155*4882a593Smuzhiyun * @set_pcm_buf: called when the pcm buffer is set 156*4882a593Smuzhiyun * @set_pcm_intf: called when the pcm interface is set 157*4882a593Smuzhiyun * @set_pcm_connection: called when pcm is opened/closed 158*4882a593Smuzhiyun * @set_pcm_binterval: called when the pcm binterval is set 159*4882a593Smuzhiyun * @usb_add_ctls: called when USB controls are added 160*4882a593Smuzhiyun * 161*4882a593Smuzhiyun * Set of callbacks for some accelerated USB audio streaming hardware. 162*4882a593Smuzhiyun * 163*4882a593Smuzhiyun * TODO: make this USB host-controller specific, right now this only works for 164*4882a593Smuzhiyun * one USB controller in the system at a time, which is only realistic for 165*4882a593Smuzhiyun * self-contained systems like phones. 166*4882a593Smuzhiyun */ 167*4882a593Smuzhiyun struct snd_usb_audio_vendor_ops { 168*4882a593Smuzhiyun int (*connect)(struct usb_interface *intf); 169*4882a593Smuzhiyun void (*disconnect)(struct usb_interface *intf); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun int (*set_interface)(struct usb_device *udev, 172*4882a593Smuzhiyun struct usb_host_interface *alts, 173*4882a593Smuzhiyun int iface, int alt); 174*4882a593Smuzhiyun int (*set_rate)(struct usb_interface *intf, int iface, int rate, 175*4882a593Smuzhiyun int alt); 176*4882a593Smuzhiyun int (*set_pcm_buf)(struct usb_device *udev, int iface); 177*4882a593Smuzhiyun int (*set_pcm_intf)(struct usb_interface *intf, int iface, int alt, 178*4882a593Smuzhiyun int direction); 179*4882a593Smuzhiyun int (*set_pcm_connection)(struct usb_device *udev, 180*4882a593Smuzhiyun enum snd_vendor_pcm_open_close onoff, 181*4882a593Smuzhiyun int direction); 182*4882a593Smuzhiyun int (*set_pcm_binterval)(struct audioformat *fp, 183*4882a593Smuzhiyun struct audioformat *found, 184*4882a593Smuzhiyun int *cur_attr, int *attr); 185*4882a593Smuzhiyun int (*usb_add_ctls)(struct snd_usb_audio *chip); 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun ANDROID_KABI_RESERVE(1); 188*4882a593Smuzhiyun ANDROID_KABI_RESERVE(2); 189*4882a593Smuzhiyun }; 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun #endif /* __USBAUDIO_H */ 192