]>
Commit | Line | Data |
---|---|---|
719f82d3 EB |
1 | /***************************************************************************** |
2 | ||
3 | AudioScience HPI driver | |
4 | Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com> | |
5 | ||
6 | This program is free software; you can redistribute it and/or modify | |
7 | it under the terms of version 2 of the GNU General Public License as | |
8 | published by the Free Software Foundation; | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program; if not, write to the Free Software | |
17 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | ||
19 | Debug macros. | |
20 | ||
21 | *****************************************************************************/ | |
22 | ||
23 | #ifndef _HPIDEBUG_H | |
24 | #define _HPIDEBUG_H | |
25 | ||
26 | #include "hpi_internal.h" | |
27 | ||
28 | /* Define debugging levels. */ | |
29 | enum { HPI_DEBUG_LEVEL_ERROR = 0, /* always log errors */ | |
30 | HPI_DEBUG_LEVEL_WARNING = 1, | |
31 | HPI_DEBUG_LEVEL_NOTICE = 2, | |
32 | HPI_DEBUG_LEVEL_INFO = 3, | |
33 | HPI_DEBUG_LEVEL_DEBUG = 4, | |
34 | HPI_DEBUG_LEVEL_VERBOSE = 5 /* same printk level as DEBUG */ | |
35 | }; | |
36 | ||
37 | #define HPI_DEBUG_LEVEL_DEFAULT HPI_DEBUG_LEVEL_NOTICE | |
38 | ||
39 | /* an OS can define an extra flag string that is appended to | |
40 | the start of each message, eg see hpios_linux.h */ | |
41 | ||
42 | #ifdef SOURCEFILE_NAME | |
43 | #define FILE_LINE SOURCEFILE_NAME ":" __stringify(__LINE__) " " | |
44 | #else | |
45 | #define FILE_LINE __FILE__ ":" __stringify(__LINE__) " " | |
46 | #endif | |
47 | ||
48 | #if defined(HPI_DEBUG) && defined(_WINDOWS) | |
49 | #define HPI_DEBUGBREAK() debug_break() | |
50 | #else | |
51 | #define HPI_DEBUGBREAK() | |
52 | #endif | |
53 | ||
54 | #define HPI_DEBUG_ASSERT(expression) \ | |
55 | do { \ | |
56 | if (!(expression)) {\ | |
57 | printk(KERN_ERR FILE_LINE\ | |
58 | "ASSERT " __stringify(expression));\ | |
59 | HPI_DEBUGBREAK();\ | |
60 | } \ | |
61 | } while (0) | |
62 | ||
63 | #define HPI_DEBUG_LOG(level, ...) \ | |
64 | do { \ | |
65 | if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ | |
66 | printk(HPI_DEBUG_FLAG_##level \ | |
67 | FILE_LINE __VA_ARGS__); \ | |
68 | } \ | |
69 | } while (0) | |
70 | ||
71 | void hpi_debug_init(void); | |
72 | int hpi_debug_level_set(int level); | |
73 | int hpi_debug_level_get(void); | |
74 | /* needed by Linux driver for dynamic debug level changes */ | |
75 | extern int hpi_debug_level; | |
76 | ||
77 | void hpi_debug_message(struct hpi_message *phm, char *sz_fileline); | |
78 | ||
79 | void hpi_debug_data(u16 *pdata, u32 len); | |
80 | ||
81 | #define HPI_DEBUG_DATA(pdata, len) \ | |
82 | do { \ | |
83 | if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) \ | |
84 | hpi_debug_data(pdata, len); \ | |
85 | } while (0) | |
86 | ||
87 | #define HPI_DEBUG_MESSAGE(level, phm) \ | |
88 | do { \ | |
89 | if (hpi_debug_level >= HPI_DEBUG_LEVEL_##level) { \ | |
90 | hpi_debug_message(phm,HPI_DEBUG_FLAG_##level \ | |
91 | FILE_LINE __stringify(level));\ | |
92 | } \ | |
93 | } while (0) | |
94 | ||
95 | #define HPI_DEBUG_RESPONSE(phr) \ | |
96 | do { \ | |
97 | if ((hpi_debug_level >= HPI_DEBUG_LEVEL_DEBUG) && (phr->error))\ | |
98 | HPI_DEBUG_LOG(ERROR, \ | |
99 | "HPI response - error# %d\n", \ | |
100 | phr->error); \ | |
101 | else if (hpi_debug_level >= HPI_DEBUG_LEVEL_VERBOSE) \ | |
102 | HPI_DEBUG_LOG(VERBOSE, "HPI response OK\n");\ | |
103 | } while (0) | |
104 | ||
105 | #ifndef compile_time_assert | |
106 | #define compile_time_assert(cond, msg) \ | |
107 | typedef char msg[(cond) ? 1 : -1] | |
108 | #endif | |
109 | ||
110 | /* check that size is exactly some number */ | |
111 | #define function_count_check(sym, size) \ | |
112 | compile_time_assert((sym##_FUNCTION_COUNT) == (size),\ | |
113 | strings_match_defs_##sym) | |
114 | ||
115 | /* These strings should be generated using a macro which defines | |
116 | the corresponding symbol values. */ | |
117 | #define HPI_OBJ_STRINGS \ | |
118 | { \ | |
119 | "HPI_OBJ_SUBSYSTEM", \ | |
120 | "HPI_OBJ_ADAPTER", \ | |
121 | "HPI_OBJ_OSTREAM", \ | |
122 | "HPI_OBJ_ISTREAM", \ | |
123 | "HPI_OBJ_MIXER", \ | |
124 | "HPI_OBJ_NODE", \ | |
125 | "HPI_OBJ_CONTROL", \ | |
126 | "HPI_OBJ_NVMEMORY", \ | |
127 | "HPI_OBJ_DIGITALIO", \ | |
128 | "HPI_OBJ_WATCHDOG", \ | |
129 | "HPI_OBJ_CLOCK", \ | |
130 | "HPI_OBJ_PROFILE", \ | |
131 | "HPI_OBJ_CONTROLEX" \ | |
132 | } | |
133 | ||
134 | #define HPI_SUBSYS_STRINGS \ | |
135 | { \ | |
136 | "HPI_SUBSYS_OPEN", \ | |
137 | "HPI_SUBSYS_GET_VERSION", \ | |
138 | "HPI_SUBSYS_GET_INFO", \ | |
139 | "HPI_SUBSYS_FIND_ADAPTERS", \ | |
140 | "HPI_SUBSYS_CREATE_ADAPTER",\ | |
141 | "HPI_SUBSYS_CLOSE", \ | |
142 | "HPI_SUBSYS_DELETE_ADAPTER", \ | |
143 | "HPI_SUBSYS_DRIVER_LOAD", \ | |
144 | "HPI_SUBSYS_DRIVER_UNLOAD", \ | |
145 | "HPI_SUBSYS_READ_PORT_8", \ | |
146 | "HPI_SUBSYS_WRITE_PORT_8", \ | |
147 | "HPI_SUBSYS_GET_NUM_ADAPTERS",\ | |
148 | "HPI_SUBSYS_GET_ADAPTER", \ | |
149 | "HPI_SUBSYS_SET_NETWORK_INTERFACE"\ | |
150 | } | |
151 | function_count_check(HPI_SUBSYS, 14); | |
152 | ||
153 | #define HPI_ADAPTER_STRINGS \ | |
154 | { \ | |
155 | "HPI_ADAPTER_OPEN", \ | |
156 | "HPI_ADAPTER_CLOSE", \ | |
157 | "HPI_ADAPTER_GET_INFO", \ | |
158 | "HPI_ADAPTER_GET_ASSERT", \ | |
159 | "HPI_ADAPTER_TEST_ASSERT", \ | |
160 | "HPI_ADAPTER_SET_MODE", \ | |
161 | "HPI_ADAPTER_GET_MODE", \ | |
162 | "HPI_ADAPTER_ENABLE_CAPABILITY",\ | |
163 | "HPI_ADAPTER_SELFTEST", \ | |
164 | "HPI_ADAPTER_FIND_OBJECT", \ | |
165 | "HPI_ADAPTER_QUERY_FLASH", \ | |
166 | "HPI_ADAPTER_START_FLASH", \ | |
167 | "HPI_ADAPTER_PROGRAM_FLASH", \ | |
168 | "HPI_ADAPTER_SET_PROPERTY", \ | |
169 | "HPI_ADAPTER_GET_PROPERTY", \ | |
170 | "HPI_ADAPTER_ENUM_PROPERTY", \ | |
171 | "HPI_ADAPTER_MODULE_INFO", \ | |
172 | "HPI_ADAPTER_DEBUG_READ" \ | |
173 | } | |
174 | ||
175 | function_count_check(HPI_ADAPTER, 18); | |
176 | ||
177 | #define HPI_OSTREAM_STRINGS \ | |
178 | { \ | |
179 | "HPI_OSTREAM_OPEN", \ | |
180 | "HPI_OSTREAM_CLOSE", \ | |
181 | "HPI_OSTREAM_WRITE", \ | |
182 | "HPI_OSTREAM_START", \ | |
183 | "HPI_OSTREAM_STOP", \ | |
184 | "HPI_OSTREAM_RESET", \ | |
185 | "HPI_OSTREAM_GET_INFO", \ | |
186 | "HPI_OSTREAM_QUERY_FORMAT", \ | |
187 | "HPI_OSTREAM_DATA", \ | |
188 | "HPI_OSTREAM_SET_VELOCITY", \ | |
189 | "HPI_OSTREAM_SET_PUNCHINOUT", \ | |
190 | "HPI_OSTREAM_SINEGEN", \ | |
191 | "HPI_OSTREAM_ANC_RESET", \ | |
192 | "HPI_OSTREAM_ANC_GET_INFO", \ | |
193 | "HPI_OSTREAM_ANC_READ", \ | |
194 | "HPI_OSTREAM_SET_TIMESCALE",\ | |
195 | "HPI_OSTREAM_SET_FORMAT", \ | |
196 | "HPI_OSTREAM_HOSTBUFFER_ALLOC", \ | |
197 | "HPI_OSTREAM_HOSTBUFFER_FREE", \ | |
198 | "HPI_OSTREAM_GROUP_ADD",\ | |
199 | "HPI_OSTREAM_GROUP_GETMAP", \ | |
200 | "HPI_OSTREAM_GROUP_RESET", \ | |
201 | "HPI_OSTREAM_HOSTBUFFER_GET_INFO", \ | |
202 | "HPI_OSTREAM_WAIT_START", \ | |
203 | } | |
204 | function_count_check(HPI_OSTREAM, 24); | |
205 | ||
206 | #define HPI_ISTREAM_STRINGS \ | |
207 | { \ | |
208 | "HPI_ISTREAM_OPEN", \ | |
209 | "HPI_ISTREAM_CLOSE", \ | |
210 | "HPI_ISTREAM_SET_FORMAT", \ | |
211 | "HPI_ISTREAM_READ", \ | |
212 | "HPI_ISTREAM_START", \ | |
213 | "HPI_ISTREAM_STOP", \ | |
214 | "HPI_ISTREAM_RESET", \ | |
215 | "HPI_ISTREAM_GET_INFO", \ | |
216 | "HPI_ISTREAM_QUERY_FORMAT", \ | |
217 | "HPI_ISTREAM_ANC_RESET", \ | |
218 | "HPI_ISTREAM_ANC_GET_INFO", \ | |
219 | "HPI_ISTREAM_ANC_WRITE", \ | |
220 | "HPI_ISTREAM_HOSTBUFFER_ALLOC",\ | |
221 | "HPI_ISTREAM_HOSTBUFFER_FREE", \ | |
222 | "HPI_ISTREAM_GROUP_ADD", \ | |
223 | "HPI_ISTREAM_GROUP_GETMAP", \ | |
224 | "HPI_ISTREAM_GROUP_RESET", \ | |
225 | "HPI_ISTREAM_HOSTBUFFER_GET_INFO", \ | |
226 | "HPI_ISTREAM_WAIT_START", \ | |
227 | } | |
228 | function_count_check(HPI_ISTREAM, 19); | |
229 | ||
230 | #define HPI_MIXER_STRINGS \ | |
231 | { \ | |
232 | "HPI_MIXER_OPEN", \ | |
233 | "HPI_MIXER_CLOSE", \ | |
234 | "HPI_MIXER_GET_INFO", \ | |
235 | "HPI_MIXER_GET_NODE_INFO", \ | |
236 | "HPI_MIXER_GET_CONTROL", \ | |
237 | "HPI_MIXER_SET_CONNECTION", \ | |
238 | "HPI_MIXER_GET_CONNECTIONS", \ | |
239 | "HPI_MIXER_GET_CONTROL_BY_INDEX", \ | |
240 | "HPI_MIXER_GET_CONTROL_ARRAY_BY_INDEX", \ | |
241 | "HPI_MIXER_GET_CONTROL_MULTIPLE_VALUES", \ | |
242 | "HPI_MIXER_STORE", \ | |
243 | } | |
244 | function_count_check(HPI_MIXER, 11); | |
245 | ||
246 | #define HPI_CONTROL_STRINGS \ | |
247 | { \ | |
248 | "HPI_CONTROL_GET_INFO", \ | |
249 | "HPI_CONTROL_GET_STATE", \ | |
250 | "HPI_CONTROL_SET_STATE" \ | |
251 | } | |
252 | function_count_check(HPI_CONTROL, 3); | |
253 | ||
254 | #define HPI_NVMEMORY_STRINGS \ | |
255 | { \ | |
256 | "HPI_NVMEMORY_OPEN", \ | |
257 | "HPI_NVMEMORY_READ_BYTE", \ | |
258 | "HPI_NVMEMORY_WRITE_BYTE" \ | |
259 | } | |
260 | function_count_check(HPI_NVMEMORY, 3); | |
261 | ||
262 | #define HPI_DIGITALIO_STRINGS \ | |
263 | { \ | |
264 | "HPI_GPIO_OPEN", \ | |
265 | "HPI_GPIO_READ_BIT", \ | |
266 | "HPI_GPIO_WRITE_BIT", \ | |
267 | "HPI_GPIO_READ_ALL", \ | |
268 | "HPI_GPIO_WRITE_STATUS"\ | |
269 | } | |
270 | function_count_check(HPI_GPIO, 5); | |
271 | ||
272 | #define HPI_WATCHDOG_STRINGS \ | |
273 | { \ | |
274 | "HPI_WATCHDOG_OPEN", \ | |
275 | "HPI_WATCHDOG_SET_TIME", \ | |
276 | "HPI_WATCHDOG_PING" \ | |
277 | } | |
278 | ||
279 | #define HPI_CLOCK_STRINGS \ | |
280 | { \ | |
281 | "HPI_CLOCK_OPEN", \ | |
282 | "HPI_CLOCK_SET_TIME", \ | |
283 | "HPI_CLOCK_GET_TIME" \ | |
284 | } | |
285 | ||
286 | #define HPI_PROFILE_STRINGS \ | |
287 | { \ | |
288 | "HPI_PROFILE_OPEN_ALL", \ | |
289 | "HPI_PROFILE_START_ALL", \ | |
290 | "HPI_PROFILE_STOP_ALL", \ | |
291 | "HPI_PROFILE_GET", \ | |
292 | "HPI_PROFILE_GET_IDLECOUNT", \ | |
293 | "HPI_PROFILE_GET_NAME", \ | |
294 | "HPI_PROFILE_GET_UTILIZATION" \ | |
295 | } | |
296 | function_count_check(HPI_PROFILE, 7); | |
297 | ||
298 | #define HPI_ASYNCEVENT_STRINGS \ | |
299 | { \ | |
300 | "HPI_ASYNCEVENT_OPEN",\ | |
301 | "HPI_ASYNCEVENT_CLOSE ",\ | |
302 | "HPI_ASYNCEVENT_WAIT",\ | |
303 | "HPI_ASYNCEVENT_GETCOUNT",\ | |
304 | "HPI_ASYNCEVENT_GET",\ | |
305 | "HPI_ASYNCEVENT_SENDEVENTS"\ | |
306 | } | |
307 | function_count_check(HPI_ASYNCEVENT, 6); | |
308 | ||
309 | #define HPI_CONTROL_TYPE_STRINGS \ | |
310 | { \ | |
311 | "null control", \ | |
312 | "HPI_CONTROL_CONNECTION", \ | |
313 | "HPI_CONTROL_VOLUME", \ | |
314 | "HPI_CONTROL_METER", \ | |
315 | "HPI_CONTROL_MUTE", \ | |
316 | "HPI_CONTROL_MULTIPLEXER", \ | |
317 | "HPI_CONTROL_AESEBU_TRANSMITTER", \ | |
318 | "HPI_CONTROL_AESEBU_RECEIVER", \ | |
319 | "HPI_CONTROL_LEVEL", \ | |
320 | "HPI_CONTROL_TUNER", \ | |
321 | "HPI_CONTROL_ONOFFSWITCH", \ | |
322 | "HPI_CONTROL_VOX", \ | |
323 | "HPI_CONTROL_AES18_TRANSMITTER", \ | |
324 | "HPI_CONTROL_AES18_RECEIVER", \ | |
325 | "HPI_CONTROL_AES18_BLOCKGENERATOR", \ | |
326 | "HPI_CONTROL_CHANNEL_MODE", \ | |
327 | "HPI_CONTROL_BITSTREAM", \ | |
328 | "HPI_CONTROL_SAMPLECLOCK", \ | |
329 | "HPI_CONTROL_MICROPHONE", \ | |
330 | "HPI_CONTROL_PARAMETRIC_EQ", \ | |
331 | "HPI_CONTROL_COMPANDER", \ | |
332 | "HPI_CONTROL_COBRANET", \ | |
333 | "HPI_CONTROL_TONE_DETECT", \ | |
334 | "HPI_CONTROL_SILENCE_DETECT", \ | |
335 | "HPI_CONTROL_PAD", \ | |
336 | "HPI_CONTROL_SRC" ,\ | |
337 | "HPI_CONTROL_UNIVERSAL" \ | |
338 | } | |
339 | ||
340 | compile_time_assert((HPI_CONTROL_LAST_INDEX + 1 == 27), | |
341 | controltype_strings_match_defs); | |
342 | ||
343 | #define HPI_SOURCENODE_STRINGS \ | |
344 | { \ | |
345 | "no source", \ | |
346 | "HPI_SOURCENODE_OSTREAM", \ | |
347 | "HPI_SOURCENODE_LINEIN", \ | |
348 | "HPI_SOURCENODE_AESEBU_IN", \ | |
349 | "HPI_SOURCENODE_TUNER", \ | |
350 | "HPI_SOURCENODE_RF", \ | |
351 | "HPI_SOURCENODE_CLOCK_SOURCE", \ | |
352 | "HPI_SOURCENODE_RAW_BITSTREAM", \ | |
353 | "HPI_SOURCENODE_MICROPHONE", \ | |
354 | "HPI_SOURCENODE_COBRANET", \ | |
355 | "HPI_SOURCENODE_ANALOG", \ | |
356 | "HPI_SOURCENODE_ADAPTER" \ | |
357 | } | |
358 | ||
168f1b07 | 359 | compile_time_assert((HPI_SOURCENODE_LAST_INDEX - HPI_SOURCENODE_NONE + 1) == |
719f82d3 EB |
360 | (12), sourcenode_strings_match_defs); |
361 | ||
362 | #define HPI_DESTNODE_STRINGS \ | |
363 | { \ | |
364 | "no destination", \ | |
365 | "HPI_DESTNODE_ISTREAM", \ | |
366 | "HPI_DESTNODE_LINEOUT", \ | |
367 | "HPI_DESTNODE_AESEBU_OUT", \ | |
368 | "HPI_DESTNODE_RF", \ | |
369 | "HPI_DESTNODE_SPEAKER", \ | |
370 | "HPI_DESTNODE_COBRANET", \ | |
371 | "HPI_DESTNODE_ANALOG" \ | |
372 | } | |
168f1b07 | 373 | compile_time_assert((HPI_DESTNODE_LAST_INDEX - HPI_DESTNODE_NONE + 1) == (8), |
719f82d3 EB |
374 | destnode_strings_match_defs); |
375 | ||
376 | #define HPI_CONTROL_CHANNEL_MODE_STRINGS \ | |
377 | { \ | |
378 | "XXX HPI_CHANNEL_MODE_ERROR XXX", \ | |
379 | "HPI_CHANNEL_MODE_NORMAL", \ | |
380 | "HPI_CHANNEL_MODE_SWAP", \ | |
381 | "HPI_CHANNEL_MODE_LEFT_ONLY", \ | |
382 | "HPI_CHANNEL_MODE_RIGHT_ONLY" \ | |
383 | } | |
384 | ||
385 | #endif /* _HPIDEBUG_H */ |