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; }
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; }