Example #1
0
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;
}
Example #2
0
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;
}