static void msm_dai_q6_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct msm_dai_q6_dai_data *dai_data = dev_get_drvdata(dai->dev); int rc = 0; if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { switch (dai->id) { case VOICE_PLAYBACK_TX: case VOICE_RECORD_TX: case VOICE_RECORD_RX: pr_debug("%s, stop pseudo port:%d\n", __func__, dai->id); rc = afe_stop_pseudo_port(dai->id); break; default: rc = afe_close(dai->id); /* can block */ break; } if (IS_ERR_VALUE(rc)) dev_err(dai->dev, "fail to close AFE port\n"); pr_debug("%s: dai_data->status_mask = %ld\n", __func__, *dai_data->status_mask); clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); } }
static int msm_dai_q6_dai_remove(struct snd_soc_dai *dai) { struct msm_dai_q6_dai_data *dai_data; int rc; dai_data = dev_get_drvdata(dai->dev); /* If AFE port is still up, close it */ if (test_bit(STATUS_PORT_STARTED, dai_data->status_mask)) { switch (dai->id) { case VOICE_PLAYBACK_TX: case VOICE_RECORD_TX: case VOICE_RECORD_RX: pr_debug("%s, stop pseudo port:%d\n", __func__, dai->id); rc = afe_stop_pseudo_port(dai->id); break; default: rc = afe_close(dai->id); /* can block */ } if (IS_ERR_VALUE(rc)) dev_err(dai->dev, "fail to close AFE port\n"); clear_bit(STATUS_PORT_STARTED, dai_data->status_mask); } kfree(dai_data); snd_soc_unregister_dai(dai->dev); return 0; }
static int snddev_virtual_close(struct msm_snddev_info *dev_info) { int rc = 0; pr_debug("%s\n", __func__); mutex_lock(&snddev_virtual_lock); if (!dev_info) { pr_err("%s: NULL dev_info\n", __func__); rc = -EINVAL; goto done; } if (dev_info->opened) { rc = afe_stop_pseudo_port(dev_info->copp_id); } else { pr_err("%s: Pseudo port 0x%x is not open\n", __func__, dev_info->copp_id); rc = -EPERM; } done: mutex_unlock(&snddev_virtual_lock); return rc; }
int msm_disable_incall_recording(uint32_t popp_id, uint32_t rec_mode) { int rc = 0; uint32_t port_id[2]; port_id[0] = VOICE_RECORD_TX; port_id[1] = VOICE_RECORD_RX; pr_debug("%s: popp_id %d, rec_mode %d\n", __func__, popp_id, rec_mode); mutex_lock(&routing_info.adm_mutex); rc = voice_start_record(rec_mode, 0); if (rc < 0) { pr_err("%s: Error %d stopping record\n", __func__, rc); goto fail_cmd; } if (rec_mode == VOC_REC_UPLINK) { rc = adm_close(port_id[0]); if (rc < 0) { pr_err("%s: Error %d in ADM close %d\n", __func__, rc, port_id[0]); goto fail_cmd; } msm_clear_copp_id(popp_id, port_id[0]); rc = afe_stop_pseudo_port(port_id[0]); if (rc < 0) { pr_err("%s: Error %d in Tx pseudo port stop\n", __func__, rc); goto fail_cmd; } } else if (rec_mode == VOC_REC_DOWNLINK) { rc = adm_close(port_id[1]); if (rc < 0) { pr_err("%s: Error %d in ADM close %d\n", __func__, rc, port_id[1]); goto fail_cmd; } msm_clear_copp_id(popp_id, port_id[1]); rc = afe_stop_pseudo_port(port_id[1]); if (rc < 0) { pr_err("%s: Error %d in Rx pseudo port stop\n", __func__, rc); goto fail_cmd; } } else if (rec_mode == VOC_REC_BOTH) { rc = adm_close(port_id[0]); if (rc < 0) { pr_err("%s: Error %d in ADM close %d\n", __func__, rc, port_id[0]); goto fail_cmd; } msm_clear_copp_id(popp_id, port_id[0]); rc = afe_stop_pseudo_port(port_id[0]); if (rc < 0) { pr_err("%s: Error %d in Tx pseudo port stop\n", __func__, rc); goto fail_cmd; } rc = adm_close(port_id[1]); if (rc < 0) { pr_err("%s: Error %d in ADM close %d\n", __func__, rc, port_id[1]); goto fail_cmd; } msm_clear_copp_id(popp_id, port_id[1]); rc = afe_stop_pseudo_port(port_id[1]); if (rc < 0) { pr_err("%s: Error %d in Rx pseudo port stop\n", __func__, rc); goto fail_cmd; } } else { pr_err("%s Unknown rec_mode %d\n", __func__, rec_mode); goto fail_cmd; } fail_cmd: mutex_unlock(&routing_info.adm_mutex); return rc; }