1 /************************************************************************
3 AudioScience HPI driver
4 Copyright (C) 1997-2010 AudioScience Inc. <support@audioscience.com>
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;
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.
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
19 Debug macro translation.
21 ************************************************************************/
23 #include "hpi_internal.h"
26 /* Debug level; 0 quiet; 1 informative, 2 debug, 3 verbose debug. */
27 int hpi_debug_level
= HPI_DEBUG_LEVEL_DEFAULT
;
29 void hpi_debug_init(void)
31 printk(KERN_INFO
"debug start\n");
34 int hpi_debug_level_set(int level
)
38 old_level
= hpi_debug_level
;
39 hpi_debug_level
= level
;
43 int hpi_debug_level_get(void)
45 return hpi_debug_level
;
48 #ifdef HPIOS_DEBUG_PRINT
49 /* implies OS has no printf-like function */
52 void hpi_debug_printf(char *fmt
, ...)
57 va_start(arglist
, fmt
);
60 HPIOS_DEBUG_PRINT(buffer
);
67 unsigned int num_elements
;
70 #define make_treenode_from_array(nodename, array) \
71 static void *tmp_strarray_##nodename[] = array; \
72 static struct treenode nodename = { \
73 &tmp_strarray_##nodename, \
74 ARRAY_SIZE(tmp_strarray_##nodename) \
77 #define get_treenode_elem(node_ptr, idx, type) \
78 (&(*((type *)(node_ptr)->array)[idx]))
80 make_treenode_from_array(hpi_control_type_strings
, HPI_CONTROL_TYPE_STRINGS
)
82 make_treenode_from_array(hpi_subsys_strings
, HPI_SUBSYS_STRINGS
)
83 make_treenode_from_array(hpi_adapter_strings
, HPI_ADAPTER_STRINGS
)
84 make_treenode_from_array(hpi_istream_strings
, HPI_ISTREAM_STRINGS
)
85 make_treenode_from_array(hpi_ostream_strings
, HPI_OSTREAM_STRINGS
)
86 make_treenode_from_array(hpi_mixer_strings
, HPI_MIXER_STRINGS
)
87 make_treenode_from_array(hpi_node_strings
,
89 "NODE is invalid object"})
91 make_treenode_from_array(hpi_control_strings
, HPI_CONTROL_STRINGS
)
92 make_treenode_from_array(hpi_nvmemory_strings
, HPI_OBJ_STRINGS
)
93 make_treenode_from_array(hpi_digitalio_strings
, HPI_DIGITALIO_STRINGS
)
94 make_treenode_from_array(hpi_watchdog_strings
, HPI_WATCHDOG_STRINGS
)
95 make_treenode_from_array(hpi_clock_strings
, HPI_CLOCK_STRINGS
)
96 make_treenode_from_array(hpi_profile_strings
, HPI_PROFILE_STRINGS
)
97 make_treenode_from_array(hpi_asyncevent_strings
, HPI_ASYNCEVENT_STRINGS
)
98 #define HPI_FUNCTION_STRINGS \
100 &hpi_subsys_strings,\
101 &hpi_adapter_strings,\
102 &hpi_ostream_strings,\
103 &hpi_istream_strings,\
106 &hpi_control_strings,\
107 &hpi_nvmemory_strings,\
108 &hpi_digitalio_strings,\
109 &hpi_watchdog_strings,\
111 &hpi_profile_strings,\
112 &hpi_control_strings, \
113 &hpi_asyncevent_strings \
115 make_treenode_from_array(hpi_function_strings
, HPI_FUNCTION_STRINGS
)
117 compile_time_assert(HPI_OBJ_MAXINDEX
== 14, obj_list_doesnt_match
);
119 static char *hpi_function_string(unsigned int function
)
122 struct treenode
*tmp
;
124 object
= function
/ HPI_OBJ_FUNCTION_SPACING
;
125 function
= function
- object
* HPI_OBJ_FUNCTION_SPACING
;
127 if (object
== 0 || object
== HPI_OBJ_NODE
128 || object
> hpi_function_strings
.num_elements
)
129 return "invalid object";
131 tmp
= get_treenode_elem(&hpi_function_strings
, object
- 1,
134 if (function
== 0 || function
> tmp
->num_elements
)
135 return "invalid function";
137 return get_treenode_elem(tmp
, function
- 1, char *);
140 void hpi_debug_message(struct hpi_message
*phm
, char *sz_fileline
)
143 if ((phm
->object
<= HPI_OBJ_MAXINDEX
) && phm
->object
) {
148 index
= phm
->obj_index
;
149 switch (phm
->object
) {
150 case HPI_OBJ_ADAPTER
:
151 case HPI_OBJ_PROFILE
:
155 HPI_MIXER_GET_CONTROL_BY_INDEX
)
156 index
= phm
->u
.m
.control_index
;
158 case HPI_OBJ_OSTREAM
:
159 case HPI_OBJ_ISTREAM
:
162 case HPI_OBJ_CONTROLEX
:
163 case HPI_OBJ_CONTROL
:
164 if (phm
->version
== 1)
165 attrib
= HPI_CTL_ATTR(UNIVERSAL
, 1);
167 attrib
= phm
->u
.c
.attribute
;
174 if (is_control
&& (attrib
& 0xFF00)) {
175 int control_type
= (attrib
& 0xFF00) >> 8;
176 int attr_index
= HPI_CTL_ATTR_INDEX(attrib
);
177 /* note the KERN facility level
178 is in szFileline already */
179 printk("%s adapter %d %s "
180 "ctrl_index x%04x %s %d\n",
181 sz_fileline
, phm
->adapter_index
,
182 hpi_function_string(phm
->function
),
185 (&hpi_control_type_strings
,
186 control_type
, char *),
190 printk("%s adapter %d %s "
191 "idx x%04x attr x%04x \n",
192 sz_fileline
, phm
->adapter_index
,
193 hpi_function_string(phm
->function
),
196 printk("adap=%d, invalid obj=%d, func=0x%x\n",
197 phm
->adapter_index
, phm
->object
,
202 "NULL message pointer to hpi_debug_message!\n");
205 void hpi_debug_data(u16
*pdata
, u32 len
)
213 lines
= (len
+ cols
- 1) / cols
;
217 for (i
= 0, j
= 0; j
< lines
; j
++) {
218 printk(KERN_DEBUG
"%p:", (pdata
+ i
));
220 for (k
= 0; k
< cols
&& i
< len
; i
++, k
++)
221 printk("%s%04x", k
== 0 ? "" : " ", pdata
[i
]);