2019-05-27 09:55:21 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2010-03-23 15:25:26 +03:00
/*
* v4l2 - fh . h
*
* V4L2 file handle . Store per file handle data for the V4L2
* framework . Using file handles is optional for the drivers .
*
* Copyright ( C ) 2009 - - 2010 Nokia Corporation .
*
2012-10-28 13:44:17 +04:00
* Contact : Sakari Ailus < sakari . ailus @ iki . fi >
2010-03-23 15:25:26 +03:00
*/
# ifndef V4L2_FH_H
# define V4L2_FH_H
2013-10-04 01:55:52 +04:00
# include <linux/fs.h>
2018-02-05 05:33:04 +03:00
# include <linux/kconfig.h>
2010-03-23 15:25:26 +03:00
# include <linux/list.h>
2013-10-04 01:59:30 +04:00
# include <linux/videodev2.h>
2010-03-23 15:25:26 +03:00
struct video_device ;
2011-03-12 14:54:43 +03:00
struct v4l2_ctrl_handler ;
2010-03-23 15:25:26 +03:00
2016-07-22 15:06:45 +03:00
/**
* struct v4l2_fh - Describes a V4L2 file handler
*
* @ list : list of file handlers
* @ vdev : pointer to & struct video_device
* @ ctrl_handler : pointer to & struct v4l2_ctrl_handler
* @ prio : priority of the file handler , as defined by & enum v4l2_priority
*
* @ wait : event ' s wait queue
2018-09-11 12:32:37 +03:00
* @ subscribe_lock : serialise changes to the subscribed list ; guarantee that
* the add and del event callbacks are orderly called
2016-07-22 15:06:45 +03:00
* @ subscribed : list of subscribed events
* @ available : list of events waiting to be dequeued
* @ navailable : number of available events at @ available list
* @ sequence : event sequence number
2018-09-11 12:32:37 +03:00
*
2016-07-22 15:06:45 +03:00
* @ m2m_ctx : pointer to & struct v4l2_m2m_ctx
*/
2010-03-23 15:25:26 +03:00
struct v4l2_fh {
struct list_head list ;
struct video_device * vdev ;
2011-03-12 14:54:43 +03:00
struct v4l2_ctrl_handler * ctrl_handler ;
2010-12-29 19:36:50 +03:00
enum v4l2_priority prio ;
2011-06-14 00:44:42 +04:00
/* Events */
wait_queue_head_t wait ;
2018-09-11 12:32:37 +03:00
struct mutex subscribe_lock ;
2016-07-22 15:06:45 +03:00
struct list_head subscribed ;
struct list_head available ;
2011-06-14 00:44:42 +04:00
unsigned int navailable ;
u32 sequence ;
2013-09-15 01:39:04 +04:00
struct v4l2_m2m_ctx * m2m_ctx ;
2010-03-23 15:25:26 +03:00
} ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_init - Initialise the file handle .
*
* @ fh : pointer to & struct v4l2_fh
* @ vdev : pointer to & struct video_device
*
* Parts of the V4L2 framework using the
2010-03-23 15:25:26 +03:00
* file handles should be initialised in this function . Must be called
2016-07-22 15:06:45 +03:00
* from driver ' s v4l2_file_operations - > open \ ( \ ) handler if the driver
* uses & struct v4l2_fh .
2010-03-23 15:25:26 +03:00
*/
2011-06-14 00:44:42 +04:00
void v4l2_fh_init ( struct v4l2_fh * fh , struct video_device * vdev ) ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_add - Add the fh to the list of file handles on a video_device .
*
* @ fh : pointer to & struct v4l2_fh
*
* . . note : :
* The @ fh file handle must be initialised first .
2010-03-23 15:25:26 +03:00
*/
void v4l2_fh_add ( struct v4l2_fh * fh ) ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_open - Ancillary routine that can be used as the open \ ( \ ) op
* of v4l2_file_operations .
*
* @ filp : pointer to struct file
*
* It allocates a v4l2_fh and inits and adds it to the & struct video_device
* associated with the file pointer .
2011-01-08 15:36:04 +03:00
*/
int v4l2_fh_open ( struct file * filp ) ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_del - Remove file handle from the list of file handles .
*
* @ fh : pointer to & struct v4l2_fh
*
* On error filp - > private_data will be % NULL , otherwise it will point to
* the & struct v4l2_fh .
*
* . . note : :
* Must be called in v4l2_file_operations - > release \ ( \ ) handler if the driver
* uses & struct v4l2_fh .
2010-03-23 15:25:26 +03:00
*/
void v4l2_fh_del ( struct v4l2_fh * fh ) ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_exit - Release resources related to a file handle .
*
* @ fh : pointer to & struct v4l2_fh
*
* Parts of the V4L2 framework using the v4l2_fh must release their
* resources here , too .
*
* . . note : :
* Must be called in v4l2_file_operations - > release \ ( \ ) handler if the
* driver uses & struct v4l2_fh .
2010-03-23 15:25:26 +03:00
*/
void v4l2_fh_exit ( struct v4l2_fh * fh ) ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_release - Ancillary routine that can be used as the release \ ( \ ) op
* of v4l2_file_operations .
*
* @ filp : pointer to struct file
*
2011-01-08 15:36:04 +03:00
* It deletes and exits the v4l2_fh associated with the file pointer and
* frees it . It will do nothing if filp - > private_data ( the pointer to the
2016-07-22 15:06:45 +03:00
* v4l2_fh struct ) is % NULL .
*
* This function always returns 0.
2011-01-08 15:36:04 +03:00
*/
int v4l2_fh_release ( struct file * filp ) ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_is_singular - Returns 1 if this filehandle is the only filehandle
* opened for the associated video_device .
*
* @ fh : pointer to & struct v4l2_fh
*
* If @ fh is NULL , then it returns 0.
2011-01-08 15:38:02 +03:00
*/
int v4l2_fh_is_singular ( struct v4l2_fh * fh ) ;
2016-07-22 15:06:45 +03:00
/**
* v4l2_fh_is_singular_file - Returns 1 if this filehandle is the only
* filehandle opened for the associated video_device .
*
* @ filp : pointer to struct file
*
* This is a helper function variant of v4l2_fh_is_singular ( ) with uses
* struct file as argument .
*
* If filp - > private_data is % NULL , then it will return 0.
2011-01-08 15:38:02 +03:00
*/
static inline int v4l2_fh_is_singular_file ( struct file * filp )
{
return v4l2_fh_is_singular ( filp - > private_data ) ;
}
2010-03-23 15:25:26 +03:00
# endif /* V4L2_EVENT_H */