Merge "soc: msm: add sensor dsp dynamic calibration support for anc"
This commit is contained in:
commit
a5a34b69d4
6 changed files with 266 additions and 241 deletions
|
@ -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__);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue