Commit ba14e961 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'media/v4.6-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull media fixes from Mauro Carvalho Chehab:
 "Some regression fixes:

   - videobuf2 core: avoid the risk of going past buffer on multi-planes
     and fix rw mode

   - fix support for 4K formats at V4L2 core

   - fix a trouble at davinci_fpe, caused by a bad patch

   - usbvision: revert a patch with a partial fixup.  The fixup patch
     was merged already, and this one has some issues"

* tag 'media/v4.6-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
  [media] vb2-memops: Fix over allocation of frame vectors
  [media] media: vb2: Fix regression on poll() for RW mode
  [media] v4l2-dv-timings.h: fix polarity for 4k formats
  [media] davinci_vpfe: Revert "staging: media: davinci_vpfe: remove,unnecessary ret variable"
  [media] usbvision: revert commit 588afcc1
  [media] videobuf2-v4l2: Verify planes array in buffer dequeueing
  [media] videobuf2-core: Check user space planes array in dqbuf
parents e1f14a54 89a09566
...@@ -1452,13 +1452,6 @@ static int usbvision_probe(struct usb_interface *intf, ...@@ -1452,13 +1452,6 @@ static int usbvision_probe(struct usb_interface *intf,
printk(KERN_INFO "%s: %s found\n", __func__, printk(KERN_INFO "%s: %s found\n", __func__,
usbvision_device_data[model].model_string); usbvision_device_data[model].model_string);
/*
* this is a security check.
* an exploit using an incorrect bInterfaceNumber is known
*/
if (ifnum >= USB_MAXINTERFACES || !dev->actconfig->interface[ifnum])
return -ENODEV;
if (usbvision_device_data[model].interface >= 0) if (usbvision_device_data[model].interface >= 0)
interface = &dev->actconfig->interface[usbvision_device_data[model].interface]->altsetting[0]; interface = &dev->actconfig->interface[usbvision_device_data[model].interface]->altsetting[0];
else if (ifnum < dev->actconfig->desc.bNumInterfaces) else if (ifnum < dev->actconfig->desc.bNumInterfaces)
......
...@@ -1645,7 +1645,7 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking) ...@@ -1645,7 +1645,7 @@ static int __vb2_wait_for_done_vb(struct vb2_queue *q, int nonblocking)
* Will sleep if required for nonblocking == false. * Will sleep if required for nonblocking == false.
*/ */
static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb,
int nonblocking) void *pb, int nonblocking)
{ {
unsigned long flags; unsigned long flags;
int ret; int ret;
...@@ -1666,10 +1666,10 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, ...@@ -1666,10 +1666,10 @@ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb,
/* /*
* Only remove the buffer from done_list if v4l2_buffer can handle all * Only remove the buffer from done_list if v4l2_buffer can handle all
* the planes. * the planes.
* Verifying planes is NOT necessary since it already has been checked
* before the buffer is queued/prepared. So it can never fail.
*/ */
list_del(&(*vb)->done_entry); ret = call_bufop(q, verify_planes_array, *vb, pb);
if (!ret)
list_del(&(*vb)->done_entry);
spin_unlock_irqrestore(&q->done_lock, flags); spin_unlock_irqrestore(&q->done_lock, flags);
return ret; return ret;
...@@ -1748,7 +1748,7 @@ int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb, ...@@ -1748,7 +1748,7 @@ int vb2_core_dqbuf(struct vb2_queue *q, unsigned int *pindex, void *pb,
struct vb2_buffer *vb = NULL; struct vb2_buffer *vb = NULL;
int ret; int ret;
ret = __vb2_get_done_vb(q, &vb, nonblocking); ret = __vb2_get_done_vb(q, &vb, pb, nonblocking);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -2297,6 +2297,16 @@ unsigned int vb2_core_poll(struct vb2_queue *q, struct file *file, ...@@ -2297,6 +2297,16 @@ unsigned int vb2_core_poll(struct vb2_queue *q, struct file *file,
if (!vb2_is_streaming(q) || q->error) if (!vb2_is_streaming(q) || q->error)
return POLLERR; return POLLERR;
/*
* If this quirk is set and QBUF hasn't been called yet then
* return POLLERR as well. This only affects capture queues, output
* queues will always initialize waiting_for_buffers to false.
* This quirk is set by V4L2 for backwards compatibility reasons.
*/
if (q->quirk_poll_must_check_waiting_for_buffers &&
q->waiting_for_buffers && (req_events & (POLLIN | POLLRDNORM)))
return POLLERR;
/* /*
* For output streams you can call write() as long as there are fewer * For output streams you can call write() as long as there are fewer
* buffers queued than there are buffers available. * buffers queued than there are buffers available.
......
...@@ -49,7 +49,7 @@ struct frame_vector *vb2_create_framevec(unsigned long start, ...@@ -49,7 +49,7 @@ struct frame_vector *vb2_create_framevec(unsigned long start,
vec = frame_vector_create(nr); vec = frame_vector_create(nr);
if (!vec) if (!vec)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
ret = get_vaddr_frames(start, nr, write, 1, vec); ret = get_vaddr_frames(start & PAGE_MASK, nr, write, true, vec);
if (ret < 0) if (ret < 0)
goto out_destroy; goto out_destroy;
/* We accept only complete set of PFNs */ /* We accept only complete set of PFNs */
......
...@@ -74,6 +74,11 @@ static int __verify_planes_array(struct vb2_buffer *vb, const struct v4l2_buffer ...@@ -74,6 +74,11 @@ static int __verify_planes_array(struct vb2_buffer *vb, const struct v4l2_buffer
return 0; return 0;
} }
static int __verify_planes_array_core(struct vb2_buffer *vb, const void *pb)
{
return __verify_planes_array(vb, pb);
}
/** /**
* __verify_length() - Verify that the bytesused value for each plane fits in * __verify_length() - Verify that the bytesused value for each plane fits in
* the plane length and that the data offset doesn't exceed the bytesused value. * the plane length and that the data offset doesn't exceed the bytesused value.
...@@ -437,6 +442,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, ...@@ -437,6 +442,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb,
} }
static const struct vb2_buf_ops v4l2_buf_ops = { static const struct vb2_buf_ops v4l2_buf_ops = {
.verify_planes_array = __verify_planes_array_core,
.fill_user_buffer = __fill_v4l2_buffer, .fill_user_buffer = __fill_v4l2_buffer,
.fill_vb2_buffer = __fill_vb2_buffer, .fill_vb2_buffer = __fill_vb2_buffer,
.copy_timestamp = __copy_timestamp, .copy_timestamp = __copy_timestamp,
...@@ -765,6 +771,12 @@ int vb2_queue_init(struct vb2_queue *q) ...@@ -765,6 +771,12 @@ int vb2_queue_init(struct vb2_queue *q)
q->is_output = V4L2_TYPE_IS_OUTPUT(q->type); q->is_output = V4L2_TYPE_IS_OUTPUT(q->type);
q->copy_timestamp = (q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK) q->copy_timestamp = (q->timestamp_flags & V4L2_BUF_FLAG_TIMESTAMP_MASK)
== V4L2_BUF_FLAG_TIMESTAMP_COPY; == V4L2_BUF_FLAG_TIMESTAMP_COPY;
/*
* For compatibility with vb1: if QBUF hasn't been called yet, then
* return POLLERR as well. This only affects capture queues, output
* queues will always initialize waiting_for_buffers to false.
*/
q->quirk_poll_must_check_waiting_for_buffers = true;
return vb2_core_queue_init(q); return vb2_core_queue_init(q);
} }
...@@ -818,14 +830,6 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait) ...@@ -818,14 +830,6 @@ unsigned int vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
poll_wait(file, &fh->wait, wait); poll_wait(file, &fh->wait, wait);
} }
/*
* For compatibility with vb1: if QBUF hasn't been called yet, then
* return POLLERR as well. This only affects capture queues, output
* queues will always initialize waiting_for_buffers to false.
*/
if (q->waiting_for_buffers && (req_events & (POLLIN | POLLRDNORM)))
return POLLERR;
return res | vb2_core_poll(q, file, wait); return res | vb2_core_poll(q, file, wait);
} }
EXPORT_SYMBOL_GPL(vb2_poll); EXPORT_SYMBOL_GPL(vb2_poll);
......
...@@ -172,9 +172,11 @@ static int vpfe_prepare_pipeline(struct vpfe_video_device *video) ...@@ -172,9 +172,11 @@ static int vpfe_prepare_pipeline(struct vpfe_video_device *video)
static int vpfe_update_pipe_state(struct vpfe_video_device *video) static int vpfe_update_pipe_state(struct vpfe_video_device *video)
{ {
struct vpfe_pipeline *pipe = &video->pipe; struct vpfe_pipeline *pipe = &video->pipe;
int ret;
if (vpfe_prepare_pipeline(video)) ret = vpfe_prepare_pipeline(video);
return vpfe_prepare_pipeline(video); if (ret)
return ret;
/* /*
* Find out if there is any input video * Find out if there is any input video
...@@ -182,9 +184,10 @@ static int vpfe_update_pipe_state(struct vpfe_video_device *video) ...@@ -182,9 +184,10 @@ static int vpfe_update_pipe_state(struct vpfe_video_device *video)
*/ */
if (pipe->input_num == 0) { if (pipe->input_num == 0) {
pipe->state = VPFE_PIPELINE_STREAM_CONTINUOUS; pipe->state = VPFE_PIPELINE_STREAM_CONTINUOUS;
if (vpfe_update_current_ext_subdev(video)) { ret = vpfe_update_current_ext_subdev(video);
if (ret) {
pr_err("Invalid external subdev\n"); pr_err("Invalid external subdev\n");
return vpfe_update_current_ext_subdev(video); return ret;
} }
} else { } else {
pipe->state = VPFE_PIPELINE_STREAM_SINGLESHOT; pipe->state = VPFE_PIPELINE_STREAM_SINGLESHOT;
...@@ -667,6 +670,7 @@ static int vpfe_enum_fmt(struct file *file, void *priv, ...@@ -667,6 +670,7 @@ static int vpfe_enum_fmt(struct file *file, void *priv,
struct v4l2_subdev *subdev; struct v4l2_subdev *subdev;
struct v4l2_format format; struct v4l2_format format;
struct media_pad *remote; struct media_pad *remote;
int ret;
v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_fmt\n"); v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_enum_fmt\n");
...@@ -695,10 +699,11 @@ static int vpfe_enum_fmt(struct file *file, void *priv, ...@@ -695,10 +699,11 @@ static int vpfe_enum_fmt(struct file *file, void *priv,
sd_fmt.pad = remote->index; sd_fmt.pad = remote->index;
sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE; sd_fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
/* get output format of remote subdev */ /* get output format of remote subdev */
if (v4l2_subdev_call(subdev, pad, get_fmt, NULL, &sd_fmt)) { ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &sd_fmt);
if (ret) {
v4l2_err(&vpfe_dev->v4l2_dev, v4l2_err(&vpfe_dev->v4l2_dev,
"invalid remote subdev for video node\n"); "invalid remote subdev for video node\n");
return v4l2_subdev_call(subdev, pad, get_fmt, NULL, &sd_fmt); return ret;
} }
/* convert to pix format */ /* convert to pix format */
mbus.code = sd_fmt.format.code; mbus.code = sd_fmt.format.code;
...@@ -725,6 +730,7 @@ static int vpfe_s_fmt(struct file *file, void *priv, ...@@ -725,6 +730,7 @@ static int vpfe_s_fmt(struct file *file, void *priv,
struct vpfe_video_device *video = video_drvdata(file); struct vpfe_video_device *video = video_drvdata(file);
struct vpfe_device *vpfe_dev = video->vpfe_dev; struct vpfe_device *vpfe_dev = video->vpfe_dev;
struct v4l2_format format; struct v4l2_format format;
int ret;
v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_fmt\n"); v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_fmt\n");
/* If streaming is started, return error */ /* If streaming is started, return error */
...@@ -733,8 +739,9 @@ static int vpfe_s_fmt(struct file *file, void *priv, ...@@ -733,8 +739,9 @@ static int vpfe_s_fmt(struct file *file, void *priv,
return -EBUSY; return -EBUSY;
} }
/* get adjacent subdev's output pad format */ /* get adjacent subdev's output pad format */
if (__vpfe_video_get_format(video, &format)) ret = __vpfe_video_get_format(video, &format);
return __vpfe_video_get_format(video, &format); if (ret)
return ret;
*fmt = format; *fmt = format;
video->fmt = *fmt; video->fmt = *fmt;
return 0; return 0;
...@@ -757,11 +764,13 @@ static int vpfe_try_fmt(struct file *file, void *priv, ...@@ -757,11 +764,13 @@ static int vpfe_try_fmt(struct file *file, void *priv,
struct vpfe_video_device *video = video_drvdata(file); struct vpfe_video_device *video = video_drvdata(file);
struct vpfe_device *vpfe_dev = video->vpfe_dev; struct vpfe_device *vpfe_dev = video->vpfe_dev;
struct v4l2_format format; struct v4l2_format format;
int ret;
v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_try_fmt\n"); v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_try_fmt\n");
/* get adjacent subdev's output pad format */ /* get adjacent subdev's output pad format */
if (__vpfe_video_get_format(video, &format)) ret = __vpfe_video_get_format(video, &format);
return __vpfe_video_get_format(video, &format); if (ret)
return ret;
*fmt = format; *fmt = format;
return 0; return 0;
...@@ -838,8 +847,9 @@ static int vpfe_s_input(struct file *file, void *priv, unsigned int index) ...@@ -838,8 +847,9 @@ static int vpfe_s_input(struct file *file, void *priv, unsigned int index)
v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_input\n"); v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_input\n");
if (mutex_lock_interruptible(&video->lock)) ret = mutex_lock_interruptible(&video->lock);
return mutex_lock_interruptible(&video->lock); if (ret)
return ret;
/* /*
* If streaming is started return device busy * If streaming is started return device busy
* error * error
...@@ -940,8 +950,9 @@ static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id std_id) ...@@ -940,8 +950,9 @@ static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id std_id)
v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_std\n"); v4l2_dbg(1, debug, &vpfe_dev->v4l2_dev, "vpfe_s_std\n");
/* Call decoder driver function to set the standard */ /* Call decoder driver function to set the standard */
if (mutex_lock_interruptible(&video->lock)) ret = mutex_lock_interruptible(&video->lock);
return mutex_lock_interruptible(&video->lock); if (ret)
return ret;
sdinfo = video->current_ext_subdev; sdinfo = video->current_ext_subdev;
/* If streaming is started, return device busy error */ /* If streaming is started, return device busy error */
if (video->started) { if (video->started) {
...@@ -1327,8 +1338,9 @@ static int vpfe_reqbufs(struct file *file, void *priv, ...@@ -1327,8 +1338,9 @@ static int vpfe_reqbufs(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
} }
if (mutex_lock_interruptible(&video->lock)) ret = mutex_lock_interruptible(&video->lock);
return mutex_lock_interruptible(&video->lock); if (ret)
return ret;
if (video->io_usrs != 0) { if (video->io_usrs != 0) {
v4l2_err(&vpfe_dev->v4l2_dev, "Only one IO user allowed\n"); v4l2_err(&vpfe_dev->v4l2_dev, "Only one IO user allowed\n");
...@@ -1354,10 +1366,11 @@ static int vpfe_reqbufs(struct file *file, void *priv, ...@@ -1354,10 +1366,11 @@ static int vpfe_reqbufs(struct file *file, void *priv,
q->buf_struct_size = sizeof(struct vpfe_cap_buffer); q->buf_struct_size = sizeof(struct vpfe_cap_buffer);
q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
if (vb2_queue_init(q)) { ret = vb2_queue_init(q);
if (ret) {
v4l2_err(&vpfe_dev->v4l2_dev, "vb2_queue_init() failed\n"); v4l2_err(&vpfe_dev->v4l2_dev, "vb2_queue_init() failed\n");
vb2_dma_contig_cleanup_ctx(vpfe_dev->pdev); vb2_dma_contig_cleanup_ctx(vpfe_dev->pdev);
return vb2_queue_init(q); return ret;
} }
fh->io_allowed = 1; fh->io_allowed = 1;
...@@ -1533,8 +1546,9 @@ static int vpfe_streamoff(struct file *file, void *priv, ...@@ -1533,8 +1546,9 @@ static int vpfe_streamoff(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
} }
if (mutex_lock_interruptible(&video->lock)) ret = mutex_lock_interruptible(&video->lock);
return mutex_lock_interruptible(&video->lock); if (ret)
return ret;
vpfe_stop_capture(video); vpfe_stop_capture(video);
ret = vb2_streamoff(&video->buffer_queue, buf_type); ret = vb2_streamoff(&video->buffer_queue, buf_type);
......
...@@ -375,6 +375,9 @@ struct vb2_ops { ...@@ -375,6 +375,9 @@ struct vb2_ops {
/** /**
* struct vb2_ops - driver-specific callbacks * struct vb2_ops - driver-specific callbacks
* *
* @verify_planes_array: Verify that a given user space structure contains
* enough planes for the buffer. This is called
* for each dequeued buffer.
* @fill_user_buffer: given a vb2_buffer fill in the userspace structure. * @fill_user_buffer: given a vb2_buffer fill in the userspace structure.
* For V4L2 this is a struct v4l2_buffer. * For V4L2 this is a struct v4l2_buffer.
* @fill_vb2_buffer: given a userspace structure, fill in the vb2_buffer. * @fill_vb2_buffer: given a userspace structure, fill in the vb2_buffer.
...@@ -384,6 +387,7 @@ struct vb2_ops { ...@@ -384,6 +387,7 @@ struct vb2_ops {
* the vb2_buffer struct. * the vb2_buffer struct.
*/ */
struct vb2_buf_ops { struct vb2_buf_ops {
int (*verify_planes_array)(struct vb2_buffer *vb, const void *pb);
void (*fill_user_buffer)(struct vb2_buffer *vb, void *pb); void (*fill_user_buffer)(struct vb2_buffer *vb, void *pb);
int (*fill_vb2_buffer)(struct vb2_buffer *vb, const void *pb, int (*fill_vb2_buffer)(struct vb2_buffer *vb, const void *pb,
struct vb2_plane *planes); struct vb2_plane *planes);
...@@ -400,6 +404,9 @@ struct vb2_buf_ops { ...@@ -400,6 +404,9 @@ struct vb2_buf_ops {
* @fileio_read_once: report EOF after reading the first buffer * @fileio_read_once: report EOF after reading the first buffer
* @fileio_write_immediately: queue buffer after each write() call * @fileio_write_immediately: queue buffer after each write() call
* @allow_zero_bytesused: allow bytesused == 0 to be passed to the driver * @allow_zero_bytesused: allow bytesused == 0 to be passed to the driver
* @quirk_poll_must_check_waiting_for_buffers: Return POLLERR at poll when QBUF
* has not been called. This is a vb1 idiom that has been adopted
* also by vb2.
* @lock: pointer to a mutex that protects the vb2_queue struct. The * @lock: pointer to a mutex that protects the vb2_queue struct. The
* driver can set this to a mutex to let the v4l2 core serialize * driver can set this to a mutex to let the v4l2 core serialize
* the queuing ioctls. If the driver wants to handle locking * the queuing ioctls. If the driver wants to handle locking
...@@ -463,6 +470,7 @@ struct vb2_queue { ...@@ -463,6 +470,7 @@ struct vb2_queue {
unsigned fileio_read_once:1; unsigned fileio_read_once:1;
unsigned fileio_write_immediately:1; unsigned fileio_write_immediately:1;
unsigned allow_zero_bytesused:1; unsigned allow_zero_bytesused:1;
unsigned quirk_poll_must_check_waiting_for_buffers:1;
struct mutex *lock; struct mutex *lock;
void *owner; void *owner;
......
...@@ -183,7 +183,8 @@ ...@@ -183,7 +183,8 @@
#define V4L2_DV_BT_CEA_3840X2160P24 { \ #define V4L2_DV_BT_CEA_3840X2160P24 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(3840, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
297000000, 1276, 88, 296, 8, 10, 72, 0, 0, 0, \ 297000000, 1276, 88, 296, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, \ V4L2_DV_BT_STD_CEA861, \
V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
...@@ -191,14 +192,16 @@ ...@@ -191,14 +192,16 @@
#define V4L2_DV_BT_CEA_3840X2160P25 { \ #define V4L2_DV_BT_CEA_3840X2160P25 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(3840, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
297000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, \ 297000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
} }
#define V4L2_DV_BT_CEA_3840X2160P30 { \ #define V4L2_DV_BT_CEA_3840X2160P30 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(3840, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
297000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, \ 297000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, \ V4L2_DV_BT_STD_CEA861, \
V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
...@@ -206,14 +209,16 @@ ...@@ -206,14 +209,16 @@
#define V4L2_DV_BT_CEA_3840X2160P50 { \ #define V4L2_DV_BT_CEA_3840X2160P50 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(3840, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
594000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, \ 594000000, 1056, 88, 296, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
} }
#define V4L2_DV_BT_CEA_3840X2160P60 { \ #define V4L2_DV_BT_CEA_3840X2160P60 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(3840, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(3840, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
594000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, \ 594000000, 176, 88, 296, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, \ V4L2_DV_BT_STD_CEA861, \
V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
...@@ -221,7 +226,8 @@ ...@@ -221,7 +226,8 @@
#define V4L2_DV_BT_CEA_4096X2160P24 { \ #define V4L2_DV_BT_CEA_4096X2160P24 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(4096, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
297000000, 1020, 88, 296, 8, 10, 72, 0, 0, 0, \ 297000000, 1020, 88, 296, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, \ V4L2_DV_BT_STD_CEA861, \
V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
...@@ -229,14 +235,16 @@ ...@@ -229,14 +235,16 @@
#define V4L2_DV_BT_CEA_4096X2160P25 { \ #define V4L2_DV_BT_CEA_4096X2160P25 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(4096, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
297000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, \ 297000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
} }
#define V4L2_DV_BT_CEA_4096X2160P30 { \ #define V4L2_DV_BT_CEA_4096X2160P30 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(4096, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
297000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, \ 297000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, \ V4L2_DV_BT_STD_CEA861, \
V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
...@@ -244,14 +252,16 @@ ...@@ -244,14 +252,16 @@
#define V4L2_DV_BT_CEA_4096X2160P50 { \ #define V4L2_DV_BT_CEA_4096X2160P50 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(4096, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
594000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, \ 594000000, 968, 88, 128, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_BT_STD_CEA861, V4L2_DV_FL_IS_CE_VIDEO) \
} }
#define V4L2_DV_BT_CEA_4096X2160P60 { \ #define V4L2_DV_BT_CEA_4096X2160P60 { \
.type = V4L2_DV_BT_656_1120, \ .type = V4L2_DV_BT_656_1120, \
V4L2_INIT_BT_TIMINGS(4096, 2160, 0, V4L2_DV_HSYNC_POS_POL, \ V4L2_INIT_BT_TIMINGS(4096, 2160, 0, \
V4L2_DV_HSYNC_POS_POL | V4L2_DV_VSYNC_POS_POL, \
594000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, \ 594000000, 88, 88, 128, 8, 10, 72, 0, 0, 0, \
V4L2_DV_BT_STD_CEA861, \ V4L2_DV_BT_STD_CEA861, \
V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \ V4L2_DV_FL_CAN_REDUCE_FPS | V4L2_DV_FL_IS_CE_VIDEO) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment