示例#1
0
static int voc_unregister_client(struct voc_ctxt *ctxt)
{
    struct voc_rpc *voc_rpc = &the_voc_proc;
    int rc;

    struct vocpcm_register_client_msg msg;
    msg.intr = cpu_to_be32(ctxt->intr);
    msg.client_func = cpu_to_be32(0xffffffff);

    if (ctxt->intr % 2) {
        msm_rpc_setup_req(&msg.hdr, RPC_SND_PROG, RPC_SND_VERS,
                          VOCPCM_REGISTER_PCM_INPUT_CLIENT_PROC);
    } else {
        msm_rpc_setup_req(&msg.hdr, RPC_SND_PROG, RPC_SND_VERS,
                          VOCPCM_REGISTER_PCM_OUTPUT_CLIENT_PROC);
    }

    rc = msm_rpc_write(voc_rpc->ept, &msg, sizeof(msg));
    if (rc < 0) {
        pr_err("%s: %d failed\n", __func__, ctxt->intr);
    } else {
        pr_info("%s: %d success\n", __func__, ctxt->intr);
        ctxt->client = 0;
    }
    return rc;
}
示例#2
0
/*
 * Send RPC_ADSP_RTOS_CMD_GET_INIT_INFO cmd to ARM9 and get
 * queue offsets and module entries (init info) as part of the event.
 */
