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