xref: /openbmc/linux/sound/pci/asihpi/hpidebug.h (revision df2634f43f5106947f3735a0b61a6527a4b278cd)
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 
359 compile_time_assert((HPI_SOURCENODE_LAST_INDEX - HPI_SOURCENODE_NONE + 1) ==
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 }
373 compile_time_assert((HPI_DESTNODE_LAST_INDEX - HPI_DESTNODE_NONE + 1) == (8),
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  */
386