static void  msm_get_init_info(void)
{
	int rc;
	struct rpc_adsp_rtos_app_to_modem_args_t rpc_req;

	adsp_info.init_info_rpc_client = msm_rpc_connect(
			RPC_ADSP_RTOS_ATOM_PROG,
			RPC_ADSP_RTOS_ATOM_VERS,
			MSM_RPC_UNINTERRUPTIBLE | MSM_RPC_ENABLE_RECEIVE);
	if (IS_ERR(adsp_info.init_info_rpc_client)) {
		rc = PTR_ERR(adsp_info.init_info_rpc_client);
		adsp_info.init_info_rpc_client = 0;
		pr_err("adsp: could not open rpc client: %d\n", rc);
		return;
	}

	msm_rpc_setup_req(&rpc_req.hdr,
			RPC_ADSP_RTOS_ATOM_PROG,
			msm_rpc_get_vers(adsp_info.init_info_rpc_client),
			RPC_ADSP_RTOS_APP_TO_MODEM_PROC);

	rpc_req.gotit = cpu_to_be32(1);
	rpc_req.cmd = cpu_to_be32(RPC_ADSP_RTOS_CMD_GET_INIT_INFO);
	rpc_req.proc_id = cpu_to_be32(RPC_ADSP_RTOS_PROC_APPS);
	rpc_req.module = 0;

	rc = msm_rpc_write(adsp_info.init_info_rpc_client,
				&rpc_req, sizeof(rpc_req));
	if (rc < 0)
		pr_err("adsp: could not send RPC request: %d\n", rc);
}
示例#3
0
static int audio_mvs_setup(struct audio_mvs_info_type *audio)
{
	int rc = 0;
	struct audio_mvs_enable_msg enable_msg;

	pr_debug("%s:\n", __func__);

	/* Enable MVS. */
	memset(&enable_msg, 0, sizeof(enable_msg));
	enable_msg.enable_args.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP);
	enable_msg.enable_args.mode = cpu_to_be32(audio->mvs_mode);
	enable_msg.enable_args.ul_cb_func_id = cpu_to_be32(MVS_UL_CB_FUNC_ID);
	enable_msg.enable_args.dl_cb_func_id = cpu_to_be32(MVS_DL_CB_FUNC_ID);
	enable_msg.enable_args.context = cpu_to_be32(MVS_PKT_CONTEXT_ISR);

	msm_rpc_setup_req(&enable_msg.rpc_hdr,
			  audio->rpc_prog,
			  audio->rpc_ver,
			  MVS_ENABLE_PROC);

	audio->rpc_status = RPC_STATUS_FAILURE;
	rc = msm_rpc_write(audio->rpc_endpt, &enable_msg, sizeof(enable_msg));

	if (rc >= 0) {
		pr_debug("%s: RPC write for enable done\n", __func__);

		rc = wait_event_timeout(audio->wait,
				(audio->rpc_status != RPC_STATUS_FAILURE),
				1 * HZ);

		if (rc > 0) {
			pr_debug("%s: Wait event for enable succeeded\n",
				 __func__);

			if (audio->mvs_mode == MVS_MODE_AMR ||
			    audio->mvs_mode == MVS_MODE_AMR_WB) {
				rc = audio_mvs_setup_amr(audio);
			} else if (audio->mvs_mode == MVS_MODE_PCM ||
				   audio->mvs_mode == MVS_MODE_LINEAR_PCM) {
				rc = audio_mvs_setup_pcm(audio);
			} else if (audio->mvs_mode == MVS_MODE_IS127) {
				rc = audio_mvs_setup_voc(audio);
//SW5-MM-DL-Add2030MvsWithG711-00+{
			} else if (audio->mvs_mode == MVS_MODE_G711) {
				rc = audio_mvs_setup_g711(audio);
//SW5-MM-DL-Add2030MvsWithG711-00+}
			} else {
				pr_err("%s: Unknown MVS mode %d\n",
				       __func__, audio->mvs_mode);
			}
		} else {
			pr_err("%s: Wait event for enable failed %d\n",
			       __func__, rc);
		}
	} else {
		pr_err("%s: RPC write for enable failed %d\n", __func__, rc);
	}

	return rc;
}
示例#4
0
static int audio_mvs_start(struct audio_mvs_info_type *audio)
{
	int rc = 0;
	struct audio_mvs_acquire_msg acquire_msg;

	pr_info("%s:\n", __func__);

	/* Prevent sleep. */
	wake_lock(&audio->suspend_lock);
	pm_qos_update_request(&audio->pm_qos_req,
			      msm_cpuidle_get_deep_idle_latency());

	/* Acquire MVS. */
	memset(&acquire_msg, 0, sizeof(acquire_msg));
	acquire_msg.acquire_args.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP);
	acquire_msg.acquire_args.cb_func_id = cpu_to_be32(MVS_CB_FUNC_ID);

	msm_rpc_setup_req(&acquire_msg.rpc_hdr,
			  audio->rpc_prog,
			  audio->rpc_ver,
			  MVS_ACQUIRE_PROC);

	audio->rpc_status = RPC_STATUS_FAILURE;
	rc = msm_rpc_write(audio->rpc_endpt,
			   &acquire_msg,
			   sizeof(acquire_msg));

	if (rc >= 0) {
		pr_debug("%s: RPC write for acquire done\n", __func__);

		rc = wait_event_timeout(audio->wait,
			(audio->rpc_status != RPC_STATUS_FAILURE),
			1 * HZ);

		if (rc > 0) {

			rc = audio_mvs_setup(audio);

			if (rc == 0)
				audio->state = AUDIO_MVS_STARTED;

		} else {
			pr_err("%s: Wait event for acquire failed %d\n",
			       __func__, rc);

			rc = -EBUSY;
		}
	} else {
		pr_err("%s: RPC write for acquire failed %d\n", __func__, rc);

		rc = -EBUSY;
	}

	return rc;
}
int xdr_start_request(struct msm_rpc_xdr *xdr, uint32_t prog,
		      uint32_t ver, uint32_t proc)
{
	mutex_lock(&xdr->out_lock);

	
	msm_rpc_setup_req((struct rpc_request_hdr *)xdr->out_buf,
			  prog, ver, proc);

	xdr->out_index = sizeof(struct rpc_request_hdr);
	return 0;
}
int xdr_start_request(struct msm_rpc_xdr *xdr, uint32_t prog,
		      uint32_t ver, uint32_t proc)
{
	mutex_lock(&xdr->out_lock);

	/* TODO: replace below function with its implementation */
	msm_rpc_setup_req((struct rpc_request_hdr *)xdr->out_buf,
			  prog, ver, proc);

	xdr->out_index = sizeof(struct rpc_request_hdr);
	return 0;
}
示例#7
0
static int audio_mvs_stop(struct audio_mvs_info_type *audio)
{
	int rc = 0;
	struct audio_mvs_release_msg release_msg;

	pr_info("%s:\n", __func__);

	/* Release MVS. */
	memset(&release_msg, 0, sizeof(release_msg));
	release_msg.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP);

	msm_rpc_setup_req(&release_msg.rpc_hdr,
			  audio->rpc_prog,
			  audio->rpc_ver,
			  MVS_RELEASE_PROC);

	audio->rpc_status = RPC_STATUS_FAILURE;
	rc = msm_rpc_write(audio->rpc_endpt, &release_msg, sizeof(release_msg));

	if (rc >= 0) {
		pr_debug("%s: RPC write for release done\n", __func__);

		rc = wait_event_timeout(audio->wait,
				(audio->rpc_status != RPC_STATUS_FAILURE),
				1 * HZ);

		if (rc > 0) {
			pr_debug("%s: Wait event for release succeeded\n",
				 __func__);

			audio->state = AUDIO_MVS_STOPPED;

			/* Un-block read in case it is waiting for data. */
			wake_up(&audio->out_wait);

			rc = 0;
		} else {
			pr_err("%s: Wait event for release failed %d\n",
			       __func__, rc);
		}
	} else {
		pr_err("%s: RPC write for release failed %d\n", __func__, rc);
	}

	/* Allow sleep. */
	wake_unlock(&audio->suspend_lock);
	wake_unlock(&audio->idle_lock);

	return rc;
}
示例#8
0
static int audio_mvs_setup(struct audio_mvs_info_type *audio)
{
	int rc = 0;
	struct audio_mvs_enable_msg enable_msg;

	pr_debug("%s:\n", __func__);

	/* Enable MVS. */
	memset(&enable_msg, 0, sizeof(enable_msg));
	enable_msg.enable_args.client_id = cpu_to_be32(MVS_CLIENT_ID_VOIP);
	enable_msg.enable_args.mode = cpu_to_be32(audio->mvs_mode);
	enable_msg.enable_args.ul_cb_func_id = cpu_to_be32(MVS_UL_CB_FUNC_ID);
	enable_msg.enable_args.dl_cb_func_id = cpu_to_be32(MVS_DL_CB_FUNC_ID);
	enable_msg.enable_args.context = cpu_to_be32(MVS_PKT_CONTEXT_ISR);

	msm_rpc_setup_req(&enable_msg.rpc_hdr,
			  audio->rpc_prog,
			  audio->rpc_ver,
			  MVS_ENABLE_PROC);

	audio->rpc_status = RPC_STATUS_FAILURE;
	rc = msm_rpc_write(audio->rpc_endpt, &enable_msg, sizeof(enable_msg));

	if (rc >= 0) {
		pr_debug("%s: RPC write for enable done\n", __func__);

		rc = wait_event_timeout(audio->mode_wait,
				(audio->rpc_status != RPC_STATUS_FAILURE),
				10 * HZ);

		if (rc > 0) {
			pr_debug("%s: Wait event for enable succeeded\n",
				 __func__);
			rc = audio_mvs_setup_mode(audio);
			if (rc < 0) {
				pr_err("%s: Unknown MVS mode %d\n",
				       __func__, audio->mvs_mode);
			}
			pr_err("rc value after mode setup: %d\n", rc);
		} else {
			pr_err("%s: Wait event for enable failed %d\n",
			       __func__, rc);
		}
	} else {
		pr_err("%s: RPC write for enable failed %d\n", __func__, rc);
	}

	return rc;
}
示例#9
0
static int audio_mvs_setup_voc(struct audio_mvs_info_type *audio)
{
	int rc = 0;
	struct audio_mvs_set_voc_mode_msg set_voc_mode_msg;

	pr_debug("%s:\n", __func__);

	/* Set EVRC mode. */
	memset(&set_voc_mode_msg, 0, sizeof(set_voc_mode_msg));
	set_voc_mode_msg.min_rate = cpu_to_be32(audio->rate_type);
	set_voc_mode_msg.max_rate = cpu_to_be32(audio->rate_type);

	msm_rpc_setup_req(&set_voc_mode_msg.rpc_hdr,
			  audio->rpc_prog,
			  audio->rpc_ver,
			  MVS_VOC_SET_FRAME_RATE_PROC);

	audio->rpc_status = RPC_STATUS_FAILURE;
	rc = msm_rpc_write(audio->rpc_endpt,
			   &set_voc_mode_msg,
			   sizeof(set_voc_mode_msg));

	if (rc >= 0) {
		pr_debug("%s: RPC write for set voc mode done\n", __func__);

		rc = wait_event_timeout(audio->wait,
				      (audio->rpc_status != RPC_STATUS_FAILURE),
				      1 * HZ);

		if (rc > 0) {
			pr_debug("%s: Wait event for set voc mode succeeded\n",
				 __func__);

			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_VOC_RX;

			rc = 0;
		} else {
			pr_err("%s: Wait event for set voc mode failed %d\n",
			       __func__, rc);
		}
	} else {
		pr_err("%s: RPC write for set voc mode failed %d\n",
		       __func__, rc);
	}

	return rc;
}
/* must be called with audio->lock held */
static int audvoicememo_disable(struct audio_voicememo *audio)
{
    struct rpc_request_hdr rhdr;
    int rc = 0;
    if (audio->enabled) {
        msm_rpc_setup_req(&rhdr, audio->rpc_prog, audio->rpc_ver,
                          SND_VOC_REC_STOP_PROC);
        rc = msm_rpc_write(audio->sndept, &rhdr, sizeof(rhdr));
        wait_event_timeout(audio->wait, audio->stopped == 0,
                           1 * HZ);
        wake_up(&audio->read_wait);
        audmgr_disable(&audio->audmgr);
        audio->enabled = 0;
    }
    return 0;
}
示例#11
0
static int rpc_adsp_rtos_app_to_modem(uint32_t cmd, uint32_t module,
				      struct msm_adsp_module *adsp_module)
{
	int rc;
	struct rpc_adsp_rtos_app_to_modem_args_t rpc_req;
	struct rpc_reply_hdr *rpc_rsp;

