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