1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun #include "hpi_internal.h"
4*4882a593Smuzhiyun #include "hpimsginit.h"
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include "hpidebug.h"
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun struct hpi_handle {
9*4882a593Smuzhiyun unsigned int obj_index:12;
10*4882a593Smuzhiyun unsigned int obj_type:4;
11*4882a593Smuzhiyun unsigned int adapter_index:14;
12*4882a593Smuzhiyun unsigned int spare:1;
13*4882a593Smuzhiyun unsigned int read_only:1;
14*4882a593Smuzhiyun };
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun union handle_word {
17*4882a593Smuzhiyun struct hpi_handle h;
18*4882a593Smuzhiyun u32 w;
19*4882a593Smuzhiyun };
20*4882a593Smuzhiyun
hpi_indexes_to_handle(const char c_object,const u16 adapter_index,const u16 object_index)21*4882a593Smuzhiyun u32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index,
22*4882a593Smuzhiyun const u16 object_index)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun union handle_word handle;
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun handle.h.adapter_index = adapter_index;
27*4882a593Smuzhiyun handle.h.spare = 0;
28*4882a593Smuzhiyun handle.h.read_only = 0;
29*4882a593Smuzhiyun handle.h.obj_type = c_object;
30*4882a593Smuzhiyun handle.h.obj_index = object_index;
31*4882a593Smuzhiyun return handle.w;
32*4882a593Smuzhiyun }
33*4882a593Smuzhiyun
hpi_handle_indexes(const u32 h,u16 * p1,u16 * p2)34*4882a593Smuzhiyun static u16 hpi_handle_indexes(const u32 h, u16 *p1, u16 *p2)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun union handle_word uhandle;
37*4882a593Smuzhiyun if (!h)
38*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun uhandle.w = h;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun *p1 = (u16)uhandle.h.adapter_index;
43*4882a593Smuzhiyun if (p2)
44*4882a593Smuzhiyun *p2 = (u16)uhandle.h.obj_index;
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun return 0;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
hpi_handle_to_indexes(const u32 handle,u16 * pw_adapter_index,u16 * pw_object_index)49*4882a593Smuzhiyun void hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index,
50*4882a593Smuzhiyun u16 *pw_object_index)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun hpi_handle_indexes(handle, pw_adapter_index, pw_object_index);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun
hpi_handle_object(const u32 handle)55*4882a593Smuzhiyun char hpi_handle_object(const u32 handle)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun union handle_word uhandle;
58*4882a593Smuzhiyun uhandle.w = handle;
59*4882a593Smuzhiyun return (char)uhandle.h.obj_type;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
hpi_format_to_msg(struct hpi_msg_format * pMF,const struct hpi_format * pF)62*4882a593Smuzhiyun void hpi_format_to_msg(struct hpi_msg_format *pMF,
63*4882a593Smuzhiyun const struct hpi_format *pF)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun pMF->sample_rate = pF->sample_rate;
66*4882a593Smuzhiyun pMF->bit_rate = pF->bit_rate;
67*4882a593Smuzhiyun pMF->attributes = pF->attributes;
68*4882a593Smuzhiyun pMF->channels = pF->channels;
69*4882a593Smuzhiyun pMF->format = pF->format;
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
hpi_msg_to_format(struct hpi_format * pF,struct hpi_msg_format * pMF)72*4882a593Smuzhiyun static void hpi_msg_to_format(struct hpi_format *pF,
73*4882a593Smuzhiyun struct hpi_msg_format *pMF)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun pF->sample_rate = pMF->sample_rate;
76*4882a593Smuzhiyun pF->bit_rate = pMF->bit_rate;
77*4882a593Smuzhiyun pF->attributes = pMF->attributes;
78*4882a593Smuzhiyun pF->channels = pMF->channels;
79*4882a593Smuzhiyun pF->format = pMF->format;
80*4882a593Smuzhiyun pF->mode_legacy = 0;
81*4882a593Smuzhiyun pF->unused = 0;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
hpi_stream_response_to_legacy(struct hpi_stream_res * pSR)84*4882a593Smuzhiyun void hpi_stream_response_to_legacy(struct hpi_stream_res *pSR)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun pSR->u.legacy_stream_info.auxiliary_data_available =
87*4882a593Smuzhiyun pSR->u.stream_info.auxiliary_data_available;
88*4882a593Smuzhiyun pSR->u.legacy_stream_info.state = pSR->u.stream_info.state;
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun
hpi_send_recvV1(struct hpi_message_header * m,struct hpi_response_header * r)91*4882a593Smuzhiyun static inline void hpi_send_recvV1(struct hpi_message_header *m,
92*4882a593Smuzhiyun struct hpi_response_header *r)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun hpi_send_recv((struct hpi_message *)m, (struct hpi_response *)r);
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
hpi_subsys_get_version_ex(u32 * pversion_ex)97*4882a593Smuzhiyun u16 hpi_subsys_get_version_ex(u32 *pversion_ex)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun struct hpi_message hm;
100*4882a593Smuzhiyun struct hpi_response hr;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
103*4882a593Smuzhiyun HPI_SUBSYS_GET_VERSION);
104*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
105*4882a593Smuzhiyun *pversion_ex = hr.u.s.data;
106*4882a593Smuzhiyun return hr.error;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
hpi_subsys_get_num_adapters(int * pn_num_adapters)109*4882a593Smuzhiyun u16 hpi_subsys_get_num_adapters(int *pn_num_adapters)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun struct hpi_message hm;
112*4882a593Smuzhiyun struct hpi_response hr;
113*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
114*4882a593Smuzhiyun HPI_SUBSYS_GET_NUM_ADAPTERS);
115*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
116*4882a593Smuzhiyun *pn_num_adapters = (int)hr.u.s.num_adapters;
117*4882a593Smuzhiyun return hr.error;
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun
hpi_subsys_get_adapter(int iterator,u32 * padapter_index,u16 * pw_adapter_type)120*4882a593Smuzhiyun u16 hpi_subsys_get_adapter(int iterator, u32 *padapter_index,
121*4882a593Smuzhiyun u16 *pw_adapter_type)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun struct hpi_message hm;
124*4882a593Smuzhiyun struct hpi_response hr;
125*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
126*4882a593Smuzhiyun HPI_SUBSYS_GET_ADAPTER);
127*4882a593Smuzhiyun hm.obj_index = (u16)iterator;
128*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
129*4882a593Smuzhiyun *padapter_index = (int)hr.u.s.adapter_index;
130*4882a593Smuzhiyun *pw_adapter_type = hr.u.s.adapter_type;
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun return hr.error;
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun
hpi_adapter_open(u16 adapter_index)135*4882a593Smuzhiyun u16 hpi_adapter_open(u16 adapter_index)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun struct hpi_message hm;
138*4882a593Smuzhiyun struct hpi_response hr;
139*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
140*4882a593Smuzhiyun HPI_ADAPTER_OPEN);
141*4882a593Smuzhiyun hm.adapter_index = adapter_index;
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun return hr.error;
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun
hpi_adapter_close(u16 adapter_index)149*4882a593Smuzhiyun u16 hpi_adapter_close(u16 adapter_index)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun struct hpi_message hm;
152*4882a593Smuzhiyun struct hpi_response hr;
153*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
154*4882a593Smuzhiyun HPI_ADAPTER_CLOSE);
155*4882a593Smuzhiyun hm.adapter_index = adapter_index;
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun return hr.error;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun
hpi_adapter_set_mode(u16 adapter_index,u32 adapter_mode)162*4882a593Smuzhiyun u16 hpi_adapter_set_mode(u16 adapter_index, u32 adapter_mode)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun return hpi_adapter_set_mode_ex(adapter_index, adapter_mode,
165*4882a593Smuzhiyun HPI_ADAPTER_MODE_SET);
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun
hpi_adapter_set_mode_ex(u16 adapter_index,u32 adapter_mode,u16 query_or_set)168*4882a593Smuzhiyun u16 hpi_adapter_set_mode_ex(u16 adapter_index, u32 adapter_mode,
169*4882a593Smuzhiyun u16 query_or_set)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun struct hpi_message hm;
172*4882a593Smuzhiyun struct hpi_response hr;
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
175*4882a593Smuzhiyun HPI_ADAPTER_SET_MODE);
176*4882a593Smuzhiyun hm.adapter_index = adapter_index;
177*4882a593Smuzhiyun hm.u.ax.mode.adapter_mode = adapter_mode;
178*4882a593Smuzhiyun hm.u.ax.mode.query_or_set = query_or_set;
179*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
180*4882a593Smuzhiyun return hr.error;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
hpi_adapter_get_mode(u16 adapter_index,u32 * padapter_mode)183*4882a593Smuzhiyun u16 hpi_adapter_get_mode(u16 adapter_index, u32 *padapter_mode)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun struct hpi_message hm;
186*4882a593Smuzhiyun struct hpi_response hr;
187*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
188*4882a593Smuzhiyun HPI_ADAPTER_GET_MODE);
189*4882a593Smuzhiyun hm.adapter_index = adapter_index;
190*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
191*4882a593Smuzhiyun if (padapter_mode)
192*4882a593Smuzhiyun *padapter_mode = hr.u.ax.mode.adapter_mode;
193*4882a593Smuzhiyun return hr.error;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun
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)196*4882a593Smuzhiyun u16 hpi_adapter_get_info(u16 adapter_index, u16 *pw_num_outstreams,
197*4882a593Smuzhiyun u16 *pw_num_instreams, u16 *pw_version, u32 *pserial_number,
198*4882a593Smuzhiyun u16 *pw_adapter_type)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun struct hpi_message hm;
201*4882a593Smuzhiyun struct hpi_response hr;
202*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
203*4882a593Smuzhiyun HPI_ADAPTER_GET_INFO);
204*4882a593Smuzhiyun hm.adapter_index = adapter_index;
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun *pw_adapter_type = hr.u.ax.info.adapter_type;
209*4882a593Smuzhiyun *pw_num_outstreams = hr.u.ax.info.num_outstreams;
210*4882a593Smuzhiyun *pw_num_instreams = hr.u.ax.info.num_instreams;
211*4882a593Smuzhiyun *pw_version = hr.u.ax.info.version;
212*4882a593Smuzhiyun *pserial_number = hr.u.ax.info.serial_number;
213*4882a593Smuzhiyun return hr.error;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
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)216*4882a593Smuzhiyun u16 hpi_adapter_get_module_by_index(u16 adapter_index, u16 module_index,
217*4882a593Smuzhiyun u16 *pw_num_outputs, u16 *pw_num_inputs, u16 *pw_version,
218*4882a593Smuzhiyun u32 *pserial_number, u16 *pw_module_type, u32 *ph_module)
219*4882a593Smuzhiyun {
220*4882a593Smuzhiyun struct hpi_message hm;
221*4882a593Smuzhiyun struct hpi_response hr;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
224*4882a593Smuzhiyun HPI_ADAPTER_MODULE_INFO);
225*4882a593Smuzhiyun hm.adapter_index = adapter_index;
226*4882a593Smuzhiyun hm.u.ax.module_info.index = module_index;
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun *pw_module_type = hr.u.ax.info.adapter_type;
231*4882a593Smuzhiyun *pw_num_outputs = hr.u.ax.info.num_outstreams;
232*4882a593Smuzhiyun *pw_num_inputs = hr.u.ax.info.num_instreams;
233*4882a593Smuzhiyun *pw_version = hr.u.ax.info.version;
234*4882a593Smuzhiyun *pserial_number = hr.u.ax.info.serial_number;
235*4882a593Smuzhiyun *ph_module = 0;
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun return hr.error;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun
hpi_adapter_set_property(u16 adapter_index,u16 property,u16 parameter1,u16 parameter2)240*4882a593Smuzhiyun u16 hpi_adapter_set_property(u16 adapter_index, u16 property, u16 parameter1,
241*4882a593Smuzhiyun u16 parameter2)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun struct hpi_message hm;
244*4882a593Smuzhiyun struct hpi_response hr;
245*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
246*4882a593Smuzhiyun HPI_ADAPTER_SET_PROPERTY);
247*4882a593Smuzhiyun hm.adapter_index = adapter_index;
248*4882a593Smuzhiyun hm.u.ax.property_set.property = property;
249*4882a593Smuzhiyun hm.u.ax.property_set.parameter1 = parameter1;
250*4882a593Smuzhiyun hm.u.ax.property_set.parameter2 = parameter2;
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun return hr.error;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun
hpi_adapter_get_property(u16 adapter_index,u16 property,u16 * pw_parameter1,u16 * pw_parameter2)257*4882a593Smuzhiyun u16 hpi_adapter_get_property(u16 adapter_index, u16 property,
258*4882a593Smuzhiyun u16 *pw_parameter1, u16 *pw_parameter2)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun struct hpi_message hm;
261*4882a593Smuzhiyun struct hpi_response hr;
262*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
263*4882a593Smuzhiyun HPI_ADAPTER_GET_PROPERTY);
264*4882a593Smuzhiyun hm.adapter_index = adapter_index;
265*4882a593Smuzhiyun hm.u.ax.property_set.property = property;
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
268*4882a593Smuzhiyun if (!hr.error) {
269*4882a593Smuzhiyun if (pw_parameter1)
270*4882a593Smuzhiyun *pw_parameter1 = hr.u.ax.property_get.parameter1;
271*4882a593Smuzhiyun if (pw_parameter2)
272*4882a593Smuzhiyun *pw_parameter2 = hr.u.ax.property_get.parameter2;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun return hr.error;
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun
hpi_adapter_enumerate_property(u16 adapter_index,u16 index,u16 what_to_enumerate,u16 property_index,u32 * psetting)278*4882a593Smuzhiyun u16 hpi_adapter_enumerate_property(u16 adapter_index, u16 index,
279*4882a593Smuzhiyun u16 what_to_enumerate, u16 property_index, u32 *psetting)
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun return 0;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
hpi_format_create(struct hpi_format * p_format,u16 channels,u16 format,u32 sample_rate,u32 bit_rate,u32 attributes)284*4882a593Smuzhiyun u16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format,
285*4882a593Smuzhiyun u32 sample_rate, u32 bit_rate, u32 attributes)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun u16 err = 0;
288*4882a593Smuzhiyun struct hpi_msg_format fmt;
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun switch (channels) {
291*4882a593Smuzhiyun case 1:
292*4882a593Smuzhiyun case 2:
293*4882a593Smuzhiyun case 4:
294*4882a593Smuzhiyun case 6:
295*4882a593Smuzhiyun case 8:
296*4882a593Smuzhiyun case 16:
297*4882a593Smuzhiyun break;
298*4882a593Smuzhiyun default:
299*4882a593Smuzhiyun err = HPI_ERROR_INVALID_CHANNELS;
300*4882a593Smuzhiyun return err;
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun fmt.channels = channels;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun switch (format) {
305*4882a593Smuzhiyun case HPI_FORMAT_PCM16_SIGNED:
306*4882a593Smuzhiyun case HPI_FORMAT_PCM24_SIGNED:
307*4882a593Smuzhiyun case HPI_FORMAT_PCM32_SIGNED:
308*4882a593Smuzhiyun case HPI_FORMAT_PCM32_FLOAT:
309*4882a593Smuzhiyun case HPI_FORMAT_PCM16_BIGENDIAN:
310*4882a593Smuzhiyun case HPI_FORMAT_PCM8_UNSIGNED:
311*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L1:
312*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L2:
313*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L3:
314*4882a593Smuzhiyun case HPI_FORMAT_DOLBY_AC2:
315*4882a593Smuzhiyun case HPI_FORMAT_AA_TAGIT1_HITS:
316*4882a593Smuzhiyun case HPI_FORMAT_AA_TAGIT1_INSERTS:
317*4882a593Smuzhiyun case HPI_FORMAT_RAW_BITSTREAM:
318*4882a593Smuzhiyun case HPI_FORMAT_AA_TAGIT1_HITS_EX1:
319*4882a593Smuzhiyun case HPI_FORMAT_OEM1:
320*4882a593Smuzhiyun case HPI_FORMAT_OEM2:
321*4882a593Smuzhiyun break;
322*4882a593Smuzhiyun default:
323*4882a593Smuzhiyun err = HPI_ERROR_INVALID_FORMAT;
324*4882a593Smuzhiyun return err;
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun fmt.format = format;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun if (sample_rate < 8000L) {
329*4882a593Smuzhiyun err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
330*4882a593Smuzhiyun sample_rate = 8000L;
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun if (sample_rate > 200000L) {
333*4882a593Smuzhiyun err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
334*4882a593Smuzhiyun sample_rate = 200000L;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun fmt.sample_rate = sample_rate;
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun switch (format) {
339*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L1:
340*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L2:
341*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L3:
342*4882a593Smuzhiyun fmt.bit_rate = bit_rate;
343*4882a593Smuzhiyun break;
344*4882a593Smuzhiyun case HPI_FORMAT_PCM16_SIGNED:
345*4882a593Smuzhiyun case HPI_FORMAT_PCM16_BIGENDIAN:
346*4882a593Smuzhiyun fmt.bit_rate = channels * sample_rate * 2;
347*4882a593Smuzhiyun break;
348*4882a593Smuzhiyun case HPI_FORMAT_PCM32_SIGNED:
349*4882a593Smuzhiyun case HPI_FORMAT_PCM32_FLOAT:
350*4882a593Smuzhiyun fmt.bit_rate = channels * sample_rate * 4;
351*4882a593Smuzhiyun break;
352*4882a593Smuzhiyun case HPI_FORMAT_PCM8_UNSIGNED:
353*4882a593Smuzhiyun fmt.bit_rate = channels * sample_rate;
354*4882a593Smuzhiyun break;
355*4882a593Smuzhiyun default:
356*4882a593Smuzhiyun fmt.bit_rate = 0;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun switch (format) {
360*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L2:
361*4882a593Smuzhiyun if ((channels == 1)
362*4882a593Smuzhiyun && (attributes != HPI_MPEG_MODE_DEFAULT)) {
363*4882a593Smuzhiyun attributes = HPI_MPEG_MODE_DEFAULT;
364*4882a593Smuzhiyun err = HPI_ERROR_INVALID_FORMAT;
365*4882a593Smuzhiyun } else if (attributes > HPI_MPEG_MODE_DUALCHANNEL) {
366*4882a593Smuzhiyun attributes = HPI_MPEG_MODE_DEFAULT;
367*4882a593Smuzhiyun err = HPI_ERROR_INVALID_FORMAT;
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun fmt.attributes = attributes;
370*4882a593Smuzhiyun break;
371*4882a593Smuzhiyun default:
372*4882a593Smuzhiyun fmt.attributes = attributes;
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun hpi_msg_to_format(p_format, &fmt);
376*4882a593Smuzhiyun return err;
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun
hpi_stream_estimate_buffer_size(struct hpi_format * p_format,u32 host_polling_rate_in_milli_seconds,u32 * recommended_buffer_size)379*4882a593Smuzhiyun u16 hpi_stream_estimate_buffer_size(struct hpi_format *p_format,
380*4882a593Smuzhiyun u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun u32 bytes_per_second;
384*4882a593Smuzhiyun u32 size;
385*4882a593Smuzhiyun u16 channels;
386*4882a593Smuzhiyun struct hpi_format *pF = p_format;
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun channels = pF->channels;
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun switch (pF->format) {
391*4882a593Smuzhiyun case HPI_FORMAT_PCM16_BIGENDIAN:
392*4882a593Smuzhiyun case HPI_FORMAT_PCM16_SIGNED:
393*4882a593Smuzhiyun bytes_per_second = pF->sample_rate * 2L * channels;
394*4882a593Smuzhiyun break;
395*4882a593Smuzhiyun case HPI_FORMAT_PCM24_SIGNED:
396*4882a593Smuzhiyun bytes_per_second = pF->sample_rate * 3L * channels;
397*4882a593Smuzhiyun break;
398*4882a593Smuzhiyun case HPI_FORMAT_PCM32_SIGNED:
399*4882a593Smuzhiyun case HPI_FORMAT_PCM32_FLOAT:
400*4882a593Smuzhiyun bytes_per_second = pF->sample_rate * 4L * channels;
401*4882a593Smuzhiyun break;
402*4882a593Smuzhiyun case HPI_FORMAT_PCM8_UNSIGNED:
403*4882a593Smuzhiyun bytes_per_second = pF->sample_rate * 1L * channels;
404*4882a593Smuzhiyun break;
405*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L1:
406*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L2:
407*4882a593Smuzhiyun case HPI_FORMAT_MPEG_L3:
408*4882a593Smuzhiyun bytes_per_second = pF->bit_rate / 8L;
409*4882a593Smuzhiyun break;
410*4882a593Smuzhiyun case HPI_FORMAT_DOLBY_AC2:
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun bytes_per_second = 256000L / 8L;
413*4882a593Smuzhiyun break;
414*4882a593Smuzhiyun default:
415*4882a593Smuzhiyun return HPI_ERROR_INVALID_FORMAT;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun size = (bytes_per_second * host_polling_rate_in_milli_seconds * 2) /
418*4882a593Smuzhiyun 1000L;
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun *recommended_buffer_size =
421*4882a593Smuzhiyun roundup_pow_of_two(((size + 4095L) & ~4095L));
422*4882a593Smuzhiyun return 0;
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun
hpi_outstream_open(u16 adapter_index,u16 outstream_index,u32 * ph_outstream)425*4882a593Smuzhiyun u16 hpi_outstream_open(u16 adapter_index, u16 outstream_index,
426*4882a593Smuzhiyun u32 *ph_outstream)
427*4882a593Smuzhiyun {
428*4882a593Smuzhiyun struct hpi_message hm;
429*4882a593Smuzhiyun struct hpi_response hr;
430*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
431*4882a593Smuzhiyun HPI_OSTREAM_OPEN);
432*4882a593Smuzhiyun hm.adapter_index = adapter_index;
433*4882a593Smuzhiyun hm.obj_index = outstream_index;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun if (hr.error == 0)
438*4882a593Smuzhiyun *ph_outstream =
439*4882a593Smuzhiyun hpi_indexes_to_handle(HPI_OBJ_OSTREAM, adapter_index,
440*4882a593Smuzhiyun outstream_index);
441*4882a593Smuzhiyun else
442*4882a593Smuzhiyun *ph_outstream = 0;
443*4882a593Smuzhiyun return hr.error;
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun
hpi_outstream_close(u32 h_outstream)446*4882a593Smuzhiyun u16 hpi_outstream_close(u32 h_outstream)
447*4882a593Smuzhiyun {
448*4882a593Smuzhiyun struct hpi_message hm;
449*4882a593Smuzhiyun struct hpi_response hr;
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
452*4882a593Smuzhiyun HPI_OSTREAM_HOSTBUFFER_FREE);
453*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
454*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
459*4882a593Smuzhiyun HPI_OSTREAM_GROUP_RESET);
460*4882a593Smuzhiyun hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
461*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
464*4882a593Smuzhiyun HPI_OSTREAM_CLOSE);
465*4882a593Smuzhiyun hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
466*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun return hr.error;
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun
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)471*4882a593Smuzhiyun u16 hpi_outstream_get_info_ex(u32 h_outstream, u16 *pw_state,
472*4882a593Smuzhiyun u32 *pbuffer_size, u32 *pdata_to_play, u32 *psamples_played,
473*4882a593Smuzhiyun u32 *pauxiliary_data_to_play)
474*4882a593Smuzhiyun {
475*4882a593Smuzhiyun struct hpi_message hm;
476*4882a593Smuzhiyun struct hpi_response hr;
477*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
478*4882a593Smuzhiyun HPI_OSTREAM_GET_INFO);
479*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
480*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun if (pw_state)
485*4882a593Smuzhiyun *pw_state = hr.u.d.u.stream_info.state;
486*4882a593Smuzhiyun if (pbuffer_size)
487*4882a593Smuzhiyun *pbuffer_size = hr.u.d.u.stream_info.buffer_size;
488*4882a593Smuzhiyun if (pdata_to_play)
489*4882a593Smuzhiyun *pdata_to_play = hr.u.d.u.stream_info.data_available;
490*4882a593Smuzhiyun if (psamples_played)
491*4882a593Smuzhiyun *psamples_played = hr.u.d.u.stream_info.samples_transferred;
492*4882a593Smuzhiyun if (pauxiliary_data_to_play)
493*4882a593Smuzhiyun *pauxiliary_data_to_play =
494*4882a593Smuzhiyun hr.u.d.u.stream_info.auxiliary_data_available;
495*4882a593Smuzhiyun return hr.error;
496*4882a593Smuzhiyun }
497*4882a593Smuzhiyun
hpi_outstream_write_buf(u32 h_outstream,const u8 * pb_data,u32 bytes_to_write,const struct hpi_format * p_format)498*4882a593Smuzhiyun u16 hpi_outstream_write_buf(u32 h_outstream, const u8 *pb_data,
499*4882a593Smuzhiyun u32 bytes_to_write, const struct hpi_format *p_format)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun struct hpi_message hm;
502*4882a593Smuzhiyun struct hpi_response hr;
503*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
504*4882a593Smuzhiyun HPI_OSTREAM_WRITE);
505*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
506*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
507*4882a593Smuzhiyun hm.u.d.u.data.pb_data = (u8 *)pb_data;
508*4882a593Smuzhiyun hm.u.d.u.data.data_size = bytes_to_write;
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
511*4882a593Smuzhiyun
512*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun return hr.error;
515*4882a593Smuzhiyun }
516*4882a593Smuzhiyun
hpi_outstream_start(u32 h_outstream)517*4882a593Smuzhiyun u16 hpi_outstream_start(u32 h_outstream)
518*4882a593Smuzhiyun {
519*4882a593Smuzhiyun struct hpi_message hm;
520*4882a593Smuzhiyun struct hpi_response hr;
521*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
522*4882a593Smuzhiyun HPI_OSTREAM_START);
523*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
524*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun return hr.error;
529*4882a593Smuzhiyun }
530*4882a593Smuzhiyun
hpi_outstream_wait_start(u32 h_outstream)531*4882a593Smuzhiyun u16 hpi_outstream_wait_start(u32 h_outstream)
532*4882a593Smuzhiyun {
533*4882a593Smuzhiyun struct hpi_message hm;
534*4882a593Smuzhiyun struct hpi_response hr;
535*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
536*4882a593Smuzhiyun HPI_OSTREAM_WAIT_START);
537*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
538*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
541*4882a593Smuzhiyun
542*4882a593Smuzhiyun return hr.error;
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun
hpi_outstream_stop(u32 h_outstream)545*4882a593Smuzhiyun u16 hpi_outstream_stop(u32 h_outstream)
546*4882a593Smuzhiyun {
547*4882a593Smuzhiyun struct hpi_message hm;
548*4882a593Smuzhiyun struct hpi_response hr;
549*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
550*4882a593Smuzhiyun HPI_OSTREAM_STOP);
551*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
552*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun return hr.error;
557*4882a593Smuzhiyun }
558*4882a593Smuzhiyun
hpi_outstream_sinegen(u32 h_outstream)559*4882a593Smuzhiyun u16 hpi_outstream_sinegen(u32 h_outstream)
560*4882a593Smuzhiyun {
561*4882a593Smuzhiyun struct hpi_message hm;
562*4882a593Smuzhiyun struct hpi_response hr;
563*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
564*4882a593Smuzhiyun HPI_OSTREAM_SINEGEN);
565*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
566*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
567*4882a593Smuzhiyun
568*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun return hr.error;
571*4882a593Smuzhiyun }
572*4882a593Smuzhiyun
hpi_outstream_reset(u32 h_outstream)573*4882a593Smuzhiyun u16 hpi_outstream_reset(u32 h_outstream)
574*4882a593Smuzhiyun {
575*4882a593Smuzhiyun struct hpi_message hm;
576*4882a593Smuzhiyun struct hpi_response hr;
577*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
578*4882a593Smuzhiyun HPI_OSTREAM_RESET);
579*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
580*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
581*4882a593Smuzhiyun
582*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun return hr.error;
585*4882a593Smuzhiyun }
586*4882a593Smuzhiyun
hpi_outstream_query_format(u32 h_outstream,struct hpi_format * p_format)587*4882a593Smuzhiyun u16 hpi_outstream_query_format(u32 h_outstream, struct hpi_format *p_format)
588*4882a593Smuzhiyun {
589*4882a593Smuzhiyun struct hpi_message hm;
590*4882a593Smuzhiyun struct hpi_response hr;
591*4882a593Smuzhiyun
592*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
593*4882a593Smuzhiyun HPI_OSTREAM_QUERY_FORMAT);
594*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
595*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
596*4882a593Smuzhiyun
597*4882a593Smuzhiyun hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
600*4882a593Smuzhiyun
601*4882a593Smuzhiyun return hr.error;
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun
hpi_outstream_set_format(u32 h_outstream,struct hpi_format * p_format)604*4882a593Smuzhiyun u16 hpi_outstream_set_format(u32 h_outstream, struct hpi_format *p_format)
605*4882a593Smuzhiyun {
606*4882a593Smuzhiyun struct hpi_message hm;
607*4882a593Smuzhiyun struct hpi_response hr;
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
610*4882a593Smuzhiyun HPI_OSTREAM_SET_FORMAT);
611*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
612*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
613*4882a593Smuzhiyun
614*4882a593Smuzhiyun hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
617*4882a593Smuzhiyun
618*4882a593Smuzhiyun return hr.error;
619*4882a593Smuzhiyun }
620*4882a593Smuzhiyun
hpi_outstream_set_velocity(u32 h_outstream,short velocity)621*4882a593Smuzhiyun u16 hpi_outstream_set_velocity(u32 h_outstream, short velocity)
622*4882a593Smuzhiyun {
623*4882a593Smuzhiyun struct hpi_message hm;
624*4882a593Smuzhiyun struct hpi_response hr;
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
627*4882a593Smuzhiyun HPI_OSTREAM_SET_VELOCITY);
628*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
629*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
630*4882a593Smuzhiyun hm.u.d.u.velocity = velocity;
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun return hr.error;
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun
hpi_outstream_set_punch_in_out(u32 h_outstream,u32 punch_in_sample,u32 punch_out_sample)637*4882a593Smuzhiyun u16 hpi_outstream_set_punch_in_out(u32 h_outstream, u32 punch_in_sample,
638*4882a593Smuzhiyun u32 punch_out_sample)
639*4882a593Smuzhiyun {
640*4882a593Smuzhiyun struct hpi_message hm;
641*4882a593Smuzhiyun struct hpi_response hr;
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
644*4882a593Smuzhiyun HPI_OSTREAM_SET_PUNCHINOUT);
645*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
646*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun hm.u.d.u.pio.punch_in_sample = punch_in_sample;
649*4882a593Smuzhiyun hm.u.d.u.pio.punch_out_sample = punch_out_sample;
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun return hr.error;
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun
hpi_outstream_ancillary_reset(u32 h_outstream,u16 mode)656*4882a593Smuzhiyun u16 hpi_outstream_ancillary_reset(u32 h_outstream, u16 mode)
657*4882a593Smuzhiyun {
658*4882a593Smuzhiyun struct hpi_message hm;
659*4882a593Smuzhiyun struct hpi_response hr;
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
662*4882a593Smuzhiyun HPI_OSTREAM_ANC_RESET);
663*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
664*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
665*4882a593Smuzhiyun hm.u.d.u.data.format.channels = mode;
666*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
667*4882a593Smuzhiyun return hr.error;
668*4882a593Smuzhiyun }
669*4882a593Smuzhiyun
hpi_outstream_ancillary_get_info(u32 h_outstream,u32 * pframes_available)670*4882a593Smuzhiyun u16 hpi_outstream_ancillary_get_info(u32 h_outstream, u32 *pframes_available)
671*4882a593Smuzhiyun {
672*4882a593Smuzhiyun struct hpi_message hm;
673*4882a593Smuzhiyun struct hpi_response hr;
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
676*4882a593Smuzhiyun HPI_OSTREAM_ANC_GET_INFO);
677*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
678*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
679*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
680*4882a593Smuzhiyun if (hr.error == 0) {
681*4882a593Smuzhiyun if (pframes_available)
682*4882a593Smuzhiyun *pframes_available =
683*4882a593Smuzhiyun hr.u.d.u.stream_info.data_available /
684*4882a593Smuzhiyun sizeof(struct hpi_anc_frame);
685*4882a593Smuzhiyun }
686*4882a593Smuzhiyun return hr.error;
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun
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)689*4882a593Smuzhiyun u16 hpi_outstream_ancillary_read(u32 h_outstream,
690*4882a593Smuzhiyun struct hpi_anc_frame *p_anc_frame_buffer,
691*4882a593Smuzhiyun u32 anc_frame_buffer_size_in_bytes,
692*4882a593Smuzhiyun u32 number_of_ancillary_frames_to_read)
693*4882a593Smuzhiyun {
694*4882a593Smuzhiyun struct hpi_message hm;
695*4882a593Smuzhiyun struct hpi_response hr;
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
698*4882a593Smuzhiyun HPI_OSTREAM_ANC_READ);
699*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
700*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
701*4882a593Smuzhiyun hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
702*4882a593Smuzhiyun hm.u.d.u.data.data_size =
703*4882a593Smuzhiyun number_of_ancillary_frames_to_read *
704*4882a593Smuzhiyun sizeof(struct hpi_anc_frame);
705*4882a593Smuzhiyun if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
706*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
707*4882a593Smuzhiyun else
708*4882a593Smuzhiyun hr.error = HPI_ERROR_INVALID_DATASIZE;
709*4882a593Smuzhiyun return hr.error;
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun
hpi_outstream_set_time_scale(u32 h_outstream,u32 time_scale)712*4882a593Smuzhiyun u16 hpi_outstream_set_time_scale(u32 h_outstream, u32 time_scale)
713*4882a593Smuzhiyun {
714*4882a593Smuzhiyun struct hpi_message hm;
715*4882a593Smuzhiyun struct hpi_response hr;
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
718*4882a593Smuzhiyun HPI_OSTREAM_SET_TIMESCALE);
719*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
720*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun hm.u.d.u.time_scale = time_scale;
723*4882a593Smuzhiyun
724*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
725*4882a593Smuzhiyun
726*4882a593Smuzhiyun return hr.error;
727*4882a593Smuzhiyun }
728*4882a593Smuzhiyun
hpi_outstream_host_buffer_allocate(u32 h_outstream,u32 size_in_bytes)729*4882a593Smuzhiyun u16 hpi_outstream_host_buffer_allocate(u32 h_outstream, u32 size_in_bytes)
730*4882a593Smuzhiyun {
731*4882a593Smuzhiyun struct hpi_message hm;
732*4882a593Smuzhiyun struct hpi_response hr;
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
735*4882a593Smuzhiyun HPI_OSTREAM_HOSTBUFFER_ALLOC);
736*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
737*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
738*4882a593Smuzhiyun hm.u.d.u.data.data_size = size_in_bytes;
739*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
740*4882a593Smuzhiyun return hr.error;
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun
hpi_outstream_host_buffer_get_info(u32 h_outstream,u8 ** pp_buffer,struct hpi_hostbuffer_status ** pp_status)743*4882a593Smuzhiyun u16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer,
744*4882a593Smuzhiyun struct hpi_hostbuffer_status **pp_status)
745*4882a593Smuzhiyun {
746*4882a593Smuzhiyun struct hpi_message hm;
747*4882a593Smuzhiyun struct hpi_response hr;
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
750*4882a593Smuzhiyun HPI_OSTREAM_HOSTBUFFER_GET_INFO);
751*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
752*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
753*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun if (hr.error == 0) {
756*4882a593Smuzhiyun if (pp_buffer)
757*4882a593Smuzhiyun *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
758*4882a593Smuzhiyun if (pp_status)
759*4882a593Smuzhiyun *pp_status = hr.u.d.u.hostbuffer_info.p_status;
760*4882a593Smuzhiyun }
761*4882a593Smuzhiyun return hr.error;
762*4882a593Smuzhiyun }
763*4882a593Smuzhiyun
hpi_outstream_host_buffer_free(u32 h_outstream)764*4882a593Smuzhiyun u16 hpi_outstream_host_buffer_free(u32 h_outstream)
765*4882a593Smuzhiyun {
766*4882a593Smuzhiyun struct hpi_message hm;
767*4882a593Smuzhiyun struct hpi_response hr;
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
770*4882a593Smuzhiyun HPI_OSTREAM_HOSTBUFFER_FREE);
771*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
772*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
773*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
774*4882a593Smuzhiyun return hr.error;
775*4882a593Smuzhiyun }
776*4882a593Smuzhiyun
hpi_outstream_group_add(u32 h_outstream,u32 h_stream)777*4882a593Smuzhiyun u16 hpi_outstream_group_add(u32 h_outstream, u32 h_stream)
778*4882a593Smuzhiyun {
779*4882a593Smuzhiyun struct hpi_message hm;
780*4882a593Smuzhiyun struct hpi_response hr;
781*4882a593Smuzhiyun u16 adapter;
782*4882a593Smuzhiyun char c_obj_type;
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
785*4882a593Smuzhiyun HPI_OSTREAM_GROUP_ADD);
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
788*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun if (hpi_handle_indexes(h_stream, &adapter,
791*4882a593Smuzhiyun &hm.u.d.u.stream.stream_index))
792*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun c_obj_type = hpi_handle_object(h_stream);
795*4882a593Smuzhiyun switch (c_obj_type) {
796*4882a593Smuzhiyun case HPI_OBJ_OSTREAM:
797*4882a593Smuzhiyun case HPI_OBJ_ISTREAM:
798*4882a593Smuzhiyun hm.u.d.u.stream.object_type = c_obj_type;
799*4882a593Smuzhiyun break;
800*4882a593Smuzhiyun default:
801*4882a593Smuzhiyun return HPI_ERROR_INVALID_OBJ;
802*4882a593Smuzhiyun }
803*4882a593Smuzhiyun if (adapter != hm.adapter_index)
804*4882a593Smuzhiyun return HPI_ERROR_NO_INTERADAPTER_GROUPS;
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
807*4882a593Smuzhiyun return hr.error;
808*4882a593Smuzhiyun }
809*4882a593Smuzhiyun
hpi_outstream_group_get_map(u32 h_outstream,u32 * poutstream_map,u32 * pinstream_map)810*4882a593Smuzhiyun u16 hpi_outstream_group_get_map(u32 h_outstream, u32 *poutstream_map,
811*4882a593Smuzhiyun u32 *pinstream_map)
812*4882a593Smuzhiyun {
813*4882a593Smuzhiyun struct hpi_message hm;
814*4882a593Smuzhiyun struct hpi_response hr;
815*4882a593Smuzhiyun
816*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
817*4882a593Smuzhiyun HPI_OSTREAM_GROUP_GETMAP);
818*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
819*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
820*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun if (poutstream_map)
823*4882a593Smuzhiyun *poutstream_map = hr.u.d.u.group_info.outstream_group_map;
824*4882a593Smuzhiyun if (pinstream_map)
825*4882a593Smuzhiyun *pinstream_map = hr.u.d.u.group_info.instream_group_map;
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun return hr.error;
828*4882a593Smuzhiyun }
829*4882a593Smuzhiyun
hpi_outstream_group_reset(u32 h_outstream)830*4882a593Smuzhiyun u16 hpi_outstream_group_reset(u32 h_outstream)
831*4882a593Smuzhiyun {
832*4882a593Smuzhiyun struct hpi_message hm;
833*4882a593Smuzhiyun struct hpi_response hr;
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
836*4882a593Smuzhiyun HPI_OSTREAM_GROUP_RESET);
837*4882a593Smuzhiyun if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
838*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
839*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
840*4882a593Smuzhiyun return hr.error;
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun
hpi_instream_open(u16 adapter_index,u16 instream_index,u32 * ph_instream)843*4882a593Smuzhiyun u16 hpi_instream_open(u16 adapter_index, u16 instream_index, u32 *ph_instream)
844*4882a593Smuzhiyun {
845*4882a593Smuzhiyun struct hpi_message hm;
846*4882a593Smuzhiyun struct hpi_response hr;
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
849*4882a593Smuzhiyun HPI_ISTREAM_OPEN);
850*4882a593Smuzhiyun hm.adapter_index = adapter_index;
851*4882a593Smuzhiyun hm.obj_index = instream_index;
852*4882a593Smuzhiyun
853*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
854*4882a593Smuzhiyun
855*4882a593Smuzhiyun if (hr.error == 0)
856*4882a593Smuzhiyun *ph_instream =
857*4882a593Smuzhiyun hpi_indexes_to_handle(HPI_OBJ_ISTREAM, adapter_index,
858*4882a593Smuzhiyun instream_index);
859*4882a593Smuzhiyun else
860*4882a593Smuzhiyun *ph_instream = 0;
861*4882a593Smuzhiyun
862*4882a593Smuzhiyun return hr.error;
863*4882a593Smuzhiyun }
864*4882a593Smuzhiyun
hpi_instream_close(u32 h_instream)865*4882a593Smuzhiyun u16 hpi_instream_close(u32 h_instream)
866*4882a593Smuzhiyun {
867*4882a593Smuzhiyun struct hpi_message hm;
868*4882a593Smuzhiyun struct hpi_response hr;
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
871*4882a593Smuzhiyun HPI_ISTREAM_HOSTBUFFER_FREE);
872*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
873*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
874*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
875*4882a593Smuzhiyun
876*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
877*4882a593Smuzhiyun HPI_ISTREAM_GROUP_RESET);
878*4882a593Smuzhiyun hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
879*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
880*4882a593Smuzhiyun
881*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
882*4882a593Smuzhiyun HPI_ISTREAM_CLOSE);
883*4882a593Smuzhiyun hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
884*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun return hr.error;
887*4882a593Smuzhiyun }
888*4882a593Smuzhiyun
hpi_instream_query_format(u32 h_instream,const struct hpi_format * p_format)889*4882a593Smuzhiyun u16 hpi_instream_query_format(u32 h_instream,
890*4882a593Smuzhiyun const struct hpi_format *p_format)
891*4882a593Smuzhiyun {
892*4882a593Smuzhiyun struct hpi_message hm;
893*4882a593Smuzhiyun struct hpi_response hr;
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
896*4882a593Smuzhiyun HPI_ISTREAM_QUERY_FORMAT);
897*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
898*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
899*4882a593Smuzhiyun hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun return hr.error;
904*4882a593Smuzhiyun }
905*4882a593Smuzhiyun
hpi_instream_set_format(u32 h_instream,const struct hpi_format * p_format)906*4882a593Smuzhiyun u16 hpi_instream_set_format(u32 h_instream, const struct hpi_format *p_format)
907*4882a593Smuzhiyun {
908*4882a593Smuzhiyun struct hpi_message hm;
909*4882a593Smuzhiyun struct hpi_response hr;
910*4882a593Smuzhiyun
911*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
912*4882a593Smuzhiyun HPI_ISTREAM_SET_FORMAT);
913*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
914*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
915*4882a593Smuzhiyun hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
916*4882a593Smuzhiyun
917*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
918*4882a593Smuzhiyun
919*4882a593Smuzhiyun return hr.error;
920*4882a593Smuzhiyun }
921*4882a593Smuzhiyun
hpi_instream_read_buf(u32 h_instream,u8 * pb_data,u32 bytes_to_read)922*4882a593Smuzhiyun u16 hpi_instream_read_buf(u32 h_instream, u8 *pb_data, u32 bytes_to_read)
923*4882a593Smuzhiyun {
924*4882a593Smuzhiyun struct hpi_message hm;
925*4882a593Smuzhiyun struct hpi_response hr;
926*4882a593Smuzhiyun
927*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
928*4882a593Smuzhiyun HPI_ISTREAM_READ);
929*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
930*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
931*4882a593Smuzhiyun hm.u.d.u.data.data_size = bytes_to_read;
932*4882a593Smuzhiyun hm.u.d.u.data.pb_data = pb_data;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun return hr.error;
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun
hpi_instream_start(u32 h_instream)939*4882a593Smuzhiyun u16 hpi_instream_start(u32 h_instream)
940*4882a593Smuzhiyun {
941*4882a593Smuzhiyun struct hpi_message hm;
942*4882a593Smuzhiyun struct hpi_response hr;
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
945*4882a593Smuzhiyun HPI_ISTREAM_START);
946*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
947*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
948*4882a593Smuzhiyun
949*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
950*4882a593Smuzhiyun
951*4882a593Smuzhiyun return hr.error;
952*4882a593Smuzhiyun }
953*4882a593Smuzhiyun
hpi_instream_wait_start(u32 h_instream)954*4882a593Smuzhiyun u16 hpi_instream_wait_start(u32 h_instream)
955*4882a593Smuzhiyun {
956*4882a593Smuzhiyun struct hpi_message hm;
957*4882a593Smuzhiyun struct hpi_response hr;
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
960*4882a593Smuzhiyun HPI_ISTREAM_WAIT_START);
961*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
962*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
963*4882a593Smuzhiyun
964*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun return hr.error;
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun
hpi_instream_stop(u32 h_instream)969*4882a593Smuzhiyun u16 hpi_instream_stop(u32 h_instream)
970*4882a593Smuzhiyun {
971*4882a593Smuzhiyun struct hpi_message hm;
972*4882a593Smuzhiyun struct hpi_response hr;
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
975*4882a593Smuzhiyun HPI_ISTREAM_STOP);
976*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
977*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
978*4882a593Smuzhiyun
979*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun return hr.error;
982*4882a593Smuzhiyun }
983*4882a593Smuzhiyun
hpi_instream_reset(u32 h_instream)984*4882a593Smuzhiyun u16 hpi_instream_reset(u32 h_instream)
985*4882a593Smuzhiyun {
986*4882a593Smuzhiyun struct hpi_message hm;
987*4882a593Smuzhiyun struct hpi_response hr;
988*4882a593Smuzhiyun
989*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
990*4882a593Smuzhiyun HPI_ISTREAM_RESET);
991*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
992*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
993*4882a593Smuzhiyun
994*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
995*4882a593Smuzhiyun
996*4882a593Smuzhiyun return hr.error;
997*4882a593Smuzhiyun }
998*4882a593Smuzhiyun
hpi_instream_get_info_ex(u32 h_instream,u16 * pw_state,u32 * pbuffer_size,u32 * pdata_recorded,u32 * psamples_recorded,u32 * pauxiliary_data_recorded)999*4882a593Smuzhiyun u16 hpi_instream_get_info_ex(u32 h_instream, u16 *pw_state, u32 *pbuffer_size,
1000*4882a593Smuzhiyun u32 *pdata_recorded, u32 *psamples_recorded,
1001*4882a593Smuzhiyun u32 *pauxiliary_data_recorded)
1002*4882a593Smuzhiyun {
1003*4882a593Smuzhiyun struct hpi_message hm;
1004*4882a593Smuzhiyun struct hpi_response hr;
1005*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1006*4882a593Smuzhiyun HPI_ISTREAM_GET_INFO);
1007*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1008*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1009*4882a593Smuzhiyun
1010*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyun if (pw_state)
1013*4882a593Smuzhiyun *pw_state = hr.u.d.u.stream_info.state;
1014*4882a593Smuzhiyun if (pbuffer_size)
1015*4882a593Smuzhiyun *pbuffer_size = hr.u.d.u.stream_info.buffer_size;
1016*4882a593Smuzhiyun if (pdata_recorded)
1017*4882a593Smuzhiyun *pdata_recorded = hr.u.d.u.stream_info.data_available;
1018*4882a593Smuzhiyun if (psamples_recorded)
1019*4882a593Smuzhiyun *psamples_recorded = hr.u.d.u.stream_info.samples_transferred;
1020*4882a593Smuzhiyun if (pauxiliary_data_recorded)
1021*4882a593Smuzhiyun *pauxiliary_data_recorded =
1022*4882a593Smuzhiyun hr.u.d.u.stream_info.auxiliary_data_available;
1023*4882a593Smuzhiyun return hr.error;
1024*4882a593Smuzhiyun }
1025*4882a593Smuzhiyun
hpi_instream_ancillary_reset(u32 h_instream,u16 bytes_per_frame,u16 mode,u16 alignment,u16 idle_bit)1026*4882a593Smuzhiyun u16 hpi_instream_ancillary_reset(u32 h_instream, u16 bytes_per_frame,
1027*4882a593Smuzhiyun u16 mode, u16 alignment, u16 idle_bit)
1028*4882a593Smuzhiyun {
1029*4882a593Smuzhiyun struct hpi_message hm;
1030*4882a593Smuzhiyun struct hpi_response hr;
1031*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1032*4882a593Smuzhiyun HPI_ISTREAM_ANC_RESET);
1033*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1034*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1035*4882a593Smuzhiyun hm.u.d.u.data.format.attributes = bytes_per_frame;
1036*4882a593Smuzhiyun hm.u.d.u.data.format.format = (mode << 8) | (alignment & 0xff);
1037*4882a593Smuzhiyun hm.u.d.u.data.format.channels = idle_bit;
1038*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1039*4882a593Smuzhiyun return hr.error;
1040*4882a593Smuzhiyun }
1041*4882a593Smuzhiyun
hpi_instream_ancillary_get_info(u32 h_instream,u32 * pframe_space)1042*4882a593Smuzhiyun u16 hpi_instream_ancillary_get_info(u32 h_instream, u32 *pframe_space)
1043*4882a593Smuzhiyun {
1044*4882a593Smuzhiyun struct hpi_message hm;
1045*4882a593Smuzhiyun struct hpi_response hr;
1046*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1047*4882a593Smuzhiyun HPI_ISTREAM_ANC_GET_INFO);
1048*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1049*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1050*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1051*4882a593Smuzhiyun if (pframe_space)
1052*4882a593Smuzhiyun *pframe_space =
1053*4882a593Smuzhiyun (hr.u.d.u.stream_info.buffer_size -
1054*4882a593Smuzhiyun hr.u.d.u.stream_info.data_available) /
1055*4882a593Smuzhiyun sizeof(struct hpi_anc_frame);
1056*4882a593Smuzhiyun return hr.error;
1057*4882a593Smuzhiyun }
1058*4882a593Smuzhiyun
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)1059*4882a593Smuzhiyun u16 hpi_instream_ancillary_write(u32 h_instream,
1060*4882a593Smuzhiyun const struct hpi_anc_frame *p_anc_frame_buffer,
1061*4882a593Smuzhiyun u32 anc_frame_buffer_size_in_bytes,
1062*4882a593Smuzhiyun u32 number_of_ancillary_frames_to_write)
1063*4882a593Smuzhiyun {
1064*4882a593Smuzhiyun struct hpi_message hm;
1065*4882a593Smuzhiyun struct hpi_response hr;
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1068*4882a593Smuzhiyun HPI_ISTREAM_ANC_WRITE);
1069*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1070*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1071*4882a593Smuzhiyun hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
1072*4882a593Smuzhiyun hm.u.d.u.data.data_size =
1073*4882a593Smuzhiyun number_of_ancillary_frames_to_write *
1074*4882a593Smuzhiyun sizeof(struct hpi_anc_frame);
1075*4882a593Smuzhiyun if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
1076*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1077*4882a593Smuzhiyun else
1078*4882a593Smuzhiyun hr.error = HPI_ERROR_INVALID_DATASIZE;
1079*4882a593Smuzhiyun return hr.error;
1080*4882a593Smuzhiyun }
1081*4882a593Smuzhiyun
hpi_instream_host_buffer_allocate(u32 h_instream,u32 size_in_bytes)1082*4882a593Smuzhiyun u16 hpi_instream_host_buffer_allocate(u32 h_instream, u32 size_in_bytes)
1083*4882a593Smuzhiyun {
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun struct hpi_message hm;
1086*4882a593Smuzhiyun struct hpi_response hr;
1087*4882a593Smuzhiyun
1088*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1089*4882a593Smuzhiyun HPI_ISTREAM_HOSTBUFFER_ALLOC);
1090*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1091*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1092*4882a593Smuzhiyun hm.u.d.u.data.data_size = size_in_bytes;
1093*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1094*4882a593Smuzhiyun return hr.error;
1095*4882a593Smuzhiyun }
1096*4882a593Smuzhiyun
hpi_instream_host_buffer_get_info(u32 h_instream,u8 ** pp_buffer,struct hpi_hostbuffer_status ** pp_status)1097*4882a593Smuzhiyun u16 hpi_instream_host_buffer_get_info(u32 h_instream, u8 **pp_buffer,
1098*4882a593Smuzhiyun struct hpi_hostbuffer_status **pp_status)
1099*4882a593Smuzhiyun {
1100*4882a593Smuzhiyun struct hpi_message hm;
1101*4882a593Smuzhiyun struct hpi_response hr;
1102*4882a593Smuzhiyun
1103*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1104*4882a593Smuzhiyun HPI_ISTREAM_HOSTBUFFER_GET_INFO);
1105*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1106*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1107*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun if (hr.error == 0) {
1110*4882a593Smuzhiyun if (pp_buffer)
1111*4882a593Smuzhiyun *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
1112*4882a593Smuzhiyun if (pp_status)
1113*4882a593Smuzhiyun *pp_status = hr.u.d.u.hostbuffer_info.p_status;
1114*4882a593Smuzhiyun }
1115*4882a593Smuzhiyun return hr.error;
1116*4882a593Smuzhiyun }
1117*4882a593Smuzhiyun
hpi_instream_host_buffer_free(u32 h_instream)1118*4882a593Smuzhiyun u16 hpi_instream_host_buffer_free(u32 h_instream)
1119*4882a593Smuzhiyun {
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun struct hpi_message hm;
1122*4882a593Smuzhiyun struct hpi_response hr;
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1125*4882a593Smuzhiyun HPI_ISTREAM_HOSTBUFFER_FREE);
1126*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1127*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1128*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1129*4882a593Smuzhiyun return hr.error;
1130*4882a593Smuzhiyun }
1131*4882a593Smuzhiyun
hpi_instream_group_add(u32 h_instream,u32 h_stream)1132*4882a593Smuzhiyun u16 hpi_instream_group_add(u32 h_instream, u32 h_stream)
1133*4882a593Smuzhiyun {
1134*4882a593Smuzhiyun struct hpi_message hm;
1135*4882a593Smuzhiyun struct hpi_response hr;
1136*4882a593Smuzhiyun u16 adapter;
1137*4882a593Smuzhiyun char c_obj_type;
1138*4882a593Smuzhiyun
1139*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1140*4882a593Smuzhiyun HPI_ISTREAM_GROUP_ADD);
1141*4882a593Smuzhiyun hr.error = 0;
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1144*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun if (hpi_handle_indexes(h_stream, &adapter,
1147*4882a593Smuzhiyun &hm.u.d.u.stream.stream_index))
1148*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1149*4882a593Smuzhiyun
1150*4882a593Smuzhiyun c_obj_type = hpi_handle_object(h_stream);
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun switch (c_obj_type) {
1153*4882a593Smuzhiyun case HPI_OBJ_OSTREAM:
1154*4882a593Smuzhiyun case HPI_OBJ_ISTREAM:
1155*4882a593Smuzhiyun hm.u.d.u.stream.object_type = c_obj_type;
1156*4882a593Smuzhiyun break;
1157*4882a593Smuzhiyun default:
1158*4882a593Smuzhiyun return HPI_ERROR_INVALID_OBJ;
1159*4882a593Smuzhiyun }
1160*4882a593Smuzhiyun
1161*4882a593Smuzhiyun if (adapter != hm.adapter_index)
1162*4882a593Smuzhiyun return HPI_ERROR_NO_INTERADAPTER_GROUPS;
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1165*4882a593Smuzhiyun return hr.error;
1166*4882a593Smuzhiyun }
1167*4882a593Smuzhiyun
hpi_instream_group_get_map(u32 h_instream,u32 * poutstream_map,u32 * pinstream_map)1168*4882a593Smuzhiyun u16 hpi_instream_group_get_map(u32 h_instream, u32 *poutstream_map,
1169*4882a593Smuzhiyun u32 *pinstream_map)
1170*4882a593Smuzhiyun {
1171*4882a593Smuzhiyun struct hpi_message hm;
1172*4882a593Smuzhiyun struct hpi_response hr;
1173*4882a593Smuzhiyun
1174*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1175*4882a593Smuzhiyun HPI_ISTREAM_HOSTBUFFER_FREE);
1176*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1177*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1178*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun if (poutstream_map)
1181*4882a593Smuzhiyun *poutstream_map = hr.u.d.u.group_info.outstream_group_map;
1182*4882a593Smuzhiyun if (pinstream_map)
1183*4882a593Smuzhiyun *pinstream_map = hr.u.d.u.group_info.instream_group_map;
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun return hr.error;
1186*4882a593Smuzhiyun }
1187*4882a593Smuzhiyun
hpi_instream_group_reset(u32 h_instream)1188*4882a593Smuzhiyun u16 hpi_instream_group_reset(u32 h_instream)
1189*4882a593Smuzhiyun {
1190*4882a593Smuzhiyun struct hpi_message hm;
1191*4882a593Smuzhiyun struct hpi_response hr;
1192*4882a593Smuzhiyun
1193*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
1194*4882a593Smuzhiyun HPI_ISTREAM_GROUP_RESET);
1195*4882a593Smuzhiyun if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
1196*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1197*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1198*4882a593Smuzhiyun return hr.error;
1199*4882a593Smuzhiyun }
1200*4882a593Smuzhiyun
hpi_mixer_open(u16 adapter_index,u32 * ph_mixer)1201*4882a593Smuzhiyun u16 hpi_mixer_open(u16 adapter_index, u32 *ph_mixer)
1202*4882a593Smuzhiyun {
1203*4882a593Smuzhiyun struct hpi_message hm;
1204*4882a593Smuzhiyun struct hpi_response hr;
1205*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN);
1206*4882a593Smuzhiyun hm.adapter_index = adapter_index;
1207*4882a593Smuzhiyun
1208*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun if (hr.error == 0)
1211*4882a593Smuzhiyun *ph_mixer =
1212*4882a593Smuzhiyun hpi_indexes_to_handle(HPI_OBJ_MIXER, adapter_index,
1213*4882a593Smuzhiyun 0);
1214*4882a593Smuzhiyun else
1215*4882a593Smuzhiyun *ph_mixer = 0;
1216*4882a593Smuzhiyun return hr.error;
1217*4882a593Smuzhiyun }
1218*4882a593Smuzhiyun
hpi_mixer_close(u32 h_mixer)1219*4882a593Smuzhiyun u16 hpi_mixer_close(u32 h_mixer)
1220*4882a593Smuzhiyun {
1221*4882a593Smuzhiyun struct hpi_message hm;
1222*4882a593Smuzhiyun struct hpi_response hr;
1223*4882a593Smuzhiyun
1224*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE);
1225*4882a593Smuzhiyun if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1226*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1229*4882a593Smuzhiyun return hr.error;
1230*4882a593Smuzhiyun }
1231*4882a593Smuzhiyun
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)1232*4882a593Smuzhiyun u16 hpi_mixer_get_control(u32 h_mixer, u16 src_node_type,
1233*4882a593Smuzhiyun u16 src_node_type_index, u16 dst_node_type, u16 dst_node_type_index,
1234*4882a593Smuzhiyun u16 control_type, u32 *ph_control)
1235*4882a593Smuzhiyun {
1236*4882a593Smuzhiyun struct hpi_message hm;
1237*4882a593Smuzhiyun struct hpi_response hr;
1238*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
1239*4882a593Smuzhiyun HPI_MIXER_GET_CONTROL);
1240*4882a593Smuzhiyun if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1241*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1242*4882a593Smuzhiyun hm.u.m.node_type1 = src_node_type;
1243*4882a593Smuzhiyun hm.u.m.node_index1 = src_node_type_index;
1244*4882a593Smuzhiyun hm.u.m.node_type2 = dst_node_type;
1245*4882a593Smuzhiyun hm.u.m.node_index2 = dst_node_type_index;
1246*4882a593Smuzhiyun hm.u.m.control_type = control_type;
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1249*4882a593Smuzhiyun
1250*4882a593Smuzhiyun if (hr.error == 0)
1251*4882a593Smuzhiyun *ph_control =
1252*4882a593Smuzhiyun hpi_indexes_to_handle(HPI_OBJ_CONTROL,
1253*4882a593Smuzhiyun hm.adapter_index, hr.u.m.control_index);
1254*4882a593Smuzhiyun else
1255*4882a593Smuzhiyun *ph_control = 0;
1256*4882a593Smuzhiyun return hr.error;
1257*4882a593Smuzhiyun }
1258*4882a593Smuzhiyun
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)1259*4882a593Smuzhiyun u16 hpi_mixer_get_control_by_index(u32 h_mixer, u16 control_index,
1260*4882a593Smuzhiyun u16 *pw_src_node_type, u16 *pw_src_node_index, u16 *pw_dst_node_type,
1261*4882a593Smuzhiyun u16 *pw_dst_node_index, u16 *pw_control_type, u32 *ph_control)
1262*4882a593Smuzhiyun {
1263*4882a593Smuzhiyun struct hpi_message hm;
1264*4882a593Smuzhiyun struct hpi_response hr;
1265*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
1266*4882a593Smuzhiyun HPI_MIXER_GET_CONTROL_BY_INDEX);
1267*4882a593Smuzhiyun if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1268*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1269*4882a593Smuzhiyun hm.u.m.control_index = control_index;
1270*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1271*4882a593Smuzhiyun
1272*4882a593Smuzhiyun if (pw_src_node_type) {
1273*4882a593Smuzhiyun *pw_src_node_type =
1274*4882a593Smuzhiyun hr.u.m.src_node_type + HPI_SOURCENODE_NONE;
1275*4882a593Smuzhiyun *pw_src_node_index = hr.u.m.src_node_index;
1276*4882a593Smuzhiyun *pw_dst_node_type = hr.u.m.dst_node_type + HPI_DESTNODE_NONE;
1277*4882a593Smuzhiyun *pw_dst_node_index = hr.u.m.dst_node_index;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun if (pw_control_type)
1280*4882a593Smuzhiyun *pw_control_type = hr.u.m.control_index;
1281*4882a593Smuzhiyun
1282*4882a593Smuzhiyun if (ph_control) {
1283*4882a593Smuzhiyun if (hr.error == 0)
1284*4882a593Smuzhiyun *ph_control =
1285*4882a593Smuzhiyun hpi_indexes_to_handle(HPI_OBJ_CONTROL,
1286*4882a593Smuzhiyun hm.adapter_index, control_index);
1287*4882a593Smuzhiyun else
1288*4882a593Smuzhiyun *ph_control = 0;
1289*4882a593Smuzhiyun }
1290*4882a593Smuzhiyun return hr.error;
1291*4882a593Smuzhiyun }
1292*4882a593Smuzhiyun
hpi_mixer_store(u32 h_mixer,enum HPI_MIXER_STORE_COMMAND command,u16 index)1293*4882a593Smuzhiyun u16 hpi_mixer_store(u32 h_mixer, enum HPI_MIXER_STORE_COMMAND command,
1294*4882a593Smuzhiyun u16 index)
1295*4882a593Smuzhiyun {
1296*4882a593Smuzhiyun struct hpi_message hm;
1297*4882a593Smuzhiyun struct hpi_response hr;
1298*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_STORE);
1299*4882a593Smuzhiyun if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
1300*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1301*4882a593Smuzhiyun hm.u.mx.store.command = command;
1302*4882a593Smuzhiyun hm.u.mx.store.index = index;
1303*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1304*4882a593Smuzhiyun return hr.error;
1305*4882a593Smuzhiyun }
1306*4882a593Smuzhiyun
1307*4882a593Smuzhiyun static
hpi_control_param_set(const u32 h_control,const u16 attrib,const u32 param1,const u32 param2)1308*4882a593Smuzhiyun u16 hpi_control_param_set(const u32 h_control, const u16 attrib,
1309*4882a593Smuzhiyun const u32 param1, const u32 param2)
1310*4882a593Smuzhiyun {
1311*4882a593Smuzhiyun struct hpi_message hm;
1312*4882a593Smuzhiyun struct hpi_response hr;
1313*4882a593Smuzhiyun
1314*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1315*4882a593Smuzhiyun HPI_CONTROL_SET_STATE);
1316*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1317*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1318*4882a593Smuzhiyun hm.u.c.attribute = attrib;
1319*4882a593Smuzhiyun hm.u.c.param1 = param1;
1320*4882a593Smuzhiyun hm.u.c.param2 = param2;
1321*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1322*4882a593Smuzhiyun return hr.error;
1323*4882a593Smuzhiyun }
1324*4882a593Smuzhiyun
hpi_control_log_set2(u32 h_control,u16 attrib,short sv0,short sv1)1325*4882a593Smuzhiyun static u16 hpi_control_log_set2(u32 h_control, u16 attrib, short sv0,
1326*4882a593Smuzhiyun short sv1)
1327*4882a593Smuzhiyun {
1328*4882a593Smuzhiyun struct hpi_message hm;
1329*4882a593Smuzhiyun struct hpi_response hr;
1330*4882a593Smuzhiyun
1331*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1332*4882a593Smuzhiyun HPI_CONTROL_SET_STATE);
1333*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1334*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1335*4882a593Smuzhiyun hm.u.c.attribute = attrib;
1336*4882a593Smuzhiyun hm.u.c.an_log_value[0] = sv0;
1337*4882a593Smuzhiyun hm.u.c.an_log_value[1] = sv1;
1338*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1339*4882a593Smuzhiyun return hr.error;
1340*4882a593Smuzhiyun }
1341*4882a593Smuzhiyun
1342*4882a593Smuzhiyun static
hpi_control_param_get(const u32 h_control,const u16 attrib,u32 param1,u32 param2,u32 * pparam1,u32 * pparam2)1343*4882a593Smuzhiyun u16 hpi_control_param_get(const u32 h_control, const u16 attrib, u32 param1,
1344*4882a593Smuzhiyun u32 param2, u32 *pparam1, u32 *pparam2)
1345*4882a593Smuzhiyun {
1346*4882a593Smuzhiyun struct hpi_message hm;
1347*4882a593Smuzhiyun struct hpi_response hr;
1348*4882a593Smuzhiyun
1349*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1350*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1351*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1352*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1353*4882a593Smuzhiyun hm.u.c.attribute = attrib;
1354*4882a593Smuzhiyun hm.u.c.param1 = param1;
1355*4882a593Smuzhiyun hm.u.c.param2 = param2;
1356*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1357*4882a593Smuzhiyun
1358*4882a593Smuzhiyun *pparam1 = hr.u.c.param1;
1359*4882a593Smuzhiyun if (pparam2)
1360*4882a593Smuzhiyun *pparam2 = hr.u.c.param2;
1361*4882a593Smuzhiyun
1362*4882a593Smuzhiyun return hr.error;
1363*4882a593Smuzhiyun }
1364*4882a593Smuzhiyun
1365*4882a593Smuzhiyun #define hpi_control_param1_get(h, a, p1) \
1366*4882a593Smuzhiyun hpi_control_param_get(h, a, 0, 0, p1, NULL)
1367*4882a593Smuzhiyun #define hpi_control_param2_get(h, a, p1, p2) \
1368*4882a593Smuzhiyun hpi_control_param_get(h, a, 0, 0, p1, p2)
1369*4882a593Smuzhiyun
hpi_control_log_get2(u32 h_control,u16 attrib,short * sv0,short * sv1)1370*4882a593Smuzhiyun static u16 hpi_control_log_get2(u32 h_control, u16 attrib, short *sv0,
1371*4882a593Smuzhiyun short *sv1)
1372*4882a593Smuzhiyun {
1373*4882a593Smuzhiyun struct hpi_message hm;
1374*4882a593Smuzhiyun struct hpi_response hr;
1375*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1376*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1377*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1378*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1379*4882a593Smuzhiyun hm.u.c.attribute = attrib;
1380*4882a593Smuzhiyun
1381*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1382*4882a593Smuzhiyun *sv0 = hr.u.c.an_log_value[0];
1383*4882a593Smuzhiyun if (sv1)
1384*4882a593Smuzhiyun *sv1 = hr.u.c.an_log_value[1];
1385*4882a593Smuzhiyun return hr.error;
1386*4882a593Smuzhiyun }
1387*4882a593Smuzhiyun
1388*4882a593Smuzhiyun static
hpi_control_query(const u32 h_control,const u16 attrib,const u32 index,const u32 param,u32 * psetting)1389*4882a593Smuzhiyun u16 hpi_control_query(const u32 h_control, const u16 attrib, const u32 index,
1390*4882a593Smuzhiyun const u32 param, u32 *psetting)
1391*4882a593Smuzhiyun {
1392*4882a593Smuzhiyun struct hpi_message hm;
1393*4882a593Smuzhiyun struct hpi_response hr;
1394*4882a593Smuzhiyun
1395*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1396*4882a593Smuzhiyun HPI_CONTROL_GET_INFO);
1397*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1398*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1399*4882a593Smuzhiyun
1400*4882a593Smuzhiyun hm.u.c.attribute = attrib;
1401*4882a593Smuzhiyun hm.u.c.param1 = index;
1402*4882a593Smuzhiyun hm.u.c.param2 = param;
1403*4882a593Smuzhiyun
1404*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1405*4882a593Smuzhiyun *psetting = hr.u.c.param1;
1406*4882a593Smuzhiyun
1407*4882a593Smuzhiyun return hr.error;
1408*4882a593Smuzhiyun }
1409*4882a593Smuzhiyun
hpi_control_get_string(const u32 h_control,const u16 attribute,char * psz_string,const u32 string_length)1410*4882a593Smuzhiyun static u16 hpi_control_get_string(const u32 h_control, const u16 attribute,
1411*4882a593Smuzhiyun char *psz_string, const u32 string_length)
1412*4882a593Smuzhiyun {
1413*4882a593Smuzhiyun unsigned int sub_string_index = 0, j = 0;
1414*4882a593Smuzhiyun char c = 0;
1415*4882a593Smuzhiyun unsigned int n = 0;
1416*4882a593Smuzhiyun u16 err = 0;
1417*4882a593Smuzhiyun
1418*4882a593Smuzhiyun if ((string_length < 1) || (string_length > 256))
1419*4882a593Smuzhiyun return HPI_ERROR_INVALID_CONTROL_VALUE;
1420*4882a593Smuzhiyun for (sub_string_index = 0; sub_string_index < string_length;
1421*4882a593Smuzhiyun sub_string_index += 8) {
1422*4882a593Smuzhiyun struct hpi_message hm;
1423*4882a593Smuzhiyun struct hpi_response hr;
1424*4882a593Smuzhiyun
1425*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1426*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1427*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index,
1428*4882a593Smuzhiyun &hm.obj_index))
1429*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1430*4882a593Smuzhiyun hm.u.c.attribute = attribute;
1431*4882a593Smuzhiyun hm.u.c.param1 = sub_string_index;
1432*4882a593Smuzhiyun hm.u.c.param2 = 0;
1433*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1434*4882a593Smuzhiyun
1435*4882a593Smuzhiyun if (sub_string_index == 0
1436*4882a593Smuzhiyun && (hr.u.cu.chars8.remaining_chars + 8) >
1437*4882a593Smuzhiyun string_length)
1438*4882a593Smuzhiyun return HPI_ERROR_INVALID_CONTROL_VALUE;
1439*4882a593Smuzhiyun
1440*4882a593Smuzhiyun if (hr.error) {
1441*4882a593Smuzhiyun err = hr.error;
1442*4882a593Smuzhiyun break;
1443*4882a593Smuzhiyun }
1444*4882a593Smuzhiyun for (j = 0; j < 8; j++) {
1445*4882a593Smuzhiyun c = hr.u.cu.chars8.sz_data[j];
1446*4882a593Smuzhiyun psz_string[sub_string_index + j] = c;
1447*4882a593Smuzhiyun n++;
1448*4882a593Smuzhiyun if (n >= string_length) {
1449*4882a593Smuzhiyun psz_string[string_length - 1] = 0;
1450*4882a593Smuzhiyun err = HPI_ERROR_INVALID_CONTROL_VALUE;
1451*4882a593Smuzhiyun break;
1452*4882a593Smuzhiyun }
1453*4882a593Smuzhiyun if (c == 0)
1454*4882a593Smuzhiyun break;
1455*4882a593Smuzhiyun }
1456*4882a593Smuzhiyun
1457*4882a593Smuzhiyun if ((hr.u.cu.chars8.remaining_chars == 0)
1458*4882a593Smuzhiyun && ((sub_string_index + j) < string_length)
1459*4882a593Smuzhiyun && (c != 0)) {
1460*4882a593Smuzhiyun c = 0;
1461*4882a593Smuzhiyun psz_string[sub_string_index + j] = c;
1462*4882a593Smuzhiyun }
1463*4882a593Smuzhiyun if (c == 0)
1464*4882a593Smuzhiyun break;
1465*4882a593Smuzhiyun }
1466*4882a593Smuzhiyun return err;
1467*4882a593Smuzhiyun }
1468*4882a593Smuzhiyun
hpi_aesebu_receiver_query_format(const u32 h_aes_rx,const u32 index,u16 * pw_format)1469*4882a593Smuzhiyun u16 hpi_aesebu_receiver_query_format(const u32 h_aes_rx, const u32 index,
1470*4882a593Smuzhiyun u16 *pw_format)
1471*4882a593Smuzhiyun {
1472*4882a593Smuzhiyun u32 qr;
1473*4882a593Smuzhiyun u16 err;
1474*4882a593Smuzhiyun
1475*4882a593Smuzhiyun err = hpi_control_query(h_aes_rx, HPI_AESEBURX_FORMAT, index, 0, &qr);
1476*4882a593Smuzhiyun *pw_format = (u16)qr;
1477*4882a593Smuzhiyun return err;
1478*4882a593Smuzhiyun }
1479*4882a593Smuzhiyun
hpi_aesebu_receiver_set_format(u32 h_control,u16 format)1480*4882a593Smuzhiyun u16 hpi_aesebu_receiver_set_format(u32 h_control, u16 format)
1481*4882a593Smuzhiyun {
1482*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_AESEBURX_FORMAT, format,
1483*4882a593Smuzhiyun 0);
1484*4882a593Smuzhiyun }
1485*4882a593Smuzhiyun
hpi_aesebu_receiver_get_format(u32 h_control,u16 * pw_format)1486*4882a593Smuzhiyun u16 hpi_aesebu_receiver_get_format(u32 h_control, u16 *pw_format)
1487*4882a593Smuzhiyun {
1488*4882a593Smuzhiyun u16 err;
1489*4882a593Smuzhiyun u32 param;
1490*4882a593Smuzhiyun
1491*4882a593Smuzhiyun err = hpi_control_param1_get(h_control, HPI_AESEBURX_FORMAT, ¶m);
1492*4882a593Smuzhiyun if (!err && pw_format)
1493*4882a593Smuzhiyun *pw_format = (u16)param;
1494*4882a593Smuzhiyun
1495*4882a593Smuzhiyun return err;
1496*4882a593Smuzhiyun }
1497*4882a593Smuzhiyun
hpi_aesebu_receiver_get_sample_rate(u32 h_control,u32 * psample_rate)1498*4882a593Smuzhiyun u16 hpi_aesebu_receiver_get_sample_rate(u32 h_control, u32 *psample_rate)
1499*4882a593Smuzhiyun {
1500*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_AESEBURX_SAMPLERATE,
1501*4882a593Smuzhiyun psample_rate);
1502*4882a593Smuzhiyun }
1503*4882a593Smuzhiyun
hpi_aesebu_receiver_get_user_data(u32 h_control,u16 index,u16 * pw_data)1504*4882a593Smuzhiyun u16 hpi_aesebu_receiver_get_user_data(u32 h_control, u16 index, u16 *pw_data)
1505*4882a593Smuzhiyun {
1506*4882a593Smuzhiyun struct hpi_message hm;
1507*4882a593Smuzhiyun struct hpi_response hr;
1508*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1509*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1510*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1511*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1512*4882a593Smuzhiyun hm.u.c.attribute = HPI_AESEBURX_USERDATA;
1513*4882a593Smuzhiyun hm.u.c.param1 = index;
1514*4882a593Smuzhiyun
1515*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1516*4882a593Smuzhiyun
1517*4882a593Smuzhiyun if (pw_data)
1518*4882a593Smuzhiyun *pw_data = (u16)hr.u.c.param2;
1519*4882a593Smuzhiyun return hr.error;
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun
hpi_aesebu_receiver_get_channel_status(u32 h_control,u16 index,u16 * pw_data)1522*4882a593Smuzhiyun u16 hpi_aesebu_receiver_get_channel_status(u32 h_control, u16 index,
1523*4882a593Smuzhiyun u16 *pw_data)
1524*4882a593Smuzhiyun {
1525*4882a593Smuzhiyun struct hpi_message hm;
1526*4882a593Smuzhiyun struct hpi_response hr;
1527*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1528*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1529*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1530*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1531*4882a593Smuzhiyun hm.u.c.attribute = HPI_AESEBURX_CHANNELSTATUS;
1532*4882a593Smuzhiyun hm.u.c.param1 = index;
1533*4882a593Smuzhiyun
1534*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1535*4882a593Smuzhiyun
1536*4882a593Smuzhiyun if (pw_data)
1537*4882a593Smuzhiyun *pw_data = (u16)hr.u.c.param2;
1538*4882a593Smuzhiyun return hr.error;
1539*4882a593Smuzhiyun }
1540*4882a593Smuzhiyun
hpi_aesebu_receiver_get_error_status(u32 h_control,u16 * pw_error_data)1541*4882a593Smuzhiyun u16 hpi_aesebu_receiver_get_error_status(u32 h_control, u16 *pw_error_data)
1542*4882a593Smuzhiyun {
1543*4882a593Smuzhiyun u32 error_data = 0;
1544*4882a593Smuzhiyun u16 err = 0;
1545*4882a593Smuzhiyun
1546*4882a593Smuzhiyun err = hpi_control_param1_get(h_control, HPI_AESEBURX_ERRORSTATUS,
1547*4882a593Smuzhiyun &error_data);
1548*4882a593Smuzhiyun if (pw_error_data)
1549*4882a593Smuzhiyun *pw_error_data = (u16)error_data;
1550*4882a593Smuzhiyun return err;
1551*4882a593Smuzhiyun }
1552*4882a593Smuzhiyun
hpi_aesebu_transmitter_set_sample_rate(u32 h_control,u32 sample_rate)1553*4882a593Smuzhiyun u16 hpi_aesebu_transmitter_set_sample_rate(u32 h_control, u32 sample_rate)
1554*4882a593Smuzhiyun {
1555*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_AESEBUTX_SAMPLERATE,
1556*4882a593Smuzhiyun sample_rate, 0);
1557*4882a593Smuzhiyun }
1558*4882a593Smuzhiyun
hpi_aesebu_transmitter_set_user_data(u32 h_control,u16 index,u16 data)1559*4882a593Smuzhiyun u16 hpi_aesebu_transmitter_set_user_data(u32 h_control, u16 index, u16 data)
1560*4882a593Smuzhiyun {
1561*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_AESEBUTX_USERDATA, index,
1562*4882a593Smuzhiyun data);
1563*4882a593Smuzhiyun }
1564*4882a593Smuzhiyun
hpi_aesebu_transmitter_set_channel_status(u32 h_control,u16 index,u16 data)1565*4882a593Smuzhiyun u16 hpi_aesebu_transmitter_set_channel_status(u32 h_control, u16 index,
1566*4882a593Smuzhiyun u16 data)
1567*4882a593Smuzhiyun {
1568*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_AESEBUTX_CHANNELSTATUS,
1569*4882a593Smuzhiyun index, data);
1570*4882a593Smuzhiyun }
1571*4882a593Smuzhiyun
hpi_aesebu_transmitter_get_channel_status(u32 h_control,u16 index,u16 * pw_data)1572*4882a593Smuzhiyun u16 hpi_aesebu_transmitter_get_channel_status(u32 h_control, u16 index,
1573*4882a593Smuzhiyun u16 *pw_data)
1574*4882a593Smuzhiyun {
1575*4882a593Smuzhiyun return HPI_ERROR_INVALID_OPERATION;
1576*4882a593Smuzhiyun }
1577*4882a593Smuzhiyun
hpi_aesebu_transmitter_query_format(const u32 h_aes_tx,const u32 index,u16 * pw_format)1578*4882a593Smuzhiyun u16 hpi_aesebu_transmitter_query_format(const u32 h_aes_tx, const u32 index,
1579*4882a593Smuzhiyun u16 *pw_format)
1580*4882a593Smuzhiyun {
1581*4882a593Smuzhiyun u32 qr;
1582*4882a593Smuzhiyun u16 err;
1583*4882a593Smuzhiyun
1584*4882a593Smuzhiyun err = hpi_control_query(h_aes_tx, HPI_AESEBUTX_FORMAT, index, 0, &qr);
1585*4882a593Smuzhiyun *pw_format = (u16)qr;
1586*4882a593Smuzhiyun return err;
1587*4882a593Smuzhiyun }
1588*4882a593Smuzhiyun
hpi_aesebu_transmitter_set_format(u32 h_control,u16 output_format)1589*4882a593Smuzhiyun u16 hpi_aesebu_transmitter_set_format(u32 h_control, u16 output_format)
1590*4882a593Smuzhiyun {
1591*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_AESEBUTX_FORMAT,
1592*4882a593Smuzhiyun output_format, 0);
1593*4882a593Smuzhiyun }
1594*4882a593Smuzhiyun
hpi_aesebu_transmitter_get_format(u32 h_control,u16 * pw_output_format)1595*4882a593Smuzhiyun u16 hpi_aesebu_transmitter_get_format(u32 h_control, u16 *pw_output_format)
1596*4882a593Smuzhiyun {
1597*4882a593Smuzhiyun u16 err;
1598*4882a593Smuzhiyun u32 param;
1599*4882a593Smuzhiyun
1600*4882a593Smuzhiyun err = hpi_control_param1_get(h_control, HPI_AESEBUTX_FORMAT, ¶m);
1601*4882a593Smuzhiyun if (!err && pw_output_format)
1602*4882a593Smuzhiyun *pw_output_format = (u16)param;
1603*4882a593Smuzhiyun
1604*4882a593Smuzhiyun return err;
1605*4882a593Smuzhiyun }
1606*4882a593Smuzhiyun
hpi_bitstream_set_clock_edge(u32 h_control,u16 edge_type)1607*4882a593Smuzhiyun u16 hpi_bitstream_set_clock_edge(u32 h_control, u16 edge_type)
1608*4882a593Smuzhiyun {
1609*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_BITSTREAM_CLOCK_EDGE,
1610*4882a593Smuzhiyun edge_type, 0);
1611*4882a593Smuzhiyun }
1612*4882a593Smuzhiyun
hpi_bitstream_set_data_polarity(u32 h_control,u16 polarity)1613*4882a593Smuzhiyun u16 hpi_bitstream_set_data_polarity(u32 h_control, u16 polarity)
1614*4882a593Smuzhiyun {
1615*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_BITSTREAM_DATA_POLARITY,
1616*4882a593Smuzhiyun polarity, 0);
1617*4882a593Smuzhiyun }
1618*4882a593Smuzhiyun
hpi_bitstream_get_activity(u32 h_control,u16 * pw_clk_activity,u16 * pw_data_activity)1619*4882a593Smuzhiyun u16 hpi_bitstream_get_activity(u32 h_control, u16 *pw_clk_activity,
1620*4882a593Smuzhiyun u16 *pw_data_activity)
1621*4882a593Smuzhiyun {
1622*4882a593Smuzhiyun struct hpi_message hm;
1623*4882a593Smuzhiyun struct hpi_response hr;
1624*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1625*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1626*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1627*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1628*4882a593Smuzhiyun hm.u.c.attribute = HPI_BITSTREAM_ACTIVITY;
1629*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1630*4882a593Smuzhiyun if (pw_clk_activity)
1631*4882a593Smuzhiyun *pw_clk_activity = (u16)hr.u.c.param1;
1632*4882a593Smuzhiyun if (pw_data_activity)
1633*4882a593Smuzhiyun *pw_data_activity = (u16)hr.u.c.param2;
1634*4882a593Smuzhiyun return hr.error;
1635*4882a593Smuzhiyun }
1636*4882a593Smuzhiyun
hpi_channel_mode_query_mode(const u32 h_mode,const u32 index,u16 * pw_mode)1637*4882a593Smuzhiyun u16 hpi_channel_mode_query_mode(const u32 h_mode, const u32 index,
1638*4882a593Smuzhiyun u16 *pw_mode)
1639*4882a593Smuzhiyun {
1640*4882a593Smuzhiyun u32 qr;
1641*4882a593Smuzhiyun u16 err;
1642*4882a593Smuzhiyun
1643*4882a593Smuzhiyun err = hpi_control_query(h_mode, HPI_CHANNEL_MODE_MODE, index, 0, &qr);
1644*4882a593Smuzhiyun *pw_mode = (u16)qr;
1645*4882a593Smuzhiyun return err;
1646*4882a593Smuzhiyun }
1647*4882a593Smuzhiyun
hpi_channel_mode_set(u32 h_control,u16 mode)1648*4882a593Smuzhiyun u16 hpi_channel_mode_set(u32 h_control, u16 mode)
1649*4882a593Smuzhiyun {
1650*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_CHANNEL_MODE_MODE, mode,
1651*4882a593Smuzhiyun 0);
1652*4882a593Smuzhiyun }
1653*4882a593Smuzhiyun
hpi_channel_mode_get(u32 h_control,u16 * mode)1654*4882a593Smuzhiyun u16 hpi_channel_mode_get(u32 h_control, u16 *mode)
1655*4882a593Smuzhiyun {
1656*4882a593Smuzhiyun u32 mode32 = 0;
1657*4882a593Smuzhiyun u16 err = hpi_control_param1_get(h_control,
1658*4882a593Smuzhiyun HPI_CHANNEL_MODE_MODE, &mode32);
1659*4882a593Smuzhiyun if (mode)
1660*4882a593Smuzhiyun *mode = (u16)mode32;
1661*4882a593Smuzhiyun return err;
1662*4882a593Smuzhiyun }
1663*4882a593Smuzhiyun
hpi_cobranet_hmi_write(u32 h_control,u32 hmi_address,u32 byte_count,u8 * pb_data)1664*4882a593Smuzhiyun u16 hpi_cobranet_hmi_write(u32 h_control, u32 hmi_address, u32 byte_count,
1665*4882a593Smuzhiyun u8 *pb_data)
1666*4882a593Smuzhiyun {
1667*4882a593Smuzhiyun struct hpi_msg_cobranet_hmiwrite hm;
1668*4882a593Smuzhiyun struct hpi_response_header hr;
1669*4882a593Smuzhiyun
1670*4882a593Smuzhiyun hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr, sizeof(hr),
1671*4882a593Smuzhiyun HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE);
1672*4882a593Smuzhiyun
1673*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.h.adapter_index,
1674*4882a593Smuzhiyun &hm.h.obj_index))
1675*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1676*4882a593Smuzhiyun
1677*4882a593Smuzhiyun if (byte_count > sizeof(hm.bytes))
1678*4882a593Smuzhiyun return HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL;
1679*4882a593Smuzhiyun
1680*4882a593Smuzhiyun hm.p.attribute = HPI_COBRANET_SET;
1681*4882a593Smuzhiyun hm.p.byte_count = byte_count;
1682*4882a593Smuzhiyun hm.p.hmi_address = hmi_address;
1683*4882a593Smuzhiyun memcpy(hm.bytes, pb_data, byte_count);
1684*4882a593Smuzhiyun hm.h.size = (u16)(sizeof(hm.h) + sizeof(hm.p) + byte_count);
1685*4882a593Smuzhiyun
1686*4882a593Smuzhiyun hpi_send_recvV1(&hm.h, &hr);
1687*4882a593Smuzhiyun return hr.error;
1688*4882a593Smuzhiyun }
1689*4882a593Smuzhiyun
hpi_cobranet_hmi_read(u32 h_control,u32 hmi_address,u32 max_byte_count,u32 * pbyte_count,u8 * pb_data)1690*4882a593Smuzhiyun u16 hpi_cobranet_hmi_read(u32 h_control, u32 hmi_address, u32 max_byte_count,
1691*4882a593Smuzhiyun u32 *pbyte_count, u8 *pb_data)
1692*4882a593Smuzhiyun {
1693*4882a593Smuzhiyun struct hpi_msg_cobranet_hmiread hm;
1694*4882a593Smuzhiyun struct hpi_res_cobranet_hmiread hr;
1695*4882a593Smuzhiyun
1696*4882a593Smuzhiyun hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr.h, sizeof(hr),
1697*4882a593Smuzhiyun HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE);
1698*4882a593Smuzhiyun
1699*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.h.adapter_index,
1700*4882a593Smuzhiyun &hm.h.obj_index))
1701*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1702*4882a593Smuzhiyun
1703*4882a593Smuzhiyun if (max_byte_count > sizeof(hr.bytes))
1704*4882a593Smuzhiyun return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
1705*4882a593Smuzhiyun
1706*4882a593Smuzhiyun hm.p.attribute = HPI_COBRANET_GET;
1707*4882a593Smuzhiyun hm.p.byte_count = max_byte_count;
1708*4882a593Smuzhiyun hm.p.hmi_address = hmi_address;
1709*4882a593Smuzhiyun
1710*4882a593Smuzhiyun hpi_send_recvV1(&hm.h, &hr.h);
1711*4882a593Smuzhiyun
1712*4882a593Smuzhiyun if (!hr.h.error && pb_data) {
1713*4882a593Smuzhiyun if (hr.byte_count > sizeof(hr.bytes))
1714*4882a593Smuzhiyun
1715*4882a593Smuzhiyun return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
1716*4882a593Smuzhiyun
1717*4882a593Smuzhiyun *pbyte_count = hr.byte_count;
1718*4882a593Smuzhiyun
1719*4882a593Smuzhiyun if (hr.byte_count < max_byte_count)
1720*4882a593Smuzhiyun max_byte_count = *pbyte_count;
1721*4882a593Smuzhiyun
1722*4882a593Smuzhiyun memcpy(pb_data, hr.bytes, max_byte_count);
1723*4882a593Smuzhiyun }
1724*4882a593Smuzhiyun return hr.h.error;
1725*4882a593Smuzhiyun }
1726*4882a593Smuzhiyun
hpi_cobranet_hmi_get_status(u32 h_control,u32 * pstatus,u32 * preadable_size,u32 * pwriteable_size)1727*4882a593Smuzhiyun u16 hpi_cobranet_hmi_get_status(u32 h_control, u32 *pstatus,
1728*4882a593Smuzhiyun u32 *preadable_size, u32 *pwriteable_size)
1729*4882a593Smuzhiyun {
1730*4882a593Smuzhiyun struct hpi_message hm;
1731*4882a593Smuzhiyun struct hpi_response hr;
1732*4882a593Smuzhiyun
1733*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1734*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1735*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1736*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1737*4882a593Smuzhiyun
1738*4882a593Smuzhiyun hm.u.c.attribute = HPI_COBRANET_GET_STATUS;
1739*4882a593Smuzhiyun
1740*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1741*4882a593Smuzhiyun if (!hr.error) {
1742*4882a593Smuzhiyun if (pstatus)
1743*4882a593Smuzhiyun *pstatus = hr.u.cu.cobranet.status.status;
1744*4882a593Smuzhiyun if (preadable_size)
1745*4882a593Smuzhiyun *preadable_size =
1746*4882a593Smuzhiyun hr.u.cu.cobranet.status.readable_size;
1747*4882a593Smuzhiyun if (pwriteable_size)
1748*4882a593Smuzhiyun *pwriteable_size =
1749*4882a593Smuzhiyun hr.u.cu.cobranet.status.writeable_size;
1750*4882a593Smuzhiyun }
1751*4882a593Smuzhiyun return hr.error;
1752*4882a593Smuzhiyun }
1753*4882a593Smuzhiyun
hpi_cobranet_get_ip_address(u32 h_control,u32 * pdw_ip_address)1754*4882a593Smuzhiyun u16 hpi_cobranet_get_ip_address(u32 h_control, u32 *pdw_ip_address)
1755*4882a593Smuzhiyun {
1756*4882a593Smuzhiyun u32 byte_count;
1757*4882a593Smuzhiyun u32 iP;
1758*4882a593Smuzhiyun u16 err;
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun err = hpi_cobranet_hmi_read(h_control,
1761*4882a593Smuzhiyun HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count,
1762*4882a593Smuzhiyun (u8 *)&iP);
1763*4882a593Smuzhiyun
1764*4882a593Smuzhiyun *pdw_ip_address =
1765*4882a593Smuzhiyun ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1766*4882a593Smuzhiyun 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1767*4882a593Smuzhiyun
1768*4882a593Smuzhiyun if (err)
1769*4882a593Smuzhiyun *pdw_ip_address = 0;
1770*4882a593Smuzhiyun
1771*4882a593Smuzhiyun return err;
1772*4882a593Smuzhiyun
1773*4882a593Smuzhiyun }
1774*4882a593Smuzhiyun
hpi_cobranet_set_ip_address(u32 h_control,u32 dw_ip_address)1775*4882a593Smuzhiyun u16 hpi_cobranet_set_ip_address(u32 h_control, u32 dw_ip_address)
1776*4882a593Smuzhiyun {
1777*4882a593Smuzhiyun u32 iP;
1778*4882a593Smuzhiyun u16 err;
1779*4882a593Smuzhiyun
1780*4882a593Smuzhiyun iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1781*4882a593Smuzhiyun 0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1782*4882a593Smuzhiyun 8) | ((dw_ip_address & 0x000000ff) << 8);
1783*4882a593Smuzhiyun
1784*4882a593Smuzhiyun err = hpi_cobranet_hmi_write(h_control,
1785*4882a593Smuzhiyun HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP);
1786*4882a593Smuzhiyun
1787*4882a593Smuzhiyun return err;
1788*4882a593Smuzhiyun
1789*4882a593Smuzhiyun }
1790*4882a593Smuzhiyun
hpi_cobranet_get_static_ip_address(u32 h_control,u32 * pdw_ip_address)1791*4882a593Smuzhiyun u16 hpi_cobranet_get_static_ip_address(u32 h_control, u32 *pdw_ip_address)
1792*4882a593Smuzhiyun {
1793*4882a593Smuzhiyun u32 byte_count;
1794*4882a593Smuzhiyun u32 iP;
1795*4882a593Smuzhiyun u16 err;
1796*4882a593Smuzhiyun err = hpi_cobranet_hmi_read(h_control,
1797*4882a593Smuzhiyun HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count,
1798*4882a593Smuzhiyun (u8 *)&iP);
1799*4882a593Smuzhiyun
1800*4882a593Smuzhiyun *pdw_ip_address =
1801*4882a593Smuzhiyun ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1802*4882a593Smuzhiyun 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1803*4882a593Smuzhiyun
1804*4882a593Smuzhiyun if (err)
1805*4882a593Smuzhiyun *pdw_ip_address = 0;
1806*4882a593Smuzhiyun
1807*4882a593Smuzhiyun return err;
1808*4882a593Smuzhiyun
1809*4882a593Smuzhiyun }
1810*4882a593Smuzhiyun
hpi_cobranet_set_static_ip_address(u32 h_control,u32 dw_ip_address)1811*4882a593Smuzhiyun u16 hpi_cobranet_set_static_ip_address(u32 h_control, u32 dw_ip_address)
1812*4882a593Smuzhiyun {
1813*4882a593Smuzhiyun u32 iP;
1814*4882a593Smuzhiyun u16 err;
1815*4882a593Smuzhiyun
1816*4882a593Smuzhiyun iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1817*4882a593Smuzhiyun 0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1818*4882a593Smuzhiyun 8) | ((dw_ip_address & 0x000000ff) << 8);
1819*4882a593Smuzhiyun
1820*4882a593Smuzhiyun err = hpi_cobranet_hmi_write(h_control,
1821*4882a593Smuzhiyun HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP);
1822*4882a593Smuzhiyun
1823*4882a593Smuzhiyun return err;
1824*4882a593Smuzhiyun
1825*4882a593Smuzhiyun }
1826*4882a593Smuzhiyun
hpi_cobranet_get_macaddress(u32 h_control,u32 * p_mac_msbs,u32 * p_mac_lsbs)1827*4882a593Smuzhiyun u16 hpi_cobranet_get_macaddress(u32 h_control, u32 *p_mac_msbs,
1828*4882a593Smuzhiyun u32 *p_mac_lsbs)
1829*4882a593Smuzhiyun {
1830*4882a593Smuzhiyun u32 byte_count;
1831*4882a593Smuzhiyun u16 err;
1832*4882a593Smuzhiyun u32 mac;
1833*4882a593Smuzhiyun
1834*4882a593Smuzhiyun err = hpi_cobranet_hmi_read(h_control,
1835*4882a593Smuzhiyun HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count,
1836*4882a593Smuzhiyun (u8 *)&mac);
1837*4882a593Smuzhiyun
1838*4882a593Smuzhiyun if (!err) {
1839*4882a593Smuzhiyun *p_mac_msbs =
1840*4882a593Smuzhiyun ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1841*4882a593Smuzhiyun | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1842*4882a593Smuzhiyun 8);
1843*4882a593Smuzhiyun
1844*4882a593Smuzhiyun err = hpi_cobranet_hmi_read(h_control,
1845*4882a593Smuzhiyun HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4,
1846*4882a593Smuzhiyun &byte_count, (u8 *)&mac);
1847*4882a593Smuzhiyun }
1848*4882a593Smuzhiyun
1849*4882a593Smuzhiyun if (!err) {
1850*4882a593Smuzhiyun *p_mac_lsbs =
1851*4882a593Smuzhiyun ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1852*4882a593Smuzhiyun | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1853*4882a593Smuzhiyun 8);
1854*4882a593Smuzhiyun } else {
1855*4882a593Smuzhiyun *p_mac_msbs = 0;
1856*4882a593Smuzhiyun *p_mac_lsbs = 0;
1857*4882a593Smuzhiyun }
1858*4882a593Smuzhiyun
1859*4882a593Smuzhiyun return err;
1860*4882a593Smuzhiyun }
1861*4882a593Smuzhiyun
hpi_compander_set_enable(u32 h_control,u32 enable)1862*4882a593Smuzhiyun u16 hpi_compander_set_enable(u32 h_control, u32 enable)
1863*4882a593Smuzhiyun {
1864*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
1865*4882a593Smuzhiyun 0);
1866*4882a593Smuzhiyun }
1867*4882a593Smuzhiyun
hpi_compander_get_enable(u32 h_control,u32 * enable)1868*4882a593Smuzhiyun u16 hpi_compander_get_enable(u32 h_control, u32 *enable)
1869*4882a593Smuzhiyun {
1870*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
1871*4882a593Smuzhiyun }
1872*4882a593Smuzhiyun
hpi_compander_set_makeup_gain(u32 h_control,short makeup_gain0_01dB)1873*4882a593Smuzhiyun u16 hpi_compander_set_makeup_gain(u32 h_control, short makeup_gain0_01dB)
1874*4882a593Smuzhiyun {
1875*4882a593Smuzhiyun return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1876*4882a593Smuzhiyun makeup_gain0_01dB, 0);
1877*4882a593Smuzhiyun }
1878*4882a593Smuzhiyun
hpi_compander_get_makeup_gain(u32 h_control,short * makeup_gain0_01dB)1879*4882a593Smuzhiyun u16 hpi_compander_get_makeup_gain(u32 h_control, short *makeup_gain0_01dB)
1880*4882a593Smuzhiyun {
1881*4882a593Smuzhiyun return hpi_control_log_get2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1882*4882a593Smuzhiyun makeup_gain0_01dB, NULL);
1883*4882a593Smuzhiyun }
1884*4882a593Smuzhiyun
hpi_compander_set_attack_time_constant(u32 h_control,unsigned int index,u32 attack)1885*4882a593Smuzhiyun u16 hpi_compander_set_attack_time_constant(u32 h_control, unsigned int index,
1886*4882a593Smuzhiyun u32 attack)
1887*4882a593Smuzhiyun {
1888*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_COMPANDER_ATTACK, attack,
1889*4882a593Smuzhiyun index);
1890*4882a593Smuzhiyun }
1891*4882a593Smuzhiyun
hpi_compander_get_attack_time_constant(u32 h_control,unsigned int index,u32 * attack)1892*4882a593Smuzhiyun u16 hpi_compander_get_attack_time_constant(u32 h_control, unsigned int index,
1893*4882a593Smuzhiyun u32 *attack)
1894*4882a593Smuzhiyun {
1895*4882a593Smuzhiyun return hpi_control_param_get(h_control, HPI_COMPANDER_ATTACK, 0,
1896*4882a593Smuzhiyun index, attack, NULL);
1897*4882a593Smuzhiyun }
1898*4882a593Smuzhiyun
hpi_compander_set_decay_time_constant(u32 h_control,unsigned int index,u32 decay)1899*4882a593Smuzhiyun u16 hpi_compander_set_decay_time_constant(u32 h_control, unsigned int index,
1900*4882a593Smuzhiyun u32 decay)
1901*4882a593Smuzhiyun {
1902*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_COMPANDER_DECAY, decay,
1903*4882a593Smuzhiyun index);
1904*4882a593Smuzhiyun }
1905*4882a593Smuzhiyun
hpi_compander_get_decay_time_constant(u32 h_control,unsigned int index,u32 * decay)1906*4882a593Smuzhiyun u16 hpi_compander_get_decay_time_constant(u32 h_control, unsigned int index,
1907*4882a593Smuzhiyun u32 *decay)
1908*4882a593Smuzhiyun {
1909*4882a593Smuzhiyun return hpi_control_param_get(h_control, HPI_COMPANDER_DECAY, 0, index,
1910*4882a593Smuzhiyun decay, NULL);
1911*4882a593Smuzhiyun
1912*4882a593Smuzhiyun }
1913*4882a593Smuzhiyun
hpi_compander_set_threshold(u32 h_control,unsigned int index,short threshold0_01dB)1914*4882a593Smuzhiyun u16 hpi_compander_set_threshold(u32 h_control, unsigned int index,
1915*4882a593Smuzhiyun short threshold0_01dB)
1916*4882a593Smuzhiyun {
1917*4882a593Smuzhiyun struct hpi_message hm;
1918*4882a593Smuzhiyun struct hpi_response hr;
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1921*4882a593Smuzhiyun HPI_CONTROL_SET_STATE);
1922*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1923*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1924*4882a593Smuzhiyun hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1925*4882a593Smuzhiyun hm.u.c.param2 = index;
1926*4882a593Smuzhiyun hm.u.c.an_log_value[0] = threshold0_01dB;
1927*4882a593Smuzhiyun
1928*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1929*4882a593Smuzhiyun
1930*4882a593Smuzhiyun return hr.error;
1931*4882a593Smuzhiyun }
1932*4882a593Smuzhiyun
hpi_compander_get_threshold(u32 h_control,unsigned int index,short * threshold0_01dB)1933*4882a593Smuzhiyun u16 hpi_compander_get_threshold(u32 h_control, unsigned int index,
1934*4882a593Smuzhiyun short *threshold0_01dB)
1935*4882a593Smuzhiyun {
1936*4882a593Smuzhiyun struct hpi_message hm;
1937*4882a593Smuzhiyun struct hpi_response hr;
1938*4882a593Smuzhiyun
1939*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1940*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1941*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1942*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1943*4882a593Smuzhiyun hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1944*4882a593Smuzhiyun hm.u.c.param2 = index;
1945*4882a593Smuzhiyun
1946*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1947*4882a593Smuzhiyun *threshold0_01dB = hr.u.c.an_log_value[0];
1948*4882a593Smuzhiyun
1949*4882a593Smuzhiyun return hr.error;
1950*4882a593Smuzhiyun }
1951*4882a593Smuzhiyun
hpi_compander_set_ratio(u32 h_control,u32 index,u32 ratio100)1952*4882a593Smuzhiyun u16 hpi_compander_set_ratio(u32 h_control, u32 index, u32 ratio100)
1953*4882a593Smuzhiyun {
1954*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_COMPANDER_RATIO, ratio100,
1955*4882a593Smuzhiyun index);
1956*4882a593Smuzhiyun }
1957*4882a593Smuzhiyun
hpi_compander_get_ratio(u32 h_control,u32 index,u32 * ratio100)1958*4882a593Smuzhiyun u16 hpi_compander_get_ratio(u32 h_control, u32 index, u32 *ratio100)
1959*4882a593Smuzhiyun {
1960*4882a593Smuzhiyun return hpi_control_param_get(h_control, HPI_COMPANDER_RATIO, 0, index,
1961*4882a593Smuzhiyun ratio100, NULL);
1962*4882a593Smuzhiyun }
1963*4882a593Smuzhiyun
hpi_level_query_range(u32 h_control,short * min_gain_01dB,short * max_gain_01dB,short * step_gain_01dB)1964*4882a593Smuzhiyun u16 hpi_level_query_range(u32 h_control, short *min_gain_01dB,
1965*4882a593Smuzhiyun short *max_gain_01dB, short *step_gain_01dB)
1966*4882a593Smuzhiyun {
1967*4882a593Smuzhiyun struct hpi_message hm;
1968*4882a593Smuzhiyun struct hpi_response hr;
1969*4882a593Smuzhiyun
1970*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1971*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
1972*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1973*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
1974*4882a593Smuzhiyun hm.u.c.attribute = HPI_LEVEL_RANGE;
1975*4882a593Smuzhiyun
1976*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
1977*4882a593Smuzhiyun if (hr.error) {
1978*4882a593Smuzhiyun hr.u.c.an_log_value[0] = 0;
1979*4882a593Smuzhiyun hr.u.c.an_log_value[1] = 0;
1980*4882a593Smuzhiyun hr.u.c.param1 = 0;
1981*4882a593Smuzhiyun }
1982*4882a593Smuzhiyun if (min_gain_01dB)
1983*4882a593Smuzhiyun *min_gain_01dB = hr.u.c.an_log_value[0];
1984*4882a593Smuzhiyun if (max_gain_01dB)
1985*4882a593Smuzhiyun *max_gain_01dB = hr.u.c.an_log_value[1];
1986*4882a593Smuzhiyun if (step_gain_01dB)
1987*4882a593Smuzhiyun *step_gain_01dB = (short)hr.u.c.param1;
1988*4882a593Smuzhiyun return hr.error;
1989*4882a593Smuzhiyun }
1990*4882a593Smuzhiyun
hpi_level_set_gain(u32 h_control,short an_gain0_01dB[HPI_MAX_CHANNELS])1991*4882a593Smuzhiyun u16 hpi_level_set_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
1992*4882a593Smuzhiyun )
1993*4882a593Smuzhiyun {
1994*4882a593Smuzhiyun return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN,
1995*4882a593Smuzhiyun an_gain0_01dB[0], an_gain0_01dB[1]);
1996*4882a593Smuzhiyun }
1997*4882a593Smuzhiyun
hpi_level_get_gain(u32 h_control,short an_gain0_01dB[HPI_MAX_CHANNELS])1998*4882a593Smuzhiyun u16 hpi_level_get_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
1999*4882a593Smuzhiyun )
2000*4882a593Smuzhiyun {
2001*4882a593Smuzhiyun return hpi_control_log_get2(h_control, HPI_LEVEL_GAIN,
2002*4882a593Smuzhiyun &an_gain0_01dB[0], &an_gain0_01dB[1]);
2003*4882a593Smuzhiyun }
2004*4882a593Smuzhiyun
hpi_meter_query_channels(const u32 h_meter,u32 * p_channels)2005*4882a593Smuzhiyun u16 hpi_meter_query_channels(const u32 h_meter, u32 *p_channels)
2006*4882a593Smuzhiyun {
2007*4882a593Smuzhiyun return hpi_control_query(h_meter, HPI_METER_NUM_CHANNELS, 0, 0,
2008*4882a593Smuzhiyun p_channels);
2009*4882a593Smuzhiyun }
2010*4882a593Smuzhiyun
hpi_meter_get_peak(u32 h_control,short an_peakdB[HPI_MAX_CHANNELS])2011*4882a593Smuzhiyun u16 hpi_meter_get_peak(u32 h_control, short an_peakdB[HPI_MAX_CHANNELS]
2012*4882a593Smuzhiyun )
2013*4882a593Smuzhiyun {
2014*4882a593Smuzhiyun short i = 0;
2015*4882a593Smuzhiyun
2016*4882a593Smuzhiyun struct hpi_message hm;
2017*4882a593Smuzhiyun struct hpi_response hr;
2018*4882a593Smuzhiyun
2019*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2020*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2021*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2022*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2023*4882a593Smuzhiyun hm.obj_index = hm.obj_index;
2024*4882a593Smuzhiyun hm.u.c.attribute = HPI_METER_PEAK;
2025*4882a593Smuzhiyun
2026*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2027*4882a593Smuzhiyun
2028*4882a593Smuzhiyun if (!hr.error)
2029*4882a593Smuzhiyun memcpy(an_peakdB, hr.u.c.an_log_value,
2030*4882a593Smuzhiyun sizeof(short) * HPI_MAX_CHANNELS);
2031*4882a593Smuzhiyun else
2032*4882a593Smuzhiyun for (i = 0; i < HPI_MAX_CHANNELS; i++)
2033*4882a593Smuzhiyun an_peakdB[i] = HPI_METER_MINIMUM;
2034*4882a593Smuzhiyun return hr.error;
2035*4882a593Smuzhiyun }
2036*4882a593Smuzhiyun
hpi_meter_get_rms(u32 h_control,short an_rmsdB[HPI_MAX_CHANNELS])2037*4882a593Smuzhiyun u16 hpi_meter_get_rms(u32 h_control, short an_rmsdB[HPI_MAX_CHANNELS]
2038*4882a593Smuzhiyun )
2039*4882a593Smuzhiyun {
2040*4882a593Smuzhiyun short i = 0;
2041*4882a593Smuzhiyun
2042*4882a593Smuzhiyun struct hpi_message hm;
2043*4882a593Smuzhiyun struct hpi_response hr;
2044*4882a593Smuzhiyun
2045*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2046*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2047*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2048*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2049*4882a593Smuzhiyun hm.u.c.attribute = HPI_METER_RMS;
2050*4882a593Smuzhiyun
2051*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2052*4882a593Smuzhiyun
2053*4882a593Smuzhiyun if (!hr.error)
2054*4882a593Smuzhiyun memcpy(an_rmsdB, hr.u.c.an_log_value,
2055*4882a593Smuzhiyun sizeof(short) * HPI_MAX_CHANNELS);
2056*4882a593Smuzhiyun else
2057*4882a593Smuzhiyun for (i = 0; i < HPI_MAX_CHANNELS; i++)
2058*4882a593Smuzhiyun an_rmsdB[i] = HPI_METER_MINIMUM;
2059*4882a593Smuzhiyun
2060*4882a593Smuzhiyun return hr.error;
2061*4882a593Smuzhiyun }
2062*4882a593Smuzhiyun
hpi_meter_set_rms_ballistics(u32 h_control,u16 attack,u16 decay)2063*4882a593Smuzhiyun u16 hpi_meter_set_rms_ballistics(u32 h_control, u16 attack, u16 decay)
2064*4882a593Smuzhiyun {
2065*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_METER_RMS_BALLISTICS,
2066*4882a593Smuzhiyun attack, decay);
2067*4882a593Smuzhiyun }
2068*4882a593Smuzhiyun
hpi_meter_get_rms_ballistics(u32 h_control,u16 * pn_attack,u16 * pn_decay)2069*4882a593Smuzhiyun u16 hpi_meter_get_rms_ballistics(u32 h_control, u16 *pn_attack, u16 *pn_decay)
2070*4882a593Smuzhiyun {
2071*4882a593Smuzhiyun u32 attack;
2072*4882a593Smuzhiyun u32 decay;
2073*4882a593Smuzhiyun u16 error;
2074*4882a593Smuzhiyun
2075*4882a593Smuzhiyun error = hpi_control_param2_get(h_control, HPI_METER_RMS_BALLISTICS,
2076*4882a593Smuzhiyun &attack, &decay);
2077*4882a593Smuzhiyun
2078*4882a593Smuzhiyun if (pn_attack)
2079*4882a593Smuzhiyun *pn_attack = (unsigned short)attack;
2080*4882a593Smuzhiyun if (pn_decay)
2081*4882a593Smuzhiyun *pn_decay = (unsigned short)decay;
2082*4882a593Smuzhiyun
2083*4882a593Smuzhiyun return error;
2084*4882a593Smuzhiyun }
2085*4882a593Smuzhiyun
hpi_meter_set_peak_ballistics(u32 h_control,u16 attack,u16 decay)2086*4882a593Smuzhiyun u16 hpi_meter_set_peak_ballistics(u32 h_control, u16 attack, u16 decay)
2087*4882a593Smuzhiyun {
2088*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_METER_PEAK_BALLISTICS,
2089*4882a593Smuzhiyun attack, decay);
2090*4882a593Smuzhiyun }
2091*4882a593Smuzhiyun
hpi_meter_get_peak_ballistics(u32 h_control,u16 * pn_attack,u16 * pn_decay)2092*4882a593Smuzhiyun u16 hpi_meter_get_peak_ballistics(u32 h_control, u16 *pn_attack,
2093*4882a593Smuzhiyun u16 *pn_decay)
2094*4882a593Smuzhiyun {
2095*4882a593Smuzhiyun u32 attack;
2096*4882a593Smuzhiyun u32 decay;
2097*4882a593Smuzhiyun u16 error;
2098*4882a593Smuzhiyun
2099*4882a593Smuzhiyun error = hpi_control_param2_get(h_control, HPI_METER_PEAK_BALLISTICS,
2100*4882a593Smuzhiyun &attack, &decay);
2101*4882a593Smuzhiyun
2102*4882a593Smuzhiyun if (pn_attack)
2103*4882a593Smuzhiyun *pn_attack = (short)attack;
2104*4882a593Smuzhiyun if (pn_decay)
2105*4882a593Smuzhiyun *pn_decay = (short)decay;
2106*4882a593Smuzhiyun
2107*4882a593Smuzhiyun return error;
2108*4882a593Smuzhiyun }
2109*4882a593Smuzhiyun
hpi_microphone_set_phantom_power(u32 h_control,u16 on_off)2110*4882a593Smuzhiyun u16 hpi_microphone_set_phantom_power(u32 h_control, u16 on_off)
2111*4882a593Smuzhiyun {
2112*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_MICROPHONE_PHANTOM_POWER,
2113*4882a593Smuzhiyun (u32)on_off, 0);
2114*4882a593Smuzhiyun }
2115*4882a593Smuzhiyun
hpi_microphone_get_phantom_power(u32 h_control,u16 * pw_on_off)2116*4882a593Smuzhiyun u16 hpi_microphone_get_phantom_power(u32 h_control, u16 *pw_on_off)
2117*4882a593Smuzhiyun {
2118*4882a593Smuzhiyun u16 error = 0;
2119*4882a593Smuzhiyun u32 on_off = 0;
2120*4882a593Smuzhiyun error = hpi_control_param1_get(h_control,
2121*4882a593Smuzhiyun HPI_MICROPHONE_PHANTOM_POWER, &on_off);
2122*4882a593Smuzhiyun if (pw_on_off)
2123*4882a593Smuzhiyun *pw_on_off = (u16)on_off;
2124*4882a593Smuzhiyun return error;
2125*4882a593Smuzhiyun }
2126*4882a593Smuzhiyun
hpi_multiplexer_set_source(u32 h_control,u16 source_node_type,u16 source_node_index)2127*4882a593Smuzhiyun u16 hpi_multiplexer_set_source(u32 h_control, u16 source_node_type,
2128*4882a593Smuzhiyun u16 source_node_index)
2129*4882a593Smuzhiyun {
2130*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_MULTIPLEXER_SOURCE,
2131*4882a593Smuzhiyun source_node_type, source_node_index);
2132*4882a593Smuzhiyun }
2133*4882a593Smuzhiyun
hpi_multiplexer_get_source(u32 h_control,u16 * source_node_type,u16 * source_node_index)2134*4882a593Smuzhiyun u16 hpi_multiplexer_get_source(u32 h_control, u16 *source_node_type,
2135*4882a593Smuzhiyun u16 *source_node_index)
2136*4882a593Smuzhiyun {
2137*4882a593Smuzhiyun u32 node, index;
2138*4882a593Smuzhiyun u16 err = hpi_control_param2_get(h_control,
2139*4882a593Smuzhiyun HPI_MULTIPLEXER_SOURCE, &node,
2140*4882a593Smuzhiyun &index);
2141*4882a593Smuzhiyun if (source_node_type)
2142*4882a593Smuzhiyun *source_node_type = (u16)node;
2143*4882a593Smuzhiyun if (source_node_index)
2144*4882a593Smuzhiyun *source_node_index = (u16)index;
2145*4882a593Smuzhiyun return err;
2146*4882a593Smuzhiyun }
2147*4882a593Smuzhiyun
hpi_multiplexer_query_source(u32 h_control,u16 index,u16 * source_node_type,u16 * source_node_index)2148*4882a593Smuzhiyun u16 hpi_multiplexer_query_source(u32 h_control, u16 index,
2149*4882a593Smuzhiyun u16 *source_node_type, u16 *source_node_index)
2150*4882a593Smuzhiyun {
2151*4882a593Smuzhiyun struct hpi_message hm;
2152*4882a593Smuzhiyun struct hpi_response hr;
2153*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2154*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2155*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2156*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2157*4882a593Smuzhiyun hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE;
2158*4882a593Smuzhiyun hm.u.c.param1 = index;
2159*4882a593Smuzhiyun
2160*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2161*4882a593Smuzhiyun
2162*4882a593Smuzhiyun if (source_node_type)
2163*4882a593Smuzhiyun *source_node_type = (u16)hr.u.c.param1;
2164*4882a593Smuzhiyun if (source_node_index)
2165*4882a593Smuzhiyun *source_node_index = (u16)hr.u.c.param2;
2166*4882a593Smuzhiyun return hr.error;
2167*4882a593Smuzhiyun }
2168*4882a593Smuzhiyun
hpi_parametric_eq_get_info(u32 h_control,u16 * pw_number_of_bands,u16 * pw_on_off)2169*4882a593Smuzhiyun u16 hpi_parametric_eq_get_info(u32 h_control, u16 *pw_number_of_bands,
2170*4882a593Smuzhiyun u16 *pw_on_off)
2171*4882a593Smuzhiyun {
2172*4882a593Smuzhiyun u32 oB = 0;
2173*4882a593Smuzhiyun u32 oO = 0;
2174*4882a593Smuzhiyun u16 error = 0;
2175*4882a593Smuzhiyun
2176*4882a593Smuzhiyun error = hpi_control_param2_get(h_control, HPI_EQUALIZER_NUM_FILTERS,
2177*4882a593Smuzhiyun &oO, &oB);
2178*4882a593Smuzhiyun if (pw_number_of_bands)
2179*4882a593Smuzhiyun *pw_number_of_bands = (u16)oB;
2180*4882a593Smuzhiyun if (pw_on_off)
2181*4882a593Smuzhiyun *pw_on_off = (u16)oO;
2182*4882a593Smuzhiyun return error;
2183*4882a593Smuzhiyun }
2184*4882a593Smuzhiyun
hpi_parametric_eq_set_state(u32 h_control,u16 on_off)2185*4882a593Smuzhiyun u16 hpi_parametric_eq_set_state(u32 h_control, u16 on_off)
2186*4882a593Smuzhiyun {
2187*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_EQUALIZER_NUM_FILTERS,
2188*4882a593Smuzhiyun on_off, 0);
2189*4882a593Smuzhiyun }
2190*4882a593Smuzhiyun
hpi_parametric_eq_get_band(u32 h_control,u16 index,u16 * pn_type,u32 * pfrequency_hz,short * pnQ100,short * pn_gain0_01dB)2191*4882a593Smuzhiyun u16 hpi_parametric_eq_get_band(u32 h_control, u16 index, u16 *pn_type,
2192*4882a593Smuzhiyun u32 *pfrequency_hz, short *pnQ100, short *pn_gain0_01dB)
2193*4882a593Smuzhiyun {
2194*4882a593Smuzhiyun struct hpi_message hm;
2195*4882a593Smuzhiyun struct hpi_response hr;
2196*4882a593Smuzhiyun
2197*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2198*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2199*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2200*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2201*4882a593Smuzhiyun hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2202*4882a593Smuzhiyun hm.u.c.param2 = index;
2203*4882a593Smuzhiyun
2204*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2205*4882a593Smuzhiyun
2206*4882a593Smuzhiyun if (pfrequency_hz)
2207*4882a593Smuzhiyun *pfrequency_hz = hr.u.c.param1;
2208*4882a593Smuzhiyun if (pn_type)
2209*4882a593Smuzhiyun *pn_type = (u16)(hr.u.c.param2 >> 16);
2210*4882a593Smuzhiyun if (pnQ100)
2211*4882a593Smuzhiyun *pnQ100 = hr.u.c.an_log_value[1];
2212*4882a593Smuzhiyun if (pn_gain0_01dB)
2213*4882a593Smuzhiyun *pn_gain0_01dB = hr.u.c.an_log_value[0];
2214*4882a593Smuzhiyun
2215*4882a593Smuzhiyun return hr.error;
2216*4882a593Smuzhiyun }
2217*4882a593Smuzhiyun
hpi_parametric_eq_set_band(u32 h_control,u16 index,u16 type,u32 frequency_hz,short q100,short gain0_01dB)2218*4882a593Smuzhiyun u16 hpi_parametric_eq_set_band(u32 h_control, u16 index, u16 type,
2219*4882a593Smuzhiyun u32 frequency_hz, short q100, short gain0_01dB)
2220*4882a593Smuzhiyun {
2221*4882a593Smuzhiyun struct hpi_message hm;
2222*4882a593Smuzhiyun struct hpi_response hr;
2223*4882a593Smuzhiyun
2224*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2225*4882a593Smuzhiyun HPI_CONTROL_SET_STATE);
2226*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2227*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2228*4882a593Smuzhiyun
2229*4882a593Smuzhiyun hm.u.c.param1 = frequency_hz;
2230*4882a593Smuzhiyun hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16);
2231*4882a593Smuzhiyun hm.u.c.an_log_value[0] = gain0_01dB;
2232*4882a593Smuzhiyun hm.u.c.an_log_value[1] = q100;
2233*4882a593Smuzhiyun hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2234*4882a593Smuzhiyun
2235*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2236*4882a593Smuzhiyun
2237*4882a593Smuzhiyun return hr.error;
2238*4882a593Smuzhiyun }
2239*4882a593Smuzhiyun
hpi_parametric_eq_get_coeffs(u32 h_control,u16 index,short coeffs[5])2240*4882a593Smuzhiyun u16 hpi_parametric_eq_get_coeffs(u32 h_control, u16 index, short coeffs[5]
2241*4882a593Smuzhiyun )
2242*4882a593Smuzhiyun {
2243*4882a593Smuzhiyun struct hpi_message hm;
2244*4882a593Smuzhiyun struct hpi_response hr;
2245*4882a593Smuzhiyun
2246*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2247*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2248*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2249*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2250*4882a593Smuzhiyun hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS;
2251*4882a593Smuzhiyun hm.u.c.param2 = index;
2252*4882a593Smuzhiyun
2253*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2254*4882a593Smuzhiyun
2255*4882a593Smuzhiyun coeffs[0] = (short)hr.u.c.an_log_value[0];
2256*4882a593Smuzhiyun coeffs[1] = (short)hr.u.c.an_log_value[1];
2257*4882a593Smuzhiyun coeffs[2] = (short)hr.u.c.param1;
2258*4882a593Smuzhiyun coeffs[3] = (short)(hr.u.c.param1 >> 16);
2259*4882a593Smuzhiyun coeffs[4] = (short)hr.u.c.param2;
2260*4882a593Smuzhiyun
2261*4882a593Smuzhiyun return hr.error;
2262*4882a593Smuzhiyun }
2263*4882a593Smuzhiyun
hpi_sample_clock_query_source(const u32 h_clock,const u32 index,u16 * pw_source)2264*4882a593Smuzhiyun u16 hpi_sample_clock_query_source(const u32 h_clock, const u32 index,
2265*4882a593Smuzhiyun u16 *pw_source)
2266*4882a593Smuzhiyun {
2267*4882a593Smuzhiyun u32 qr;
2268*4882a593Smuzhiyun u16 err;
2269*4882a593Smuzhiyun
2270*4882a593Smuzhiyun err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE, index, 0,
2271*4882a593Smuzhiyun &qr);
2272*4882a593Smuzhiyun *pw_source = (u16)qr;
2273*4882a593Smuzhiyun return err;
2274*4882a593Smuzhiyun }
2275*4882a593Smuzhiyun
hpi_sample_clock_set_source(u32 h_control,u16 source)2276*4882a593Smuzhiyun u16 hpi_sample_clock_set_source(u32 h_control, u16 source)
2277*4882a593Smuzhiyun {
2278*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE,
2279*4882a593Smuzhiyun source, 0);
2280*4882a593Smuzhiyun }
2281*4882a593Smuzhiyun
hpi_sample_clock_get_source(u32 h_control,u16 * pw_source)2282*4882a593Smuzhiyun u16 hpi_sample_clock_get_source(u32 h_control, u16 *pw_source)
2283*4882a593Smuzhiyun {
2284*4882a593Smuzhiyun u16 err = 0;
2285*4882a593Smuzhiyun u32 source = 0;
2286*4882a593Smuzhiyun err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE,
2287*4882a593Smuzhiyun &source);
2288*4882a593Smuzhiyun if (!err)
2289*4882a593Smuzhiyun if (pw_source)
2290*4882a593Smuzhiyun *pw_source = (u16)source;
2291*4882a593Smuzhiyun return err;
2292*4882a593Smuzhiyun }
2293*4882a593Smuzhiyun
hpi_sample_clock_query_source_index(const u32 h_clock,const u32 index,const u32 source,u16 * pw_source_index)2294*4882a593Smuzhiyun u16 hpi_sample_clock_query_source_index(const u32 h_clock, const u32 index,
2295*4882a593Smuzhiyun const u32 source, u16 *pw_source_index)
2296*4882a593Smuzhiyun {
2297*4882a593Smuzhiyun u32 qr;
2298*4882a593Smuzhiyun u16 err;
2299*4882a593Smuzhiyun
2300*4882a593Smuzhiyun err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE_INDEX, index,
2301*4882a593Smuzhiyun source, &qr);
2302*4882a593Smuzhiyun *pw_source_index = (u16)qr;
2303*4882a593Smuzhiyun return err;
2304*4882a593Smuzhiyun }
2305*4882a593Smuzhiyun
hpi_sample_clock_set_source_index(u32 h_control,u16 source_index)2306*4882a593Smuzhiyun u16 hpi_sample_clock_set_source_index(u32 h_control, u16 source_index)
2307*4882a593Smuzhiyun {
2308*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2309*4882a593Smuzhiyun source_index, 0);
2310*4882a593Smuzhiyun }
2311*4882a593Smuzhiyun
hpi_sample_clock_get_source_index(u32 h_control,u16 * pw_source_index)2312*4882a593Smuzhiyun u16 hpi_sample_clock_get_source_index(u32 h_control, u16 *pw_source_index)
2313*4882a593Smuzhiyun {
2314*4882a593Smuzhiyun u16 err = 0;
2315*4882a593Smuzhiyun u32 source_index = 0;
2316*4882a593Smuzhiyun err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2317*4882a593Smuzhiyun &source_index);
2318*4882a593Smuzhiyun if (!err)
2319*4882a593Smuzhiyun if (pw_source_index)
2320*4882a593Smuzhiyun *pw_source_index = (u16)source_index;
2321*4882a593Smuzhiyun return err;
2322*4882a593Smuzhiyun }
2323*4882a593Smuzhiyun
hpi_sample_clock_query_local_rate(const u32 h_clock,const u32 index,u32 * prate)2324*4882a593Smuzhiyun u16 hpi_sample_clock_query_local_rate(const u32 h_clock, const u32 index,
2325*4882a593Smuzhiyun u32 *prate)
2326*4882a593Smuzhiyun {
2327*4882a593Smuzhiyun return hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE,
2328*4882a593Smuzhiyun index, 0, prate);
2329*4882a593Smuzhiyun }
2330*4882a593Smuzhiyun
hpi_sample_clock_set_local_rate(u32 h_control,u32 sample_rate)2331*4882a593Smuzhiyun u16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate)
2332*4882a593Smuzhiyun {
2333*4882a593Smuzhiyun return hpi_control_param_set(h_control,
2334*4882a593Smuzhiyun HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0);
2335*4882a593Smuzhiyun }
2336*4882a593Smuzhiyun
hpi_sample_clock_get_local_rate(u32 h_control,u32 * psample_rate)2337*4882a593Smuzhiyun u16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate)
2338*4882a593Smuzhiyun {
2339*4882a593Smuzhiyun u16 err = 0;
2340*4882a593Smuzhiyun u32 sample_rate = 0;
2341*4882a593Smuzhiyun err = hpi_control_param1_get(h_control,
2342*4882a593Smuzhiyun HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate);
2343*4882a593Smuzhiyun if (!err)
2344*4882a593Smuzhiyun if (psample_rate)
2345*4882a593Smuzhiyun *psample_rate = sample_rate;
2346*4882a593Smuzhiyun return err;
2347*4882a593Smuzhiyun }
2348*4882a593Smuzhiyun
hpi_sample_clock_get_sample_rate(u32 h_control,u32 * psample_rate)2349*4882a593Smuzhiyun u16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate)
2350*4882a593Smuzhiyun {
2351*4882a593Smuzhiyun u16 err = 0;
2352*4882a593Smuzhiyun u32 sample_rate = 0;
2353*4882a593Smuzhiyun err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE,
2354*4882a593Smuzhiyun &sample_rate);
2355*4882a593Smuzhiyun if (!err)
2356*4882a593Smuzhiyun if (psample_rate)
2357*4882a593Smuzhiyun *psample_rate = sample_rate;
2358*4882a593Smuzhiyun return err;
2359*4882a593Smuzhiyun }
2360*4882a593Smuzhiyun
hpi_sample_clock_set_auto(u32 h_control,u32 enable)2361*4882a593Smuzhiyun u16 hpi_sample_clock_set_auto(u32 h_control, u32 enable)
2362*4882a593Smuzhiyun {
2363*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable,
2364*4882a593Smuzhiyun 0);
2365*4882a593Smuzhiyun }
2366*4882a593Smuzhiyun
hpi_sample_clock_get_auto(u32 h_control,u32 * penable)2367*4882a593Smuzhiyun u16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable)
2368*4882a593Smuzhiyun {
2369*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO,
2370*4882a593Smuzhiyun penable);
2371*4882a593Smuzhiyun }
2372*4882a593Smuzhiyun
hpi_sample_clock_set_local_rate_lock(u32 h_control,u32 lock)2373*4882a593Smuzhiyun u16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock)
2374*4882a593Smuzhiyun {
2375*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2376*4882a593Smuzhiyun lock, 0);
2377*4882a593Smuzhiyun }
2378*4882a593Smuzhiyun
hpi_sample_clock_get_local_rate_lock(u32 h_control,u32 * plock)2379*4882a593Smuzhiyun u16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock)
2380*4882a593Smuzhiyun {
2381*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2382*4882a593Smuzhiyun plock);
2383*4882a593Smuzhiyun }
2384*4882a593Smuzhiyun
hpi_tone_detector_get_frequency(u32 h_control,u32 index,u32 * frequency)2385*4882a593Smuzhiyun u16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency)
2386*4882a593Smuzhiyun {
2387*4882a593Smuzhiyun return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY,
2388*4882a593Smuzhiyun index, 0, frequency, NULL);
2389*4882a593Smuzhiyun }
2390*4882a593Smuzhiyun
hpi_tone_detector_get_state(u32 h_control,u32 * state)2391*4882a593Smuzhiyun u16 hpi_tone_detector_get_state(u32 h_control, u32 *state)
2392*4882a593Smuzhiyun {
2393*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE,
2394*4882a593Smuzhiyun state);
2395*4882a593Smuzhiyun }
2396*4882a593Smuzhiyun
hpi_tone_detector_set_enable(u32 h_control,u32 enable)2397*4882a593Smuzhiyun u16 hpi_tone_detector_set_enable(u32 h_control, u32 enable)
2398*4882a593Smuzhiyun {
2399*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2400*4882a593Smuzhiyun 0);
2401*4882a593Smuzhiyun }
2402*4882a593Smuzhiyun
hpi_tone_detector_get_enable(u32 h_control,u32 * enable)2403*4882a593Smuzhiyun u16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable)
2404*4882a593Smuzhiyun {
2405*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2406*4882a593Smuzhiyun }
2407*4882a593Smuzhiyun
hpi_tone_detector_set_event_enable(u32 h_control,u32 event_enable)2408*4882a593Smuzhiyun u16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable)
2409*4882a593Smuzhiyun {
2410*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2411*4882a593Smuzhiyun (u32)event_enable, 0);
2412*4882a593Smuzhiyun }
2413*4882a593Smuzhiyun
hpi_tone_detector_get_event_enable(u32 h_control,u32 * event_enable)2414*4882a593Smuzhiyun u16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable)
2415*4882a593Smuzhiyun {
2416*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2417*4882a593Smuzhiyun event_enable);
2418*4882a593Smuzhiyun }
2419*4882a593Smuzhiyun
hpi_tone_detector_set_threshold(u32 h_control,int threshold)2420*4882a593Smuzhiyun u16 hpi_tone_detector_set_threshold(u32 h_control, int threshold)
2421*4882a593Smuzhiyun {
2422*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD,
2423*4882a593Smuzhiyun (u32)threshold, 0);
2424*4882a593Smuzhiyun }
2425*4882a593Smuzhiyun
hpi_tone_detector_get_threshold(u32 h_control,int * threshold)2426*4882a593Smuzhiyun u16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold)
2427*4882a593Smuzhiyun {
2428*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD,
2429*4882a593Smuzhiyun (u32 *)threshold);
2430*4882a593Smuzhiyun }
2431*4882a593Smuzhiyun
hpi_silence_detector_get_state(u32 h_control,u32 * state)2432*4882a593Smuzhiyun u16 hpi_silence_detector_get_state(u32 h_control, u32 *state)
2433*4882a593Smuzhiyun {
2434*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE,
2435*4882a593Smuzhiyun state);
2436*4882a593Smuzhiyun }
2437*4882a593Smuzhiyun
hpi_silence_detector_set_enable(u32 h_control,u32 enable)2438*4882a593Smuzhiyun u16 hpi_silence_detector_set_enable(u32 h_control, u32 enable)
2439*4882a593Smuzhiyun {
2440*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2441*4882a593Smuzhiyun 0);
2442*4882a593Smuzhiyun }
2443*4882a593Smuzhiyun
hpi_silence_detector_get_enable(u32 h_control,u32 * enable)2444*4882a593Smuzhiyun u16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable)
2445*4882a593Smuzhiyun {
2446*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2447*4882a593Smuzhiyun }
2448*4882a593Smuzhiyun
hpi_silence_detector_set_event_enable(u32 h_control,u32 event_enable)2449*4882a593Smuzhiyun u16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable)
2450*4882a593Smuzhiyun {
2451*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2452*4882a593Smuzhiyun event_enable, 0);
2453*4882a593Smuzhiyun }
2454*4882a593Smuzhiyun
hpi_silence_detector_get_event_enable(u32 h_control,u32 * event_enable)2455*4882a593Smuzhiyun u16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable)
2456*4882a593Smuzhiyun {
2457*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2458*4882a593Smuzhiyun event_enable);
2459*4882a593Smuzhiyun }
2460*4882a593Smuzhiyun
hpi_silence_detector_set_delay(u32 h_control,u32 delay)2461*4882a593Smuzhiyun u16 hpi_silence_detector_set_delay(u32 h_control, u32 delay)
2462*4882a593Smuzhiyun {
2463*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY,
2464*4882a593Smuzhiyun delay, 0);
2465*4882a593Smuzhiyun }
2466*4882a593Smuzhiyun
hpi_silence_detector_get_delay(u32 h_control,u32 * delay)2467*4882a593Smuzhiyun u16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay)
2468*4882a593Smuzhiyun {
2469*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY,
2470*4882a593Smuzhiyun delay);
2471*4882a593Smuzhiyun }
2472*4882a593Smuzhiyun
hpi_silence_detector_set_threshold(u32 h_control,int threshold)2473*4882a593Smuzhiyun u16 hpi_silence_detector_set_threshold(u32 h_control, int threshold)
2474*4882a593Smuzhiyun {
2475*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD,
2476*4882a593Smuzhiyun threshold, 0);
2477*4882a593Smuzhiyun }
2478*4882a593Smuzhiyun
hpi_silence_detector_get_threshold(u32 h_control,int * threshold)2479*4882a593Smuzhiyun u16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold)
2480*4882a593Smuzhiyun {
2481*4882a593Smuzhiyun return hpi_control_param1_get(h_control,
2482*4882a593Smuzhiyun HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold);
2483*4882a593Smuzhiyun }
2484*4882a593Smuzhiyun
hpi_tuner_query_band(const u32 h_tuner,const u32 index,u16 * pw_band)2485*4882a593Smuzhiyun u16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band)
2486*4882a593Smuzhiyun {
2487*4882a593Smuzhiyun u32 qr;
2488*4882a593Smuzhiyun u16 err;
2489*4882a593Smuzhiyun
2490*4882a593Smuzhiyun err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2491*4882a593Smuzhiyun *pw_band = (u16)qr;
2492*4882a593Smuzhiyun return err;
2493*4882a593Smuzhiyun }
2494*4882a593Smuzhiyun
hpi_tuner_set_band(u32 h_control,u16 band)2495*4882a593Smuzhiyun u16 hpi_tuner_set_band(u32 h_control, u16 band)
2496*4882a593Smuzhiyun {
2497*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0);
2498*4882a593Smuzhiyun }
2499*4882a593Smuzhiyun
hpi_tuner_get_band(u32 h_control,u16 * pw_band)2500*4882a593Smuzhiyun u16 hpi_tuner_get_band(u32 h_control, u16 *pw_band)
2501*4882a593Smuzhiyun {
2502*4882a593Smuzhiyun u32 band = 0;
2503*4882a593Smuzhiyun u16 error = 0;
2504*4882a593Smuzhiyun
2505*4882a593Smuzhiyun error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band);
2506*4882a593Smuzhiyun if (pw_band)
2507*4882a593Smuzhiyun *pw_band = (u16)band;
2508*4882a593Smuzhiyun return error;
2509*4882a593Smuzhiyun }
2510*4882a593Smuzhiyun
hpi_tuner_query_frequency(const u32 h_tuner,const u32 index,const u16 band,u32 * pfreq)2511*4882a593Smuzhiyun u16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index,
2512*4882a593Smuzhiyun const u16 band, u32 *pfreq)
2513*4882a593Smuzhiyun {
2514*4882a593Smuzhiyun return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq);
2515*4882a593Smuzhiyun }
2516*4882a593Smuzhiyun
hpi_tuner_set_frequency(u32 h_control,u32 freq_ink_hz)2517*4882a593Smuzhiyun u16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz)
2518*4882a593Smuzhiyun {
2519*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz,
2520*4882a593Smuzhiyun 0);
2521*4882a593Smuzhiyun }
2522*4882a593Smuzhiyun
hpi_tuner_get_frequency(u32 h_control,u32 * pw_freq_ink_hz)2523*4882a593Smuzhiyun u16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz)
2524*4882a593Smuzhiyun {
2525*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_TUNER_FREQ,
2526*4882a593Smuzhiyun pw_freq_ink_hz);
2527*4882a593Smuzhiyun }
2528*4882a593Smuzhiyun
hpi_tuner_query_gain(const u32 h_tuner,const u32 index,u16 * pw_gain)2529*4882a593Smuzhiyun u16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain)
2530*4882a593Smuzhiyun {
2531*4882a593Smuzhiyun u32 qr;
2532*4882a593Smuzhiyun u16 err;
2533*4882a593Smuzhiyun
2534*4882a593Smuzhiyun err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2535*4882a593Smuzhiyun *pw_gain = (u16)qr;
2536*4882a593Smuzhiyun return err;
2537*4882a593Smuzhiyun }
2538*4882a593Smuzhiyun
hpi_tuner_set_gain(u32 h_control,short gain)2539*4882a593Smuzhiyun u16 hpi_tuner_set_gain(u32 h_control, short gain)
2540*4882a593Smuzhiyun {
2541*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0);
2542*4882a593Smuzhiyun }
2543*4882a593Smuzhiyun
hpi_tuner_get_gain(u32 h_control,short * pn_gain)2544*4882a593Smuzhiyun u16 hpi_tuner_get_gain(u32 h_control, short *pn_gain)
2545*4882a593Smuzhiyun {
2546*4882a593Smuzhiyun u32 gain = 0;
2547*4882a593Smuzhiyun u16 error = 0;
2548*4882a593Smuzhiyun
2549*4882a593Smuzhiyun error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain);
2550*4882a593Smuzhiyun if (pn_gain)
2551*4882a593Smuzhiyun *pn_gain = (u16)gain;
2552*4882a593Smuzhiyun return error;
2553*4882a593Smuzhiyun }
2554*4882a593Smuzhiyun
hpi_tuner_get_rf_level(u32 h_control,short * pw_level)2555*4882a593Smuzhiyun u16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level)
2556*4882a593Smuzhiyun {
2557*4882a593Smuzhiyun struct hpi_message hm;
2558*4882a593Smuzhiyun struct hpi_response hr;
2559*4882a593Smuzhiyun
2560*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2561*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2562*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2563*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2564*4882a593Smuzhiyun hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG;
2565*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2566*4882a593Smuzhiyun if (pw_level)
2567*4882a593Smuzhiyun *pw_level = hr.u.cu.tuner.s_level;
2568*4882a593Smuzhiyun return hr.error;
2569*4882a593Smuzhiyun }
2570*4882a593Smuzhiyun
hpi_tuner_get_raw_rf_level(u32 h_control,short * pw_level)2571*4882a593Smuzhiyun u16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level)
2572*4882a593Smuzhiyun {
2573*4882a593Smuzhiyun struct hpi_message hm;
2574*4882a593Smuzhiyun struct hpi_response hr;
2575*4882a593Smuzhiyun
2576*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2577*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2578*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2579*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2580*4882a593Smuzhiyun hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW;
2581*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2582*4882a593Smuzhiyun if (pw_level)
2583*4882a593Smuzhiyun *pw_level = hr.u.cu.tuner.s_level;
2584*4882a593Smuzhiyun return hr.error;
2585*4882a593Smuzhiyun }
2586*4882a593Smuzhiyun
hpi_tuner_query_deemphasis(const u32 h_tuner,const u32 index,const u16 band,u32 * pdeemphasis)2587*4882a593Smuzhiyun u16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index,
2588*4882a593Smuzhiyun const u16 band, u32 *pdeemphasis)
2589*4882a593Smuzhiyun {
2590*4882a593Smuzhiyun return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band,
2591*4882a593Smuzhiyun pdeemphasis);
2592*4882a593Smuzhiyun }
2593*4882a593Smuzhiyun
hpi_tuner_set_deemphasis(u32 h_control,u32 deemphasis)2594*4882a593Smuzhiyun u16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis)
2595*4882a593Smuzhiyun {
2596*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS,
2597*4882a593Smuzhiyun deemphasis, 0);
2598*4882a593Smuzhiyun }
2599*4882a593Smuzhiyun
hpi_tuner_get_deemphasis(u32 h_control,u32 * pdeemphasis)2600*4882a593Smuzhiyun u16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis)
2601*4882a593Smuzhiyun {
2602*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS,
2603*4882a593Smuzhiyun pdeemphasis);
2604*4882a593Smuzhiyun }
2605*4882a593Smuzhiyun
hpi_tuner_query_program(const u32 h_tuner,u32 * pbitmap_program)2606*4882a593Smuzhiyun u16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program)
2607*4882a593Smuzhiyun {
2608*4882a593Smuzhiyun return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0,
2609*4882a593Smuzhiyun pbitmap_program);
2610*4882a593Smuzhiyun }
2611*4882a593Smuzhiyun
hpi_tuner_set_program(u32 h_control,u32 program)2612*4882a593Smuzhiyun u16 hpi_tuner_set_program(u32 h_control, u32 program)
2613*4882a593Smuzhiyun {
2614*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program,
2615*4882a593Smuzhiyun 0);
2616*4882a593Smuzhiyun }
2617*4882a593Smuzhiyun
hpi_tuner_get_program(u32 h_control,u32 * pprogram)2618*4882a593Smuzhiyun u16 hpi_tuner_get_program(u32 h_control, u32 *pprogram)
2619*4882a593Smuzhiyun {
2620*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram);
2621*4882a593Smuzhiyun }
2622*4882a593Smuzhiyun
hpi_tuner_get_hd_radio_dsp_version(u32 h_control,char * psz_dsp_version,const u32 string_size)2623*4882a593Smuzhiyun u16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version,
2624*4882a593Smuzhiyun const u32 string_size)
2625*4882a593Smuzhiyun {
2626*4882a593Smuzhiyun return hpi_control_get_string(h_control,
2627*4882a593Smuzhiyun HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size);
2628*4882a593Smuzhiyun }
2629*4882a593Smuzhiyun
hpi_tuner_get_hd_radio_sdk_version(u32 h_control,char * psz_sdk_version,const u32 string_size)2630*4882a593Smuzhiyun u16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version,
2631*4882a593Smuzhiyun const u32 string_size)
2632*4882a593Smuzhiyun {
2633*4882a593Smuzhiyun return hpi_control_get_string(h_control,
2634*4882a593Smuzhiyun HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size);
2635*4882a593Smuzhiyun }
2636*4882a593Smuzhiyun
hpi_tuner_get_status(u32 h_control,u16 * pw_status_mask,u16 * pw_status)2637*4882a593Smuzhiyun u16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status)
2638*4882a593Smuzhiyun {
2639*4882a593Smuzhiyun u32 status = 0;
2640*4882a593Smuzhiyun u16 error = 0;
2641*4882a593Smuzhiyun
2642*4882a593Smuzhiyun error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status);
2643*4882a593Smuzhiyun if (pw_status) {
2644*4882a593Smuzhiyun if (!error) {
2645*4882a593Smuzhiyun *pw_status_mask = (u16)(status >> 16);
2646*4882a593Smuzhiyun *pw_status = (u16)(status & 0xFFFF);
2647*4882a593Smuzhiyun } else {
2648*4882a593Smuzhiyun *pw_status_mask = 0;
2649*4882a593Smuzhiyun *pw_status = 0;
2650*4882a593Smuzhiyun }
2651*4882a593Smuzhiyun }
2652*4882a593Smuzhiyun return error;
2653*4882a593Smuzhiyun }
2654*4882a593Smuzhiyun
hpi_tuner_set_mode(u32 h_control,u32 mode,u32 value)2655*4882a593Smuzhiyun u16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value)
2656*4882a593Smuzhiyun {
2657*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value);
2658*4882a593Smuzhiyun }
2659*4882a593Smuzhiyun
hpi_tuner_get_mode(u32 h_control,u32 mode,u32 * pn_value)2660*4882a593Smuzhiyun u16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value)
2661*4882a593Smuzhiyun {
2662*4882a593Smuzhiyun return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0,
2663*4882a593Smuzhiyun pn_value, NULL);
2664*4882a593Smuzhiyun }
2665*4882a593Smuzhiyun
hpi_tuner_get_hd_radio_signal_quality(u32 h_control,u32 * pquality)2666*4882a593Smuzhiyun u16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality)
2667*4882a593Smuzhiyun {
2668*4882a593Smuzhiyun return hpi_control_param1_get(h_control,
2669*4882a593Smuzhiyun HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality);
2670*4882a593Smuzhiyun }
2671*4882a593Smuzhiyun
hpi_tuner_get_hd_radio_signal_blend(u32 h_control,u32 * pblend)2672*4882a593Smuzhiyun u16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend)
2673*4882a593Smuzhiyun {
2674*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND,
2675*4882a593Smuzhiyun pblend);
2676*4882a593Smuzhiyun }
2677*4882a593Smuzhiyun
hpi_tuner_set_hd_radio_signal_blend(u32 h_control,const u32 blend)2678*4882a593Smuzhiyun u16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend)
2679*4882a593Smuzhiyun {
2680*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND,
2681*4882a593Smuzhiyun blend, 0);
2682*4882a593Smuzhiyun }
2683*4882a593Smuzhiyun
hpi_tuner_get_rds(u32 h_control,char * p_data)2684*4882a593Smuzhiyun u16 hpi_tuner_get_rds(u32 h_control, char *p_data)
2685*4882a593Smuzhiyun {
2686*4882a593Smuzhiyun struct hpi_message hm;
2687*4882a593Smuzhiyun struct hpi_response hr;
2688*4882a593Smuzhiyun
2689*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2690*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2691*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2692*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2693*4882a593Smuzhiyun hm.u.c.attribute = HPI_TUNER_RDS;
2694*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2695*4882a593Smuzhiyun if (p_data) {
2696*4882a593Smuzhiyun *(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0];
2697*4882a593Smuzhiyun *(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1];
2698*4882a593Smuzhiyun *(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER;
2699*4882a593Smuzhiyun }
2700*4882a593Smuzhiyun return hr.error;
2701*4882a593Smuzhiyun }
2702*4882a593Smuzhiyun
hpi_pad_get_channel_name(u32 h_control,char * psz_string,const u32 data_length)2703*4882a593Smuzhiyun u16 hpi_pad_get_channel_name(u32 h_control, char *psz_string,
2704*4882a593Smuzhiyun const u32 data_length)
2705*4882a593Smuzhiyun {
2706*4882a593Smuzhiyun return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME,
2707*4882a593Smuzhiyun psz_string, data_length);
2708*4882a593Smuzhiyun }
2709*4882a593Smuzhiyun
hpi_pad_get_artist(u32 h_control,char * psz_string,const u32 data_length)2710*4882a593Smuzhiyun u16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length)
2711*4882a593Smuzhiyun {
2712*4882a593Smuzhiyun return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string,
2713*4882a593Smuzhiyun data_length);
2714*4882a593Smuzhiyun }
2715*4882a593Smuzhiyun
hpi_pad_get_title(u32 h_control,char * psz_string,const u32 data_length)2716*4882a593Smuzhiyun u16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length)
2717*4882a593Smuzhiyun {
2718*4882a593Smuzhiyun return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string,
2719*4882a593Smuzhiyun data_length);
2720*4882a593Smuzhiyun }
2721*4882a593Smuzhiyun
hpi_pad_get_comment(u32 h_control,char * psz_string,const u32 data_length)2722*4882a593Smuzhiyun u16 hpi_pad_get_comment(u32 h_control, char *psz_string,
2723*4882a593Smuzhiyun const u32 data_length)
2724*4882a593Smuzhiyun {
2725*4882a593Smuzhiyun return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string,
2726*4882a593Smuzhiyun data_length);
2727*4882a593Smuzhiyun }
2728*4882a593Smuzhiyun
hpi_pad_get_program_type(u32 h_control,u32 * ppTY)2729*4882a593Smuzhiyun u16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY)
2730*4882a593Smuzhiyun {
2731*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY);
2732*4882a593Smuzhiyun }
2733*4882a593Smuzhiyun
hpi_pad_get_rdsPI(u32 h_control,u32 * ppI)2734*4882a593Smuzhiyun u16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI)
2735*4882a593Smuzhiyun {
2736*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI);
2737*4882a593Smuzhiyun }
2738*4882a593Smuzhiyun
hpi_volume_query_channels(const u32 h_volume,u32 * p_channels)2739*4882a593Smuzhiyun u16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels)
2740*4882a593Smuzhiyun {
2741*4882a593Smuzhiyun return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0,
2742*4882a593Smuzhiyun p_channels);
2743*4882a593Smuzhiyun }
2744*4882a593Smuzhiyun
hpi_volume_set_gain(u32 h_control,short an_log_gain[HPI_MAX_CHANNELS])2745*4882a593Smuzhiyun u16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2746*4882a593Smuzhiyun )
2747*4882a593Smuzhiyun {
2748*4882a593Smuzhiyun return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN,
2749*4882a593Smuzhiyun an_log_gain[0], an_log_gain[1]);
2750*4882a593Smuzhiyun }
2751*4882a593Smuzhiyun
hpi_volume_get_gain(u32 h_control,short an_log_gain[HPI_MAX_CHANNELS])2752*4882a593Smuzhiyun u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2753*4882a593Smuzhiyun )
2754*4882a593Smuzhiyun {
2755*4882a593Smuzhiyun return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN,
2756*4882a593Smuzhiyun &an_log_gain[0], &an_log_gain[1]);
2757*4882a593Smuzhiyun }
2758*4882a593Smuzhiyun
hpi_volume_set_mute(u32 h_control,u32 mute)2759*4882a593Smuzhiyun u16 hpi_volume_set_mute(u32 h_control, u32 mute)
2760*4882a593Smuzhiyun {
2761*4882a593Smuzhiyun return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0);
2762*4882a593Smuzhiyun }
2763*4882a593Smuzhiyun
hpi_volume_get_mute(u32 h_control,u32 * mute)2764*4882a593Smuzhiyun u16 hpi_volume_get_mute(u32 h_control, u32 *mute)
2765*4882a593Smuzhiyun {
2766*4882a593Smuzhiyun return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
2767*4882a593Smuzhiyun }
2768*4882a593Smuzhiyun
hpi_volume_query_range(u32 h_control,short * min_gain_01dB,short * max_gain_01dB,short * step_gain_01dB)2769*4882a593Smuzhiyun u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
2770*4882a593Smuzhiyun short *max_gain_01dB, short *step_gain_01dB)
2771*4882a593Smuzhiyun {
2772*4882a593Smuzhiyun struct hpi_message hm;
2773*4882a593Smuzhiyun struct hpi_response hr;
2774*4882a593Smuzhiyun
2775*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2776*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2777*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2778*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2779*4882a593Smuzhiyun hm.u.c.attribute = HPI_VOLUME_RANGE;
2780*4882a593Smuzhiyun
2781*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2782*4882a593Smuzhiyun if (hr.error) {
2783*4882a593Smuzhiyun hr.u.c.an_log_value[0] = 0;
2784*4882a593Smuzhiyun hr.u.c.an_log_value[1] = 0;
2785*4882a593Smuzhiyun hr.u.c.param1 = 0;
2786*4882a593Smuzhiyun }
2787*4882a593Smuzhiyun if (min_gain_01dB)
2788*4882a593Smuzhiyun *min_gain_01dB = hr.u.c.an_log_value[0];
2789*4882a593Smuzhiyun if (max_gain_01dB)
2790*4882a593Smuzhiyun *max_gain_01dB = hr.u.c.an_log_value[1];
2791*4882a593Smuzhiyun if (step_gain_01dB)
2792*4882a593Smuzhiyun *step_gain_01dB = (short)hr.u.c.param1;
2793*4882a593Smuzhiyun return hr.error;
2794*4882a593Smuzhiyun }
2795*4882a593Smuzhiyun
hpi_volume_auto_fade_profile(u32 h_control,short an_stop_gain0_01dB[HPI_MAX_CHANNELS],u32 duration_ms,u16 profile)2796*4882a593Smuzhiyun u16 hpi_volume_auto_fade_profile(u32 h_control,
2797*4882a593Smuzhiyun short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms,
2798*4882a593Smuzhiyun u16 profile)
2799*4882a593Smuzhiyun {
2800*4882a593Smuzhiyun struct hpi_message hm;
2801*4882a593Smuzhiyun struct hpi_response hr;
2802*4882a593Smuzhiyun
2803*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2804*4882a593Smuzhiyun HPI_CONTROL_SET_STATE);
2805*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2806*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2807*4882a593Smuzhiyun
2808*4882a593Smuzhiyun memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB,
2809*4882a593Smuzhiyun sizeof(short) * HPI_MAX_CHANNELS);
2810*4882a593Smuzhiyun
2811*4882a593Smuzhiyun hm.u.c.attribute = HPI_VOLUME_AUTOFADE;
2812*4882a593Smuzhiyun hm.u.c.param1 = duration_ms;
2813*4882a593Smuzhiyun hm.u.c.param2 = profile;
2814*4882a593Smuzhiyun
2815*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2816*4882a593Smuzhiyun
2817*4882a593Smuzhiyun return hr.error;
2818*4882a593Smuzhiyun }
2819*4882a593Smuzhiyun
hpi_volume_auto_fade(u32 h_control,short an_stop_gain0_01dB[HPI_MAX_CHANNELS],u32 duration_ms)2820*4882a593Smuzhiyun u16 hpi_volume_auto_fade(u32 h_control,
2821*4882a593Smuzhiyun short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms)
2822*4882a593Smuzhiyun {
2823*4882a593Smuzhiyun return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB,
2824*4882a593Smuzhiyun duration_ms, HPI_VOLUME_AUTOFADE_LOG);
2825*4882a593Smuzhiyun }
2826*4882a593Smuzhiyun
hpi_volume_query_auto_fade_profile(const u32 h_volume,const u32 i,u16 * profile)2827*4882a593Smuzhiyun u16 hpi_volume_query_auto_fade_profile(const u32 h_volume, const u32 i,
2828*4882a593Smuzhiyun u16 *profile)
2829*4882a593Smuzhiyun {
2830*4882a593Smuzhiyun u16 e;
2831*4882a593Smuzhiyun u32 u;
2832*4882a593Smuzhiyun e = hpi_control_query(h_volume, HPI_VOLUME_AUTOFADE, i, 0, &u);
2833*4882a593Smuzhiyun *profile = (u16)u;
2834*4882a593Smuzhiyun return e;
2835*4882a593Smuzhiyun }
2836*4882a593Smuzhiyun
hpi_vox_set_threshold(u32 h_control,short an_gain0_01dB)2837*4882a593Smuzhiyun u16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB)
2838*4882a593Smuzhiyun {
2839*4882a593Smuzhiyun struct hpi_message hm;
2840*4882a593Smuzhiyun struct hpi_response hr;
2841*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2842*4882a593Smuzhiyun HPI_CONTROL_SET_STATE);
2843*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2844*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2845*4882a593Smuzhiyun hm.u.c.attribute = HPI_VOX_THRESHOLD;
2846*4882a593Smuzhiyun
2847*4882a593Smuzhiyun hm.u.c.an_log_value[0] = an_gain0_01dB;
2848*4882a593Smuzhiyun
2849*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2850*4882a593Smuzhiyun
2851*4882a593Smuzhiyun return hr.error;
2852*4882a593Smuzhiyun }
2853*4882a593Smuzhiyun
hpi_vox_get_threshold(u32 h_control,short * an_gain0_01dB)2854*4882a593Smuzhiyun u16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB)
2855*4882a593Smuzhiyun {
2856*4882a593Smuzhiyun struct hpi_message hm;
2857*4882a593Smuzhiyun struct hpi_response hr;
2858*4882a593Smuzhiyun hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2859*4882a593Smuzhiyun HPI_CONTROL_GET_STATE);
2860*4882a593Smuzhiyun if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2861*4882a593Smuzhiyun return HPI_ERROR_INVALID_HANDLE;
2862*4882a593Smuzhiyun hm.u.c.attribute = HPI_VOX_THRESHOLD;
2863*4882a593Smuzhiyun
2864*4882a593Smuzhiyun hpi_send_recv(&hm, &hr);
2865*4882a593Smuzhiyun
2866*4882a593Smuzhiyun *an_gain0_01dB = hr.u.c.an_log_value[0];
2867*4882a593Smuzhiyun
2868*4882a593Smuzhiyun return hr.error;
2869*4882a593Smuzhiyun }
2870