	msm_rpc_setup_req(&rpc_req.hdr,
			  RPC_ADSP_RTOS_ATOM_PROG,
			  msm_rpc_get_vers(adsp_module->rpc_client),
			  RPC_ADSP_RTOS_APP_TO_MODEM_PROC);

	rpc_req.gotit = cpu_to_be32(1);
	rpc_req.cmd = cpu_to_be32(cmd);
	rpc_req.proc_id = cpu_to_be32(RPC_ADSP_RTOS_PROC_APPS);
	rpc_req.module = cpu_to_be32(module);
	rc = msm_rpc_write(adsp_module->rpc_client, &rpc_req, sizeof(rpc_req));
	if (rc < 0) {
		pr_err("adsp: could not send RPC request: %d\n", rc);
		return rc;
	}

	rc = msm_rpc_read(adsp_module->rpc_client,
			  (void **)&rpc_rsp, -1, (5*HZ));
	if (rc < 0) {
		pr_err("adsp: error receiving RPC reply: %d (%d)\n",
		       rc, -ERESTARTSYS);
		return rc;
	}

	if (be32_to_cpu(rpc_rsp->reply_stat) != RPCMSG_REPLYSTAT_ACCEPTED) {
		pr_err("adsp: RPC call was denied!\n");
		kfree(rpc_rsp);
		return -EPERM;
	}

	if (be32_to_cpu(rpc_rsp->data.acc_hdr.accept_stat) !=
	    RPC_ACCEPTSTAT_SUCCESS) {
		pr_err("adsp error: RPC call was not successful (%d)\n",
		       be32_to_cpu(rpc_rsp->data.acc_hdr.accept_stat));
		kfree(rpc_rsp);
		return -EINVAL;
	}

