diff options
Diffstat (limited to 'drivers/media/platform/vivi.c')
| -rw-r--r-- | drivers/media/platform/vivi.c | 61 | 
1 files changed, 32 insertions, 29 deletions
diff --git a/drivers/media/platform/vivi.c b/drivers/media/platform/vivi.c index 1d3f1196519..d00bf3df0f8 100644 --- a/drivers/media/platform/vivi.c +++ b/drivers/media/platform/vivi.c @@ -70,10 +70,6 @@ static unsigned debug;  module_param(debug, uint, 0644);  MODULE_PARM_DESC(debug, "activates debug info"); -static unsigned int vid_limit = 16; -module_param(vid_limit, uint, 0644); -MODULE_PARM_DESC(vid_limit, "capture memory limit in megabytes"); -  /* Global font descriptor */  static const u8 *font8x16; @@ -191,7 +187,6 @@ struct vivi_buffer {  	/* common v4l buffer stuff -- must be first */  	struct vb2_buffer	vb;  	struct list_head	list; -	const struct vivi_fmt  *fmt;  };  struct vivi_dmaqueue { @@ -254,7 +249,7 @@ struct vivi_dev {  	struct v4l2_fract          timeperframe;  	unsigned int               width, height;  	struct vb2_queue	   vb_vidq; -	unsigned int		   field_count; +	unsigned int		   seq_count;  	u8			   bars[9][3];  	u8			   line[MAX_WIDTH * 8] __attribute__((__aligned__(4))); @@ -675,8 +670,7 @@ static void vivi_fillbuff(struct vivi_dev *dev, struct vivi_buffer *buf)  	dev->mv_count += 2;  	buf->vb.v4l2_buf.field = V4L2_FIELD_INTERLACED; -	dev->field_count++; -	buf->vb.v4l2_buf.sequence = dev->field_count >> 1; +	buf->vb.v4l2_buf.sequence = dev->seq_count++;  	v4l2_get_timestamp(&buf->vb.v4l2_buf.timestamp);  } @@ -818,19 +812,15 @@ static int queue_setup(struct vb2_queue *vq, const struct v4l2_format *fmt,  	struct vivi_dev *dev = vb2_get_drv_priv(vq);  	unsigned long size; -	if (fmt) +	size = dev->width * dev->height * dev->pixelsize; +	if (fmt) { +		if (fmt->fmt.pix.sizeimage < size) +			return -EINVAL;  		size = fmt->fmt.pix.sizeimage; -	else -		size = dev->width * dev->height * dev->pixelsize; - -	if (size == 0) -		return -EINVAL; - -	if (0 == *nbuffers) -		*nbuffers = 32; - -	while (size * *nbuffers > vid_limit * 1024 * 1024) -		(*nbuffers)--; +		/* check against insane over 8K resolution buffers */ +		if (size > 7680 * 4320 * dev->pixelsize) +			return -EINVAL; +	}  	*nplanes = 1; @@ -876,8 +866,6 @@ static int buffer_prepare(struct vb2_buffer *vb)  	vb2_set_plane_payload(&buf->vb, 0, size); -	buf->fmt = dev->fmt; -  	precalculate_bars(dev);  	precalculate_line(dev); @@ -901,17 +889,28 @@ static void buffer_queue(struct vb2_buffer *vb)  static int start_streaming(struct vb2_queue *vq, unsigned int count)  {  	struct vivi_dev *dev = vb2_get_drv_priv(vq); +	int err; +  	dprintk(dev, 1, "%s\n", __func__); -	return vivi_start_generating(dev); +	dev->seq_count = 0; +	err = vivi_start_generating(dev); +	if (err) { +		struct vivi_buffer *buf, *tmp; + +		list_for_each_entry_safe(buf, tmp, &dev->vidq.active, list) { +			list_del(&buf->list); +			vb2_buffer_done(&buf->vb, VB2_BUF_STATE_QUEUED); +		} +	} +	return err;  }  /* abort streaming and wait for last buffer */ -static int stop_streaming(struct vb2_queue *vq) +static void stop_streaming(struct vb2_queue *vq)  {  	struct vivi_dev *dev = vb2_get_drv_priv(vq);  	dprintk(dev, 1, "%s\n", __func__);  	vivi_stop_generating(dev); -	return 0;  }  static void vivi_lock(struct vb2_queue *vq) @@ -1108,7 +1107,7 @@ static int vidioc_s_input(struct file *file, void *priv, unsigned int i)  	return 0;  } -/* timeperframe is arbitrary and continous */ +/* timeperframe is arbitrary and continuous */  static int vidioc_enum_frameintervals(struct file *file, void *priv,  					     struct v4l2_frmivalenum *fival)  { @@ -1121,11 +1120,15 @@ static int vidioc_enum_frameintervals(struct file *file, void *priv,  	if (!fmt)  		return -EINVAL; -	/* regarding width & height - we support any */ +	/* check for valid width/height */ +	if (fival->width < 48 || fival->width > MAX_WIDTH || (fival->width & 3)) +		return -EINVAL; +	if (fival->height < 32 || fival->height > MAX_HEIGHT) +		return -EINVAL;  	fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; -	/* fill in stepwise (step=1.0 is requred by V4L2 spec) */ +	/* fill in stepwise (step=1.0 is required by V4L2 spec) */  	fival->stepwise.min  = tpf_min;  	fival->stepwise.max  = tpf_max;  	fival->stepwise.step = (struct v4l2_fract) {1, 1}; @@ -1439,7 +1442,7 @@ static int __init vivi_create_instance(int inst)  	q->buf_struct_size = sizeof(struct vivi_buffer);  	q->ops = &vivi_video_qops;  	q->mem_ops = &vb2_vmalloc_memops; -	q->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; +	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;  	ret = vb2_queue_init(q);  	if (ret)  | 
