Merge "soc: msm: add sensor dsp dynamic calibration support for anc"

This commit is contained in:
Linux Build Service Account 2018-10-09 09:43:44 -07:00 committed by Gerrit - the friendly Code Review server
commit a5a34b69d4
6 changed files with 266 additions and 241 deletions

View file

@ -53,8 +53,6 @@ struct anc_tdm_group_set_info {
struct anc_dev_drv_info {
uint32_t state;
uint32_t rpm;
uint32_t bypass_mode;
uint32_t algo_module_id;
};
@ -311,37 +309,15 @@ static int anc_dev_port_stop(int32_t which_port)
int msm_anc_dev_set_info(void *info_p, int32_t anc_cmd)
{
int rc = 0;
int rc = -EINVAL;
switch (anc_cmd) {
case ANC_CMD_RPM: {
struct audio_anc_rpm_info *rpm_info_p =
(struct audio_anc_rpm_info *)info_p;
if (this_anc_dev_info.state)
rc = anc_if_set_rpm(
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id,
rpm_info_p->rpm);
else
this_anc_dev_info.rpm = 0;
break;
}
case ANC_CMD_BYPASS_MODE: {
struct audio_anc_bypass_mode *bypass_mode_p =
(struct audio_anc_bypass_mode *)info_p;
if (this_anc_dev_info.state)
rc = anc_if_set_bypass_mode(
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id,
bypass_mode_p->mode);
else
this_anc_dev_info.bypass_mode = bypass_mode_p->mode;
break;
}
case ANC_CMD_ALGO_MODULE: {
struct audio_anc_algo_module_info *module_info_p =
(struct audio_anc_algo_module_info *)info_p;
rc = 0;
if (this_anc_dev_info.state)
rc = anc_if_set_algo_module_id(
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id,
@ -351,11 +327,49 @@ int msm_anc_dev_set_info(void *info_p, int32_t anc_cmd)
module_info_p->module_id;
break;
}
case ANC_CMD_ALGO_CALIBRATION: {
rc = -EINVAL;
if (this_anc_dev_info.state)
rc = anc_if_set_algo_module_cali_data(
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id,
info_p);
else
pr_err("%s: ANC is not running yet\n",
__func__);
break;
}
default:
pr_err("%s: ANC cmd wrong\n",
__func__);
break;
}
return rc;
}
int msm_anc_dev_get_info(void *info_p, int32_t anc_cmd)
{
int rc = -EINVAL;
switch (anc_cmd) {
case ANC_CMD_ALGO_CALIBRATION: {
if (this_anc_dev_info.state)
rc = anc_if_get_algo_module_cali_data(
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id,
info_p);
else
pr_err("%s: ANC is not running yet\n",
__func__);
break;
}
default:
pr_err("%s: ANC cmd wrong\n",
__func__);
break;
}
return rc;
}
int msm_anc_dev_start(void)
{
@ -514,11 +528,6 @@ int msm_anc_dev_start(void)
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id,
this_anc_dev_info.algo_module_id);
if (this_anc_dev_info.bypass_mode != 0)
rc = anc_if_set_bypass_mode(
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id,
this_anc_dev_info.bypass_mode);
group_id = get_group_id_from_port_id(
anc_port_cfg[ANC_DEV_PORT_ANC_SPKR].port_id);
@ -612,8 +621,6 @@ int msm_anc_dev_stop(void)
this_anc_dev_info.state = 0;
this_anc_dev_info.algo_module_id = 0;
this_anc_dev_info.rpm = 0;
this_anc_dev_info.bypass_mode = 0;
pr_debug("%s: ANC devices stop successfully!\n", __func__);

View file

@ -44,17 +44,11 @@ static size_t get_user_anc_cmd_size(int32_t anc_cmd)
case ANC_CMD_STOP:
size = 0;
break;
case ANC_CMD_RPM:
size = sizeof(struct audio_anc_rpm_info);
break;
case ANC_CMD_BYPASS_MODE:
size = sizeof(struct audio_anc_bypass_mode);
break;
case ANC_CMD_ALGO_MODULE:
size = sizeof(struct audio_anc_algo_module_info);
break;
case ANC_CMD_ALGO_CALIBRATION:
size = sizeof(struct audio_anc_algo_calibration_info);
size = sizeof(struct audio_anc_algo_calibration_header);
break;
default:
pr_err("%s:Invalid anc cmd %d!",
@ -77,8 +71,6 @@ static int call_set_anc(int32_t anc_cmd,
case ANC_CMD_STOP:
ret = msm_anc_dev_stop();
break;
case ANC_CMD_RPM:
case ANC_CMD_BYPASS_MODE:
case ANC_CMD_ALGO_MODULE:
case ANC_CMD_ALGO_CALIBRATION:
ret = msm_anc_dev_set_info(data, anc_cmd);
@ -98,7 +90,8 @@ static int call_get_anc(int32_t anc_cmd,
int ret = 0;
switch (anc_cmd) {
case ANC_CMD_RPM:
case ANC_CMD_ALGO_CALIBRATION:
ret = msm_anc_dev_get_info(data, anc_cmd);
break;
default:
break;
@ -146,9 +139,9 @@ static long audio_anc_shared_ioctl(struct file *file, unsigned int cmd,
pr_err("%s: Could not copy size value from user\n", __func__);
ret = -EFAULT;
goto done;
} else if (size < sizeof(struct audio_anc_packet)) {
} else if (size < sizeof(struct audio_anc_header)) {
pr_err("%s: Invalid size sent to driver: %d, min size is %zd\n",
__func__, size, sizeof(struct audio_anc_packet));
__func__, size, sizeof(struct audio_anc_header));
ret = -EINVAL;
goto done;
}

View file

@ -38,7 +38,7 @@ struct anc_if_ctl {
atomic_t status;
wait_queue_head_t wait[AFE_MAX_PORTS];
struct task_struct *task;
struct anc_get_rpm_resp rpm_calib_data;
struct anc_get_algo_module_cali_data_resp cali_data_resp;
uint32_t mmap_handle;
struct mutex afe_cmd_lock;
};
@ -48,33 +48,23 @@ static struct anc_if_ctl this_anc_if;
static int32_t anc_get_param_callback(uint32_t *payload,
uint32_t payload_size)
{
u32 param_id;
struct anc_get_rpm_resp *resp =
(struct anc_get_rpm_resp *) payload;
if (!(&(resp->pdata))) {
pr_err("%s: Error: resp pdata is NULL\n", __func__);
if ((payload_size < (sizeof(uint32_t) +
sizeof(this_anc_if.cali_data_resp.pdata))) ||
(payload_size > sizeof(this_anc_if.cali_data_resp))) {
pr_err("%s: Error: received size %d, calib_data size %zu\n",
__func__, payload_size,
sizeof(this_anc_if.cali_data_resp));
return -EINVAL;
}
param_id = resp->pdata.param_id;
if (param_id == AUD_MSVC_PARAM_ID_PORT_ANC_ALGO_RPM) {
if (payload_size < sizeof(this_anc_if.rpm_calib_data)) {
pr_err("%s: Error: received size %d, calib_data size %zu\n",
__func__, payload_size,
sizeof(this_anc_if.rpm_calib_data));
return -EINVAL;
}
memcpy(&this_anc_if.rpm_calib_data, payload,
sizeof(this_anc_if.rpm_calib_data));
if (!this_anc_if.rpm_calib_data.status) {
atomic_set(&this_anc_if.state, 0);
} else {
pr_debug("%s: calib resp status: %d", __func__,
this_anc_if.rpm_calib_data.status);
atomic_set(&this_anc_if.state, -1);
}
memcpy(&this_anc_if.cali_data_resp, payload,
payload_size);
if (!this_anc_if.cali_data_resp.status) {
atomic_set(&this_anc_if.state, 0);
} else {
pr_debug("%s: calib resp status: %d", __func__,
this_anc_if.cali_data_resp.status);
atomic_set(&this_anc_if.state, -1);
}
return 0;
@ -465,108 +455,9 @@ int anc_if_tdm_port_stop(u16 port_id)
return anc_if_send_cmd_port_stop(port_id);
}
int anc_if_set_rpm(u16 port_id, u32 rpm)
{
int ret = 0;
int index;
ret = anc_sdsp_interface_prepare();
if (ret != 0) {
pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
return ret;
}
index = q6audio_get_port_index(port_id);
{
struct anc_set_rpm_command config;
memset(&config, 0, sizeof(config));
config.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
config.hdr.pkt_size = sizeof(config);
config.hdr.src_port = 0;
config.hdr.dest_port = 0;
config.hdr.token = index;
config.hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2;
config.param.port_id = q6audio_get_port_id(port_id);
config.param.payload_size = sizeof(config) -
sizeof(struct apr_hdr) -
sizeof(config.param);
config.param.payload_address_lsw = 0x00;
config.param.payload_address_msw = 0x00;
config.param.mem_map_handle = 0x00;
config.pdata.module_id = AUD_MSVC_MODULE_AUDIO_DEV_ANC_ALGO;
config.pdata.param_id = AUD_MSVC_PARAM_ID_PORT_ANC_ALGO_RPM;
config.pdata.param_size = sizeof(config.set_rpm);
config.set_rpm.minor_version =
AUD_MSVC_API_VERSION_DEV_ANC_ALGO_RPM;
config.set_rpm.rpm = rpm;
ret = anc_if_apr_send_pkt(&config, &this_anc_if.wait[index]);
if (ret) {
pr_err("%s: share resource for port 0x%x failed ret = %d\n",
__func__, port_id, ret);
}
}
return ret;
}
int anc_if_set_bypass_mode(u16 port_id, u32 bypass_mode)
{
int ret = 0;
int index;
ret = anc_sdsp_interface_prepare();
if (ret != 0) {
pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
return ret;
}
index = q6audio_get_port_index(port_id);
{
struct anc_set_bypass_mode_command config;
memset(&config, 0, sizeof(config));
config.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
config.hdr.pkt_size = sizeof(config);
config.hdr.src_port = 0;
config.hdr.dest_port = 0;
config.hdr.token = index;
config.hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2;
config.param.port_id = q6audio_get_port_id(port_id);
config.param.payload_size = sizeof(config) -
sizeof(struct apr_hdr) -
sizeof(config.param);
config.param.payload_address_lsw = 0x00;
config.param.payload_address_msw = 0x00;
config.param.mem_map_handle = 0x00;
config.pdata.module_id = AUD_MSVC_MODULE_AUDIO_DEV_ANC_ALGO;
config.pdata.param_id =
AUD_MSVC_PARAM_ID_PORT_ANC_ALGO_BYPASS_MODE;
config.pdata.param_size = sizeof(config.set_bypass_mode);
config.set_bypass_mode.minor_version =
AUD_MSVC_API_VERSION_DEV_ANC_ALGO_BYPASS_MODE;
config.set_bypass_mode.bypass_mode = bypass_mode;
ret = anc_if_apr_send_pkt(&config, &this_anc_if.wait[index]);
if (ret) {
pr_err("%s: share resource for port 0x%x failed ret = %d\n",
__func__, port_id, ret);
}
}
return ret;
}
int anc_if_set_algo_module_id(u16 port_id, u32 module_id)
{
int ret = 0;
int index;
ret = anc_sdsp_interface_prepare();
@ -595,7 +486,7 @@ int anc_if_set_algo_module_id(u16 port_id, u32 module_id)
config.param.payload_address_lsw = 0x00;
config.param.payload_address_msw = 0x00;
config.param.mem_map_handle = 0x00;
config.pdata.module_id = AUD_MSVC_MODULE_AUDIO_DEV_ANC_ALGO;
config.pdata.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE;
config.pdata.param_id =
AUD_MSVC_PARAM_ID_PORT_ANC_ALGO_MODULE_ID;
config.pdata.param_size = sizeof(config.set_algo_module_id);
@ -616,7 +507,6 @@ int anc_if_set_anc_mic_spkr_layout(u16 port_id,
struct aud_msvc_param_id_dev_anc_mic_spkr_layout_info *set_mic_spkr_layout_p)
{
int ret = 0;
int index;
ret = anc_sdsp_interface_prepare();
@ -645,7 +535,7 @@ struct aud_msvc_param_id_dev_anc_mic_spkr_layout_info *set_mic_spkr_layout_p)
config.param.payload_address_lsw = 0x00;
config.param.payload_address_msw = 0x00;
config.param.mem_map_handle = 0x00;
config.pdata.module_id = AUD_MSVC_MODULE_AUDIO_DEV_ANC_ALGO;
config.pdata.module_id = AFE_MODULE_AUDIO_DEV_INTERFACE;
config.pdata.param_id =
AUD_MSVC_PARAM_ID_PORT_ANC_MIC_SPKR_LAYOUT_INFO;
config.pdata.param_size = sizeof(config.set_mic_spkr_layout);
@ -662,6 +552,160 @@ struct aud_msvc_param_id_dev_anc_mic_spkr_layout_info *set_mic_spkr_layout_p)
return ret;
}
int anc_if_set_algo_module_cali_data(u16 port_id, void *data_p)
{
int ret = 0;
int index;
ret = anc_sdsp_interface_prepare();
if (ret != 0) {
pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
return ret;
}
index = q6audio_get_port_index(port_id);
{
struct anc_set_algo_module_cali_data_command *cali_data_cfg_p;
void *config_p = NULL;
int cmd_size = 0;
void *out_payload_p = NULL;
uint32_t *in_payload_p = (uint32_t *)data_p;
uint32_t module_id = *in_payload_p;
uint32_t param_id = *(in_payload_p + 1);
uint32_t payload_size = *(in_payload_p + 2);
cmd_size = sizeof(struct anc_set_algo_module_cali_data_command)
+ payload_size;
config_p = kzalloc(cmd_size, GFP_KERNEL);
if (!config_p) {
ret = -ENOMEM;
return ret;
}
memset(config_p, 0, cmd_size);
out_payload_p = config_p
+ sizeof(struct anc_set_algo_module_cali_data_command);
cali_data_cfg_p =
(struct anc_set_algo_module_cali_data_command *)config_p;
cali_data_cfg_p->hdr.hdr_field =
APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
cali_data_cfg_p->hdr.pkt_size = cmd_size;
cali_data_cfg_p->hdr.src_port = 0;
cali_data_cfg_p->hdr.dest_port = 0;
cali_data_cfg_p->hdr.token = index;
cali_data_cfg_p->hdr.opcode = AFE_PORT_CMD_SET_PARAM_V2;
cali_data_cfg_p->param.port_id = q6audio_get_port_id(port_id);
cali_data_cfg_p->param.payload_size = cmd_size -
sizeof(struct apr_hdr) -
sizeof(struct aud_msvc_port_cmd_set_param_v2);
cali_data_cfg_p->param.payload_address_lsw = 0x00;
cali_data_cfg_p->param.payload_address_msw = 0x00;
cali_data_cfg_p->param.mem_map_handle = 0x00;
cali_data_cfg_p->pdata.module_id = module_id;
cali_data_cfg_p->pdata.param_id = param_id;
cali_data_cfg_p->pdata.param_size = payload_size;
memcpy(out_payload_p, (in_payload_p + 3), payload_size);
ret = anc_if_apr_send_pkt(cali_data_cfg_p,
&this_anc_if.wait[index]);
if (ret)
pr_err("%s: anc algo module calibration data for port 0x%x failed ret = %d\n",
__func__, port_id, ret);
kfree(config_p);
}
return ret;
}
int anc_if_get_algo_module_cali_data(u16 port_id, void *data_p)
{
int ret = 0;
int index;
ret = anc_sdsp_interface_prepare();
if (ret != 0) {
pr_err("%s: Q6 interface prepare failed %d\n", __func__, ret);
return ret;
}
index = q6audio_get_port_index(port_id);
{
struct anc_get_algo_module_cali_data_command *cali_data_cfg_p;
void *config_p = NULL;
int cmd_size = 0;
void *out_payload_p = NULL;
uint32_t *in_payload_p = (uint32_t *)data_p;
uint32_t module_id = *in_payload_p;
uint32_t param_id = *(in_payload_p + 1);
uint32_t payload_size = *(in_payload_p + 2);
cmd_size = sizeof(struct anc_get_algo_module_cali_data_command)
+ payload_size;
config_p = kzalloc(cmd_size, GFP_KERNEL);
if (!config_p) {
ret = -ENOMEM;
return ret;
}
memset(config_p, 0, cmd_size);
out_payload_p = config_p +
sizeof(struct anc_set_algo_module_cali_data_command);
cali_data_cfg_p =
(struct anc_get_algo_module_cali_data_command *)config_p;
cali_data_cfg_p->hdr.hdr_field =
APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
cali_data_cfg_p->hdr.pkt_size = cmd_size;
cali_data_cfg_p->hdr.src_port = 0;
cali_data_cfg_p->hdr.dest_port = 0;
cali_data_cfg_p->hdr.token = index;
cali_data_cfg_p->hdr.opcode = AFE_PORT_CMD_GET_PARAM_V2;
cali_data_cfg_p->param.port_id = q6audio_get_port_id(port_id);
cali_data_cfg_p->param.payload_size = cmd_size -
sizeof(struct apr_hdr) -
sizeof(struct aud_msvc_port_cmd_get_param_v2);
cali_data_cfg_p->param.payload_address_lsw = 0x00;
cali_data_cfg_p->param.payload_address_msw = 0x00;
cali_data_cfg_p->param.mem_map_handle = 0x00;
cali_data_cfg_p->param.module_id = module_id;
cali_data_cfg_p->param.param_id = param_id;
cali_data_cfg_p->pdata.param_size = 0;
cali_data_cfg_p->pdata.module_id = 0;
cali_data_cfg_p->pdata.param_id = 0;
ret = anc_if_apr_send_pkt(cali_data_cfg_p,
&this_anc_if.wait[index]);
if (ret)
pr_err("%s: anc algo module calibration data for port 0x%x failed ret = %d\n",
__func__, port_id, ret);
memcpy((in_payload_p + 3),
&this_anc_if.cali_data_resp.payload[0], payload_size);
*in_payload_p = this_anc_if.cali_data_resp.pdata.module_id;
*(in_payload_p + 1) =
this_anc_if.cali_data_resp.pdata.param_id;
*(in_payload_p + 2) =
this_anc_if.cali_data_resp.pdata.param_size;
kfree(config_p);
}
return ret;
}
int anc_if_cmd_memory_map(int port_id, phys_addr_t dma_addr_p,
u32 dma_buf_sz)
{
@ -700,7 +744,6 @@ int anc_if_cmd_memory_map(int port_id, phys_addr_t dma_addr_p,
mmap_region_cmd = kzalloc(cmd_size, GFP_KERNEL);
if (!mmap_region_cmd) {
ret = -ENOMEM;
pr_err("%s: allocate mmap_region_cmd failed\n", __func__);
return ret;
}

View file

@ -39,6 +39,8 @@ int msm_anc_dev_stop(void);
int msm_anc_dev_set_info(void *info_p, int32_t anc_cmd);
int msm_anc_dev_get_info(void *info_p, int32_t anc_cmd);
int msm_anc_dev_create(struct platform_device *pdev);
int msm_anc_dev_destroy(struct platform_device *pdev);

View file

@ -15,7 +15,6 @@
#include <sound/q6afe-v2.h>
#include <sound/apr_audio-v2.h>
#define AUD_MSVC_MODULE_AUDIO_DEV_RESOURCE_SHARE 0x0001028A
#define AUD_MSVC_PARAM_ID_PORT_SHARE_RESOURCE_CONFIG 0x00010297
#define AUD_MSVC_API_VERSION_SHARE_RESOURCE_CONFIG 0x1
@ -23,8 +22,6 @@
#define AUD_MSVC_PARAM_ID_DEV_ANC_REFS_CONFIG 0x00010286
#define AUD_MSVC_API_VERSION_DEV_ANC_REFS_CONFIG 0x1
#define AUD_MSVC_MODULE_AUDIO_DEV_ANC_ALGO 0x00010234
#define AUD_MSVC_PARAM_ID_PORT_ANC_ALGO_RPM 0x00010235
#define AUD_MSVC_API_VERSION_DEV_ANC_ALGO_RPM 0x1
struct aud_msvc_port_param_data_v2 {
/* ID of the module to be configured.
@ -148,7 +145,7 @@ struct aud_msvc_port_cmd_get_param_v2 {
} __packed;
struct aud_audioif_config_command {
struct apr_hdr hdr;
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
union afe_port_config port;
@ -162,13 +159,6 @@ struct aud_msvc_param_id_dev_share_resource_cfg {
u32 lpm_length;
} __packed;
struct aud_msvc_param_id_dev_anc_algo_rpm {
u32 minor_version;
u32 rpm;
} __packed;
struct aud_msvc_param_id_dev_anc_refs_cfg {
u32 minor_version;
u16 port_id;
@ -177,65 +167,20 @@ struct aud_msvc_param_id_dev_anc_refs_cfg {
u32 bit_width;
} __packed;
struct anc_share_resource_command {
struct apr_hdr hdr;
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_share_resource_cfg resource;
} __packed;
struct anc_config_ref_command {
struct apr_hdr hdr;
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_anc_refs_cfg refs;
} __packed;
struct anc_set_rpm_command {
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_anc_algo_rpm set_rpm;
} __packed;
struct anc_get_rpm_command {
struct apr_hdr hdr;
struct aud_msvc_port_cmd_get_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_anc_algo_rpm get_rpm;
} __packed;
struct anc_get_rpm_resp {
uint32_t status;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_anc_algo_rpm res_rpm;
} __packed;
#define AUD_MSVC_PARAM_ID_PORT_ANC_ALGO_BYPASS_MODE 0x0001029B
#define AUD_MSVC_API_VERSION_DEV_ANC_ALGO_BYPASS_MODE 0x1
#define AUD_MSVC_ANC_ALGO_BYPASS_MODE_NO 0x0
#define AUD_MSVC_ANC_ALGO_BYPASS_MODE_REFS_TO_ANC_SPKR 0x1
#define AUD_MSVC_ANC_ALGO_BYPASS_MODE_ANC_MIC_TO_ANC_SPKR 0x2
#define AUD_MSVC_ANC_ALGO_BYPASS_MODE_REFS_MIXED_ANC_MIC_TO_ANC_SPKR 0x3
struct aud_msvc_param_id_dev_anc_algo_bypass_mode {
uint32_t minor_version;
uint32_t bypass_mode;
} __packed;
struct anc_set_bypass_mode_command {
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_anc_algo_bypass_mode set_bypass_mode;
} __packed;
#define AUD_MSVC_PARAM_ID_PORT_ANC_ALGO_MODULE_ID 0x0001023A
struct aud_msvc_param_id_dev_anc_algo_module_id {
@ -244,7 +189,7 @@ struct aud_msvc_param_id_dev_anc_algo_module_id {
} __packed;
struct anc_set_algo_module_id_command {
struct apr_hdr hdr;
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_anc_algo_module_id set_algo_module_id;
@ -269,13 +214,37 @@ struct aud_msvc_param_id_dev_anc_mic_spkr_layout_info {
} __packed;
struct anc_set_mic_spkr_layout_info_command {
struct apr_hdr hdr;
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
struct aud_msvc_param_id_dev_anc_mic_spkr_layout_info
set_mic_spkr_layout;
} __packed;
struct anc_set_algo_module_cali_data_command {
struct apr_hdr hdr;
struct aud_msvc_port_cmd_set_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
/*
* calibration data payload followed
*/
} __packed;
struct anc_get_algo_module_cali_data_command {
struct apr_hdr hdr;
struct aud_msvc_port_cmd_get_param_v2 param;
struct aud_msvc_port_param_data_v2 pdata;
/*
* calibration data payload followed
*/
} __packed;
struct anc_get_algo_module_cali_data_resp {
uint32_t status;
struct aud_msvc_port_param_data_v2 pdata;
uint32_t payload[128];
} __packed;
int anc_if_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port);
int anc_if_tdm_port_stop(u16 port_id);
@ -286,15 +255,15 @@ int anc_if_share_resource(u16 port_id, u16 rddma_idx, u16 wrdma_idx,
int anc_if_config_ref(u16 port_id, u32 sample_rate, u32 bit_width,
u16 num_channel);
int anc_if_set_rpm(u16 port_id, u32 rpm);
int anc_if_set_bypass_mode(u16 port_id, u32 bypass_mode);
int anc_if_set_algo_module_id(u16 port_id, u32 module_id);
int anc_if_set_anc_mic_spkr_layout(u16 port_id,
struct aud_msvc_param_id_dev_anc_mic_spkr_layout_info *set_mic_spkr_layout_p);
int anc_if_set_algo_module_cali_data(u16 port_id, void *data_p);
int anc_if_get_algo_module_cali_data(u16 port_id, void *data_p);
int anc_if_shared_mem_map(void);
int anc_if_shared_mem_unmap(void);

View file

@ -21,6 +21,8 @@
/* room for ANC_CMD define extend */
#define ANC_CMD_MAX 0xFF
#define ANC_CALIBRATION_PAYLOAD_SIZE_MAX 100
struct audio_anc_header {
int32_t data_size;
int32_t version;
@ -35,14 +37,23 @@ struct audio_anc_rpm_info {
struct audio_anc_bypass_mode {
int32_t mode;
};
struct audio_anc_algo_module_info {
int32_t module_id;
};
struct audio_anc_algo_calibration_header {
uint32_t module_id;
uint32_t param_id;
uint32_t payload_size;
};
struct audio_anc_algo_calibration_body {
int32_t payload[ANC_CALIBRATION_PAYLOAD_SIZE_MAX];
};
struct audio_anc_algo_calibration_info {
int32_t payload_size;
/* num bytes of payload specificed in payload_size followed */
struct audio_anc_algo_calibration_header cali_header;
struct audio_anc_algo_calibration_body cali_body;
};
union audio_anc_data {