	kfree(rpc_rsp);
	return 0;
}
示例#12
0
//SW5-MM-DL-Add2030MvsWithG711-00+{
static int audio_mvs_setup_g711(struct audio_mvs_info_type *audio)
{
	int rc = 0;
	struct audio_mvs_set_g711_mode_msg set_g711_mode_msg;

	pr_debug("%s:\n", __func__);

	/* Set G711 mode. */
	memset(&set_g711_mode_msg, 0, sizeof(set_g711_mode_msg));
	set_g711_mode_msg.g711_mode = cpu_to_be32(audio->rate_type);

	pr_debug("%s: mode of g711:%d\n",
			__func__, set_g711_mode_msg.g711_mode);

	msm_rpc_setup_req(&set_g711_mode_msg.rpc_hdr,
			  audio->rpc_prog,
			  audio->rpc_ver,
			  MVS_G711_SET_MODE_PROC);

	audio->rpc_status = RPC_STATUS_FAILURE;
	rc = msm_rpc_write(audio->rpc_endpt,
			   &set_g711_mode_msg,
			   sizeof(set_g711_mode_msg));

	if (rc >= 0) {
		pr_debug("%s: RPC write for set g711 mode done\n", __func__);

		/* Save the MVS configuration information. */
		audio->frame_mode = MVS_FRAME_MODE_G711_DL;

		rc = 0;
	} else {
		pr_err("%s: RPC write for set g711 mode failed %d\n",
		       __func__, rc);
	}

	return rc;
}
示例#13
0
static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	struct snd_set_device_msg dmsg;
	struct snd_set_volume_msg vmsg;
	struct snd_device_config dev;
	struct snd_volume_config vol;
	struct snd_ctxt *snd = file->private_data;
	int rc = 0;
	
	mutex_lock(&snd->lock);
	switch (cmd) {
	case SND_SET_DEVICE:
		if (copy_from_user(&dev, (void *) arg, sizeof(dev))) {
			rc = -EFAULT;
			break;
		}

		if (check_mute(dev.ear_mute) ||
				check_mute(dev.mic_mute) ) {
			pr_err("snd_ioctl set device: invalid mute status.\n");
			rc = -EINVAL;
			break;
		}

                /* Prevent wrong device to make the snd processor crashing */
                check_device(&dev.device);
		if(force_headset && (force_headset==2))
		   dev.device=2;

		dmsg.args.device = cpu_to_be32(dev.device);
		dmsg.args.ear_mute = cpu_to_be32(dev.ear_mute);
		dmsg.args.mic_mute = cpu_to_be32(dev.mic_mute);
		dmsg.args.cb_func = -1;
		dmsg.args.client_data = 0;

		//pr_info("snd_set_device %d %d %d\n", dev.device, dev.ear_mute, dev.mic_mute);
		printk("TEST snd_set_device %d %d %d\n", dev.device, dev.ear_mute, dev.mic_mute);	

		if(!snd->ept) {
			pr_err("No sound endpoint found, can't set snd_device");
			return -EIO;
		}
	
		msm_rpc_setup_req(&dmsg.hdr, RPC_SND_PROG, RPC_SND_VERS,
			  SND_SET_DEVICE_PROC);
						 
		rc = msm_rpc_write(snd->ept, &dmsg, sizeof(dmsg));
		htc_pwrsink_audio_path_set(dmsg.args.device);
		break;

	case SND_SET_VOLUME:
		if (copy_from_user(&vol, (void *) arg, sizeof(vol))) {
			rc = -EFAULT;
			break;
		}
		
		vmsg.args.device = cpu_to_be32(vol.device);
		vmsg.args.method = cpu_to_be32(vol.method);
		if (vol.method != SND_METHOD_VOICE && vol.method != SND_METHOD_AUDIO) {
			pr_err("snd_ioctl set volume: invalid method.\n");
			rc = -EINVAL;
			break;
		}

		vmsg.args.volume = cpu_to_be32(vol.volume);
		vmsg.args.cb_func = -1;
		vmsg.args.client_data = 0;

		//pr_info("snd_set_volume %d %d %d\n", vol.device, vol.method, vol.volume);
		printk("snd_set_volume %d %d %d\n", vol.device, vol.method, vol.volume);

		msm_rpc_setup_req(&vmsg.hdr, RPC_SND_PROG, RPC_SND_VERS, SND_SET_VOLUME_PROC);
		rc = msm_rpc_write(snd->ept, &vmsg, sizeof(vmsg));

		break;
		
	case SND_GET_NUM_ENDPOINTS:
		if (copy_to_user((void __user *)arg,
				&snd->snd_epts->num, sizeof(unsigned))) {
			pr_err("snd_ioctl get endpoint: invalid pointer.\n");
			rc = -EFAULT;
		}
		break;

	case SND_GET_ENDPOINT:
		rc = get_endpoint(snd, arg);
		break;
		
	default:
		pr_err("snd_ioctl unknown command.\n");
		rc = -EINVAL;
		break;
	}
	mutex_unlock(&snd->lock);

	return rc;
}
示例#14
0
static int audio_mvs_setup_amr(struct audio_mvs_info_type *audio)
{
	int rc = 0;
	struct audio_mvs_set_amr_mode_msg set_amr_mode_msg;
	struct audio_mvs_set_dtx_mode_msg set_dtx_mode_msg;

	pr_debug("%s:\n", __func__);

	/* Set AMR mode. */
	memset(&set_amr_mode_msg, 0, sizeof(set_amr_mode_msg));
	set_amr_mode_msg.amr_mode = cpu_to_be32(audio->rate_type);

	if (audio->mvs_mode == MVS_MODE_AMR) {
		msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr,
				  audio->rpc_prog,
				  audio->rpc_ver,
				  MVS_AMR_SET_AMR_MODE_PROC);
	} else {
		msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr,
				  audio->rpc_prog,
				  audio->rpc_ver,
				  MVS_AMR_SET_AWB_MODE_PROC);
	}

	audio->rpc_status = RPC_STATUS_FAILURE;
	rc = msm_rpc_write(audio->rpc_endpt,
			   &set_amr_mode_msg,
			   sizeof(set_amr_mode_msg));

	if (rc >= 0) {
		pr_debug("%s: RPC write for set amr mode done\n", __func__);

		rc = wait_event_timeout(audio->wait,
				(audio->rpc_status != RPC_STATUS_FAILURE),
				1 * HZ);

		if (rc > 0) {
			pr_debug("%s: Wait event for set amr mode succeeded\n",
				 __func__);

			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_AMR_DL;

			/* Disable DTX. */
			memset(&set_dtx_mode_msg, 0, sizeof(set_dtx_mode_msg));
			set_dtx_mode_msg.dtx_mode = cpu_to_be32(0);

			msm_rpc_setup_req(&set_dtx_mode_msg.rpc_hdr,
					  audio->rpc_prog,
					  audio->rpc_ver,
					  MVS_SET_DTX_MODE_PROC);

			audio->rpc_status = RPC_STATUS_FAILURE;
			rc = msm_rpc_write(audio->rpc_endpt,
					   &set_dtx_mode_msg,
					   sizeof(set_dtx_mode_msg));

			if (rc >= 0) {
				pr_debug("%s: RPC write for set dtx done\n",
					 __func__);

				rc = wait_event_timeout(audio->wait,
				      (audio->rpc_status != RPC_STATUS_FAILURE),
				      1 * HZ);

				if (rc > 0) {
					pr_debug("%s: Wait event for set dtx"
						 "succeeded\n", __func__);

					rc = 0;
				}
			}
		} else {
			pr_err("%s: Wait event for set amr mode failed %d\n",
			       __func__, rc);
		}
	} else {
		pr_err("%s: RPC write for set amr mode failed %d\n",
		       __func__, rc);
	}

	return rc;
}
/* must be called with audio->lock held */
static int audvoicememo_enable(struct audio_voicememo *audio)
{
    struct audmgr_config cfg;
    struct snd_voc_rec_put_buf_msg bmsg;
    struct snd_voc_rec_start_msg msg;
    uint8_t index;
    uint32_t offset = 0;
    int rc;

    if (audio->enabled)
        return 0;

    /* Codec / method configure to audmgr client */
    cfg.tx_rate = RPC_AUD_DEF_SAMPLE_RATE_8000;
    cfg.rx_rate = RPC_AUD_DEF_SAMPLE_RATE_NONE;
    cfg.def_method = RPC_AUD_DEF_METHOD_RECORD;

    if (audio->voicememo_cfg.capability == RPC_VOC_CAP_IS733)
        cfg.codec = RPC_AUD_DEF_CODEC_VOC_13K;
    else if (audio->voicememo_cfg.capability == RPC_VOC_CAP_IS127)
        cfg.codec = RPC_AUD_DEF_CODEC_VOC_EVRC;
    else
        cfg.codec = RPC_AUD_DEF_CODEC_VOC_AMR; /* RPC_VOC_CAP_AMR */

    cfg.snd_method = RPC_SND_METHOD_VOICE;
    rc = audmgr_enable(&audio->audmgr, &cfg);

    if (rc < 0)
        return rc;

    /* Configure VOC Rec buffer */
    for (index = 0; index < MAX_REC_BUF_COUNT; index++) {
        audio->in[index].data = audio->rec_buf_ptr + offset;
        audio->in[index].addr = audio->phys + offset;
        audio->in[index].size = audio->rec_buf_size;
        audio->in[index].used = 0;
        audio->in[index].numframes = 0;
        offset += audio->rec_buf_size;
        bmsg.args.buf = (uint32_t) audio->in[index].data;
        bmsg.args.num_bytes = cpu_to_be32(audio->in[index].size);
        MM_DBG("rec_buf_ptr=0x%8x, rec_buf_size = 0x%8x\n",
               bmsg.args.buf, bmsg.args.num_bytes);

        msm_rpc_setup_req(&bmsg.hdr, audio->rpc_prog, audio->rpc_ver,
                          SND_VOC_REC_PUT_BUF_PROC);
        audio->rpc_xid = bmsg.hdr.xid;
        audio->rpc_status = RPC_STATUS_FAILURE;
        msm_rpc_write(audio->sndept, &bmsg, sizeof(bmsg));
        rc = wait_event_timeout(audio->wait,
                                audio->rpc_status != RPC_STATUS_FAILURE, 1 * HZ);
        if (rc == 0)
            goto err;
    }


    /* Start Recording */
    msg.args.param_status = cpu_to_be32(0x00000001);
    msg.args.rec_type = cpu_to_be32(audio->voicememo_cfg.rec_type);
    msg.args.rec_interval_ms =
        cpu_to_be32(audio->voicememo_cfg.rec_interval_ms);
    msg.args.auto_stop_ms = cpu_to_be32(audio->voicememo_cfg.auto_stop_ms);
    msg.args.capability = cpu_to_be32(audio->voicememo_cfg.capability);
    msg.args.max_rate = cpu_to_be32(audio->voicememo_cfg.max_rate);
    msg.args.min_rate = cpu_to_be32(audio->voicememo_cfg.min_rate);
    msg.args.frame_format = cpu_to_be32(audio->voicememo_cfg.frame_format);
    msg.args.dtx_enable = cpu_to_be32(audio->voicememo_cfg.dtx_enable);
    msg.args.data_req_ms = cpu_to_be32(audio->voicememo_cfg.data_req_ms);
    msg.args.rec_client_data = cpu_to_be32(REC_CLIENT_DATA);
    msg.args.cb_func_id = cpu_to_be32(DATA_CB_FUNC_ID);
    msg.args.sync_cb_func_id = cpu_to_be32(AV_SYNC_CB_FUNC_ID);
    msg.args.client_data = cpu_to_be32(CLIENT_DATA);

    msm_rpc_setup_req(&msg.hdr, audio->rpc_prog, audio->rpc_ver,
                      SND_VOC_REC_START_PROC);

    audio->rpc_xid = msg.hdr.xid;
    audio->rpc_status = RPC_STATUS_FAILURE;
    msm_rpc_write(audio->sndept, &msg, sizeof(msg));
    rc = wait_event_timeout(audio->wait,
                            audio->rpc_status != RPC_STATUS_FAILURE, 1 * HZ);
    if (rc == 0)
        goto err;

    audio->rpc_xid = 0;
    audio->enabled = 1;
    return 0;

err:
    audio->rpc_xid = 0;
    audmgr_disable(&audio->audmgr);
    MM_ERR("Fail\n");
    return -1;
}
示例#16
0
static int audio_mvs_setup_mode(struct audio_mvs_info_type *audio)
{
	int rc = 0;

	pr_debug("%s:\n", __func__);

	switch (audio->mvs_mode) {
	case MVS_MODE_AMR:
	case MVS_MODE_AMR_WB: {
		struct audio_mvs_set_amr_mode_msg set_amr_mode_msg;
		struct audio_mvs_set_dtx_mode_msg set_dtx_mode_msg;

		/* Set AMR mode. */
		memset(&set_amr_mode_msg, 0, sizeof(set_amr_mode_msg));
		set_amr_mode_msg.amr_mode = cpu_to_be32(audio->rate_type);

		if (audio->mvs_mode == MVS_MODE_AMR) {
			msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr,
					  audio->rpc_prog,
					  audio->rpc_ver,
					  MVS_AMR_SET_AMR_MODE_PROC);
		} else {
			msm_rpc_setup_req(&set_amr_mode_msg.rpc_hdr,
					  audio->rpc_prog,
					  audio->rpc_ver,
					  MVS_AMR_SET_AWB_MODE_PROC);
		}

		audio->rpc_status = RPC_STATUS_FAILURE;
		rc = msm_rpc_write(audio->rpc_endpt,
				   &set_amr_mode_msg,
				   sizeof(set_amr_mode_msg));

		if (rc >= 0) {
			pr_debug("%s: RPC write for set amr mode done\n",
					__func__);

			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_AMR_DL;

			/* Disable DTX. */
			memset(&set_dtx_mode_msg, 0, sizeof(set_dtx_mode_msg));
			set_dtx_mode_msg.dtx_mode = cpu_to_be32(0);

			msm_rpc_setup_req(&set_dtx_mode_msg.rpc_hdr,
					  audio->rpc_prog,
					  audio->rpc_ver,
					  MVS_SET_DTX_MODE_PROC);

			audio->rpc_status = RPC_STATUS_FAILURE;
			rc = msm_rpc_write(audio->rpc_endpt,
					   &set_dtx_mode_msg,
					   sizeof(set_dtx_mode_msg));

			if (rc >= 0) {
				pr_debug("%s: RPC write for set dtx done\n",
						 __func__);

				rc = 0;
			}
		} else {
			pr_err("%s: RPC write for set amr mode failed %d\n",
			       __func__, rc);
		}
		break;
	}
	case MVS_MODE_PCM:
	case MVS_MODE_LINEAR_PCM: {
		/* PCM does not have any params to be set.
		Save the MVS configuration information. */
		audio->rate_type = MVS_AMR_MODE_UNDEF;
		audio->frame_mode = MVS_FRAME_MODE_PCM_DL;
		break;
	}
	case MVS_MODE_IS127:
	case MVS_MODE_IS733:
	case MVS_MODE_4GV_NB:
	case MVS_MODE_4GV_WB: {
		struct audio_mvs_set_voc_mode_msg set_voc_mode_msg;

		/* Set EVRC mode. */
		memset(&set_voc_mode_msg, 0, sizeof(set_voc_mode_msg));
		set_voc_mode_msg.min_rate =
				cpu_to_be32(audio->min_max_rate.min_rate);
		set_voc_mode_msg.max_rate =
				cpu_to_be32(audio->min_max_rate.max_rate);

		msm_rpc_setup_req(&set_voc_mode_msg.rpc_hdr,
				  audio->rpc_prog,
				  audio->rpc_ver,
				  MVS_VOC_SET_FRAME_RATE_PROC);

		audio->rpc_status = RPC_STATUS_FAILURE;
		rc = msm_rpc_write(audio->rpc_endpt,
				   &set_voc_mode_msg,
				   sizeof(set_voc_mode_msg));

		if (rc >= 0) {
			pr_debug("%s: RPC write for set voc mode done\n",
					__func__);

			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_VOC_RX;

			rc = 0;
		} else {
			pr_err("%s: RPC write for set voc mode failed %d\n",
			       __func__, rc);
		}
		break;
	}
	case MVS_MODE_G711: {
		struct audio_mvs_set_g711_mode_msg set_g711_mode_msg;

		/* Set G711 mode. */
		memset(&set_g711_mode_msg, 0, sizeof(set_g711_mode_msg));
		set_g711_mode_msg.g711_mode = cpu_to_be32(audio->rate_type);

		pr_debug("%s: mode of g711:%d\n",
			       __func__, set_g711_mode_msg.g711_mode);

		msm_rpc_setup_req(&set_g711_mode_msg.rpc_hdr,
				 audio->rpc_prog,
				 audio->rpc_ver,
				 MVS_G711_SET_MODE_PROC);

		audio->rpc_status = RPC_STATUS_FAILURE;
		rc = msm_rpc_write(audio->rpc_endpt,
				  &set_g711_mode_msg,
				  sizeof(set_g711_mode_msg));

		if (rc >= 0) {
			pr_debug("%s: RPC write for set g711 mode done\n",
					__func__);
			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_G711_DL;

			rc = 0;
		} else {
		       pr_err("%s: RPC write for set g711 mode failed %d\n",
			      __func__, rc);
		}
		break;
	}
	case MVS_MODE_G729A: {
		struct audio_mvs_set_g729_mode_msg set_g729_mode_msg;

		/* Set G729 mode. */
		memset(&set_g729_mode_msg, 0, sizeof(set_g729_mode_msg));
		set_g729_mode_msg.g729_mode = cpu_to_be32(audio->dtx_mode);

		pr_debug("%s: mode of g729:%d\n",
			       __func__, set_g729_mode_msg.g729_mode);

		msm_rpc_setup_req(&set_g729_mode_msg.rpc_hdr,
				 audio->rpc_prog,
				 audio->rpc_ver,
				 MVS_G729A_SET_MODE_PROC);

		audio->rpc_status = RPC_STATUS_FAILURE;
		rc = msm_rpc_write(audio->rpc_endpt,
				  &set_g729_mode_msg,
				  sizeof(set_g729_mode_msg));

		if (rc >= 0) {
			pr_debug("%s: RPC write for set g729 mode done\n",
			       __func__);

			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_G729A_DL;

			rc = 0;
		} else {
		       pr_err("%s: RPC write for set g729 mode failed %d\n",
			      __func__, rc);
		}
		break;
	}
	case MVS_MODE_G722: {
		struct audio_mvs_set_g722_mode_msg set_g722_mode_msg;

		/* Set G722 mode. */
		memset(&set_g722_mode_msg, 0, sizeof(set_g722_mode_msg));
		set_g722_mode_msg.g722_mode = cpu_to_be32(audio->rate_type);

		pr_debug("%s: mode of g722:%d\n",
		      __func__, set_g722_mode_msg.g722_mode);

		msm_rpc_setup_req(&set_g722_mode_msg.rpc_hdr,
			audio->rpc_prog,
			audio->rpc_ver,
			MVS_G722_SET_MODE_PROC);

		audio->rpc_status = RPC_STATUS_FAILURE;
		rc = msm_rpc_write(audio->rpc_endpt,
			 &set_g722_mode_msg,
			 sizeof(set_g722_mode_msg));

		if (rc >= 0) {
			pr_debug("%s: RPC write for set g722 mode done\n",
			__func__);

			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_G722_DL;

			rc = 0;
		}
		break;
	}
	case MVS_MODE_G711A: {
		struct audio_mvs_set_g711A_mode_msg set_g711A_mode_msg;
		struct audio_mvs_set_dtx_mode_msg set_dtx_mode_msg;

		/* Set G711A mode. */
		memset(&set_g711A_mode_msg, 0, sizeof(set_g711A_mode_msg));
		set_g711A_mode_msg.g711A_mode = cpu_to_be32(audio->rate_type);

		pr_debug("%s: mode of g711A:%d\n",
		       __func__, set_g711A_mode_msg.g711A_mode);

		msm_rpc_setup_req(&set_g711A_mode_msg.rpc_hdr,
			 audio->rpc_prog,
			 audio->rpc_ver,
			 MVS_G711A_SET_MODE_PROC);

		audio->rpc_status = RPC_STATUS_FAILURE;
		rc = msm_rpc_write(audio->rpc_endpt,
			  &set_g711A_mode_msg,
			  sizeof(set_g711A_mode_msg));

		if (rc >= 0) {
			pr_debug("%s: RPC write for set g711A mode done\n",
				       __func__);

			/* Save the MVS configuration information. */
			audio->frame_mode = MVS_FRAME_MODE_G711A_DL;
			/* Set DTX MODE. */
			memset(&set_dtx_mode_msg, 0, sizeof(set_dtx_mode_msg));
			set_dtx_mode_msg.dtx_mode =
				cpu_to_be32((audio->dtx_mode));

			msm_rpc_setup_req(&set_dtx_mode_msg.rpc_hdr,
					  audio->rpc_prog,
					  audio->rpc_ver,
					  MVS_SET_DTX_MODE_PROC);

			audio->rpc_status = RPC_STATUS_FAILURE;
			rc = msm_rpc_write(audio->rpc_endpt,
					   &set_dtx_mode_msg,
					   sizeof(set_dtx_mode_msg));

			if (rc >= 0) {
				pr_debug("%s: RPC write for set dtx done\n",
						 __func__);

				rc = 0;
			}
			rc = 0;
		} else {
		pr_err("%s: RPC write for set g711A mode failed %d\n",
		      __func__, rc);
		}
		break;
	}
	case MVS_MODE_EFR:
	case MVS_MODE_FR:
	case MVS_MODE_HR: {
		struct audio_mvs_set_efr_mode_msg set_efr_mode_msg;

		/* Set G729 mode. */
		memset(&set_efr_mode_msg, 0, sizeof(set_efr_mode_msg));
		set_efr_mode_msg.efr_mode = cpu_to_be32(audio->dtx_mode);

		pr_debug("%s: mode of EFR, FR and HR:%d\n",
			       __func__, set_efr_mode_msg.efr_mode);

		msm_rpc_setup_req(&set_efr_mode_msg.rpc_hdr,
				 audio->rpc_prog,
				 audio->rpc_ver,
				 MVS_GSM_SET_DTX_MODE_PROC);

		audio->rpc_status = RPC_STATUS_FAILURE;
		rc = msm_rpc_write(audio->rpc_endpt,
				  &set_efr_mode_msg,
				  sizeof(set_efr_mode_msg));

		if (rc >= 0) {
			pr_debug("%s: RPC write for set EFR, FR and HR mode done\n",
			       __func__);

			/* Save the MVS configuration information. */
			if ((audio->mvs_mode == MVS_MODE_EFR) ||
				(audio->mvs_mode == MVS_MODE_FR))
				audio->frame_mode = MVS_FRAME_MODE_GSM_DL;
			if (audio->mvs_mode == MVS_MODE_HR)
				audio->frame_mode = MVS_FRAME_MODE_HR_DL;

			rc = 0;
		} else {
		       pr_err("%s: RPC write for set EFR, FR and HR mode failed %d\n",
			      __func__, rc);
		}
		break;
	}
	default:
		rc = -EINVAL;
		pr_err("Default case\n");
	}
	return rc;
}
示例#17
0
static long snd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
	struct snd_set_device_msg dmsg;
	struct snd_set_volume_msg vmsg;
	struct snd_device_config dev;
	struct snd_volume_config vol;
	struct snd_ctxt *snd = file->private_data;
	int rc = 0;

	mutex_lock(&snd->lock);
	switch (cmd) {
	case SND_SET_DEVICE:
		if (copy_from_user(&dev, (void *) arg, sizeof(dev))) {
			rc = -EFAULT;
			break;
		}

		dmsg.args.device = cpu_to_be32(dev.device);
		dmsg.args.ear_mute = cpu_to_be32(dev.ear_mute);
		dmsg.args.mic_mute = cpu_to_be32(dev.mic_mute);
		dmsg.args.cb_func = cpu_to_be32(0x11111111);
		dmsg.args.client_data = cpu_to_be32(0x11223344);

		pr_info("snd_set_device %d %d %d\n", dev.device,
						 dev.ear_mute, dev.mic_mute);

		msm_rpc_setup_req(&dmsg.hdr, RPC_SND_PROG, RPC_SND_VERS,
			  SND_SET_DEVICE_PROC);

		rc = msm_rpc_write(snd->ept, &dmsg, sizeof(dmsg));
		htc_pwrsink_audio_path_set(dmsg.args.device);
		break;

	case SND_SET_VOLUME:
		if (copy_from_user(&vol, (void *) arg, sizeof(vol))) {
			rc = -EFAULT;
			break;
		}

		vmsg.args.device = cpu_to_be32(vol.device);
		vmsg.args.method = cpu_to_be32(vol.method);
		vmsg.args.volume = cpu_to_be32(vol.volume);
		vmsg.args.cb_func = cpu_to_be32(0x11111111);
		vmsg.args.client_data = cpu_to_be32(0x11223344);

		pr_info("snd_set_volume %d %d %d\n", vol.device,
						vol.method, vol.volume);

		msm_rpc_setup_req(&vmsg.hdr, RPC_SND_PROG, RPC_SND_VERS,
			  SND_SET_VOLUME_PROC);

		rc = msm_rpc_write(snd->ept, &vmsg, sizeof(vmsg));
		break;

	default:
		pr_err("snd_ioctl unknown command.\n");
		rc = -EINVAL;
		break;
	}
	mutex_unlock(&snd->lock);

	return rc;
}