2013-01-08 07:06:31 -03: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 12:21:29 -03:00
struct device_node ;
2013-01-08 07:06:31 -03:00
struct v4l2_device ;
struct v4l2_subdev ;
2017-08-30 13:18:04 -04:00
struct v4l2_async_notifier ;
2013-01-08 07:06:31 -03:00
/* A random max subdevice number, used to allocate an array on stack */
# define V4L2_MAX_SUBDEVS 128U
2016-07-21 09: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
2018-01-04 06:47:28 -05:00
* v4l2_async_subdev . match ops
2016-07-21 09:24:55 -03:00
* @ 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 06:54:59 -03:00
* @ V4L2_ASYNC_MATCH_FWNODE : Match will use firmware node
2016-07-21 09: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 12:14:46 -03:00
enum v4l2_async_match_type {
V4L2_ASYNC_MATCH_CUSTOM ,
V4L2_ASYNC_MATCH_DEVNAME ,
V4L2_ASYNC_MATCH_I2C ,
2016-08-16 06:54:59 -03:00
V4L2_ASYNC_MATCH_FWNODE ,
2013-01-08 07:06:31 -03:00
} ;
/**
* struct v4l2_async_subdev - sub - device descriptor , as known to a bridge
2015-08-22 05:16:24 -03:00
*
* @ match_type : type of match that will be used
2013-01-08 07:06:31 -03:00
* @ match : union of per - bus type matching data sets
2017-09-27 11:43:00 -04:00
* @ match . fwnode :
* pointer to & struct fwnode_handle to be matched .
* Used if @ match_type is % V4L2_ASYNC_MATCH_FWNODE .
* @ match . device_name :
* string containing the device name to be matched .
* Used if @ match_type is % V4L2_ASYNC_MATCH_DEVNAME .
* @ match . i2c : embedded struct with I2C parameters to be matched .
2018-01-04 06:47:28 -05:00
* Both @ match . i2c . adapter_id and @ match . i2c . address
2017-09-27 11:43:00 -04:00
* should be matched .
* Used if @ match_type is % V4L2_ASYNC_MATCH_I2C .
* @ match . i2c . adapter_id :
* I2C adapter ID to be matched .
* Used if @ match_type is % V4L2_ASYNC_MATCH_I2C .
* @ match . i2c . address :
* I2C address to be matched .
* Used if @ match_type is % V4L2_ASYNC_MATCH_I2C .
* @ match . custom :
* Driver - specific match criteria .
* Used if @ match_type is % V4L2_ASYNC_MATCH_CUSTOM .
* @ match . custom . match :
* Driver - specific match function to be used if
* % V4L2_ASYNC_MATCH_CUSTOM .
* @ match . custom . priv :
* Driver - specific private struct with match parameters
* to be used if % V4L2_ASYNC_MATCH_CUSTOM .
2013-01-08 07:06:31 -03:00
* @ list : used to link struct v4l2_async_subdev objects , waiting to be
* probed , to a notifier - > waiting list
2017-08-17 11:28:21 -04: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 07:06:31 -03:00
*/
struct v4l2_async_subdev {
2013-07-19 12:14:46 -03:00
enum v4l2_async_match_type match_type ;
2013-01-08 07:06:31 -03:00
union {
2017-09-27 10:12:00 -04:00
struct fwnode_handle * fwnode ;
const char * device_name ;
2013-01-08 07:06:31 -03: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 13:18:04 -04:00
/**
* struct v4l2_async_notifier_operations - Asynchronous V4L2 notifier operations
* @ bound : a subdevice driver has successfully probed one of the subdevices
2017-09-24 20:54:31 -04:00
* @ complete : All subdevices have been probed successfully . The complete
* callback is only executed for the root notifier .
2017-08-30 13:18:04 -04: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 07:06:31 -03:00
/**
2015-08-22 05:16:24 -03:00
* struct v4l2_async_notifier - v4l2_device notifier data
*
2017-08-30 13:18:04 -04:00
* @ ops : notifier operations
2017-08-17 11:28:21 -04:00
* @ num_subdevs : number of subdevices used in the subdevs array
* @ max_subdevs : number of subdevices allocated in the subdevs array
2013-07-19 12:31:10 -03:00
* @ subdevs : array of pointers to subdevice descriptors
2017-09-24 20:54:31 -04: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 07:06:31 -03:00
* @ waiting : list of struct v4l2_async_subdev , waiting for their drivers
2013-07-22 08:01:33 -03:00
* @ done : list of struct v4l2_subdev , already probed
2013-01-08 07:06:31 -03:00
* @ list : member in a global list of notifiers
*/
struct v4l2_async_notifier {
2017-08-30 13:18:04 -04:00
const struct v4l2_async_notifier_operations * ops ;
2013-01-08 07:06:31 -03:00
unsigned int num_subdevs ;
2017-08-17 11:28:21 -04:00
unsigned int max_subdevs ;
2013-07-19 12:31:10 -03:00
struct v4l2_async_subdev * * subdevs ;
2013-01-08 07:06:31 -03:00
struct v4l2_device * v4l2_dev ;
2017-09-24 20:54:31 -04:00
struct v4l2_subdev * sd ;
struct v4l2_async_notifier * parent ;
2013-01-08 07:06:31 -03:00
struct list_head waiting ;
struct list_head done ;
struct list_head list ;
} ;
2016-07-21 09: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 07:06:31 -03:00
int v4l2_async_notifier_register ( struct v4l2_device * v4l2_dev ,
struct v4l2_async_notifier * notifier ) ;
2016-07-21 09:24:55 -03:00
2017-09-24 20:54:31 -04: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 09:24:55 -03:00
/**
* v4l2_async_notifier_unregister - unregisters a subdevice asynchronous notifier
*
* @ notifier : pointer to & struct v4l2_async_notifier
*/
2013-01-08 07:06:31 -03:00
void v4l2_async_notifier_unregister ( struct v4l2_async_notifier * notifier ) ;
2016-07-21 09:24:55 -03:00
2017-08-17 11:28:21 -04: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 08:35:42 -04:00
* notifier after calling @ v4l2_async_notifier_parse_fwnode_endpoints or
* @ v4l2_fwnode_reference_parse_sensor_common .
2017-08-17 11:28:21 -04: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 09:24:55 -03:00
/**
* v4l2_async_register_subdev - registers a sub - device to the asynchronous
2018-01-04 06:47:28 -05:00
* subdevice framework
2016-07-21 09:24:55 -03:00
*
* @ sd : pointer to & struct v4l2_subdev
*/
2013-01-08 07:06:31 -03:00
int v4l2_async_register_subdev ( struct v4l2_subdev * sd ) ;
2016-07-21 09:24:55 -03:00
2017-09-24 18:47:44 -04:00
/**
* v4l2_async_register_subdev_sensor_common - registers a sensor sub - device to
* the asynchronous sub - device
* framework and parse set up common
* sensor related devices
*
* @ sd : pointer to struct & v4l2_subdev
*
* This function is just like v4l2_async_register_subdev ( ) with the exception
* that calling it will also parse firmware interfaces for remote references
* using v4l2_async_notifier_parse_fwnode_sensor_common ( ) and registers the
* async sub - devices . The sub - device is similarly unregistered by calling
* v4l2_async_unregister_subdev ( ) .
*
* While registered , the subdev module is marked as in - use .
*
* An error is returned if the module is no longer loaded on any attempts
* to register it .
*/
int __must_check v4l2_async_register_subdev_sensor_common (
struct v4l2_subdev * sd ) ;
2016-07-21 09:24:55 -03:00
/**
* v4l2_async_unregister_subdev - unregisters a sub - device to the asynchronous
2018-01-04 06:47:28 -05:00
* subdevice framework
2016-07-21 09:24:55 -03:00
*
* @ sd : pointer to & struct v4l2_subdev
*/
2013-01-08 07:06:31 -03:00
void v4l2_async_unregister_subdev ( struct v4l2_subdev * sd ) ;
# endif