Print this page
XXXX introduce drv_sectohz
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
+++ new/usr/src/uts/common/sys/usb/clients/audio/usb_ac/usb_ac.h
1 1 /*
2 2 * CDDL HEADER START
3 3 *
4 4 * The contents of this file are subject to the terms of the
5 5 * Common Development and Distribution License (the "License").
6 6 * You may not use this file except in compliance with the License.
7 7 *
8 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 * or http://www.opensolaris.org/os/licensing.
10 10 * See the License for the specific language governing permissions
11 11 * and limitations under the License.
12 12 *
13 13 * When distributing Covered Code, include this CDDL HEADER in each
14 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 * If applicable, add the following below this CDDL HEADER, with the
16 16 * fields enclosed by brackets "[]" replaced with your own identifying
17 17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 18 *
19 19 * CDDL HEADER END
20 20 */
21 21 /*
22 22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 23 * Use is subject to license terms.
24 24 */
25 25
26 26 #ifndef _SYS_USB_AC_H
27 27 #define _SYS_USB_AC_H
28 28
29 29
30 30
31 31 #ifdef __cplusplus
32 32 extern "C" {
33 33 #endif
34 34
35 35 #include <sys/sunldi.h>
36 36 #include <sys/usb/usba/usbai_private.h>
37 37
38 38
39 39 int usb_ac_open(dev_info_t *);
40 40 void usb_ac_close(dev_info_t *);
41 41
42 42
43 43 /* structure for each unit described by descriptors */
44 44 typedef struct usb_ac_unit_list {
45 45 uint_t acu_type;
46 46 void *acu_descriptor;
47 47 size_t acu_descr_length;
48 48 } usb_ac_unit_list_t;
49 49
50 50 #define USB_AC_ID_NONE 0
51 51
52 52 #define USB_AC_FIND_ONE 0
53 53 #define USB_AC_FIND_ALL 1
54 54 #define USB_AC_MAX_DEPTH 8
55 55
56 56 /*
57 57 * plumbing data; info per plumbed module
58 58 */
59 59 typedef struct usb_ac_plumbed {
60 60 struct usb_ac_state *acp_uacp; /* usb_ac state pointer */
61 61 dev_info_t *acp_dip; /* devinfo pointer */
62 62 uint_t acp_ifno; /* interface number */
63 63 int acp_driver; /* Plumbed driver, see value below */
64 64
65 65 ldi_handle_t acp_lh; /* ldi handle of plumbed driver */
66 66 dev_t acp_devt; /* devt of plumbed driver */
67 67 ddi_taskq_t *acp_tqp; /* taskq for I/O to plumbed driver */
68 68 int acp_flags;
69 69 #define ACP_ENABLED 1
70 70
71 71 void *acp_data; /* ptr to streams or hid data */
72 72 } usb_ac_plumbed_t;
73 73
74 74
75 75 /*
76 76 * request structure to usb_as: info per MCTL request;
77 77 * only one active at a time.
78 78 */
79 79 typedef struct usb_ac_to_as_req {
80 80 usb_audio_formats_t acr_curr_format; /* format data from mixer */
81 81 } usb_ac_to_as_req_t;
82 82
83 83
84 84 /* registration and plumbing info per streaming interface */
85 85 typedef struct usb_ac_streams_info {
86 86 /* ptr to entry in plumbed list */
87 87 usb_ac_plumbed_t *acs_plumbed;
88 88 /* valid registration data rcvd */
89 89 uint_t acs_rcvd_reg_data;
90 90 /* pointer to registration data */
91 91 usb_as_registration_t acs_streams_reg;
92 92
93 93
94 94 /* Multiple command management */
95 95 int acs_setup_teardown_count;
96 96
97 97 uint8_t acs_default_gain;
98 98 } usb_ac_streams_info_t;
99 99
100 100
101 101 /* power state */
102 102 typedef struct usb_ac_power {
103 103 void *acpm_state; /* points back to usb_ac_state */
104 104 int acpm_pm_busy; /* device busy accounting */
105 105 uint8_t acpm_wakeup_enabled;
106 106
107 107 /* this is the bit mask of the power states that device has */
108 108 uint8_t acpm_pwr_states;
109 109
110 110 /* wakeup and power transistion capabilites of an interface */
111 111 uint8_t acpm_capabilities;
112 112
113 113 /* current power level the device is in */
114 114 uint8_t acpm_current_power;
115 115 } usb_ac_power_t;
116 116
117 117 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_power_t::acpm_state))
118 118 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_power_t::acpm_wakeup_enabled))
119 119 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_power_t::acpm_pwr_states))
120 120 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_power_t::acpm_capabilities))
121 121
122 122 typedef struct usb_audio_format {
123 123 int sr; /* sample rate */
124 124 uint_t ch; /* channels */
125 125 uint_t prec; /* precision */
126 126 uint_t enc; /* encoding */
127 127 } usb_audio_format_t;
128 128
129 129
130 130 typedef struct usb_audio_eng {
131 131 void *statep;
132 132 usb_ac_streams_info_t *streams;
133 133 audio_engine_t *af_engp;
134 134
135 135 int af_eflags; /* ENGINE_* flags */
136 136 usb_audio_format_t fmt;
137 137 uint64_t af_defgain;
138 138
139 139 unsigned intrate; /* interrupt rate */
140 140 unsigned sampsz; /* sample size */
141 141 unsigned framesz; /* frame size */
142 142 unsigned fragsz; /* fragment size */
143 143 unsigned nfrags; /* number of fragments in buffer */
144 144 unsigned fragfr; /* number of frames per fragment */
145 145 unsigned frsmshift; /* right shift: frames in sample cnt */
146 146 unsigned smszshift; /* left shift: sample cnt * sampsz */
147 147
148 148
149 149 caddr_t bufp; /* I/O buf; framework to/from drv */
150 150 unsigned bufsz; /* buffer size */
151 151 caddr_t bufpos; /* buffer position */
152 152 caddr_t bufendp; /* end of buffer */
153 153
154 154
155 155 uint64_t frames;
156 156 uint64_t io_count; /* i/o requests from the driver */
157 157 uint64_t bufio_count; /* i/o requests to the framework */
158 158
159 159 boolean_t started;
160 160 boolean_t busy;
161 161
162 162 kcondvar_t usb_audio_cv;
163 163
164 164 kmutex_t lock;
165 165 } usb_audio_eng_t;
166 166
167 167
168 168 /* limits */
169 169 #define USB_AC_MAX_PLUMBED 3 /* play, record, hid */
170 170 #define USB_AC_MAX_AS_PLUMBED 2 /* play, record */
171 171 typedef struct usb_ac_state usb_ac_state_t;
172 172 typedef struct usb_audio_ctrl {
173 173 audio_ctrl_t *af_ctrlp; /* framework handle */
174 174 usb_ac_state_t *statep;
175 175
176 176 kmutex_t ctrl_mutex;
177 177 uint64_t cval; /* current control value */
178 178 } usb_audio_ctrl_t;
179 179
180 180 enum {
181 181 CTL_VOLUME_MONO = 0,
182 182 CTL_VOLUME_STERO,
183 183 CTL_REC_MONO,
184 184 CTL_REC_STERO,
185 185 CTL_REC_SRC,
186 186 CTL_MONITOR_GAIN,
187 187 CTL_MIC_BOOST,
188 188 CTL_NUM
189 189 };
190 190
191 191 #define USB_AC_ENG_MAX 2
192 192
193 193 /* usb_ac soft state */
194 194 struct usb_ac_state {
195 195
196 196 dev_info_t *usb_ac_dip;
197 197 uint_t usb_ac_instance;
198 198 usb_log_handle_t usb_ac_log_handle;
199 199
200 200 uint_t usb_ac_dev_state;
201 201 uint_t usb_ac_ifno;
202 202 kmutex_t usb_ac_mutex;
203 203
204 204 usb_client_dev_data_t *usb_ac_dev_data; /* registration data */
205 205 audio_dev_t *usb_ac_audio_dev;
206 206
207 207
208 208
209 209
210 210 usb_audio_eng_t engines[USB_AC_ENG_MAX];
211 211
212 212
213 213
214 214 int flags;
215 215 usb_audio_ctrl_t *controls[CTL_NUM];
216 216
217 217 /* descriptors */
218 218 usb_if_descr_t usb_ac_if_descr;
219 219
220 220 /* unit number array, indexed by unit ID */
221 221 uint_t usb_ac_max_unit;
222 222 usb_ac_unit_list_t *usb_ac_units;
223 223
224 224 /* adjacency matrix for reflecting connections */
225 225 uchar_t **usb_ac_connections;
226 226 size_t usb_ac_connections_len;
227 227 uchar_t *usb_ac_connections_a;
228 228 size_t usb_ac_connections_a_len;
229 229 uchar_t *usb_ac_unit_type;
230 230 uchar_t *usb_ac_traverse_path;
231 231 uchar_t usb_ac_traverse_path_index;
232 232
233 233 /* port types, eg LINE IN, Micr, Speakers */
234 234 uint64_t usb_ac_input_ports;
235 235 uint64_t usb_ac_output_ports;
236 236
237 237 /* pipe handle */
238 238 usb_pipe_handle_t usb_ac_default_ph;
239 239
240 240 /* serial access */
241 241 usb_serialization_t usb_ac_ser_acc;
242 242
243 243 /* power management */
244 244 usb_ac_power_t *usb_ac_pm; /* power capabilities */
245 245
246 246 /* mixer registration data */
247 247 uint_t usb_ac_registered_with_mixer;
248 248
249 249 /* plumbing management */
250 250 uint_t usb_ac_plumbing_state;
251 251 ushort_t usb_ac_busy_count;
252 252 usb_ac_plumbed_t usb_ac_plumbed[USB_AC_MAX_PLUMBED];
253 253
254 254 /* Current plumbed module index to usb_ac_plumbed structure */
255 255 int usb_ac_current_plumbed_index;
256 256
257 257 /* per streams interface info */
258 258 usb_ac_streams_info_t usb_ac_streams[USB_AC_MAX_AS_PLUMBED];
259 259
260 260
261 261 ddi_taskq_t *tqp;
262 262
263 263 char dstr[64];
264 264 };
265 265
266 266 /* warlock directives, stable data */
267 267 _NOTE(MUTEX_PROTECTS_DATA(usb_ac_state_t::usb_ac_mutex, usb_ac_state_t))
268 268 _NOTE(MUTEX_PROTECTS_DATA(usb_ac_state_t::usb_ac_mutex, usb_ac_power_t))
269 269 _NOTE(MUTEX_PROTECTS_DATA(usb_ac_state_t::usb_ac_mutex, usb_ac_plumbed_t))
270 270 _NOTE(MUTEX_PROTECTS_DATA(usb_audio_eng_t::lock, usb_audio_eng_t))
271 271 _NOTE(MUTEX_PROTECTS_DATA(usb_audio_eng_t::lock, usb_audio_format_t))
272 272 _NOTE(MUTEX_PROTECTS_DATA(usb_audio_ctrl_t::ctrl_mutex, usb_audio_ctrl_t))
273 273
274 274
275 275 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_dip))
276 276 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_ser_acc))
277 277 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_pm))
278 278 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_instance))
279 279 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_default_ph))
280 280 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_log_handle))
281 281 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_if_descr))
282 282 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_dev_data))
283 283 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_ifno))
284 284 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::flags))
285 285 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_input_ports))
286 286 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::engines))
287 287 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::usb_ac_audio_dev))
288 288 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_state_t::controls))
289 289
290 290 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::af_eflags))
291 291 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::streams))
292 292 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::statep))
293 293 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::fmt))
294 294 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::fragfr))
295 295 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::frsmshift))
296 296 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::started))
297 297 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::af_engp))
298 298 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::io_count))
299 299 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_eng_t::intrate))
300 300
301 301 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_ctrl_t::statep))
302 302 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_ctrl_t::af_ctrlp))
303 303 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_ctrl_t::cval))
304 304
305 305 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_plumbed_t::acp_tqp))
306 306 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_ac_plumbed_t::acp_uacp))
307 307
308 308 _NOTE(DATA_READABLE_WITHOUT_LOCK(usb_audio_format_t::ch))
309 309
310 310 /* usb_ac driver only care about two states: plumbed or unplumbed */
311 311 #define USB_AC_STATE_UNPLUMBED 0
312 312 #define USB_AC_STATE_PLUMBED 1
313 313 #define USB_AC_STATE_PLUMBED_RESTORING 2
314 314
↓ open down ↓ |
314 lines elided |
↑ open up ↑ |
315 315 /* Default pipe states */
316 316 #define USB_AC_DEF_CLOSED 0
317 317 #define USB_AC_DEF_OPENED 1
318 318
319 319 #define USB_AC_BUFFER_SIZE 256 /* descriptor buffer size */
320 320
321 321
322 322 /*
323 323 * delay before restoring state
324 324 */
325 -#define USB_AC_RESTORE_DELAY drv_usectohz(1000000)
325 +#define USB_AC_RESTORE_DELAY drv_sectohz(1)
326 326
327 327 /* value for acp_driver */
328 328 #define USB_AS_PLUMBED 1
329 329 #define USB_AH_PLUMBED 2
330 330 #define UNKNOWN_PLUMBED 3
331 331
332 332 /* other useful macros */
333 333 #define offsetof(s, m) ((size_t)(&(((s *)0)->m)))
334 334
335 335
336 336
337 337
338 338
339 339
340 340 #define AF_REGISTERED 0x1
341 341 #define AD_SETUP 0x10
342 342
343 343
344 344 int usb_audio_attach(usb_ac_state_t *);
345 345 /*
346 346 * framework gain range
347 347 */
348 348 #define AUDIO_CTRL_STEREO_VAL(l, r) (((l) & 0xff) | (((r) & 0xff) << 8))
349 349 #define AUDIO_CTRL_STEREO_LEFT(v) ((uint8_t)((v) & 0xff))
350 350 #define AUDIO_CTRL_STEREO_RIGHT(v) ((uint8_t)(((v) >> 8) & 0xff))
351 351
352 352
353 353 #define AF_MAX_GAIN 100
354 354 #define AF_MIN_GAIN 0
355 355
356 356
357 357
358 358 int usb_ac_get_audio(void *, void *, int);
359 359
360 360 void usb_ac_send_audio(void *, void *, int);
361 361
362 362 void usb_ac_stop_play(usb_ac_state_t *, usb_audio_eng_t *);
363 363
364 364
365 365 #ifdef __cplusplus
366 366 }
367 367 #endif
368 368
369 369 #endif /* _SYS_USB_AC_H */
↓ open down ↓ |
34 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX