void afe_send_cal(u16 port_id) { pr_debug("%s\n", __func__); if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) afe_send_cal_block(TX_CAL, port_id); else if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) afe_send_cal_block(RX_CAL, port_id); }
int afe_loopback(u16 enable, u16 dst_port, u16 src_port) { struct afe_loopback_command lb_cmd; int ret = 0; ret = afe_q6_interface_prepare(); if (ret != 0) return ret; if ((afe_get_port_type(dst_port) == MSM_AFE_PORT_TYPE_RX) && (afe_get_port_type(src_port) == MSM_AFE_PORT_TYPE_RX)) return afe_loopback_cfg(enable, dst_port, src_port, LB_MODE_EC_REF_VOICE_AUDIO); lb_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(20), APR_PKT_VER); lb_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE, sizeof(lb_cmd) - APR_HDR_SIZE); lb_cmd.hdr.src_port = 0; lb_cmd.hdr.dest_port = 0; lb_cmd.hdr.token = 0; lb_cmd.hdr.opcode = AFE_PORT_CMD_LOOPBACK; lb_cmd.tx_port_id = src_port; lb_cmd.rx_port_id = dst_port; lb_cmd.mode = 0xFFFF; lb_cmd.enable = (enable ? 1 : 0); atomic_set(&this_afe.state, 1); pr_info("%s: AFE loopback enable %d from src 0x%x to dst 0x%x\n", __func__,enable,src_port,dst_port); ret = apr_send_pkt(this_afe.apr, (uint32_t *) &lb_cmd); if (ret < 0) { pr_err("%s: AFE loopback failed\n", __func__); ret = -EINVAL; goto done; } ret = wait_event_timeout(this_afe.wait, (atomic_read(&this_afe.state) == 0), msecs_to_jiffies(TIMEOUT_MS)); if (!ret) { pr_err("%s: wait_event timeout\n", __func__); #ifdef HTC_AUD_DEBUG BUG(); #endif ret = -EINVAL; } done: return ret; }
static int afe_send_hw_delay(u16 port_id, u32 rate) { struct hw_delay_entry delay_entry; struct afe_port_cmd_set_param config; int index = 0; int ret = -EINVAL; pr_debug("%s\n", __func__); delay_entry.sample_rate = rate; if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) ret = get_hw_delay(TX_CAL, &delay_entry); else if (afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_RX) ret = get_hw_delay(RX_CAL, &delay_entry); if (ret != 0) { pr_debug("%s: Failed to get hw delay info\n", __func__); goto done; } index = port_id; if (index < 0) { pr_debug("%s: AFE port index invalid!\n", __func__); goto done; } 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; config.port_id = port_id; config.payload_size = sizeof(struct afe_param_payload_base)+ sizeof(struct afe_param_id_device_hw_delay_cfg); config.payload_address = 0; config.payload.base.module_id = AFE_MODULE_ID_PORT_INFO ; config.payload.base.param_id = AFE_PARAM_ID_DEVICE_HW_DELAY; config.payload.base.param_size = sizeof(struct afe_param_id_device_hw_delay_cfg); config.payload.base.reserved = 0; config.payload.param.hw_delay.delay_in_us = delay_entry.delay_usec; config.payload.param.hw_delay.device_hw_delay_minor_version = AFE_API_VERSION_DEVICE_HW_DELAY; atomic_set(&this_afe.state, 1); ret = apr_send_pkt(this_afe.apr, (uint32_t *) &config); if (ret < 0) { pr_err("%s: AFE enable for port %d failed\n", __func__, port_id); ret = -EINVAL; goto done; } ret = wait_event_timeout(this_afe.wait, (atomic_read(&this_afe.state) == 0), msecs_to_jiffies(TIMEOUT_MS)); if (!ret) { pr_err("%s: wait_event timeout IF CONFIG\n", __func__); ret = -EINVAL; goto done; } if (atomic_read(&this_afe.status) != 0) { pr_err("%s: config cmd failed\n", __func__); ret = -EINVAL; goto done; } done: pr_debug("%s port_id %u rate %u delay_usec %d status %d\n", __func__, port_id, rate, delay_entry.delay_usec, ret); return ret; }