2013-01-08 14:06:31 +04:00
/*
* V4L2 asynchronous subdevice registration API
*
* Copyright ( C ) 2012 - 2013 , Guennadi Liakhovetski < g . liakhovetski @ gmx . de >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef V4L2_ASYNC_H
# define V4L2_ASYNC_H
# include <linux/list.h>
# include <linux/mutex.h>
struct device ;
2013-07-19 19:21:29 +04:00
struct device_node ;
2013-01-08 14:06:31 +04:00
struct v4l2_device ;
struct v4l2_subdev ;
2017-08-30 20:18:04 +03:00
struct v4l2_async_notifier ;
2013-01-08 14:06:31 +04:00
/* A random max subdevice number, used to allocate an array on stack */
# define V4L2_MAX_SUBDEVS 128U
2016-07-21 15:24:55 +03:00
/**
* enum v4l2_async_match_type - type of asynchronous subdevice logic to be used
* in order to identify a match
*
* @ V4L2_ASYNC_MATCH_CUSTOM : Match will use the logic provided by & struct
* v4l2_async_subdev . match ops
* @ V4L2_ASYNC_MATCH_DEVNAME : Match will use the device name
* @ V4L2_ASYNC_MATCH_I2C : Match will check for I2C adapter ID and address
2016-08-16 12:54:59 +03:00
* @ V4L2_ASYNC_MATCH_FWNODE : Match will use firmware node
2016-07-21 15:24:55 +03:00
*
* This enum is used by the asyncrhronous sub - device logic to define the
* algorithm that will be used to match an asynchronous device .
*/
2013-07-19 19:14:46 +04:00
enum v4l2_async_match_type {
V4L2_ASYNC_MATCH_CUSTOM ,
V4L2_ASYNC_MATCH_DEVNAME ,
V4L2_ASYNC_MATCH_I2C ,
2016-08-16 12:54:59 +03:00
V4L2_ASYNC_MATCH_FWNODE ,
2013-01-08 14:06:31 +04:00
} ;
/**
* struct v4l2_async_subdev - sub - device descriptor , as known to a bridge
2015-08-22 11:16:24 +03:00
*
* @ match_type : type of match that will be used
2013-01-08 14:06:31 +04:00
* @ match : union of per - bus type matching data sets
* @ list : used to link struct v4l2_async_subdev objects , waiting to be
* probed , to a notifier - > waiting list
2017-08-17 18:28:21 +03:00
*
* When this struct is used as a member in a driver specific struct ,
* the driver specific struct shall contain the & struct
* v4l2_async_subdev as its first member .
2013-01-08 14:06:31 +04:00
*/
struct v4l2_async_subdev {
2013-07-19 19:14:46 +04:00
enum v4l2_async_match_type match_type ;
2013-01-08 14:06:31 +04:00
union {
2016-08-16 12:54:59 +03:00
struct {
struct fwnode_handle * fwnode ;
} fwnode ;
2013-01-08 14:06:31 +04:00
struct {
const char * name ;
2013-07-19 19:14:46 +04:00
} device_name ;
2013-01-08 14:06:31 +04:00
struct {
int adapter_id ;
unsigned short address ;
} i2c ;
struct {
bool ( * match ) ( struct device * ,
struct v4l2_async_subdev * ) ;
void * priv ;
} custom ;
} match ;
/* v4l2-async core private: not to be used by drivers */
struct list_head list ;
} ;
2017-08-30 20:18:04 +03:00
/**
* struct v4l2_async_notifier_operations - Asynchronous V4L2 notifier operations
* @ bound : a subdevice driver has successfully probed one of the subdevices
2017-09-25 03:54:31 +03:00
* @ complete : All subdevices have been probed successfully . The complete
* callback is only executed for the root notifier .
2017-08-30 20:18:04 +03:00
* @ unbind : a subdevice is leaving
*/
struct v4l2_async_notifier_operations {
int ( * bound ) ( struct v4l2_async_notifier * notifier ,
struct v4l2_subdev * subdev ,
struct v4l2_async_subdev * asd ) ;
int ( * complete ) ( struct v4l2_async_notifier * notifier ) ;
void ( * unbind ) ( struct v4l2_async_notifier * notifier ,
struct v4l2_subdev * subdev ,
struct v4l2_async_subdev * asd ) ;
} ;
2013-01-08 14:06:31 +04:00
/**
2015-08-22 11:16:24 +03:00
* struct v4l2_async_notifier - v4l2_device notifier data
*
2017-08-30 20:18:04 +03:00
* @ ops : notifier operations
2017-08-17 18:28:21 +03:00
* @ num_subdevs : number of subdevices used in the subdevs array
* @ max_subdevs : number of subdevices allocated in the subdevs array
2013-07-19 19:31:10 +04:00
* @ subdevs : array of pointers to subdevice descriptors
2017-09-25 03:54:31 +03:00
* @ v4l2_dev : v4l2_device of the root notifier , NULL otherwise
* @ sd : sub - device that registered the notifier , NULL otherwise
* @ parent : parent notifier
2013-01-08 14:06:31 +04:00
* @ waiting : list of struct v4l2_async_subdev , waiting for their drivers
2013-07-22 15:01:33 +04:00
* @ done : list of struct v4l2_subdev , already probed
2013-01-08 14:06:31 +04:00
* @ list : member in a global list of notifiers
*/
struct v4l2_async_notifier {
2017-08-30 20:18:04 +03:00
const struct v4l2_async_notifier_operations * ops ;
2013-01-08 14:06:31 +04:00
unsigned int num_subdevs ;
2017-08-17 18:28:21 +03:00
unsigned int max_subdevs ;
2013-07-19 19:31:10 +04:00
struct v4l2_async_subdev * * subdevs ;
2013-01-08 14:06:31 +04:00
struct v4l2_device * v4l2_dev ;
2017-09-25 03:54:31 +03:00
struct v4l2_subdev * sd ;
struct v4l2_async_notifier * parent ;
2013-01-08 14:06:31 +04:00
struct list_head waiting ;
struct list_head done ;
struct list_head list ;
} ;
2016-07-21 15:24:55 +03:00
/**
* v4l2_async_notifier_register - registers a subdevice asynchronous notifier
*
* @ v4l2_dev : pointer to & struct v4l2_device
* @ notifier : pointer to & struct v4l2_async_notifier
*/
2013-01-08 14:06:31 +04:00
int v4l2_async_notifier_register ( struct v4l2_device * v4l2_dev ,
struct v4l2_async_notifier * notifier ) ;
2016-07-21 15:24:55 +03:00
2017-09-25 03:54:31 +03:00
/**
* v4l2_async_subdev_notifier_register - registers a subdevice asynchronous
* notifier for a sub - device
*
* @ sd : pointer to & struct v4l2_subdev
* @ notifier : pointer to & struct v4l2_async_notifier
*/
int v4l2_async_subdev_notifier_register ( struct v4l2_subdev * sd ,
struct v4l2_async_notifier * notifier ) ;
2016-07-21 15:24:55 +03:00
/**
* v4l2_async_notifier_unregister - unregisters a subdevice asynchronous notifier
*
* @ notifier : pointer to & struct v4l2_async_notifier
*/
2013-01-08 14:06:31 +04:00
void v4l2_async_notifier_unregister ( struct v4l2_async_notifier * notifier ) ;
2016-07-21 15:24:55 +03:00
2017-08-17 18:28:21 +03:00
/**
* v4l2_async_notifier_cleanup - clean up notifier resources
* @ notifier : the notifier the resources of which are to be cleaned up
*
* Release memory resources related to a notifier , including the async
* sub - devices allocated for the purposes of the notifier but not the notifier
* itself . The user is responsible for calling this function to clean up the
2017-09-06 15:35:42 +03:00
* notifier after calling @ v4l2_async_notifier_parse_fwnode_endpoints or
* @ v4l2_fwnode_reference_parse_sensor_common .
2017-08-17 18:28:21 +03:00
*
* There is no harm from calling v4l2_async_notifier_cleanup in other
* cases as long as its memory has been zeroed after it has been
* allocated .
*/
void v4l2_async_notifier_cleanup ( struct v4l2_async_notifier * notifier ) ;
2016-07-21 15:24:55 +03:00
/**
* v4l2_async_register_subdev - registers a sub - device to the asynchronous
* subdevice framework
*
* @ sd : pointer to & struct v4l2_subdev
*/
2013-01-08 14:06:31 +04:00
int v4l2_async_register_subdev ( struct v4l2_subdev * sd ) ;
2016-07-21 15:24:55 +03:00
/**
* v4l2_async_unregister_subdev - unregisters a sub - device to the asynchronous
* subdevice framework
*
* @ sd : pointer to & struct v4l2_subdev
*/
2013-01-08 14:06:31 +04:00
void v4l2_async_unregister_subdev ( struct v4l2_subdev * sd ) ;
# endif