int msm_clear_session_id(int session_id) { int rc = 0; int i = 0; if (session_id < 1 || session_id > 8) return -EINVAL; pr_debug("%s: session[%d]\n", __func__, session_id); mutex_lock(&routing_info.adm_mutex); mutex_lock(&routing_info.copp_list_mutex); for (i = 0; i < AFE_MAX_PORTS; i++) { if (routing_info.copp_list[session_id][i] != COPP_IGNORE) { rc = adm_close(routing_info.copp_list[session_id][i]); if (rc < 0) { pr_err("%s: adm close fail port[%d] rc[%d]\n", __func__, routing_info.copp_list[session_id][i], rc); continue; } #ifdef CONFIG_MSM8X60_RTAC rtac_remove_adm_device( routing_info.copp_list[session_id][i], session_id); #endif routing_info.copp_list[session_id][i] = COPP_IGNORE; rc = 0; } } mutex_unlock(&routing_info.copp_list_mutex); mutex_unlock(&routing_info.adm_mutex); return rc; }
int msm_clear_copp_id(int session_id, int copp_id) { int rc = 0; int index = afe_get_port_index(copp_id); if (session_id < 1 || session_id > 8) return -EINVAL; pr_debug("%s: session[%d] copp_id[%d] index[%d]\n", __func__, session_id, copp_id, index); mutex_lock(&routing_info.copp_list_mutex); if (routing_info.copp_list[session_id][index] == copp_id) routing_info.copp_list[session_id][index] = COPP_IGNORE; #ifdef CONFIG_MSM8X60_RTAC rtac_remove_adm_device(copp_id, session_id); #endif mutex_unlock(&routing_info.copp_list_mutex); return rc; }
int adm_close(int port_id) { struct apr_hdr close; int ret = 0; int index = 0; port_id = afe_convert_virtual_to_portid(port_id); index = afe_get_port_index(port_id); if (afe_validate_port(port_id) < 0) return -EINVAL; pr_debug("%s port_id=%d index %d\n", __func__, port_id, index); if (!(atomic_read(&this_adm.copp_cnt[index]))) { pr_err("%s: copp count for port[%d]is 0\n", __func__, port_id); goto fail_cmd; } atomic_dec(&this_adm.copp_cnt[index]); if (!(atomic_read(&this_adm.copp_cnt[index]))) { close.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); close.pkt_size = sizeof(close); close.src_svc = APR_SVC_ADM; close.src_domain = APR_DOMAIN_APPS; close.src_port = port_id; close.dest_svc = APR_SVC_ADM; close.dest_domain = APR_DOMAIN_ADSP; close.dest_port = atomic_read(&this_adm.copp_id[index]); close.token = port_id; close.opcode = ADM_CMD_COPP_CLOSE; atomic_set(&this_adm.copp_id[index], RESET_COPP_ID); atomic_set(&this_adm.copp_stat[index], 0); this_adm.prev_index = 0xffff; pr_debug("%s:coppid %d portid=%d index=%d coppcnt=%d\n", __func__, atomic_read(&this_adm.copp_id[index]), port_id, index, atomic_read(&this_adm.copp_cnt[index])); ret = apr_send_pkt(this_adm.apr, (uint32_t *)&close); if (ret < 0) { pr_err("%s ADM close failed\n", __func__); ret = -EINVAL; goto fail_cmd; } ret = wait_event_timeout(this_adm.wait, atomic_read(&this_adm.copp_stat[index]), msecs_to_jiffies(TIMEOUT_MS)); if (!ret) { pr_err("%s: ADM cmd Route failed for port %d\n", __func__, port_id); ret = -EINVAL; goto fail_cmd; } rtac_remove_adm_device(port_id); } fail_cmd: return ret; }
int adm_close(int port_id, bool perf_mode) { struct apr_hdr close; int ret = 0; int index = 0; int copp_id = RESET_COPP_ID; port_id = q6audio_convert_virtual_to_portid(port_id); index = q6audio_get_port_index(port_id); if (q6audio_validate_port(port_id) < 0) return -EINVAL; pr_debug("%s port_id=%#x index %d perf_mode: %d\n", __func__, port_id, index, perf_mode); if (perf_mode) { if (!(atomic_read(&this_adm.copp_low_latency_cnt[index]))) { pr_err("%s: copp count for port[%#x]is 0\n", __func__, port_id); goto fail_cmd; } atomic_dec(&this_adm.copp_low_latency_cnt[index]); } else { if (!(atomic_read(&this_adm.copp_cnt[index]))) { pr_err("%s: copp count for port[%#x]is 0\n", __func__, port_id); goto fail_cmd; } atomic_dec(&this_adm.copp_cnt[index]); } if ((!perf_mode && !(atomic_read(&this_adm.copp_cnt[index]))) || (perf_mode && !(atomic_read(&this_adm.copp_low_latency_cnt[index])))) { pr_debug("%s:Closing ADM: perf_mode: %d\n", __func__, perf_mode); close.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); close.pkt_size = sizeof(close); close.src_svc = APR_SVC_ADM; close.src_domain = APR_DOMAIN_APPS; close.src_port = port_id; close.dest_svc = APR_SVC_ADM; close.dest_domain = APR_DOMAIN_ADSP; if (perf_mode) close.dest_port = atomic_read(&this_adm.copp_low_latency_id[index]); else close.dest_port = atomic_read(&this_adm.copp_id[index]); close.token = port_id; close.opcode = ADM_CMD_DEVICE_CLOSE_V5; atomic_set(&this_adm.copp_stat[index], 0); if (perf_mode) { copp_id = atomic_read(&this_adm.copp_low_latency_id[index]); pr_debug("%s:coppid %d portid=%#x index=%d coppcnt=%d\n", __func__, copp_id, port_id, index, atomic_read(&this_adm.copp_low_latency_cnt[index])); atomic_set(&this_adm.copp_low_latency_id[index], RESET_COPP_ID); } else { copp_id = atomic_read(&this_adm.copp_id[index]); pr_debug("%s:coppid %d portid=%#x index=%d coppcnt=%d\n", __func__, copp_id, port_id, index, atomic_read(&this_adm.copp_cnt[index])); atomic_set(&this_adm.copp_id[index], RESET_COPP_ID); } ret = apr_send_pkt(this_adm.apr, (uint32_t *)&close); if (ret < 0) { pr_err("%s ADM close failed\n", __func__); ret = -EINVAL; goto fail_cmd; } ret = wait_event_timeout(this_adm.wait[index], atomic_read(&this_adm.copp_stat[index]), msecs_to_jiffies(TIMEOUT_MS)); if (!ret) { pr_err("%s: ADM cmd Route failed for port %#x\n", __func__, port_id); ret = -EINVAL; goto fail_cmd; } } pr_debug("%s: remove adm device from rtac\n", __func__); rtac_remove_adm_device(port_id, copp_id); fail_cmd: return ret; }