media: Drop V4L2_FL_USES_V4L2_FH checks
Now that all drivers use v4l2_fh, we can drop the V4L2_FL_USES_V4L2_FH checks through the V4L2 core. To ensure that all new drivers use v4l2_fh, keep setting the V4L2_FL_USES_V4L2_FH flag in v4l2_fh_init(), and verify it is set after the .open() file operation returns. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>pull/1354/merge
parent
b3d945ba42
commit
bb4d6be205
|
|
@ -3,13 +3,8 @@
|
|||
V4L2 File handles
|
||||
-----------------
|
||||
|
||||
struct v4l2_fh provides a way to easily keep file handle specific
|
||||
data that is used by the V4L2 framework.
|
||||
|
||||
.. attention::
|
||||
New drivers must use struct v4l2_fh
|
||||
since it is also used to implement priority handling
|
||||
(:ref:`VIDIOC_G_PRIORITY`).
|
||||
struct v4l2_fh provides a way to easily keep file handle specific data that is
|
||||
used by the V4L2 framework. Its usage is mandatory in all drivers.
|
||||
|
||||
struct v4l2_fh is allocated in the driver's ``open()`` file operation handler.
|
||||
It is typically embedded in a larger driver-specific structure. The
|
||||
|
|
@ -134,12 +129,6 @@ associated device node:
|
|||
|
||||
- Same, but it calls v4l2_fh_is_singular with filp->private_data.
|
||||
|
||||
.. note::
|
||||
The V4L2 framework knows whether a driver uses :c:type:`v4l2_fh` as its
|
||||
``file->private_data`` pointer by testing the ``V4L2_FL_USES_V4L2_FH``
|
||||
bit in :c:type:`video_device`->flags. This bit is set whenever
|
||||
:c:func:`v4l2_fh_init` is called.
|
||||
|
||||
|
||||
V4L2 fh functions and data structures
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
|
|||
|
|
@ -775,11 +775,6 @@ v4l2_fh 结构体提供一个保存用于 V4L2 框架的文件句柄特定数据
|
|||
如果 video_device 标志,新驱动
|
||||
必须使用 v4l2_fh 结构体,因为它也用于实现优先级处理(VIDIOC_G/S_PRIORITY)。
|
||||
|
||||
v4l2_fh 的用户(位于 V4l2 框架中,并非驱动)可通过测试
|
||||
video_device->flags 中的 V4L2_FL_USES_V4L2_FH 位得知驱动是否使用
|
||||
v4l2_fh 作为他的 file->private_data 指针。这个位会在调用 v4l2_fh_init()
|
||||
时被设置。
|
||||
|
||||
v4l2_fh 结构体作为驱动自身文件句柄结构体的一部分被分配,且驱动在
|
||||
其打开函数中将 file->private_data 指向它。
|
||||
|
||||
|
|
|
|||
|
|
@ -973,18 +973,14 @@ EXPORT_SYMBOL_GPL(vb2_queue_change_type);
|
|||
|
||||
__poll_t vb2_poll(struct vb2_queue *q, struct file *file, poll_table *wait)
|
||||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_fh *fh = file_to_v4l2_fh(file);
|
||||
__poll_t res;
|
||||
|
||||
res = vb2_core_poll(q, file, wait);
|
||||
|
||||
if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) {
|
||||
struct v4l2_fh *fh = file_to_v4l2_fh(file);
|
||||
|
||||
poll_wait(file, &fh->wait, wait);
|
||||
if (v4l2_event_pending(fh))
|
||||
res |= EPOLLPRI;
|
||||
}
|
||||
poll_wait(file, &fh->wait, wait);
|
||||
if (v4l2_event_pending(fh))
|
||||
res |= EPOLLPRI;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -672,15 +672,12 @@ struct v4l2_ext_control32 {
|
|||
static inline bool ctrl_is_pointer(struct file *file, u32 id)
|
||||
{
|
||||
struct video_device *vdev = video_devdata(file);
|
||||
struct v4l2_fh *fh = NULL;
|
||||
struct v4l2_fh *fh = file_to_v4l2_fh(file);
|
||||
struct v4l2_ctrl_handler *hdl = NULL;
|
||||
struct v4l2_query_ext_ctrl qec = { id };
|
||||
const struct v4l2_ioctl_ops *ops = vdev->ioctl_ops;
|
||||
|
||||
if (test_bit(V4L2_FL_USES_V4L2_FH, &vdev->flags))
|
||||
fh = file_to_v4l2_fh(file);
|
||||
|
||||
if (fh && fh->ctrl_handler)
|
||||
if (fh->ctrl_handler)
|
||||
hdl = fh->ctrl_handler;
|
||||
else if (vdev->ctrl_handler)
|
||||
hdl = vdev->ctrl_handler;
|
||||
|
|
|
|||
|
|
@ -1254,7 +1254,7 @@ int v4l2_ctrl_log_status(struct file *file, void *fh)
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
|
||||
if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) && vfd->v4l2_dev) {
|
||||
if (vfd->v4l2_dev) {
|
||||
struct v4l2_fh *vfh = file_to_v4l2_fh(file);
|
||||
|
||||
v4l2_ctrl_handler_log_status(vfh->ctrl_handler,
|
||||
|
|
|
|||
|
|
@ -425,14 +425,26 @@ static int v4l2_open(struct inode *inode, struct file *filp)
|
|||
video_get(vdev);
|
||||
mutex_unlock(&videodev_lock);
|
||||
|
||||
if (video_is_registered(vdev))
|
||||
ret = vdev->fops->open(filp);
|
||||
else
|
||||
if (!video_is_registered(vdev)) {
|
||||
ret = -ENODEV;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = vdev->fops->open(filp);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
||||
/* All drivers must use v4l2_fh. */
|
||||
if (WARN_ON(!test_bit(V4L2_FL_USES_V4L2_FH, &vdev->flags))) {
|
||||
vdev->fops->release(filp);
|
||||
ret = -ENODEV;
|
||||
}
|
||||
|
||||
done:
|
||||
if (vdev->dev_debug & V4L2_DEV_DEBUG_FOP)
|
||||
dprintk("%s: open (%d)\n",
|
||||
video_device_node_name(vdev), ret);
|
||||
|
||||
/* decrease the refcount in case of an error */
|
||||
if (ret)
|
||||
video_put(vdev);
|
||||
|
|
@ -1114,8 +1126,7 @@ void video_unregister_device(struct video_device *vdev)
|
|||
*/
|
||||
clear_bit(V4L2_FL_REGISTERED, &vdev->flags);
|
||||
mutex_unlock(&videodev_lock);
|
||||
if (test_bit(V4L2_FL_USES_V4L2_FH, &vdev->flags))
|
||||
v4l2_event_wake_all(vdev);
|
||||
v4l2_event_wake_all(vdev);
|
||||
device_unregister(&vdev->dev);
|
||||
}
|
||||
EXPORT_SYMBOL(video_unregister_device);
|
||||
|
|
|
|||
|
|
@ -1195,8 +1195,6 @@ static int v4l_s_priority(const struct v4l2_ioctl_ops *ops,
|
|||
u32 *p = arg;
|
||||
|
||||
vfd = video_devdata(file);
|
||||
if (!test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags))
|
||||
return -ENOTTY;
|
||||
vfh = file_to_v4l2_fh(file);
|
||||
return v4l2_prio_change(vfd->prio, &vfh->prio, *p);
|
||||
}
|
||||
|
|
@ -2297,8 +2295,7 @@ static int v4l_queryctrl(const struct v4l2_ioctl_ops *ops,
|
|||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_query_ext_ctrl qec = {};
|
||||
struct v4l2_queryctrl *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
int ret;
|
||||
|
||||
if (vfh && vfh->ctrl_handler)
|
||||
|
|
@ -2322,8 +2319,7 @@ static int v4l_query_ext_ctrl(const struct v4l2_ioctl_ops *ops,
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_query_ext_ctrl *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
|
||||
if (vfh && vfh->ctrl_handler)
|
||||
return v4l2_query_ext_ctrl(vfh->ctrl_handler, p);
|
||||
|
|
@ -2339,8 +2335,7 @@ static int v4l_querymenu(const struct v4l2_ioctl_ops *ops,
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_querymenu *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
|
||||
if (vfh && vfh->ctrl_handler)
|
||||
return v4l2_querymenu(vfh->ctrl_handler, p);
|
||||
|
|
@ -2356,8 +2351,7 @@ static int v4l_g_ctrl(const struct v4l2_ioctl_ops *ops,
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_control *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
struct v4l2_ext_controls ctrls;
|
||||
struct v4l2_ext_control ctrl;
|
||||
|
||||
|
|
@ -2388,8 +2382,7 @@ static int v4l_s_ctrl(const struct v4l2_ioctl_ops *ops,
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_control *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
struct v4l2_ext_controls ctrls;
|
||||
struct v4l2_ext_control ctrl;
|
||||
int ret;
|
||||
|
|
@ -2418,8 +2411,7 @@ static int v4l_g_ext_ctrls(const struct v4l2_ioctl_ops *ops,
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_ext_controls *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
|
||||
p->error_idx = p->count;
|
||||
if (vfh && vfh->ctrl_handler)
|
||||
|
|
@ -2439,8 +2431,7 @@ static int v4l_s_ext_ctrls(const struct v4l2_ioctl_ops *ops,
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_ext_controls *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
|
||||
p->error_idx = p->count;
|
||||
if (vfh && vfh->ctrl_handler)
|
||||
|
|
@ -2460,8 +2451,7 @@ static int v4l_try_ext_ctrls(const struct v4l2_ioctl_ops *ops,
|
|||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_ext_controls *p = arg;
|
||||
struct v4l2_fh *vfh =
|
||||
test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) ? fh : NULL;
|
||||
struct v4l2_fh *vfh = fh;
|
||||
|
||||
p->error_idx = p->count;
|
||||
if (vfh && vfh->ctrl_handler)
|
||||
|
|
@ -3073,7 +3063,7 @@ static long __video_do_ioctl(struct file *file,
|
|||
struct v4l2_ioctl_info default_info;
|
||||
const struct v4l2_ioctl_info *info;
|
||||
void *fh = file->private_data;
|
||||
struct v4l2_fh *vfh = NULL;
|
||||
struct v4l2_fh *vfh = file_to_v4l2_fh(file);
|
||||
int dev_debug = vfd->dev_debug;
|
||||
long ret = -ENOTTY;
|
||||
|
||||
|
|
@ -3083,9 +3073,6 @@ static long __video_do_ioctl(struct file *file,
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags))
|
||||
vfh = file_to_v4l2_fh(file);
|
||||
|
||||
/*
|
||||
* We need to serialize streamon/off with queueing new requests.
|
||||
* These ioctls may trigger the cancellation of a streaming
|
||||
|
|
@ -3117,10 +3104,10 @@ static long __video_do_ioctl(struct file *file,
|
|||
info = &v4l2_ioctls[_IOC_NR(cmd)];
|
||||
|
||||
if (!is_valid_ioctl(vfd, cmd) &&
|
||||
!((info->flags & INFO_FL_CTRL) && vfh && vfh->ctrl_handler))
|
||||
!((info->flags & INFO_FL_CTRL) && vfh->ctrl_handler))
|
||||
goto done;
|
||||
|
||||
if (vfh && (info->flags & INFO_FL_PRIO)) {
|
||||
if (info->flags & INFO_FL_PRIO) {
|
||||
ret = v4l2_prio_check(vfd->prio, vfh->prio);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
|
@ -3139,7 +3126,7 @@ static long __video_do_ioctl(struct file *file,
|
|||
ret = -ENOTTY;
|
||||
} else {
|
||||
ret = ops->vidioc_default(file, fh,
|
||||
vfh ? v4l2_prio_check(vfd->prio, vfh->prio) >= 0 : 0,
|
||||
v4l2_prio_check(vfd->prio, vfh->prio) >= 0,
|
||||
cmd, arg);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -951,7 +951,7 @@ static __poll_t v4l2_m2m_poll_for_data(struct file *file,
|
|||
__poll_t v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
||||
struct poll_table_struct *wait)
|
||||
{
|
||||
struct video_device *vfd = video_devdata(file);
|
||||
struct v4l2_fh *fh = file_to_v4l2_fh(file);
|
||||
struct vb2_queue *src_q = v4l2_m2m_get_src_vq(m2m_ctx);
|
||||
struct vb2_queue *dst_q = v4l2_m2m_get_dst_vq(m2m_ctx);
|
||||
__poll_t req_events = poll_requested_events(wait);
|
||||
|
|
@ -970,13 +970,9 @@ __poll_t v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|||
if (req_events & (EPOLLOUT | EPOLLWRNORM | EPOLLIN | EPOLLRDNORM))
|
||||
rc = v4l2_m2m_poll_for_data(file, m2m_ctx, wait);
|
||||
|
||||
if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags)) {
|
||||
struct v4l2_fh *fh = file_to_v4l2_fh(file);
|
||||
|
||||
poll_wait(file, &fh->wait, wait);
|
||||
if (v4l2_event_pending(fh))
|
||||
rc |= EPOLLPRI;
|
||||
}
|
||||
poll_wait(file, &fh->wait, wait);
|
||||
if (v4l2_event_pending(fh))
|
||||
rc |= EPOLLPRI;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ struct dentry;
|
|||
* @V4L2_FL_USES_V4L2_FH:
|
||||
* indicates that file->private_data points to &struct v4l2_fh.
|
||||
* This flag is set by the core when v4l2_fh_init() is called.
|
||||
* All new drivers should use it.
|
||||
* All drivers must use it.
|
||||
* @V4L2_FL_QUIRK_INVERTED_CROP:
|
||||
* some old M2M drivers use g/s_crop/cropcap incorrectly: crop and
|
||||
* compose are swapped. If this flag is set, then the selection
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
* v4l2-fh.h
|
||||
*
|
||||
* V4L2 file handle. Store per file handle data for the V4L2
|
||||
* framework. Using file handles is optional for the drivers.
|
||||
* framework. Using file handles is mandatory for the drivers.
|
||||
*
|
||||
* Copyright (C) 2009--2010 Nokia Corporation.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in New Issue