18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci#include "hpi_internal.h"
48c2ecf20Sopenharmony_ci#include "hpimsginit.h"
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#include "hpidebug.h"
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_cistruct hpi_handle {
98c2ecf20Sopenharmony_ci	unsigned int obj_index:12;
108c2ecf20Sopenharmony_ci	unsigned int obj_type:4;
118c2ecf20Sopenharmony_ci	unsigned int adapter_index:14;
128c2ecf20Sopenharmony_ci	unsigned int spare:1;
138c2ecf20Sopenharmony_ci	unsigned int read_only:1;
148c2ecf20Sopenharmony_ci};
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ciunion handle_word {
178c2ecf20Sopenharmony_ci	struct hpi_handle h;
188c2ecf20Sopenharmony_ci	u32 w;
198c2ecf20Sopenharmony_ci};
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ciu32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index,
228c2ecf20Sopenharmony_ci	const u16 object_index)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	union handle_word handle;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	handle.h.adapter_index = adapter_index;
278c2ecf20Sopenharmony_ci	handle.h.spare = 0;
288c2ecf20Sopenharmony_ci	handle.h.read_only = 0;
298c2ecf20Sopenharmony_ci	handle.h.obj_type = c_object;
308c2ecf20Sopenharmony_ci	handle.h.obj_index = object_index;
318c2ecf20Sopenharmony_ci	return handle.w;
328c2ecf20Sopenharmony_ci}
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cistatic u16 hpi_handle_indexes(const u32 h, u16 *p1, u16 *p2)
358c2ecf20Sopenharmony_ci{
368c2ecf20Sopenharmony_ci	union handle_word uhandle;
378c2ecf20Sopenharmony_ci	if (!h)
388c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	uhandle.w = h;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	*p1 = (u16)uhandle.h.adapter_index;
438c2ecf20Sopenharmony_ci	if (p2)
448c2ecf20Sopenharmony_ci		*p2 = (u16)uhandle.h.obj_index;
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	return 0;
478c2ecf20Sopenharmony_ci}
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_civoid hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index,
508c2ecf20Sopenharmony_ci	u16 *pw_object_index)
518c2ecf20Sopenharmony_ci{
528c2ecf20Sopenharmony_ci	hpi_handle_indexes(handle, pw_adapter_index, pw_object_index);
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cichar hpi_handle_object(const u32 handle)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	union handle_word uhandle;
588c2ecf20Sopenharmony_ci	uhandle.w = handle;
598c2ecf20Sopenharmony_ci	return (char)uhandle.h.obj_type;
608c2ecf20Sopenharmony_ci}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_civoid hpi_format_to_msg(struct hpi_msg_format *pMF,
638c2ecf20Sopenharmony_ci	const struct hpi_format *pF)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	pMF->sample_rate = pF->sample_rate;
668c2ecf20Sopenharmony_ci	pMF->bit_rate = pF->bit_rate;
678c2ecf20Sopenharmony_ci	pMF->attributes = pF->attributes;
688c2ecf20Sopenharmony_ci	pMF->channels = pF->channels;
698c2ecf20Sopenharmony_ci	pMF->format = pF->format;
708c2ecf20Sopenharmony_ci}
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistatic void hpi_msg_to_format(struct hpi_format *pF,
738c2ecf20Sopenharmony_ci	struct hpi_msg_format *pMF)
748c2ecf20Sopenharmony_ci{
758c2ecf20Sopenharmony_ci	pF->sample_rate = pMF->sample_rate;
768c2ecf20Sopenharmony_ci	pF->bit_rate = pMF->bit_rate;
778c2ecf20Sopenharmony_ci	pF->attributes = pMF->attributes;
788c2ecf20Sopenharmony_ci	pF->channels = pMF->channels;
798c2ecf20Sopenharmony_ci	pF->format = pMF->format;
808c2ecf20Sopenharmony_ci	pF->mode_legacy = 0;
818c2ecf20Sopenharmony_ci	pF->unused = 0;
828c2ecf20Sopenharmony_ci}
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_civoid hpi_stream_response_to_legacy(struct hpi_stream_res *pSR)
858c2ecf20Sopenharmony_ci{
868c2ecf20Sopenharmony_ci	pSR->u.legacy_stream_info.auxiliary_data_available =
878c2ecf20Sopenharmony_ci		pSR->u.stream_info.auxiliary_data_available;
888c2ecf20Sopenharmony_ci	pSR->u.legacy_stream_info.state = pSR->u.stream_info.state;
898c2ecf20Sopenharmony_ci}
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_cistatic inline void hpi_send_recvV1(struct hpi_message_header *m,
928c2ecf20Sopenharmony_ci	struct hpi_response_header *r)
938c2ecf20Sopenharmony_ci{
948c2ecf20Sopenharmony_ci	hpi_send_recv((struct hpi_message *)m, (struct hpi_response *)r);
958c2ecf20Sopenharmony_ci}
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ciu16 hpi_subsys_get_version_ex(u32 *pversion_ex)
988c2ecf20Sopenharmony_ci{
998c2ecf20Sopenharmony_ci	struct hpi_message hm;
1008c2ecf20Sopenharmony_ci	struct hpi_response hr;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
1038c2ecf20Sopenharmony_ci		HPI_SUBSYS_GET_VERSION);
1048c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
1058c2ecf20Sopenharmony_ci	*pversion_ex = hr.u.s.data;
1068c2ecf20Sopenharmony_ci	return hr.error;
1078c2ecf20Sopenharmony_ci}
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ciu16 hpi_subsys_get_num_adapters(int *pn_num_adapters)
1108c2ecf20Sopenharmony_ci{
1118c2ecf20Sopenharmony_ci	struct hpi_message hm;
1128c2ecf20Sopenharmony_ci	struct hpi_response hr;
1138c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
1148c2ecf20Sopenharmony_ci		HPI_SUBSYS_GET_NUM_ADAPTERS);
1158c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
1168c2ecf20Sopenharmony_ci	*pn_num_adapters = (int)hr.u.s.num_adapters;
1178c2ecf20Sopenharmony_ci	return hr.error;
1188c2ecf20Sopenharmony_ci}
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ciu16 hpi_subsys_get_adapter(int iterator, u32 *padapter_index,
1218c2ecf20Sopenharmony_ci	u16 *pw_adapter_type)
1228c2ecf20Sopenharmony_ci{
1238c2ecf20Sopenharmony_ci	struct hpi_message hm;
1248c2ecf20Sopenharmony_ci	struct hpi_response hr;
1258c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM,
1268c2ecf20Sopenharmony_ci		HPI_SUBSYS_GET_ADAPTER);
1278c2ecf20Sopenharmony_ci	hm.obj_index = (u16)iterator;
1288c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
1298c2ecf20Sopenharmony_ci	*padapter_index = (int)hr.u.s.adapter_index;
1308c2ecf20Sopenharmony_ci	*pw_adapter_type = hr.u.s.adapter_type;
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	return hr.error;
1338c2ecf20Sopenharmony_ci}
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ciu16 hpi_adapter_open(u16 adapter_index)
1368c2ecf20Sopenharmony_ci{
1378c2ecf20Sopenharmony_ci	struct hpi_message hm;
1388c2ecf20Sopenharmony_ci	struct hpi_response hr;
1398c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
1408c2ecf20Sopenharmony_ci		HPI_ADAPTER_OPEN);
1418c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci	return hr.error;
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci}
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ciu16 hpi_adapter_close(u16 adapter_index)
1508c2ecf20Sopenharmony_ci{
1518c2ecf20Sopenharmony_ci	struct hpi_message hm;
1528c2ecf20Sopenharmony_ci	struct hpi_response hr;
1538c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
1548c2ecf20Sopenharmony_ci		HPI_ADAPTER_CLOSE);
1558c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	return hr.error;
1608c2ecf20Sopenharmony_ci}
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ciu16 hpi_adapter_set_mode(u16 adapter_index, u32 adapter_mode)
1638c2ecf20Sopenharmony_ci{
1648c2ecf20Sopenharmony_ci	return hpi_adapter_set_mode_ex(adapter_index, adapter_mode,
1658c2ecf20Sopenharmony_ci		HPI_ADAPTER_MODE_SET);
1668c2ecf20Sopenharmony_ci}
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ciu16 hpi_adapter_set_mode_ex(u16 adapter_index, u32 adapter_mode,
1698c2ecf20Sopenharmony_ci	u16 query_or_set)
1708c2ecf20Sopenharmony_ci{
1718c2ecf20Sopenharmony_ci	struct hpi_message hm;
1728c2ecf20Sopenharmony_ci	struct hpi_response hr;
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
1758c2ecf20Sopenharmony_ci		HPI_ADAPTER_SET_MODE);
1768c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
1778c2ecf20Sopenharmony_ci	hm.u.ax.mode.adapter_mode = adapter_mode;
1788c2ecf20Sopenharmony_ci	hm.u.ax.mode.query_or_set = query_or_set;
1798c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
1808c2ecf20Sopenharmony_ci	return hr.error;
1818c2ecf20Sopenharmony_ci}
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ciu16 hpi_adapter_get_mode(u16 adapter_index, u32 *padapter_mode)
1848c2ecf20Sopenharmony_ci{
1858c2ecf20Sopenharmony_ci	struct hpi_message hm;
1868c2ecf20Sopenharmony_ci	struct hpi_response hr;
1878c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
1888c2ecf20Sopenharmony_ci		HPI_ADAPTER_GET_MODE);
1898c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
1908c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
1918c2ecf20Sopenharmony_ci	if (padapter_mode)
1928c2ecf20Sopenharmony_ci		*padapter_mode = hr.u.ax.mode.adapter_mode;
1938c2ecf20Sopenharmony_ci	return hr.error;
1948c2ecf20Sopenharmony_ci}
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ciu16 hpi_adapter_get_info(u16 adapter_index, u16 *pw_num_outstreams,
1978c2ecf20Sopenharmony_ci	u16 *pw_num_instreams, u16 *pw_version, u32 *pserial_number,
1988c2ecf20Sopenharmony_ci	u16 *pw_adapter_type)
1998c2ecf20Sopenharmony_ci{
2008c2ecf20Sopenharmony_ci	struct hpi_message hm;
2018c2ecf20Sopenharmony_ci	struct hpi_response hr;
2028c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
2038c2ecf20Sopenharmony_ci		HPI_ADAPTER_GET_INFO);
2048c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
2058c2ecf20Sopenharmony_ci
2068c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci	*pw_adapter_type = hr.u.ax.info.adapter_type;
2098c2ecf20Sopenharmony_ci	*pw_num_outstreams = hr.u.ax.info.num_outstreams;
2108c2ecf20Sopenharmony_ci	*pw_num_instreams = hr.u.ax.info.num_instreams;
2118c2ecf20Sopenharmony_ci	*pw_version = hr.u.ax.info.version;
2128c2ecf20Sopenharmony_ci	*pserial_number = hr.u.ax.info.serial_number;
2138c2ecf20Sopenharmony_ci	return hr.error;
2148c2ecf20Sopenharmony_ci}
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ciu16 hpi_adapter_get_module_by_index(u16 adapter_index, u16 module_index,
2178c2ecf20Sopenharmony_ci	u16 *pw_num_outputs, u16 *pw_num_inputs, u16 *pw_version,
2188c2ecf20Sopenharmony_ci	u32 *pserial_number, u16 *pw_module_type, u32 *ph_module)
2198c2ecf20Sopenharmony_ci{
2208c2ecf20Sopenharmony_ci	struct hpi_message hm;
2218c2ecf20Sopenharmony_ci	struct hpi_response hr;
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
2248c2ecf20Sopenharmony_ci		HPI_ADAPTER_MODULE_INFO);
2258c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
2268c2ecf20Sopenharmony_ci	hm.u.ax.module_info.index = module_index;
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	*pw_module_type = hr.u.ax.info.adapter_type;
2318c2ecf20Sopenharmony_ci	*pw_num_outputs = hr.u.ax.info.num_outstreams;
2328c2ecf20Sopenharmony_ci	*pw_num_inputs = hr.u.ax.info.num_instreams;
2338c2ecf20Sopenharmony_ci	*pw_version = hr.u.ax.info.version;
2348c2ecf20Sopenharmony_ci	*pserial_number = hr.u.ax.info.serial_number;
2358c2ecf20Sopenharmony_ci	*ph_module = 0;
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	return hr.error;
2388c2ecf20Sopenharmony_ci}
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ciu16 hpi_adapter_set_property(u16 adapter_index, u16 property, u16 parameter1,
2418c2ecf20Sopenharmony_ci	u16 parameter2)
2428c2ecf20Sopenharmony_ci{
2438c2ecf20Sopenharmony_ci	struct hpi_message hm;
2448c2ecf20Sopenharmony_ci	struct hpi_response hr;
2458c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
2468c2ecf20Sopenharmony_ci		HPI_ADAPTER_SET_PROPERTY);
2478c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
2488c2ecf20Sopenharmony_ci	hm.u.ax.property_set.property = property;
2498c2ecf20Sopenharmony_ci	hm.u.ax.property_set.parameter1 = parameter1;
2508c2ecf20Sopenharmony_ci	hm.u.ax.property_set.parameter2 = parameter2;
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci	return hr.error;
2558c2ecf20Sopenharmony_ci}
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ciu16 hpi_adapter_get_property(u16 adapter_index, u16 property,
2588c2ecf20Sopenharmony_ci	u16 *pw_parameter1, u16 *pw_parameter2)
2598c2ecf20Sopenharmony_ci{
2608c2ecf20Sopenharmony_ci	struct hpi_message hm;
2618c2ecf20Sopenharmony_ci	struct hpi_response hr;
2628c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER,
2638c2ecf20Sopenharmony_ci		HPI_ADAPTER_GET_PROPERTY);
2648c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
2658c2ecf20Sopenharmony_ci	hm.u.ax.property_set.property = property;
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
2688c2ecf20Sopenharmony_ci	if (!hr.error) {
2698c2ecf20Sopenharmony_ci		if (pw_parameter1)
2708c2ecf20Sopenharmony_ci			*pw_parameter1 = hr.u.ax.property_get.parameter1;
2718c2ecf20Sopenharmony_ci		if (pw_parameter2)
2728c2ecf20Sopenharmony_ci			*pw_parameter2 = hr.u.ax.property_get.parameter2;
2738c2ecf20Sopenharmony_ci	}
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci	return hr.error;
2768c2ecf20Sopenharmony_ci}
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ciu16 hpi_adapter_enumerate_property(u16 adapter_index, u16 index,
2798c2ecf20Sopenharmony_ci	u16 what_to_enumerate, u16 property_index, u32 *psetting)
2808c2ecf20Sopenharmony_ci{
2818c2ecf20Sopenharmony_ci	return 0;
2828c2ecf20Sopenharmony_ci}
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ciu16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format,
2858c2ecf20Sopenharmony_ci	u32 sample_rate, u32 bit_rate, u32 attributes)
2868c2ecf20Sopenharmony_ci{
2878c2ecf20Sopenharmony_ci	u16 err = 0;
2888c2ecf20Sopenharmony_ci	struct hpi_msg_format fmt;
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci	switch (channels) {
2918c2ecf20Sopenharmony_ci	case 1:
2928c2ecf20Sopenharmony_ci	case 2:
2938c2ecf20Sopenharmony_ci	case 4:
2948c2ecf20Sopenharmony_ci	case 6:
2958c2ecf20Sopenharmony_ci	case 8:
2968c2ecf20Sopenharmony_ci	case 16:
2978c2ecf20Sopenharmony_ci		break;
2988c2ecf20Sopenharmony_ci	default:
2998c2ecf20Sopenharmony_ci		err = HPI_ERROR_INVALID_CHANNELS;
3008c2ecf20Sopenharmony_ci		return err;
3018c2ecf20Sopenharmony_ci	}
3028c2ecf20Sopenharmony_ci	fmt.channels = channels;
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci	switch (format) {
3058c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM16_SIGNED:
3068c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM24_SIGNED:
3078c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM32_SIGNED:
3088c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM32_FLOAT:
3098c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM16_BIGENDIAN:
3108c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM8_UNSIGNED:
3118c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L1:
3128c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L2:
3138c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L3:
3148c2ecf20Sopenharmony_ci	case HPI_FORMAT_DOLBY_AC2:
3158c2ecf20Sopenharmony_ci	case HPI_FORMAT_AA_TAGIT1_HITS:
3168c2ecf20Sopenharmony_ci	case HPI_FORMAT_AA_TAGIT1_INSERTS:
3178c2ecf20Sopenharmony_ci	case HPI_FORMAT_RAW_BITSTREAM:
3188c2ecf20Sopenharmony_ci	case HPI_FORMAT_AA_TAGIT1_HITS_EX1:
3198c2ecf20Sopenharmony_ci	case HPI_FORMAT_OEM1:
3208c2ecf20Sopenharmony_ci	case HPI_FORMAT_OEM2:
3218c2ecf20Sopenharmony_ci		break;
3228c2ecf20Sopenharmony_ci	default:
3238c2ecf20Sopenharmony_ci		err = HPI_ERROR_INVALID_FORMAT;
3248c2ecf20Sopenharmony_ci		return err;
3258c2ecf20Sopenharmony_ci	}
3268c2ecf20Sopenharmony_ci	fmt.format = format;
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci	if (sample_rate < 8000L) {
3298c2ecf20Sopenharmony_ci		err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
3308c2ecf20Sopenharmony_ci		sample_rate = 8000L;
3318c2ecf20Sopenharmony_ci	}
3328c2ecf20Sopenharmony_ci	if (sample_rate > 200000L) {
3338c2ecf20Sopenharmony_ci		err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE;
3348c2ecf20Sopenharmony_ci		sample_rate = 200000L;
3358c2ecf20Sopenharmony_ci	}
3368c2ecf20Sopenharmony_ci	fmt.sample_rate = sample_rate;
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci	switch (format) {
3398c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L1:
3408c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L2:
3418c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L3:
3428c2ecf20Sopenharmony_ci		fmt.bit_rate = bit_rate;
3438c2ecf20Sopenharmony_ci		break;
3448c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM16_SIGNED:
3458c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM16_BIGENDIAN:
3468c2ecf20Sopenharmony_ci		fmt.bit_rate = channels * sample_rate * 2;
3478c2ecf20Sopenharmony_ci		break;
3488c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM32_SIGNED:
3498c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM32_FLOAT:
3508c2ecf20Sopenharmony_ci		fmt.bit_rate = channels * sample_rate * 4;
3518c2ecf20Sopenharmony_ci		break;
3528c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM8_UNSIGNED:
3538c2ecf20Sopenharmony_ci		fmt.bit_rate = channels * sample_rate;
3548c2ecf20Sopenharmony_ci		break;
3558c2ecf20Sopenharmony_ci	default:
3568c2ecf20Sopenharmony_ci		fmt.bit_rate = 0;
3578c2ecf20Sopenharmony_ci	}
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	switch (format) {
3608c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L2:
3618c2ecf20Sopenharmony_ci		if ((channels == 1)
3628c2ecf20Sopenharmony_ci			&& (attributes != HPI_MPEG_MODE_DEFAULT)) {
3638c2ecf20Sopenharmony_ci			attributes = HPI_MPEG_MODE_DEFAULT;
3648c2ecf20Sopenharmony_ci			err = HPI_ERROR_INVALID_FORMAT;
3658c2ecf20Sopenharmony_ci		} else if (attributes > HPI_MPEG_MODE_DUALCHANNEL) {
3668c2ecf20Sopenharmony_ci			attributes = HPI_MPEG_MODE_DEFAULT;
3678c2ecf20Sopenharmony_ci			err = HPI_ERROR_INVALID_FORMAT;
3688c2ecf20Sopenharmony_ci		}
3698c2ecf20Sopenharmony_ci		fmt.attributes = attributes;
3708c2ecf20Sopenharmony_ci		break;
3718c2ecf20Sopenharmony_ci	default:
3728c2ecf20Sopenharmony_ci		fmt.attributes = attributes;
3738c2ecf20Sopenharmony_ci	}
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci	hpi_msg_to_format(p_format, &fmt);
3768c2ecf20Sopenharmony_ci	return err;
3778c2ecf20Sopenharmony_ci}
3788c2ecf20Sopenharmony_ci
3798c2ecf20Sopenharmony_ciu16 hpi_stream_estimate_buffer_size(struct hpi_format *p_format,
3808c2ecf20Sopenharmony_ci	u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size)
3818c2ecf20Sopenharmony_ci{
3828c2ecf20Sopenharmony_ci
3838c2ecf20Sopenharmony_ci	u32 bytes_per_second;
3848c2ecf20Sopenharmony_ci	u32 size;
3858c2ecf20Sopenharmony_ci	u16 channels;
3868c2ecf20Sopenharmony_ci	struct hpi_format *pF = p_format;
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci	channels = pF->channels;
3898c2ecf20Sopenharmony_ci
3908c2ecf20Sopenharmony_ci	switch (pF->format) {
3918c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM16_BIGENDIAN:
3928c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM16_SIGNED:
3938c2ecf20Sopenharmony_ci		bytes_per_second = pF->sample_rate * 2L * channels;
3948c2ecf20Sopenharmony_ci		break;
3958c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM24_SIGNED:
3968c2ecf20Sopenharmony_ci		bytes_per_second = pF->sample_rate * 3L * channels;
3978c2ecf20Sopenharmony_ci		break;
3988c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM32_SIGNED:
3998c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM32_FLOAT:
4008c2ecf20Sopenharmony_ci		bytes_per_second = pF->sample_rate * 4L * channels;
4018c2ecf20Sopenharmony_ci		break;
4028c2ecf20Sopenharmony_ci	case HPI_FORMAT_PCM8_UNSIGNED:
4038c2ecf20Sopenharmony_ci		bytes_per_second = pF->sample_rate * 1L * channels;
4048c2ecf20Sopenharmony_ci		break;
4058c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L1:
4068c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L2:
4078c2ecf20Sopenharmony_ci	case HPI_FORMAT_MPEG_L3:
4088c2ecf20Sopenharmony_ci		bytes_per_second = pF->bit_rate / 8L;
4098c2ecf20Sopenharmony_ci		break;
4108c2ecf20Sopenharmony_ci	case HPI_FORMAT_DOLBY_AC2:
4118c2ecf20Sopenharmony_ci
4128c2ecf20Sopenharmony_ci		bytes_per_second = 256000L / 8L;
4138c2ecf20Sopenharmony_ci		break;
4148c2ecf20Sopenharmony_ci	default:
4158c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_FORMAT;
4168c2ecf20Sopenharmony_ci	}
4178c2ecf20Sopenharmony_ci	size = (bytes_per_second * host_polling_rate_in_milli_seconds * 2) /
4188c2ecf20Sopenharmony_ci		1000L;
4198c2ecf20Sopenharmony_ci
4208c2ecf20Sopenharmony_ci	*recommended_buffer_size =
4218c2ecf20Sopenharmony_ci		roundup_pow_of_two(((size + 4095L) & ~4095L));
4228c2ecf20Sopenharmony_ci	return 0;
4238c2ecf20Sopenharmony_ci}
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ciu16 hpi_outstream_open(u16 adapter_index, u16 outstream_index,
4268c2ecf20Sopenharmony_ci	u32 *ph_outstream)
4278c2ecf20Sopenharmony_ci{
4288c2ecf20Sopenharmony_ci	struct hpi_message hm;
4298c2ecf20Sopenharmony_ci	struct hpi_response hr;
4308c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
4318c2ecf20Sopenharmony_ci		HPI_OSTREAM_OPEN);
4328c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
4338c2ecf20Sopenharmony_ci	hm.obj_index = outstream_index;
4348c2ecf20Sopenharmony_ci
4358c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
4368c2ecf20Sopenharmony_ci
4378c2ecf20Sopenharmony_ci	if (hr.error == 0)
4388c2ecf20Sopenharmony_ci		*ph_outstream =
4398c2ecf20Sopenharmony_ci			hpi_indexes_to_handle(HPI_OBJ_OSTREAM, adapter_index,
4408c2ecf20Sopenharmony_ci			outstream_index);
4418c2ecf20Sopenharmony_ci	else
4428c2ecf20Sopenharmony_ci		*ph_outstream = 0;
4438c2ecf20Sopenharmony_ci	return hr.error;
4448c2ecf20Sopenharmony_ci}
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ciu16 hpi_outstream_close(u32 h_outstream)
4478c2ecf20Sopenharmony_ci{
4488c2ecf20Sopenharmony_ci	struct hpi_message hm;
4498c2ecf20Sopenharmony_ci	struct hpi_response hr;
4508c2ecf20Sopenharmony_ci
4518c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
4528c2ecf20Sopenharmony_ci		HPI_OSTREAM_HOSTBUFFER_FREE);
4538c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
4548c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
4598c2ecf20Sopenharmony_ci		HPI_OSTREAM_GROUP_RESET);
4608c2ecf20Sopenharmony_ci	hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
4618c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
4648c2ecf20Sopenharmony_ci		HPI_OSTREAM_CLOSE);
4658c2ecf20Sopenharmony_ci	hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index);
4668c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ci	return hr.error;
4698c2ecf20Sopenharmony_ci}
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ciu16 hpi_outstream_get_info_ex(u32 h_outstream, u16 *pw_state,
4728c2ecf20Sopenharmony_ci	u32 *pbuffer_size, u32 *pdata_to_play, u32 *psamples_played,
4738c2ecf20Sopenharmony_ci	u32 *pauxiliary_data_to_play)
4748c2ecf20Sopenharmony_ci{
4758c2ecf20Sopenharmony_ci	struct hpi_message hm;
4768c2ecf20Sopenharmony_ci	struct hpi_response hr;
4778c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
4788c2ecf20Sopenharmony_ci		HPI_OSTREAM_GET_INFO);
4798c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
4808c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci	if (pw_state)
4858c2ecf20Sopenharmony_ci		*pw_state = hr.u.d.u.stream_info.state;
4868c2ecf20Sopenharmony_ci	if (pbuffer_size)
4878c2ecf20Sopenharmony_ci		*pbuffer_size = hr.u.d.u.stream_info.buffer_size;
4888c2ecf20Sopenharmony_ci	if (pdata_to_play)
4898c2ecf20Sopenharmony_ci		*pdata_to_play = hr.u.d.u.stream_info.data_available;
4908c2ecf20Sopenharmony_ci	if (psamples_played)
4918c2ecf20Sopenharmony_ci		*psamples_played = hr.u.d.u.stream_info.samples_transferred;
4928c2ecf20Sopenharmony_ci	if (pauxiliary_data_to_play)
4938c2ecf20Sopenharmony_ci		*pauxiliary_data_to_play =
4948c2ecf20Sopenharmony_ci			hr.u.d.u.stream_info.auxiliary_data_available;
4958c2ecf20Sopenharmony_ci	return hr.error;
4968c2ecf20Sopenharmony_ci}
4978c2ecf20Sopenharmony_ci
4988c2ecf20Sopenharmony_ciu16 hpi_outstream_write_buf(u32 h_outstream, const u8 *pb_data,
4998c2ecf20Sopenharmony_ci	u32 bytes_to_write, const struct hpi_format *p_format)
5008c2ecf20Sopenharmony_ci{
5018c2ecf20Sopenharmony_ci	struct hpi_message hm;
5028c2ecf20Sopenharmony_ci	struct hpi_response hr;
5038c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
5048c2ecf20Sopenharmony_ci		HPI_OSTREAM_WRITE);
5058c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
5068c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
5078c2ecf20Sopenharmony_ci	hm.u.d.u.data.pb_data = (u8 *)pb_data;
5088c2ecf20Sopenharmony_ci	hm.u.d.u.data.data_size = bytes_to_write;
5098c2ecf20Sopenharmony_ci
5108c2ecf20Sopenharmony_ci	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
5138c2ecf20Sopenharmony_ci
5148c2ecf20Sopenharmony_ci	return hr.error;
5158c2ecf20Sopenharmony_ci}
5168c2ecf20Sopenharmony_ci
5178c2ecf20Sopenharmony_ciu16 hpi_outstream_start(u32 h_outstream)
5188c2ecf20Sopenharmony_ci{
5198c2ecf20Sopenharmony_ci	struct hpi_message hm;
5208c2ecf20Sopenharmony_ci	struct hpi_response hr;
5218c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
5228c2ecf20Sopenharmony_ci		HPI_OSTREAM_START);
5238c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
5248c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
5258c2ecf20Sopenharmony_ci
5268c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_ci	return hr.error;
5298c2ecf20Sopenharmony_ci}
5308c2ecf20Sopenharmony_ci
5318c2ecf20Sopenharmony_ciu16 hpi_outstream_wait_start(u32 h_outstream)
5328c2ecf20Sopenharmony_ci{
5338c2ecf20Sopenharmony_ci	struct hpi_message hm;
5348c2ecf20Sopenharmony_ci	struct hpi_response hr;
5358c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
5368c2ecf20Sopenharmony_ci		HPI_OSTREAM_WAIT_START);
5378c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
5388c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_ci	return hr.error;
5438c2ecf20Sopenharmony_ci}
5448c2ecf20Sopenharmony_ci
5458c2ecf20Sopenharmony_ciu16 hpi_outstream_stop(u32 h_outstream)
5468c2ecf20Sopenharmony_ci{
5478c2ecf20Sopenharmony_ci	struct hpi_message hm;
5488c2ecf20Sopenharmony_ci	struct hpi_response hr;
5498c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
5508c2ecf20Sopenharmony_ci		HPI_OSTREAM_STOP);
5518c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
5528c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
5558c2ecf20Sopenharmony_ci
5568c2ecf20Sopenharmony_ci	return hr.error;
5578c2ecf20Sopenharmony_ci}
5588c2ecf20Sopenharmony_ci
5598c2ecf20Sopenharmony_ciu16 hpi_outstream_sinegen(u32 h_outstream)
5608c2ecf20Sopenharmony_ci{
5618c2ecf20Sopenharmony_ci	struct hpi_message hm;
5628c2ecf20Sopenharmony_ci	struct hpi_response hr;
5638c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
5648c2ecf20Sopenharmony_ci		HPI_OSTREAM_SINEGEN);
5658c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
5668c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
5698c2ecf20Sopenharmony_ci
5708c2ecf20Sopenharmony_ci	return hr.error;
5718c2ecf20Sopenharmony_ci}
5728c2ecf20Sopenharmony_ci
5738c2ecf20Sopenharmony_ciu16 hpi_outstream_reset(u32 h_outstream)
5748c2ecf20Sopenharmony_ci{
5758c2ecf20Sopenharmony_ci	struct hpi_message hm;
5768c2ecf20Sopenharmony_ci	struct hpi_response hr;
5778c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
5788c2ecf20Sopenharmony_ci		HPI_OSTREAM_RESET);
5798c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
5808c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
5818c2ecf20Sopenharmony_ci
5828c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
5838c2ecf20Sopenharmony_ci
5848c2ecf20Sopenharmony_ci	return hr.error;
5858c2ecf20Sopenharmony_ci}
5868c2ecf20Sopenharmony_ci
5878c2ecf20Sopenharmony_ciu16 hpi_outstream_query_format(u32 h_outstream, struct hpi_format *p_format)
5888c2ecf20Sopenharmony_ci{
5898c2ecf20Sopenharmony_ci	struct hpi_message hm;
5908c2ecf20Sopenharmony_ci	struct hpi_response hr;
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
5938c2ecf20Sopenharmony_ci		HPI_OSTREAM_QUERY_FORMAT);
5948c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
5958c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
5968c2ecf20Sopenharmony_ci
5978c2ecf20Sopenharmony_ci	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
5988c2ecf20Sopenharmony_ci
5998c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci	return hr.error;
6028c2ecf20Sopenharmony_ci}
6038c2ecf20Sopenharmony_ci
6048c2ecf20Sopenharmony_ciu16 hpi_outstream_set_format(u32 h_outstream, struct hpi_format *p_format)
6058c2ecf20Sopenharmony_ci{
6068c2ecf20Sopenharmony_ci	struct hpi_message hm;
6078c2ecf20Sopenharmony_ci	struct hpi_response hr;
6088c2ecf20Sopenharmony_ci
6098c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
6108c2ecf20Sopenharmony_ci		HPI_OSTREAM_SET_FORMAT);
6118c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
6128c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
6138c2ecf20Sopenharmony_ci
6148c2ecf20Sopenharmony_ci	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
6158c2ecf20Sopenharmony_ci
6168c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
6178c2ecf20Sopenharmony_ci
6188c2ecf20Sopenharmony_ci	return hr.error;
6198c2ecf20Sopenharmony_ci}
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_ciu16 hpi_outstream_set_velocity(u32 h_outstream, short velocity)
6228c2ecf20Sopenharmony_ci{
6238c2ecf20Sopenharmony_ci	struct hpi_message hm;
6248c2ecf20Sopenharmony_ci	struct hpi_response hr;
6258c2ecf20Sopenharmony_ci
6268c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
6278c2ecf20Sopenharmony_ci		HPI_OSTREAM_SET_VELOCITY);
6288c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
6298c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
6308c2ecf20Sopenharmony_ci	hm.u.d.u.velocity = velocity;
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
6338c2ecf20Sopenharmony_ci
6348c2ecf20Sopenharmony_ci	return hr.error;
6358c2ecf20Sopenharmony_ci}
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_ciu16 hpi_outstream_set_punch_in_out(u32 h_outstream, u32 punch_in_sample,
6388c2ecf20Sopenharmony_ci	u32 punch_out_sample)
6398c2ecf20Sopenharmony_ci{
6408c2ecf20Sopenharmony_ci	struct hpi_message hm;
6418c2ecf20Sopenharmony_ci	struct hpi_response hr;
6428c2ecf20Sopenharmony_ci
6438c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
6448c2ecf20Sopenharmony_ci		HPI_OSTREAM_SET_PUNCHINOUT);
6458c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
6468c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
6478c2ecf20Sopenharmony_ci
6488c2ecf20Sopenharmony_ci	hm.u.d.u.pio.punch_in_sample = punch_in_sample;
6498c2ecf20Sopenharmony_ci	hm.u.d.u.pio.punch_out_sample = punch_out_sample;
6508c2ecf20Sopenharmony_ci
6518c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
6528c2ecf20Sopenharmony_ci
6538c2ecf20Sopenharmony_ci	return hr.error;
6548c2ecf20Sopenharmony_ci}
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ciu16 hpi_outstream_ancillary_reset(u32 h_outstream, u16 mode)
6578c2ecf20Sopenharmony_ci{
6588c2ecf20Sopenharmony_ci	struct hpi_message hm;
6598c2ecf20Sopenharmony_ci	struct hpi_response hr;
6608c2ecf20Sopenharmony_ci
6618c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
6628c2ecf20Sopenharmony_ci		HPI_OSTREAM_ANC_RESET);
6638c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
6648c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
6658c2ecf20Sopenharmony_ci	hm.u.d.u.data.format.channels = mode;
6668c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
6678c2ecf20Sopenharmony_ci	return hr.error;
6688c2ecf20Sopenharmony_ci}
6698c2ecf20Sopenharmony_ci
6708c2ecf20Sopenharmony_ciu16 hpi_outstream_ancillary_get_info(u32 h_outstream, u32 *pframes_available)
6718c2ecf20Sopenharmony_ci{
6728c2ecf20Sopenharmony_ci	struct hpi_message hm;
6738c2ecf20Sopenharmony_ci	struct hpi_response hr;
6748c2ecf20Sopenharmony_ci
6758c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
6768c2ecf20Sopenharmony_ci		HPI_OSTREAM_ANC_GET_INFO);
6778c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
6788c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
6798c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
6808c2ecf20Sopenharmony_ci	if (hr.error == 0) {
6818c2ecf20Sopenharmony_ci		if (pframes_available)
6828c2ecf20Sopenharmony_ci			*pframes_available =
6838c2ecf20Sopenharmony_ci				hr.u.d.u.stream_info.data_available /
6848c2ecf20Sopenharmony_ci				sizeof(struct hpi_anc_frame);
6858c2ecf20Sopenharmony_ci	}
6868c2ecf20Sopenharmony_ci	return hr.error;
6878c2ecf20Sopenharmony_ci}
6888c2ecf20Sopenharmony_ci
6898c2ecf20Sopenharmony_ciu16 hpi_outstream_ancillary_read(u32 h_outstream,
6908c2ecf20Sopenharmony_ci	struct hpi_anc_frame *p_anc_frame_buffer,
6918c2ecf20Sopenharmony_ci	u32 anc_frame_buffer_size_in_bytes,
6928c2ecf20Sopenharmony_ci	u32 number_of_ancillary_frames_to_read)
6938c2ecf20Sopenharmony_ci{
6948c2ecf20Sopenharmony_ci	struct hpi_message hm;
6958c2ecf20Sopenharmony_ci	struct hpi_response hr;
6968c2ecf20Sopenharmony_ci
6978c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
6988c2ecf20Sopenharmony_ci		HPI_OSTREAM_ANC_READ);
6998c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
7008c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
7018c2ecf20Sopenharmony_ci	hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
7028c2ecf20Sopenharmony_ci	hm.u.d.u.data.data_size =
7038c2ecf20Sopenharmony_ci		number_of_ancillary_frames_to_read *
7048c2ecf20Sopenharmony_ci		sizeof(struct hpi_anc_frame);
7058c2ecf20Sopenharmony_ci	if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
7068c2ecf20Sopenharmony_ci		hpi_send_recv(&hm, &hr);
7078c2ecf20Sopenharmony_ci	else
7088c2ecf20Sopenharmony_ci		hr.error = HPI_ERROR_INVALID_DATASIZE;
7098c2ecf20Sopenharmony_ci	return hr.error;
7108c2ecf20Sopenharmony_ci}
7118c2ecf20Sopenharmony_ci
7128c2ecf20Sopenharmony_ciu16 hpi_outstream_set_time_scale(u32 h_outstream, u32 time_scale)
7138c2ecf20Sopenharmony_ci{
7148c2ecf20Sopenharmony_ci	struct hpi_message hm;
7158c2ecf20Sopenharmony_ci	struct hpi_response hr;
7168c2ecf20Sopenharmony_ci
7178c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
7188c2ecf20Sopenharmony_ci		HPI_OSTREAM_SET_TIMESCALE);
7198c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
7208c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
7218c2ecf20Sopenharmony_ci
7228c2ecf20Sopenharmony_ci	hm.u.d.u.time_scale = time_scale;
7238c2ecf20Sopenharmony_ci
7248c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
7258c2ecf20Sopenharmony_ci
7268c2ecf20Sopenharmony_ci	return hr.error;
7278c2ecf20Sopenharmony_ci}
7288c2ecf20Sopenharmony_ci
7298c2ecf20Sopenharmony_ciu16 hpi_outstream_host_buffer_allocate(u32 h_outstream, u32 size_in_bytes)
7308c2ecf20Sopenharmony_ci{
7318c2ecf20Sopenharmony_ci	struct hpi_message hm;
7328c2ecf20Sopenharmony_ci	struct hpi_response hr;
7338c2ecf20Sopenharmony_ci
7348c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
7358c2ecf20Sopenharmony_ci		HPI_OSTREAM_HOSTBUFFER_ALLOC);
7368c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
7378c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
7388c2ecf20Sopenharmony_ci	hm.u.d.u.data.data_size = size_in_bytes;
7398c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
7408c2ecf20Sopenharmony_ci	return hr.error;
7418c2ecf20Sopenharmony_ci}
7428c2ecf20Sopenharmony_ci
7438c2ecf20Sopenharmony_ciu16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer,
7448c2ecf20Sopenharmony_ci	struct hpi_hostbuffer_status **pp_status)
7458c2ecf20Sopenharmony_ci{
7468c2ecf20Sopenharmony_ci	struct hpi_message hm;
7478c2ecf20Sopenharmony_ci	struct hpi_response hr;
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
7508c2ecf20Sopenharmony_ci		HPI_OSTREAM_HOSTBUFFER_GET_INFO);
7518c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
7528c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
7538c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
7548c2ecf20Sopenharmony_ci
7558c2ecf20Sopenharmony_ci	if (hr.error == 0) {
7568c2ecf20Sopenharmony_ci		if (pp_buffer)
7578c2ecf20Sopenharmony_ci			*pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
7588c2ecf20Sopenharmony_ci		if (pp_status)
7598c2ecf20Sopenharmony_ci			*pp_status = hr.u.d.u.hostbuffer_info.p_status;
7608c2ecf20Sopenharmony_ci	}
7618c2ecf20Sopenharmony_ci	return hr.error;
7628c2ecf20Sopenharmony_ci}
7638c2ecf20Sopenharmony_ci
7648c2ecf20Sopenharmony_ciu16 hpi_outstream_host_buffer_free(u32 h_outstream)
7658c2ecf20Sopenharmony_ci{
7668c2ecf20Sopenharmony_ci	struct hpi_message hm;
7678c2ecf20Sopenharmony_ci	struct hpi_response hr;
7688c2ecf20Sopenharmony_ci
7698c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
7708c2ecf20Sopenharmony_ci		HPI_OSTREAM_HOSTBUFFER_FREE);
7718c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
7728c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
7738c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
7748c2ecf20Sopenharmony_ci	return hr.error;
7758c2ecf20Sopenharmony_ci}
7768c2ecf20Sopenharmony_ci
7778c2ecf20Sopenharmony_ciu16 hpi_outstream_group_add(u32 h_outstream, u32 h_stream)
7788c2ecf20Sopenharmony_ci{
7798c2ecf20Sopenharmony_ci	struct hpi_message hm;
7808c2ecf20Sopenharmony_ci	struct hpi_response hr;
7818c2ecf20Sopenharmony_ci	u16 adapter;
7828c2ecf20Sopenharmony_ci	char c_obj_type;
7838c2ecf20Sopenharmony_ci
7848c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
7858c2ecf20Sopenharmony_ci		HPI_OSTREAM_GROUP_ADD);
7868c2ecf20Sopenharmony_ci
7878c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
7888c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
7898c2ecf20Sopenharmony_ci
7908c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_stream, &adapter,
7918c2ecf20Sopenharmony_ci			&hm.u.d.u.stream.stream_index))
7928c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
7938c2ecf20Sopenharmony_ci
7948c2ecf20Sopenharmony_ci	c_obj_type = hpi_handle_object(h_stream);
7958c2ecf20Sopenharmony_ci	switch (c_obj_type) {
7968c2ecf20Sopenharmony_ci	case HPI_OBJ_OSTREAM:
7978c2ecf20Sopenharmony_ci	case HPI_OBJ_ISTREAM:
7988c2ecf20Sopenharmony_ci		hm.u.d.u.stream.object_type = c_obj_type;
7998c2ecf20Sopenharmony_ci		break;
8008c2ecf20Sopenharmony_ci	default:
8018c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_OBJ;
8028c2ecf20Sopenharmony_ci	}
8038c2ecf20Sopenharmony_ci	if (adapter != hm.adapter_index)
8048c2ecf20Sopenharmony_ci		return HPI_ERROR_NO_INTERADAPTER_GROUPS;
8058c2ecf20Sopenharmony_ci
8068c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
8078c2ecf20Sopenharmony_ci	return hr.error;
8088c2ecf20Sopenharmony_ci}
8098c2ecf20Sopenharmony_ci
8108c2ecf20Sopenharmony_ciu16 hpi_outstream_group_get_map(u32 h_outstream, u32 *poutstream_map,
8118c2ecf20Sopenharmony_ci	u32 *pinstream_map)
8128c2ecf20Sopenharmony_ci{
8138c2ecf20Sopenharmony_ci	struct hpi_message hm;
8148c2ecf20Sopenharmony_ci	struct hpi_response hr;
8158c2ecf20Sopenharmony_ci
8168c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
8178c2ecf20Sopenharmony_ci		HPI_OSTREAM_GROUP_GETMAP);
8188c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
8198c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
8208c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
8218c2ecf20Sopenharmony_ci
8228c2ecf20Sopenharmony_ci	if (poutstream_map)
8238c2ecf20Sopenharmony_ci		*poutstream_map = hr.u.d.u.group_info.outstream_group_map;
8248c2ecf20Sopenharmony_ci	if (pinstream_map)
8258c2ecf20Sopenharmony_ci		*pinstream_map = hr.u.d.u.group_info.instream_group_map;
8268c2ecf20Sopenharmony_ci
8278c2ecf20Sopenharmony_ci	return hr.error;
8288c2ecf20Sopenharmony_ci}
8298c2ecf20Sopenharmony_ci
8308c2ecf20Sopenharmony_ciu16 hpi_outstream_group_reset(u32 h_outstream)
8318c2ecf20Sopenharmony_ci{
8328c2ecf20Sopenharmony_ci	struct hpi_message hm;
8338c2ecf20Sopenharmony_ci	struct hpi_response hr;
8348c2ecf20Sopenharmony_ci
8358c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM,
8368c2ecf20Sopenharmony_ci		HPI_OSTREAM_GROUP_RESET);
8378c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index))
8388c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
8398c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
8408c2ecf20Sopenharmony_ci	return hr.error;
8418c2ecf20Sopenharmony_ci}
8428c2ecf20Sopenharmony_ci
8438c2ecf20Sopenharmony_ciu16 hpi_instream_open(u16 adapter_index, u16 instream_index, u32 *ph_instream)
8448c2ecf20Sopenharmony_ci{
8458c2ecf20Sopenharmony_ci	struct hpi_message hm;
8468c2ecf20Sopenharmony_ci	struct hpi_response hr;
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
8498c2ecf20Sopenharmony_ci		HPI_ISTREAM_OPEN);
8508c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
8518c2ecf20Sopenharmony_ci	hm.obj_index = instream_index;
8528c2ecf20Sopenharmony_ci
8538c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
8548c2ecf20Sopenharmony_ci
8558c2ecf20Sopenharmony_ci	if (hr.error == 0)
8568c2ecf20Sopenharmony_ci		*ph_instream =
8578c2ecf20Sopenharmony_ci			hpi_indexes_to_handle(HPI_OBJ_ISTREAM, adapter_index,
8588c2ecf20Sopenharmony_ci			instream_index);
8598c2ecf20Sopenharmony_ci	else
8608c2ecf20Sopenharmony_ci		*ph_instream = 0;
8618c2ecf20Sopenharmony_ci
8628c2ecf20Sopenharmony_ci	return hr.error;
8638c2ecf20Sopenharmony_ci}
8648c2ecf20Sopenharmony_ci
8658c2ecf20Sopenharmony_ciu16 hpi_instream_close(u32 h_instream)
8668c2ecf20Sopenharmony_ci{
8678c2ecf20Sopenharmony_ci	struct hpi_message hm;
8688c2ecf20Sopenharmony_ci	struct hpi_response hr;
8698c2ecf20Sopenharmony_ci
8708c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
8718c2ecf20Sopenharmony_ci		HPI_ISTREAM_HOSTBUFFER_FREE);
8728c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
8738c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
8748c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
8758c2ecf20Sopenharmony_ci
8768c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
8778c2ecf20Sopenharmony_ci		HPI_ISTREAM_GROUP_RESET);
8788c2ecf20Sopenharmony_ci	hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
8798c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
8808c2ecf20Sopenharmony_ci
8818c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
8828c2ecf20Sopenharmony_ci		HPI_ISTREAM_CLOSE);
8838c2ecf20Sopenharmony_ci	hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index);
8848c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
8858c2ecf20Sopenharmony_ci
8868c2ecf20Sopenharmony_ci	return hr.error;
8878c2ecf20Sopenharmony_ci}
8888c2ecf20Sopenharmony_ci
8898c2ecf20Sopenharmony_ciu16 hpi_instream_query_format(u32 h_instream,
8908c2ecf20Sopenharmony_ci	const struct hpi_format *p_format)
8918c2ecf20Sopenharmony_ci{
8928c2ecf20Sopenharmony_ci	struct hpi_message hm;
8938c2ecf20Sopenharmony_ci	struct hpi_response hr;
8948c2ecf20Sopenharmony_ci
8958c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
8968c2ecf20Sopenharmony_ci		HPI_ISTREAM_QUERY_FORMAT);
8978c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
8988c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
8998c2ecf20Sopenharmony_ci	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
9008c2ecf20Sopenharmony_ci
9018c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
9028c2ecf20Sopenharmony_ci
9038c2ecf20Sopenharmony_ci	return hr.error;
9048c2ecf20Sopenharmony_ci}
9058c2ecf20Sopenharmony_ci
9068c2ecf20Sopenharmony_ciu16 hpi_instream_set_format(u32 h_instream, const struct hpi_format *p_format)
9078c2ecf20Sopenharmony_ci{
9088c2ecf20Sopenharmony_ci	struct hpi_message hm;
9098c2ecf20Sopenharmony_ci	struct hpi_response hr;
9108c2ecf20Sopenharmony_ci
9118c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
9128c2ecf20Sopenharmony_ci		HPI_ISTREAM_SET_FORMAT);
9138c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
9148c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
9158c2ecf20Sopenharmony_ci	hpi_format_to_msg(&hm.u.d.u.data.format, p_format);
9168c2ecf20Sopenharmony_ci
9178c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
9188c2ecf20Sopenharmony_ci
9198c2ecf20Sopenharmony_ci	return hr.error;
9208c2ecf20Sopenharmony_ci}
9218c2ecf20Sopenharmony_ci
9228c2ecf20Sopenharmony_ciu16 hpi_instream_read_buf(u32 h_instream, u8 *pb_data, u32 bytes_to_read)
9238c2ecf20Sopenharmony_ci{
9248c2ecf20Sopenharmony_ci	struct hpi_message hm;
9258c2ecf20Sopenharmony_ci	struct hpi_response hr;
9268c2ecf20Sopenharmony_ci
9278c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
9288c2ecf20Sopenharmony_ci		HPI_ISTREAM_READ);
9298c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
9308c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
9318c2ecf20Sopenharmony_ci	hm.u.d.u.data.data_size = bytes_to_read;
9328c2ecf20Sopenharmony_ci	hm.u.d.u.data.pb_data = pb_data;
9338c2ecf20Sopenharmony_ci
9348c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
9358c2ecf20Sopenharmony_ci
9368c2ecf20Sopenharmony_ci	return hr.error;
9378c2ecf20Sopenharmony_ci}
9388c2ecf20Sopenharmony_ci
9398c2ecf20Sopenharmony_ciu16 hpi_instream_start(u32 h_instream)
9408c2ecf20Sopenharmony_ci{
9418c2ecf20Sopenharmony_ci	struct hpi_message hm;
9428c2ecf20Sopenharmony_ci	struct hpi_response hr;
9438c2ecf20Sopenharmony_ci
9448c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
9458c2ecf20Sopenharmony_ci		HPI_ISTREAM_START);
9468c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
9478c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
9488c2ecf20Sopenharmony_ci
9498c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
9508c2ecf20Sopenharmony_ci
9518c2ecf20Sopenharmony_ci	return hr.error;
9528c2ecf20Sopenharmony_ci}
9538c2ecf20Sopenharmony_ci
9548c2ecf20Sopenharmony_ciu16 hpi_instream_wait_start(u32 h_instream)
9558c2ecf20Sopenharmony_ci{
9568c2ecf20Sopenharmony_ci	struct hpi_message hm;
9578c2ecf20Sopenharmony_ci	struct hpi_response hr;
9588c2ecf20Sopenharmony_ci
9598c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
9608c2ecf20Sopenharmony_ci		HPI_ISTREAM_WAIT_START);
9618c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
9628c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
9638c2ecf20Sopenharmony_ci
9648c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
9658c2ecf20Sopenharmony_ci
9668c2ecf20Sopenharmony_ci	return hr.error;
9678c2ecf20Sopenharmony_ci}
9688c2ecf20Sopenharmony_ci
9698c2ecf20Sopenharmony_ciu16 hpi_instream_stop(u32 h_instream)
9708c2ecf20Sopenharmony_ci{
9718c2ecf20Sopenharmony_ci	struct hpi_message hm;
9728c2ecf20Sopenharmony_ci	struct hpi_response hr;
9738c2ecf20Sopenharmony_ci
9748c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
9758c2ecf20Sopenharmony_ci		HPI_ISTREAM_STOP);
9768c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
9778c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
9788c2ecf20Sopenharmony_ci
9798c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
9808c2ecf20Sopenharmony_ci
9818c2ecf20Sopenharmony_ci	return hr.error;
9828c2ecf20Sopenharmony_ci}
9838c2ecf20Sopenharmony_ci
9848c2ecf20Sopenharmony_ciu16 hpi_instream_reset(u32 h_instream)
9858c2ecf20Sopenharmony_ci{
9868c2ecf20Sopenharmony_ci	struct hpi_message hm;
9878c2ecf20Sopenharmony_ci	struct hpi_response hr;
9888c2ecf20Sopenharmony_ci
9898c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
9908c2ecf20Sopenharmony_ci		HPI_ISTREAM_RESET);
9918c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
9928c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
9938c2ecf20Sopenharmony_ci
9948c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
9958c2ecf20Sopenharmony_ci
9968c2ecf20Sopenharmony_ci	return hr.error;
9978c2ecf20Sopenharmony_ci}
9988c2ecf20Sopenharmony_ci
9998c2ecf20Sopenharmony_ciu16 hpi_instream_get_info_ex(u32 h_instream, u16 *pw_state, u32 *pbuffer_size,
10008c2ecf20Sopenharmony_ci	u32 *pdata_recorded, u32 *psamples_recorded,
10018c2ecf20Sopenharmony_ci	u32 *pauxiliary_data_recorded)
10028c2ecf20Sopenharmony_ci{
10038c2ecf20Sopenharmony_ci	struct hpi_message hm;
10048c2ecf20Sopenharmony_ci	struct hpi_response hr;
10058c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
10068c2ecf20Sopenharmony_ci		HPI_ISTREAM_GET_INFO);
10078c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
10088c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
10098c2ecf20Sopenharmony_ci
10108c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
10118c2ecf20Sopenharmony_ci
10128c2ecf20Sopenharmony_ci	if (pw_state)
10138c2ecf20Sopenharmony_ci		*pw_state = hr.u.d.u.stream_info.state;
10148c2ecf20Sopenharmony_ci	if (pbuffer_size)
10158c2ecf20Sopenharmony_ci		*pbuffer_size = hr.u.d.u.stream_info.buffer_size;
10168c2ecf20Sopenharmony_ci	if (pdata_recorded)
10178c2ecf20Sopenharmony_ci		*pdata_recorded = hr.u.d.u.stream_info.data_available;
10188c2ecf20Sopenharmony_ci	if (psamples_recorded)
10198c2ecf20Sopenharmony_ci		*psamples_recorded = hr.u.d.u.stream_info.samples_transferred;
10208c2ecf20Sopenharmony_ci	if (pauxiliary_data_recorded)
10218c2ecf20Sopenharmony_ci		*pauxiliary_data_recorded =
10228c2ecf20Sopenharmony_ci			hr.u.d.u.stream_info.auxiliary_data_available;
10238c2ecf20Sopenharmony_ci	return hr.error;
10248c2ecf20Sopenharmony_ci}
10258c2ecf20Sopenharmony_ci
10268c2ecf20Sopenharmony_ciu16 hpi_instream_ancillary_reset(u32 h_instream, u16 bytes_per_frame,
10278c2ecf20Sopenharmony_ci	u16 mode, u16 alignment, u16 idle_bit)
10288c2ecf20Sopenharmony_ci{
10298c2ecf20Sopenharmony_ci	struct hpi_message hm;
10308c2ecf20Sopenharmony_ci	struct hpi_response hr;
10318c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
10328c2ecf20Sopenharmony_ci		HPI_ISTREAM_ANC_RESET);
10338c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
10348c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
10358c2ecf20Sopenharmony_ci	hm.u.d.u.data.format.attributes = bytes_per_frame;
10368c2ecf20Sopenharmony_ci	hm.u.d.u.data.format.format = (mode << 8) | (alignment & 0xff);
10378c2ecf20Sopenharmony_ci	hm.u.d.u.data.format.channels = idle_bit;
10388c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
10398c2ecf20Sopenharmony_ci	return hr.error;
10408c2ecf20Sopenharmony_ci}
10418c2ecf20Sopenharmony_ci
10428c2ecf20Sopenharmony_ciu16 hpi_instream_ancillary_get_info(u32 h_instream, u32 *pframe_space)
10438c2ecf20Sopenharmony_ci{
10448c2ecf20Sopenharmony_ci	struct hpi_message hm;
10458c2ecf20Sopenharmony_ci	struct hpi_response hr;
10468c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
10478c2ecf20Sopenharmony_ci		HPI_ISTREAM_ANC_GET_INFO);
10488c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
10498c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
10508c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
10518c2ecf20Sopenharmony_ci	if (pframe_space)
10528c2ecf20Sopenharmony_ci		*pframe_space =
10538c2ecf20Sopenharmony_ci			(hr.u.d.u.stream_info.buffer_size -
10548c2ecf20Sopenharmony_ci			hr.u.d.u.stream_info.data_available) /
10558c2ecf20Sopenharmony_ci			sizeof(struct hpi_anc_frame);
10568c2ecf20Sopenharmony_ci	return hr.error;
10578c2ecf20Sopenharmony_ci}
10588c2ecf20Sopenharmony_ci
10598c2ecf20Sopenharmony_ciu16 hpi_instream_ancillary_write(u32 h_instream,
10608c2ecf20Sopenharmony_ci	const struct hpi_anc_frame *p_anc_frame_buffer,
10618c2ecf20Sopenharmony_ci	u32 anc_frame_buffer_size_in_bytes,
10628c2ecf20Sopenharmony_ci	u32 number_of_ancillary_frames_to_write)
10638c2ecf20Sopenharmony_ci{
10648c2ecf20Sopenharmony_ci	struct hpi_message hm;
10658c2ecf20Sopenharmony_ci	struct hpi_response hr;
10668c2ecf20Sopenharmony_ci
10678c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
10688c2ecf20Sopenharmony_ci		HPI_ISTREAM_ANC_WRITE);
10698c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
10708c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
10718c2ecf20Sopenharmony_ci	hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer;
10728c2ecf20Sopenharmony_ci	hm.u.d.u.data.data_size =
10738c2ecf20Sopenharmony_ci		number_of_ancillary_frames_to_write *
10748c2ecf20Sopenharmony_ci		sizeof(struct hpi_anc_frame);
10758c2ecf20Sopenharmony_ci	if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes)
10768c2ecf20Sopenharmony_ci		hpi_send_recv(&hm, &hr);
10778c2ecf20Sopenharmony_ci	else
10788c2ecf20Sopenharmony_ci		hr.error = HPI_ERROR_INVALID_DATASIZE;
10798c2ecf20Sopenharmony_ci	return hr.error;
10808c2ecf20Sopenharmony_ci}
10818c2ecf20Sopenharmony_ci
10828c2ecf20Sopenharmony_ciu16 hpi_instream_host_buffer_allocate(u32 h_instream, u32 size_in_bytes)
10838c2ecf20Sopenharmony_ci{
10848c2ecf20Sopenharmony_ci
10858c2ecf20Sopenharmony_ci	struct hpi_message hm;
10868c2ecf20Sopenharmony_ci	struct hpi_response hr;
10878c2ecf20Sopenharmony_ci
10888c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
10898c2ecf20Sopenharmony_ci		HPI_ISTREAM_HOSTBUFFER_ALLOC);
10908c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
10918c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
10928c2ecf20Sopenharmony_ci	hm.u.d.u.data.data_size = size_in_bytes;
10938c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
10948c2ecf20Sopenharmony_ci	return hr.error;
10958c2ecf20Sopenharmony_ci}
10968c2ecf20Sopenharmony_ci
10978c2ecf20Sopenharmony_ciu16 hpi_instream_host_buffer_get_info(u32 h_instream, u8 **pp_buffer,
10988c2ecf20Sopenharmony_ci	struct hpi_hostbuffer_status **pp_status)
10998c2ecf20Sopenharmony_ci{
11008c2ecf20Sopenharmony_ci	struct hpi_message hm;
11018c2ecf20Sopenharmony_ci	struct hpi_response hr;
11028c2ecf20Sopenharmony_ci
11038c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
11048c2ecf20Sopenharmony_ci		HPI_ISTREAM_HOSTBUFFER_GET_INFO);
11058c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
11068c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
11078c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
11088c2ecf20Sopenharmony_ci
11098c2ecf20Sopenharmony_ci	if (hr.error == 0) {
11108c2ecf20Sopenharmony_ci		if (pp_buffer)
11118c2ecf20Sopenharmony_ci			*pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer;
11128c2ecf20Sopenharmony_ci		if (pp_status)
11138c2ecf20Sopenharmony_ci			*pp_status = hr.u.d.u.hostbuffer_info.p_status;
11148c2ecf20Sopenharmony_ci	}
11158c2ecf20Sopenharmony_ci	return hr.error;
11168c2ecf20Sopenharmony_ci}
11178c2ecf20Sopenharmony_ci
11188c2ecf20Sopenharmony_ciu16 hpi_instream_host_buffer_free(u32 h_instream)
11198c2ecf20Sopenharmony_ci{
11208c2ecf20Sopenharmony_ci
11218c2ecf20Sopenharmony_ci	struct hpi_message hm;
11228c2ecf20Sopenharmony_ci	struct hpi_response hr;
11238c2ecf20Sopenharmony_ci
11248c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
11258c2ecf20Sopenharmony_ci		HPI_ISTREAM_HOSTBUFFER_FREE);
11268c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
11278c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
11288c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
11298c2ecf20Sopenharmony_ci	return hr.error;
11308c2ecf20Sopenharmony_ci}
11318c2ecf20Sopenharmony_ci
11328c2ecf20Sopenharmony_ciu16 hpi_instream_group_add(u32 h_instream, u32 h_stream)
11338c2ecf20Sopenharmony_ci{
11348c2ecf20Sopenharmony_ci	struct hpi_message hm;
11358c2ecf20Sopenharmony_ci	struct hpi_response hr;
11368c2ecf20Sopenharmony_ci	u16 adapter;
11378c2ecf20Sopenharmony_ci	char c_obj_type;
11388c2ecf20Sopenharmony_ci
11398c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
11408c2ecf20Sopenharmony_ci		HPI_ISTREAM_GROUP_ADD);
11418c2ecf20Sopenharmony_ci	hr.error = 0;
11428c2ecf20Sopenharmony_ci
11438c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
11448c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
11458c2ecf20Sopenharmony_ci
11468c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_stream, &adapter,
11478c2ecf20Sopenharmony_ci			&hm.u.d.u.stream.stream_index))
11488c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
11498c2ecf20Sopenharmony_ci
11508c2ecf20Sopenharmony_ci	c_obj_type = hpi_handle_object(h_stream);
11518c2ecf20Sopenharmony_ci
11528c2ecf20Sopenharmony_ci	switch (c_obj_type) {
11538c2ecf20Sopenharmony_ci	case HPI_OBJ_OSTREAM:
11548c2ecf20Sopenharmony_ci	case HPI_OBJ_ISTREAM:
11558c2ecf20Sopenharmony_ci		hm.u.d.u.stream.object_type = c_obj_type;
11568c2ecf20Sopenharmony_ci		break;
11578c2ecf20Sopenharmony_ci	default:
11588c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_OBJ;
11598c2ecf20Sopenharmony_ci	}
11608c2ecf20Sopenharmony_ci
11618c2ecf20Sopenharmony_ci	if (adapter != hm.adapter_index)
11628c2ecf20Sopenharmony_ci		return HPI_ERROR_NO_INTERADAPTER_GROUPS;
11638c2ecf20Sopenharmony_ci
11648c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
11658c2ecf20Sopenharmony_ci	return hr.error;
11668c2ecf20Sopenharmony_ci}
11678c2ecf20Sopenharmony_ci
11688c2ecf20Sopenharmony_ciu16 hpi_instream_group_get_map(u32 h_instream, u32 *poutstream_map,
11698c2ecf20Sopenharmony_ci	u32 *pinstream_map)
11708c2ecf20Sopenharmony_ci{
11718c2ecf20Sopenharmony_ci	struct hpi_message hm;
11728c2ecf20Sopenharmony_ci	struct hpi_response hr;
11738c2ecf20Sopenharmony_ci
11748c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
11758c2ecf20Sopenharmony_ci		HPI_ISTREAM_HOSTBUFFER_FREE);
11768c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
11778c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
11788c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
11798c2ecf20Sopenharmony_ci
11808c2ecf20Sopenharmony_ci	if (poutstream_map)
11818c2ecf20Sopenharmony_ci		*poutstream_map = hr.u.d.u.group_info.outstream_group_map;
11828c2ecf20Sopenharmony_ci	if (pinstream_map)
11838c2ecf20Sopenharmony_ci		*pinstream_map = hr.u.d.u.group_info.instream_group_map;
11848c2ecf20Sopenharmony_ci
11858c2ecf20Sopenharmony_ci	return hr.error;
11868c2ecf20Sopenharmony_ci}
11878c2ecf20Sopenharmony_ci
11888c2ecf20Sopenharmony_ciu16 hpi_instream_group_reset(u32 h_instream)
11898c2ecf20Sopenharmony_ci{
11908c2ecf20Sopenharmony_ci	struct hpi_message hm;
11918c2ecf20Sopenharmony_ci	struct hpi_response hr;
11928c2ecf20Sopenharmony_ci
11938c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM,
11948c2ecf20Sopenharmony_ci		HPI_ISTREAM_GROUP_RESET);
11958c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index))
11968c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
11978c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
11988c2ecf20Sopenharmony_ci	return hr.error;
11998c2ecf20Sopenharmony_ci}
12008c2ecf20Sopenharmony_ci
12018c2ecf20Sopenharmony_ciu16 hpi_mixer_open(u16 adapter_index, u32 *ph_mixer)
12028c2ecf20Sopenharmony_ci{
12038c2ecf20Sopenharmony_ci	struct hpi_message hm;
12048c2ecf20Sopenharmony_ci	struct hpi_response hr;
12058c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN);
12068c2ecf20Sopenharmony_ci	hm.adapter_index = adapter_index;
12078c2ecf20Sopenharmony_ci
12088c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
12098c2ecf20Sopenharmony_ci
12108c2ecf20Sopenharmony_ci	if (hr.error == 0)
12118c2ecf20Sopenharmony_ci		*ph_mixer =
12128c2ecf20Sopenharmony_ci			hpi_indexes_to_handle(HPI_OBJ_MIXER, adapter_index,
12138c2ecf20Sopenharmony_ci			0);
12148c2ecf20Sopenharmony_ci	else
12158c2ecf20Sopenharmony_ci		*ph_mixer = 0;
12168c2ecf20Sopenharmony_ci	return hr.error;
12178c2ecf20Sopenharmony_ci}
12188c2ecf20Sopenharmony_ci
12198c2ecf20Sopenharmony_ciu16 hpi_mixer_close(u32 h_mixer)
12208c2ecf20Sopenharmony_ci{
12218c2ecf20Sopenharmony_ci	struct hpi_message hm;
12228c2ecf20Sopenharmony_ci	struct hpi_response hr;
12238c2ecf20Sopenharmony_ci
12248c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE);
12258c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
12268c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
12278c2ecf20Sopenharmony_ci
12288c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
12298c2ecf20Sopenharmony_ci	return hr.error;
12308c2ecf20Sopenharmony_ci}
12318c2ecf20Sopenharmony_ci
12328c2ecf20Sopenharmony_ciu16 hpi_mixer_get_control(u32 h_mixer, u16 src_node_type,
12338c2ecf20Sopenharmony_ci	u16 src_node_type_index, u16 dst_node_type, u16 dst_node_type_index,
12348c2ecf20Sopenharmony_ci	u16 control_type, u32 *ph_control)
12358c2ecf20Sopenharmony_ci{
12368c2ecf20Sopenharmony_ci	struct hpi_message hm;
12378c2ecf20Sopenharmony_ci	struct hpi_response hr;
12388c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
12398c2ecf20Sopenharmony_ci		HPI_MIXER_GET_CONTROL);
12408c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
12418c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
12428c2ecf20Sopenharmony_ci	hm.u.m.node_type1 = src_node_type;
12438c2ecf20Sopenharmony_ci	hm.u.m.node_index1 = src_node_type_index;
12448c2ecf20Sopenharmony_ci	hm.u.m.node_type2 = dst_node_type;
12458c2ecf20Sopenharmony_ci	hm.u.m.node_index2 = dst_node_type_index;
12468c2ecf20Sopenharmony_ci	hm.u.m.control_type = control_type;
12478c2ecf20Sopenharmony_ci
12488c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
12498c2ecf20Sopenharmony_ci
12508c2ecf20Sopenharmony_ci	if (hr.error == 0)
12518c2ecf20Sopenharmony_ci		*ph_control =
12528c2ecf20Sopenharmony_ci			hpi_indexes_to_handle(HPI_OBJ_CONTROL,
12538c2ecf20Sopenharmony_ci			hm.adapter_index, hr.u.m.control_index);
12548c2ecf20Sopenharmony_ci	else
12558c2ecf20Sopenharmony_ci		*ph_control = 0;
12568c2ecf20Sopenharmony_ci	return hr.error;
12578c2ecf20Sopenharmony_ci}
12588c2ecf20Sopenharmony_ci
12598c2ecf20Sopenharmony_ciu16 hpi_mixer_get_control_by_index(u32 h_mixer, u16 control_index,
12608c2ecf20Sopenharmony_ci	u16 *pw_src_node_type, u16 *pw_src_node_index, u16 *pw_dst_node_type,
12618c2ecf20Sopenharmony_ci	u16 *pw_dst_node_index, u16 *pw_control_type, u32 *ph_control)
12628c2ecf20Sopenharmony_ci{
12638c2ecf20Sopenharmony_ci	struct hpi_message hm;
12648c2ecf20Sopenharmony_ci	struct hpi_response hr;
12658c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER,
12668c2ecf20Sopenharmony_ci		HPI_MIXER_GET_CONTROL_BY_INDEX);
12678c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
12688c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
12698c2ecf20Sopenharmony_ci	hm.u.m.control_index = control_index;
12708c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
12718c2ecf20Sopenharmony_ci
12728c2ecf20Sopenharmony_ci	if (pw_src_node_type) {
12738c2ecf20Sopenharmony_ci		*pw_src_node_type =
12748c2ecf20Sopenharmony_ci			hr.u.m.src_node_type + HPI_SOURCENODE_NONE;
12758c2ecf20Sopenharmony_ci		*pw_src_node_index = hr.u.m.src_node_index;
12768c2ecf20Sopenharmony_ci		*pw_dst_node_type = hr.u.m.dst_node_type + HPI_DESTNODE_NONE;
12778c2ecf20Sopenharmony_ci		*pw_dst_node_index = hr.u.m.dst_node_index;
12788c2ecf20Sopenharmony_ci	}
12798c2ecf20Sopenharmony_ci	if (pw_control_type)
12808c2ecf20Sopenharmony_ci		*pw_control_type = hr.u.m.control_index;
12818c2ecf20Sopenharmony_ci
12828c2ecf20Sopenharmony_ci	if (ph_control) {
12838c2ecf20Sopenharmony_ci		if (hr.error == 0)
12848c2ecf20Sopenharmony_ci			*ph_control =
12858c2ecf20Sopenharmony_ci				hpi_indexes_to_handle(HPI_OBJ_CONTROL,
12868c2ecf20Sopenharmony_ci				hm.adapter_index, control_index);
12878c2ecf20Sopenharmony_ci		else
12888c2ecf20Sopenharmony_ci			*ph_control = 0;
12898c2ecf20Sopenharmony_ci	}
12908c2ecf20Sopenharmony_ci	return hr.error;
12918c2ecf20Sopenharmony_ci}
12928c2ecf20Sopenharmony_ci
12938c2ecf20Sopenharmony_ciu16 hpi_mixer_store(u32 h_mixer, enum HPI_MIXER_STORE_COMMAND command,
12948c2ecf20Sopenharmony_ci	u16 index)
12958c2ecf20Sopenharmony_ci{
12968c2ecf20Sopenharmony_ci	struct hpi_message hm;
12978c2ecf20Sopenharmony_ci	struct hpi_response hr;
12988c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_STORE);
12998c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL))
13008c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
13018c2ecf20Sopenharmony_ci	hm.u.mx.store.command = command;
13028c2ecf20Sopenharmony_ci	hm.u.mx.store.index = index;
13038c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
13048c2ecf20Sopenharmony_ci	return hr.error;
13058c2ecf20Sopenharmony_ci}
13068c2ecf20Sopenharmony_ci
13078c2ecf20Sopenharmony_cistatic
13088c2ecf20Sopenharmony_ciu16 hpi_control_param_set(const u32 h_control, const u16 attrib,
13098c2ecf20Sopenharmony_ci	const u32 param1, const u32 param2)
13108c2ecf20Sopenharmony_ci{
13118c2ecf20Sopenharmony_ci	struct hpi_message hm;
13128c2ecf20Sopenharmony_ci	struct hpi_response hr;
13138c2ecf20Sopenharmony_ci
13148c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
13158c2ecf20Sopenharmony_ci		HPI_CONTROL_SET_STATE);
13168c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
13178c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
13188c2ecf20Sopenharmony_ci	hm.u.c.attribute = attrib;
13198c2ecf20Sopenharmony_ci	hm.u.c.param1 = param1;
13208c2ecf20Sopenharmony_ci	hm.u.c.param2 = param2;
13218c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
13228c2ecf20Sopenharmony_ci	return hr.error;
13238c2ecf20Sopenharmony_ci}
13248c2ecf20Sopenharmony_ci
13258c2ecf20Sopenharmony_cistatic u16 hpi_control_log_set2(u32 h_control, u16 attrib, short sv0,
13268c2ecf20Sopenharmony_ci	short sv1)
13278c2ecf20Sopenharmony_ci{
13288c2ecf20Sopenharmony_ci	struct hpi_message hm;
13298c2ecf20Sopenharmony_ci	struct hpi_response hr;
13308c2ecf20Sopenharmony_ci
13318c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
13328c2ecf20Sopenharmony_ci		HPI_CONTROL_SET_STATE);
13338c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
13348c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
13358c2ecf20Sopenharmony_ci	hm.u.c.attribute = attrib;
13368c2ecf20Sopenharmony_ci	hm.u.c.an_log_value[0] = sv0;
13378c2ecf20Sopenharmony_ci	hm.u.c.an_log_value[1] = sv1;
13388c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
13398c2ecf20Sopenharmony_ci	return hr.error;
13408c2ecf20Sopenharmony_ci}
13418c2ecf20Sopenharmony_ci
13428c2ecf20Sopenharmony_cistatic
13438c2ecf20Sopenharmony_ciu16 hpi_control_param_get(const u32 h_control, const u16 attrib, u32 param1,
13448c2ecf20Sopenharmony_ci	u32 param2, u32 *pparam1, u32 *pparam2)
13458c2ecf20Sopenharmony_ci{
13468c2ecf20Sopenharmony_ci	struct hpi_message hm;
13478c2ecf20Sopenharmony_ci	struct hpi_response hr;
13488c2ecf20Sopenharmony_ci
13498c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
13508c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
13518c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
13528c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
13538c2ecf20Sopenharmony_ci	hm.u.c.attribute = attrib;
13548c2ecf20Sopenharmony_ci	hm.u.c.param1 = param1;
13558c2ecf20Sopenharmony_ci	hm.u.c.param2 = param2;
13568c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
13578c2ecf20Sopenharmony_ci
13588c2ecf20Sopenharmony_ci	*pparam1 = hr.u.c.param1;
13598c2ecf20Sopenharmony_ci	if (pparam2)
13608c2ecf20Sopenharmony_ci		*pparam2 = hr.u.c.param2;
13618c2ecf20Sopenharmony_ci
13628c2ecf20Sopenharmony_ci	return hr.error;
13638c2ecf20Sopenharmony_ci}
13648c2ecf20Sopenharmony_ci
13658c2ecf20Sopenharmony_ci#define hpi_control_param1_get(h, a, p1) \
13668c2ecf20Sopenharmony_ci		hpi_control_param_get(h, a, 0, 0, p1, NULL)
13678c2ecf20Sopenharmony_ci#define hpi_control_param2_get(h, a, p1, p2) \
13688c2ecf20Sopenharmony_ci		hpi_control_param_get(h, a, 0, 0, p1, p2)
13698c2ecf20Sopenharmony_ci
13708c2ecf20Sopenharmony_cistatic u16 hpi_control_log_get2(u32 h_control, u16 attrib, short *sv0,
13718c2ecf20Sopenharmony_ci	short *sv1)
13728c2ecf20Sopenharmony_ci{
13738c2ecf20Sopenharmony_ci	struct hpi_message hm;
13748c2ecf20Sopenharmony_ci	struct hpi_response hr;
13758c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
13768c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
13778c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
13788c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
13798c2ecf20Sopenharmony_ci	hm.u.c.attribute = attrib;
13808c2ecf20Sopenharmony_ci
13818c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
13828c2ecf20Sopenharmony_ci	*sv0 = hr.u.c.an_log_value[0];
13838c2ecf20Sopenharmony_ci	if (sv1)
13848c2ecf20Sopenharmony_ci		*sv1 = hr.u.c.an_log_value[1];
13858c2ecf20Sopenharmony_ci	return hr.error;
13868c2ecf20Sopenharmony_ci}
13878c2ecf20Sopenharmony_ci
13888c2ecf20Sopenharmony_cistatic
13898c2ecf20Sopenharmony_ciu16 hpi_control_query(const u32 h_control, const u16 attrib, const u32 index,
13908c2ecf20Sopenharmony_ci	const u32 param, u32 *psetting)
13918c2ecf20Sopenharmony_ci{
13928c2ecf20Sopenharmony_ci	struct hpi_message hm;
13938c2ecf20Sopenharmony_ci	struct hpi_response hr;
13948c2ecf20Sopenharmony_ci
13958c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
13968c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_INFO);
13978c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
13988c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
13998c2ecf20Sopenharmony_ci
14008c2ecf20Sopenharmony_ci	hm.u.c.attribute = attrib;
14018c2ecf20Sopenharmony_ci	hm.u.c.param1 = index;
14028c2ecf20Sopenharmony_ci	hm.u.c.param2 = param;
14038c2ecf20Sopenharmony_ci
14048c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
14058c2ecf20Sopenharmony_ci	*psetting = hr.u.c.param1;
14068c2ecf20Sopenharmony_ci
14078c2ecf20Sopenharmony_ci	return hr.error;
14088c2ecf20Sopenharmony_ci}
14098c2ecf20Sopenharmony_ci
14108c2ecf20Sopenharmony_cistatic u16 hpi_control_get_string(const u32 h_control, const u16 attribute,
14118c2ecf20Sopenharmony_ci	char *psz_string, const u32 string_length)
14128c2ecf20Sopenharmony_ci{
14138c2ecf20Sopenharmony_ci	unsigned int sub_string_index = 0, j = 0;
14148c2ecf20Sopenharmony_ci	char c = 0;
14158c2ecf20Sopenharmony_ci	unsigned int n = 0;
14168c2ecf20Sopenharmony_ci	u16 err = 0;
14178c2ecf20Sopenharmony_ci
14188c2ecf20Sopenharmony_ci	if ((string_length < 1) || (string_length > 256))
14198c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_CONTROL_VALUE;
14208c2ecf20Sopenharmony_ci	for (sub_string_index = 0; sub_string_index < string_length;
14218c2ecf20Sopenharmony_ci		sub_string_index += 8) {
14228c2ecf20Sopenharmony_ci		struct hpi_message hm;
14238c2ecf20Sopenharmony_ci		struct hpi_response hr;
14248c2ecf20Sopenharmony_ci
14258c2ecf20Sopenharmony_ci		hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
14268c2ecf20Sopenharmony_ci			HPI_CONTROL_GET_STATE);
14278c2ecf20Sopenharmony_ci		if (hpi_handle_indexes(h_control, &hm.adapter_index,
14288c2ecf20Sopenharmony_ci				&hm.obj_index))
14298c2ecf20Sopenharmony_ci			return HPI_ERROR_INVALID_HANDLE;
14308c2ecf20Sopenharmony_ci		hm.u.c.attribute = attribute;
14318c2ecf20Sopenharmony_ci		hm.u.c.param1 = sub_string_index;
14328c2ecf20Sopenharmony_ci		hm.u.c.param2 = 0;
14338c2ecf20Sopenharmony_ci		hpi_send_recv(&hm, &hr);
14348c2ecf20Sopenharmony_ci
14358c2ecf20Sopenharmony_ci		if (sub_string_index == 0
14368c2ecf20Sopenharmony_ci			&& (hr.u.cu.chars8.remaining_chars + 8) >
14378c2ecf20Sopenharmony_ci			string_length)
14388c2ecf20Sopenharmony_ci			return HPI_ERROR_INVALID_CONTROL_VALUE;
14398c2ecf20Sopenharmony_ci
14408c2ecf20Sopenharmony_ci		if (hr.error) {
14418c2ecf20Sopenharmony_ci			err = hr.error;
14428c2ecf20Sopenharmony_ci			break;
14438c2ecf20Sopenharmony_ci		}
14448c2ecf20Sopenharmony_ci		for (j = 0; j < 8; j++) {
14458c2ecf20Sopenharmony_ci			c = hr.u.cu.chars8.sz_data[j];
14468c2ecf20Sopenharmony_ci			psz_string[sub_string_index + j] = c;
14478c2ecf20Sopenharmony_ci			n++;
14488c2ecf20Sopenharmony_ci			if (n >= string_length) {
14498c2ecf20Sopenharmony_ci				psz_string[string_length - 1] = 0;
14508c2ecf20Sopenharmony_ci				err = HPI_ERROR_INVALID_CONTROL_VALUE;
14518c2ecf20Sopenharmony_ci				break;
14528c2ecf20Sopenharmony_ci			}
14538c2ecf20Sopenharmony_ci			if (c == 0)
14548c2ecf20Sopenharmony_ci				break;
14558c2ecf20Sopenharmony_ci		}
14568c2ecf20Sopenharmony_ci
14578c2ecf20Sopenharmony_ci		if ((hr.u.cu.chars8.remaining_chars == 0)
14588c2ecf20Sopenharmony_ci			&& ((sub_string_index + j) < string_length)
14598c2ecf20Sopenharmony_ci			&& (c != 0)) {
14608c2ecf20Sopenharmony_ci			c = 0;
14618c2ecf20Sopenharmony_ci			psz_string[sub_string_index + j] = c;
14628c2ecf20Sopenharmony_ci		}
14638c2ecf20Sopenharmony_ci		if (c == 0)
14648c2ecf20Sopenharmony_ci			break;
14658c2ecf20Sopenharmony_ci	}
14668c2ecf20Sopenharmony_ci	return err;
14678c2ecf20Sopenharmony_ci}
14688c2ecf20Sopenharmony_ci
14698c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_query_format(const u32 h_aes_rx, const u32 index,
14708c2ecf20Sopenharmony_ci	u16 *pw_format)
14718c2ecf20Sopenharmony_ci{
14728c2ecf20Sopenharmony_ci	u32 qr;
14738c2ecf20Sopenharmony_ci	u16 err;
14748c2ecf20Sopenharmony_ci
14758c2ecf20Sopenharmony_ci	err = hpi_control_query(h_aes_rx, HPI_AESEBURX_FORMAT, index, 0, &qr);
14768c2ecf20Sopenharmony_ci	*pw_format = (u16)qr;
14778c2ecf20Sopenharmony_ci	return err;
14788c2ecf20Sopenharmony_ci}
14798c2ecf20Sopenharmony_ci
14808c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_set_format(u32 h_control, u16 format)
14818c2ecf20Sopenharmony_ci{
14828c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_AESEBURX_FORMAT, format,
14838c2ecf20Sopenharmony_ci		0);
14848c2ecf20Sopenharmony_ci}
14858c2ecf20Sopenharmony_ci
14868c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_format(u32 h_control, u16 *pw_format)
14878c2ecf20Sopenharmony_ci{
14888c2ecf20Sopenharmony_ci	u16 err;
14898c2ecf20Sopenharmony_ci	u32 param;
14908c2ecf20Sopenharmony_ci
14918c2ecf20Sopenharmony_ci	err = hpi_control_param1_get(h_control, HPI_AESEBURX_FORMAT, &param);
14928c2ecf20Sopenharmony_ci	if (!err && pw_format)
14938c2ecf20Sopenharmony_ci		*pw_format = (u16)param;
14948c2ecf20Sopenharmony_ci
14958c2ecf20Sopenharmony_ci	return err;
14968c2ecf20Sopenharmony_ci}
14978c2ecf20Sopenharmony_ci
14988c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_sample_rate(u32 h_control, u32 *psample_rate)
14998c2ecf20Sopenharmony_ci{
15008c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_AESEBURX_SAMPLERATE,
15018c2ecf20Sopenharmony_ci		psample_rate);
15028c2ecf20Sopenharmony_ci}
15038c2ecf20Sopenharmony_ci
15048c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_user_data(u32 h_control, u16 index, u16 *pw_data)
15058c2ecf20Sopenharmony_ci{
15068c2ecf20Sopenharmony_ci	struct hpi_message hm;
15078c2ecf20Sopenharmony_ci	struct hpi_response hr;
15088c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
15098c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
15108c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
15118c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
15128c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_AESEBURX_USERDATA;
15138c2ecf20Sopenharmony_ci	hm.u.c.param1 = index;
15148c2ecf20Sopenharmony_ci
15158c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
15168c2ecf20Sopenharmony_ci
15178c2ecf20Sopenharmony_ci	if (pw_data)
15188c2ecf20Sopenharmony_ci		*pw_data = (u16)hr.u.c.param2;
15198c2ecf20Sopenharmony_ci	return hr.error;
15208c2ecf20Sopenharmony_ci}
15218c2ecf20Sopenharmony_ci
15228c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_channel_status(u32 h_control, u16 index,
15238c2ecf20Sopenharmony_ci	u16 *pw_data)
15248c2ecf20Sopenharmony_ci{
15258c2ecf20Sopenharmony_ci	struct hpi_message hm;
15268c2ecf20Sopenharmony_ci	struct hpi_response hr;
15278c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
15288c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
15298c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
15308c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
15318c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_AESEBURX_CHANNELSTATUS;
15328c2ecf20Sopenharmony_ci	hm.u.c.param1 = index;
15338c2ecf20Sopenharmony_ci
15348c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
15358c2ecf20Sopenharmony_ci
15368c2ecf20Sopenharmony_ci	if (pw_data)
15378c2ecf20Sopenharmony_ci		*pw_data = (u16)hr.u.c.param2;
15388c2ecf20Sopenharmony_ci	return hr.error;
15398c2ecf20Sopenharmony_ci}
15408c2ecf20Sopenharmony_ci
15418c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_error_status(u32 h_control, u16 *pw_error_data)
15428c2ecf20Sopenharmony_ci{
15438c2ecf20Sopenharmony_ci	u32 error_data = 0;
15448c2ecf20Sopenharmony_ci	u16 err = 0;
15458c2ecf20Sopenharmony_ci
15468c2ecf20Sopenharmony_ci	err = hpi_control_param1_get(h_control, HPI_AESEBURX_ERRORSTATUS,
15478c2ecf20Sopenharmony_ci		&error_data);
15488c2ecf20Sopenharmony_ci	if (pw_error_data)
15498c2ecf20Sopenharmony_ci		*pw_error_data = (u16)error_data;
15508c2ecf20Sopenharmony_ci	return err;
15518c2ecf20Sopenharmony_ci}
15528c2ecf20Sopenharmony_ci
15538c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_sample_rate(u32 h_control, u32 sample_rate)
15548c2ecf20Sopenharmony_ci{
15558c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_AESEBUTX_SAMPLERATE,
15568c2ecf20Sopenharmony_ci		sample_rate, 0);
15578c2ecf20Sopenharmony_ci}
15588c2ecf20Sopenharmony_ci
15598c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_user_data(u32 h_control, u16 index, u16 data)
15608c2ecf20Sopenharmony_ci{
15618c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_AESEBUTX_USERDATA, index,
15628c2ecf20Sopenharmony_ci		data);
15638c2ecf20Sopenharmony_ci}
15648c2ecf20Sopenharmony_ci
15658c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_channel_status(u32 h_control, u16 index,
15668c2ecf20Sopenharmony_ci	u16 data)
15678c2ecf20Sopenharmony_ci{
15688c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_AESEBUTX_CHANNELSTATUS,
15698c2ecf20Sopenharmony_ci		index, data);
15708c2ecf20Sopenharmony_ci}
15718c2ecf20Sopenharmony_ci
15728c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_get_channel_status(u32 h_control, u16 index,
15738c2ecf20Sopenharmony_ci	u16 *pw_data)
15748c2ecf20Sopenharmony_ci{
15758c2ecf20Sopenharmony_ci	return HPI_ERROR_INVALID_OPERATION;
15768c2ecf20Sopenharmony_ci}
15778c2ecf20Sopenharmony_ci
15788c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_query_format(const u32 h_aes_tx, const u32 index,
15798c2ecf20Sopenharmony_ci	u16 *pw_format)
15808c2ecf20Sopenharmony_ci{
15818c2ecf20Sopenharmony_ci	u32 qr;
15828c2ecf20Sopenharmony_ci	u16 err;
15838c2ecf20Sopenharmony_ci
15848c2ecf20Sopenharmony_ci	err = hpi_control_query(h_aes_tx, HPI_AESEBUTX_FORMAT, index, 0, &qr);
15858c2ecf20Sopenharmony_ci	*pw_format = (u16)qr;
15868c2ecf20Sopenharmony_ci	return err;
15878c2ecf20Sopenharmony_ci}
15888c2ecf20Sopenharmony_ci
15898c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_format(u32 h_control, u16 output_format)
15908c2ecf20Sopenharmony_ci{
15918c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_AESEBUTX_FORMAT,
15928c2ecf20Sopenharmony_ci		output_format, 0);
15938c2ecf20Sopenharmony_ci}
15948c2ecf20Sopenharmony_ci
15958c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_get_format(u32 h_control, u16 *pw_output_format)
15968c2ecf20Sopenharmony_ci{
15978c2ecf20Sopenharmony_ci	u16 err;
15988c2ecf20Sopenharmony_ci	u32 param;
15998c2ecf20Sopenharmony_ci
16008c2ecf20Sopenharmony_ci	err = hpi_control_param1_get(h_control, HPI_AESEBUTX_FORMAT, &param);
16018c2ecf20Sopenharmony_ci	if (!err && pw_output_format)
16028c2ecf20Sopenharmony_ci		*pw_output_format = (u16)param;
16038c2ecf20Sopenharmony_ci
16048c2ecf20Sopenharmony_ci	return err;
16058c2ecf20Sopenharmony_ci}
16068c2ecf20Sopenharmony_ci
16078c2ecf20Sopenharmony_ciu16 hpi_bitstream_set_clock_edge(u32 h_control, u16 edge_type)
16088c2ecf20Sopenharmony_ci{
16098c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_BITSTREAM_CLOCK_EDGE,
16108c2ecf20Sopenharmony_ci		edge_type, 0);
16118c2ecf20Sopenharmony_ci}
16128c2ecf20Sopenharmony_ci
16138c2ecf20Sopenharmony_ciu16 hpi_bitstream_set_data_polarity(u32 h_control, u16 polarity)
16148c2ecf20Sopenharmony_ci{
16158c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_BITSTREAM_DATA_POLARITY,
16168c2ecf20Sopenharmony_ci		polarity, 0);
16178c2ecf20Sopenharmony_ci}
16188c2ecf20Sopenharmony_ci
16198c2ecf20Sopenharmony_ciu16 hpi_bitstream_get_activity(u32 h_control, u16 *pw_clk_activity,
16208c2ecf20Sopenharmony_ci	u16 *pw_data_activity)
16218c2ecf20Sopenharmony_ci{
16228c2ecf20Sopenharmony_ci	struct hpi_message hm;
16238c2ecf20Sopenharmony_ci	struct hpi_response hr;
16248c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
16258c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
16268c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
16278c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
16288c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_BITSTREAM_ACTIVITY;
16298c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
16308c2ecf20Sopenharmony_ci	if (pw_clk_activity)
16318c2ecf20Sopenharmony_ci		*pw_clk_activity = (u16)hr.u.c.param1;
16328c2ecf20Sopenharmony_ci	if (pw_data_activity)
16338c2ecf20Sopenharmony_ci		*pw_data_activity = (u16)hr.u.c.param2;
16348c2ecf20Sopenharmony_ci	return hr.error;
16358c2ecf20Sopenharmony_ci}
16368c2ecf20Sopenharmony_ci
16378c2ecf20Sopenharmony_ciu16 hpi_channel_mode_query_mode(const u32 h_mode, const u32 index,
16388c2ecf20Sopenharmony_ci	u16 *pw_mode)
16398c2ecf20Sopenharmony_ci{
16408c2ecf20Sopenharmony_ci	u32 qr;
16418c2ecf20Sopenharmony_ci	u16 err;
16428c2ecf20Sopenharmony_ci
16438c2ecf20Sopenharmony_ci	err = hpi_control_query(h_mode, HPI_CHANNEL_MODE_MODE, index, 0, &qr);
16448c2ecf20Sopenharmony_ci	*pw_mode = (u16)qr;
16458c2ecf20Sopenharmony_ci	return err;
16468c2ecf20Sopenharmony_ci}
16478c2ecf20Sopenharmony_ci
16488c2ecf20Sopenharmony_ciu16 hpi_channel_mode_set(u32 h_control, u16 mode)
16498c2ecf20Sopenharmony_ci{
16508c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_CHANNEL_MODE_MODE, mode,
16518c2ecf20Sopenharmony_ci		0);
16528c2ecf20Sopenharmony_ci}
16538c2ecf20Sopenharmony_ci
16548c2ecf20Sopenharmony_ciu16 hpi_channel_mode_get(u32 h_control, u16 *mode)
16558c2ecf20Sopenharmony_ci{
16568c2ecf20Sopenharmony_ci	u32 mode32 = 0;
16578c2ecf20Sopenharmony_ci	u16 err = hpi_control_param1_get(h_control,
16588c2ecf20Sopenharmony_ci		HPI_CHANNEL_MODE_MODE, &mode32);
16598c2ecf20Sopenharmony_ci	if (mode)
16608c2ecf20Sopenharmony_ci		*mode = (u16)mode32;
16618c2ecf20Sopenharmony_ci	return err;
16628c2ecf20Sopenharmony_ci}
16638c2ecf20Sopenharmony_ci
16648c2ecf20Sopenharmony_ciu16 hpi_cobranet_hmi_write(u32 h_control, u32 hmi_address, u32 byte_count,
16658c2ecf20Sopenharmony_ci	u8 *pb_data)
16668c2ecf20Sopenharmony_ci{
16678c2ecf20Sopenharmony_ci	struct hpi_msg_cobranet_hmiwrite hm;
16688c2ecf20Sopenharmony_ci	struct hpi_response_header hr;
16698c2ecf20Sopenharmony_ci
16708c2ecf20Sopenharmony_ci	hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr, sizeof(hr),
16718c2ecf20Sopenharmony_ci		HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE);
16728c2ecf20Sopenharmony_ci
16738c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.h.adapter_index,
16748c2ecf20Sopenharmony_ci			&hm.h.obj_index))
16758c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
16768c2ecf20Sopenharmony_ci
16778c2ecf20Sopenharmony_ci	if (byte_count > sizeof(hm.bytes))
16788c2ecf20Sopenharmony_ci		return HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL;
16798c2ecf20Sopenharmony_ci
16808c2ecf20Sopenharmony_ci	hm.p.attribute = HPI_COBRANET_SET;
16818c2ecf20Sopenharmony_ci	hm.p.byte_count = byte_count;
16828c2ecf20Sopenharmony_ci	hm.p.hmi_address = hmi_address;
16838c2ecf20Sopenharmony_ci	memcpy(hm.bytes, pb_data, byte_count);
16848c2ecf20Sopenharmony_ci	hm.h.size = (u16)(sizeof(hm.h) + sizeof(hm.p) + byte_count);
16858c2ecf20Sopenharmony_ci
16868c2ecf20Sopenharmony_ci	hpi_send_recvV1(&hm.h, &hr);
16878c2ecf20Sopenharmony_ci	return hr.error;
16888c2ecf20Sopenharmony_ci}
16898c2ecf20Sopenharmony_ci
16908c2ecf20Sopenharmony_ciu16 hpi_cobranet_hmi_read(u32 h_control, u32 hmi_address, u32 max_byte_count,
16918c2ecf20Sopenharmony_ci	u32 *pbyte_count, u8 *pb_data)
16928c2ecf20Sopenharmony_ci{
16938c2ecf20Sopenharmony_ci	struct hpi_msg_cobranet_hmiread hm;
16948c2ecf20Sopenharmony_ci	struct hpi_res_cobranet_hmiread hr;
16958c2ecf20Sopenharmony_ci
16968c2ecf20Sopenharmony_ci	hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr.h, sizeof(hr),
16978c2ecf20Sopenharmony_ci		HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE);
16988c2ecf20Sopenharmony_ci
16998c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.h.adapter_index,
17008c2ecf20Sopenharmony_ci			&hm.h.obj_index))
17018c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
17028c2ecf20Sopenharmony_ci
17038c2ecf20Sopenharmony_ci	if (max_byte_count > sizeof(hr.bytes))
17048c2ecf20Sopenharmony_ci		return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
17058c2ecf20Sopenharmony_ci
17068c2ecf20Sopenharmony_ci	hm.p.attribute = HPI_COBRANET_GET;
17078c2ecf20Sopenharmony_ci	hm.p.byte_count = max_byte_count;
17088c2ecf20Sopenharmony_ci	hm.p.hmi_address = hmi_address;
17098c2ecf20Sopenharmony_ci
17108c2ecf20Sopenharmony_ci	hpi_send_recvV1(&hm.h, &hr.h);
17118c2ecf20Sopenharmony_ci
17128c2ecf20Sopenharmony_ci	if (!hr.h.error && pb_data) {
17138c2ecf20Sopenharmony_ci		if (hr.byte_count > sizeof(hr.bytes))
17148c2ecf20Sopenharmony_ci
17158c2ecf20Sopenharmony_ci			return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL;
17168c2ecf20Sopenharmony_ci
17178c2ecf20Sopenharmony_ci		*pbyte_count = hr.byte_count;
17188c2ecf20Sopenharmony_ci
17198c2ecf20Sopenharmony_ci		if (hr.byte_count < max_byte_count)
17208c2ecf20Sopenharmony_ci			max_byte_count = *pbyte_count;
17218c2ecf20Sopenharmony_ci
17228c2ecf20Sopenharmony_ci		memcpy(pb_data, hr.bytes, max_byte_count);
17238c2ecf20Sopenharmony_ci	}
17248c2ecf20Sopenharmony_ci	return hr.h.error;
17258c2ecf20Sopenharmony_ci}
17268c2ecf20Sopenharmony_ci
17278c2ecf20Sopenharmony_ciu16 hpi_cobranet_hmi_get_status(u32 h_control, u32 *pstatus,
17288c2ecf20Sopenharmony_ci	u32 *preadable_size, u32 *pwriteable_size)
17298c2ecf20Sopenharmony_ci{
17308c2ecf20Sopenharmony_ci	struct hpi_message hm;
17318c2ecf20Sopenharmony_ci	struct hpi_response hr;
17328c2ecf20Sopenharmony_ci
17338c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
17348c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
17358c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
17368c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
17378c2ecf20Sopenharmony_ci
17388c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_COBRANET_GET_STATUS;
17398c2ecf20Sopenharmony_ci
17408c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
17418c2ecf20Sopenharmony_ci	if (!hr.error) {
17428c2ecf20Sopenharmony_ci		if (pstatus)
17438c2ecf20Sopenharmony_ci			*pstatus = hr.u.cu.cobranet.status.status;
17448c2ecf20Sopenharmony_ci		if (preadable_size)
17458c2ecf20Sopenharmony_ci			*preadable_size =
17468c2ecf20Sopenharmony_ci				hr.u.cu.cobranet.status.readable_size;
17478c2ecf20Sopenharmony_ci		if (pwriteable_size)
17488c2ecf20Sopenharmony_ci			*pwriteable_size =
17498c2ecf20Sopenharmony_ci				hr.u.cu.cobranet.status.writeable_size;
17508c2ecf20Sopenharmony_ci	}
17518c2ecf20Sopenharmony_ci	return hr.error;
17528c2ecf20Sopenharmony_ci}
17538c2ecf20Sopenharmony_ci
17548c2ecf20Sopenharmony_ciu16 hpi_cobranet_get_ip_address(u32 h_control, u32 *pdw_ip_address)
17558c2ecf20Sopenharmony_ci{
17568c2ecf20Sopenharmony_ci	u32 byte_count;
17578c2ecf20Sopenharmony_ci	u32 iP;
17588c2ecf20Sopenharmony_ci	u16 err;
17598c2ecf20Sopenharmony_ci
17608c2ecf20Sopenharmony_ci	err = hpi_cobranet_hmi_read(h_control,
17618c2ecf20Sopenharmony_ci		HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count,
17628c2ecf20Sopenharmony_ci		(u8 *)&iP);
17638c2ecf20Sopenharmony_ci
17648c2ecf20Sopenharmony_ci	*pdw_ip_address =
17658c2ecf20Sopenharmony_ci		((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
17668c2ecf20Sopenharmony_ci			0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
17678c2ecf20Sopenharmony_ci
17688c2ecf20Sopenharmony_ci	if (err)
17698c2ecf20Sopenharmony_ci		*pdw_ip_address = 0;
17708c2ecf20Sopenharmony_ci
17718c2ecf20Sopenharmony_ci	return err;
17728c2ecf20Sopenharmony_ci
17738c2ecf20Sopenharmony_ci}
17748c2ecf20Sopenharmony_ci
17758c2ecf20Sopenharmony_ciu16 hpi_cobranet_set_ip_address(u32 h_control, u32 dw_ip_address)
17768c2ecf20Sopenharmony_ci{
17778c2ecf20Sopenharmony_ci	u32 iP;
17788c2ecf20Sopenharmony_ci	u16 err;
17798c2ecf20Sopenharmony_ci
17808c2ecf20Sopenharmony_ci	iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
17818c2ecf20Sopenharmony_ci			0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
17828c2ecf20Sopenharmony_ci		8) | ((dw_ip_address & 0x000000ff) << 8);
17838c2ecf20Sopenharmony_ci
17848c2ecf20Sopenharmony_ci	err = hpi_cobranet_hmi_write(h_control,
17858c2ecf20Sopenharmony_ci		HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP);
17868c2ecf20Sopenharmony_ci
17878c2ecf20Sopenharmony_ci	return err;
17888c2ecf20Sopenharmony_ci
17898c2ecf20Sopenharmony_ci}
17908c2ecf20Sopenharmony_ci
17918c2ecf20Sopenharmony_ciu16 hpi_cobranet_get_static_ip_address(u32 h_control, u32 *pdw_ip_address)
17928c2ecf20Sopenharmony_ci{
17938c2ecf20Sopenharmony_ci	u32 byte_count;
17948c2ecf20Sopenharmony_ci	u32 iP;
17958c2ecf20Sopenharmony_ci	u16 err;
17968c2ecf20Sopenharmony_ci	err = hpi_cobranet_hmi_read(h_control,
17978c2ecf20Sopenharmony_ci		HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count,
17988c2ecf20Sopenharmony_ci		(u8 *)&iP);
17998c2ecf20Sopenharmony_ci
18008c2ecf20Sopenharmony_ci	*pdw_ip_address =
18018c2ecf20Sopenharmony_ci		((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
18028c2ecf20Sopenharmony_ci			0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
18038c2ecf20Sopenharmony_ci
18048c2ecf20Sopenharmony_ci	if (err)
18058c2ecf20Sopenharmony_ci		*pdw_ip_address = 0;
18068c2ecf20Sopenharmony_ci
18078c2ecf20Sopenharmony_ci	return err;
18088c2ecf20Sopenharmony_ci
18098c2ecf20Sopenharmony_ci}
18108c2ecf20Sopenharmony_ci
18118c2ecf20Sopenharmony_ciu16 hpi_cobranet_set_static_ip_address(u32 h_control, u32 dw_ip_address)
18128c2ecf20Sopenharmony_ci{
18138c2ecf20Sopenharmony_ci	u32 iP;
18148c2ecf20Sopenharmony_ci	u16 err;
18158c2ecf20Sopenharmony_ci
18168c2ecf20Sopenharmony_ci	iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
18178c2ecf20Sopenharmony_ci			0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
18188c2ecf20Sopenharmony_ci		8) | ((dw_ip_address & 0x000000ff) << 8);
18198c2ecf20Sopenharmony_ci
18208c2ecf20Sopenharmony_ci	err = hpi_cobranet_hmi_write(h_control,
18218c2ecf20Sopenharmony_ci		HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP);
18228c2ecf20Sopenharmony_ci
18238c2ecf20Sopenharmony_ci	return err;
18248c2ecf20Sopenharmony_ci
18258c2ecf20Sopenharmony_ci}
18268c2ecf20Sopenharmony_ci
18278c2ecf20Sopenharmony_ciu16 hpi_cobranet_get_macaddress(u32 h_control, u32 *p_mac_msbs,
18288c2ecf20Sopenharmony_ci	u32 *p_mac_lsbs)
18298c2ecf20Sopenharmony_ci{
18308c2ecf20Sopenharmony_ci	u32 byte_count;
18318c2ecf20Sopenharmony_ci	u16 err;
18328c2ecf20Sopenharmony_ci	u32 mac;
18338c2ecf20Sopenharmony_ci
18348c2ecf20Sopenharmony_ci	err = hpi_cobranet_hmi_read(h_control,
18358c2ecf20Sopenharmony_ci		HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count,
18368c2ecf20Sopenharmony_ci		(u8 *)&mac);
18378c2ecf20Sopenharmony_ci
18388c2ecf20Sopenharmony_ci	if (!err) {
18398c2ecf20Sopenharmony_ci		*p_mac_msbs =
18408c2ecf20Sopenharmony_ci			((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
18418c2ecf20Sopenharmony_ci			| ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
18428c2ecf20Sopenharmony_ci			8);
18438c2ecf20Sopenharmony_ci
18448c2ecf20Sopenharmony_ci		err = hpi_cobranet_hmi_read(h_control,
18458c2ecf20Sopenharmony_ci			HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4,
18468c2ecf20Sopenharmony_ci			&byte_count, (u8 *)&mac);
18478c2ecf20Sopenharmony_ci	}
18488c2ecf20Sopenharmony_ci
18498c2ecf20Sopenharmony_ci	if (!err) {
18508c2ecf20Sopenharmony_ci		*p_mac_lsbs =
18518c2ecf20Sopenharmony_ci			((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
18528c2ecf20Sopenharmony_ci			| ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
18538c2ecf20Sopenharmony_ci			8);
18548c2ecf20Sopenharmony_ci	} else {
18558c2ecf20Sopenharmony_ci		*p_mac_msbs = 0;
18568c2ecf20Sopenharmony_ci		*p_mac_lsbs = 0;
18578c2ecf20Sopenharmony_ci	}
18588c2ecf20Sopenharmony_ci
18598c2ecf20Sopenharmony_ci	return err;
18608c2ecf20Sopenharmony_ci}
18618c2ecf20Sopenharmony_ci
18628c2ecf20Sopenharmony_ciu16 hpi_compander_set_enable(u32 h_control, u32 enable)
18638c2ecf20Sopenharmony_ci{
18648c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
18658c2ecf20Sopenharmony_ci		0);
18668c2ecf20Sopenharmony_ci}
18678c2ecf20Sopenharmony_ci
18688c2ecf20Sopenharmony_ciu16 hpi_compander_get_enable(u32 h_control, u32 *enable)
18698c2ecf20Sopenharmony_ci{
18708c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
18718c2ecf20Sopenharmony_ci}
18728c2ecf20Sopenharmony_ci
18738c2ecf20Sopenharmony_ciu16 hpi_compander_set_makeup_gain(u32 h_control, short makeup_gain0_01dB)
18748c2ecf20Sopenharmony_ci{
18758c2ecf20Sopenharmony_ci	return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN,
18768c2ecf20Sopenharmony_ci		makeup_gain0_01dB, 0);
18778c2ecf20Sopenharmony_ci}
18788c2ecf20Sopenharmony_ci
18798c2ecf20Sopenharmony_ciu16 hpi_compander_get_makeup_gain(u32 h_control, short *makeup_gain0_01dB)
18808c2ecf20Sopenharmony_ci{
18818c2ecf20Sopenharmony_ci	return hpi_control_log_get2(h_control, HPI_COMPANDER_MAKEUPGAIN,
18828c2ecf20Sopenharmony_ci		makeup_gain0_01dB, NULL);
18838c2ecf20Sopenharmony_ci}
18848c2ecf20Sopenharmony_ci
18858c2ecf20Sopenharmony_ciu16 hpi_compander_set_attack_time_constant(u32 h_control, unsigned int index,
18868c2ecf20Sopenharmony_ci	u32 attack)
18878c2ecf20Sopenharmony_ci{
18888c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_COMPANDER_ATTACK, attack,
18898c2ecf20Sopenharmony_ci		index);
18908c2ecf20Sopenharmony_ci}
18918c2ecf20Sopenharmony_ci
18928c2ecf20Sopenharmony_ciu16 hpi_compander_get_attack_time_constant(u32 h_control, unsigned int index,
18938c2ecf20Sopenharmony_ci	u32 *attack)
18948c2ecf20Sopenharmony_ci{
18958c2ecf20Sopenharmony_ci	return hpi_control_param_get(h_control, HPI_COMPANDER_ATTACK, 0,
18968c2ecf20Sopenharmony_ci		index, attack, NULL);
18978c2ecf20Sopenharmony_ci}
18988c2ecf20Sopenharmony_ci
18998c2ecf20Sopenharmony_ciu16 hpi_compander_set_decay_time_constant(u32 h_control, unsigned int index,
19008c2ecf20Sopenharmony_ci	u32 decay)
19018c2ecf20Sopenharmony_ci{
19028c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_COMPANDER_DECAY, decay,
19038c2ecf20Sopenharmony_ci		index);
19048c2ecf20Sopenharmony_ci}
19058c2ecf20Sopenharmony_ci
19068c2ecf20Sopenharmony_ciu16 hpi_compander_get_decay_time_constant(u32 h_control, unsigned int index,
19078c2ecf20Sopenharmony_ci	u32 *decay)
19088c2ecf20Sopenharmony_ci{
19098c2ecf20Sopenharmony_ci	return hpi_control_param_get(h_control, HPI_COMPANDER_DECAY, 0, index,
19108c2ecf20Sopenharmony_ci		decay, NULL);
19118c2ecf20Sopenharmony_ci
19128c2ecf20Sopenharmony_ci}
19138c2ecf20Sopenharmony_ci
19148c2ecf20Sopenharmony_ciu16 hpi_compander_set_threshold(u32 h_control, unsigned int index,
19158c2ecf20Sopenharmony_ci	short threshold0_01dB)
19168c2ecf20Sopenharmony_ci{
19178c2ecf20Sopenharmony_ci	struct hpi_message hm;
19188c2ecf20Sopenharmony_ci	struct hpi_response hr;
19198c2ecf20Sopenharmony_ci
19208c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
19218c2ecf20Sopenharmony_ci		HPI_CONTROL_SET_STATE);
19228c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
19238c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
19248c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
19258c2ecf20Sopenharmony_ci	hm.u.c.param2 = index;
19268c2ecf20Sopenharmony_ci	hm.u.c.an_log_value[0] = threshold0_01dB;
19278c2ecf20Sopenharmony_ci
19288c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
19298c2ecf20Sopenharmony_ci
19308c2ecf20Sopenharmony_ci	return hr.error;
19318c2ecf20Sopenharmony_ci}
19328c2ecf20Sopenharmony_ci
19338c2ecf20Sopenharmony_ciu16 hpi_compander_get_threshold(u32 h_control, unsigned int index,
19348c2ecf20Sopenharmony_ci	short *threshold0_01dB)
19358c2ecf20Sopenharmony_ci{
19368c2ecf20Sopenharmony_ci	struct hpi_message hm;
19378c2ecf20Sopenharmony_ci	struct hpi_response hr;
19388c2ecf20Sopenharmony_ci
19398c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
19408c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
19418c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
19428c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
19438c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
19448c2ecf20Sopenharmony_ci	hm.u.c.param2 = index;
19458c2ecf20Sopenharmony_ci
19468c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
19478c2ecf20Sopenharmony_ci	*threshold0_01dB = hr.u.c.an_log_value[0];
19488c2ecf20Sopenharmony_ci
19498c2ecf20Sopenharmony_ci	return hr.error;
19508c2ecf20Sopenharmony_ci}
19518c2ecf20Sopenharmony_ci
19528c2ecf20Sopenharmony_ciu16 hpi_compander_set_ratio(u32 h_control, u32 index, u32 ratio100)
19538c2ecf20Sopenharmony_ci{
19548c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_COMPANDER_RATIO, ratio100,
19558c2ecf20Sopenharmony_ci		index);
19568c2ecf20Sopenharmony_ci}
19578c2ecf20Sopenharmony_ci
19588c2ecf20Sopenharmony_ciu16 hpi_compander_get_ratio(u32 h_control, u32 index, u32 *ratio100)
19598c2ecf20Sopenharmony_ci{
19608c2ecf20Sopenharmony_ci	return hpi_control_param_get(h_control, HPI_COMPANDER_RATIO, 0, index,
19618c2ecf20Sopenharmony_ci		ratio100, NULL);
19628c2ecf20Sopenharmony_ci}
19638c2ecf20Sopenharmony_ci
19648c2ecf20Sopenharmony_ciu16 hpi_level_query_range(u32 h_control, short *min_gain_01dB,
19658c2ecf20Sopenharmony_ci	short *max_gain_01dB, short *step_gain_01dB)
19668c2ecf20Sopenharmony_ci{
19678c2ecf20Sopenharmony_ci	struct hpi_message hm;
19688c2ecf20Sopenharmony_ci	struct hpi_response hr;
19698c2ecf20Sopenharmony_ci
19708c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
19718c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
19728c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
19738c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
19748c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_LEVEL_RANGE;
19758c2ecf20Sopenharmony_ci
19768c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
19778c2ecf20Sopenharmony_ci	if (hr.error) {
19788c2ecf20Sopenharmony_ci		hr.u.c.an_log_value[0] = 0;
19798c2ecf20Sopenharmony_ci		hr.u.c.an_log_value[1] = 0;
19808c2ecf20Sopenharmony_ci		hr.u.c.param1 = 0;
19818c2ecf20Sopenharmony_ci	}
19828c2ecf20Sopenharmony_ci	if (min_gain_01dB)
19838c2ecf20Sopenharmony_ci		*min_gain_01dB = hr.u.c.an_log_value[0];
19848c2ecf20Sopenharmony_ci	if (max_gain_01dB)
19858c2ecf20Sopenharmony_ci		*max_gain_01dB = hr.u.c.an_log_value[1];
19868c2ecf20Sopenharmony_ci	if (step_gain_01dB)
19878c2ecf20Sopenharmony_ci		*step_gain_01dB = (short)hr.u.c.param1;
19888c2ecf20Sopenharmony_ci	return hr.error;
19898c2ecf20Sopenharmony_ci}
19908c2ecf20Sopenharmony_ci
19918c2ecf20Sopenharmony_ciu16 hpi_level_set_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
19928c2ecf20Sopenharmony_ci	)
19938c2ecf20Sopenharmony_ci{
19948c2ecf20Sopenharmony_ci	return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN,
19958c2ecf20Sopenharmony_ci		an_gain0_01dB[0], an_gain0_01dB[1]);
19968c2ecf20Sopenharmony_ci}
19978c2ecf20Sopenharmony_ci
19988c2ecf20Sopenharmony_ciu16 hpi_level_get_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
19998c2ecf20Sopenharmony_ci	)
20008c2ecf20Sopenharmony_ci{
20018c2ecf20Sopenharmony_ci	return hpi_control_log_get2(h_control, HPI_LEVEL_GAIN,
20028c2ecf20Sopenharmony_ci		&an_gain0_01dB[0], &an_gain0_01dB[1]);
20038c2ecf20Sopenharmony_ci}
20048c2ecf20Sopenharmony_ci
20058c2ecf20Sopenharmony_ciu16 hpi_meter_query_channels(const u32 h_meter, u32 *p_channels)
20068c2ecf20Sopenharmony_ci{
20078c2ecf20Sopenharmony_ci	return hpi_control_query(h_meter, HPI_METER_NUM_CHANNELS, 0, 0,
20088c2ecf20Sopenharmony_ci		p_channels);
20098c2ecf20Sopenharmony_ci}
20108c2ecf20Sopenharmony_ci
20118c2ecf20Sopenharmony_ciu16 hpi_meter_get_peak(u32 h_control, short an_peakdB[HPI_MAX_CHANNELS]
20128c2ecf20Sopenharmony_ci	)
20138c2ecf20Sopenharmony_ci{
20148c2ecf20Sopenharmony_ci	short i = 0;
20158c2ecf20Sopenharmony_ci
20168c2ecf20Sopenharmony_ci	struct hpi_message hm;
20178c2ecf20Sopenharmony_ci	struct hpi_response hr;
20188c2ecf20Sopenharmony_ci
20198c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
20208c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
20218c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
20228c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
20238c2ecf20Sopenharmony_ci	hm.obj_index = hm.obj_index;
20248c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_METER_PEAK;
20258c2ecf20Sopenharmony_ci
20268c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
20278c2ecf20Sopenharmony_ci
20288c2ecf20Sopenharmony_ci	if (!hr.error)
20298c2ecf20Sopenharmony_ci		memcpy(an_peakdB, hr.u.c.an_log_value,
20308c2ecf20Sopenharmony_ci			sizeof(short) * HPI_MAX_CHANNELS);
20318c2ecf20Sopenharmony_ci	else
20328c2ecf20Sopenharmony_ci		for (i = 0; i < HPI_MAX_CHANNELS; i++)
20338c2ecf20Sopenharmony_ci			an_peakdB[i] = HPI_METER_MINIMUM;
20348c2ecf20Sopenharmony_ci	return hr.error;
20358c2ecf20Sopenharmony_ci}
20368c2ecf20Sopenharmony_ci
20378c2ecf20Sopenharmony_ciu16 hpi_meter_get_rms(u32 h_control, short an_rmsdB[HPI_MAX_CHANNELS]
20388c2ecf20Sopenharmony_ci	)
20398c2ecf20Sopenharmony_ci{
20408c2ecf20Sopenharmony_ci	short i = 0;
20418c2ecf20Sopenharmony_ci
20428c2ecf20Sopenharmony_ci	struct hpi_message hm;
20438c2ecf20Sopenharmony_ci	struct hpi_response hr;
20448c2ecf20Sopenharmony_ci
20458c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
20468c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
20478c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
20488c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
20498c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_METER_RMS;
20508c2ecf20Sopenharmony_ci
20518c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
20528c2ecf20Sopenharmony_ci
20538c2ecf20Sopenharmony_ci	if (!hr.error)
20548c2ecf20Sopenharmony_ci		memcpy(an_rmsdB, hr.u.c.an_log_value,
20558c2ecf20Sopenharmony_ci			sizeof(short) * HPI_MAX_CHANNELS);
20568c2ecf20Sopenharmony_ci	else
20578c2ecf20Sopenharmony_ci		for (i = 0; i < HPI_MAX_CHANNELS; i++)
20588c2ecf20Sopenharmony_ci			an_rmsdB[i] = HPI_METER_MINIMUM;
20598c2ecf20Sopenharmony_ci
20608c2ecf20Sopenharmony_ci	return hr.error;
20618c2ecf20Sopenharmony_ci}
20628c2ecf20Sopenharmony_ci
20638c2ecf20Sopenharmony_ciu16 hpi_meter_set_rms_ballistics(u32 h_control, u16 attack, u16 decay)
20648c2ecf20Sopenharmony_ci{
20658c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_METER_RMS_BALLISTICS,
20668c2ecf20Sopenharmony_ci		attack, decay);
20678c2ecf20Sopenharmony_ci}
20688c2ecf20Sopenharmony_ci
20698c2ecf20Sopenharmony_ciu16 hpi_meter_get_rms_ballistics(u32 h_control, u16 *pn_attack, u16 *pn_decay)
20708c2ecf20Sopenharmony_ci{
20718c2ecf20Sopenharmony_ci	u32 attack;
20728c2ecf20Sopenharmony_ci	u32 decay;
20738c2ecf20Sopenharmony_ci	u16 error;
20748c2ecf20Sopenharmony_ci
20758c2ecf20Sopenharmony_ci	error = hpi_control_param2_get(h_control, HPI_METER_RMS_BALLISTICS,
20768c2ecf20Sopenharmony_ci		&attack, &decay);
20778c2ecf20Sopenharmony_ci
20788c2ecf20Sopenharmony_ci	if (pn_attack)
20798c2ecf20Sopenharmony_ci		*pn_attack = (unsigned short)attack;
20808c2ecf20Sopenharmony_ci	if (pn_decay)
20818c2ecf20Sopenharmony_ci		*pn_decay = (unsigned short)decay;
20828c2ecf20Sopenharmony_ci
20838c2ecf20Sopenharmony_ci	return error;
20848c2ecf20Sopenharmony_ci}
20858c2ecf20Sopenharmony_ci
20868c2ecf20Sopenharmony_ciu16 hpi_meter_set_peak_ballistics(u32 h_control, u16 attack, u16 decay)
20878c2ecf20Sopenharmony_ci{
20888c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_METER_PEAK_BALLISTICS,
20898c2ecf20Sopenharmony_ci		attack, decay);
20908c2ecf20Sopenharmony_ci}
20918c2ecf20Sopenharmony_ci
20928c2ecf20Sopenharmony_ciu16 hpi_meter_get_peak_ballistics(u32 h_control, u16 *pn_attack,
20938c2ecf20Sopenharmony_ci	u16 *pn_decay)
20948c2ecf20Sopenharmony_ci{
20958c2ecf20Sopenharmony_ci	u32 attack;
20968c2ecf20Sopenharmony_ci	u32 decay;
20978c2ecf20Sopenharmony_ci	u16 error;
20988c2ecf20Sopenharmony_ci
20998c2ecf20Sopenharmony_ci	error = hpi_control_param2_get(h_control, HPI_METER_PEAK_BALLISTICS,
21008c2ecf20Sopenharmony_ci		&attack, &decay);
21018c2ecf20Sopenharmony_ci
21028c2ecf20Sopenharmony_ci	if (pn_attack)
21038c2ecf20Sopenharmony_ci		*pn_attack = (short)attack;
21048c2ecf20Sopenharmony_ci	if (pn_decay)
21058c2ecf20Sopenharmony_ci		*pn_decay = (short)decay;
21068c2ecf20Sopenharmony_ci
21078c2ecf20Sopenharmony_ci	return error;
21088c2ecf20Sopenharmony_ci}
21098c2ecf20Sopenharmony_ci
21108c2ecf20Sopenharmony_ciu16 hpi_microphone_set_phantom_power(u32 h_control, u16 on_off)
21118c2ecf20Sopenharmony_ci{
21128c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_MICROPHONE_PHANTOM_POWER,
21138c2ecf20Sopenharmony_ci		(u32)on_off, 0);
21148c2ecf20Sopenharmony_ci}
21158c2ecf20Sopenharmony_ci
21168c2ecf20Sopenharmony_ciu16 hpi_microphone_get_phantom_power(u32 h_control, u16 *pw_on_off)
21178c2ecf20Sopenharmony_ci{
21188c2ecf20Sopenharmony_ci	u16 error = 0;
21198c2ecf20Sopenharmony_ci	u32 on_off = 0;
21208c2ecf20Sopenharmony_ci	error = hpi_control_param1_get(h_control,
21218c2ecf20Sopenharmony_ci		HPI_MICROPHONE_PHANTOM_POWER, &on_off);
21228c2ecf20Sopenharmony_ci	if (pw_on_off)
21238c2ecf20Sopenharmony_ci		*pw_on_off = (u16)on_off;
21248c2ecf20Sopenharmony_ci	return error;
21258c2ecf20Sopenharmony_ci}
21268c2ecf20Sopenharmony_ci
21278c2ecf20Sopenharmony_ciu16 hpi_multiplexer_set_source(u32 h_control, u16 source_node_type,
21288c2ecf20Sopenharmony_ci	u16 source_node_index)
21298c2ecf20Sopenharmony_ci{
21308c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_MULTIPLEXER_SOURCE,
21318c2ecf20Sopenharmony_ci		source_node_type, source_node_index);
21328c2ecf20Sopenharmony_ci}
21338c2ecf20Sopenharmony_ci
21348c2ecf20Sopenharmony_ciu16 hpi_multiplexer_get_source(u32 h_control, u16 *source_node_type,
21358c2ecf20Sopenharmony_ci	u16 *source_node_index)
21368c2ecf20Sopenharmony_ci{
21378c2ecf20Sopenharmony_ci	u32 node, index;
21388c2ecf20Sopenharmony_ci	u16 err = hpi_control_param2_get(h_control,
21398c2ecf20Sopenharmony_ci		HPI_MULTIPLEXER_SOURCE, &node,
21408c2ecf20Sopenharmony_ci		&index);
21418c2ecf20Sopenharmony_ci	if (source_node_type)
21428c2ecf20Sopenharmony_ci		*source_node_type = (u16)node;
21438c2ecf20Sopenharmony_ci	if (source_node_index)
21448c2ecf20Sopenharmony_ci		*source_node_index = (u16)index;
21458c2ecf20Sopenharmony_ci	return err;
21468c2ecf20Sopenharmony_ci}
21478c2ecf20Sopenharmony_ci
21488c2ecf20Sopenharmony_ciu16 hpi_multiplexer_query_source(u32 h_control, u16 index,
21498c2ecf20Sopenharmony_ci	u16 *source_node_type, u16 *source_node_index)
21508c2ecf20Sopenharmony_ci{
21518c2ecf20Sopenharmony_ci	struct hpi_message hm;
21528c2ecf20Sopenharmony_ci	struct hpi_response hr;
21538c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
21548c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
21558c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
21568c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
21578c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE;
21588c2ecf20Sopenharmony_ci	hm.u.c.param1 = index;
21598c2ecf20Sopenharmony_ci
21608c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
21618c2ecf20Sopenharmony_ci
21628c2ecf20Sopenharmony_ci	if (source_node_type)
21638c2ecf20Sopenharmony_ci		*source_node_type = (u16)hr.u.c.param1;
21648c2ecf20Sopenharmony_ci	if (source_node_index)
21658c2ecf20Sopenharmony_ci		*source_node_index = (u16)hr.u.c.param2;
21668c2ecf20Sopenharmony_ci	return hr.error;
21678c2ecf20Sopenharmony_ci}
21688c2ecf20Sopenharmony_ci
21698c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_get_info(u32 h_control, u16 *pw_number_of_bands,
21708c2ecf20Sopenharmony_ci	u16 *pw_on_off)
21718c2ecf20Sopenharmony_ci{
21728c2ecf20Sopenharmony_ci	u32 oB = 0;
21738c2ecf20Sopenharmony_ci	u32 oO = 0;
21748c2ecf20Sopenharmony_ci	u16 error = 0;
21758c2ecf20Sopenharmony_ci
21768c2ecf20Sopenharmony_ci	error = hpi_control_param2_get(h_control, HPI_EQUALIZER_NUM_FILTERS,
21778c2ecf20Sopenharmony_ci		&oO, &oB);
21788c2ecf20Sopenharmony_ci	if (pw_number_of_bands)
21798c2ecf20Sopenharmony_ci		*pw_number_of_bands = (u16)oB;
21808c2ecf20Sopenharmony_ci	if (pw_on_off)
21818c2ecf20Sopenharmony_ci		*pw_on_off = (u16)oO;
21828c2ecf20Sopenharmony_ci	return error;
21838c2ecf20Sopenharmony_ci}
21848c2ecf20Sopenharmony_ci
21858c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_set_state(u32 h_control, u16 on_off)
21868c2ecf20Sopenharmony_ci{
21878c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_EQUALIZER_NUM_FILTERS,
21888c2ecf20Sopenharmony_ci		on_off, 0);
21898c2ecf20Sopenharmony_ci}
21908c2ecf20Sopenharmony_ci
21918c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_get_band(u32 h_control, u16 index, u16 *pn_type,
21928c2ecf20Sopenharmony_ci	u32 *pfrequency_hz, short *pnQ100, short *pn_gain0_01dB)
21938c2ecf20Sopenharmony_ci{
21948c2ecf20Sopenharmony_ci	struct hpi_message hm;
21958c2ecf20Sopenharmony_ci	struct hpi_response hr;
21968c2ecf20Sopenharmony_ci
21978c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
21988c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
21998c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
22008c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
22018c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_EQUALIZER_FILTER;
22028c2ecf20Sopenharmony_ci	hm.u.c.param2 = index;
22038c2ecf20Sopenharmony_ci
22048c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
22058c2ecf20Sopenharmony_ci
22068c2ecf20Sopenharmony_ci	if (pfrequency_hz)
22078c2ecf20Sopenharmony_ci		*pfrequency_hz = hr.u.c.param1;
22088c2ecf20Sopenharmony_ci	if (pn_type)
22098c2ecf20Sopenharmony_ci		*pn_type = (u16)(hr.u.c.param2 >> 16);
22108c2ecf20Sopenharmony_ci	if (pnQ100)
22118c2ecf20Sopenharmony_ci		*pnQ100 = hr.u.c.an_log_value[1];
22128c2ecf20Sopenharmony_ci	if (pn_gain0_01dB)
22138c2ecf20Sopenharmony_ci		*pn_gain0_01dB = hr.u.c.an_log_value[0];
22148c2ecf20Sopenharmony_ci
22158c2ecf20Sopenharmony_ci	return hr.error;
22168c2ecf20Sopenharmony_ci}
22178c2ecf20Sopenharmony_ci
22188c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_set_band(u32 h_control, u16 index, u16 type,
22198c2ecf20Sopenharmony_ci	u32 frequency_hz, short q100, short gain0_01dB)
22208c2ecf20Sopenharmony_ci{
22218c2ecf20Sopenharmony_ci	struct hpi_message hm;
22228c2ecf20Sopenharmony_ci	struct hpi_response hr;
22238c2ecf20Sopenharmony_ci
22248c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
22258c2ecf20Sopenharmony_ci		HPI_CONTROL_SET_STATE);
22268c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
22278c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
22288c2ecf20Sopenharmony_ci
22298c2ecf20Sopenharmony_ci	hm.u.c.param1 = frequency_hz;
22308c2ecf20Sopenharmony_ci	hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16);
22318c2ecf20Sopenharmony_ci	hm.u.c.an_log_value[0] = gain0_01dB;
22328c2ecf20Sopenharmony_ci	hm.u.c.an_log_value[1] = q100;
22338c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_EQUALIZER_FILTER;
22348c2ecf20Sopenharmony_ci
22358c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
22368c2ecf20Sopenharmony_ci
22378c2ecf20Sopenharmony_ci	return hr.error;
22388c2ecf20Sopenharmony_ci}
22398c2ecf20Sopenharmony_ci
22408c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_get_coeffs(u32 h_control, u16 index, short coeffs[5]
22418c2ecf20Sopenharmony_ci	)
22428c2ecf20Sopenharmony_ci{
22438c2ecf20Sopenharmony_ci	struct hpi_message hm;
22448c2ecf20Sopenharmony_ci	struct hpi_response hr;
22458c2ecf20Sopenharmony_ci
22468c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
22478c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
22488c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
22498c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
22508c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS;
22518c2ecf20Sopenharmony_ci	hm.u.c.param2 = index;
22528c2ecf20Sopenharmony_ci
22538c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
22548c2ecf20Sopenharmony_ci
22558c2ecf20Sopenharmony_ci	coeffs[0] = (short)hr.u.c.an_log_value[0];
22568c2ecf20Sopenharmony_ci	coeffs[1] = (short)hr.u.c.an_log_value[1];
22578c2ecf20Sopenharmony_ci	coeffs[2] = (short)hr.u.c.param1;
22588c2ecf20Sopenharmony_ci	coeffs[3] = (short)(hr.u.c.param1 >> 16);
22598c2ecf20Sopenharmony_ci	coeffs[4] = (short)hr.u.c.param2;
22608c2ecf20Sopenharmony_ci
22618c2ecf20Sopenharmony_ci	return hr.error;
22628c2ecf20Sopenharmony_ci}
22638c2ecf20Sopenharmony_ci
22648c2ecf20Sopenharmony_ciu16 hpi_sample_clock_query_source(const u32 h_clock, const u32 index,
22658c2ecf20Sopenharmony_ci	u16 *pw_source)
22668c2ecf20Sopenharmony_ci{
22678c2ecf20Sopenharmony_ci	u32 qr;
22688c2ecf20Sopenharmony_ci	u16 err;
22698c2ecf20Sopenharmony_ci
22708c2ecf20Sopenharmony_ci	err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE, index, 0,
22718c2ecf20Sopenharmony_ci		&qr);
22728c2ecf20Sopenharmony_ci	*pw_source = (u16)qr;
22738c2ecf20Sopenharmony_ci	return err;
22748c2ecf20Sopenharmony_ci}
22758c2ecf20Sopenharmony_ci
22768c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_source(u32 h_control, u16 source)
22778c2ecf20Sopenharmony_ci{
22788c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE,
22798c2ecf20Sopenharmony_ci		source, 0);
22808c2ecf20Sopenharmony_ci}
22818c2ecf20Sopenharmony_ci
22828c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_source(u32 h_control, u16 *pw_source)
22838c2ecf20Sopenharmony_ci{
22848c2ecf20Sopenharmony_ci	u16 err = 0;
22858c2ecf20Sopenharmony_ci	u32 source = 0;
22868c2ecf20Sopenharmony_ci	err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE,
22878c2ecf20Sopenharmony_ci		&source);
22888c2ecf20Sopenharmony_ci	if (!err)
22898c2ecf20Sopenharmony_ci		if (pw_source)
22908c2ecf20Sopenharmony_ci			*pw_source = (u16)source;
22918c2ecf20Sopenharmony_ci	return err;
22928c2ecf20Sopenharmony_ci}
22938c2ecf20Sopenharmony_ci
22948c2ecf20Sopenharmony_ciu16 hpi_sample_clock_query_source_index(const u32 h_clock, const u32 index,
22958c2ecf20Sopenharmony_ci	const u32 source, u16 *pw_source_index)
22968c2ecf20Sopenharmony_ci{
22978c2ecf20Sopenharmony_ci	u32 qr;
22988c2ecf20Sopenharmony_ci	u16 err;
22998c2ecf20Sopenharmony_ci
23008c2ecf20Sopenharmony_ci	err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE_INDEX, index,
23018c2ecf20Sopenharmony_ci		source, &qr);
23028c2ecf20Sopenharmony_ci	*pw_source_index = (u16)qr;
23038c2ecf20Sopenharmony_ci	return err;
23048c2ecf20Sopenharmony_ci}
23058c2ecf20Sopenharmony_ci
23068c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_source_index(u32 h_control, u16 source_index)
23078c2ecf20Sopenharmony_ci{
23088c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
23098c2ecf20Sopenharmony_ci		source_index, 0);
23108c2ecf20Sopenharmony_ci}
23118c2ecf20Sopenharmony_ci
23128c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_source_index(u32 h_control, u16 *pw_source_index)
23138c2ecf20Sopenharmony_ci{
23148c2ecf20Sopenharmony_ci	u16 err = 0;
23158c2ecf20Sopenharmony_ci	u32 source_index = 0;
23168c2ecf20Sopenharmony_ci	err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
23178c2ecf20Sopenharmony_ci		&source_index);
23188c2ecf20Sopenharmony_ci	if (!err)
23198c2ecf20Sopenharmony_ci		if (pw_source_index)
23208c2ecf20Sopenharmony_ci			*pw_source_index = (u16)source_index;
23218c2ecf20Sopenharmony_ci	return err;
23228c2ecf20Sopenharmony_ci}
23238c2ecf20Sopenharmony_ci
23248c2ecf20Sopenharmony_ciu16 hpi_sample_clock_query_local_rate(const u32 h_clock, const u32 index,
23258c2ecf20Sopenharmony_ci	u32 *prate)
23268c2ecf20Sopenharmony_ci{
23278c2ecf20Sopenharmony_ci	return hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE,
23288c2ecf20Sopenharmony_ci				 index, 0, prate);
23298c2ecf20Sopenharmony_ci}
23308c2ecf20Sopenharmony_ci
23318c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate)
23328c2ecf20Sopenharmony_ci{
23338c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control,
23348c2ecf20Sopenharmony_ci		HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0);
23358c2ecf20Sopenharmony_ci}
23368c2ecf20Sopenharmony_ci
23378c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate)
23388c2ecf20Sopenharmony_ci{
23398c2ecf20Sopenharmony_ci	u16 err = 0;
23408c2ecf20Sopenharmony_ci	u32 sample_rate = 0;
23418c2ecf20Sopenharmony_ci	err = hpi_control_param1_get(h_control,
23428c2ecf20Sopenharmony_ci		HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate);
23438c2ecf20Sopenharmony_ci	if (!err)
23448c2ecf20Sopenharmony_ci		if (psample_rate)
23458c2ecf20Sopenharmony_ci			*psample_rate = sample_rate;
23468c2ecf20Sopenharmony_ci	return err;
23478c2ecf20Sopenharmony_ci}
23488c2ecf20Sopenharmony_ci
23498c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate)
23508c2ecf20Sopenharmony_ci{
23518c2ecf20Sopenharmony_ci	u16 err = 0;
23528c2ecf20Sopenharmony_ci	u32 sample_rate = 0;
23538c2ecf20Sopenharmony_ci	err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE,
23548c2ecf20Sopenharmony_ci		&sample_rate);
23558c2ecf20Sopenharmony_ci	if (!err)
23568c2ecf20Sopenharmony_ci		if (psample_rate)
23578c2ecf20Sopenharmony_ci			*psample_rate = sample_rate;
23588c2ecf20Sopenharmony_ci	return err;
23598c2ecf20Sopenharmony_ci}
23608c2ecf20Sopenharmony_ci
23618c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_auto(u32 h_control, u32 enable)
23628c2ecf20Sopenharmony_ci{
23638c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable,
23648c2ecf20Sopenharmony_ci		0);
23658c2ecf20Sopenharmony_ci}
23668c2ecf20Sopenharmony_ci
23678c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable)
23688c2ecf20Sopenharmony_ci{
23698c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO,
23708c2ecf20Sopenharmony_ci		penable);
23718c2ecf20Sopenharmony_ci}
23728c2ecf20Sopenharmony_ci
23738c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock)
23748c2ecf20Sopenharmony_ci{
23758c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
23768c2ecf20Sopenharmony_ci		lock, 0);
23778c2ecf20Sopenharmony_ci}
23788c2ecf20Sopenharmony_ci
23798c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock)
23808c2ecf20Sopenharmony_ci{
23818c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
23828c2ecf20Sopenharmony_ci		plock);
23838c2ecf20Sopenharmony_ci}
23848c2ecf20Sopenharmony_ci
23858c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency)
23868c2ecf20Sopenharmony_ci{
23878c2ecf20Sopenharmony_ci	return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY,
23888c2ecf20Sopenharmony_ci		index, 0, frequency, NULL);
23898c2ecf20Sopenharmony_ci}
23908c2ecf20Sopenharmony_ci
23918c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_state(u32 h_control, u32 *state)
23928c2ecf20Sopenharmony_ci{
23938c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE,
23948c2ecf20Sopenharmony_ci		state);
23958c2ecf20Sopenharmony_ci}
23968c2ecf20Sopenharmony_ci
23978c2ecf20Sopenharmony_ciu16 hpi_tone_detector_set_enable(u32 h_control, u32 enable)
23988c2ecf20Sopenharmony_ci{
23998c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
24008c2ecf20Sopenharmony_ci		0);
24018c2ecf20Sopenharmony_ci}
24028c2ecf20Sopenharmony_ci
24038c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable)
24048c2ecf20Sopenharmony_ci{
24058c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
24068c2ecf20Sopenharmony_ci}
24078c2ecf20Sopenharmony_ci
24088c2ecf20Sopenharmony_ciu16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable)
24098c2ecf20Sopenharmony_ci{
24108c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
24118c2ecf20Sopenharmony_ci		(u32)event_enable, 0);
24128c2ecf20Sopenharmony_ci}
24138c2ecf20Sopenharmony_ci
24148c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable)
24158c2ecf20Sopenharmony_ci{
24168c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
24178c2ecf20Sopenharmony_ci		event_enable);
24188c2ecf20Sopenharmony_ci}
24198c2ecf20Sopenharmony_ci
24208c2ecf20Sopenharmony_ciu16 hpi_tone_detector_set_threshold(u32 h_control, int threshold)
24218c2ecf20Sopenharmony_ci{
24228c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD,
24238c2ecf20Sopenharmony_ci		(u32)threshold, 0);
24248c2ecf20Sopenharmony_ci}
24258c2ecf20Sopenharmony_ci
24268c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold)
24278c2ecf20Sopenharmony_ci{
24288c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD,
24298c2ecf20Sopenharmony_ci		(u32 *)threshold);
24308c2ecf20Sopenharmony_ci}
24318c2ecf20Sopenharmony_ci
24328c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_state(u32 h_control, u32 *state)
24338c2ecf20Sopenharmony_ci{
24348c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE,
24358c2ecf20Sopenharmony_ci		state);
24368c2ecf20Sopenharmony_ci}
24378c2ecf20Sopenharmony_ci
24388c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_enable(u32 h_control, u32 enable)
24398c2ecf20Sopenharmony_ci{
24408c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
24418c2ecf20Sopenharmony_ci		0);
24428c2ecf20Sopenharmony_ci}
24438c2ecf20Sopenharmony_ci
24448c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable)
24458c2ecf20Sopenharmony_ci{
24468c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
24478c2ecf20Sopenharmony_ci}
24488c2ecf20Sopenharmony_ci
24498c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable)
24508c2ecf20Sopenharmony_ci{
24518c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
24528c2ecf20Sopenharmony_ci		event_enable, 0);
24538c2ecf20Sopenharmony_ci}
24548c2ecf20Sopenharmony_ci
24558c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable)
24568c2ecf20Sopenharmony_ci{
24578c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
24588c2ecf20Sopenharmony_ci		event_enable);
24598c2ecf20Sopenharmony_ci}
24608c2ecf20Sopenharmony_ci
24618c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_delay(u32 h_control, u32 delay)
24628c2ecf20Sopenharmony_ci{
24638c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY,
24648c2ecf20Sopenharmony_ci		delay, 0);
24658c2ecf20Sopenharmony_ci}
24668c2ecf20Sopenharmony_ci
24678c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay)
24688c2ecf20Sopenharmony_ci{
24698c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY,
24708c2ecf20Sopenharmony_ci		delay);
24718c2ecf20Sopenharmony_ci}
24728c2ecf20Sopenharmony_ci
24738c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_threshold(u32 h_control, int threshold)
24748c2ecf20Sopenharmony_ci{
24758c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD,
24768c2ecf20Sopenharmony_ci		threshold, 0);
24778c2ecf20Sopenharmony_ci}
24788c2ecf20Sopenharmony_ci
24798c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold)
24808c2ecf20Sopenharmony_ci{
24818c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control,
24828c2ecf20Sopenharmony_ci		HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold);
24838c2ecf20Sopenharmony_ci}
24848c2ecf20Sopenharmony_ci
24858c2ecf20Sopenharmony_ciu16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band)
24868c2ecf20Sopenharmony_ci{
24878c2ecf20Sopenharmony_ci	u32 qr;
24888c2ecf20Sopenharmony_ci	u16 err;
24898c2ecf20Sopenharmony_ci
24908c2ecf20Sopenharmony_ci	err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
24918c2ecf20Sopenharmony_ci	*pw_band = (u16)qr;
24928c2ecf20Sopenharmony_ci	return err;
24938c2ecf20Sopenharmony_ci}
24948c2ecf20Sopenharmony_ci
24958c2ecf20Sopenharmony_ciu16 hpi_tuner_set_band(u32 h_control, u16 band)
24968c2ecf20Sopenharmony_ci{
24978c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0);
24988c2ecf20Sopenharmony_ci}
24998c2ecf20Sopenharmony_ci
25008c2ecf20Sopenharmony_ciu16 hpi_tuner_get_band(u32 h_control, u16 *pw_band)
25018c2ecf20Sopenharmony_ci{
25028c2ecf20Sopenharmony_ci	u32 band = 0;
25038c2ecf20Sopenharmony_ci	u16 error = 0;
25048c2ecf20Sopenharmony_ci
25058c2ecf20Sopenharmony_ci	error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band);
25068c2ecf20Sopenharmony_ci	if (pw_band)
25078c2ecf20Sopenharmony_ci		*pw_band = (u16)band;
25088c2ecf20Sopenharmony_ci	return error;
25098c2ecf20Sopenharmony_ci}
25108c2ecf20Sopenharmony_ci
25118c2ecf20Sopenharmony_ciu16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index,
25128c2ecf20Sopenharmony_ci	const u16 band, u32 *pfreq)
25138c2ecf20Sopenharmony_ci{
25148c2ecf20Sopenharmony_ci	return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq);
25158c2ecf20Sopenharmony_ci}
25168c2ecf20Sopenharmony_ci
25178c2ecf20Sopenharmony_ciu16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz)
25188c2ecf20Sopenharmony_ci{
25198c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz,
25208c2ecf20Sopenharmony_ci		0);
25218c2ecf20Sopenharmony_ci}
25228c2ecf20Sopenharmony_ci
25238c2ecf20Sopenharmony_ciu16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz)
25248c2ecf20Sopenharmony_ci{
25258c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_TUNER_FREQ,
25268c2ecf20Sopenharmony_ci		pw_freq_ink_hz);
25278c2ecf20Sopenharmony_ci}
25288c2ecf20Sopenharmony_ci
25298c2ecf20Sopenharmony_ciu16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain)
25308c2ecf20Sopenharmony_ci{
25318c2ecf20Sopenharmony_ci	u32 qr;
25328c2ecf20Sopenharmony_ci	u16 err;
25338c2ecf20Sopenharmony_ci
25348c2ecf20Sopenharmony_ci	err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
25358c2ecf20Sopenharmony_ci	*pw_gain = (u16)qr;
25368c2ecf20Sopenharmony_ci	return err;
25378c2ecf20Sopenharmony_ci}
25388c2ecf20Sopenharmony_ci
25398c2ecf20Sopenharmony_ciu16 hpi_tuner_set_gain(u32 h_control, short gain)
25408c2ecf20Sopenharmony_ci{
25418c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0);
25428c2ecf20Sopenharmony_ci}
25438c2ecf20Sopenharmony_ci
25448c2ecf20Sopenharmony_ciu16 hpi_tuner_get_gain(u32 h_control, short *pn_gain)
25458c2ecf20Sopenharmony_ci{
25468c2ecf20Sopenharmony_ci	u32 gain = 0;
25478c2ecf20Sopenharmony_ci	u16 error = 0;
25488c2ecf20Sopenharmony_ci
25498c2ecf20Sopenharmony_ci	error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain);
25508c2ecf20Sopenharmony_ci	if (pn_gain)
25518c2ecf20Sopenharmony_ci		*pn_gain = (u16)gain;
25528c2ecf20Sopenharmony_ci	return error;
25538c2ecf20Sopenharmony_ci}
25548c2ecf20Sopenharmony_ci
25558c2ecf20Sopenharmony_ciu16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level)
25568c2ecf20Sopenharmony_ci{
25578c2ecf20Sopenharmony_ci	struct hpi_message hm;
25588c2ecf20Sopenharmony_ci	struct hpi_response hr;
25598c2ecf20Sopenharmony_ci
25608c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
25618c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
25628c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
25638c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
25648c2ecf20Sopenharmony_ci	hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG;
25658c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
25668c2ecf20Sopenharmony_ci	if (pw_level)
25678c2ecf20Sopenharmony_ci		*pw_level = hr.u.cu.tuner.s_level;
25688c2ecf20Sopenharmony_ci	return hr.error;
25698c2ecf20Sopenharmony_ci}
25708c2ecf20Sopenharmony_ci
25718c2ecf20Sopenharmony_ciu16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level)
25728c2ecf20Sopenharmony_ci{
25738c2ecf20Sopenharmony_ci	struct hpi_message hm;
25748c2ecf20Sopenharmony_ci	struct hpi_response hr;
25758c2ecf20Sopenharmony_ci
25768c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
25778c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
25788c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
25798c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
25808c2ecf20Sopenharmony_ci	hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW;
25818c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
25828c2ecf20Sopenharmony_ci	if (pw_level)
25838c2ecf20Sopenharmony_ci		*pw_level = hr.u.cu.tuner.s_level;
25848c2ecf20Sopenharmony_ci	return hr.error;
25858c2ecf20Sopenharmony_ci}
25868c2ecf20Sopenharmony_ci
25878c2ecf20Sopenharmony_ciu16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index,
25888c2ecf20Sopenharmony_ci	const u16 band, u32 *pdeemphasis)
25898c2ecf20Sopenharmony_ci{
25908c2ecf20Sopenharmony_ci	return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band,
25918c2ecf20Sopenharmony_ci		pdeemphasis);
25928c2ecf20Sopenharmony_ci}
25938c2ecf20Sopenharmony_ci
25948c2ecf20Sopenharmony_ciu16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis)
25958c2ecf20Sopenharmony_ci{
25968c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS,
25978c2ecf20Sopenharmony_ci		deemphasis, 0);
25988c2ecf20Sopenharmony_ci}
25998c2ecf20Sopenharmony_ci
26008c2ecf20Sopenharmony_ciu16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis)
26018c2ecf20Sopenharmony_ci{
26028c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS,
26038c2ecf20Sopenharmony_ci		pdeemphasis);
26048c2ecf20Sopenharmony_ci}
26058c2ecf20Sopenharmony_ci
26068c2ecf20Sopenharmony_ciu16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program)
26078c2ecf20Sopenharmony_ci{
26088c2ecf20Sopenharmony_ci	return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0,
26098c2ecf20Sopenharmony_ci		pbitmap_program);
26108c2ecf20Sopenharmony_ci}
26118c2ecf20Sopenharmony_ci
26128c2ecf20Sopenharmony_ciu16 hpi_tuner_set_program(u32 h_control, u32 program)
26138c2ecf20Sopenharmony_ci{
26148c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program,
26158c2ecf20Sopenharmony_ci		0);
26168c2ecf20Sopenharmony_ci}
26178c2ecf20Sopenharmony_ci
26188c2ecf20Sopenharmony_ciu16 hpi_tuner_get_program(u32 h_control, u32 *pprogram)
26198c2ecf20Sopenharmony_ci{
26208c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram);
26218c2ecf20Sopenharmony_ci}
26228c2ecf20Sopenharmony_ci
26238c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version,
26248c2ecf20Sopenharmony_ci	const u32 string_size)
26258c2ecf20Sopenharmony_ci{
26268c2ecf20Sopenharmony_ci	return hpi_control_get_string(h_control,
26278c2ecf20Sopenharmony_ci		HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size);
26288c2ecf20Sopenharmony_ci}
26298c2ecf20Sopenharmony_ci
26308c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version,
26318c2ecf20Sopenharmony_ci	const u32 string_size)
26328c2ecf20Sopenharmony_ci{
26338c2ecf20Sopenharmony_ci	return hpi_control_get_string(h_control,
26348c2ecf20Sopenharmony_ci		HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size);
26358c2ecf20Sopenharmony_ci}
26368c2ecf20Sopenharmony_ci
26378c2ecf20Sopenharmony_ciu16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status)
26388c2ecf20Sopenharmony_ci{
26398c2ecf20Sopenharmony_ci	u32 status = 0;
26408c2ecf20Sopenharmony_ci	u16 error = 0;
26418c2ecf20Sopenharmony_ci
26428c2ecf20Sopenharmony_ci	error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status);
26438c2ecf20Sopenharmony_ci	if (pw_status) {
26448c2ecf20Sopenharmony_ci		if (!error) {
26458c2ecf20Sopenharmony_ci			*pw_status_mask = (u16)(status >> 16);
26468c2ecf20Sopenharmony_ci			*pw_status = (u16)(status & 0xFFFF);
26478c2ecf20Sopenharmony_ci		} else {
26488c2ecf20Sopenharmony_ci			*pw_status_mask = 0;
26498c2ecf20Sopenharmony_ci			*pw_status = 0;
26508c2ecf20Sopenharmony_ci		}
26518c2ecf20Sopenharmony_ci	}
26528c2ecf20Sopenharmony_ci	return error;
26538c2ecf20Sopenharmony_ci}
26548c2ecf20Sopenharmony_ci
26558c2ecf20Sopenharmony_ciu16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value)
26568c2ecf20Sopenharmony_ci{
26578c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value);
26588c2ecf20Sopenharmony_ci}
26598c2ecf20Sopenharmony_ci
26608c2ecf20Sopenharmony_ciu16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value)
26618c2ecf20Sopenharmony_ci{
26628c2ecf20Sopenharmony_ci	return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0,
26638c2ecf20Sopenharmony_ci		pn_value, NULL);
26648c2ecf20Sopenharmony_ci}
26658c2ecf20Sopenharmony_ci
26668c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality)
26678c2ecf20Sopenharmony_ci{
26688c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control,
26698c2ecf20Sopenharmony_ci		HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality);
26708c2ecf20Sopenharmony_ci}
26718c2ecf20Sopenharmony_ci
26728c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend)
26738c2ecf20Sopenharmony_ci{
26748c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND,
26758c2ecf20Sopenharmony_ci		pblend);
26768c2ecf20Sopenharmony_ci}
26778c2ecf20Sopenharmony_ci
26788c2ecf20Sopenharmony_ciu16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend)
26798c2ecf20Sopenharmony_ci{
26808c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND,
26818c2ecf20Sopenharmony_ci		blend, 0);
26828c2ecf20Sopenharmony_ci}
26838c2ecf20Sopenharmony_ci
26848c2ecf20Sopenharmony_ciu16 hpi_tuner_get_rds(u32 h_control, char *p_data)
26858c2ecf20Sopenharmony_ci{
26868c2ecf20Sopenharmony_ci	struct hpi_message hm;
26878c2ecf20Sopenharmony_ci	struct hpi_response hr;
26888c2ecf20Sopenharmony_ci
26898c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
26908c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
26918c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
26928c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
26938c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_TUNER_RDS;
26948c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
26958c2ecf20Sopenharmony_ci	if (p_data) {
26968c2ecf20Sopenharmony_ci		*(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0];
26978c2ecf20Sopenharmony_ci		*(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1];
26988c2ecf20Sopenharmony_ci		*(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER;
26998c2ecf20Sopenharmony_ci	}
27008c2ecf20Sopenharmony_ci	return hr.error;
27018c2ecf20Sopenharmony_ci}
27028c2ecf20Sopenharmony_ci
27038c2ecf20Sopenharmony_ciu16 hpi_pad_get_channel_name(u32 h_control, char *psz_string,
27048c2ecf20Sopenharmony_ci	const u32 data_length)
27058c2ecf20Sopenharmony_ci{
27068c2ecf20Sopenharmony_ci	return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME,
27078c2ecf20Sopenharmony_ci		psz_string, data_length);
27088c2ecf20Sopenharmony_ci}
27098c2ecf20Sopenharmony_ci
27108c2ecf20Sopenharmony_ciu16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length)
27118c2ecf20Sopenharmony_ci{
27128c2ecf20Sopenharmony_ci	return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string,
27138c2ecf20Sopenharmony_ci		data_length);
27148c2ecf20Sopenharmony_ci}
27158c2ecf20Sopenharmony_ci
27168c2ecf20Sopenharmony_ciu16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length)
27178c2ecf20Sopenharmony_ci{
27188c2ecf20Sopenharmony_ci	return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string,
27198c2ecf20Sopenharmony_ci		data_length);
27208c2ecf20Sopenharmony_ci}
27218c2ecf20Sopenharmony_ci
27228c2ecf20Sopenharmony_ciu16 hpi_pad_get_comment(u32 h_control, char *psz_string,
27238c2ecf20Sopenharmony_ci	const u32 data_length)
27248c2ecf20Sopenharmony_ci{
27258c2ecf20Sopenharmony_ci	return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string,
27268c2ecf20Sopenharmony_ci		data_length);
27278c2ecf20Sopenharmony_ci}
27288c2ecf20Sopenharmony_ci
27298c2ecf20Sopenharmony_ciu16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY)
27308c2ecf20Sopenharmony_ci{
27318c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY);
27328c2ecf20Sopenharmony_ci}
27338c2ecf20Sopenharmony_ci
27348c2ecf20Sopenharmony_ciu16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI)
27358c2ecf20Sopenharmony_ci{
27368c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI);
27378c2ecf20Sopenharmony_ci}
27388c2ecf20Sopenharmony_ci
27398c2ecf20Sopenharmony_ciu16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels)
27408c2ecf20Sopenharmony_ci{
27418c2ecf20Sopenharmony_ci	return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0,
27428c2ecf20Sopenharmony_ci		p_channels);
27438c2ecf20Sopenharmony_ci}
27448c2ecf20Sopenharmony_ci
27458c2ecf20Sopenharmony_ciu16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
27468c2ecf20Sopenharmony_ci	)
27478c2ecf20Sopenharmony_ci{
27488c2ecf20Sopenharmony_ci	return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN,
27498c2ecf20Sopenharmony_ci		an_log_gain[0], an_log_gain[1]);
27508c2ecf20Sopenharmony_ci}
27518c2ecf20Sopenharmony_ci
27528c2ecf20Sopenharmony_ciu16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
27538c2ecf20Sopenharmony_ci	)
27548c2ecf20Sopenharmony_ci{
27558c2ecf20Sopenharmony_ci	return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN,
27568c2ecf20Sopenharmony_ci		&an_log_gain[0], &an_log_gain[1]);
27578c2ecf20Sopenharmony_ci}
27588c2ecf20Sopenharmony_ci
27598c2ecf20Sopenharmony_ciu16 hpi_volume_set_mute(u32 h_control, u32 mute)
27608c2ecf20Sopenharmony_ci{
27618c2ecf20Sopenharmony_ci	return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0);
27628c2ecf20Sopenharmony_ci}
27638c2ecf20Sopenharmony_ci
27648c2ecf20Sopenharmony_ciu16 hpi_volume_get_mute(u32 h_control, u32 *mute)
27658c2ecf20Sopenharmony_ci{
27668c2ecf20Sopenharmony_ci	return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
27678c2ecf20Sopenharmony_ci}
27688c2ecf20Sopenharmony_ci
27698c2ecf20Sopenharmony_ciu16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
27708c2ecf20Sopenharmony_ci	short *max_gain_01dB, short *step_gain_01dB)
27718c2ecf20Sopenharmony_ci{
27728c2ecf20Sopenharmony_ci	struct hpi_message hm;
27738c2ecf20Sopenharmony_ci	struct hpi_response hr;
27748c2ecf20Sopenharmony_ci
27758c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
27768c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
27778c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
27788c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
27798c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_VOLUME_RANGE;
27808c2ecf20Sopenharmony_ci
27818c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
27828c2ecf20Sopenharmony_ci	if (hr.error) {
27838c2ecf20Sopenharmony_ci		hr.u.c.an_log_value[0] = 0;
27848c2ecf20Sopenharmony_ci		hr.u.c.an_log_value[1] = 0;
27858c2ecf20Sopenharmony_ci		hr.u.c.param1 = 0;
27868c2ecf20Sopenharmony_ci	}
27878c2ecf20Sopenharmony_ci	if (min_gain_01dB)
27888c2ecf20Sopenharmony_ci		*min_gain_01dB = hr.u.c.an_log_value[0];
27898c2ecf20Sopenharmony_ci	if (max_gain_01dB)
27908c2ecf20Sopenharmony_ci		*max_gain_01dB = hr.u.c.an_log_value[1];
27918c2ecf20Sopenharmony_ci	if (step_gain_01dB)
27928c2ecf20Sopenharmony_ci		*step_gain_01dB = (short)hr.u.c.param1;
27938c2ecf20Sopenharmony_ci	return hr.error;
27948c2ecf20Sopenharmony_ci}
27958c2ecf20Sopenharmony_ci
27968c2ecf20Sopenharmony_ciu16 hpi_volume_auto_fade_profile(u32 h_control,
27978c2ecf20Sopenharmony_ci	short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms,
27988c2ecf20Sopenharmony_ci	u16 profile)
27998c2ecf20Sopenharmony_ci{
28008c2ecf20Sopenharmony_ci	struct hpi_message hm;
28018c2ecf20Sopenharmony_ci	struct hpi_response hr;
28028c2ecf20Sopenharmony_ci
28038c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
28048c2ecf20Sopenharmony_ci		HPI_CONTROL_SET_STATE);
28058c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
28068c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
28078c2ecf20Sopenharmony_ci
28088c2ecf20Sopenharmony_ci	memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB,
28098c2ecf20Sopenharmony_ci		sizeof(short) * HPI_MAX_CHANNELS);
28108c2ecf20Sopenharmony_ci
28118c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_VOLUME_AUTOFADE;
28128c2ecf20Sopenharmony_ci	hm.u.c.param1 = duration_ms;
28138c2ecf20Sopenharmony_ci	hm.u.c.param2 = profile;
28148c2ecf20Sopenharmony_ci
28158c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
28168c2ecf20Sopenharmony_ci
28178c2ecf20Sopenharmony_ci	return hr.error;
28188c2ecf20Sopenharmony_ci}
28198c2ecf20Sopenharmony_ci
28208c2ecf20Sopenharmony_ciu16 hpi_volume_auto_fade(u32 h_control,
28218c2ecf20Sopenharmony_ci	short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms)
28228c2ecf20Sopenharmony_ci{
28238c2ecf20Sopenharmony_ci	return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB,
28248c2ecf20Sopenharmony_ci		duration_ms, HPI_VOLUME_AUTOFADE_LOG);
28258c2ecf20Sopenharmony_ci}
28268c2ecf20Sopenharmony_ci
28278c2ecf20Sopenharmony_ciu16 hpi_volume_query_auto_fade_profile(const u32 h_volume, const u32 i,
28288c2ecf20Sopenharmony_ci	u16 *profile)
28298c2ecf20Sopenharmony_ci{
28308c2ecf20Sopenharmony_ci	u16 e;
28318c2ecf20Sopenharmony_ci	u32 u;
28328c2ecf20Sopenharmony_ci	e = hpi_control_query(h_volume, HPI_VOLUME_AUTOFADE, i, 0, &u);
28338c2ecf20Sopenharmony_ci	*profile = (u16)u;
28348c2ecf20Sopenharmony_ci	return e;
28358c2ecf20Sopenharmony_ci}
28368c2ecf20Sopenharmony_ci
28378c2ecf20Sopenharmony_ciu16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB)
28388c2ecf20Sopenharmony_ci{
28398c2ecf20Sopenharmony_ci	struct hpi_message hm;
28408c2ecf20Sopenharmony_ci	struct hpi_response hr;
28418c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
28428c2ecf20Sopenharmony_ci		HPI_CONTROL_SET_STATE);
28438c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
28448c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
28458c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_VOX_THRESHOLD;
28468c2ecf20Sopenharmony_ci
28478c2ecf20Sopenharmony_ci	hm.u.c.an_log_value[0] = an_gain0_01dB;
28488c2ecf20Sopenharmony_ci
28498c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
28508c2ecf20Sopenharmony_ci
28518c2ecf20Sopenharmony_ci	return hr.error;
28528c2ecf20Sopenharmony_ci}
28538c2ecf20Sopenharmony_ci
28548c2ecf20Sopenharmony_ciu16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB)
28558c2ecf20Sopenharmony_ci{
28568c2ecf20Sopenharmony_ci	struct hpi_message hm;
28578c2ecf20Sopenharmony_ci	struct hpi_response hr;
28588c2ecf20Sopenharmony_ci	hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
28598c2ecf20Sopenharmony_ci		HPI_CONTROL_GET_STATE);
28608c2ecf20Sopenharmony_ci	if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
28618c2ecf20Sopenharmony_ci		return HPI_ERROR_INVALID_HANDLE;
28628c2ecf20Sopenharmony_ci	hm.u.c.attribute = HPI_VOX_THRESHOLD;
28638c2ecf20Sopenharmony_ci
28648c2ecf20Sopenharmony_ci	hpi_send_recv(&hm, &hr);
28658c2ecf20Sopenharmony_ci
28668c2ecf20Sopenharmony_ci	*an_gain0_01dB = hr.u.c.an_log_value[0];
28678c2ecf20Sopenharmony_ci
28688c2ecf20Sopenharmony_ci	return hr.error;
28698c2ecf20Sopenharmony_ci}
2870