^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * v4l2-fh.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * V4L2 file handle. Store per file handle data for the V4L2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * framework. Using file handles is optional for the drivers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2009--2010 Nokia Corporation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Contact: Sakari Ailus <sakari.ailus@iki.fi>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #ifndef V4L2_FH_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define V4L2_FH_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/kconfig.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/videodev2.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct video_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) struct v4l2_ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * struct v4l2_fh - Describes a V4L2 file handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * @list: list of file handlers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * @vdev: pointer to &struct video_device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * @ctrl_handler: pointer to &struct v4l2_ctrl_handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * @prio: priority of the file handler, as defined by &enum v4l2_priority
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * @wait: event' s wait queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * @subscribe_lock: serialise changes to the subscribed list; guarantee that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * the add and del event callbacks are orderly called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * @subscribed: list of subscribed events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * @available: list of events waiting to be dequeued
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * @navailable: number of available events at @available list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * @sequence: event sequence number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * @m2m_ctx: pointer to &struct v4l2_m2m_ctx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct v4l2_fh {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct video_device *vdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct v4l2_ctrl_handler *ctrl_handler;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) enum v4l2_priority prio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* Events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) wait_queue_head_t wait;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct mutex subscribe_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct list_head subscribed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct list_head available;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) unsigned int navailable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) u32 sequence;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct v4l2_m2m_ctx *m2m_ctx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * v4l2_fh_init - Initialise the file handle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * @fh: pointer to &struct v4l2_fh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * @vdev: pointer to &struct video_device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * Parts of the V4L2 framework using the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) * file handles should be initialised in this function. Must be called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) * from driver's v4l2_file_operations->open\(\) handler if the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * uses &struct v4l2_fh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) void v4l2_fh_init(struct v4l2_fh *fh, struct video_device *vdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * v4l2_fh_add - Add the fh to the list of file handles on a video_device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * @fh: pointer to &struct v4l2_fh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * The @fh file handle must be initialised first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) void v4l2_fh_add(struct v4l2_fh *fh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * v4l2_fh_open - Ancillary routine that can be used as the open\(\) op
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * of v4l2_file_operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * @filp: pointer to struct file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * It allocates a v4l2_fh and inits and adds it to the &struct video_device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) * associated with the file pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int v4l2_fh_open(struct file *filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) * v4l2_fh_del - Remove file handle from the list of file handles.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) * @fh: pointer to &struct v4l2_fh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * On error filp->private_data will be %NULL, otherwise it will point to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * the &struct v4l2_fh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * Must be called in v4l2_file_operations->release\(\) handler if the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * uses &struct v4l2_fh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) void v4l2_fh_del(struct v4l2_fh *fh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) * v4l2_fh_exit - Release resources related to a file handle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) * @fh: pointer to &struct v4l2_fh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) * Parts of the V4L2 framework using the v4l2_fh must release their
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) * resources here, too.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * .. note::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * Must be called in v4l2_file_operations->release\(\) handler if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * driver uses &struct v4l2_fh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) void v4l2_fh_exit(struct v4l2_fh *fh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * v4l2_fh_release - Ancillary routine that can be used as the release\(\) op
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * of v4l2_file_operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * @filp: pointer to struct file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * It deletes and exits the v4l2_fh associated with the file pointer and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * frees it. It will do nothing if filp->private_data (the pointer to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) * v4l2_fh struct) is %NULL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * This function always returns 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) int v4l2_fh_release(struct file *filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * v4l2_fh_is_singular - Returns 1 if this filehandle is the only filehandle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * opened for the associated video_device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * @fh: pointer to &struct v4l2_fh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) * If @fh is NULL, then it returns 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) int v4l2_fh_is_singular(struct v4l2_fh *fh);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * v4l2_fh_is_singular_file - Returns 1 if this filehandle is the only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * filehandle opened for the associated video_device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * @filp: pointer to struct file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * This is a helper function variant of v4l2_fh_is_singular() with uses
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) * struct file as argument.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) * If filp->private_data is %NULL, then it will return 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static inline int v4l2_fh_is_singular_file(struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return v4l2_fh_is_singular(filp->private_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #endif /* V4L2_EVENT_H */