[media] davinci: convert vpif_display to core-assisted locking

vpif_display now uses .unlocked_ioctl instead of .ioctl.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Acked-by: Manjunath Hadli <manjunath.hadli@ti.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Hans Verkuil 2011-01-05 13:35:45 -03:00 committed by Mauro Carvalho Chehab
parent 46656afa8a
commit 9bfaae24f9
1 changed files with 20 additions and 78 deletions

View File

@ -652,9 +652,6 @@ static int vpif_release(struct file *filep)
struct channel_obj *ch = fh->channel;
struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX];
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
/* if this instance is doing IO */
if (fh->io_allowed[VPIF_VIDEO_INDEX]) {
/* Reset io_usrs member of channel object */
@ -677,8 +674,6 @@ static int vpif_release(struct file *filep)
config_params.numbuffers[ch->channel_id];
}
mutex_unlock(&common->lock);
/* Decrement channel usrs counter */
atomic_dec(&ch->usrs);
/* If this file handle has initialize encoder device, reset it */
@ -737,24 +732,15 @@ static int vpif_g_fmt_vid_out(struct file *file, void *priv,
struct vpif_fh *fh = priv;
struct channel_obj *ch = fh->channel;
struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX];
int ret = 0;
/* Check the validity of the buffer type */
if (common->fmt.type != fmt->type)
return -EINVAL;
/* Fill in the information about format */
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
if (vpif_update_resolution(ch))
ret = -EINVAL;
else
*fmt = common->fmt;
mutex_unlock(&common->lock);
return ret;
return -EINVAL;
*fmt = common->fmt;
return 0;
}
static int vpif_s_fmt_vid_out(struct file *file, void *priv,
@ -794,12 +780,7 @@ static int vpif_s_fmt_vid_out(struct file *file, void *priv,
/* store the pix format in the channel object */
common->fmt.fmt.pix = *pixfmt;
/* store the format in the channel object */
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
common->fmt = *fmt;
mutex_unlock(&common->lock);
return 0;
}
@ -829,7 +810,6 @@ static int vpif_reqbufs(struct file *file, void *priv,
struct common_obj *common;
enum v4l2_field field;
u8 index = 0;
int ret = 0;
/* This file handle has not initialized the channel,
It is not allowed to do settings */
@ -847,18 +827,12 @@ static int vpif_reqbufs(struct file *file, void *priv,
index = VPIF_VIDEO_INDEX;
common = &ch->common[index];
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
if (common->fmt.type != reqbuf->type) {
ret = -EINVAL;
goto reqbuf_exit;
}
if (common->fmt.type != reqbuf->type)
return -EINVAL;
if (0 != common->io_usrs) {
ret = -EBUSY;
goto reqbuf_exit;
}
if (0 != common->io_usrs)
return -EBUSY;
if (reqbuf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
if (common->fmt.fmt.pix.field == V4L2_FIELD_ANY)
@ -875,7 +849,7 @@ static int vpif_reqbufs(struct file *file, void *priv,
&common->irqlock,
reqbuf->type, field,
sizeof(struct videobuf_buffer), fh,
NULL);
&common->lock);
/* Set io allowed member of file handle to TRUE */
fh->io_allowed[index] = 1;
@ -886,11 +860,7 @@ static int vpif_reqbufs(struct file *file, void *priv,
INIT_LIST_HEAD(&common->dma_queue);
/* Allocate buffers */
ret = videobuf_reqbufs(&common->buffer_queue, reqbuf);
reqbuf_exit:
mutex_unlock(&common->lock);
return ret;
return videobuf_reqbufs(&common->buffer_queue, reqbuf);
}
static int vpif_querybuf(struct file *file, void *priv,
@ -1011,25 +981,19 @@ static int vpif_s_std(struct file *file, void *priv, v4l2_std_id *std_id)
}
/* Call encoder subdevice function to set the standard */
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
ch->video.stdid = *std_id;
ch->video.dv_preset = V4L2_DV_INVALID;
memset(&ch->video.bt_timings, 0, sizeof(ch->video.bt_timings));
/* Get the information about the standard */
if (vpif_update_resolution(ch)) {
ret = -EINVAL;
goto s_std_exit;
}
if (vpif_update_resolution(ch))
return -EINVAL;
if ((ch->vpifparams.std_info.width *
ch->vpifparams.std_info.height * 2) >
config_params.channel_bufsize[ch->channel_id]) {
vpif_err("invalid std for this size\n");
ret = -EINVAL;
goto s_std_exit;
return -EINVAL;
}
common->fmt.fmt.pix.bytesperline = common->fmt.fmt.pix.width;
@ -1040,16 +1004,13 @@ static int vpif_s_std(struct file *file, void *priv, v4l2_std_id *std_id)
s_std_output, *std_id);
if (ret < 0) {
vpif_err("Failed to set output standard\n");
goto s_std_exit;
return ret;
}
ret = v4l2_device_call_until_err(&vpif_obj.v4l2_dev, 1, core,
s_std, *std_id);
if (ret < 0)
vpif_err("Failed to set standard for sub devices\n");
s_std_exit:
mutex_unlock(&common->lock);
return ret;
}
@ -1121,14 +1082,10 @@ static int vpif_streamon(struct file *file, void *priv,
return ret;
}
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
/* If buffer queue is empty, return error */
if (list_empty(&common->dma_queue)) {
vpif_err("buffer queue is empty\n");
ret = -EIO;
goto streamon_exit;
return -EIO;
}
/* Get the next frame from the buffer queue */
@ -1154,8 +1111,7 @@ static int vpif_streamon(struct file *file, void *priv,
|| (!ch->vpifparams.std_info.frm_fmt
&& (common->fmt.fmt.pix.field == V4L2_FIELD_NONE))) {
vpif_err("conflict in field format and std format\n");
ret = -EINVAL;
goto streamon_exit;
return -EINVAL;
}
/* clock settings */
@ -1164,13 +1120,13 @@ static int vpif_streamon(struct file *file, void *priv,
ch->vpifparams.std_info.hd_sd);
if (ret < 0) {
vpif_err("can't set clock\n");
goto streamon_exit;
return ret;
}
/* set the parameters and addresses */
ret = vpif_set_video_params(vpif, ch->channel_id + 2);
if (ret < 0)
goto streamon_exit;
return ret;
common->started = ret;
vpif_config_addr(ch, ret);
@ -1195,9 +1151,6 @@ static int vpif_streamon(struct file *file, void *priv,
}
channel_first_int[VPIF_VIDEO_INDEX][ch->channel_id] = 1;
}
streamon_exit:
mutex_unlock(&common->lock);
return ret;
}
@ -1223,9 +1176,6 @@ static int vpif_streamoff(struct file *file, void *priv,
return -EINVAL;
}
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
if (buftype == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
/* disable channel */
if (VPIF_CHANNEL2_VIDEO == ch->channel_id) {
@ -1240,8 +1190,6 @@ static int vpif_streamoff(struct file *file, void *priv,
}
common->started = 0;
mutex_unlock(&common->lock);
return videobuf_streamoff(&common->buffer_queue);
}
@ -1288,13 +1236,9 @@ static int vpif_s_output(struct file *file, void *priv, unsigned int i)
struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX];
int ret = 0;
if (mutex_lock_interruptible(&common->lock))
return -ERESTARTSYS;
if (common->started) {
vpif_err("Streaming in progress\n");
ret = -EBUSY;
goto s_output_exit;
return -EBUSY;
}
ret = v4l2_device_call_until_err(&vpif_obj.v4l2_dev, 1, video,
@ -1304,9 +1248,6 @@ static int vpif_s_output(struct file *file, void *priv, unsigned int i)
vpif_err("Failed to set output standard\n");
vid_ch->output_id = i;
s_output_exit:
mutex_unlock(&common->lock);
return ret;
}
@ -1658,7 +1599,7 @@ static const struct v4l2_file_operations vpif_fops = {
.owner = THIS_MODULE,
.open = vpif_open,
.release = vpif_release,
.ioctl = video_ioctl2,
.unlocked_ioctl = video_ioctl2,
.mmap = vpif_mmap,
.poll = vpif_poll
};
@ -1842,6 +1783,7 @@ static __init int vpif_probe(struct platform_device *pdev)
v4l2_prio_init(&ch->prio);
ch->common[VPIF_VIDEO_INDEX].fmt.type =
V4L2_BUF_TYPE_VIDEO_OUTPUT;
ch->video_dev->lock = &common->lock;
/* register video device */
vpif_dbg(1, debug, "channel=%x,channel->video_dev=%x\n",