#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/i2c.h>
#include <linux/list.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <media/v4l2-async.h>
#include <media/v4l2-device.h>
#include <media/v4l2-fwnode.h>
#include <media/v4l2-subdev.h>
#include "v4l2-subdev-priv.h"
static int v4l2_async_nf_call_bound(struct v4l2_async_notifier *n,
struct v4l2_subdev *subdev,
struct v4l2_async_connection *asc)
{ … }
static void v4l2_async_nf_call_unbind(struct v4l2_async_notifier *n,
struct v4l2_subdev *subdev,
struct v4l2_async_connection *asc)
{ … }
static int v4l2_async_nf_call_complete(struct v4l2_async_notifier *n)
{ … }
static void v4l2_async_nf_call_destroy(struct v4l2_async_notifier *n,
struct v4l2_async_connection *asc)
{ … }
static bool match_i2c(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *sd,
struct v4l2_async_match_desc *match)
{ … }
static struct device *notifier_dev(struct v4l2_async_notifier *notifier)
{ … }
static bool
match_fwnode_one(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *sd, struct fwnode_handle *sd_fwnode,
struct v4l2_async_match_desc *match)
{ … }
static bool match_fwnode(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *sd,
struct v4l2_async_match_desc *match)
{ … }
static LIST_HEAD(subdev_list);
static LIST_HEAD(notifier_list);
static DEFINE_MUTEX(list_lock);
static struct v4l2_async_connection *
v4l2_async_find_match(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *sd)
{ … }
static bool v4l2_async_match_equal(struct v4l2_async_match_desc *match1,
struct v4l2_async_match_desc *match2)
{ … }
static struct v4l2_async_notifier *
v4l2_async_find_subdev_notifier(struct v4l2_subdev *sd)
{ … }
static struct v4l2_device *
v4l2_async_nf_find_v4l2_dev(struct v4l2_async_notifier *notifier)
{ … }
static bool
v4l2_async_nf_can_complete(struct v4l2_async_notifier *notifier)
{ … }
static int
v4l2_async_nf_try_complete(struct v4l2_async_notifier *notifier)
{ … }
static int
v4l2_async_nf_try_all_subdevs(struct v4l2_async_notifier *notifier);
static int v4l2_async_create_ancillary_links(struct v4l2_async_notifier *n,
struct v4l2_subdev *sd)
{ … }
static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
struct v4l2_device *v4l2_dev,
struct v4l2_subdev *sd,
struct v4l2_async_connection *asc)
{ … }
static int
v4l2_async_nf_try_all_subdevs(struct v4l2_async_notifier *notifier)
{ … }
static void v4l2_async_unbind_subdev_one(struct v4l2_async_notifier *notifier,
struct v4l2_async_connection *asc)
{ … }
static void
v4l2_async_nf_unbind_all_subdevs(struct v4l2_async_notifier *notifier)
{ … }
static bool
v4l2_async_nf_has_async_match_entry(struct v4l2_async_notifier *notifier,
struct v4l2_async_match_desc *match)
{ … }
static bool
v4l2_async_nf_has_async_match(struct v4l2_async_notifier *notifier,
struct v4l2_async_match_desc *match)
{ … }
static int v4l2_async_nf_match_valid(struct v4l2_async_notifier *notifier,
struct v4l2_async_match_desc *match)
{ … }
void v4l2_async_nf_init(struct v4l2_async_notifier *notifier,
struct v4l2_device *v4l2_dev)
{ … }
EXPORT_SYMBOL(…);
void v4l2_async_subdev_nf_init(struct v4l2_async_notifier *notifier,
struct v4l2_subdev *sd)
{ … }
EXPORT_SYMBOL_GPL(…);
static int __v4l2_async_nf_register(struct v4l2_async_notifier *notifier)
{ … }
int v4l2_async_nf_register(struct v4l2_async_notifier *notifier)
{ … }
EXPORT_SYMBOL(…);
static void
__v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier)
{ … }
void v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier)
{ … }
EXPORT_SYMBOL(…);
static void __v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)
{ … }
void v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)
{ … }
EXPORT_SYMBOL_GPL(…);
static void __v4l2_async_nf_add_connection(struct v4l2_async_notifier *notifier,
struct v4l2_async_connection *asc)
{ … }
struct v4l2_async_connection *
__v4l2_async_nf_add_fwnode(struct v4l2_async_notifier *notifier,
struct fwnode_handle *fwnode,
unsigned int asc_struct_size)
{ … }
EXPORT_SYMBOL_GPL(…);
struct v4l2_async_connection *
__v4l2_async_nf_add_fwnode_remote(struct v4l2_async_notifier *notif,
struct fwnode_handle *endpoint,
unsigned int asc_struct_size)
{ … }
EXPORT_SYMBOL_GPL(…);
struct v4l2_async_connection *
__v4l2_async_nf_add_i2c(struct v4l2_async_notifier *notifier, int adapter_id,
unsigned short address, unsigned int asc_struct_size)
{ … }
EXPORT_SYMBOL_GPL(…);
int v4l2_async_subdev_endpoint_add(struct v4l2_subdev *sd,
struct fwnode_handle *fwnode)
{ … }
EXPORT_SYMBOL_GPL(…);
struct v4l2_async_connection *
v4l2_async_connection_unique(struct v4l2_subdev *sd)
{ … }
EXPORT_SYMBOL_GPL(…);
int __v4l2_async_register_subdev(struct v4l2_subdev *sd, struct module *module)
{ … }
EXPORT_SYMBOL(…);
void v4l2_async_unregister_subdev(struct v4l2_subdev *sd)
{ … }
EXPORT_SYMBOL(…);
static void print_waiting_match(struct seq_file *s,
struct v4l2_async_match_desc *match)
{ … }
static const char *
v4l2_async_nf_name(struct v4l2_async_notifier *notifier)
{ … }
static int pending_subdevs_show(struct seq_file *s, void *data)
{ … }
DEFINE_SHOW_ATTRIBUTE(…);
static struct dentry *v4l2_async_debugfs_dir;
static int __init v4l2_async_init(void)
{ … }
static void __exit v4l2_async_exit(void)
{ … }
subsys_initcall(v4l2_async_init);
module_exit(v4l2_async_exit);
MODULE_AUTHOR(…) …;
MODULE_AUTHOR(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;