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