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