Пример #1
0
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);
	}
}
Пример #2
0
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;
}
Пример #3
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;
}
Пример #4
0
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;
}