2 * V4L2 asynchronous subdevice registration API
4 * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
14 #include <linux/list.h>
15 #include <linux/mutex.h>
20 struct v4l2_async_notifier
;
22 /* A random max subdevice number, used to allocate an array on stack */
23 #define V4L2_MAX_SUBDEVS 128U
25 enum v4l2_async_bus_type
{
26 V4L2_ASYNC_BUS_CUSTOM
,
27 V4L2_ASYNC_BUS_PLATFORM
,
32 * struct v4l2_async_subdev - sub-device descriptor, as known to a bridge
33 * @bus_type: subdevice bus type to select the appropriate matching method
34 * @match: union of per-bus type matching data sets
35 * @list: used to link struct v4l2_async_subdev objects, waiting to be
36 * probed, to a notifier->waiting list
38 struct v4l2_async_subdev
{
39 enum v4l2_async_bus_type bus_type
;
46 unsigned short address
;
49 bool (*match
)(struct device
*,
50 struct v4l2_async_subdev
*);
55 /* v4l2-async core private: not to be used by drivers */
56 struct list_head list
;
60 * v4l2_async_subdev_list - provided by subdevices
61 * @list: links struct v4l2_async_subdev_list objects to a global list
62 * before probing, and onto notifier->done after probing
63 * @asd: pointer to respective struct v4l2_async_subdev
64 * @notifier: pointer to managing notifier
66 struct v4l2_async_subdev_list
{
67 struct list_head list
;
68 struct v4l2_async_subdev
*asd
;
69 struct v4l2_async_notifier
*notifier
;
73 * v4l2_async_notifier - v4l2_device notifier data
74 * @num_subdevs:number of subdevices
75 * @subdev: array of pointers to subdevice descriptors
76 * @v4l2_dev: pointer to struct v4l2_device
77 * @waiting: list of struct v4l2_async_subdev, waiting for their drivers
78 * @done: list of struct v4l2_async_subdev_list, already probed
79 * @list: member in a global list of notifiers
80 * @bound: a subdevice driver has successfully probed one of subdevices
81 * @complete: all subdevices have been probed successfully
82 * @unbind: a subdevice is leaving
84 struct v4l2_async_notifier
{
85 unsigned int num_subdevs
;
86 struct v4l2_async_subdev
**subdev
;
87 struct v4l2_device
*v4l2_dev
;
88 struct list_head waiting
;
89 struct list_head done
;
90 struct list_head list
;
91 int (*bound
)(struct v4l2_async_notifier
*notifier
,
92 struct v4l2_subdev
*subdev
,
93 struct v4l2_async_subdev
*asd
);
94 int (*complete
)(struct v4l2_async_notifier
*notifier
);
95 void (*unbind
)(struct v4l2_async_notifier
*notifier
,
96 struct v4l2_subdev
*subdev
,
97 struct v4l2_async_subdev
*asd
);
100 int v4l2_async_notifier_register(struct v4l2_device
*v4l2_dev
,
101 struct v4l2_async_notifier
*notifier
);
102 void v4l2_async_notifier_unregister(struct v4l2_async_notifier
*notifier
);
103 int v4l2_async_register_subdev(struct v4l2_subdev
*sd
);
104 void v4l2_async_unregister_subdev(struct v4l2_subdev
*sd
);