static long vocpcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct voc_ctxt *ctxt = file->private_data; struct buffer *frame; unsigned long flags; uint32_t index; uint32_t data_index; uint32_t len = 0; uint8_t *dest; int rc = 0; mutex_lock(&ctxt->lock); switch (cmd) { case VOCPCM_REGISTER_CLIENT: rc = voc_register_client(ctxt); break; case VOCPCM_UNREGISTER_CLIENT: if (ctxt->intr % 2) { if (ctxt->s_ptr) { index = ctxt->head; frame = ctxt->buf[index].data; data_index = FRAME_NUM * FRAME_SIZE - 1; dest = (uint8_t *)&frame->data[data_index] + 1; len = dest - ctxt->s_ptr + 1; memset(ctxt->s_ptr, 0, len); spin_lock_irqsave(&ctxt->dsp_lock, flags); frame->index = 0; ctxt->head = (ctxt->head + 1) & (BUFFER_NUM - 1); ctxt->count++; ctxt->final_input = 1; spin_unlock_irqrestore(&ctxt->dsp_lock, flags); rc = wait_event_interruptible_timeout( ctxt->last_write_wait, ctxt->count == 0, 5 * HZ); if (rc < 0) break; } } if (ctxt->client) rc = voc_unregister_client(ctxt); else pr_err("no %d client to unregister.", ctxt->intr); break; default: pr_err("unknown command.\n"); rc = -EINVAL; break; } mutex_unlock(&ctxt->lock); return rc; }
static long vocpcm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct voc_ctxt *ctxt = file->private_data; int rc = 0; mutex_lock(&ctxt->lock); switch (cmd) { case VOCPCM_REGISTER_CLIENT: rc = voc_register_client(ctxt); break; case VOCPCM_UNREGISTER_CLIENT: if (ctxt->client) rc = voc_unregister_client(ctxt); else pr_err("no %d client to unregister.", ctxt->intr); break; default: pr_err("unknown command.\n"); rc = -EINVAL; break; } mutex_unlock(&ctxt->lock); return rc; }