xref: /linux/sound/pci/asihpi/hpifunc.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2719f82d3SEliot Blennerhassett 
3719f82d3SEliot Blennerhassett #include "hpi_internal.h"
4719f82d3SEliot Blennerhassett #include "hpimsginit.h"
5719f82d3SEliot Blennerhassett 
6719f82d3SEliot Blennerhassett #include "hpidebug.h"
7719f82d3SEliot Blennerhassett 
8719f82d3SEliot Blennerhassett struct hpi_handle {
9719f82d3SEliot Blennerhassett 	unsigned int obj_index:12;
10719f82d3SEliot Blennerhassett 	unsigned int obj_type:4;
11719f82d3SEliot Blennerhassett 	unsigned int adapter_index:14;
12719f82d3SEliot Blennerhassett 	unsigned int spare:1;
13719f82d3SEliot Blennerhassett 	unsigned int read_only:1;
14719f82d3SEliot Blennerhassett };
15719f82d3SEliot Blennerhassett 
16719f82d3SEliot Blennerhassett union handle_word {
17719f82d3SEliot Blennerhassett 	struct hpi_handle h;
18719f82d3SEliot Blennerhassett 	u32 w;
19719f82d3SEliot Blennerhassett };
20719f82d3SEliot Blennerhassett 
hpi_indexes_to_handle(const char c_object,const u16 adapter_index,const u16 object_index)21719f82d3SEliot Blennerhassett u32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index,
22719f82d3SEliot Blennerhassett 	const u16 object_index)
23719f82d3SEliot Blennerhassett {
24719f82d3SEliot Blennerhassett 	union handle_word handle;
25719f82d3SEliot Blennerhassett 
26719f82d3SEliot Blennerhassett 	handle.h.adapter_index = adapter_index;
27719f82d3SEliot Blennerhassett 	handle.h.spare = 0;
28719f82d3SEliot Blennerhassett 	handle.h.read_only = 0;
29719f82d3SEliot Blennerhassett 	handle.h.obj_type = c_object;
30719f82d3SEliot Blennerhassett 	handle.h.obj_index = object_index;
31719f82d3SEliot Blennerhassett 	return handle.w;
32719f82d3SEliot Blennerhassett }
33719f82d3SEliot Blennerhassett 
hpi_handle_indexes(const u32 h,u16 * p1,u16 * p2)34ba94455cSEliot Blennerhassett static u16 hpi_handle_indexes(const u32 h, u16 *p1, u16 *p2)
35ba94455cSEliot Blennerhassett {
36ba94455cSEliot Blennerhassett 	union handle_word uhandle;
37ba94455cSEliot Blennerhassett 	if (!h)
38ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
39ba94455cSEliot Blennerhassett 
40ba94455cSEliot Blennerhassett 	uhandle.w = h;
41ba94455cSEliot Blennerhassett 
42ba94455cSEliot Blennerhassett 	*p1 = (u16)uhandle.h.adapter_index;
43ba94455cSEliot Blennerhassett 	if (p2)
44ba94455cSEliot Blennerhassett 		*p2 = (u16)uhandle.h.obj_index;
45ba94455cSEliot Blennerhassett 
46ba94455cSEliot Blennerhassett 	return 0;
47ba94455cSEliot Blennerhassett }
48ba94455cSEliot Blennerhassett 
hpi_handle_to_indexes(const u32 handle,u16 * pw_adapter_index,u16 * pw_object_index)49719f82d3SEliot Blennerhassett void hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index,
50719f82d3SEliot Blennerhassett 	u16 *pw_object_index)
51719f82d3SEliot Blennerhassett {
52ba94455cSEliot Blennerhassett 	hpi_handle_indexes(handle, pw_adapter_index, pw_object_index);
53719f82d3SEliot Blennerhassett }
54719f82d3SEliot Blennerhassett 
hpi_handle_object(const u32 handle)55719f82d3SEliot Blennerhassett char hpi_handle_object(const u32 handle)
56719f82d3SEliot Blennerhassett {
57719f82d3SEliot Blennerhassett 	union handle_word uhandle;
58719f82d3SEliot Blennerhassett 	uhandle.w = handle;
59719f82d3SEliot Blennerhassett 	return (char)uhandle.h.obj_type;
60719f82d3SEliot Blennerhassett }
61719f82d3SEliot Blennerhassett 
hpi_format_to_msg(struct hpi_msg_format * pMF,const struct hpi_format * pF)62719f82d3SEliot Blennerhassett void hpi_format_to_msg(struct hpi_msg_format *pMF,
63719f82d3SEliot Blennerhassett 	const struct hpi_format *pF)
64719f82d3SEliot Blennerhassett {
65719f82d3SEliot Blennerhassett 	pMF->sample_rate = pF->sample_rate;
66719f82d3SEliot Blennerhassett 	pMF->bit_rate = pF->bit_rate;
67719f82d3SEliot Blennerhassett 	pMF->attributes = pF->attributes;
68719f82d3SEliot Blennerhassett 	pMF->channels = pF->channels;
69719f82d3SEliot Blennerhassett 	pMF->format = pF->format;
70719f82d3SEliot Blennerhassett }
71719f82d3SEliot Blennerhassett 
hpi_msg_to_format(struct hpi_format * pF,struct hpi_msg_format * pMF)72719f82d3SEliot Blennerhassett static void hpi_msg_to_format(struct hpi_format *pF,
73719f82d3SEliot Blennerhassett 	struct hpi_msg_format *pMF)
74719f82d3SEliot Blennerhassett {
75719f82d3SEliot Blennerhassett 	pF->sample_rate = pMF->sample_rate;
76719f82d3SEliot Blennerhassett 	pF->bit_rate = pMF->bit_rate;
77719f82d3SEliot Blennerhassett 	pF->attributes = pMF->attributes;
78719f82d3SEliot Blennerhassett 	pF->channels = pMF->channels;
79719f82d3SEliot Blennerhassett 	pF->format = pMF->format;
80719f82d3SEliot Blennerhassett 	pF->mode_legacy = 0;
81719f82d3SEliot Blennerhassett 	pF->unused = 0;
82719f82d3SEliot Blennerhassett }
83719f82d3SEliot Blennerhassett 
hpi_stream_response_to_legacy(struct hpi_stream_res * pSR)84719f82d3SEliot Blennerhassett void hpi_stream_response_to_legacy(struct hpi_stream_res *pSR)
85719f82d3SEliot Blennerhassett {
86719f82d3SEliot Blennerhassett 	pSR->u.legacy_stream_info.auxiliary_data_available =
87719f82d3SEliot Blennerhassett 		pSR->u.stream_info.auxiliary_data_available;
88719f82d3SEliot Blennerhassett 	pSR->u.legacy_stream_info.state = pSR->u.stream_info.state;
89719f82d3SEliot Blennerhassett }
90719f82d3SEliot Blennerhassett 
hpi_send_recvV1(struct hpi_message_header * m,struct hpi_response_header * r)91ba94455cSEliot Blennerhassett static inline void hpi_send_recvV1(struct hpi_message_header *m,
92ba94455cSEliot Blennerhassett 	struct hpi_response_header *r)
93719f82d3SEliot Blennerhassett {
94ba94455cSEliot Blennerhassett 	hpi_send_recv((struct hpi_message *)m, (struct hpi_response *)r);
95719f82d3SEliot Blennerhassett }
96719f82d3SEliot Blennerhassett 
hpi_subsys_get_version_ex(u32 * pversion_ex)97ba94455cSEliot Blennerhassett u16 hpi_subsys_get_version_ex(u32 *pversion_ex)
98719f82d3SEliot Blennerhassett {
99719f82d3SEliot Blennerhassett 	struct hpi_message hm;
100719f82d3SEliot Blennerhassett 	struct hpi_response hr;
101719f82d3SEliot Blennerhassett 
102719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
103719f82d3SEliot Blennerhassett 		HPI_SUBSYS_GET_VERSION);
104719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
105719f82d3SEliot Blennerhassett 	*pversion_ex = hr.u.s.data;
106719f82d3SEliot Blennerhassett 	return hr.error;
107719f82d3SEliot Blennerhassett }
108719f82d3SEliot Blennerhassett 
hpi_subsys_get_num_adapters(int * pn_num_adapters)109ba94455cSEliot Blennerhassett u16 hpi_subsys_get_num_adapters(int *pn_num_adapters)
110719f82d3SEliot Blennerhassett {
111719f82d3SEliot Blennerhassett 	struct hpi_message hm;
112719f82d3SEliot Blennerhassett 	struct hpi_response hr;
113719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
114719f82d3SEliot Blennerhassett 		HPI_SUBSYS_GET_NUM_ADAPTERS);
115719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
116719f82d3SEliot Blennerhassett 	*pn_num_adapters = (int)hr.u.s.num_adapters;
117719f82d3SEliot Blennerhassett 	return hr.error;
118719f82d3SEliot Blennerhassett }
119719f82d3SEliot Blennerhassett 
hpi_subsys_get_adapter(int iterator,u32 * padapter_index,u16 * pw_adapter_type)120ba94455cSEliot Blennerhassett u16 hpi_subsys_get_adapter(int iterator, u32 *padapter_index,
121ba94455cSEliot Blennerhassett 	u16 *pw_adapter_type)
122719f82d3SEliot Blennerhassett {
123719f82d3SEliot Blennerhassett 	struct hpi_message hm;
124719f82d3SEliot Blennerhassett 	struct hpi_response hr;
125719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
126719f82d3SEliot Blennerhassett 		HPI_SUBSYS_GET_ADAPTER);
1273285ea10SEliot Blennerhassett 	hm.obj_index = (u16)iterator;
128719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
129719f82d3SEliot Blennerhassett 	*padapter_index = (int)hr.u.s.adapter_index;
1302f918a64SEliot Blennerhassett 	*pw_adapter_type = hr.u.s.adapter_type;
1312f918a64SEliot Blennerhassett 
132719f82d3SEliot Blennerhassett 	return hr.error;
133719f82d3SEliot Blennerhassett }
134719f82d3SEliot Blennerhassett 
hpi_adapter_open(u16 adapter_index)135ba94455cSEliot Blennerhassett u16 hpi_adapter_open(u16 adapter_index)
136719f82d3SEliot Blennerhassett {
137719f82d3SEliot Blennerhassett 	struct hpi_message hm;
138719f82d3SEliot Blennerhassett 	struct hpi_response hr;
139719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
140719f82d3SEliot Blennerhassett 		HPI_ADAPTER_OPEN);
141719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
142719f82d3SEliot Blennerhassett 
143719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
144719f82d3SEliot Blennerhassett 
145719f82d3SEliot Blennerhassett 	return hr.error;
146719f82d3SEliot Blennerhassett 
147719f82d3SEliot Blennerhassett }
148719f82d3SEliot Blennerhassett 
hpi_adapter_close(u16 adapter_index)149ba94455cSEliot Blennerhassett u16 hpi_adapter_close(u16 adapter_index)
150719f82d3SEliot Blennerhassett {
151719f82d3SEliot Blennerhassett 	struct hpi_message hm;
152719f82d3SEliot Blennerhassett 	struct hpi_response hr;
153719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
154719f82d3SEliot Blennerhassett 		HPI_ADAPTER_CLOSE);
155719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
156719f82d3SEliot Blennerhassett 
157719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
158719f82d3SEliot Blennerhassett 
159719f82d3SEliot Blennerhassett 	return hr.error;
160719f82d3SEliot Blennerhassett }
161719f82d3SEliot Blennerhassett 
hpi_adapter_set_mode(u16 adapter_index,u32 adapter_mode)162ba94455cSEliot Blennerhassett u16 hpi_adapter_set_mode(u16 adapter_index, u32 adapter_mode)
163719f82d3SEliot Blennerhassett {
164ba94455cSEliot Blennerhassett 	return hpi_adapter_set_mode_ex(adapter_index, adapter_mode,
165719f82d3SEliot Blennerhassett 		HPI_ADAPTER_MODE_SET);
166719f82d3SEliot Blennerhassett }
167719f82d3SEliot Blennerhassett 
hpi_adapter_set_mode_ex(u16 adapter_index,u32 adapter_mode,u16 query_or_set)168ba94455cSEliot Blennerhassett u16 hpi_adapter_set_mode_ex(u16 adapter_index, u32 adapter_mode,
169ba94455cSEliot Blennerhassett 	u16 query_or_set)
170719f82d3SEliot Blennerhassett {
171719f82d3SEliot Blennerhassett 	struct hpi_message hm;
172719f82d3SEliot Blennerhassett 	struct hpi_response hr;
173108ccb3fSEliot Blennerhassett 
174719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
175719f82d3SEliot Blennerhassett 		HPI_ADAPTER_SET_MODE);
176719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
1773285ea10SEliot Blennerhassett 	hm.u.ax.mode.adapter_mode = adapter_mode;
1783285ea10SEliot Blennerhassett 	hm.u.ax.mode.query_or_set = query_or_set;
179719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
180719f82d3SEliot Blennerhassett 	return hr.error;
181719f82d3SEliot Blennerhassett }
182719f82d3SEliot Blennerhassett 
hpi_adapter_get_mode(u16 adapter_index,u32 * padapter_mode)183ba94455cSEliot Blennerhassett u16 hpi_adapter_get_mode(u16 adapter_index, u32 *padapter_mode)
184719f82d3SEliot Blennerhassett {
185719f82d3SEliot Blennerhassett 	struct hpi_message hm;
186719f82d3SEliot Blennerhassett 	struct hpi_response hr;
187719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
188719f82d3SEliot Blennerhassett 		HPI_ADAPTER_GET_MODE);
189719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
190719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
191719f82d3SEliot Blennerhassett 	if (padapter_mode)
1923285ea10SEliot Blennerhassett 		*padapter_mode = hr.u.ax.mode.adapter_mode;
193719f82d3SEliot Blennerhassett 	return hr.error;
194719f82d3SEliot Blennerhassett }
195719f82d3SEliot Blennerhassett 
hpi_adapter_get_info(u16 adapter_index,u16 * pw_num_outstreams,u16 * pw_num_instreams,u16 * pw_version,u32 * pserial_number,u16 * pw_adapter_type)196ba94455cSEliot Blennerhassett u16 hpi_adapter_get_info(u16 adapter_index, u16 *pw_num_outstreams,
197ba94455cSEliot Blennerhassett 	u16 *pw_num_instreams, u16 *pw_version, u32 *pserial_number,
198ba94455cSEliot Blennerhassett 	u16 *pw_adapter_type)
199719f82d3SEliot Blennerhassett {
200719f82d3SEliot Blennerhassett 	struct hpi_message hm;
201719f82d3SEliot Blennerhassett 	struct hpi_response hr;
202719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
203719f82d3SEliot Blennerhassett 		HPI_ADAPTER_GET_INFO);
204719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
205719f82d3SEliot Blennerhassett 
206719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
207719f82d3SEliot Blennerhassett 
2083285ea10SEliot Blennerhassett 	*pw_adapter_type = hr.u.ax.info.adapter_type;
2093285ea10SEliot Blennerhassett 	*pw_num_outstreams = hr.u.ax.info.num_outstreams;
2103285ea10SEliot Blennerhassett 	*pw_num_instreams = hr.u.ax.info.num_instreams;
2113285ea10SEliot Blennerhassett 	*pw_version = hr.u.ax.info.version;
2123285ea10SEliot Blennerhassett 	*pserial_number = hr.u.ax.info.serial_number;
213719f82d3SEliot Blennerhassett 	return hr.error;
214719f82d3SEliot Blennerhassett }
215719f82d3SEliot Blennerhassett 
hpi_adapter_get_module_by_index(u16 adapter_index,u16 module_index,u16 * pw_num_outputs,u16 * pw_num_inputs,u16 * pw_version,u32 * pserial_number,u16 * pw_module_type,u32 * ph_module)216ba94455cSEliot Blennerhassett u16 hpi_adapter_get_module_by_index(u16 adapter_index, u16 module_index,
217ba94455cSEliot Blennerhassett 	u16 *pw_num_outputs, u16 *pw_num_inputs, u16 *pw_version,
218ba94455cSEliot Blennerhassett 	u32 *pserial_number, u16 *pw_module_type, u32 *ph_module)
219719f82d3SEliot Blennerhassett {
220719f82d3SEliot Blennerhassett 	struct hpi_message hm;
221719f82d3SEliot Blennerhassett 	struct hpi_response hr;
222719f82d3SEliot Blennerhassett 
223719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
224719f82d3SEliot Blennerhassett 		HPI_ADAPTER_MODULE_INFO);
225719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
226719f82d3SEliot Blennerhassett 	hm.u.ax.module_info.index = module_index;
227719f82d3SEliot Blennerhassett 
228719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
229719f82d3SEliot Blennerhassett 
2303285ea10SEliot Blennerhassett 	*pw_module_type = hr.u.ax.info.adapter_type;
2313285ea10SEliot Blennerhassett 	*pw_num_outputs = hr.u.ax.info.num_outstreams;
2323285ea10SEliot Blennerhassett 	*pw_num_inputs = hr.u.ax.info.num_instreams;
2333285ea10SEliot Blennerhassett 	*pw_version = hr.u.ax.info.version;
2343285ea10SEliot Blennerhassett 	*pserial_number = hr.u.ax.info.serial_number;
235719f82d3SEliot Blennerhassett 	*ph_module = 0;
236719f82d3SEliot Blennerhassett 
237719f82d3SEliot Blennerhassett 	return hr.error;
238719f82d3SEliot Blennerhassett }
239719f82d3SEliot Blennerhassett 
hpi_adapter_set_property(u16 adapter_index,u16 property,u16 parameter1,u16 parameter2)240ba94455cSEliot Blennerhassett u16 hpi_adapter_set_property(u16 adapter_index, u16 property, u16 parameter1,
241ba94455cSEliot Blennerhassett 	u16 parameter2)
242719f82d3SEliot Blennerhassett {
243719f82d3SEliot Blennerhassett 	struct hpi_message hm;
244719f82d3SEliot Blennerhassett 	struct hpi_response hr;
245719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
246719f82d3SEliot Blennerhassett 		HPI_ADAPTER_SET_PROPERTY);
247719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
248719f82d3SEliot Blennerhassett 	hm.u.ax.property_set.property = property;
249719f82d3SEliot Blennerhassett 	hm.u.ax.property_set.parameter1 = parameter1;
250719f82d3SEliot Blennerhassett 	hm.u.ax.property_set.parameter2 = parameter2;
251719f82d3SEliot Blennerhassett 
252719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
253719f82d3SEliot Blennerhassett 
254719f82d3SEliot Blennerhassett 	return hr.error;
255719f82d3SEliot Blennerhassett }
256719f82d3SEliot Blennerhassett 
hpi_adapter_get_property(u16 adapter_index,u16 property,u16 * pw_parameter1,u16 * pw_parameter2)257ba94455cSEliot Blennerhassett u16 hpi_adapter_get_property(u16 adapter_index, u16 property,
258ba94455cSEliot Blennerhassett 	u16 *pw_parameter1, u16 *pw_parameter2)
259719f82d3SEliot Blennerhassett {
260719f82d3SEliot Blennerhassett 	struct hpi_message hm;
261719f82d3SEliot Blennerhassett 	struct hpi_response hr;
262719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
263719f82d3SEliot Blennerhassett 		HPI_ADAPTER_GET_PROPERTY);
264719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
265719f82d3SEliot Blennerhassett 	hm.u.ax.property_set.property = property;
266719f82d3SEliot Blennerhassett 
267719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
268719f82d3SEliot Blennerhassett 	if (!hr.error) {
269719f82d3SEliot Blennerhassett 		if (pw_parameter1)
270719f82d3SEliot Blennerhassett 			*pw_parameter1 = hr.u.ax.property_get.parameter1;
271719f82d3SEliot Blennerhassett 		if (pw_parameter2)
272719f82d3SEliot Blennerhassett 			*pw_parameter2 = hr.u.ax.property_get.parameter2;
273719f82d3SEliot Blennerhassett 	}
274719f82d3SEliot Blennerhassett 
275719f82d3SEliot Blennerhassett 	return hr.error;
276719f82d3SEliot Blennerhassett }
277719f82d3SEliot Blennerhassett 
hpi_adapter_enumerate_property(u16 adapter_index,u16 index,u16 what_to_enumerate,u16 property_index,u32 * psetting)278ba94455cSEliot Blennerhassett u16 hpi_adapter_enumerate_property(u16 adapter_index, u16 index,
279ba94455cSEliot Blennerhassett 	u16 what_to_enumerate, u16 property_index, u32 *psetting)
280719f82d3SEliot Blennerhassett {
281719f82d3SEliot Blennerhassett 	return 0;
282719f82d3SEliot Blennerhassett }
283719f82d3SEliot Blennerhassett 
hpi_format_create(struct hpi_format * p_format,u16 channels,u16 format,u32 sample_rate,u32 bit_rate,u32 attributes)284719f82d3SEliot Blennerhassett u16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format,
285719f82d3SEliot Blennerhassett 	u32 sample_rate, u32 bit_rate, u32 attributes)
286719f82d3SEliot Blennerhassett {
287827492acSEliot Blennerhassett 	u16 err = 0;
288719f82d3SEliot Blennerhassett 	struct hpi_msg_format fmt;
289719f82d3SEliot Blennerhassett 
290719f82d3SEliot Blennerhassett 	switch (channels) {
291719f82d3SEliot Blennerhassett 	case 1:
292719f82d3SEliot Blennerhassett 	case 2:
293719f82d3SEliot Blennerhassett 	case 4:
294719f82d3SEliot Blennerhassett 	case 6:
295719f82d3SEliot Blennerhassett 	case 8:
296719f82d3SEliot Blennerhassett 	case 16:
297719f82d3SEliot Blennerhassett 		break;
298719f82d3SEliot Blennerhassett 	default:
299827492acSEliot Blennerhassett 		err = HPI_ERROR_INVALID_CHANNELS;
300827492acSEliot Blennerhassett 		return err;
301719f82d3SEliot Blennerhassett 	}
302719f82d3SEliot Blennerhassett 	fmt.channels = channels;
303719f82d3SEliot Blennerhassett 
304719f82d3SEliot Blennerhassett 	switch (format) {
305719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM16_SIGNED:
306719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM24_SIGNED:
307719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM32_SIGNED:
308719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM32_FLOAT:
309719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM16_BIGENDIAN:
310719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM8_UNSIGNED:
311719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L1:
312719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L2:
313719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L3:
314719f82d3SEliot Blennerhassett 	case HPI_FORMAT_DOLBY_AC2:
315719f82d3SEliot Blennerhassett 	case HPI_FORMAT_AA_TAGIT1_HITS:
316719f82d3SEliot Blennerhassett 	case HPI_FORMAT_AA_TAGIT1_INSERTS:
317719f82d3SEliot Blennerhassett 	case HPI_FORMAT_RAW_BITSTREAM:
318719f82d3SEliot Blennerhassett 	case HPI_FORMAT_AA_TAGIT1_HITS_EX1:
319719f82d3SEliot Blennerhassett 	case HPI_FORMAT_OEM1:
320719f82d3SEliot Blennerhassett 	case HPI_FORMAT_OEM2:
321719f82d3SEliot Blennerhassett 		break;
322719f82d3SEliot Blennerhassett 	default:
323827492acSEliot Blennerhassett 		err = HPI_ERROR_INVALID_FORMAT;
324827492acSEliot Blennerhassett 		return err;
325719f82d3SEliot Blennerhassett 	}
326719f82d3SEliot Blennerhassett 	fmt.format = format;
327719f82d3SEliot Blennerhassett 
328719f82d3SEliot Blennerhassett 	if (sample_rate < 8000L) {
329827492acSEliot Blennerhassett 		err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
330719f82d3SEliot Blennerhassett 		sample_rate = 8000L;
331719f82d3SEliot Blennerhassett 	}
332719f82d3SEliot Blennerhassett 	if (sample_rate > 200000L) {
333827492acSEliot Blennerhassett 		err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
334719f82d3SEliot Blennerhassett 		sample_rate = 200000L;
335719f82d3SEliot Blennerhassett 	}
336719f82d3SEliot Blennerhassett 	fmt.sample_rate = sample_rate;
337719f82d3SEliot Blennerhassett 
338719f82d3SEliot Blennerhassett 	switch (format) {
339719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L1:
340719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L2:
341719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L3:
342719f82d3SEliot Blennerhassett 		fmt.bit_rate = bit_rate;
343719f82d3SEliot Blennerhassett 		break;
344719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM16_SIGNED:
345719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM16_BIGENDIAN:
346719f82d3SEliot Blennerhassett 		fmt.bit_rate = channels * sample_rate * 2;
347719f82d3SEliot Blennerhassett 		break;
348719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM32_SIGNED:
349719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM32_FLOAT:
350719f82d3SEliot Blennerhassett 		fmt.bit_rate = channels * sample_rate * 4;
351719f82d3SEliot Blennerhassett 		break;
352719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM8_UNSIGNED:
353719f82d3SEliot Blennerhassett 		fmt.bit_rate = channels * sample_rate;
354719f82d3SEliot Blennerhassett 		break;
355719f82d3SEliot Blennerhassett 	default:
356719f82d3SEliot Blennerhassett 		fmt.bit_rate = 0;
357719f82d3SEliot Blennerhassett 	}
358719f82d3SEliot Blennerhassett 
359719f82d3SEliot Blennerhassett 	switch (format) {
360719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L2:
361719f82d3SEliot Blennerhassett 		if ((channels == 1)
362719f82d3SEliot Blennerhassett 			&& (attributes != HPI_MPEG_MODE_DEFAULT)) {
363719f82d3SEliot Blennerhassett 			attributes = HPI_MPEG_MODE_DEFAULT;
364827492acSEliot Blennerhassett 			err = HPI_ERROR_INVALID_FORMAT;
365719f82d3SEliot Blennerhassett 		} else if (attributes > HPI_MPEG_MODE_DUALCHANNEL) {
366719f82d3SEliot Blennerhassett 			attributes = HPI_MPEG_MODE_DEFAULT;
367827492acSEliot Blennerhassett 			err = HPI_ERROR_INVALID_FORMAT;
368719f82d3SEliot Blennerhassett 		}
369719f82d3SEliot Blennerhassett 		fmt.attributes = attributes;
370719f82d3SEliot Blennerhassett 		break;
371719f82d3SEliot Blennerhassett 	default:
372719f82d3SEliot Blennerhassett 		fmt.attributes = attributes;
373719f82d3SEliot Blennerhassett 	}
374719f82d3SEliot Blennerhassett 
375719f82d3SEliot Blennerhassett 	hpi_msg_to_format(p_format, &fmt);
376827492acSEliot Blennerhassett 	return err;
377719f82d3SEliot Blennerhassett }
378719f82d3SEliot Blennerhassett 
hpi_stream_estimate_buffer_size(struct hpi_format * p_format,u32 host_polling_rate_in_milli_seconds,u32 * recommended_buffer_size)379719f82d3SEliot Blennerhassett u16 hpi_stream_estimate_buffer_size(struct hpi_format *p_format,
380719f82d3SEliot Blennerhassett 	u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size)
381719f82d3SEliot Blennerhassett {
382719f82d3SEliot Blennerhassett 
383719f82d3SEliot Blennerhassett 	u32 bytes_per_second;
384719f82d3SEliot Blennerhassett 	u32 size;
385719f82d3SEliot Blennerhassett 	u16 channels;
386719f82d3SEliot Blennerhassett 	struct hpi_format *pF = p_format;
387719f82d3SEliot Blennerhassett 
388719f82d3SEliot Blennerhassett 	channels = pF->channels;
389719f82d3SEliot Blennerhassett 
390719f82d3SEliot Blennerhassett 	switch (pF->format) {
391719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM16_BIGENDIAN:
392719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM16_SIGNED:
393719f82d3SEliot Blennerhassett 		bytes_per_second = pF->sample_rate * 2L * channels;
394719f82d3SEliot Blennerhassett 		break;
395719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM24_SIGNED:
396719f82d3SEliot Blennerhassett 		bytes_per_second = pF->sample_rate * 3L * channels;
397719f82d3SEliot Blennerhassett 		break;
398719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM32_SIGNED:
399719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM32_FLOAT:
400719f82d3SEliot Blennerhassett 		bytes_per_second = pF->sample_rate * 4L * channels;
401719f82d3SEliot Blennerhassett 		break;
402719f82d3SEliot Blennerhassett 	case HPI_FORMAT_PCM8_UNSIGNED:
403719f82d3SEliot Blennerhassett 		bytes_per_second = pF->sample_rate * 1L * channels;
404719f82d3SEliot Blennerhassett 		break;
405719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L1:
406719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L2:
407719f82d3SEliot Blennerhassett 	case HPI_FORMAT_MPEG_L3:
408719f82d3SEliot Blennerhassett 		bytes_per_second = pF->bit_rate / 8L;
409719f82d3SEliot Blennerhassett 		break;
410719f82d3SEliot Blennerhassett 	case HPI_FORMAT_DOLBY_AC2:
411719f82d3SEliot Blennerhassett 
412719f82d3SEliot Blennerhassett 		bytes_per_second = 256000L / 8L;
413719f82d3SEliot Blennerhassett 		break;
414719f82d3SEliot Blennerhassett 	default:
415719f82d3SEliot Blennerhassett 		return HPI_ERROR_INVALID_FORMAT;
416719f82d3SEliot Blennerhassett 	}
417719f82d3SEliot Blennerhassett 	size = (bytes_per_second * host_polling_rate_in_milli_seconds * 2) /
418719f82d3SEliot Blennerhassett 		1000L;
419719f82d3SEliot Blennerhassett 
420719f82d3SEliot Blennerhassett 	*recommended_buffer_size =
421719f82d3SEliot Blennerhassett 		roundup_pow_of_two(((size + 4095L) & ~4095L));
422719f82d3SEliot Blennerhassett 	return 0;
423719f82d3SEliot Blennerhassett }
424719f82d3SEliot Blennerhassett 
hpi_outstream_open(u16 adapter_index,u16 outstream_index,u32 * ph_outstream)425ba94455cSEliot Blennerhassett u16 hpi_outstream_open(u16 adapter_index, u16 outstream_index,
426ba94455cSEliot Blennerhassett 	u32 *ph_outstream)
427719f82d3SEliot Blennerhassett {
428719f82d3SEliot Blennerhassett 	struct hpi_message hm;
429719f82d3SEliot Blennerhassett 	struct hpi_response hr;
430719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
431719f82d3SEliot Blennerhassett 		HPI_OSTREAM_OPEN);
432719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
433719f82d3SEliot Blennerhassett 	hm.obj_index = outstream_index;
434719f82d3SEliot Blennerhassett 
435719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
436719f82d3SEliot Blennerhassett 
437719f82d3SEliot Blennerhassett 	if (hr.error == 0)
438719f82d3SEliot Blennerhassett 		*ph_outstream =
439719f82d3SEliot Blennerhassett 			hpi_indexes_to_handle(HPI_OBJ_OSTREAM, adapter_index,
440719f82d3SEliot Blennerhassett 			outstream_index);
441719f82d3SEliot Blennerhassett 	else
442719f82d3SEliot Blennerhassett 		*ph_outstream = 0;
443719f82d3SEliot Blennerhassett 	return hr.error;
444719f82d3SEliot Blennerhassett }
445719f82d3SEliot Blennerhassett 
hpi_outstream_close(u32 h_outstream)446ba94455cSEliot Blennerhassett u16 hpi_outstream_close(u32 h_outstream)
447719f82d3SEliot Blennerhassett {
448719f82d3SEliot Blennerhassett 	struct hpi_message hm;
449719f82d3SEliot Blennerhassett 	struct hpi_response hr;
450719f82d3SEliot Blennerhassett 
451719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
452719f82d3SEliot Blennerhassett 		HPI_OSTREAM_HOSTBUFFER_FREE);
453ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
454ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
455ba94455cSEliot Blennerhassett 
456719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
457719f82d3SEliot Blennerhassett 
458719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
459719f82d3SEliot Blennerhassett 		HPI_OSTREAM_GROUP_RESET);
460ba94455cSEliot Blennerhassett 	hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
461719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
462719f82d3SEliot Blennerhassett 
463719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
464719f82d3SEliot Blennerhassett 		HPI_OSTREAM_CLOSE);
465ba94455cSEliot Blennerhassett 	hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
466719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
467719f82d3SEliot Blennerhassett 
468719f82d3SEliot Blennerhassett 	return hr.error;
469719f82d3SEliot Blennerhassett }
470719f82d3SEliot Blennerhassett 
hpi_outstream_get_info_ex(u32 h_outstream,u16 * pw_state,u32 * pbuffer_size,u32 * pdata_to_play,u32 * psamples_played,u32 * pauxiliary_data_to_play)471ba94455cSEliot Blennerhassett u16 hpi_outstream_get_info_ex(u32 h_outstream, u16 *pw_state,
472ba94455cSEliot Blennerhassett 	u32 *pbuffer_size, u32 *pdata_to_play, u32 *psamples_played,
473ba94455cSEliot Blennerhassett 	u32 *pauxiliary_data_to_play)
474719f82d3SEliot Blennerhassett {
475719f82d3SEliot Blennerhassett 	struct hpi_message hm;
476719f82d3SEliot Blennerhassett 	struct hpi_response hr;
477719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
478719f82d3SEliot Blennerhassett 		HPI_OSTREAM_GET_INFO);
479ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
480ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
481719f82d3SEliot Blennerhassett 
482719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
483719f82d3SEliot Blennerhassett 
484719f82d3SEliot Blennerhassett 	if (pw_state)
485719f82d3SEliot Blennerhassett 		*pw_state = hr.u.d.u.stream_info.state;
486719f82d3SEliot Blennerhassett 	if (pbuffer_size)
487719f82d3SEliot Blennerhassett 		*pbuffer_size = hr.u.d.u.stream_info.buffer_size;
488719f82d3SEliot Blennerhassett 	if (pdata_to_play)
489719f82d3SEliot Blennerhassett 		*pdata_to_play = hr.u.d.u.stream_info.data_available;
490719f82d3SEliot Blennerhassett 	if (psamples_played)
491719f82d3SEliot Blennerhassett 		*psamples_played = hr.u.d.u.stream_info.samples_transferred;
492719f82d3SEliot Blennerhassett 	if (pauxiliary_data_to_play)
493719f82d3SEliot Blennerhassett 		*pauxiliary_data_to_play =
494719f82d3SEliot Blennerhassett 			hr.u.d.u.stream_info.auxiliary_data_available;
495719f82d3SEliot Blennerhassett 	return hr.error;
496719f82d3SEliot Blennerhassett }
497719f82d3SEliot Blennerhassett 
hpi_outstream_write_buf(u32 h_outstream,const u8 * pb_data,u32 bytes_to_write,const struct hpi_format * p_format)498ba94455cSEliot Blennerhassett u16 hpi_outstream_write_buf(u32 h_outstream, const u8 *pb_data,
499ba94455cSEliot Blennerhassett 	u32 bytes_to_write, const struct hpi_format *p_format)
500719f82d3SEliot Blennerhassett {
501719f82d3SEliot Blennerhassett 	struct hpi_message hm;
502719f82d3SEliot Blennerhassett 	struct hpi_response hr;
503719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
504719f82d3SEliot Blennerhassett 		HPI_OSTREAM_WRITE);
505ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
506ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
507719f82d3SEliot Blennerhassett 	hm.u.d.u.data.pb_data = (u8 *)pb_data;
508719f82d3SEliot Blennerhassett 	hm.u.d.u.data.data_size = bytes_to_write;
509719f82d3SEliot Blennerhassett 
510719f82d3SEliot Blennerhassett 	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
511719f82d3SEliot Blennerhassett 
512719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
513719f82d3SEliot Blennerhassett 
514719f82d3SEliot Blennerhassett 	return hr.error;
515719f82d3SEliot Blennerhassett }
516719f82d3SEliot Blennerhassett 
hpi_outstream_start(u32 h_outstream)517ba94455cSEliot Blennerhassett u16 hpi_outstream_start(u32 h_outstream)
518719f82d3SEliot Blennerhassett {
519719f82d3SEliot Blennerhassett 	struct hpi_message hm;
520719f82d3SEliot Blennerhassett 	struct hpi_response hr;
521719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
522719f82d3SEliot Blennerhassett 		HPI_OSTREAM_START);
523ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
524ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
525719f82d3SEliot Blennerhassett 
526719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
527719f82d3SEliot Blennerhassett 
528719f82d3SEliot Blennerhassett 	return hr.error;
529719f82d3SEliot Blennerhassett }
530719f82d3SEliot Blennerhassett 
hpi_outstream_wait_start(u32 h_outstream)531ba94455cSEliot Blennerhassett u16 hpi_outstream_wait_start(u32 h_outstream)
532719f82d3SEliot Blennerhassett {
533719f82d3SEliot Blennerhassett 	struct hpi_message hm;
534719f82d3SEliot Blennerhassett 	struct hpi_response hr;
535719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
536719f82d3SEliot Blennerhassett 		HPI_OSTREAM_WAIT_START);
537ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
538ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
539719f82d3SEliot Blennerhassett 
540719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
541719f82d3SEliot Blennerhassett 
542719f82d3SEliot Blennerhassett 	return hr.error;
543719f82d3SEliot Blennerhassett }
544719f82d3SEliot Blennerhassett 
hpi_outstream_stop(u32 h_outstream)545ba94455cSEliot Blennerhassett u16 hpi_outstream_stop(u32 h_outstream)
546719f82d3SEliot Blennerhassett {
547719f82d3SEliot Blennerhassett 	struct hpi_message hm;
548719f82d3SEliot Blennerhassett 	struct hpi_response hr;
549719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
550719f82d3SEliot Blennerhassett 		HPI_OSTREAM_STOP);
551ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
552ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
553719f82d3SEliot Blennerhassett 
554719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
555719f82d3SEliot Blennerhassett 
556719f82d3SEliot Blennerhassett 	return hr.error;
557719f82d3SEliot Blennerhassett }
558719f82d3SEliot Blennerhassett 
hpi_outstream_sinegen(u32 h_outstream)559ba94455cSEliot Blennerhassett u16 hpi_outstream_sinegen(u32 h_outstream)
560719f82d3SEliot Blennerhassett {
561719f82d3SEliot Blennerhassett 	struct hpi_message hm;
562719f82d3SEliot Blennerhassett 	struct hpi_response hr;
563719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
564719f82d3SEliot Blennerhassett 		HPI_OSTREAM_SINEGEN);
565ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
566ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
567719f82d3SEliot Blennerhassett 
568719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
569719f82d3SEliot Blennerhassett 
570719f82d3SEliot Blennerhassett 	return hr.error;
571719f82d3SEliot Blennerhassett }
572719f82d3SEliot Blennerhassett 
hpi_outstream_reset(u32 h_outstream)573ba94455cSEliot Blennerhassett u16 hpi_outstream_reset(u32 h_outstream)
574719f82d3SEliot Blennerhassett {
575719f82d3SEliot Blennerhassett 	struct hpi_message hm;
576719f82d3SEliot Blennerhassett 	struct hpi_response hr;
577719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
578719f82d3SEliot Blennerhassett 		HPI_OSTREAM_RESET);
579ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
580ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
581719f82d3SEliot Blennerhassett 
582719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
583719f82d3SEliot Blennerhassett 
584719f82d3SEliot Blennerhassett 	return hr.error;
585719f82d3SEliot Blennerhassett }
586719f82d3SEliot Blennerhassett 
hpi_outstream_query_format(u32 h_outstream,struct hpi_format * p_format)587ba94455cSEliot Blennerhassett u16 hpi_outstream_query_format(u32 h_outstream, struct hpi_format *p_format)
588719f82d3SEliot Blennerhassett {
589719f82d3SEliot Blennerhassett 	struct hpi_message hm;
590719f82d3SEliot Blennerhassett 	struct hpi_response hr;
591719f82d3SEliot Blennerhassett 
592719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
593719f82d3SEliot Blennerhassett 		HPI_OSTREAM_QUERY_FORMAT);
594ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
595ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
596719f82d3SEliot Blennerhassett 
597719f82d3SEliot Blennerhassett 	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
598719f82d3SEliot Blennerhassett 
599719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
600719f82d3SEliot Blennerhassett 
601719f82d3SEliot Blennerhassett 	return hr.error;
602719f82d3SEliot Blennerhassett }
603719f82d3SEliot Blennerhassett 
hpi_outstream_set_format(u32 h_outstream,struct hpi_format * p_format)604ba94455cSEliot Blennerhassett u16 hpi_outstream_set_format(u32 h_outstream, struct hpi_format *p_format)
605719f82d3SEliot Blennerhassett {
606719f82d3SEliot Blennerhassett 	struct hpi_message hm;
607719f82d3SEliot Blennerhassett 	struct hpi_response hr;
608719f82d3SEliot Blennerhassett 
609719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
610719f82d3SEliot Blennerhassett 		HPI_OSTREAM_SET_FORMAT);
611ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
612ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
613719f82d3SEliot Blennerhassett 
614719f82d3SEliot Blennerhassett 	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
615719f82d3SEliot Blennerhassett 
616719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
617719f82d3SEliot Blennerhassett 
618719f82d3SEliot Blennerhassett 	return hr.error;
619719f82d3SEliot Blennerhassett }
620719f82d3SEliot Blennerhassett 
hpi_outstream_set_velocity(u32 h_outstream,short velocity)621ba94455cSEliot Blennerhassett u16 hpi_outstream_set_velocity(u32 h_outstream, short velocity)
622719f82d3SEliot Blennerhassett {
623719f82d3SEliot Blennerhassett 	struct hpi_message hm;
624719f82d3SEliot Blennerhassett 	struct hpi_response hr;
625719f82d3SEliot Blennerhassett 
626719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
627719f82d3SEliot Blennerhassett 		HPI_OSTREAM_SET_VELOCITY);
628ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
629ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
630719f82d3SEliot Blennerhassett 	hm.u.d.u.velocity = velocity;
631719f82d3SEliot Blennerhassett 
632719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
633719f82d3SEliot Blennerhassett 
634719f82d3SEliot Blennerhassett 	return hr.error;
635719f82d3SEliot Blennerhassett }
636719f82d3SEliot Blennerhassett 
hpi_outstream_set_punch_in_out(u32 h_outstream,u32 punch_in_sample,u32 punch_out_sample)637ba94455cSEliot Blennerhassett u16 hpi_outstream_set_punch_in_out(u32 h_outstream, u32 punch_in_sample,
638ba94455cSEliot Blennerhassett 	u32 punch_out_sample)
639719f82d3SEliot Blennerhassett {
640719f82d3SEliot Blennerhassett 	struct hpi_message hm;
641719f82d3SEliot Blennerhassett 	struct hpi_response hr;
642719f82d3SEliot Blennerhassett 
643719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
644719f82d3SEliot Blennerhassett 		HPI_OSTREAM_SET_PUNCHINOUT);
645ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
646ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
647719f82d3SEliot Blennerhassett 
648719f82d3SEliot Blennerhassett 	hm.u.d.u.pio.punch_in_sample = punch_in_sample;
649719f82d3SEliot Blennerhassett 	hm.u.d.u.pio.punch_out_sample = punch_out_sample;
650719f82d3SEliot Blennerhassett 
651719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
652719f82d3SEliot Blennerhassett 
653719f82d3SEliot Blennerhassett 	return hr.error;
654719f82d3SEliot Blennerhassett }
655719f82d3SEliot Blennerhassett 
hpi_outstream_ancillary_reset(u32 h_outstream,u16 mode)656ba94455cSEliot Blennerhassett u16 hpi_outstream_ancillary_reset(u32 h_outstream, u16 mode)
657719f82d3SEliot Blennerhassett {
658719f82d3SEliot Blennerhassett 	struct hpi_message hm;
659719f82d3SEliot Blennerhassett 	struct hpi_response hr;
660719f82d3SEliot Blennerhassett 
661719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
662719f82d3SEliot Blennerhassett 		HPI_OSTREAM_ANC_RESET);
663ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
664ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
665719f82d3SEliot Blennerhassett 	hm.u.d.u.data.format.channels = mode;
666719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
667719f82d3SEliot Blennerhassett 	return hr.error;
668719f82d3SEliot Blennerhassett }
669719f82d3SEliot Blennerhassett 
hpi_outstream_ancillary_get_info(u32 h_outstream,u32 * pframes_available)670ba94455cSEliot Blennerhassett u16 hpi_outstream_ancillary_get_info(u32 h_outstream, u32 *pframes_available)
671719f82d3SEliot Blennerhassett {
672719f82d3SEliot Blennerhassett 	struct hpi_message hm;
673719f82d3SEliot Blennerhassett 	struct hpi_response hr;
674719f82d3SEliot Blennerhassett 
675719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
676719f82d3SEliot Blennerhassett 		HPI_OSTREAM_ANC_GET_INFO);
677ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
678ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
679719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
680719f82d3SEliot Blennerhassett 	if (hr.error == 0) {
681719f82d3SEliot Blennerhassett 		if (pframes_available)
682719f82d3SEliot Blennerhassett 			*pframes_available =
683719f82d3SEliot Blennerhassett 				hr.u.d.u.stream_info.data_available /
684719f82d3SEliot Blennerhassett 				sizeof(struct hpi_anc_frame);
685719f82d3SEliot Blennerhassett 	}
686719f82d3SEliot Blennerhassett 	return hr.error;
687719f82d3SEliot Blennerhassett }
688719f82d3SEliot Blennerhassett 
hpi_outstream_ancillary_read(u32 h_outstream,struct hpi_anc_frame * p_anc_frame_buffer,u32 anc_frame_buffer_size_in_bytes,u32 number_of_ancillary_frames_to_read)689ba94455cSEliot Blennerhassett u16 hpi_outstream_ancillary_read(u32 h_outstream,
690ba94455cSEliot Blennerhassett 	struct hpi_anc_frame *p_anc_frame_buffer,
691719f82d3SEliot Blennerhassett 	u32 anc_frame_buffer_size_in_bytes,
692719f82d3SEliot Blennerhassett 	u32 number_of_ancillary_frames_to_read)
693719f82d3SEliot Blennerhassett {
694719f82d3SEliot Blennerhassett 	struct hpi_message hm;
695719f82d3SEliot Blennerhassett 	struct hpi_response hr;
696108ccb3fSEliot Blennerhassett 
697719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
698719f82d3SEliot Blennerhassett 		HPI_OSTREAM_ANC_READ);
699ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
700ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
701719f82d3SEliot Blennerhassett 	hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
702719f82d3SEliot Blennerhassett 	hm.u.d.u.data.data_size =
703719f82d3SEliot Blennerhassett 		number_of_ancillary_frames_to_read *
704719f82d3SEliot Blennerhassett 		sizeof(struct hpi_anc_frame);
705719f82d3SEliot Blennerhassett 	if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
706719f82d3SEliot Blennerhassett 		hpi_send_recv(&hm, &hr);
707719f82d3SEliot Blennerhassett 	else
708ba94455cSEliot Blennerhassett 		hr.error = HPI_ERROR_INVALID_DATASIZE;
709719f82d3SEliot Blennerhassett 	return hr.error;
710719f82d3SEliot Blennerhassett }
711719f82d3SEliot Blennerhassett 
hpi_outstream_set_time_scale(u32 h_outstream,u32 time_scale)712ba94455cSEliot Blennerhassett u16 hpi_outstream_set_time_scale(u32 h_outstream, u32 time_scale)
713719f82d3SEliot Blennerhassett {
714719f82d3SEliot Blennerhassett 	struct hpi_message hm;
715719f82d3SEliot Blennerhassett 	struct hpi_response hr;
716719f82d3SEliot Blennerhassett 
717719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
718719f82d3SEliot Blennerhassett 		HPI_OSTREAM_SET_TIMESCALE);
719ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
720ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
721719f82d3SEliot Blennerhassett 
722719f82d3SEliot Blennerhassett 	hm.u.d.u.time_scale = time_scale;
723719f82d3SEliot Blennerhassett 
724719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
725719f82d3SEliot Blennerhassett 
726719f82d3SEliot Blennerhassett 	return hr.error;
727719f82d3SEliot Blennerhassett }
728719f82d3SEliot Blennerhassett 
hpi_outstream_host_buffer_allocate(u32 h_outstream,u32 size_in_bytes)729ba94455cSEliot Blennerhassett u16 hpi_outstream_host_buffer_allocate(u32 h_outstream, u32 size_in_bytes)
730719f82d3SEliot Blennerhassett {
731719f82d3SEliot Blennerhassett 	struct hpi_message hm;
732719f82d3SEliot Blennerhassett 	struct hpi_response hr;
733719f82d3SEliot Blennerhassett 
734719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
735719f82d3SEliot Blennerhassett 		HPI_OSTREAM_HOSTBUFFER_ALLOC);
736ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
737ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
738719f82d3SEliot Blennerhassett 	hm.u.d.u.data.data_size = size_in_bytes;
739719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
740719f82d3SEliot Blennerhassett 	return hr.error;
741719f82d3SEliot Blennerhassett }
742719f82d3SEliot Blennerhassett 
hpi_outstream_host_buffer_get_info(u32 h_outstream,u8 ** pp_buffer,struct hpi_hostbuffer_status ** pp_status)743ba94455cSEliot Blennerhassett u16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer,
744719f82d3SEliot Blennerhassett 	struct hpi_hostbuffer_status **pp_status)
745719f82d3SEliot Blennerhassett {
746719f82d3SEliot Blennerhassett 	struct hpi_message hm;
747719f82d3SEliot Blennerhassett 	struct hpi_response hr;
748719f82d3SEliot Blennerhassett 
749719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
750719f82d3SEliot Blennerhassett 		HPI_OSTREAM_HOSTBUFFER_GET_INFO);
751ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
752ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
753719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
754719f82d3SEliot Blennerhassett 
755719f82d3SEliot Blennerhassett 	if (hr.error == 0) {
756719f82d3SEliot Blennerhassett 		if (pp_buffer)
757719f82d3SEliot Blennerhassett 			*pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
758719f82d3SEliot Blennerhassett 		if (pp_status)
759719f82d3SEliot Blennerhassett 			*pp_status = hr.u.d.u.hostbuffer_info.p_status;
760719f82d3SEliot Blennerhassett 	}
761719f82d3SEliot Blennerhassett 	return hr.error;
762719f82d3SEliot Blennerhassett }
763719f82d3SEliot Blennerhassett 
hpi_outstream_host_buffer_free(u32 h_outstream)764ba94455cSEliot Blennerhassett u16 hpi_outstream_host_buffer_free(u32 h_outstream)
765719f82d3SEliot Blennerhassett {
766719f82d3SEliot Blennerhassett 	struct hpi_message hm;
767719f82d3SEliot Blennerhassett 	struct hpi_response hr;
768719f82d3SEliot Blennerhassett 
769719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
770719f82d3SEliot Blennerhassett 		HPI_OSTREAM_HOSTBUFFER_FREE);
771ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
772ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
773719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
774719f82d3SEliot Blennerhassett 	return hr.error;
775719f82d3SEliot Blennerhassett }
776719f82d3SEliot Blennerhassett 
hpi_outstream_group_add(u32 h_outstream,u32 h_stream)777ba94455cSEliot Blennerhassett u16 hpi_outstream_group_add(u32 h_outstream, u32 h_stream)
778719f82d3SEliot Blennerhassett {
779719f82d3SEliot Blennerhassett 	struct hpi_message hm;
780719f82d3SEliot Blennerhassett 	struct hpi_response hr;
781719f82d3SEliot Blennerhassett 	u16 adapter;
782719f82d3SEliot Blennerhassett 	char c_obj_type;
783719f82d3SEliot Blennerhassett 
784719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
785719f82d3SEliot Blennerhassett 		HPI_OSTREAM_GROUP_ADD);
786ba94455cSEliot Blennerhassett 
787ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
788ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
789ba94455cSEliot Blennerhassett 
790ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_stream, &adapter,
791ba94455cSEliot Blennerhassett 			&hm.u.d.u.stream.stream_index))
792ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
793ba94455cSEliot Blennerhassett 
794719f82d3SEliot Blennerhassett 	c_obj_type = hpi_handle_object(h_stream);
795719f82d3SEliot Blennerhassett 	switch (c_obj_type) {
796719f82d3SEliot Blennerhassett 	case HPI_OBJ_OSTREAM:
797719f82d3SEliot Blennerhassett 	case HPI_OBJ_ISTREAM:
798ba94455cSEliot Blennerhassett 		hm.u.d.u.stream.object_type = c_obj_type;
799719f82d3SEliot Blennerhassett 		break;
800719f82d3SEliot Blennerhassett 	default:
801ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_OBJ;
802719f82d3SEliot Blennerhassett 	}
803719f82d3SEliot Blennerhassett 	if (adapter != hm.adapter_index)
804719f82d3SEliot Blennerhassett 		return HPI_ERROR_NO_INTERADAPTER_GROUPS;
805719f82d3SEliot Blennerhassett 
806719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
807719f82d3SEliot Blennerhassett 	return hr.error;
808719f82d3SEliot Blennerhassett }
809719f82d3SEliot Blennerhassett 
hpi_outstream_group_get_map(u32 h_outstream,u32 * poutstream_map,u32 * pinstream_map)810ba94455cSEliot Blennerhassett u16 hpi_outstream_group_get_map(u32 h_outstream, u32 *poutstream_map,
811ba94455cSEliot Blennerhassett 	u32 *pinstream_map)
812719f82d3SEliot Blennerhassett {
813719f82d3SEliot Blennerhassett 	struct hpi_message hm;
814719f82d3SEliot Blennerhassett 	struct hpi_response hr;
815719f82d3SEliot Blennerhassett 
816719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
817719f82d3SEliot Blennerhassett 		HPI_OSTREAM_GROUP_GETMAP);
818ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
819ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
820719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
821719f82d3SEliot Blennerhassett 
822719f82d3SEliot Blennerhassett 	if (poutstream_map)
823719f82d3SEliot Blennerhassett 		*poutstream_map = hr.u.d.u.group_info.outstream_group_map;
824719f82d3SEliot Blennerhassett 	if (pinstream_map)
825719f82d3SEliot Blennerhassett 		*pinstream_map = hr.u.d.u.group_info.instream_group_map;
826719f82d3SEliot Blennerhassett 
827719f82d3SEliot Blennerhassett 	return hr.error;
828719f82d3SEliot Blennerhassett }
829719f82d3SEliot Blennerhassett 
hpi_outstream_group_reset(u32 h_outstream)830ba94455cSEliot Blennerhassett u16 hpi_outstream_group_reset(u32 h_outstream)
831719f82d3SEliot Blennerhassett {
832719f82d3SEliot Blennerhassett 	struct hpi_message hm;
833719f82d3SEliot Blennerhassett 	struct hpi_response hr;
834719f82d3SEliot Blennerhassett 
835719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
836719f82d3SEliot Blennerhassett 		HPI_OSTREAM_GROUP_RESET);
837ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
838ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
839719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
840719f82d3SEliot Blennerhassett 	return hr.error;
841719f82d3SEliot Blennerhassett }
842719f82d3SEliot Blennerhassett 
hpi_instream_open(u16 adapter_index,u16 instream_index,u32 * ph_instream)843ba94455cSEliot Blennerhassett u16 hpi_instream_open(u16 adapter_index, u16 instream_index, u32 *ph_instream)
844719f82d3SEliot Blennerhassett {
845719f82d3SEliot Blennerhassett 	struct hpi_message hm;
846719f82d3SEliot Blennerhassett 	struct hpi_response hr;
847719f82d3SEliot Blennerhassett 
848719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
849719f82d3SEliot Blennerhassett 		HPI_ISTREAM_OPEN);
850719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
851719f82d3SEliot Blennerhassett 	hm.obj_index = instream_index;
852719f82d3SEliot Blennerhassett 
853719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
854719f82d3SEliot Blennerhassett 
855719f82d3SEliot Blennerhassett 	if (hr.error == 0)
856719f82d3SEliot Blennerhassett 		*ph_instream =
857719f82d3SEliot Blennerhassett 			hpi_indexes_to_handle(HPI_OBJ_ISTREAM, adapter_index,
858719f82d3SEliot Blennerhassett 			instream_index);
859719f82d3SEliot Blennerhassett 	else
860719f82d3SEliot Blennerhassett 		*ph_instream = 0;
861719f82d3SEliot Blennerhassett 
862719f82d3SEliot Blennerhassett 	return hr.error;
863719f82d3SEliot Blennerhassett }
864719f82d3SEliot Blennerhassett 
hpi_instream_close(u32 h_instream)865ba94455cSEliot Blennerhassett u16 hpi_instream_close(u32 h_instream)
866719f82d3SEliot Blennerhassett {
867719f82d3SEliot Blennerhassett 	struct hpi_message hm;
868719f82d3SEliot Blennerhassett 	struct hpi_response hr;
869719f82d3SEliot Blennerhassett 
870719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
871719f82d3SEliot Blennerhassett 		HPI_ISTREAM_HOSTBUFFER_FREE);
872ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
873ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
874719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
875719f82d3SEliot Blennerhassett 
876719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
877719f82d3SEliot Blennerhassett 		HPI_ISTREAM_GROUP_RESET);
878ba94455cSEliot Blennerhassett 	hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
879719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
880719f82d3SEliot Blennerhassett 
881719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
882719f82d3SEliot Blennerhassett 		HPI_ISTREAM_CLOSE);
883ba94455cSEliot Blennerhassett 	hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
884719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
885719f82d3SEliot Blennerhassett 
886719f82d3SEliot Blennerhassett 	return hr.error;
887719f82d3SEliot Blennerhassett }
888719f82d3SEliot Blennerhassett 
hpi_instream_query_format(u32 h_instream,const struct hpi_format * p_format)889ba94455cSEliot Blennerhassett u16 hpi_instream_query_format(u32 h_instream,
890ba94455cSEliot Blennerhassett 	const struct hpi_format *p_format)
891719f82d3SEliot Blennerhassett {
892719f82d3SEliot Blennerhassett 	struct hpi_message hm;
893719f82d3SEliot Blennerhassett 	struct hpi_response hr;
894719f82d3SEliot Blennerhassett 
895719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
896719f82d3SEliot Blennerhassett 		HPI_ISTREAM_QUERY_FORMAT);
897ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
898ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
899719f82d3SEliot Blennerhassett 	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
900719f82d3SEliot Blennerhassett 
901719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
902719f82d3SEliot Blennerhassett 
903719f82d3SEliot Blennerhassett 	return hr.error;
904719f82d3SEliot Blennerhassett }
905719f82d3SEliot Blennerhassett 
hpi_instream_set_format(u32 h_instream,const struct hpi_format * p_format)906ba94455cSEliot Blennerhassett u16 hpi_instream_set_format(u32 h_instream, const struct hpi_format *p_format)
907719f82d3SEliot Blennerhassett {
908719f82d3SEliot Blennerhassett 	struct hpi_message hm;
909719f82d3SEliot Blennerhassett 	struct hpi_response hr;
910719f82d3SEliot Blennerhassett 
911719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
912719f82d3SEliot Blennerhassett 		HPI_ISTREAM_SET_FORMAT);
913ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
914ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
915719f82d3SEliot Blennerhassett 	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
916719f82d3SEliot Blennerhassett 
917719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
918719f82d3SEliot Blennerhassett 
919719f82d3SEliot Blennerhassett 	return hr.error;
920719f82d3SEliot Blennerhassett }
921719f82d3SEliot Blennerhassett 
hpi_instream_read_buf(u32 h_instream,u8 * pb_data,u32 bytes_to_read)922ba94455cSEliot Blennerhassett u16 hpi_instream_read_buf(u32 h_instream, u8 *pb_data, u32 bytes_to_read)
923719f82d3SEliot Blennerhassett {
924719f82d3SEliot Blennerhassett 	struct hpi_message hm;
925719f82d3SEliot Blennerhassett 	struct hpi_response hr;
926719f82d3SEliot Blennerhassett 
927719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
928719f82d3SEliot Blennerhassett 		HPI_ISTREAM_READ);
929ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
930ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
931719f82d3SEliot Blennerhassett 	hm.u.d.u.data.data_size = bytes_to_read;
932719f82d3SEliot Blennerhassett 	hm.u.d.u.data.pb_data = pb_data;
933719f82d3SEliot Blennerhassett 
934719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
935719f82d3SEliot Blennerhassett 
936719f82d3SEliot Blennerhassett 	return hr.error;
937719f82d3SEliot Blennerhassett }
938719f82d3SEliot Blennerhassett 
hpi_instream_start(u32 h_instream)939ba94455cSEliot Blennerhassett u16 hpi_instream_start(u32 h_instream)
940719f82d3SEliot Blennerhassett {
941719f82d3SEliot Blennerhassett 	struct hpi_message hm;
942719f82d3SEliot Blennerhassett 	struct hpi_response hr;
943719f82d3SEliot Blennerhassett 
944719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
945719f82d3SEliot Blennerhassett 		HPI_ISTREAM_START);
946ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
947ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
948719f82d3SEliot Blennerhassett 
949719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
950719f82d3SEliot Blennerhassett 
951719f82d3SEliot Blennerhassett 	return hr.error;
952719f82d3SEliot Blennerhassett }
953719f82d3SEliot Blennerhassett 
hpi_instream_wait_start(u32 h_instream)954ba94455cSEliot Blennerhassett u16 hpi_instream_wait_start(u32 h_instream)
955719f82d3SEliot Blennerhassett {
956719f82d3SEliot Blennerhassett 	struct hpi_message hm;
957719f82d3SEliot Blennerhassett 	struct hpi_response hr;
958719f82d3SEliot Blennerhassett 
959719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
960719f82d3SEliot Blennerhassett 		HPI_ISTREAM_WAIT_START);
961ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
962ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
963719f82d3SEliot Blennerhassett 
964719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
965719f82d3SEliot Blennerhassett 
966719f82d3SEliot Blennerhassett 	return hr.error;
967719f82d3SEliot Blennerhassett }
968719f82d3SEliot Blennerhassett 
hpi_instream_stop(u32 h_instream)969ba94455cSEliot Blennerhassett u16 hpi_instream_stop(u32 h_instream)
970719f82d3SEliot Blennerhassett {
971719f82d3SEliot Blennerhassett 	struct hpi_message hm;
972719f82d3SEliot Blennerhassett 	struct hpi_response hr;
973719f82d3SEliot Blennerhassett 
974719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
975719f82d3SEliot Blennerhassett 		HPI_ISTREAM_STOP);
976ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
977ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
978719f82d3SEliot Blennerhassett 
979719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
980719f82d3SEliot Blennerhassett 
981719f82d3SEliot Blennerhassett 	return hr.error;
982719f82d3SEliot Blennerhassett }
983719f82d3SEliot Blennerhassett 
hpi_instream_reset(u32 h_instream)984ba94455cSEliot Blennerhassett u16 hpi_instream_reset(u32 h_instream)
985719f82d3SEliot Blennerhassett {
986719f82d3SEliot Blennerhassett 	struct hpi_message hm;
987719f82d3SEliot Blennerhassett 	struct hpi_response hr;
988719f82d3SEliot Blennerhassett 
989719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
990719f82d3SEliot Blennerhassett 		HPI_ISTREAM_RESET);
991ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
992ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
993719f82d3SEliot Blennerhassett 
994719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
995719f82d3SEliot Blennerhassett 
996719f82d3SEliot Blennerhassett 	return hr.error;
997719f82d3SEliot Blennerhassett }
998719f82d3SEliot Blennerhassett 
hpi_instream_get_info_ex(u32 h_instream,u16 * pw_state,u32 * pbuffer_size,u32 * pdata_recorded,u32 * psamples_recorded,u32 * pauxiliary_data_recorded)999ba94455cSEliot Blennerhassett u16 hpi_instream_get_info_ex(u32 h_instream, u16 *pw_state, u32 *pbuffer_size,
1000ba94455cSEliot Blennerhassett 	u32 *pdata_recorded, u32 *psamples_recorded,
1001ba94455cSEliot Blennerhassett 	u32 *pauxiliary_data_recorded)
1002719f82d3SEliot Blennerhassett {
1003719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1004719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1005719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1006719f82d3SEliot Blennerhassett 		HPI_ISTREAM_GET_INFO);
1007ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1008ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1009719f82d3SEliot Blennerhassett 
1010719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1011719f82d3SEliot Blennerhassett 
1012719f82d3SEliot Blennerhassett 	if (pw_state)
1013719f82d3SEliot Blennerhassett 		*pw_state = hr.u.d.u.stream_info.state;
1014719f82d3SEliot Blennerhassett 	if (pbuffer_size)
1015719f82d3SEliot Blennerhassett 		*pbuffer_size = hr.u.d.u.stream_info.buffer_size;
1016719f82d3SEliot Blennerhassett 	if (pdata_recorded)
1017719f82d3SEliot Blennerhassett 		*pdata_recorded = hr.u.d.u.stream_info.data_available;
1018719f82d3SEliot Blennerhassett 	if (psamples_recorded)
1019719f82d3SEliot Blennerhassett 		*psamples_recorded = hr.u.d.u.stream_info.samples_transferred;
1020719f82d3SEliot Blennerhassett 	if (pauxiliary_data_recorded)
1021719f82d3SEliot Blennerhassett 		*pauxiliary_data_recorded =
1022719f82d3SEliot Blennerhassett 			hr.u.d.u.stream_info.auxiliary_data_available;
1023719f82d3SEliot Blennerhassett 	return hr.error;
1024719f82d3SEliot Blennerhassett }
1025719f82d3SEliot Blennerhassett 
hpi_instream_ancillary_reset(u32 h_instream,u16 bytes_per_frame,u16 mode,u16 alignment,u16 idle_bit)1026ba94455cSEliot Blennerhassett u16 hpi_instream_ancillary_reset(u32 h_instream, u16 bytes_per_frame,
1027ba94455cSEliot Blennerhassett 	u16 mode, u16 alignment, u16 idle_bit)
1028719f82d3SEliot Blennerhassett {
1029719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1030719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1031719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1032719f82d3SEliot Blennerhassett 		HPI_ISTREAM_ANC_RESET);
1033ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1034ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1035719f82d3SEliot Blennerhassett 	hm.u.d.u.data.format.attributes = bytes_per_frame;
1036719f82d3SEliot Blennerhassett 	hm.u.d.u.data.format.format = (mode << 8) | (alignment & 0xff);
1037719f82d3SEliot Blennerhassett 	hm.u.d.u.data.format.channels = idle_bit;
1038719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1039719f82d3SEliot Blennerhassett 	return hr.error;
1040719f82d3SEliot Blennerhassett }
1041719f82d3SEliot Blennerhassett 
hpi_instream_ancillary_get_info(u32 h_instream,u32 * pframe_space)1042ba94455cSEliot Blennerhassett u16 hpi_instream_ancillary_get_info(u32 h_instream, u32 *pframe_space)
1043719f82d3SEliot Blennerhassett {
1044719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1045719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1046719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1047719f82d3SEliot Blennerhassett 		HPI_ISTREAM_ANC_GET_INFO);
1048ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1049ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1050719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1051719f82d3SEliot Blennerhassett 	if (pframe_space)
1052719f82d3SEliot Blennerhassett 		*pframe_space =
1053719f82d3SEliot Blennerhassett 			(hr.u.d.u.stream_info.buffer_size -
1054719f82d3SEliot Blennerhassett 			hr.u.d.u.stream_info.data_available) /
1055719f82d3SEliot Blennerhassett 			sizeof(struct hpi_anc_frame);
1056719f82d3SEliot Blennerhassett 	return hr.error;
1057719f82d3SEliot Blennerhassett }
1058719f82d3SEliot Blennerhassett 
hpi_instream_ancillary_write(u32 h_instream,const struct hpi_anc_frame * p_anc_frame_buffer,u32 anc_frame_buffer_size_in_bytes,u32 number_of_ancillary_frames_to_write)1059ba94455cSEliot Blennerhassett u16 hpi_instream_ancillary_write(u32 h_instream,
1060ba94455cSEliot Blennerhassett 	const struct hpi_anc_frame *p_anc_frame_buffer,
1061719f82d3SEliot Blennerhassett 	u32 anc_frame_buffer_size_in_bytes,
1062719f82d3SEliot Blennerhassett 	u32 number_of_ancillary_frames_to_write)
1063719f82d3SEliot Blennerhassett {
1064719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1065719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1066719f82d3SEliot Blennerhassett 
1067719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1068719f82d3SEliot Blennerhassett 		HPI_ISTREAM_ANC_WRITE);
1069ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1070ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1071719f82d3SEliot Blennerhassett 	hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
1072719f82d3SEliot Blennerhassett 	hm.u.d.u.data.data_size =
1073719f82d3SEliot Blennerhassett 		number_of_ancillary_frames_to_write *
1074719f82d3SEliot Blennerhassett 		sizeof(struct hpi_anc_frame);
1075719f82d3SEliot Blennerhassett 	if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
1076719f82d3SEliot Blennerhassett 		hpi_send_recv(&hm, &hr);
1077719f82d3SEliot Blennerhassett 	else
1078ba94455cSEliot Blennerhassett 		hr.error = HPI_ERROR_INVALID_DATASIZE;
1079719f82d3SEliot Blennerhassett 	return hr.error;
1080719f82d3SEliot Blennerhassett }
1081719f82d3SEliot Blennerhassett 
hpi_instream_host_buffer_allocate(u32 h_instream,u32 size_in_bytes)1082ba94455cSEliot Blennerhassett u16 hpi_instream_host_buffer_allocate(u32 h_instream, u32 size_in_bytes)
1083719f82d3SEliot Blennerhassett {
1084719f82d3SEliot Blennerhassett 
1085719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1086719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1087719f82d3SEliot Blennerhassett 
1088719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1089719f82d3SEliot Blennerhassett 		HPI_ISTREAM_HOSTBUFFER_ALLOC);
1090ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1091ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1092719f82d3SEliot Blennerhassett 	hm.u.d.u.data.data_size = size_in_bytes;
1093719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1094719f82d3SEliot Blennerhassett 	return hr.error;
1095719f82d3SEliot Blennerhassett }
1096719f82d3SEliot Blennerhassett 
hpi_instream_host_buffer_get_info(u32 h_instream,u8 ** pp_buffer,struct hpi_hostbuffer_status ** pp_status)1097ba94455cSEliot Blennerhassett u16 hpi_instream_host_buffer_get_info(u32 h_instream, u8 **pp_buffer,
1098719f82d3SEliot Blennerhassett 	struct hpi_hostbuffer_status **pp_status)
1099719f82d3SEliot Blennerhassett {
1100719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1101719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1102719f82d3SEliot Blennerhassett 
1103719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1104719f82d3SEliot Blennerhassett 		HPI_ISTREAM_HOSTBUFFER_GET_INFO);
1105ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1106ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1107719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1108719f82d3SEliot Blennerhassett 
1109719f82d3SEliot Blennerhassett 	if (hr.error == 0) {
1110719f82d3SEliot Blennerhassett 		if (pp_buffer)
1111719f82d3SEliot Blennerhassett 			*pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
1112719f82d3SEliot Blennerhassett 		if (pp_status)
1113719f82d3SEliot Blennerhassett 			*pp_status = hr.u.d.u.hostbuffer_info.p_status;
1114719f82d3SEliot Blennerhassett 	}
1115719f82d3SEliot Blennerhassett 	return hr.error;
1116719f82d3SEliot Blennerhassett }
1117719f82d3SEliot Blennerhassett 
hpi_instream_host_buffer_free(u32 h_instream)1118ba94455cSEliot Blennerhassett u16 hpi_instream_host_buffer_free(u32 h_instream)
1119719f82d3SEliot Blennerhassett {
1120719f82d3SEliot Blennerhassett 
1121719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1122719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1123719f82d3SEliot Blennerhassett 
1124719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1125719f82d3SEliot Blennerhassett 		HPI_ISTREAM_HOSTBUFFER_FREE);
1126ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1127ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1128719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1129719f82d3SEliot Blennerhassett 	return hr.error;
1130719f82d3SEliot Blennerhassett }
1131719f82d3SEliot Blennerhassett 
hpi_instream_group_add(u32 h_instream,u32 h_stream)1132ba94455cSEliot Blennerhassett u16 hpi_instream_group_add(u32 h_instream, u32 h_stream)
1133719f82d3SEliot Blennerhassett {
1134719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1135719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1136719f82d3SEliot Blennerhassett 	u16 adapter;
1137719f82d3SEliot Blennerhassett 	char c_obj_type;
1138719f82d3SEliot Blennerhassett 
1139719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1140719f82d3SEliot Blennerhassett 		HPI_ISTREAM_GROUP_ADD);
1141719f82d3SEliot Blennerhassett 	hr.error = 0;
1142ba94455cSEliot Blennerhassett 
1143ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1144ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1145ba94455cSEliot Blennerhassett 
1146ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_stream, &adapter,
1147ba94455cSEliot Blennerhassett 			&hm.u.d.u.stream.stream_index))
1148ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1149ba94455cSEliot Blennerhassett 
1150719f82d3SEliot Blennerhassett 	c_obj_type = hpi_handle_object(h_stream);
1151719f82d3SEliot Blennerhassett 
1152719f82d3SEliot Blennerhassett 	switch (c_obj_type) {
1153719f82d3SEliot Blennerhassett 	case HPI_OBJ_OSTREAM:
1154719f82d3SEliot Blennerhassett 	case HPI_OBJ_ISTREAM:
1155ba94455cSEliot Blennerhassett 		hm.u.d.u.stream.object_type = c_obj_type;
1156719f82d3SEliot Blennerhassett 		break;
1157719f82d3SEliot Blennerhassett 	default:
1158ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_OBJ;
1159719f82d3SEliot Blennerhassett 	}
1160719f82d3SEliot Blennerhassett 
1161719f82d3SEliot Blennerhassett 	if (adapter != hm.adapter_index)
1162719f82d3SEliot Blennerhassett 		return HPI_ERROR_NO_INTERADAPTER_GROUPS;
1163719f82d3SEliot Blennerhassett 
1164719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1165719f82d3SEliot Blennerhassett 	return hr.error;
1166719f82d3SEliot Blennerhassett }
1167719f82d3SEliot Blennerhassett 
hpi_instream_group_get_map(u32 h_instream,u32 * poutstream_map,u32 * pinstream_map)1168ba94455cSEliot Blennerhassett u16 hpi_instream_group_get_map(u32 h_instream, u32 *poutstream_map,
1169ba94455cSEliot Blennerhassett 	u32 *pinstream_map)
1170719f82d3SEliot Blennerhassett {
1171719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1172719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1173719f82d3SEliot Blennerhassett 
1174719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1175719f82d3SEliot Blennerhassett 		HPI_ISTREAM_HOSTBUFFER_FREE);
1176ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1177ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1178719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1179719f82d3SEliot Blennerhassett 
1180719f82d3SEliot Blennerhassett 	if (poutstream_map)
1181719f82d3SEliot Blennerhassett 		*poutstream_map = hr.u.d.u.group_info.outstream_group_map;
1182719f82d3SEliot Blennerhassett 	if (pinstream_map)
1183719f82d3SEliot Blennerhassett 		*pinstream_map = hr.u.d.u.group_info.instream_group_map;
1184719f82d3SEliot Blennerhassett 
1185719f82d3SEliot Blennerhassett 	return hr.error;
1186719f82d3SEliot Blennerhassett }
1187719f82d3SEliot Blennerhassett 
hpi_instream_group_reset(u32 h_instream)1188ba94455cSEliot Blennerhassett u16 hpi_instream_group_reset(u32 h_instream)
1189719f82d3SEliot Blennerhassett {
1190719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1191719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1192719f82d3SEliot Blennerhassett 
1193719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1194719f82d3SEliot Blennerhassett 		HPI_ISTREAM_GROUP_RESET);
1195ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1196ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1197719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1198719f82d3SEliot Blennerhassett 	return hr.error;
1199719f82d3SEliot Blennerhassett }
1200719f82d3SEliot Blennerhassett 
hpi_mixer_open(u16 adapter_index,u32 * ph_mixer)1201ba94455cSEliot Blennerhassett u16 hpi_mixer_open(u16 adapter_index, u32 *ph_mixer)
1202719f82d3SEliot Blennerhassett {
1203719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1204719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1205719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN);
1206719f82d3SEliot Blennerhassett 	hm.adapter_index = adapter_index;
1207719f82d3SEliot Blennerhassett 
1208719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1209719f82d3SEliot Blennerhassett 
1210719f82d3SEliot Blennerhassett 	if (hr.error == 0)
1211719f82d3SEliot Blennerhassett 		*ph_mixer =
1212719f82d3SEliot Blennerhassett 			hpi_indexes_to_handle(HPI_OBJ_MIXER, adapter_index,
1213719f82d3SEliot Blennerhassett 			0);
1214719f82d3SEliot Blennerhassett 	else
1215719f82d3SEliot Blennerhassett 		*ph_mixer = 0;
1216719f82d3SEliot Blennerhassett 	return hr.error;
1217719f82d3SEliot Blennerhassett }
1218719f82d3SEliot Blennerhassett 
hpi_mixer_close(u32 h_mixer)1219ba94455cSEliot Blennerhassett u16 hpi_mixer_close(u32 h_mixer)
1220719f82d3SEliot Blennerhassett {
1221719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1222719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1223ba94455cSEliot Blennerhassett 
1224719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE);
1225ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1226ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1227ba94455cSEliot Blennerhassett 
1228719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1229719f82d3SEliot Blennerhassett 	return hr.error;
1230719f82d3SEliot Blennerhassett }
1231719f82d3SEliot Blennerhassett 
hpi_mixer_get_control(u32 h_mixer,u16 src_node_type,u16 src_node_type_index,u16 dst_node_type,u16 dst_node_type_index,u16 control_type,u32 * ph_control)1232ba94455cSEliot Blennerhassett u16 hpi_mixer_get_control(u32 h_mixer, u16 src_node_type,
1233ba94455cSEliot Blennerhassett 	u16 src_node_type_index, u16 dst_node_type, u16 dst_node_type_index,
1234ba94455cSEliot Blennerhassett 	u16 control_type, u32 *ph_control)
1235719f82d3SEliot Blennerhassett {
1236719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1237719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1238719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
1239719f82d3SEliot Blennerhassett 		HPI_MIXER_GET_CONTROL);
1240ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1241ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1242719f82d3SEliot Blennerhassett 	hm.u.m.node_type1 = src_node_type;
1243719f82d3SEliot Blennerhassett 	hm.u.m.node_index1 = src_node_type_index;
1244719f82d3SEliot Blennerhassett 	hm.u.m.node_type2 = dst_node_type;
1245719f82d3SEliot Blennerhassett 	hm.u.m.node_index2 = dst_node_type_index;
1246719f82d3SEliot Blennerhassett 	hm.u.m.control_type = control_type;
1247719f82d3SEliot Blennerhassett 
1248719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1249719f82d3SEliot Blennerhassett 
1250719f82d3SEliot Blennerhassett 	if (hr.error == 0)
1251719f82d3SEliot Blennerhassett 		*ph_control =
1252719f82d3SEliot Blennerhassett 			hpi_indexes_to_handle(HPI_OBJ_CONTROL,
1253719f82d3SEliot Blennerhassett 			hm.adapter_index, hr.u.m.control_index);
1254719f82d3SEliot Blennerhassett 	else
1255719f82d3SEliot Blennerhassett 		*ph_control = 0;
1256719f82d3SEliot Blennerhassett 	return hr.error;
1257719f82d3SEliot Blennerhassett }
1258719f82d3SEliot Blennerhassett 
hpi_mixer_get_control_by_index(u32 h_mixer,u16 control_index,u16 * pw_src_node_type,u16 * pw_src_node_index,u16 * pw_dst_node_type,u16 * pw_dst_node_index,u16 * pw_control_type,u32 * ph_control)1259ba94455cSEliot Blennerhassett u16 hpi_mixer_get_control_by_index(u32 h_mixer, u16 control_index,
1260ba94455cSEliot Blennerhassett 	u16 *pw_src_node_type, u16 *pw_src_node_index, u16 *pw_dst_node_type,
1261ba94455cSEliot Blennerhassett 	u16 *pw_dst_node_index, u16 *pw_control_type, u32 *ph_control)
1262719f82d3SEliot Blennerhassett {
1263719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1264719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1265719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
1266719f82d3SEliot Blennerhassett 		HPI_MIXER_GET_CONTROL_BY_INDEX);
1267ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1268ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1269719f82d3SEliot Blennerhassett 	hm.u.m.control_index = control_index;
1270719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1271719f82d3SEliot Blennerhassett 
1272719f82d3SEliot Blennerhassett 	if (pw_src_node_type) {
1273719f82d3SEliot Blennerhassett 		*pw_src_node_type =
1274719f82d3SEliot Blennerhassett 			hr.u.m.src_node_type + HPI_SOURCENODE_NONE;
1275719f82d3SEliot Blennerhassett 		*pw_src_node_index = hr.u.m.src_node_index;
1276719f82d3SEliot Blennerhassett 		*pw_dst_node_type = hr.u.m.dst_node_type + HPI_DESTNODE_NONE;
1277719f82d3SEliot Blennerhassett 		*pw_dst_node_index = hr.u.m.dst_node_index;
1278719f82d3SEliot Blennerhassett 	}
1279719f82d3SEliot Blennerhassett 	if (pw_control_type)
1280719f82d3SEliot Blennerhassett 		*pw_control_type = hr.u.m.control_index;
1281719f82d3SEliot Blennerhassett 
1282719f82d3SEliot Blennerhassett 	if (ph_control) {
1283719f82d3SEliot Blennerhassett 		if (hr.error == 0)
1284719f82d3SEliot Blennerhassett 			*ph_control =
1285719f82d3SEliot Blennerhassett 				hpi_indexes_to_handle(HPI_OBJ_CONTROL,
1286719f82d3SEliot Blennerhassett 				hm.adapter_index, control_index);
1287719f82d3SEliot Blennerhassett 		else
1288719f82d3SEliot Blennerhassett 			*ph_control = 0;
1289719f82d3SEliot Blennerhassett 	}
1290719f82d3SEliot Blennerhassett 	return hr.error;
1291719f82d3SEliot Blennerhassett }
1292719f82d3SEliot Blennerhassett 
hpi_mixer_store(u32 h_mixer,enum HPI_MIXER_STORE_COMMAND command,u16 index)1293ba94455cSEliot Blennerhassett u16 hpi_mixer_store(u32 h_mixer, enum HPI_MIXER_STORE_COMMAND command,
1294ba94455cSEliot Blennerhassett 	u16 index)
1295719f82d3SEliot Blennerhassett {
1296719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1297719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1298719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_STORE);
1299ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1300ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1301719f82d3SEliot Blennerhassett 	hm.u.mx.store.command = command;
1302719f82d3SEliot Blennerhassett 	hm.u.mx.store.index = index;
1303719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1304719f82d3SEliot Blennerhassett 	return hr.error;
1305719f82d3SEliot Blennerhassett }
1306719f82d3SEliot Blennerhassett 
1307719f82d3SEliot Blennerhassett static
hpi_control_param_set(const u32 h_control,const u16 attrib,const u32 param1,const u32 param2)1308ba94455cSEliot Blennerhassett u16 hpi_control_param_set(const u32 h_control, const u16 attrib,
1309ba94455cSEliot Blennerhassett 	const u32 param1, const u32 param2)
1310719f82d3SEliot Blennerhassett {
1311719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1312719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1313108ccb3fSEliot Blennerhassett 
1314719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1315719f82d3SEliot Blennerhassett 		HPI_CONTROL_SET_STATE);
1316ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1317ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1318719f82d3SEliot Blennerhassett 	hm.u.c.attribute = attrib;
1319719f82d3SEliot Blennerhassett 	hm.u.c.param1 = param1;
1320719f82d3SEliot Blennerhassett 	hm.u.c.param2 = param2;
1321719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1322719f82d3SEliot Blennerhassett 	return hr.error;
1323719f82d3SEliot Blennerhassett }
1324719f82d3SEliot Blennerhassett 
hpi_control_log_set2(u32 h_control,u16 attrib,short sv0,short sv1)1325108ccb3fSEliot Blennerhassett static u16 hpi_control_log_set2(u32 h_control, u16 attrib, short sv0,
1326108ccb3fSEliot Blennerhassett 	short sv1)
1327108ccb3fSEliot Blennerhassett {
1328108ccb3fSEliot Blennerhassett 	struct hpi_message hm;
1329108ccb3fSEliot Blennerhassett 	struct hpi_response hr;
1330108ccb3fSEliot Blennerhassett 
1331108ccb3fSEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1332108ccb3fSEliot Blennerhassett 		HPI_CONTROL_SET_STATE);
1333ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1334ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1335108ccb3fSEliot Blennerhassett 	hm.u.c.attribute = attrib;
1336108ccb3fSEliot Blennerhassett 	hm.u.c.an_log_value[0] = sv0;
1337108ccb3fSEliot Blennerhassett 	hm.u.c.an_log_value[1] = sv1;
1338108ccb3fSEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1339108ccb3fSEliot Blennerhassett 	return hr.error;
1340108ccb3fSEliot Blennerhassett }
1341108ccb3fSEliot Blennerhassett 
1342719f82d3SEliot Blennerhassett static
hpi_control_param_get(const u32 h_control,const u16 attrib,u32 param1,u32 param2,u32 * pparam1,u32 * pparam2)1343ba94455cSEliot Blennerhassett u16 hpi_control_param_get(const u32 h_control, const u16 attrib, u32 param1,
1344ba94455cSEliot Blennerhassett 	u32 param2, u32 *pparam1, u32 *pparam2)
1345719f82d3SEliot Blennerhassett {
1346719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1347719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1348108ccb3fSEliot Blennerhassett 
1349719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1350719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1351ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1352ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1353719f82d3SEliot Blennerhassett 	hm.u.c.attribute = attrib;
1354719f82d3SEliot Blennerhassett 	hm.u.c.param1 = param1;
1355719f82d3SEliot Blennerhassett 	hm.u.c.param2 = param2;
1356719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1357108ccb3fSEliot Blennerhassett 
1358719f82d3SEliot Blennerhassett 	*pparam1 = hr.u.c.param1;
1359719f82d3SEliot Blennerhassett 	if (pparam2)
1360719f82d3SEliot Blennerhassett 		*pparam2 = hr.u.c.param2;
1361719f82d3SEliot Blennerhassett 
1362719f82d3SEliot Blennerhassett 	return hr.error;
1363719f82d3SEliot Blennerhassett }
1364719f82d3SEliot Blennerhassett 
1365ba94455cSEliot Blennerhassett #define hpi_control_param1_get(h, a, p1) \
1366ba94455cSEliot Blennerhassett 		hpi_control_param_get(h, a, 0, 0, p1, NULL)
1367ba94455cSEliot Blennerhassett #define hpi_control_param2_get(h, a, p1, p2) \
1368ba94455cSEliot Blennerhassett 		hpi_control_param_get(h, a, 0, 0, p1, p2)
1369108ccb3fSEliot Blennerhassett 
hpi_control_log_get2(u32 h_control,u16 attrib,short * sv0,short * sv1)1370ba94455cSEliot Blennerhassett static u16 hpi_control_log_get2(u32 h_control, u16 attrib, short *sv0,
1371ba94455cSEliot Blennerhassett 	short *sv1)
1372108ccb3fSEliot Blennerhassett {
1373108ccb3fSEliot Blennerhassett 	struct hpi_message hm;
1374108ccb3fSEliot Blennerhassett 	struct hpi_response hr;
1375108ccb3fSEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1376108ccb3fSEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1377ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1378ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1379108ccb3fSEliot Blennerhassett 	hm.u.c.attribute = attrib;
1380108ccb3fSEliot Blennerhassett 
1381108ccb3fSEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1382108ccb3fSEliot Blennerhassett 	*sv0 = hr.u.c.an_log_value[0];
1383108ccb3fSEliot Blennerhassett 	if (sv1)
1384108ccb3fSEliot Blennerhassett 		*sv1 = hr.u.c.an_log_value[1];
1385108ccb3fSEliot Blennerhassett 	return hr.error;
1386108ccb3fSEliot Blennerhassett }
1387719f82d3SEliot Blennerhassett 
1388719f82d3SEliot Blennerhassett static
hpi_control_query(const u32 h_control,const u16 attrib,const u32 index,const u32 param,u32 * psetting)1389ba94455cSEliot Blennerhassett u16 hpi_control_query(const u32 h_control, const u16 attrib, const u32 index,
1390719f82d3SEliot Blennerhassett 	const u32 param, u32 *psetting)
1391719f82d3SEliot Blennerhassett {
1392719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1393719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1394108ccb3fSEliot Blennerhassett 
1395719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1396719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_INFO);
1397ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1398ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1399719f82d3SEliot Blennerhassett 
1400719f82d3SEliot Blennerhassett 	hm.u.c.attribute = attrib;
1401719f82d3SEliot Blennerhassett 	hm.u.c.param1 = index;
1402719f82d3SEliot Blennerhassett 	hm.u.c.param2 = param;
1403719f82d3SEliot Blennerhassett 
1404719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1405719f82d3SEliot Blennerhassett 	*psetting = hr.u.c.param1;
1406719f82d3SEliot Blennerhassett 
1407719f82d3SEliot Blennerhassett 	return hr.error;
1408719f82d3SEliot Blennerhassett }
1409719f82d3SEliot Blennerhassett 
hpi_control_get_string(const u32 h_control,const u16 attribute,char * psz_string,const u32 string_length)1410108ccb3fSEliot Blennerhassett static u16 hpi_control_get_string(const u32 h_control, const u16 attribute,
1411108ccb3fSEliot Blennerhassett 	char *psz_string, const u32 string_length)
1412719f82d3SEliot Blennerhassett {
1413719f82d3SEliot Blennerhassett 	unsigned int sub_string_index = 0, j = 0;
1414719f82d3SEliot Blennerhassett 	char c = 0;
1415719f82d3SEliot Blennerhassett 	unsigned int n = 0;
14163285ea10SEliot Blennerhassett 	u16 err = 0;
1417719f82d3SEliot Blennerhassett 
1418719f82d3SEliot Blennerhassett 	if ((string_length < 1) || (string_length > 256))
1419719f82d3SEliot Blennerhassett 		return HPI_ERROR_INVALID_CONTROL_VALUE;
1420719f82d3SEliot Blennerhassett 	for (sub_string_index = 0; sub_string_index < string_length;
1421719f82d3SEliot Blennerhassett 		sub_string_index += 8) {
1422719f82d3SEliot Blennerhassett 		struct hpi_message hm;
1423719f82d3SEliot Blennerhassett 		struct hpi_response hr;
1424719f82d3SEliot Blennerhassett 
1425719f82d3SEliot Blennerhassett 		hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1426719f82d3SEliot Blennerhassett 			HPI_CONTROL_GET_STATE);
1427ba94455cSEliot Blennerhassett 		if (hpi_handle_indexes(h_control, &hm.adapter_index,
1428ba94455cSEliot Blennerhassett 				&hm.obj_index))
1429ba94455cSEliot Blennerhassett 			return HPI_ERROR_INVALID_HANDLE;
1430719f82d3SEliot Blennerhassett 		hm.u.c.attribute = attribute;
1431719f82d3SEliot Blennerhassett 		hm.u.c.param1 = sub_string_index;
1432719f82d3SEliot Blennerhassett 		hm.u.c.param2 = 0;
1433719f82d3SEliot Blennerhassett 		hpi_send_recv(&hm, &hr);
1434719f82d3SEliot Blennerhassett 
1435719f82d3SEliot Blennerhassett 		if (sub_string_index == 0
1436719f82d3SEliot Blennerhassett 			&& (hr.u.cu.chars8.remaining_chars + 8) >
1437719f82d3SEliot Blennerhassett 			string_length)
1438719f82d3SEliot Blennerhassett 			return HPI_ERROR_INVALID_CONTROL_VALUE;
1439719f82d3SEliot Blennerhassett 
1440719f82d3SEliot Blennerhassett 		if (hr.error) {
14413285ea10SEliot Blennerhassett 			err = hr.error;
1442719f82d3SEliot Blennerhassett 			break;
1443719f82d3SEliot Blennerhassett 		}
1444719f82d3SEliot Blennerhassett 		for (j = 0; j < 8; j++) {
1445719f82d3SEliot Blennerhassett 			c = hr.u.cu.chars8.sz_data[j];
1446719f82d3SEliot Blennerhassett 			psz_string[sub_string_index + j] = c;
1447719f82d3SEliot Blennerhassett 			n++;
1448719f82d3SEliot Blennerhassett 			if (n >= string_length) {
1449719f82d3SEliot Blennerhassett 				psz_string[string_length - 1] = 0;
14503285ea10SEliot Blennerhassett 				err = HPI_ERROR_INVALID_CONTROL_VALUE;
1451719f82d3SEliot Blennerhassett 				break;
1452719f82d3SEliot Blennerhassett 			}
1453719f82d3SEliot Blennerhassett 			if (c == 0)
1454719f82d3SEliot Blennerhassett 				break;
1455719f82d3SEliot Blennerhassett 		}
1456719f82d3SEliot Blennerhassett 
1457719f82d3SEliot Blennerhassett 		if ((hr.u.cu.chars8.remaining_chars == 0)
1458719f82d3SEliot Blennerhassett 			&& ((sub_string_index + j) < string_length)
1459719f82d3SEliot Blennerhassett 			&& (c != 0)) {
1460719f82d3SEliot Blennerhassett 			c = 0;
1461719f82d3SEliot Blennerhassett 			psz_string[sub_string_index + j] = c;
1462719f82d3SEliot Blennerhassett 		}
1463719f82d3SEliot Blennerhassett 		if (c == 0)
1464719f82d3SEliot Blennerhassett 			break;
1465719f82d3SEliot Blennerhassett 	}
14663285ea10SEliot Blennerhassett 	return err;
1467719f82d3SEliot Blennerhassett }
1468719f82d3SEliot Blennerhassett 
hpi_aesebu_receiver_query_format(const u32 h_aes_rx,const u32 index,u16 * pw_format)1469ba94455cSEliot Blennerhassett u16 hpi_aesebu_receiver_query_format(const u32 h_aes_rx, const u32 index,
1470ba94455cSEliot Blennerhassett 	u16 *pw_format)
1471719f82d3SEliot Blennerhassett {
1472719f82d3SEliot Blennerhassett 	u32 qr;
1473719f82d3SEliot Blennerhassett 	u16 err;
1474719f82d3SEliot Blennerhassett 
1475ba94455cSEliot Blennerhassett 	err = hpi_control_query(h_aes_rx, HPI_AESEBURX_FORMAT, index, 0, &qr);
1476719f82d3SEliot Blennerhassett 	*pw_format = (u16)qr;
1477719f82d3SEliot Blennerhassett 	return err;
1478719f82d3SEliot Blennerhassett }
1479719f82d3SEliot Blennerhassett 
hpi_aesebu_receiver_set_format(u32 h_control,u16 format)1480ba94455cSEliot Blennerhassett u16 hpi_aesebu_receiver_set_format(u32 h_control, u16 format)
1481719f82d3SEliot Blennerhassett {
1482ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_AESEBURX_FORMAT, format,
1483ba94455cSEliot Blennerhassett 		0);
1484719f82d3SEliot Blennerhassett }
1485719f82d3SEliot Blennerhassett 
hpi_aesebu_receiver_get_format(u32 h_control,u16 * pw_format)1486ba94455cSEliot Blennerhassett u16 hpi_aesebu_receiver_get_format(u32 h_control, u16 *pw_format)
1487719f82d3SEliot Blennerhassett {
1488719f82d3SEliot Blennerhassett 	u16 err;
1489719f82d3SEliot Blennerhassett 	u32 param;
1490719f82d3SEliot Blennerhassett 
1491ba94455cSEliot Blennerhassett 	err = hpi_control_param1_get(h_control, HPI_AESEBURX_FORMAT, &param);
1492719f82d3SEliot Blennerhassett 	if (!err && pw_format)
1493719f82d3SEliot Blennerhassett 		*pw_format = (u16)param;
1494719f82d3SEliot Blennerhassett 
1495719f82d3SEliot Blennerhassett 	return err;
1496719f82d3SEliot Blennerhassett }
1497719f82d3SEliot Blennerhassett 
hpi_aesebu_receiver_get_sample_rate(u32 h_control,u32 * psample_rate)1498ba94455cSEliot Blennerhassett u16 hpi_aesebu_receiver_get_sample_rate(u32 h_control, u32 *psample_rate)
1499719f82d3SEliot Blennerhassett {
1500ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_AESEBURX_SAMPLERATE,
1501ba94455cSEliot Blennerhassett 		psample_rate);
1502719f82d3SEliot Blennerhassett }
1503719f82d3SEliot Blennerhassett 
hpi_aesebu_receiver_get_user_data(u32 h_control,u16 index,u16 * pw_data)1504ba94455cSEliot Blennerhassett u16 hpi_aesebu_receiver_get_user_data(u32 h_control, u16 index, u16 *pw_data)
1505719f82d3SEliot Blennerhassett {
1506719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1507719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1508719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1509719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1510ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1511ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1512719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_AESEBURX_USERDATA;
1513719f82d3SEliot Blennerhassett 	hm.u.c.param1 = index;
1514719f82d3SEliot Blennerhassett 
1515719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1516719f82d3SEliot Blennerhassett 
1517719f82d3SEliot Blennerhassett 	if (pw_data)
1518719f82d3SEliot Blennerhassett 		*pw_data = (u16)hr.u.c.param2;
1519719f82d3SEliot Blennerhassett 	return hr.error;
1520719f82d3SEliot Blennerhassett }
1521719f82d3SEliot Blennerhassett 
hpi_aesebu_receiver_get_channel_status(u32 h_control,u16 index,u16 * pw_data)1522ba94455cSEliot Blennerhassett u16 hpi_aesebu_receiver_get_channel_status(u32 h_control, u16 index,
1523ba94455cSEliot Blennerhassett 	u16 *pw_data)
1524719f82d3SEliot Blennerhassett {
1525719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1526719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1527719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1528719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1529ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1530ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1531719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_AESEBURX_CHANNELSTATUS;
1532719f82d3SEliot Blennerhassett 	hm.u.c.param1 = index;
1533719f82d3SEliot Blennerhassett 
1534719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1535719f82d3SEliot Blennerhassett 
1536719f82d3SEliot Blennerhassett 	if (pw_data)
1537719f82d3SEliot Blennerhassett 		*pw_data = (u16)hr.u.c.param2;
1538719f82d3SEliot Blennerhassett 	return hr.error;
1539719f82d3SEliot Blennerhassett }
1540719f82d3SEliot Blennerhassett 
hpi_aesebu_receiver_get_error_status(u32 h_control,u16 * pw_error_data)1541ba94455cSEliot Blennerhassett u16 hpi_aesebu_receiver_get_error_status(u32 h_control, u16 *pw_error_data)
1542719f82d3SEliot Blennerhassett {
1543719f82d3SEliot Blennerhassett 	u32 error_data = 0;
1544827492acSEliot Blennerhassett 	u16 err = 0;
1545719f82d3SEliot Blennerhassett 
1546827492acSEliot Blennerhassett 	err = hpi_control_param1_get(h_control, HPI_AESEBURX_ERRORSTATUS,
1547ba94455cSEliot Blennerhassett 		&error_data);
1548719f82d3SEliot Blennerhassett 	if (pw_error_data)
1549719f82d3SEliot Blennerhassett 		*pw_error_data = (u16)error_data;
1550827492acSEliot Blennerhassett 	return err;
1551719f82d3SEliot Blennerhassett }
1552719f82d3SEliot Blennerhassett 
hpi_aesebu_transmitter_set_sample_rate(u32 h_control,u32 sample_rate)1553ba94455cSEliot Blennerhassett u16 hpi_aesebu_transmitter_set_sample_rate(u32 h_control, u32 sample_rate)
1554719f82d3SEliot Blennerhassett {
1555ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_AESEBUTX_SAMPLERATE,
1556ba94455cSEliot Blennerhassett 		sample_rate, 0);
1557719f82d3SEliot Blennerhassett }
1558719f82d3SEliot Blennerhassett 
hpi_aesebu_transmitter_set_user_data(u32 h_control,u16 index,u16 data)1559ba94455cSEliot Blennerhassett u16 hpi_aesebu_transmitter_set_user_data(u32 h_control, u16 index, u16 data)
1560719f82d3SEliot Blennerhassett {
1561ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_AESEBUTX_USERDATA, index,
1562ba94455cSEliot Blennerhassett 		data);
1563719f82d3SEliot Blennerhassett }
1564719f82d3SEliot Blennerhassett 
hpi_aesebu_transmitter_set_channel_status(u32 h_control,u16 index,u16 data)1565ba94455cSEliot Blennerhassett u16 hpi_aesebu_transmitter_set_channel_status(u32 h_control, u16 index,
1566ba94455cSEliot Blennerhassett 	u16 data)
1567719f82d3SEliot Blennerhassett {
1568ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_AESEBUTX_CHANNELSTATUS,
1569ba94455cSEliot Blennerhassett 		index, data);
1570719f82d3SEliot Blennerhassett }
1571719f82d3SEliot Blennerhassett 
hpi_aesebu_transmitter_get_channel_status(u32 h_control,u16 index,u16 * pw_data)1572ba94455cSEliot Blennerhassett u16 hpi_aesebu_transmitter_get_channel_status(u32 h_control, u16 index,
1573ba94455cSEliot Blennerhassett 	u16 *pw_data)
1574719f82d3SEliot Blennerhassett {
1575719f82d3SEliot Blennerhassett 	return HPI_ERROR_INVALID_OPERATION;
1576719f82d3SEliot Blennerhassett }
1577719f82d3SEliot Blennerhassett 
hpi_aesebu_transmitter_query_format(const u32 h_aes_tx,const u32 index,u16 * pw_format)1578ba94455cSEliot Blennerhassett u16 hpi_aesebu_transmitter_query_format(const u32 h_aes_tx, const u32 index,
1579ba94455cSEliot Blennerhassett 	u16 *pw_format)
1580719f82d3SEliot Blennerhassett {
1581719f82d3SEliot Blennerhassett 	u32 qr;
1582719f82d3SEliot Blennerhassett 	u16 err;
1583719f82d3SEliot Blennerhassett 
1584ba94455cSEliot Blennerhassett 	err = hpi_control_query(h_aes_tx, HPI_AESEBUTX_FORMAT, index, 0, &qr);
1585719f82d3SEliot Blennerhassett 	*pw_format = (u16)qr;
1586719f82d3SEliot Blennerhassett 	return err;
1587719f82d3SEliot Blennerhassett }
1588719f82d3SEliot Blennerhassett 
hpi_aesebu_transmitter_set_format(u32 h_control,u16 output_format)1589ba94455cSEliot Blennerhassett u16 hpi_aesebu_transmitter_set_format(u32 h_control, u16 output_format)
1590719f82d3SEliot Blennerhassett {
1591ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_AESEBUTX_FORMAT,
1592ba94455cSEliot Blennerhassett 		output_format, 0);
1593719f82d3SEliot Blennerhassett }
1594719f82d3SEliot Blennerhassett 
hpi_aesebu_transmitter_get_format(u32 h_control,u16 * pw_output_format)1595ba94455cSEliot Blennerhassett u16 hpi_aesebu_transmitter_get_format(u32 h_control, u16 *pw_output_format)
1596719f82d3SEliot Blennerhassett {
1597719f82d3SEliot Blennerhassett 	u16 err;
1598719f82d3SEliot Blennerhassett 	u32 param;
1599719f82d3SEliot Blennerhassett 
1600ba94455cSEliot Blennerhassett 	err = hpi_control_param1_get(h_control, HPI_AESEBUTX_FORMAT, &param);
1601719f82d3SEliot Blennerhassett 	if (!err && pw_output_format)
1602719f82d3SEliot Blennerhassett 		*pw_output_format = (u16)param;
1603719f82d3SEliot Blennerhassett 
1604719f82d3SEliot Blennerhassett 	return err;
1605719f82d3SEliot Blennerhassett }
1606719f82d3SEliot Blennerhassett 
hpi_bitstream_set_clock_edge(u32 h_control,u16 edge_type)1607ba94455cSEliot Blennerhassett u16 hpi_bitstream_set_clock_edge(u32 h_control, u16 edge_type)
1608719f82d3SEliot Blennerhassett {
1609ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_BITSTREAM_CLOCK_EDGE,
1610ba94455cSEliot Blennerhassett 		edge_type, 0);
1611719f82d3SEliot Blennerhassett }
1612719f82d3SEliot Blennerhassett 
hpi_bitstream_set_data_polarity(u32 h_control,u16 polarity)1613ba94455cSEliot Blennerhassett u16 hpi_bitstream_set_data_polarity(u32 h_control, u16 polarity)
1614719f82d3SEliot Blennerhassett {
1615ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_BITSTREAM_DATA_POLARITY,
1616ba94455cSEliot Blennerhassett 		polarity, 0);
1617719f82d3SEliot Blennerhassett }
1618719f82d3SEliot Blennerhassett 
hpi_bitstream_get_activity(u32 h_control,u16 * pw_clk_activity,u16 * pw_data_activity)1619ba94455cSEliot Blennerhassett u16 hpi_bitstream_get_activity(u32 h_control, u16 *pw_clk_activity,
1620ba94455cSEliot Blennerhassett 	u16 *pw_data_activity)
1621719f82d3SEliot Blennerhassett {
1622719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1623719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1624719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1625719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1626ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1627ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1628719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_BITSTREAM_ACTIVITY;
1629719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1630719f82d3SEliot Blennerhassett 	if (pw_clk_activity)
1631719f82d3SEliot Blennerhassett 		*pw_clk_activity = (u16)hr.u.c.param1;
1632719f82d3SEliot Blennerhassett 	if (pw_data_activity)
1633719f82d3SEliot Blennerhassett 		*pw_data_activity = (u16)hr.u.c.param2;
1634719f82d3SEliot Blennerhassett 	return hr.error;
1635719f82d3SEliot Blennerhassett }
1636719f82d3SEliot Blennerhassett 
hpi_channel_mode_query_mode(const u32 h_mode,const u32 index,u16 * pw_mode)1637ba94455cSEliot Blennerhassett u16 hpi_channel_mode_query_mode(const u32 h_mode, const u32 index,
1638ba94455cSEliot Blennerhassett 	u16 *pw_mode)
1639719f82d3SEliot Blennerhassett {
1640719f82d3SEliot Blennerhassett 	u32 qr;
1641719f82d3SEliot Blennerhassett 	u16 err;
1642719f82d3SEliot Blennerhassett 
1643ba94455cSEliot Blennerhassett 	err = hpi_control_query(h_mode, HPI_CHANNEL_MODE_MODE, index, 0, &qr);
1644719f82d3SEliot Blennerhassett 	*pw_mode = (u16)qr;
1645719f82d3SEliot Blennerhassett 	return err;
1646719f82d3SEliot Blennerhassett }
1647719f82d3SEliot Blennerhassett 
hpi_channel_mode_set(u32 h_control,u16 mode)1648ba94455cSEliot Blennerhassett u16 hpi_channel_mode_set(u32 h_control, u16 mode)
1649719f82d3SEliot Blennerhassett {
1650ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_CHANNEL_MODE_MODE, mode,
1651ba94455cSEliot Blennerhassett 		0);
1652719f82d3SEliot Blennerhassett }
1653719f82d3SEliot Blennerhassett 
hpi_channel_mode_get(u32 h_control,u16 * mode)1654ba94455cSEliot Blennerhassett u16 hpi_channel_mode_get(u32 h_control, u16 *mode)
1655719f82d3SEliot Blennerhassett {
1656719f82d3SEliot Blennerhassett 	u32 mode32 = 0;
1657827492acSEliot Blennerhassett 	u16 err = hpi_control_param1_get(h_control,
1658719f82d3SEliot Blennerhassett 		HPI_CHANNEL_MODE_MODE, &mode32);
1659719f82d3SEliot Blennerhassett 	if (mode)
1660719f82d3SEliot Blennerhassett 		*mode = (u16)mode32;
1661827492acSEliot Blennerhassett 	return err;
1662719f82d3SEliot Blennerhassett }
1663719f82d3SEliot Blennerhassett 
hpi_cobranet_hmi_write(u32 h_control,u32 hmi_address,u32 byte_count,u8 * pb_data)1664ba94455cSEliot Blennerhassett u16 hpi_cobranet_hmi_write(u32 h_control, u32 hmi_address, u32 byte_count,
1665ba94455cSEliot Blennerhassett 	u8 *pb_data)
1666719f82d3SEliot Blennerhassett {
166758fbf77fSEliot Blennerhassett 	struct hpi_msg_cobranet_hmiwrite hm;
166858fbf77fSEliot Blennerhassett 	struct hpi_response_header hr;
1669108ccb3fSEliot Blennerhassett 
167058fbf77fSEliot Blennerhassett 	hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr, sizeof(hr),
167158fbf77fSEliot Blennerhassett 		HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE);
167258fbf77fSEliot Blennerhassett 
167358fbf77fSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.h.adapter_index,
167458fbf77fSEliot Blennerhassett 			&hm.h.obj_index))
1675ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1676719f82d3SEliot Blennerhassett 
167758fbf77fSEliot Blennerhassett 	if (byte_count > sizeof(hm.bytes))
167858fbf77fSEliot Blennerhassett 		return HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL;
1679719f82d3SEliot Blennerhassett 
168058fbf77fSEliot Blennerhassett 	hm.p.attribute = HPI_COBRANET_SET;
168158fbf77fSEliot Blennerhassett 	hm.p.byte_count = byte_count;
168258fbf77fSEliot Blennerhassett 	hm.p.hmi_address = hmi_address;
168358fbf77fSEliot Blennerhassett 	memcpy(hm.bytes, pb_data, byte_count);
168458fbf77fSEliot Blennerhassett 	hm.h.size = (u16)(sizeof(hm.h) + sizeof(hm.p) + byte_count);
1685719f82d3SEliot Blennerhassett 
168658fbf77fSEliot Blennerhassett 	hpi_send_recvV1(&hm.h, &hr);
1687719f82d3SEliot Blennerhassett 	return hr.error;
1688719f82d3SEliot Blennerhassett }
1689719f82d3SEliot Blennerhassett 
hpi_cobranet_hmi_read(u32 h_control,u32 hmi_address,u32 max_byte_count,u32 * pbyte_count,u8 * pb_data)1690ba94455cSEliot Blennerhassett u16 hpi_cobranet_hmi_read(u32 h_control, u32 hmi_address, u32 max_byte_count,
1691ba94455cSEliot Blennerhassett 	u32 *pbyte_count, u8 *pb_data)
1692719f82d3SEliot Blennerhassett {
169358fbf77fSEliot Blennerhassett 	struct hpi_msg_cobranet_hmiread hm;
169458fbf77fSEliot Blennerhassett 	struct hpi_res_cobranet_hmiread hr;
1695108ccb3fSEliot Blennerhassett 
169658fbf77fSEliot Blennerhassett 	hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr.h, sizeof(hr),
169758fbf77fSEliot Blennerhassett 		HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE);
169858fbf77fSEliot Blennerhassett 
169958fbf77fSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.h.adapter_index,
170058fbf77fSEliot Blennerhassett 			&hm.h.obj_index))
1701ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1702719f82d3SEliot Blennerhassett 
170358fbf77fSEliot Blennerhassett 	if (max_byte_count > sizeof(hr.bytes))
170458fbf77fSEliot Blennerhassett 		return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
1705719f82d3SEliot Blennerhassett 
170658fbf77fSEliot Blennerhassett 	hm.p.attribute = HPI_COBRANET_GET;
170758fbf77fSEliot Blennerhassett 	hm.p.byte_count = max_byte_count;
170858fbf77fSEliot Blennerhassett 	hm.p.hmi_address = hmi_address;
1709719f82d3SEliot Blennerhassett 
171058fbf77fSEliot Blennerhassett 	hpi_send_recvV1(&hm.h, &hr.h);
1711719f82d3SEliot Blennerhassett 
171258fbf77fSEliot Blennerhassett 	if (!hr.h.error && pb_data) {
171358fbf77fSEliot Blennerhassett 		if (hr.byte_count > sizeof(hr.bytes))
1714719f82d3SEliot Blennerhassett 
171558fbf77fSEliot Blennerhassett 			return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
171658fbf77fSEliot Blennerhassett 
171758fbf77fSEliot Blennerhassett 		*pbyte_count = hr.byte_count;
171858fbf77fSEliot Blennerhassett 
171958fbf77fSEliot Blennerhassett 		if (hr.byte_count < max_byte_count)
1720719f82d3SEliot Blennerhassett 			max_byte_count = *pbyte_count;
1721719f82d3SEliot Blennerhassett 
172258fbf77fSEliot Blennerhassett 		memcpy(pb_data, hr.bytes, max_byte_count);
1723719f82d3SEliot Blennerhassett 	}
172458fbf77fSEliot Blennerhassett 	return hr.h.error;
1725719f82d3SEliot Blennerhassett }
1726719f82d3SEliot Blennerhassett 
hpi_cobranet_hmi_get_status(u32 h_control,u32 * pstatus,u32 * preadable_size,u32 * pwriteable_size)1727ba94455cSEliot Blennerhassett u16 hpi_cobranet_hmi_get_status(u32 h_control, u32 *pstatus,
1728ba94455cSEliot Blennerhassett 	u32 *preadable_size, u32 *pwriteable_size)
1729719f82d3SEliot Blennerhassett {
1730719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1731719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1732108ccb3fSEliot Blennerhassett 
173358fbf77fSEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1734719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1735ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1736ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1737719f82d3SEliot Blennerhassett 
173858fbf77fSEliot Blennerhassett 	hm.u.c.attribute = HPI_COBRANET_GET_STATUS;
1739719f82d3SEliot Blennerhassett 
1740719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1741719f82d3SEliot Blennerhassett 	if (!hr.error) {
1742719f82d3SEliot Blennerhassett 		if (pstatus)
174358fbf77fSEliot Blennerhassett 			*pstatus = hr.u.cu.cobranet.status.status;
1744719f82d3SEliot Blennerhassett 		if (preadable_size)
1745719f82d3SEliot Blennerhassett 			*preadable_size =
174658fbf77fSEliot Blennerhassett 				hr.u.cu.cobranet.status.readable_size;
1747719f82d3SEliot Blennerhassett 		if (pwriteable_size)
1748719f82d3SEliot Blennerhassett 			*pwriteable_size =
174958fbf77fSEliot Blennerhassett 				hr.u.cu.cobranet.status.writeable_size;
1750719f82d3SEliot Blennerhassett 	}
1751719f82d3SEliot Blennerhassett 	return hr.error;
1752719f82d3SEliot Blennerhassett }
1753719f82d3SEliot Blennerhassett 
hpi_cobranet_get_ip_address(u32 h_control,u32 * pdw_ip_address)1754ba94455cSEliot Blennerhassett u16 hpi_cobranet_get_ip_address(u32 h_control, u32 *pdw_ip_address)
1755719f82d3SEliot Blennerhassett {
1756719f82d3SEliot Blennerhassett 	u32 byte_count;
1757719f82d3SEliot Blennerhassett 	u32 iP;
1758827492acSEliot Blennerhassett 	u16 err;
1759108ccb3fSEliot Blennerhassett 
1760827492acSEliot Blennerhassett 	err = hpi_cobranet_hmi_read(h_control,
1761719f82d3SEliot Blennerhassett 		HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count,
1762719f82d3SEliot Blennerhassett 		(u8 *)&iP);
1763719f82d3SEliot Blennerhassett 
1764ba94455cSEliot Blennerhassett 	*pdw_ip_address =
1765719f82d3SEliot Blennerhassett 		((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1766719f82d3SEliot Blennerhassett 			0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1767719f82d3SEliot Blennerhassett 
1768827492acSEliot Blennerhassett 	if (err)
1769ba94455cSEliot Blennerhassett 		*pdw_ip_address = 0;
1770719f82d3SEliot Blennerhassett 
1771827492acSEliot Blennerhassett 	return err;
1772719f82d3SEliot Blennerhassett 
1773719f82d3SEliot Blennerhassett }
1774719f82d3SEliot Blennerhassett 
hpi_cobranet_set_ip_address(u32 h_control,u32 dw_ip_address)1775ba94455cSEliot Blennerhassett u16 hpi_cobranet_set_ip_address(u32 h_control, u32 dw_ip_address)
1776719f82d3SEliot Blennerhassett {
1777719f82d3SEliot Blennerhassett 	u32 iP;
1778827492acSEliot Blennerhassett 	u16 err;
1779719f82d3SEliot Blennerhassett 
1780ba94455cSEliot Blennerhassett 	iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1781ba94455cSEliot Blennerhassett 			0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1782ba94455cSEliot Blennerhassett 		8) | ((dw_ip_address & 0x000000ff) << 8);
1783719f82d3SEliot Blennerhassett 
1784827492acSEliot Blennerhassett 	err = hpi_cobranet_hmi_write(h_control,
1785719f82d3SEliot Blennerhassett 		HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP);
1786719f82d3SEliot Blennerhassett 
1787827492acSEliot Blennerhassett 	return err;
1788719f82d3SEliot Blennerhassett 
1789719f82d3SEliot Blennerhassett }
1790719f82d3SEliot Blennerhassett 
hpi_cobranet_get_static_ip_address(u32 h_control,u32 * pdw_ip_address)1791ba94455cSEliot Blennerhassett u16 hpi_cobranet_get_static_ip_address(u32 h_control, u32 *pdw_ip_address)
1792719f82d3SEliot Blennerhassett {
1793719f82d3SEliot Blennerhassett 	u32 byte_count;
1794719f82d3SEliot Blennerhassett 	u32 iP;
1795827492acSEliot Blennerhassett 	u16 err;
1796827492acSEliot Blennerhassett 	err = hpi_cobranet_hmi_read(h_control,
1797719f82d3SEliot Blennerhassett 		HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count,
1798719f82d3SEliot Blennerhassett 		(u8 *)&iP);
1799719f82d3SEliot Blennerhassett 
1800ba94455cSEliot Blennerhassett 	*pdw_ip_address =
1801719f82d3SEliot Blennerhassett 		((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1802719f82d3SEliot Blennerhassett 			0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1803719f82d3SEliot Blennerhassett 
1804827492acSEliot Blennerhassett 	if (err)
1805ba94455cSEliot Blennerhassett 		*pdw_ip_address = 0;
1806719f82d3SEliot Blennerhassett 
1807827492acSEliot Blennerhassett 	return err;
1808719f82d3SEliot Blennerhassett 
1809719f82d3SEliot Blennerhassett }
1810719f82d3SEliot Blennerhassett 
hpi_cobranet_set_static_ip_address(u32 h_control,u32 dw_ip_address)1811ba94455cSEliot Blennerhassett u16 hpi_cobranet_set_static_ip_address(u32 h_control, u32 dw_ip_address)
1812719f82d3SEliot Blennerhassett {
1813719f82d3SEliot Blennerhassett 	u32 iP;
1814827492acSEliot Blennerhassett 	u16 err;
1815719f82d3SEliot Blennerhassett 
1816ba94455cSEliot Blennerhassett 	iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1817ba94455cSEliot Blennerhassett 			0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1818ba94455cSEliot Blennerhassett 		8) | ((dw_ip_address & 0x000000ff) << 8);
1819719f82d3SEliot Blennerhassett 
1820827492acSEliot Blennerhassett 	err = hpi_cobranet_hmi_write(h_control,
1821719f82d3SEliot Blennerhassett 		HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP);
1822719f82d3SEliot Blennerhassett 
1823827492acSEliot Blennerhassett 	return err;
1824719f82d3SEliot Blennerhassett 
1825719f82d3SEliot Blennerhassett }
1826719f82d3SEliot Blennerhassett 
hpi_cobranet_get_macaddress(u32 h_control,u32 * p_mac_msbs,u32 * p_mac_lsbs)1827827492acSEliot Blennerhassett u16 hpi_cobranet_get_macaddress(u32 h_control, u32 *p_mac_msbs,
1828827492acSEliot Blennerhassett 	u32 *p_mac_lsbs)
1829719f82d3SEliot Blennerhassett {
1830719f82d3SEliot Blennerhassett 	u32 byte_count;
1831827492acSEliot Blennerhassett 	u16 err;
1832827492acSEliot Blennerhassett 	u32 mac;
1833108ccb3fSEliot Blennerhassett 
1834827492acSEliot Blennerhassett 	err = hpi_cobranet_hmi_read(h_control,
1835719f82d3SEliot Blennerhassett 		HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count,
1836827492acSEliot Blennerhassett 		(u8 *)&mac);
1837719f82d3SEliot Blennerhassett 
1838827492acSEliot Blennerhassett 	if (!err) {
1839827492acSEliot Blennerhassett 		*p_mac_msbs =
1840827492acSEliot Blennerhassett 			((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1841827492acSEliot Blennerhassett 			| ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1842827492acSEliot Blennerhassett 			8);
1843827492acSEliot Blennerhassett 
1844827492acSEliot Blennerhassett 		err = hpi_cobranet_hmi_read(h_control,
1845827492acSEliot Blennerhassett 			HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4,
1846827492acSEliot Blennerhassett 			&byte_count, (u8 *)&mac);
1847719f82d3SEliot Blennerhassett 	}
1848719f82d3SEliot Blennerhassett 
1849827492acSEliot Blennerhassett 	if (!err) {
1850827492acSEliot Blennerhassett 		*p_mac_lsbs =
1851827492acSEliot Blennerhassett 			((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1852827492acSEliot Blennerhassett 			| ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1853827492acSEliot Blennerhassett 			8);
1854827492acSEliot Blennerhassett 	} else {
1855827492acSEliot Blennerhassett 		*p_mac_msbs = 0;
1856827492acSEliot Blennerhassett 		*p_mac_lsbs = 0;
1857827492acSEliot Blennerhassett 	}
1858827492acSEliot Blennerhassett 
1859827492acSEliot Blennerhassett 	return err;
1860719f82d3SEliot Blennerhassett }
1861719f82d3SEliot Blennerhassett 
hpi_compander_set_enable(u32 h_control,u32 enable)1862ba94455cSEliot Blennerhassett u16 hpi_compander_set_enable(u32 h_control, u32 enable)
1863108ccb3fSEliot Blennerhassett {
1864ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
1865ba94455cSEliot Blennerhassett 		0);
1866108ccb3fSEliot Blennerhassett }
1867108ccb3fSEliot Blennerhassett 
hpi_compander_get_enable(u32 h_control,u32 * enable)1868ba94455cSEliot Blennerhassett u16 hpi_compander_get_enable(u32 h_control, u32 *enable)
1869108ccb3fSEliot Blennerhassett {
1870ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
1871108ccb3fSEliot Blennerhassett }
1872108ccb3fSEliot Blennerhassett 
hpi_compander_set_makeup_gain(u32 h_control,short makeup_gain0_01dB)1873ba94455cSEliot Blennerhassett u16 hpi_compander_set_makeup_gain(u32 h_control, short makeup_gain0_01dB)
1874108ccb3fSEliot Blennerhassett {
1875108ccb3fSEliot Blennerhassett 	return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1876108ccb3fSEliot Blennerhassett 		makeup_gain0_01dB, 0);
1877108ccb3fSEliot Blennerhassett }
1878108ccb3fSEliot Blennerhassett 
hpi_compander_get_makeup_gain(u32 h_control,short * makeup_gain0_01dB)1879ba94455cSEliot Blennerhassett u16 hpi_compander_get_makeup_gain(u32 h_control, short *makeup_gain0_01dB)
1880108ccb3fSEliot Blennerhassett {
1881ba94455cSEliot Blennerhassett 	return hpi_control_log_get2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1882ba94455cSEliot Blennerhassett 		makeup_gain0_01dB, NULL);
1883108ccb3fSEliot Blennerhassett }
1884108ccb3fSEliot Blennerhassett 
hpi_compander_set_attack_time_constant(u32 h_control,unsigned int index,u32 attack)1885ba94455cSEliot Blennerhassett u16 hpi_compander_set_attack_time_constant(u32 h_control, unsigned int index,
1886ba94455cSEliot Blennerhassett 	u32 attack)
1887108ccb3fSEliot Blennerhassett {
1888ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_COMPANDER_ATTACK, attack,
1889ba94455cSEliot Blennerhassett 		index);
1890108ccb3fSEliot Blennerhassett }
1891108ccb3fSEliot Blennerhassett 
hpi_compander_get_attack_time_constant(u32 h_control,unsigned int index,u32 * attack)1892ba94455cSEliot Blennerhassett u16 hpi_compander_get_attack_time_constant(u32 h_control, unsigned int index,
1893ba94455cSEliot Blennerhassett 	u32 *attack)
1894108ccb3fSEliot Blennerhassett {
1895ba94455cSEliot Blennerhassett 	return hpi_control_param_get(h_control, HPI_COMPANDER_ATTACK, 0,
1896ba94455cSEliot Blennerhassett 		index, attack, NULL);
1897108ccb3fSEliot Blennerhassett }
1898108ccb3fSEliot Blennerhassett 
hpi_compander_set_decay_time_constant(u32 h_control,unsigned int index,u32 decay)1899ba94455cSEliot Blennerhassett u16 hpi_compander_set_decay_time_constant(u32 h_control, unsigned int index,
1900ba94455cSEliot Blennerhassett 	u32 decay)
1901108ccb3fSEliot Blennerhassett {
1902ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_COMPANDER_DECAY, decay,
1903ba94455cSEliot Blennerhassett 		index);
1904108ccb3fSEliot Blennerhassett }
1905108ccb3fSEliot Blennerhassett 
hpi_compander_get_decay_time_constant(u32 h_control,unsigned int index,u32 * decay)1906ba94455cSEliot Blennerhassett u16 hpi_compander_get_decay_time_constant(u32 h_control, unsigned int index,
1907ba94455cSEliot Blennerhassett 	u32 *decay)
1908108ccb3fSEliot Blennerhassett {
1909ba94455cSEliot Blennerhassett 	return hpi_control_param_get(h_control, HPI_COMPANDER_DECAY, 0, index,
1910ba94455cSEliot Blennerhassett 		decay, NULL);
1911108ccb3fSEliot Blennerhassett 
1912108ccb3fSEliot Blennerhassett }
1913108ccb3fSEliot Blennerhassett 
hpi_compander_set_threshold(u32 h_control,unsigned int index,short threshold0_01dB)1914ba94455cSEliot Blennerhassett u16 hpi_compander_set_threshold(u32 h_control, unsigned int index,
1915ba94455cSEliot Blennerhassett 	short threshold0_01dB)
1916719f82d3SEliot Blennerhassett {
1917719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1918719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1919108ccb3fSEliot Blennerhassett 
1920719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1921719f82d3SEliot Blennerhassett 		HPI_CONTROL_SET_STATE);
1922ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1923ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1924108ccb3fSEliot Blennerhassett 	hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1925108ccb3fSEliot Blennerhassett 	hm.u.c.param2 = index;
1926719f82d3SEliot Blennerhassett 	hm.u.c.an_log_value[0] = threshold0_01dB;
1927719f82d3SEliot Blennerhassett 
1928719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1929719f82d3SEliot Blennerhassett 
1930719f82d3SEliot Blennerhassett 	return hr.error;
1931719f82d3SEliot Blennerhassett }
1932719f82d3SEliot Blennerhassett 
hpi_compander_get_threshold(u32 h_control,unsigned int index,short * threshold0_01dB)1933ba94455cSEliot Blennerhassett u16 hpi_compander_get_threshold(u32 h_control, unsigned int index,
1934ba94455cSEliot Blennerhassett 	short *threshold0_01dB)
1935719f82d3SEliot Blennerhassett {
1936719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1937719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1938108ccb3fSEliot Blennerhassett 
1939719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1940719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1941ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1942ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1943108ccb3fSEliot Blennerhassett 	hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1944108ccb3fSEliot Blennerhassett 	hm.u.c.param2 = index;
1945719f82d3SEliot Blennerhassett 
1946719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1947108ccb3fSEliot Blennerhassett 	*threshold0_01dB = hr.u.c.an_log_value[0];
1948719f82d3SEliot Blennerhassett 
1949719f82d3SEliot Blennerhassett 	return hr.error;
1950719f82d3SEliot Blennerhassett }
1951719f82d3SEliot Blennerhassett 
hpi_compander_set_ratio(u32 h_control,u32 index,u32 ratio100)1952ba94455cSEliot Blennerhassett u16 hpi_compander_set_ratio(u32 h_control, u32 index, u32 ratio100)
1953108ccb3fSEliot Blennerhassett {
1954ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_COMPANDER_RATIO, ratio100,
1955ba94455cSEliot Blennerhassett 		index);
1956108ccb3fSEliot Blennerhassett }
1957108ccb3fSEliot Blennerhassett 
hpi_compander_get_ratio(u32 h_control,u32 index,u32 * ratio100)1958ba94455cSEliot Blennerhassett u16 hpi_compander_get_ratio(u32 h_control, u32 index, u32 *ratio100)
1959108ccb3fSEliot Blennerhassett {
1960ba94455cSEliot Blennerhassett 	return hpi_control_param_get(h_control, HPI_COMPANDER_RATIO, 0, index,
1961ba94455cSEliot Blennerhassett 		ratio100, NULL);
1962108ccb3fSEliot Blennerhassett }
1963108ccb3fSEliot Blennerhassett 
hpi_level_query_range(u32 h_control,short * min_gain_01dB,short * max_gain_01dB,short * step_gain_01dB)1964ba94455cSEliot Blennerhassett u16 hpi_level_query_range(u32 h_control, short *min_gain_01dB,
1965ba94455cSEliot Blennerhassett 	short *max_gain_01dB, short *step_gain_01dB)
1966719f82d3SEliot Blennerhassett {
1967719f82d3SEliot Blennerhassett 	struct hpi_message hm;
1968719f82d3SEliot Blennerhassett 	struct hpi_response hr;
1969108ccb3fSEliot Blennerhassett 
1970719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1971719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
1972ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1973ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
1974719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_LEVEL_RANGE;
1975719f82d3SEliot Blennerhassett 
1976719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
1977719f82d3SEliot Blennerhassett 	if (hr.error) {
1978719f82d3SEliot Blennerhassett 		hr.u.c.an_log_value[0] = 0;
1979719f82d3SEliot Blennerhassett 		hr.u.c.an_log_value[1] = 0;
1980719f82d3SEliot Blennerhassett 		hr.u.c.param1 = 0;
1981719f82d3SEliot Blennerhassett 	}
1982719f82d3SEliot Blennerhassett 	if (min_gain_01dB)
1983719f82d3SEliot Blennerhassett 		*min_gain_01dB = hr.u.c.an_log_value[0];
1984719f82d3SEliot Blennerhassett 	if (max_gain_01dB)
1985719f82d3SEliot Blennerhassett 		*max_gain_01dB = hr.u.c.an_log_value[1];
1986719f82d3SEliot Blennerhassett 	if (step_gain_01dB)
1987719f82d3SEliot Blennerhassett 		*step_gain_01dB = (short)hr.u.c.param1;
1988719f82d3SEliot Blennerhassett 	return hr.error;
1989719f82d3SEliot Blennerhassett }
1990719f82d3SEliot Blennerhassett 
hpi_level_set_gain(u32 h_control,short an_gain0_01dB[HPI_MAX_CHANNELS])1991ba94455cSEliot Blennerhassett u16 hpi_level_set_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
1992719f82d3SEliot Blennerhassett 	)
1993719f82d3SEliot Blennerhassett {
1994108ccb3fSEliot Blennerhassett 	return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN,
1995108ccb3fSEliot Blennerhassett 		an_gain0_01dB[0], an_gain0_01dB[1]);
1996719f82d3SEliot Blennerhassett }
1997719f82d3SEliot Blennerhassett 
hpi_level_get_gain(u32 h_control,short an_gain0_01dB[HPI_MAX_CHANNELS])1998ba94455cSEliot Blennerhassett u16 hpi_level_get_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
1999719f82d3SEliot Blennerhassett 	)
2000719f82d3SEliot Blennerhassett {
2001ba94455cSEliot Blennerhassett 	return hpi_control_log_get2(h_control, HPI_LEVEL_GAIN,
2002108ccb3fSEliot Blennerhassett 		&an_gain0_01dB[0], &an_gain0_01dB[1]);
2003719f82d3SEliot Blennerhassett }
2004719f82d3SEliot Blennerhassett 
hpi_meter_query_channels(const u32 h_meter,u32 * p_channels)2005ba94455cSEliot Blennerhassett u16 hpi_meter_query_channels(const u32 h_meter, u32 *p_channels)
2006719f82d3SEliot Blennerhassett {
2007ba94455cSEliot Blennerhassett 	return hpi_control_query(h_meter, HPI_METER_NUM_CHANNELS, 0, 0,
2008ba94455cSEliot Blennerhassett 		p_channels);
2009719f82d3SEliot Blennerhassett }
2010719f82d3SEliot Blennerhassett 
hpi_meter_get_peak(u32 h_control,short an_peakdB[HPI_MAX_CHANNELS])2011ba94455cSEliot Blennerhassett u16 hpi_meter_get_peak(u32 h_control, short an_peakdB[HPI_MAX_CHANNELS]
2012719f82d3SEliot Blennerhassett 	)
2013719f82d3SEliot Blennerhassett {
2014719f82d3SEliot Blennerhassett 	short i = 0;
2015719f82d3SEliot Blennerhassett 
2016719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2017719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2018719f82d3SEliot Blennerhassett 
2019719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2020719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2021ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2022ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2023719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_METER_PEAK;
2024719f82d3SEliot Blennerhassett 
2025719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2026719f82d3SEliot Blennerhassett 
2027719f82d3SEliot Blennerhassett 	if (!hr.error)
2028719f82d3SEliot Blennerhassett 		memcpy(an_peakdB, hr.u.c.an_log_value,
2029719f82d3SEliot Blennerhassett 			sizeof(short) * HPI_MAX_CHANNELS);
2030719f82d3SEliot Blennerhassett 	else
2031719f82d3SEliot Blennerhassett 		for (i = 0; i < HPI_MAX_CHANNELS; i++)
2032719f82d3SEliot Blennerhassett 			an_peakdB[i] = HPI_METER_MINIMUM;
2033719f82d3SEliot Blennerhassett 	return hr.error;
2034719f82d3SEliot Blennerhassett }
2035719f82d3SEliot Blennerhassett 
hpi_meter_get_rms(u32 h_control,short an_rmsdB[HPI_MAX_CHANNELS])2036ba94455cSEliot Blennerhassett u16 hpi_meter_get_rms(u32 h_control, short an_rmsdB[HPI_MAX_CHANNELS]
2037719f82d3SEliot Blennerhassett 	)
2038719f82d3SEliot Blennerhassett {
2039719f82d3SEliot Blennerhassett 	short i = 0;
2040719f82d3SEliot Blennerhassett 
2041719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2042719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2043719f82d3SEliot Blennerhassett 
2044719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2045719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2046ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2047ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2048719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_METER_RMS;
2049719f82d3SEliot Blennerhassett 
2050719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2051719f82d3SEliot Blennerhassett 
2052719f82d3SEliot Blennerhassett 	if (!hr.error)
2053719f82d3SEliot Blennerhassett 		memcpy(an_rmsdB, hr.u.c.an_log_value,
2054719f82d3SEliot Blennerhassett 			sizeof(short) * HPI_MAX_CHANNELS);
2055719f82d3SEliot Blennerhassett 	else
2056719f82d3SEliot Blennerhassett 		for (i = 0; i < HPI_MAX_CHANNELS; i++)
2057719f82d3SEliot Blennerhassett 			an_rmsdB[i] = HPI_METER_MINIMUM;
2058719f82d3SEliot Blennerhassett 
2059719f82d3SEliot Blennerhassett 	return hr.error;
2060719f82d3SEliot Blennerhassett }
2061719f82d3SEliot Blennerhassett 
hpi_meter_set_rms_ballistics(u32 h_control,u16 attack,u16 decay)2062ba94455cSEliot Blennerhassett u16 hpi_meter_set_rms_ballistics(u32 h_control, u16 attack, u16 decay)
2063719f82d3SEliot Blennerhassett {
2064ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_METER_RMS_BALLISTICS,
2065ba94455cSEliot Blennerhassett 		attack, decay);
2066719f82d3SEliot Blennerhassett }
2067719f82d3SEliot Blennerhassett 
hpi_meter_get_rms_ballistics(u32 h_control,u16 * pn_attack,u16 * pn_decay)2068ba94455cSEliot Blennerhassett u16 hpi_meter_get_rms_ballistics(u32 h_control, u16 *pn_attack, u16 *pn_decay)
2069719f82d3SEliot Blennerhassett {
2070719f82d3SEliot Blennerhassett 	u32 attack;
2071719f82d3SEliot Blennerhassett 	u32 decay;
2072719f82d3SEliot Blennerhassett 	u16 error;
2073719f82d3SEliot Blennerhassett 
2074ba94455cSEliot Blennerhassett 	error = hpi_control_param2_get(h_control, HPI_METER_RMS_BALLISTICS,
2075ba94455cSEliot Blennerhassett 		&attack, &decay);
2076719f82d3SEliot Blennerhassett 
2077719f82d3SEliot Blennerhassett 	if (pn_attack)
2078719f82d3SEliot Blennerhassett 		*pn_attack = (unsigned short)attack;
2079719f82d3SEliot Blennerhassett 	if (pn_decay)
2080719f82d3SEliot Blennerhassett 		*pn_decay = (unsigned short)decay;
2081719f82d3SEliot Blennerhassett 
2082719f82d3SEliot Blennerhassett 	return error;
2083719f82d3SEliot Blennerhassett }
2084719f82d3SEliot Blennerhassett 
hpi_meter_set_peak_ballistics(u32 h_control,u16 attack,u16 decay)2085ba94455cSEliot Blennerhassett u16 hpi_meter_set_peak_ballistics(u32 h_control, u16 attack, u16 decay)
2086719f82d3SEliot Blennerhassett {
2087ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_METER_PEAK_BALLISTICS,
2088ba94455cSEliot Blennerhassett 		attack, decay);
2089719f82d3SEliot Blennerhassett }
2090719f82d3SEliot Blennerhassett 
hpi_meter_get_peak_ballistics(u32 h_control,u16 * pn_attack,u16 * pn_decay)2091ba94455cSEliot Blennerhassett u16 hpi_meter_get_peak_ballistics(u32 h_control, u16 *pn_attack,
2092ba94455cSEliot Blennerhassett 	u16 *pn_decay)
2093719f82d3SEliot Blennerhassett {
2094719f82d3SEliot Blennerhassett 	u32 attack;
2095719f82d3SEliot Blennerhassett 	u32 decay;
2096719f82d3SEliot Blennerhassett 	u16 error;
2097719f82d3SEliot Blennerhassett 
2098ba94455cSEliot Blennerhassett 	error = hpi_control_param2_get(h_control, HPI_METER_PEAK_BALLISTICS,
2099ba94455cSEliot Blennerhassett 		&attack, &decay);
2100719f82d3SEliot Blennerhassett 
2101719f82d3SEliot Blennerhassett 	if (pn_attack)
2102719f82d3SEliot Blennerhassett 		*pn_attack = (short)attack;
2103719f82d3SEliot Blennerhassett 	if (pn_decay)
2104719f82d3SEliot Blennerhassett 		*pn_decay = (short)decay;
2105719f82d3SEliot Blennerhassett 
2106719f82d3SEliot Blennerhassett 	return error;
2107719f82d3SEliot Blennerhassett }
2108719f82d3SEliot Blennerhassett 
hpi_microphone_set_phantom_power(u32 h_control,u16 on_off)2109ba94455cSEliot Blennerhassett u16 hpi_microphone_set_phantom_power(u32 h_control, u16 on_off)
2110719f82d3SEliot Blennerhassett {
2111ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_MICROPHONE_PHANTOM_POWER,
2112ba94455cSEliot Blennerhassett 		(u32)on_off, 0);
2113719f82d3SEliot Blennerhassett }
2114719f82d3SEliot Blennerhassett 
hpi_microphone_get_phantom_power(u32 h_control,u16 * pw_on_off)2115ba94455cSEliot Blennerhassett u16 hpi_microphone_get_phantom_power(u32 h_control, u16 *pw_on_off)
2116719f82d3SEliot Blennerhassett {
2117719f82d3SEliot Blennerhassett 	u16 error = 0;
2118719f82d3SEliot Blennerhassett 	u32 on_off = 0;
2119ba94455cSEliot Blennerhassett 	error = hpi_control_param1_get(h_control,
2120719f82d3SEliot Blennerhassett 		HPI_MICROPHONE_PHANTOM_POWER, &on_off);
2121719f82d3SEliot Blennerhassett 	if (pw_on_off)
2122719f82d3SEliot Blennerhassett 		*pw_on_off = (u16)on_off;
2123719f82d3SEliot Blennerhassett 	return error;
2124719f82d3SEliot Blennerhassett }
2125719f82d3SEliot Blennerhassett 
hpi_multiplexer_set_source(u32 h_control,u16 source_node_type,u16 source_node_index)2126ba94455cSEliot Blennerhassett u16 hpi_multiplexer_set_source(u32 h_control, u16 source_node_type,
2127ba94455cSEliot Blennerhassett 	u16 source_node_index)
2128719f82d3SEliot Blennerhassett {
2129ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_MULTIPLEXER_SOURCE,
2130ba94455cSEliot Blennerhassett 		source_node_type, source_node_index);
2131719f82d3SEliot Blennerhassett }
2132719f82d3SEliot Blennerhassett 
hpi_multiplexer_get_source(u32 h_control,u16 * source_node_type,u16 * source_node_index)2133ba94455cSEliot Blennerhassett u16 hpi_multiplexer_get_source(u32 h_control, u16 *source_node_type,
2134ba94455cSEliot Blennerhassett 	u16 *source_node_index)
2135719f82d3SEliot Blennerhassett {
2136719f82d3SEliot Blennerhassett 	u32 node, index;
2137827492acSEliot Blennerhassett 	u16 err = hpi_control_param2_get(h_control,
2138719f82d3SEliot Blennerhassett 		HPI_MULTIPLEXER_SOURCE, &node,
2139719f82d3SEliot Blennerhassett 		&index);
2140719f82d3SEliot Blennerhassett 	if (source_node_type)
2141719f82d3SEliot Blennerhassett 		*source_node_type = (u16)node;
2142719f82d3SEliot Blennerhassett 	if (source_node_index)
2143719f82d3SEliot Blennerhassett 		*source_node_index = (u16)index;
2144827492acSEliot Blennerhassett 	return err;
2145719f82d3SEliot Blennerhassett }
2146719f82d3SEliot Blennerhassett 
hpi_multiplexer_query_source(u32 h_control,u16 index,u16 * source_node_type,u16 * source_node_index)2147ba94455cSEliot Blennerhassett u16 hpi_multiplexer_query_source(u32 h_control, u16 index,
2148ba94455cSEliot Blennerhassett 	u16 *source_node_type, u16 *source_node_index)
2149719f82d3SEliot Blennerhassett {
2150719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2151719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2152719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2153719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2154ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2155ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2156719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE;
2157719f82d3SEliot Blennerhassett 	hm.u.c.param1 = index;
2158719f82d3SEliot Blennerhassett 
2159719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2160719f82d3SEliot Blennerhassett 
2161719f82d3SEliot Blennerhassett 	if (source_node_type)
2162719f82d3SEliot Blennerhassett 		*source_node_type = (u16)hr.u.c.param1;
2163719f82d3SEliot Blennerhassett 	if (source_node_index)
2164719f82d3SEliot Blennerhassett 		*source_node_index = (u16)hr.u.c.param2;
2165719f82d3SEliot Blennerhassett 	return hr.error;
2166719f82d3SEliot Blennerhassett }
2167719f82d3SEliot Blennerhassett 
hpi_parametric_eq_get_info(u32 h_control,u16 * pw_number_of_bands,u16 * pw_on_off)2168ba94455cSEliot Blennerhassett u16 hpi_parametric_eq_get_info(u32 h_control, u16 *pw_number_of_bands,
2169ba94455cSEliot Blennerhassett 	u16 *pw_on_off)
2170719f82d3SEliot Blennerhassett {
2171719f82d3SEliot Blennerhassett 	u32 oB = 0;
2172719f82d3SEliot Blennerhassett 	u32 oO = 0;
2173719f82d3SEliot Blennerhassett 	u16 error = 0;
2174719f82d3SEliot Blennerhassett 
2175ba94455cSEliot Blennerhassett 	error = hpi_control_param2_get(h_control, HPI_EQUALIZER_NUM_FILTERS,
2176ba94455cSEliot Blennerhassett 		&oO, &oB);
2177719f82d3SEliot Blennerhassett 	if (pw_number_of_bands)
2178719f82d3SEliot Blennerhassett 		*pw_number_of_bands = (u16)oB;
2179719f82d3SEliot Blennerhassett 	if (pw_on_off)
2180719f82d3SEliot Blennerhassett 		*pw_on_off = (u16)oO;
2181719f82d3SEliot Blennerhassett 	return error;
2182719f82d3SEliot Blennerhassett }
2183719f82d3SEliot Blennerhassett 
hpi_parametric_eq_set_state(u32 h_control,u16 on_off)2184ba94455cSEliot Blennerhassett u16 hpi_parametric_eq_set_state(u32 h_control, u16 on_off)
2185719f82d3SEliot Blennerhassett {
2186ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_EQUALIZER_NUM_FILTERS,
2187ba94455cSEliot Blennerhassett 		on_off, 0);
2188719f82d3SEliot Blennerhassett }
2189719f82d3SEliot Blennerhassett 
hpi_parametric_eq_get_band(u32 h_control,u16 index,u16 * pn_type,u32 * pfrequency_hz,short * pnQ100,short * pn_gain0_01dB)2190ba94455cSEliot Blennerhassett u16 hpi_parametric_eq_get_band(u32 h_control, u16 index, u16 *pn_type,
2191ba94455cSEliot Blennerhassett 	u32 *pfrequency_hz, short *pnQ100, short *pn_gain0_01dB)
2192719f82d3SEliot Blennerhassett {
2193719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2194719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2195108ccb3fSEliot Blennerhassett 
2196719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2197719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2198ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2199ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2200719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2201719f82d3SEliot Blennerhassett 	hm.u.c.param2 = index;
2202719f82d3SEliot Blennerhassett 
2203719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2204719f82d3SEliot Blennerhassett 
2205719f82d3SEliot Blennerhassett 	if (pfrequency_hz)
2206719f82d3SEliot Blennerhassett 		*pfrequency_hz = hr.u.c.param1;
2207719f82d3SEliot Blennerhassett 	if (pn_type)
2208719f82d3SEliot Blennerhassett 		*pn_type = (u16)(hr.u.c.param2 >> 16);
2209719f82d3SEliot Blennerhassett 	if (pnQ100)
2210719f82d3SEliot Blennerhassett 		*pnQ100 = hr.u.c.an_log_value[1];
2211719f82d3SEliot Blennerhassett 	if (pn_gain0_01dB)
2212719f82d3SEliot Blennerhassett 		*pn_gain0_01dB = hr.u.c.an_log_value[0];
2213719f82d3SEliot Blennerhassett 
2214719f82d3SEliot Blennerhassett 	return hr.error;
2215719f82d3SEliot Blennerhassett }
2216719f82d3SEliot Blennerhassett 
hpi_parametric_eq_set_band(u32 h_control,u16 index,u16 type,u32 frequency_hz,short q100,short gain0_01dB)2217ba94455cSEliot Blennerhassett u16 hpi_parametric_eq_set_band(u32 h_control, u16 index, u16 type,
2218ba94455cSEliot Blennerhassett 	u32 frequency_hz, short q100, short gain0_01dB)
2219719f82d3SEliot Blennerhassett {
2220719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2221719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2222108ccb3fSEliot Blennerhassett 
2223719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2224719f82d3SEliot Blennerhassett 		HPI_CONTROL_SET_STATE);
2225ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2226ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2227719f82d3SEliot Blennerhassett 
2228719f82d3SEliot Blennerhassett 	hm.u.c.param1 = frequency_hz;
2229719f82d3SEliot Blennerhassett 	hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16);
2230719f82d3SEliot Blennerhassett 	hm.u.c.an_log_value[0] = gain0_01dB;
2231719f82d3SEliot Blennerhassett 	hm.u.c.an_log_value[1] = q100;
2232719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2233719f82d3SEliot Blennerhassett 
2234719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2235719f82d3SEliot Blennerhassett 
2236719f82d3SEliot Blennerhassett 	return hr.error;
2237719f82d3SEliot Blennerhassett }
2238719f82d3SEliot Blennerhassett 
hpi_parametric_eq_get_coeffs(u32 h_control,u16 index,short coeffs[5])2239ba94455cSEliot Blennerhassett u16 hpi_parametric_eq_get_coeffs(u32 h_control, u16 index, short coeffs[5]
2240719f82d3SEliot Blennerhassett 	)
2241719f82d3SEliot Blennerhassett {
2242719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2243719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2244108ccb3fSEliot Blennerhassett 
2245719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2246719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2247ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2248ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2249719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS;
2250719f82d3SEliot Blennerhassett 	hm.u.c.param2 = index;
2251719f82d3SEliot Blennerhassett 
2252719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2253719f82d3SEliot Blennerhassett 
2254719f82d3SEliot Blennerhassett 	coeffs[0] = (short)hr.u.c.an_log_value[0];
2255719f82d3SEliot Blennerhassett 	coeffs[1] = (short)hr.u.c.an_log_value[1];
2256719f82d3SEliot Blennerhassett 	coeffs[2] = (short)hr.u.c.param1;
2257719f82d3SEliot Blennerhassett 	coeffs[3] = (short)(hr.u.c.param1 >> 16);
2258719f82d3SEliot Blennerhassett 	coeffs[4] = (short)hr.u.c.param2;
2259719f82d3SEliot Blennerhassett 
2260719f82d3SEliot Blennerhassett 	return hr.error;
2261719f82d3SEliot Blennerhassett }
2262719f82d3SEliot Blennerhassett 
hpi_sample_clock_query_source(const u32 h_clock,const u32 index,u16 * pw_source)2263ba94455cSEliot Blennerhassett u16 hpi_sample_clock_query_source(const u32 h_clock, const u32 index,
2264ba94455cSEliot Blennerhassett 	u16 *pw_source)
2265719f82d3SEliot Blennerhassett {
2266719f82d3SEliot Blennerhassett 	u32 qr;
2267719f82d3SEliot Blennerhassett 	u16 err;
2268719f82d3SEliot Blennerhassett 
2269ba94455cSEliot Blennerhassett 	err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE, index, 0,
2270ba94455cSEliot Blennerhassett 		&qr);
2271719f82d3SEliot Blennerhassett 	*pw_source = (u16)qr;
2272719f82d3SEliot Blennerhassett 	return err;
2273719f82d3SEliot Blennerhassett }
2274719f82d3SEliot Blennerhassett 
hpi_sample_clock_set_source(u32 h_control,u16 source)2275ba94455cSEliot Blennerhassett u16 hpi_sample_clock_set_source(u32 h_control, u16 source)
2276719f82d3SEliot Blennerhassett {
2277ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE,
2278ba94455cSEliot Blennerhassett 		source, 0);
2279719f82d3SEliot Blennerhassett }
2280719f82d3SEliot Blennerhassett 
hpi_sample_clock_get_source(u32 h_control,u16 * pw_source)2281ba94455cSEliot Blennerhassett u16 hpi_sample_clock_get_source(u32 h_control, u16 *pw_source)
2282719f82d3SEliot Blennerhassett {
2283827492acSEliot Blennerhassett 	u16 err = 0;
2284719f82d3SEliot Blennerhassett 	u32 source = 0;
2285827492acSEliot Blennerhassett 	err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE,
2286ba94455cSEliot Blennerhassett 		&source);
2287827492acSEliot Blennerhassett 	if (!err)
2288719f82d3SEliot Blennerhassett 		if (pw_source)
2289719f82d3SEliot Blennerhassett 			*pw_source = (u16)source;
2290827492acSEliot Blennerhassett 	return err;
2291719f82d3SEliot Blennerhassett }
2292719f82d3SEliot Blennerhassett 
hpi_sample_clock_query_source_index(const u32 h_clock,const u32 index,const u32 source,u16 * pw_source_index)2293ba94455cSEliot Blennerhassett u16 hpi_sample_clock_query_source_index(const u32 h_clock, const u32 index,
2294ba94455cSEliot Blennerhassett 	const u32 source, u16 *pw_source_index)
2295719f82d3SEliot Blennerhassett {
2296719f82d3SEliot Blennerhassett 	u32 qr;
2297719f82d3SEliot Blennerhassett 	u16 err;
2298719f82d3SEliot Blennerhassett 
2299ba94455cSEliot Blennerhassett 	err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE_INDEX, index,
2300ba94455cSEliot Blennerhassett 		source, &qr);
2301719f82d3SEliot Blennerhassett 	*pw_source_index = (u16)qr;
2302719f82d3SEliot Blennerhassett 	return err;
2303719f82d3SEliot Blennerhassett }
2304719f82d3SEliot Blennerhassett 
hpi_sample_clock_set_source_index(u32 h_control,u16 source_index)2305ba94455cSEliot Blennerhassett u16 hpi_sample_clock_set_source_index(u32 h_control, u16 source_index)
2306719f82d3SEliot Blennerhassett {
2307ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2308ba94455cSEliot Blennerhassett 		source_index, 0);
2309719f82d3SEliot Blennerhassett }
2310719f82d3SEliot Blennerhassett 
hpi_sample_clock_get_source_index(u32 h_control,u16 * pw_source_index)2311ba94455cSEliot Blennerhassett u16 hpi_sample_clock_get_source_index(u32 h_control, u16 *pw_source_index)
2312719f82d3SEliot Blennerhassett {
2313827492acSEliot Blennerhassett 	u16 err = 0;
2314719f82d3SEliot Blennerhassett 	u32 source_index = 0;
2315827492acSEliot Blennerhassett 	err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2316827492acSEliot Blennerhassett 		&source_index);
2317827492acSEliot Blennerhassett 	if (!err)
2318719f82d3SEliot Blennerhassett 		if (pw_source_index)
2319719f82d3SEliot Blennerhassett 			*pw_source_index = (u16)source_index;
2320827492acSEliot Blennerhassett 	return err;
2321719f82d3SEliot Blennerhassett }
2322719f82d3SEliot Blennerhassett 
hpi_sample_clock_query_local_rate(const u32 h_clock,const u32 index,u32 * prate)2323ba94455cSEliot Blennerhassett u16 hpi_sample_clock_query_local_rate(const u32 h_clock, const u32 index,
2324ba94455cSEliot Blennerhassett 	u32 *prate)
2325719f82d3SEliot Blennerhassett {
232644cc4a01SMasahiro Yamada 	return hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE,
2327ba94455cSEliot Blennerhassett 				 index, 0, prate);
2328719f82d3SEliot Blennerhassett }
2329719f82d3SEliot Blennerhassett 
hpi_sample_clock_set_local_rate(u32 h_control,u32 sample_rate)2330ba94455cSEliot Blennerhassett u16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate)
2331719f82d3SEliot Blennerhassett {
2332ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control,
2333719f82d3SEliot Blennerhassett 		HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0);
2334719f82d3SEliot Blennerhassett }
2335719f82d3SEliot Blennerhassett 
hpi_sample_clock_get_local_rate(u32 h_control,u32 * psample_rate)2336ba94455cSEliot Blennerhassett u16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate)
2337719f82d3SEliot Blennerhassett {
2338827492acSEliot Blennerhassett 	u16 err = 0;
2339719f82d3SEliot Blennerhassett 	u32 sample_rate = 0;
2340827492acSEliot Blennerhassett 	err = hpi_control_param1_get(h_control,
2341719f82d3SEliot Blennerhassett 		HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate);
2342827492acSEliot Blennerhassett 	if (!err)
2343719f82d3SEliot Blennerhassett 		if (psample_rate)
2344719f82d3SEliot Blennerhassett 			*psample_rate = sample_rate;
2345827492acSEliot Blennerhassett 	return err;
2346719f82d3SEliot Blennerhassett }
2347719f82d3SEliot Blennerhassett 
hpi_sample_clock_get_sample_rate(u32 h_control,u32 * psample_rate)2348ba94455cSEliot Blennerhassett u16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate)
2349719f82d3SEliot Blennerhassett {
2350827492acSEliot Blennerhassett 	u16 err = 0;
2351719f82d3SEliot Blennerhassett 	u32 sample_rate = 0;
2352827492acSEliot Blennerhassett 	err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE,
2353ba94455cSEliot Blennerhassett 		&sample_rate);
2354827492acSEliot Blennerhassett 	if (!err)
2355719f82d3SEliot Blennerhassett 		if (psample_rate)
2356719f82d3SEliot Blennerhassett 			*psample_rate = sample_rate;
2357827492acSEliot Blennerhassett 	return err;
2358719f82d3SEliot Blennerhassett }
2359719f82d3SEliot Blennerhassett 
hpi_sample_clock_set_auto(u32 h_control,u32 enable)2360ba94455cSEliot Blennerhassett u16 hpi_sample_clock_set_auto(u32 h_control, u32 enable)
2361719f82d3SEliot Blennerhassett {
2362ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable,
2363ba94455cSEliot Blennerhassett 		0);
2364719f82d3SEliot Blennerhassett }
2365719f82d3SEliot Blennerhassett 
hpi_sample_clock_get_auto(u32 h_control,u32 * penable)2366ba94455cSEliot Blennerhassett u16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable)
2367719f82d3SEliot Blennerhassett {
2368ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO,
2369ba94455cSEliot Blennerhassett 		penable);
2370719f82d3SEliot Blennerhassett }
2371719f82d3SEliot Blennerhassett 
hpi_sample_clock_set_local_rate_lock(u32 h_control,u32 lock)2372ba94455cSEliot Blennerhassett u16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock)
2373719f82d3SEliot Blennerhassett {
2374ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2375ba94455cSEliot Blennerhassett 		lock, 0);
2376719f82d3SEliot Blennerhassett }
2377719f82d3SEliot Blennerhassett 
hpi_sample_clock_get_local_rate_lock(u32 h_control,u32 * plock)2378ba94455cSEliot Blennerhassett u16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock)
2379719f82d3SEliot Blennerhassett {
2380ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2381ba94455cSEliot Blennerhassett 		plock);
2382719f82d3SEliot Blennerhassett }
2383719f82d3SEliot Blennerhassett 
hpi_tone_detector_get_frequency(u32 h_control,u32 index,u32 * frequency)2384ba94455cSEliot Blennerhassett u16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency)
2385719f82d3SEliot Blennerhassett {
2386ba94455cSEliot Blennerhassett 	return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY,
2387ba94455cSEliot Blennerhassett 		index, 0, frequency, NULL);
2388719f82d3SEliot Blennerhassett }
2389719f82d3SEliot Blennerhassett 
hpi_tone_detector_get_state(u32 h_control,u32 * state)2390ba94455cSEliot Blennerhassett u16 hpi_tone_detector_get_state(u32 h_control, u32 *state)
2391719f82d3SEliot Blennerhassett {
2392ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE,
2393ba94455cSEliot Blennerhassett 		state);
2394719f82d3SEliot Blennerhassett }
2395719f82d3SEliot Blennerhassett 
hpi_tone_detector_set_enable(u32 h_control,u32 enable)2396ba94455cSEliot Blennerhassett u16 hpi_tone_detector_set_enable(u32 h_control, u32 enable)
2397719f82d3SEliot Blennerhassett {
2398ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2399ba94455cSEliot Blennerhassett 		0);
2400719f82d3SEliot Blennerhassett }
2401719f82d3SEliot Blennerhassett 
hpi_tone_detector_get_enable(u32 h_control,u32 * enable)2402ba94455cSEliot Blennerhassett u16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable)
2403719f82d3SEliot Blennerhassett {
2404ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2405719f82d3SEliot Blennerhassett }
2406719f82d3SEliot Blennerhassett 
hpi_tone_detector_set_event_enable(u32 h_control,u32 event_enable)2407ba94455cSEliot Blennerhassett u16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable)
2408719f82d3SEliot Blennerhassett {
2409ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2410ba94455cSEliot Blennerhassett 		(u32)event_enable, 0);
2411719f82d3SEliot Blennerhassett }
2412719f82d3SEliot Blennerhassett 
hpi_tone_detector_get_event_enable(u32 h_control,u32 * event_enable)2413ba94455cSEliot Blennerhassett u16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable)
2414719f82d3SEliot Blennerhassett {
2415ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2416ba94455cSEliot Blennerhassett 		event_enable);
2417719f82d3SEliot Blennerhassett }
2418719f82d3SEliot Blennerhassett 
hpi_tone_detector_set_threshold(u32 h_control,int threshold)2419ba94455cSEliot Blennerhassett u16 hpi_tone_detector_set_threshold(u32 h_control, int threshold)
2420719f82d3SEliot Blennerhassett {
2421ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD,
2422ba94455cSEliot Blennerhassett 		(u32)threshold, 0);
2423719f82d3SEliot Blennerhassett }
2424719f82d3SEliot Blennerhassett 
hpi_tone_detector_get_threshold(u32 h_control,int * threshold)2425ba94455cSEliot Blennerhassett u16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold)
2426719f82d3SEliot Blennerhassett {
2427ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD,
2428ba94455cSEliot Blennerhassett 		(u32 *)threshold);
2429719f82d3SEliot Blennerhassett }
2430719f82d3SEliot Blennerhassett 
hpi_silence_detector_get_state(u32 h_control,u32 * state)2431ba94455cSEliot Blennerhassett u16 hpi_silence_detector_get_state(u32 h_control, u32 *state)
2432719f82d3SEliot Blennerhassett {
2433ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE,
2434ba94455cSEliot Blennerhassett 		state);
2435719f82d3SEliot Blennerhassett }
2436719f82d3SEliot Blennerhassett 
hpi_silence_detector_set_enable(u32 h_control,u32 enable)2437ba94455cSEliot Blennerhassett u16 hpi_silence_detector_set_enable(u32 h_control, u32 enable)
2438719f82d3SEliot Blennerhassett {
2439ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2440ba94455cSEliot Blennerhassett 		0);
2441719f82d3SEliot Blennerhassett }
2442719f82d3SEliot Blennerhassett 
hpi_silence_detector_get_enable(u32 h_control,u32 * enable)2443ba94455cSEliot Blennerhassett u16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable)
2444719f82d3SEliot Blennerhassett {
2445ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2446719f82d3SEliot Blennerhassett }
2447719f82d3SEliot Blennerhassett 
hpi_silence_detector_set_event_enable(u32 h_control,u32 event_enable)2448ba94455cSEliot Blennerhassett u16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable)
2449719f82d3SEliot Blennerhassett {
2450ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2451ba94455cSEliot Blennerhassett 		event_enable, 0);
2452719f82d3SEliot Blennerhassett }
2453719f82d3SEliot Blennerhassett 
hpi_silence_detector_get_event_enable(u32 h_control,u32 * event_enable)2454ba94455cSEliot Blennerhassett u16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable)
2455719f82d3SEliot Blennerhassett {
2456ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2457ba94455cSEliot Blennerhassett 		event_enable);
2458719f82d3SEliot Blennerhassett }
2459719f82d3SEliot Blennerhassett 
hpi_silence_detector_set_delay(u32 h_control,u32 delay)2460ba94455cSEliot Blennerhassett u16 hpi_silence_detector_set_delay(u32 h_control, u32 delay)
2461719f82d3SEliot Blennerhassett {
2462ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY,
2463ba94455cSEliot Blennerhassett 		delay, 0);
2464719f82d3SEliot Blennerhassett }
2465719f82d3SEliot Blennerhassett 
hpi_silence_detector_get_delay(u32 h_control,u32 * delay)2466ba94455cSEliot Blennerhassett u16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay)
2467719f82d3SEliot Blennerhassett {
2468ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY,
2469ba94455cSEliot Blennerhassett 		delay);
2470719f82d3SEliot Blennerhassett }
2471719f82d3SEliot Blennerhassett 
hpi_silence_detector_set_threshold(u32 h_control,int threshold)2472ba94455cSEliot Blennerhassett u16 hpi_silence_detector_set_threshold(u32 h_control, int threshold)
2473719f82d3SEliot Blennerhassett {
2474ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD,
2475ba94455cSEliot Blennerhassett 		threshold, 0);
2476719f82d3SEliot Blennerhassett }
2477719f82d3SEliot Blennerhassett 
hpi_silence_detector_get_threshold(u32 h_control,int * threshold)2478ba94455cSEliot Blennerhassett u16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold)
2479719f82d3SEliot Blennerhassett {
2480ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control,
2481108ccb3fSEliot Blennerhassett 		HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold);
2482719f82d3SEliot Blennerhassett }
2483719f82d3SEliot Blennerhassett 
hpi_tuner_query_band(const u32 h_tuner,const u32 index,u16 * pw_band)2484ba94455cSEliot Blennerhassett u16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band)
2485719f82d3SEliot Blennerhassett {
2486719f82d3SEliot Blennerhassett 	u32 qr;
2487719f82d3SEliot Blennerhassett 	u16 err;
2488719f82d3SEliot Blennerhassett 
2489ba94455cSEliot Blennerhassett 	err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2490719f82d3SEliot Blennerhassett 	*pw_band = (u16)qr;
2491719f82d3SEliot Blennerhassett 	return err;
2492719f82d3SEliot Blennerhassett }
2493719f82d3SEliot Blennerhassett 
hpi_tuner_set_band(u32 h_control,u16 band)2494ba94455cSEliot Blennerhassett u16 hpi_tuner_set_band(u32 h_control, u16 band)
2495719f82d3SEliot Blennerhassett {
2496ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0);
2497719f82d3SEliot Blennerhassett }
2498719f82d3SEliot Blennerhassett 
hpi_tuner_get_band(u32 h_control,u16 * pw_band)2499ba94455cSEliot Blennerhassett u16 hpi_tuner_get_band(u32 h_control, u16 *pw_band)
2500719f82d3SEliot Blennerhassett {
2501719f82d3SEliot Blennerhassett 	u32 band = 0;
2502719f82d3SEliot Blennerhassett 	u16 error = 0;
2503719f82d3SEliot Blennerhassett 
2504ba94455cSEliot Blennerhassett 	error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band);
2505719f82d3SEliot Blennerhassett 	if (pw_band)
2506719f82d3SEliot Blennerhassett 		*pw_band = (u16)band;
2507719f82d3SEliot Blennerhassett 	return error;
2508719f82d3SEliot Blennerhassett }
2509719f82d3SEliot Blennerhassett 
hpi_tuner_query_frequency(const u32 h_tuner,const u32 index,const u16 band,u32 * pfreq)2510ba94455cSEliot Blennerhassett u16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index,
2511ba94455cSEliot Blennerhassett 	const u16 band, u32 *pfreq)
2512719f82d3SEliot Blennerhassett {
2513ba94455cSEliot Blennerhassett 	return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq);
2514719f82d3SEliot Blennerhassett }
2515719f82d3SEliot Blennerhassett 
hpi_tuner_set_frequency(u32 h_control,u32 freq_ink_hz)2516ba94455cSEliot Blennerhassett u16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz)
2517719f82d3SEliot Blennerhassett {
2518ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz,
2519ba94455cSEliot Blennerhassett 		0);
2520719f82d3SEliot Blennerhassett }
2521719f82d3SEliot Blennerhassett 
hpi_tuner_get_frequency(u32 h_control,u32 * pw_freq_ink_hz)2522ba94455cSEliot Blennerhassett u16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz)
2523719f82d3SEliot Blennerhassett {
2524ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_TUNER_FREQ,
2525719f82d3SEliot Blennerhassett 		pw_freq_ink_hz);
2526719f82d3SEliot Blennerhassett }
2527719f82d3SEliot Blennerhassett 
hpi_tuner_query_gain(const u32 h_tuner,const u32 index,u16 * pw_gain)2528ba94455cSEliot Blennerhassett u16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain)
2529719f82d3SEliot Blennerhassett {
2530719f82d3SEliot Blennerhassett 	u32 qr;
2531719f82d3SEliot Blennerhassett 	u16 err;
2532719f82d3SEliot Blennerhassett 
2533ba94455cSEliot Blennerhassett 	err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2534719f82d3SEliot Blennerhassett 	*pw_gain = (u16)qr;
2535719f82d3SEliot Blennerhassett 	return err;
2536719f82d3SEliot Blennerhassett }
2537719f82d3SEliot Blennerhassett 
hpi_tuner_set_gain(u32 h_control,short gain)2538ba94455cSEliot Blennerhassett u16 hpi_tuner_set_gain(u32 h_control, short gain)
2539719f82d3SEliot Blennerhassett {
2540ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0);
2541719f82d3SEliot Blennerhassett }
2542719f82d3SEliot Blennerhassett 
hpi_tuner_get_gain(u32 h_control,short * pn_gain)2543ba94455cSEliot Blennerhassett u16 hpi_tuner_get_gain(u32 h_control, short *pn_gain)
2544719f82d3SEliot Blennerhassett {
2545719f82d3SEliot Blennerhassett 	u32 gain = 0;
2546719f82d3SEliot Blennerhassett 	u16 error = 0;
2547719f82d3SEliot Blennerhassett 
2548ba94455cSEliot Blennerhassett 	error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain);
2549719f82d3SEliot Blennerhassett 	if (pn_gain)
2550719f82d3SEliot Blennerhassett 		*pn_gain = (u16)gain;
2551719f82d3SEliot Blennerhassett 	return error;
2552719f82d3SEliot Blennerhassett }
2553719f82d3SEliot Blennerhassett 
hpi_tuner_get_rf_level(u32 h_control,short * pw_level)2554ba94455cSEliot Blennerhassett u16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level)
2555719f82d3SEliot Blennerhassett {
2556719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2557719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2558108ccb3fSEliot Blennerhassett 
2559719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2560719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2561ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2562ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
25633285ea10SEliot Blennerhassett 	hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG;
2564719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2565719f82d3SEliot Blennerhassett 	if (pw_level)
25663285ea10SEliot Blennerhassett 		*pw_level = hr.u.cu.tuner.s_level;
2567719f82d3SEliot Blennerhassett 	return hr.error;
2568719f82d3SEliot Blennerhassett }
2569719f82d3SEliot Blennerhassett 
hpi_tuner_get_raw_rf_level(u32 h_control,short * pw_level)2570ba94455cSEliot Blennerhassett u16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level)
2571719f82d3SEliot Blennerhassett {
2572719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2573719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2574108ccb3fSEliot Blennerhassett 
2575719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2576719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2577ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2578ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
25793285ea10SEliot Blennerhassett 	hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW;
2580719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2581719f82d3SEliot Blennerhassett 	if (pw_level)
25823285ea10SEliot Blennerhassett 		*pw_level = hr.u.cu.tuner.s_level;
2583719f82d3SEliot Blennerhassett 	return hr.error;
2584719f82d3SEliot Blennerhassett }
2585719f82d3SEliot Blennerhassett 
hpi_tuner_query_deemphasis(const u32 h_tuner,const u32 index,const u16 band,u32 * pdeemphasis)2586ba94455cSEliot Blennerhassett u16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index,
2587ba94455cSEliot Blennerhassett 	const u16 band, u32 *pdeemphasis)
2588719f82d3SEliot Blennerhassett {
2589ba94455cSEliot Blennerhassett 	return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band,
2590ba94455cSEliot Blennerhassett 		pdeemphasis);
2591719f82d3SEliot Blennerhassett }
2592719f82d3SEliot Blennerhassett 
hpi_tuner_set_deemphasis(u32 h_control,u32 deemphasis)2593ba94455cSEliot Blennerhassett u16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis)
2594719f82d3SEliot Blennerhassett {
2595ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS,
2596ba94455cSEliot Blennerhassett 		deemphasis, 0);
2597719f82d3SEliot Blennerhassett }
2598719f82d3SEliot Blennerhassett 
hpi_tuner_get_deemphasis(u32 h_control,u32 * pdeemphasis)2599ba94455cSEliot Blennerhassett u16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis)
2600719f82d3SEliot Blennerhassett {
2601ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS,
2602ba94455cSEliot Blennerhassett 		pdeemphasis);
2603719f82d3SEliot Blennerhassett }
2604719f82d3SEliot Blennerhassett 
hpi_tuner_query_program(const u32 h_tuner,u32 * pbitmap_program)2605ba94455cSEliot Blennerhassett u16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program)
2606719f82d3SEliot Blennerhassett {
2607ba94455cSEliot Blennerhassett 	return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0,
2608719f82d3SEliot Blennerhassett 		pbitmap_program);
2609719f82d3SEliot Blennerhassett }
2610719f82d3SEliot Blennerhassett 
hpi_tuner_set_program(u32 h_control,u32 program)2611ba94455cSEliot Blennerhassett u16 hpi_tuner_set_program(u32 h_control, u32 program)
2612719f82d3SEliot Blennerhassett {
2613ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program,
2614ba94455cSEliot Blennerhassett 		0);
2615719f82d3SEliot Blennerhassett }
2616719f82d3SEliot Blennerhassett 
hpi_tuner_get_program(u32 h_control,u32 * pprogram)2617ba94455cSEliot Blennerhassett u16 hpi_tuner_get_program(u32 h_control, u32 *pprogram)
2618719f82d3SEliot Blennerhassett {
2619ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram);
2620719f82d3SEliot Blennerhassett }
2621719f82d3SEliot Blennerhassett 
hpi_tuner_get_hd_radio_dsp_version(u32 h_control,char * psz_dsp_version,const u32 string_size)2622ba94455cSEliot Blennerhassett u16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version,
2623ba94455cSEliot Blennerhassett 	const u32 string_size)
2624719f82d3SEliot Blennerhassett {
2625108ccb3fSEliot Blennerhassett 	return hpi_control_get_string(h_control,
2626719f82d3SEliot Blennerhassett 		HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size);
2627719f82d3SEliot Blennerhassett }
2628719f82d3SEliot Blennerhassett 
hpi_tuner_get_hd_radio_sdk_version(u32 h_control,char * psz_sdk_version,const u32 string_size)2629ba94455cSEliot Blennerhassett u16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version,
2630ba94455cSEliot Blennerhassett 	const u32 string_size)
2631719f82d3SEliot Blennerhassett {
2632108ccb3fSEliot Blennerhassett 	return hpi_control_get_string(h_control,
2633719f82d3SEliot Blennerhassett 		HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size);
2634719f82d3SEliot Blennerhassett }
2635719f82d3SEliot Blennerhassett 
hpi_tuner_get_status(u32 h_control,u16 * pw_status_mask,u16 * pw_status)2636ba94455cSEliot Blennerhassett u16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status)
2637719f82d3SEliot Blennerhassett {
2638719f82d3SEliot Blennerhassett 	u32 status = 0;
2639719f82d3SEliot Blennerhassett 	u16 error = 0;
2640719f82d3SEliot Blennerhassett 
2641ba94455cSEliot Blennerhassett 	error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status);
2642719f82d3SEliot Blennerhassett 	if (pw_status) {
2643719f82d3SEliot Blennerhassett 		if (!error) {
2644719f82d3SEliot Blennerhassett 			*pw_status_mask = (u16)(status >> 16);
2645719f82d3SEliot Blennerhassett 			*pw_status = (u16)(status & 0xFFFF);
2646719f82d3SEliot Blennerhassett 		} else {
2647719f82d3SEliot Blennerhassett 			*pw_status_mask = 0;
2648719f82d3SEliot Blennerhassett 			*pw_status = 0;
2649719f82d3SEliot Blennerhassett 		}
2650719f82d3SEliot Blennerhassett 	}
2651719f82d3SEliot Blennerhassett 	return error;
2652719f82d3SEliot Blennerhassett }
2653719f82d3SEliot Blennerhassett 
hpi_tuner_set_mode(u32 h_control,u32 mode,u32 value)2654ba94455cSEliot Blennerhassett u16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value)
2655719f82d3SEliot Blennerhassett {
2656ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value);
2657719f82d3SEliot Blennerhassett }
2658719f82d3SEliot Blennerhassett 
hpi_tuner_get_mode(u32 h_control,u32 mode,u32 * pn_value)2659ba94455cSEliot Blennerhassett u16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value)
2660719f82d3SEliot Blennerhassett {
2661ba94455cSEliot Blennerhassett 	return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0,
2662ba94455cSEliot Blennerhassett 		pn_value, NULL);
2663719f82d3SEliot Blennerhassett }
2664719f82d3SEliot Blennerhassett 
hpi_tuner_get_hd_radio_signal_quality(u32 h_control,u32 * pquality)2665ba94455cSEliot Blennerhassett u16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality)
2666719f82d3SEliot Blennerhassett {
2667ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control,
2668108ccb3fSEliot Blennerhassett 		HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality);
2669719f82d3SEliot Blennerhassett }
2670719f82d3SEliot Blennerhassett 
hpi_tuner_get_hd_radio_signal_blend(u32 h_control,u32 * pblend)2671ba94455cSEliot Blennerhassett u16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend)
26725a498ef1SEliot Blennerhassett {
2673ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND,
2674ba94455cSEliot Blennerhassett 		pblend);
26755a498ef1SEliot Blennerhassett }
26765a498ef1SEliot Blennerhassett 
hpi_tuner_set_hd_radio_signal_blend(u32 h_control,const u32 blend)2677ba94455cSEliot Blennerhassett u16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend)
26785a498ef1SEliot Blennerhassett {
2679ba94455cSEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND,
2680ba94455cSEliot Blennerhassett 		blend, 0);
26815a498ef1SEliot Blennerhassett }
26825a498ef1SEliot Blennerhassett 
hpi_tuner_get_rds(u32 h_control,char * p_data)2683ba94455cSEliot Blennerhassett u16 hpi_tuner_get_rds(u32 h_control, char *p_data)
2684719f82d3SEliot Blennerhassett {
2685719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2686719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2687108ccb3fSEliot Blennerhassett 
2688719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2689719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2690ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2691ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2692719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_TUNER_RDS;
2693719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2694719f82d3SEliot Blennerhassett 	if (p_data) {
2695719f82d3SEliot Blennerhassett 		*(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0];
2696719f82d3SEliot Blennerhassett 		*(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1];
2697719f82d3SEliot Blennerhassett 		*(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER;
2698719f82d3SEliot Blennerhassett 	}
2699719f82d3SEliot Blennerhassett 	return hr.error;
2700719f82d3SEliot Blennerhassett }
2701719f82d3SEliot Blennerhassett 
hpi_pad_get_channel_name(u32 h_control,char * psz_string,const u32 data_length)2702ba94455cSEliot Blennerhassett u16 hpi_pad_get_channel_name(u32 h_control, char *psz_string,
2703ba94455cSEliot Blennerhassett 	const u32 data_length)
2704719f82d3SEliot Blennerhassett {
2705108ccb3fSEliot Blennerhassett 	return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME,
2706108ccb3fSEliot Blennerhassett 		psz_string, data_length);
2707719f82d3SEliot Blennerhassett }
2708719f82d3SEliot Blennerhassett 
hpi_pad_get_artist(u32 h_control,char * psz_string,const u32 data_length)2709ba94455cSEliot Blennerhassett u16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length)
2710719f82d3SEliot Blennerhassett {
2711108ccb3fSEliot Blennerhassett 	return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string,
2712108ccb3fSEliot Blennerhassett 		data_length);
2713719f82d3SEliot Blennerhassett }
2714719f82d3SEliot Blennerhassett 
hpi_pad_get_title(u32 h_control,char * psz_string,const u32 data_length)2715ba94455cSEliot Blennerhassett u16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length)
2716719f82d3SEliot Blennerhassett {
2717108ccb3fSEliot Blennerhassett 	return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string,
2718108ccb3fSEliot Blennerhassett 		data_length);
2719719f82d3SEliot Blennerhassett }
2720719f82d3SEliot Blennerhassett 
hpi_pad_get_comment(u32 h_control,char * psz_string,const u32 data_length)2721ba94455cSEliot Blennerhassett u16 hpi_pad_get_comment(u32 h_control, char *psz_string,
2722ba94455cSEliot Blennerhassett 	const u32 data_length)
2723719f82d3SEliot Blennerhassett {
2724108ccb3fSEliot Blennerhassett 	return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string,
2725108ccb3fSEliot Blennerhassett 		data_length);
2726719f82d3SEliot Blennerhassett }
2727719f82d3SEliot Blennerhassett 
hpi_pad_get_program_type(u32 h_control,u32 * ppTY)2728ba94455cSEliot Blennerhassett u16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY)
2729719f82d3SEliot Blennerhassett {
2730ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY);
2731719f82d3SEliot Blennerhassett }
2732719f82d3SEliot Blennerhassett 
hpi_pad_get_rdsPI(u32 h_control,u32 * ppI)2733ba94455cSEliot Blennerhassett u16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI)
2734719f82d3SEliot Blennerhassett {
2735ba94455cSEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI);
2736719f82d3SEliot Blennerhassett }
2737719f82d3SEliot Blennerhassett 
hpi_volume_query_channels(const u32 h_volume,u32 * p_channels)2738ba94455cSEliot Blennerhassett u16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels)
2739719f82d3SEliot Blennerhassett {
2740ba94455cSEliot Blennerhassett 	return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0,
2741ba94455cSEliot Blennerhassett 		p_channels);
2742719f82d3SEliot Blennerhassett }
2743719f82d3SEliot Blennerhassett 
hpi_volume_set_gain(u32 h_control,short an_log_gain[HPI_MAX_CHANNELS])2744ba94455cSEliot Blennerhassett u16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2745719f82d3SEliot Blennerhassett 	)
2746719f82d3SEliot Blennerhassett {
2747108ccb3fSEliot Blennerhassett 	return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN,
2748108ccb3fSEliot Blennerhassett 		an_log_gain[0], an_log_gain[1]);
2749719f82d3SEliot Blennerhassett }
2750719f82d3SEliot Blennerhassett 
hpi_volume_get_gain(u32 h_control,short an_log_gain[HPI_MAX_CHANNELS])2751ba94455cSEliot Blennerhassett u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2752719f82d3SEliot Blennerhassett 	)
2753719f82d3SEliot Blennerhassett {
2754ba94455cSEliot Blennerhassett 	return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN,
2755108ccb3fSEliot Blennerhassett 		&an_log_gain[0], &an_log_gain[1]);
2756719f82d3SEliot Blennerhassett }
2757719f82d3SEliot Blennerhassett 
hpi_volume_set_mute(u32 h_control,u32 mute)2758fc3a3990SEliot Blennerhassett u16 hpi_volume_set_mute(u32 h_control, u32 mute)
2759fc3a3990SEliot Blennerhassett {
2760fc3a3990SEliot Blennerhassett 	return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0);
2761fc3a3990SEliot Blennerhassett }
2762fc3a3990SEliot Blennerhassett 
hpi_volume_get_mute(u32 h_control,u32 * mute)2763fc3a3990SEliot Blennerhassett u16 hpi_volume_get_mute(u32 h_control, u32 *mute)
2764fc3a3990SEliot Blennerhassett {
2765fc3a3990SEliot Blennerhassett 	return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
2766fc3a3990SEliot Blennerhassett }
2767fc3a3990SEliot Blennerhassett 
hpi_volume_query_range(u32 h_control,short * min_gain_01dB,short * max_gain_01dB,short * step_gain_01dB)2768ba94455cSEliot Blennerhassett u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
2769ba94455cSEliot Blennerhassett 	short *max_gain_01dB, short *step_gain_01dB)
2770719f82d3SEliot Blennerhassett {
2771719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2772719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2773108ccb3fSEliot Blennerhassett 
2774719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2775719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2776ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2777ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2778719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_VOLUME_RANGE;
2779719f82d3SEliot Blennerhassett 
2780719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2781719f82d3SEliot Blennerhassett 	if (hr.error) {
2782719f82d3SEliot Blennerhassett 		hr.u.c.an_log_value[0] = 0;
2783719f82d3SEliot Blennerhassett 		hr.u.c.an_log_value[1] = 0;
2784719f82d3SEliot Blennerhassett 		hr.u.c.param1 = 0;
2785719f82d3SEliot Blennerhassett 	}
2786719f82d3SEliot Blennerhassett 	if (min_gain_01dB)
2787719f82d3SEliot Blennerhassett 		*min_gain_01dB = hr.u.c.an_log_value[0];
2788719f82d3SEliot Blennerhassett 	if (max_gain_01dB)
2789719f82d3SEliot Blennerhassett 		*max_gain_01dB = hr.u.c.an_log_value[1];
2790719f82d3SEliot Blennerhassett 	if (step_gain_01dB)
2791719f82d3SEliot Blennerhassett 		*step_gain_01dB = (short)hr.u.c.param1;
2792719f82d3SEliot Blennerhassett 	return hr.error;
2793719f82d3SEliot Blennerhassett }
2794719f82d3SEliot Blennerhassett 
hpi_volume_auto_fade_profile(u32 h_control,short an_stop_gain0_01dB[HPI_MAX_CHANNELS],u32 duration_ms,u16 profile)2795ba94455cSEliot Blennerhassett u16 hpi_volume_auto_fade_profile(u32 h_control,
2796ba94455cSEliot Blennerhassett 	short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms,
2797ba94455cSEliot Blennerhassett 	u16 profile)
2798719f82d3SEliot Blennerhassett {
2799719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2800719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2801108ccb3fSEliot Blennerhassett 
2802719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2803719f82d3SEliot Blennerhassett 		HPI_CONTROL_SET_STATE);
2804ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2805ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2806719f82d3SEliot Blennerhassett 
2807719f82d3SEliot Blennerhassett 	memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB,
2808719f82d3SEliot Blennerhassett 		sizeof(short) * HPI_MAX_CHANNELS);
2809719f82d3SEliot Blennerhassett 
2810719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_VOLUME_AUTOFADE;
2811719f82d3SEliot Blennerhassett 	hm.u.c.param1 = duration_ms;
2812719f82d3SEliot Blennerhassett 	hm.u.c.param2 = profile;
2813719f82d3SEliot Blennerhassett 
2814719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2815719f82d3SEliot Blennerhassett 
2816719f82d3SEliot Blennerhassett 	return hr.error;
2817719f82d3SEliot Blennerhassett }
2818719f82d3SEliot Blennerhassett 
hpi_volume_auto_fade(u32 h_control,short an_stop_gain0_01dB[HPI_MAX_CHANNELS],u32 duration_ms)2819ba94455cSEliot Blennerhassett u16 hpi_volume_auto_fade(u32 h_control,
2820719f82d3SEliot Blennerhassett 	short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms)
2821719f82d3SEliot Blennerhassett {
2822ba94455cSEliot Blennerhassett 	return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB,
2823ba94455cSEliot Blennerhassett 		duration_ms, HPI_VOLUME_AUTOFADE_LOG);
2824719f82d3SEliot Blennerhassett }
2825719f82d3SEliot Blennerhassett 
hpi_volume_query_auto_fade_profile(const u32 h_volume,const u32 i,u16 * profile)2826862e1418SEliot Blennerhassett u16 hpi_volume_query_auto_fade_profile(const u32 h_volume, const u32 i,
2827862e1418SEliot Blennerhassett 	u16 *profile)
2828862e1418SEliot Blennerhassett {
2829862e1418SEliot Blennerhassett 	u16 e;
2830862e1418SEliot Blennerhassett 	u32 u;
2831862e1418SEliot Blennerhassett 	e = hpi_control_query(h_volume, HPI_VOLUME_AUTOFADE, i, 0, &u);
2832862e1418SEliot Blennerhassett 	*profile = (u16)u;
2833862e1418SEliot Blennerhassett 	return e;
2834862e1418SEliot Blennerhassett }
2835862e1418SEliot Blennerhassett 
hpi_vox_set_threshold(u32 h_control,short an_gain0_01dB)2836ba94455cSEliot Blennerhassett u16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB)
2837719f82d3SEliot Blennerhassett {
2838719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2839719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2840719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2841719f82d3SEliot Blennerhassett 		HPI_CONTROL_SET_STATE);
2842ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2843ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2844719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_VOX_THRESHOLD;
2845719f82d3SEliot Blennerhassett 
2846719f82d3SEliot Blennerhassett 	hm.u.c.an_log_value[0] = an_gain0_01dB;
2847719f82d3SEliot Blennerhassett 
2848719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2849719f82d3SEliot Blennerhassett 
2850719f82d3SEliot Blennerhassett 	return hr.error;
2851719f82d3SEliot Blennerhassett }
2852719f82d3SEliot Blennerhassett 
hpi_vox_get_threshold(u32 h_control,short * an_gain0_01dB)2853ba94455cSEliot Blennerhassett u16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB)
2854719f82d3SEliot Blennerhassett {
2855719f82d3SEliot Blennerhassett 	struct hpi_message hm;
2856719f82d3SEliot Blennerhassett 	struct hpi_response hr;
2857719f82d3SEliot Blennerhassett 	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2858719f82d3SEliot Blennerhassett 		HPI_CONTROL_GET_STATE);
2859ba94455cSEliot Blennerhassett 	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2860ba94455cSEliot Blennerhassett 		return HPI_ERROR_INVALID_HANDLE;
2861719f82d3SEliot Blennerhassett 	hm.u.c.attribute = HPI_VOX_THRESHOLD;
2862719f82d3SEliot Blennerhassett 
2863719f82d3SEliot Blennerhassett 	hpi_send_recv(&hm, &hr);
2864719f82d3SEliot Blennerhassett 
2865719f82d3SEliot Blennerhassett 	*an_gain0_01dB = hr.u.c.an_log_value[0];
2866719f82d3SEliot Blennerhassett 
2867719f82d3SEliot Blennerhassett 	return hr.error;
2868719f82d3SEliot Blennerhassett }
2869