Ejemplo n.º 1
0
static int vocpcm_open(struct inode *inode, struct file *file)
{
    struct voc_rpc *voc_rpc = &the_voc_proc;
    struct voc_ctxt *ctxt = voc_minor_to_ctxt(MINOR(inode->i_rdev));
    int rc = 0;

    if (!ctxt) {
        pr_err("unknown voc misc %d\n", MINOR(inode->i_rdev));
        return -ENODEV;
    }

    mutex_lock(&voc_rpc->lock);
    if (voc_rpc->inited == 0) {
        voc_rpc->ept = create_rpc_connect(RPC_SND_PROG, RPC_SND_VERS,
                                          MSM_RPC_UNINTERRUPTIBLE |
                                          MSM_RPC_ENABLE_RECEIVE);
        if (IS_ERR(voc_rpc->ept)) {
            rc = PTR_ERR(voc_rpc->ept);
            voc_rpc->ept = NULL;
            pr_err("vocpcm: failed to connect snd svc\n");
            return rc;
        }

        voc_rpc->task = create_snd_rpc_kthread();
        if (IS_ERR(voc_rpc->task)) {
            rc = PTR_ERR(voc_rpc->task);
            voc_rpc->task = NULL;
            msm_rpc_close(voc_rpc->ept);
            voc_rpc->ept = NULL;
            return rc;
        }
        voc_rpc->inited = 1;
    }
    mutex_unlock(&voc_rpc->lock);

    mutex_lock(&ctxt->lock);
    if (ctxt->opened) {
        pr_err("vocpcm already opened.\n");
        rc = -EBUSY;
        goto err;
    }

    file->private_data = ctxt;
    ctxt->head = 0;
    ctxt->tail = 0;
    ctxt->client = 0;

    memset(ctxt->buf[0].data, 0, sizeof(ctxt->buf[0].data));
    memset(ctxt->buf[1].data, 0, sizeof(ctxt->buf[1].data));
    ctxt->buf[0].index = 0;
    ctxt->buf[1].index = 0;
    ctxt->opened = 1;
    ctxt->count = 0;
    ctxt->s_ptr = 0;
    ctxt->final_input = 0;

err:
    mutex_unlock(&ctxt->lock);
    return rc;
}
Ejemplo n.º 2
0
static int vocpcm_open(struct inode *inode, struct file *file)
{
	struct voc_ctxt *ctxt = voc_minor_to_ctxt(MINOR(inode->i_rdev));

	if (!ctxt) {
		pr_err("voc: unknown voc misc %d\n", MINOR(inode->i_rdev));
		return -ENODEV;
	}

	mutex_lock(&the_voc.lock);
	if (the_voc.task == NULL) {
		if (the_voc.ept == NULL) 
			the_voc.ept = msm_rpc_connect_compatible(RPC_SND_PROG, RPC_SND_VERS,
					MSM_RPC_UNINTERRUPTIBLE | MSM_RPC_ENABLE_RECEIVE);
		if (IS_ERR(the_voc.ept)) {
			the_voc.ept = NULL;
			pr_err("voc: failed to connect voc svc\n");
			mutex_unlock(&the_voc.lock);
			return -ENODEV;
		}
		the_voc.task = kthread_run(voc_rpc_thread, NULL, "voc_rpc_thread");
		if (IS_ERR(the_voc.task)) {
			the_voc.task = NULL;
			if (the_voc.ept) msm_rpc_close(the_voc.ept);
			the_voc.ept = NULL;
			mutex_unlock(&the_voc.lock);
			return -EFAULT;
		}
	}
	mutex_unlock(&the_voc.lock);

	mutex_lock(&ctxt->lock);
	if (ctxt->opened) {
		pr_err("vocpcm already opened.\n");
		mutex_unlock(&ctxt->lock);
		return -EBUSY;
	}

	file->private_data = ctxt;
	ctxt->head = 0;
	ctxt->tail = 0;
	ctxt->client = 0;

	memset(ctxt->buf[0].data, 0, sizeof(ctxt->buf[0].data));
	memset(ctxt->buf[1].data, 0, sizeof(ctxt->buf[1].data));
	ctxt->buf[0].index = 0;
	ctxt->buf[1].index = 0;
	ctxt->opened = 1;
	ctxt->count = 0;
	ctxt->s_ptr = 0;
	ctxt->final_input = 0;

	mutex_unlock(&ctxt->lock);
	return 0;
}