mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
media: v4l: async: Rename v4l2_async_subdev as v4l2_async_connection
Rename v4l2_async_subdev as v4l2_async_connection, in order to differentiate between the sub-devices and their connections: one sub-device can have many connections but the V4L2 async framework has so far allowed just a single one. Connections in this context will later translate into either MC ancillary or data links. This patch prepares changing that relation by changing existing users of v4l2_async_subdev to switch to v4l2_async_connection. Async sub-devices themselves will not be needed anymore Additionally, __v4l2_async_nf_add_subdev() has been renamed __v4l2_async_nf_add_connection(). Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Tested-by: Philipp Zabel <p.zabel@pengutronix.de> # imx6qp Tested-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> # rcar + adv746x Tested-by: Aishwarya Kothari <aishwarya.kothari@toradex.com> # Apalis i.MX6Q with TC358743 Tested-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> # Renesas RZ/G2L SMARC Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
1029939b37
commit
adb2dcd5f2
@ -206,60 +206,67 @@ of an unregister notifier, it must be cleaned up by calling
|
||||
|
||||
Before registering the notifier, bridge drivers must do two things: first, the
|
||||
notifier must be initialized using the :c:func:`v4l2_async_nf_init`. Second,
|
||||
bridge drivers can then begin to form a list of subdevice descriptors that the
|
||||
bridge device needs for its operation. :c:func:`v4l2_async_nf_add_fwnode`,
|
||||
bridge drivers can then begin to form a list of async connection descriptors
|
||||
that the bridge device needs for its
|
||||
operation. :c:func:`v4l2_async_nf_add_fwnode`,
|
||||
:c:func:`v4l2_async_nf_add_fwnode_remote` and :c:func:`v4l2_async_nf_add_i2c`
|
||||
are available for that purpose.
|
||||
|
||||
Async connection descriptors describe connections to external sub-devices the
|
||||
drivers for which are not yet probed. Based on an async connection, a media data
|
||||
or ancillary link may be created when the related sub-device becomes
|
||||
available. There may be one or more async connections to a given sub-device but
|
||||
this is not known at the time of adding the connections to the notifier. Async
|
||||
connections are bound as matching async sub-devices are found, one by one.
|
||||
|
||||
Asynchronous sub-device registration helper for camera sensor drivers
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
:c:func:`v4l2_async_register_subdev_sensor` is a helper function for sensor
|
||||
drivers registering their own async sub-device, but it also registers a notifier
|
||||
and further registers async sub-devices for lens and flash devices found in
|
||||
drivers registering their own async connection, but it also registers a notifier
|
||||
and further registers async connections for lens and flash devices found in
|
||||
firmware. The notifier for the sub-device is unregistered and cleaned up with
|
||||
the async sub-device, using :c:func:`v4l2_async_unregister_subdev`.
|
||||
|
||||
Asynchronous sub-device notifier example
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
These functions allocate an async sub-device descriptor which is of type struct
|
||||
:c:type:`v4l2_async_subdev` embedded in a driver-specific struct. The &struct
|
||||
:c:type:`v4l2_async_subdev` shall be the first member of this struct:
|
||||
These functions allocate an async connection descriptor which is of type struct
|
||||
:c:type:`v4l2_async_connection` embedded in a driver-specific struct. The &struct
|
||||
:c:type:`v4l2_async_connection` shall be the first member of this struct:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
struct my_async_subdev {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct my_async_connection {
|
||||
struct v4l2_async_connection asc;
|
||||
...
|
||||
};
|
||||
|
||||
struct my_async_subdev *my_asd;
|
||||
struct my_async_connection *my_asc;
|
||||
struct fwnode_handle *ep;
|
||||
|
||||
...
|
||||
|
||||
my_asd = v4l2_async_nf_add_fwnode_remote(¬ifier, ep,
|
||||
struct my_async_subdev);
|
||||
my_asc = v4l2_async_nf_add_fwnode_remote(¬ifier, ep,
|
||||
struct my_async_connection);
|
||||
fwnode_handle_put(ep);
|
||||
|
||||
if (IS_ERR(my_asd))
|
||||
return PTR_ERR(my_asd);
|
||||
if (IS_ERR(my_asc))
|
||||
return PTR_ERR(my_asc);
|
||||
|
||||
Asynchronous sub-device notifier callbacks
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The V4L2 core will then use these descriptors to match asynchronously
|
||||
registered subdevices to them. If a match is detected the ``.bound()``
|
||||
notifier callback is called. After all subdevices have been located the
|
||||
.complete() callback is called. When a subdevice is removed from the
|
||||
system the .unbind() method is called. All three callbacks are optional.
|
||||
The V4L2 core will then use these connection descriptors to match asynchronously
|
||||
registered subdevices to them. If a match is detected the ``.bound()`` notifier
|
||||
callback is called. After all connections have been bound the .complete()
|
||||
callback is called. When a connection is removed from the system the
|
||||
``.unbind()`` method is called. All three callbacks are optional.
|
||||
|
||||
Drivers can store any type of custom data in their driver-specific
|
||||
:c:type:`v4l2_async_subdev` wrapper. If any of that data requires special
|
||||
:c:type:`v4l2_async_connection` wrapper. If any of that data requires special
|
||||
handling when the structure is freed, drivers must implement the ``.destroy()``
|
||||
notifier callback. The framework will call it right before freeing the
|
||||
:c:type:`v4l2_async_subdev`.
|
||||
:c:type:`v4l2_async_connection`.
|
||||
|
||||
Calling subdev operations
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -518,7 +518,7 @@ static const struct media_entity_operations ub913_entity_ops = {
|
||||
|
||||
static int ub913_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *source_subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct ub913_data *priv = sd_to_ub913(notifier->sd);
|
||||
struct device *dev = &priv->client->dev;
|
||||
@ -557,7 +557,7 @@ static const struct v4l2_async_notifier_operations ub913_notify_ops = {
|
||||
static int ub913_v4l2_notifier_register(struct ub913_data *priv)
|
||||
{
|
||||
struct device *dev = &priv->client->dev;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep_fwnode;
|
||||
int ret;
|
||||
|
||||
@ -571,7 +571,7 @@ static int ub913_v4l2_notifier_register(struct ub913_data *priv)
|
||||
v4l2_async_nf_init(&priv->notifier);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&priv->notifier, ep_fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
fwnode_handle_put(ep_fwnode);
|
||||
|
||||
|
@ -723,7 +723,7 @@ static const struct media_entity_operations ub953_entity_ops = {
|
||||
|
||||
static int ub953_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *source_subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct ub953_data *priv = sd_to_ub953(notifier->sd);
|
||||
struct device *dev = &priv->client->dev;
|
||||
@ -762,7 +762,7 @@ static const struct v4l2_async_notifier_operations ub953_notify_ops = {
|
||||
static int ub953_v4l2_notifier_register(struct ub953_data *priv)
|
||||
{
|
||||
struct device *dev = &priv->client->dev;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep_fwnode;
|
||||
int ret;
|
||||
|
||||
@ -776,7 +776,7 @@ static int ub953_v4l2_notifier_register(struct ub953_data *priv)
|
||||
v4l2_async_nf_init(&priv->notifier);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&priv->notifier, ep_fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
fwnode_handle_put(ep_fwnode);
|
||||
|
||||
|
@ -471,11 +471,11 @@ struct ub960_rxport {
|
||||
};
|
||||
|
||||
struct ub960_asd {
|
||||
struct v4l2_async_subdev base;
|
||||
struct v4l2_async_connection base;
|
||||
struct ub960_rxport *rxport;
|
||||
};
|
||||
|
||||
static inline struct ub960_asd *to_ub960_asd(struct v4l2_async_subdev *asd)
|
||||
static inline struct ub960_asd *to_ub960_asd(struct v4l2_async_connection *asd)
|
||||
{
|
||||
return container_of(asd, struct ub960_asd, base);
|
||||
}
|
||||
@ -3538,7 +3538,7 @@ err_free_rxports:
|
||||
|
||||
static int ub960_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct ub960_data *priv = sd_to_ub960(notifier->sd);
|
||||
struct ub960_rxport *rxport = to_ub960_asd(asd)->rxport;
|
||||
@ -3581,7 +3581,7 @@ static int ub960_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void ub960_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct ub960_rxport *rxport = to_ub960_asd(asd)->rxport;
|
||||
|
||||
|
@ -161,11 +161,12 @@ struct max9286_source {
|
||||
};
|
||||
|
||||
struct max9286_asd {
|
||||
struct v4l2_async_subdev base;
|
||||
struct v4l2_async_connection base;
|
||||
struct max9286_source *source;
|
||||
};
|
||||
|
||||
static inline struct max9286_asd *to_max9286_asd(struct v4l2_async_subdev *asd)
|
||||
static inline struct max9286_asd *
|
||||
to_max9286_asd(struct v4l2_async_connection *asd)
|
||||
{
|
||||
return container_of(asd, struct max9286_asd, base);
|
||||
}
|
||||
@ -659,7 +660,7 @@ static int max9286_set_pixelrate(struct max9286_priv *priv)
|
||||
|
||||
static int max9286_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct max9286_priv *priv = sd_to_max9286(notifier->sd);
|
||||
struct max9286_source *source = to_max9286_asd(asd)->source;
|
||||
@ -721,7 +722,7 @@ static int max9286_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void max9286_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct max9286_priv *priv = sd_to_max9286(notifier->sd);
|
||||
struct max9286_source *source = to_max9286_asd(asd)->source;
|
||||
|
@ -829,7 +829,7 @@ static const struct media_entity_operations mipid02_subdev_entity_ops = {
|
||||
|
||||
static int mipid02_async_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *s_subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct mipid02_dev *bridge = to_mipid02_dev(notifier->sd);
|
||||
struct i2c_client *client = bridge->i2c_client;
|
||||
@ -863,7 +863,7 @@ static int mipid02_async_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void mipid02_async_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *s_subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct mipid02_dev *bridge = to_mipid02_dev(notifier->sd);
|
||||
|
||||
@ -879,7 +879,7 @@ static int mipid02_parse_rx_ep(struct mipid02_dev *bridge)
|
||||
{
|
||||
struct v4l2_fwnode_endpoint ep = { .bus_type = V4L2_MBUS_CSI2_DPHY };
|
||||
struct i2c_client *client = bridge->i2c_client;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct device_node *ep_node;
|
||||
int ret;
|
||||
|
||||
@ -914,7 +914,7 @@ static int mipid02_parse_rx_ep(struct mipid02_dev *bridge)
|
||||
v4l2_async_nf_init(&bridge->notifier);
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&bridge->notifier,
|
||||
of_fwnode_handle(ep_node),
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
of_node_put(ep_node);
|
||||
|
||||
if (IS_ERR(asd)) {
|
||||
|
@ -1426,7 +1426,7 @@ static int tc358746_init_controls(struct tc358746 *tc358746)
|
||||
|
||||
static int tc358746_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct tc358746 *tc358746 =
|
||||
container_of(notifier, struct tc358746, notifier);
|
||||
@ -1445,7 +1445,7 @@ static int tc358746_async_register(struct tc358746 *tc358746)
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_PARALLEL,
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep;
|
||||
int err;
|
||||
|
||||
@ -1462,7 +1462,7 @@ static int tc358746_async_register(struct tc358746 *tc358746)
|
||||
|
||||
v4l2_async_nf_init(&tc358746->notifier);
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&tc358746->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(ep);
|
||||
|
||||
if (IS_ERR(asd)) {
|
||||
|
@ -1372,7 +1372,7 @@ static const struct v4l2_subdev_ops cio2_subdev_ops = {
|
||||
/******* V4L2 sub-device asynchronous registration callbacks***********/
|
||||
|
||||
struct sensor_async_subdev {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct v4l2_async_connection asd;
|
||||
struct csi2_bus_info csi2;
|
||||
};
|
||||
|
||||
@ -1382,7 +1382,7 @@ struct sensor_async_subdev {
|
||||
/* The .bound() notifier callback when a match is found */
|
||||
static int cio2_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct cio2_device *cio2 = to_cio2_device(notifier);
|
||||
struct sensor_async_subdev *s_asd = to_sensor_asd(asd);
|
||||
@ -1403,7 +1403,7 @@ static int cio2_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
/* The .unbind callback */
|
||||
static void cio2_notifier_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct cio2_device *cio2 = to_cio2_device(notifier);
|
||||
struct sensor_async_subdev *s_asd = to_sensor_asd(asd);
|
||||
@ -1417,11 +1417,11 @@ static int cio2_notifier_complete(struct v4l2_async_notifier *notifier)
|
||||
struct cio2_device *cio2 = to_cio2_device(notifier);
|
||||
struct device *dev = &cio2->pci_dev->dev;
|
||||
struct sensor_async_subdev *s_asd;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct cio2_queue *q;
|
||||
int ret;
|
||||
|
||||
list_for_each_entry(asd, &cio2->notifier.asd_list, asd_entry) {
|
||||
list_for_each_entry(asd, &cio2->notifier.asc_list, asc_entry) {
|
||||
s_asd = to_sensor_asd(asd);
|
||||
q = &cio2->queue[s_asd->csi2.port];
|
||||
|
||||
|
@ -1120,7 +1120,7 @@ static int isi_graph_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
|
||||
static void isi_graph_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct atmel_isi *isi = notifier_to_isi(notifier);
|
||||
|
||||
@ -1132,7 +1132,7 @@ static void isi_graph_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static int isi_graph_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct atmel_isi *isi = notifier_to_isi(notifier);
|
||||
|
||||
@ -1151,7 +1151,7 @@ static const struct v4l2_async_notifier_operations isi_graph_notify_ops = {
|
||||
|
||||
static int isi_graph_init(struct atmel_isi *isi)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct device_node *ep;
|
||||
int ret;
|
||||
|
||||
@ -1163,7 +1163,7 @@ static int isi_graph_init(struct atmel_isi *isi)
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&isi->notifier,
|
||||
of_fwnode_handle(ep),
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
of_node_put(ep);
|
||||
|
||||
if (IS_ERR(asd))
|
||||
|
@ -313,7 +313,7 @@ static const struct v4l2_subdev_ops csi2rx_subdev_ops = {
|
||||
|
||||
static int csi2rx_async_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *s_subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct v4l2_subdev *subdev = notifier->sd;
|
||||
struct csi2rx_priv *csi2rx = v4l2_subdev_to_csi2rx(subdev);
|
||||
@ -440,7 +440,7 @@ static int csi2rx_get_resources(struct csi2rx_priv *csi2rx,
|
||||
static int csi2rx_parse_dt(struct csi2rx_priv *csi2rx)
|
||||
{
|
||||
struct v4l2_fwnode_endpoint v4l2_ep = { .bus_type = 0 };
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *fwh;
|
||||
struct device_node *ep;
|
||||
int ret;
|
||||
@ -477,7 +477,7 @@ static int csi2rx_parse_dt(struct csi2rx_priv *csi2rx)
|
||||
v4l2_async_nf_init(&csi2rx->notifier);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&csi2rx->notifier, fwh,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
of_node_put(ep);
|
||||
if (IS_ERR(asd))
|
||||
return PTR_ERR(asd);
|
||||
|
@ -2044,7 +2044,7 @@ static const struct video_device pxa_camera_videodev_template = {
|
||||
|
||||
static int pxa_camera_sensor_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
int err;
|
||||
struct v4l2_device *v4l2_dev = notifier->v4l2_dev;
|
||||
@ -2123,7 +2123,7 @@ out:
|
||||
|
||||
static void pxa_camera_sensor_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct pxa_camera_dev *pcdev = v4l2_dev_to_pcdev(notifier->v4l2_dev);
|
||||
|
||||
@ -2197,7 +2197,7 @@ static int pxa_camera_pdata_from_dt(struct device *dev,
|
||||
struct pxa_camera_dev *pcdev)
|
||||
{
|
||||
u32 mclk_rate;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct v4l2_fwnode_endpoint ep = { .bus_type = 0 };
|
||||
int err = of_property_read_u32(np, "clock-frequency",
|
||||
@ -2252,7 +2252,7 @@ static int pxa_camera_pdata_from_dt(struct device *dev,
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&pcdev->notifier,
|
||||
of_fwnode_handle(np),
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd))
|
||||
err = PTR_ERR(asd);
|
||||
out:
|
||||
@ -2299,14 +2299,14 @@ static int pxa_camera_probe(struct platform_device *pdev)
|
||||
pcdev->res = res;
|
||||
pcdev->pdata = pdev->dev.platform_data;
|
||||
if (pcdev->pdata) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
|
||||
pcdev->platform_flags = pcdev->pdata->flags;
|
||||
pcdev->mclk = pcdev->pdata->mclk_10khz * 10000;
|
||||
asd = v4l2_async_nf_add_i2c(&pcdev->notifier,
|
||||
pcdev->pdata->sensor_i2c_adapter_id,
|
||||
pcdev->pdata->sensor_i2c_address,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd))
|
||||
err = PTR_ERR(asd);
|
||||
} else if (pdev->dev.of_node) {
|
||||
|
@ -478,7 +478,7 @@ static int cafe_pci_probe(struct pci_dev *pdev,
|
||||
int ret;
|
||||
struct cafe_camera *cam;
|
||||
struct mcam_camera *mcam;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct i2c_client *i2c_dev;
|
||||
|
||||
/*
|
||||
@ -540,7 +540,8 @@ static int cafe_pci_probe(struct pci_dev *pdev,
|
||||
|
||||
asd = v4l2_async_nf_add_i2c(&mcam->notifier,
|
||||
i2c_adapter_id(cam->i2c_adapter),
|
||||
ov7670_info.addr, struct v4l2_async_subdev);
|
||||
ov7670_info.addr,
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
goto out_smbus_shutdown;
|
||||
|
@ -1756,7 +1756,7 @@ EXPORT_SYMBOL_GPL(mccic_irq);
|
||||
*/
|
||||
|
||||
static int mccic_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev, struct v4l2_async_subdev *asd)
|
||||
struct v4l2_subdev *subdev, struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct mcam_camera *cam = notifier_to_mcam(notifier);
|
||||
int ret;
|
||||
@ -1801,7 +1801,7 @@ out:
|
||||
}
|
||||
|
||||
static void mccic_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev, struct v4l2_async_subdev *asd)
|
||||
struct v4l2_subdev *subdev, struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct mcam_camera *cam = notifier_to_mcam(notifier);
|
||||
|
||||
|
@ -180,7 +180,7 @@ static int mmpcam_probe(struct platform_device *pdev)
|
||||
struct resource *res;
|
||||
struct fwnode_handle *ep;
|
||||
struct mmp_camera_platform_data *pdata;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
int ret;
|
||||
|
||||
cam = devm_kzalloc(&pdev->dev, sizeof(*cam), GFP_KERNEL);
|
||||
@ -241,7 +241,7 @@ static int mmpcam_probe(struct platform_device *pdev)
|
||||
v4l2_async_nf_init(&mcam->notifier);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&mcam->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(ep);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
|
@ -476,7 +476,7 @@ static const struct v4l2_subdev_ops csi2dc_subdev_ops = {
|
||||
|
||||
static int csi2dc_async_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct csi2dc_device *csi2dc = container_of(notifier,
|
||||
struct csi2dc_device, notifier);
|
||||
@ -520,14 +520,14 @@ static const struct v4l2_async_notifier_operations csi2dc_async_ops = {
|
||||
static int csi2dc_prepare_notifier(struct csi2dc_device *csi2dc,
|
||||
struct fwnode_handle *input_fwnode)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
int ret = 0;
|
||||
|
||||
v4l2_async_nf_init(&csi2dc->notifier);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&csi2dc->notifier,
|
||||
input_fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
fwnode_handle_put(input_fwnode);
|
||||
|
||||
|
@ -1712,7 +1712,7 @@ static int isc_ctrl_init(struct isc_device *isc)
|
||||
|
||||
static int isc_async_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct isc_device *isc = container_of(notifier->v4l2_dev,
|
||||
struct isc_device, v4l2_dev);
|
||||
@ -1741,7 +1741,7 @@ static int isc_async_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void isc_async_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct isc_device *isc = container_of(notifier->v4l2_dev,
|
||||
struct isc_device, v4l2_dev);
|
||||
|
@ -44,7 +44,7 @@ struct isc_buffer {
|
||||
|
||||
struct isc_subdev_entity {
|
||||
struct v4l2_subdev *sd;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct device_node *epn;
|
||||
struct v4l2_async_notifier notifier;
|
||||
|
||||
|
@ -523,7 +523,7 @@ static int microchip_isc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
list_for_each_entry(subdev_entity, &isc->subdev_entities, list) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *fwnode =
|
||||
of_fwnode_handle(subdev_entity->epn);
|
||||
|
||||
@ -531,7 +531,7 @@ static int microchip_isc_probe(struct platform_device *pdev)
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
|
||||
fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
of_node_put(subdev_entity->epn);
|
||||
subdev_entity->epn = NULL;
|
||||
|
@ -513,7 +513,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
list_for_each_entry(subdev_entity, &isc->subdev_entities, list) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *fwnode =
|
||||
of_fwnode_handle(subdev_entity->epn);
|
||||
|
||||
@ -521,7 +521,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
|
||||
fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
of_node_put(subdev_entity->epn);
|
||||
subdev_entity->epn = NULL;
|
||||
|
@ -1229,7 +1229,7 @@ mipi_notifier_to_csis_state(struct v4l2_async_notifier *n)
|
||||
|
||||
static int mipi_csis_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct mipi_csis_device *csis = mipi_notifier_to_csis_state(notifier);
|
||||
struct media_pad *sink = &csis->sd.entity.pads[CSIS_PAD_SINK];
|
||||
@ -1246,7 +1246,7 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY,
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
@ -1277,7 +1277,7 @@ static int mipi_csis_async_register(struct mipi_csis_device *csis)
|
||||
dev_dbg(csis->dev, "flags: 0x%08x\n", csis->bus.flags);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&csis->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
goto err_parse;
|
||||
|
@ -2032,7 +2032,7 @@ static const struct media_entity_operations imx7_csi_entity_ops = {
|
||||
|
||||
static int imx7_csi_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct imx7_csi *csi = imx7_csi_notifier_to_dev(notifier);
|
||||
struct media_pad *sink = &csi->sd.entity.pads[IMX7_CSI_PAD_SINK];
|
||||
@ -2057,7 +2057,7 @@ static const struct v4l2_async_notifier_operations imx7_csi_notify_ops = {
|
||||
|
||||
static int imx7_csi_async_register(struct imx7_csi *csi)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep;
|
||||
int ret;
|
||||
|
||||
@ -2072,7 +2072,7 @@ static int imx7_csi_async_register(struct imx7_csi *csi)
|
||||
}
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&csi->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
fwnode_handle_put(ep);
|
||||
|
||||
|
@ -30,12 +30,12 @@
|
||||
*/
|
||||
|
||||
struct mxc_isi_async_subdev {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct v4l2_async_connection asd;
|
||||
unsigned int port;
|
||||
};
|
||||
|
||||
static inline struct mxc_isi_async_subdev *
|
||||
asd_to_mxc_isi_async_subdev(struct v4l2_async_subdev *asd)
|
||||
asd_to_mxc_isi_async_subdev(struct v4l2_async_connection *asd)
|
||||
{
|
||||
return container_of(asd, struct mxc_isi_async_subdev, asd);
|
||||
};
|
||||
@ -48,12 +48,12 @@ notifier_to_mxc_isi_dev(struct v4l2_async_notifier *n)
|
||||
|
||||
static int mxc_isi_async_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
const unsigned int link_flags = MEDIA_LNK_FL_IMMUTABLE
|
||||
| MEDIA_LNK_FL_ENABLED;
|
||||
struct mxc_isi_dev *isi = notifier_to_mxc_isi_dev(notifier);
|
||||
struct mxc_isi_async_subdev *masd = asd_to_mxc_isi_async_subdev(asd);
|
||||
struct mxc_isi_async_subdev *masd = asd_to_mxc_isi_async_subdev(asc);
|
||||
struct media_pad *pad = &isi->crossbar.pads[masd->port];
|
||||
struct device_link *link;
|
||||
|
||||
|
@ -567,7 +567,7 @@ mipi_notifier_to_csi2_state(struct v4l2_async_notifier *n)
|
||||
|
||||
static int imx8mq_mipi_csi_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct csi_state *state = mipi_notifier_to_csi2_state(notifier);
|
||||
struct media_pad *sink = &state->sd.entity.pads[MIPI_CSI2_PAD_SINK];
|
||||
@ -587,7 +587,7 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY,
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
@ -619,7 +619,7 @@ static int imx8mq_mipi_csi_async_register(struct csi_state *state)
|
||||
state->bus.flags);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&state->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
goto err_parse;
|
||||
|
@ -1383,7 +1383,7 @@ static void camss_unregister_entities(struct camss *camss)
|
||||
|
||||
static int camss_subdev_notifier_bound(struct v4l2_async_notifier *async,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct camss *camss = container_of(async, struct camss, notifier);
|
||||
struct camss_async_subdev *csd =
|
||||
|
@ -113,7 +113,7 @@ struct camss_camera_interface {
|
||||
};
|
||||
|
||||
struct camss_async_subdev {
|
||||
struct v4l2_async_subdev asd; /* must be first */
|
||||
struct v4l2_async_connection asd; /* must be first */
|
||||
struct camss_camera_interface interface;
|
||||
};
|
||||
|
||||
|
@ -326,7 +326,7 @@ static const struct v4l2_subdev_ops rcar_isp_subdev_ops = {
|
||||
|
||||
static int risp_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rcar_isp *isp = notifier_to_isp(notifier);
|
||||
int pad;
|
||||
@ -350,7 +350,7 @@ static int risp_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void risp_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rcar_isp *isp = notifier_to_isp(notifier);
|
||||
|
||||
@ -366,7 +366,7 @@ static const struct v4l2_async_notifier_operations risp_notify_ops = {
|
||||
|
||||
static int risp_parse_dt(struct rcar_isp *isp)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *fwnode;
|
||||
struct fwnode_handle *ep;
|
||||
unsigned int id;
|
||||
@ -396,7 +396,7 @@ static int risp_parse_dt(struct rcar_isp *isp)
|
||||
isp->notifier.ops = &risp_notify_ops;
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(&isp->notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(fwnode);
|
||||
if (IS_ERR(asd))
|
||||
return PTR_ERR(asd);
|
||||
|
@ -251,7 +251,7 @@ static int rvin_group_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
|
||||
static void rvin_group_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rvin_dev *vin = v4l2_dev_to_vin(notifier->v4l2_dev);
|
||||
unsigned int i;
|
||||
@ -263,7 +263,7 @@ static void rvin_group_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
mutex_lock(&vin->group->lock);
|
||||
|
||||
for (i = 0; i < RVIN_CSI_MAX; i++) {
|
||||
if (vin->group->remotes[i].asd != asd)
|
||||
if (vin->group->remotes[i].asc != asc)
|
||||
continue;
|
||||
vin->group->remotes[i].subdev = NULL;
|
||||
vin_dbg(vin, "Unbind %s from slot %u\n", subdev->name, i);
|
||||
@ -277,7 +277,7 @@ static void rvin_group_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static int rvin_group_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rvin_dev *vin = v4l2_dev_to_vin(notifier->v4l2_dev);
|
||||
unsigned int i;
|
||||
@ -285,7 +285,7 @@ static int rvin_group_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
mutex_lock(&vin->group->lock);
|
||||
|
||||
for (i = 0; i < RVIN_CSI_MAX; i++) {
|
||||
if (vin->group->remotes[i].asd != asd)
|
||||
if (vin->group->remotes[i].asc != asc)
|
||||
continue;
|
||||
vin->group->remotes[i].subdev = subdev;
|
||||
vin_dbg(vin, "Bound %s to slot %u\n", subdev->name, i);
|
||||
@ -310,7 +310,7 @@ static int rvin_group_parse_of(struct rvin_dev *vin, unsigned int port,
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY,
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
int ret;
|
||||
|
||||
ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(vin->dev), port, id, 0);
|
||||
@ -326,14 +326,14 @@ static int rvin_group_parse_of(struct rvin_dev *vin, unsigned int port,
|
||||
goto out;
|
||||
}
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(&vin->group->notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
asc = v4l2_async_nf_add_fwnode(&vin->group->notifier, fwnode,
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asc)) {
|
||||
ret = PTR_ERR(asc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
vin->group->remotes[vep.base.id].asd = asd;
|
||||
vin->group->remotes[vep.base.id].asc = asc;
|
||||
|
||||
vin_dbg(vin, "Add group OF device %pOF to slot %u\n",
|
||||
to_of_node(fwnode), vep.base.id);
|
||||
@ -386,7 +386,7 @@ static int rvin_group_notifier_init(struct rvin_dev *vin, unsigned int port,
|
||||
continue;
|
||||
|
||||
for (id = 0; id < max_id; id++) {
|
||||
if (vin->group->remotes[id].asd)
|
||||
if (vin->group->remotes[id].asc)
|
||||
continue;
|
||||
|
||||
ret = rvin_group_parse_of(vin->group->vin[i], port, id);
|
||||
@ -395,7 +395,7 @@ static int rvin_group_notifier_init(struct rvin_dev *vin, unsigned int port,
|
||||
}
|
||||
}
|
||||
|
||||
if (list_empty(&vin->group->notifier.asd_list))
|
||||
if (list_empty(&vin->group->notifier.asc_list))
|
||||
return 0;
|
||||
|
||||
vin->group->notifier.ops = &rvin_group_notify_ops;
|
||||
@ -610,7 +610,7 @@ static int rvin_parallel_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
|
||||
static void rvin_parallel_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rvin_dev *vin = v4l2_dev_to_vin(notifier->v4l2_dev);
|
||||
|
||||
@ -623,7 +623,7 @@ static void rvin_parallel_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static int rvin_parallel_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rvin_dev *vin = v4l2_dev_to_vin(notifier->v4l2_dev);
|
||||
int ret;
|
||||
@ -655,7 +655,7 @@ static int rvin_parallel_parse_of(struct rvin_dev *vin)
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_UNKNOWN,
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
int ret;
|
||||
|
||||
ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(vin->dev), 0, 0, 0);
|
||||
@ -686,14 +686,14 @@ static int rvin_parallel_parse_of(struct rvin_dev *vin)
|
||||
goto out;
|
||||
}
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(&vin->notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
asc = v4l2_async_nf_add_fwnode(&vin->notifier, fwnode,
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asc)) {
|
||||
ret = PTR_ERR(asc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
vin->parallel.asd = asd;
|
||||
vin->parallel.asc = asc;
|
||||
|
||||
vin_dbg(vin, "Add parallel OF device %pOF\n", to_of_node(fwnode));
|
||||
out:
|
||||
@ -718,11 +718,11 @@ static int rvin_parallel_init(struct rvin_dev *vin)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!vin->parallel.asd)
|
||||
if (!vin->parallel.asc)
|
||||
return -ENODEV;
|
||||
|
||||
vin_dbg(vin, "Found parallel subdevice %pOF\n",
|
||||
to_of_node(vin->parallel.asd->match.fwnode));
|
||||
to_of_node(vin->parallel.asc->match.fwnode));
|
||||
|
||||
vin->notifier.ops = &rvin_parallel_notify_ops;
|
||||
ret = v4l2_async_nf_register(&vin->v4l2_dev, &vin->notifier);
|
||||
|
@ -988,12 +988,12 @@ static irqreturn_t rcsi2_irq_thread(int irq, void *data)
|
||||
|
||||
static int rcsi2_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rcar_csi2 *priv = notifier_to_csi2(notifier);
|
||||
int pad;
|
||||
|
||||
pad = media_entity_get_fwnode_pad(&subdev->entity, asd->match.fwnode,
|
||||
pad = media_entity_get_fwnode_pad(&subdev->entity, asc->match.fwnode,
|
||||
MEDIA_PAD_FL_SOURCE);
|
||||
if (pad < 0) {
|
||||
dev_err(priv->dev, "Failed to find pad for %s\n", subdev->name);
|
||||
@ -1013,7 +1013,7 @@ static int rcsi2_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void rcsi2_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rcar_csi2 *priv = notifier_to_csi2(notifier);
|
||||
|
||||
@ -1090,7 +1090,7 @@ static int rcsi2_parse_v4l2(struct rcar_csi2 *priv,
|
||||
|
||||
static int rcsi2_parse_dt(struct rcar_csi2 *priv)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
struct fwnode_handle *fwnode;
|
||||
struct fwnode_handle *ep;
|
||||
struct v4l2_fwnode_endpoint v4l2_ep = {
|
||||
@ -1125,11 +1125,11 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv)
|
||||
v4l2_async_nf_init(&priv->notifier);
|
||||
priv->notifier.ops = &rcar_csi2_notify_ops;
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
asc = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode,
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(fwnode);
|
||||
if (IS_ERR(asd))
|
||||
return PTR_ERR(asd);
|
||||
if (IS_ERR(asc))
|
||||
return PTR_ERR(asc);
|
||||
|
||||
ret = v4l2_async_subdev_nf_register(&priv->subdev, &priv->notifier);
|
||||
if (ret)
|
||||
|
@ -106,7 +106,7 @@ struct rvin_video_format {
|
||||
|
||||
/**
|
||||
* struct rvin_parallel_entity - Parallel video input endpoint descriptor
|
||||
* @asd: sub-device descriptor for async framework
|
||||
* @asc: async connection descriptor for async framework
|
||||
* @subdev: subdevice matched using async framework
|
||||
* @mbus_type: media bus type
|
||||
* @bus: media bus parallel configuration
|
||||
@ -115,7 +115,7 @@ struct rvin_video_format {
|
||||
*
|
||||
*/
|
||||
struct rvin_parallel_entity {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
struct v4l2_subdev *subdev;
|
||||
|
||||
enum v4l2_mbus_type mbus_type;
|
||||
@ -272,10 +272,10 @@ struct rvin_dev {
|
||||
*
|
||||
* @lock: protects the count, notifier, vin and csi members
|
||||
* @count: number of enabled VIN instances found in DT
|
||||
* @notifier: group notifier for CSI-2 async subdevices
|
||||
* @notifier: group notifier for CSI-2 async connections
|
||||
* @vin: VIN instances which are part of the group
|
||||
* @link_setup: Callback to create all links for the media graph
|
||||
* @remotes: array of pairs of fwnode and subdev pointers
|
||||
* @remotes: array of pairs of async connection and subdev pointers
|
||||
* to all remote subdevices.
|
||||
*/
|
||||
struct rvin_group {
|
||||
@ -291,7 +291,7 @@ struct rvin_group {
|
||||
int (*link_setup)(struct rvin_dev *vin);
|
||||
|
||||
struct {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
struct v4l2_subdev *subdev;
|
||||
} remotes[RVIN_REMOTES_MAX];
|
||||
};
|
||||
|
@ -1098,7 +1098,7 @@ static void rcar_drif_sdr_unregister(struct rcar_drif_sdr *sdr)
|
||||
/* Sub-device bound callback */
|
||||
static int rcar_drif_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rcar_drif_sdr *sdr =
|
||||
container_of(notifier, struct rcar_drif_sdr, notifier);
|
||||
@ -1113,7 +1113,7 @@ static int rcar_drif_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
/* Sub-device unbind callback */
|
||||
static void rcar_drif_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rcar_drif_sdr *sdr =
|
||||
container_of(notifier, struct rcar_drif_sdr, notifier);
|
||||
@ -1206,7 +1206,7 @@ static int rcar_drif_parse_subdevs(struct rcar_drif_sdr *sdr)
|
||||
{
|
||||
struct v4l2_async_notifier *notifier = &sdr->notifier;
|
||||
struct fwnode_handle *fwnode, *ep;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
|
||||
v4l2_async_nf_init(notifier);
|
||||
|
||||
@ -1226,7 +1226,7 @@ static int rcar_drif_parse_subdevs(struct rcar_drif_sdr *sdr)
|
||||
}
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(fwnode);
|
||||
if (IS_ERR(asd))
|
||||
return PTR_ERR(asd);
|
||||
|
@ -151,7 +151,7 @@ static inline struct ceu_buffer *vb2_to_ceu(struct vb2_v4l2_buffer *vbuf)
|
||||
* ceu_subdev - Wraps v4l2 sub-device and provides async subdevice.
|
||||
*/
|
||||
struct ceu_subdev {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct v4l2_async_connection asd;
|
||||
struct v4l2_subdev *v4l2_sd;
|
||||
|
||||
/* per-subdevice mbus configuration options */
|
||||
@ -159,7 +159,7 @@ struct ceu_subdev {
|
||||
struct ceu_mbus_fmt mbus_fmt;
|
||||
};
|
||||
|
||||
static struct ceu_subdev *to_ceu_subdev(struct v4l2_async_subdev *asd)
|
||||
static struct ceu_subdev *to_ceu_subdev(struct v4l2_async_connection *asd)
|
||||
{
|
||||
return container_of(asd, struct ceu_subdev, asd);
|
||||
}
|
||||
@ -1374,7 +1374,7 @@ static void ceu_vdev_release(struct video_device *vdev)
|
||||
|
||||
static int ceu_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *v4l2_sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct v4l2_device *v4l2_dev = notifier->v4l2_dev;
|
||||
struct ceu_device *ceudev = v4l2_to_ceu(v4l2_dev);
|
||||
|
@ -92,7 +92,7 @@ static int rzg2l_cru_group_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
|
||||
static void rzg2l_cru_group_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rzg2l_cru_dev *cru = notifier_to_cru(notifier);
|
||||
|
||||
@ -110,7 +110,7 @@ static void rzg2l_cru_group_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static int rzg2l_cru_group_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rzg2l_cru_dev *cru = notifier_to_cru(notifier);
|
||||
|
||||
@ -138,7 +138,7 @@ static int rzg2l_cru_mc_parse_of(struct rzg2l_cru_dev *cru)
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY,
|
||||
};
|
||||
struct fwnode_handle *ep, *fwnode;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
int ret;
|
||||
|
||||
ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(cru->dev), 1, 0, 0);
|
||||
@ -162,7 +162,7 @@ static int rzg2l_cru_mc_parse_of(struct rzg2l_cru_dev *cru)
|
||||
}
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(&cru->notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
goto out;
|
||||
@ -190,7 +190,7 @@ static int rzg2l_cru_mc_parse_of_graph(struct rzg2l_cru_dev *cru)
|
||||
|
||||
cru->notifier.ops = &rzg2l_cru_async_ops;
|
||||
|
||||
if (list_empty(&cru->notifier.asd_list))
|
||||
if (list_empty(&cru->notifier.asc_list))
|
||||
return 0;
|
||||
|
||||
ret = v4l2_async_nf_register(&cru->v4l2_dev, &cru->notifier);
|
||||
|
@ -45,7 +45,7 @@ enum rzg2l_cru_dma_state {
|
||||
};
|
||||
|
||||
struct rzg2l_cru_csi {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct v4l2_subdev *subdev;
|
||||
u32 channel;
|
||||
};
|
||||
|
@ -599,7 +599,7 @@ static const struct v4l2_subdev_ops rzg2l_csi2_subdev_ops = {
|
||||
|
||||
static int rzg2l_csi2_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rzg2l_csi2 *csi2 = notifier_to_csi2(notifier);
|
||||
|
||||
@ -615,7 +615,7 @@ static int rzg2l_csi2_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void rzg2l_csi2_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct rzg2l_csi2 *csi2 = notifier_to_csi2(notifier);
|
||||
|
||||
@ -646,7 +646,7 @@ static int rzg2l_csi2_parse_dt(struct rzg2l_csi2 *csi2)
|
||||
struct v4l2_fwnode_endpoint v4l2_ep = {
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *fwnode;
|
||||
struct fwnode_handle *ep;
|
||||
int ret;
|
||||
@ -677,7 +677,7 @@ static int rzg2l_csi2_parse_dt(struct rzg2l_csi2 *csi2)
|
||||
csi2->notifier.ops = &rzg2l_csi2_notify_ops;
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(&csi2->notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(fwnode);
|
||||
if (IS_ERR(asd))
|
||||
return PTR_ERR(asd);
|
||||
|
@ -148,7 +148,7 @@ struct rkisp1_info {
|
||||
* @port: port number (0: MIPI, 1: Parallel)
|
||||
*/
|
||||
struct rkisp1_sensor_async {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct v4l2_async_connection asd;
|
||||
unsigned int index;
|
||||
struct fwnode_handle *source_ep;
|
||||
unsigned int lanes;
|
||||
|
@ -122,12 +122,12 @@ struct rkisp1_isr_data {
|
||||
|
||||
static int rkisp1_subdev_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rkisp1_device *rkisp1 =
|
||||
container_of(notifier, struct rkisp1_device, notifier);
|
||||
struct rkisp1_sensor_async *s_asd =
|
||||
container_of(asd, struct rkisp1_sensor_async, asd);
|
||||
container_of(asc, struct rkisp1_sensor_async, asd);
|
||||
int source_pad;
|
||||
int ret;
|
||||
|
||||
@ -165,10 +165,10 @@ static int rkisp1_subdev_notifier_complete(struct v4l2_async_notifier *notifier)
|
||||
return v4l2_device_register_subdev_nodes(&rkisp1->v4l2_dev);
|
||||
}
|
||||
|
||||
static void rkisp1_subdev_notifier_destroy(struct v4l2_async_subdev *asd)
|
||||
static void rkisp1_subdev_notifier_destroy(struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct rkisp1_sensor_async *rk_asd =
|
||||
container_of(asd, struct rkisp1_sensor_async, asd);
|
||||
container_of(asc, struct rkisp1_sensor_async, asd);
|
||||
|
||||
fwnode_handle_put(rk_asd->source_ep);
|
||||
}
|
||||
|
@ -400,7 +400,7 @@ static int fimc_md_parse_one_endpoint(struct fimc_md *fmd,
|
||||
int index = fmd->num_sensors;
|
||||
struct fimc_source_info *pd = &fmd->sensor[index].pdata;
|
||||
struct device_node *rem, *np;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct v4l2_fwnode_endpoint endpoint = { .bus_type = 0 };
|
||||
int ret;
|
||||
|
||||
@ -465,7 +465,7 @@ static int fimc_md_parse_one_endpoint(struct fimc_md *fmd,
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&fmd->subdev_notifier,
|
||||
of_fwnode_handle(ep),
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
of_node_put(ep);
|
||||
|
||||
@ -1371,7 +1371,7 @@ err:
|
||||
|
||||
static int subdev_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct fimc_md *fmd = notifier_to_fimc_md(notifier);
|
||||
struct fimc_sensor_info *si = NULL;
|
||||
|
@ -82,7 +82,7 @@ struct fimc_camclk_info {
|
||||
*/
|
||||
struct fimc_sensor_info {
|
||||
struct fimc_source_info pdata;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct v4l2_subdev *subdev;
|
||||
struct fimc_dev *host;
|
||||
};
|
||||
|
@ -1837,7 +1837,7 @@ static int dcmi_graph_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
|
||||
static void dcmi_graph_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct stm32_dcmi *dcmi = notifier_to_dcmi(notifier);
|
||||
|
||||
@ -1849,7 +1849,7 @@ static void dcmi_graph_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static int dcmi_graph_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct stm32_dcmi *dcmi = notifier_to_dcmi(notifier);
|
||||
unsigned int ret;
|
||||
@ -1887,7 +1887,7 @@ static const struct v4l2_async_notifier_operations dcmi_graph_notify_ops = {
|
||||
|
||||
static int dcmi_graph_init(struct stm32_dcmi *dcmi)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct device_node *ep;
|
||||
int ret;
|
||||
|
||||
@ -1901,7 +1901,7 @@ static int dcmi_graph_init(struct stm32_dcmi *dcmi)
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&dcmi->notifier,
|
||||
of_fwnode_handle(ep),
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
of_node_put(ep);
|
||||
|
||||
|
@ -41,7 +41,7 @@ static const struct media_entity_operations sun4i_csi_video_entity_ops = {
|
||||
|
||||
static int sun4i_csi_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct sun4i_csi *csi = container_of(notifier, struct sun4i_csi,
|
||||
notifier);
|
||||
@ -117,7 +117,7 @@ static int sun4i_csi_notifier_init(struct sun4i_csi *csi)
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_PARALLEL,
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep;
|
||||
int ret;
|
||||
|
||||
@ -135,7 +135,7 @@ static int sun4i_csi_notifier_init(struct sun4i_csi *csi)
|
||||
csi->bus = vep.bus.parallel;
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&csi->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
goto out;
|
||||
|
@ -642,7 +642,7 @@ static int sun6i_csi_bridge_link(struct sun6i_csi_device *csi_dev,
|
||||
static int
|
||||
sun6i_csi_bridge_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *remote_subdev,
|
||||
struct v4l2_async_subdev *async_subdev)
|
||||
struct v4l2_async_connection *async_subdev)
|
||||
{
|
||||
struct sun6i_csi_device *csi_dev =
|
||||
container_of(notifier, struct sun6i_csi_device,
|
||||
|
@ -34,7 +34,7 @@ struct sun6i_csi_bridge_source {
|
||||
};
|
||||
|
||||
struct sun6i_csi_bridge_async_subdev {
|
||||
struct v4l2_async_subdev async_subdev;
|
||||
struct v4l2_async_connection async_subdev;
|
||||
struct sun6i_csi_bridge_source *source;
|
||||
};
|
||||
|
||||
|
@ -407,7 +407,7 @@ static const struct media_entity_operations sun6i_mipi_csi2_entity_ops = {
|
||||
static int
|
||||
sun6i_mipi_csi2_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *remote_subdev,
|
||||
struct v4l2_async_subdev *async_subdev)
|
||||
struct v4l2_async_connection *async_subdev)
|
||||
{
|
||||
struct v4l2_subdev *subdev = notifier->sd;
|
||||
struct sun6i_mipi_csi2_device *csi2_dev =
|
||||
@ -461,7 +461,7 @@ sun6i_mipi_csi2_bridge_source_setup(struct sun6i_mipi_csi2_device *csi2_dev)
|
||||
{
|
||||
struct v4l2_async_notifier *notifier = &csi2_dev->bridge.notifier;
|
||||
struct v4l2_fwnode_endpoint *endpoint = &csi2_dev->bridge.endpoint;
|
||||
struct v4l2_async_subdev *subdev_async;
|
||||
struct v4l2_async_connection *subdev_async;
|
||||
struct fwnode_handle *handle;
|
||||
struct device *dev = csi2_dev->dev;
|
||||
int ret;
|
||||
@ -479,7 +479,7 @@ sun6i_mipi_csi2_bridge_source_setup(struct sun6i_mipi_csi2_device *csi2_dev)
|
||||
|
||||
subdev_async =
|
||||
v4l2_async_nf_add_fwnode_remote(notifier, handle,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(subdev_async))
|
||||
ret = PTR_ERR(subdev_async);
|
||||
|
||||
|
@ -444,7 +444,7 @@ static const struct media_entity_operations sun8i_a83t_mipi_csi2_entity_ops = {
|
||||
static int
|
||||
sun8i_a83t_mipi_csi2_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *remote_subdev,
|
||||
struct v4l2_async_subdev *async_subdev)
|
||||
struct v4l2_async_connection *async_subdev)
|
||||
{
|
||||
struct v4l2_subdev *subdev = notifier->sd;
|
||||
struct sun8i_a83t_mipi_csi2_device *csi2_dev =
|
||||
@ -498,7 +498,7 @@ sun8i_a83t_mipi_csi2_bridge_source_setup(struct sun8i_a83t_mipi_csi2_device *csi
|
||||
{
|
||||
struct v4l2_async_notifier *notifier = &csi2_dev->bridge.notifier;
|
||||
struct v4l2_fwnode_endpoint *endpoint = &csi2_dev->bridge.endpoint;
|
||||
struct v4l2_async_subdev *subdev_async;
|
||||
struct v4l2_async_connection *subdev_async;
|
||||
struct fwnode_handle *handle;
|
||||
struct device *dev = csi2_dev->dev;
|
||||
int ret;
|
||||
@ -516,7 +516,7 @@ sun8i_a83t_mipi_csi2_bridge_source_setup(struct sun8i_a83t_mipi_csi2_device *csi
|
||||
|
||||
subdev_async =
|
||||
v4l2_async_nf_add_fwnode_remote(notifier, handle,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(subdev_async))
|
||||
ret = PTR_ERR(subdev_async);
|
||||
|
||||
|
@ -2144,7 +2144,7 @@ static const struct v4l2_ioctl_ops vpfe_ioctl_ops = {
|
||||
static int
|
||||
vpfe_async_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct vpfe_device *vpfe = container_of(notifier->v4l2_dev,
|
||||
struct vpfe_device, v4l2_dev);
|
||||
@ -2370,8 +2370,7 @@ vpfe_get_pdata(struct vpfe_device *vpfe)
|
||||
|
||||
pdata->asd[i] = v4l2_async_nf_add_fwnode(&vpfe->notifier,
|
||||
of_fwnode_handle(rem),
|
||||
struct
|
||||
v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
of_node_put(rem);
|
||||
if (IS_ERR(pdata->asd[i]))
|
||||
goto cleanup;
|
||||
|
@ -84,7 +84,7 @@ struct vpfe_config {
|
||||
/* information about each subdev */
|
||||
struct vpfe_subdev_info sub_devs[VPFE_MAX_SUBDEV];
|
||||
/* Flat array, arranged in groups */
|
||||
struct v4l2_async_subdev *asd[VPFE_MAX_SUBDEV];
|
||||
struct v4l2_async_connection *asd[VPFE_MAX_SUBDEV];
|
||||
};
|
||||
|
||||
struct vpfe_cap_buffer {
|
||||
|
@ -774,19 +774,19 @@ static irqreturn_t cal_irq(int irq_cal, void *data)
|
||||
*/
|
||||
|
||||
struct cal_v4l2_async_subdev {
|
||||
struct v4l2_async_subdev asd; /* Must be first */
|
||||
struct v4l2_async_connection asd; /* Must be first */
|
||||
struct cal_camerarx *phy;
|
||||
};
|
||||
|
||||
static inline struct cal_v4l2_async_subdev *
|
||||
to_cal_asd(struct v4l2_async_subdev *asd)
|
||||
to_cal_asd(struct v4l2_async_connection *asd)
|
||||
{
|
||||
return container_of(asd, struct cal_v4l2_async_subdev, asd);
|
||||
}
|
||||
|
||||
static int cal_async_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct cal_camerarx *phy = to_cal_asd(asd)->phy;
|
||||
int pad;
|
||||
|
@ -1363,12 +1363,12 @@ static inline void free_vpif_objs(void)
|
||||
|
||||
static int vpif_async_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < vpif_obj.config->asd_sizes[0]; i++) {
|
||||
struct v4l2_async_subdev *_asd = vpif_obj.config->asd[i];
|
||||
struct v4l2_async_connection *_asd = vpif_obj.config->asd[i];
|
||||
const struct fwnode_handle *fwnode = _asd->match.fwnode;
|
||||
|
||||
if (fwnode == subdev->fwnode) {
|
||||
@ -1570,8 +1570,7 @@ vpif_capture_get_pdata(struct platform_device *pdev)
|
||||
|
||||
pdata->asd[i] = v4l2_async_nf_add_fwnode(&vpif_obj.notifier,
|
||||
of_fwnode_handle(rem),
|
||||
struct
|
||||
v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(pdata->asd[i]))
|
||||
goto err_cleanup;
|
||||
|
||||
|
@ -2024,12 +2024,12 @@ enum isp_of_phy {
|
||||
|
||||
static int isp_subdev_notifier_bound(struct v4l2_async_notifier *async,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct isp_device *isp = container_of(async, struct isp_device,
|
||||
notifier);
|
||||
struct isp_bus_cfg *bus_cfg =
|
||||
&container_of(asd, struct isp_async_subdev, asd)->bus;
|
||||
&container_of(asc, struct isp_async_subdev, asd)->bus;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&isp->media_dev.graph_mutex);
|
||||
|
@ -220,7 +220,7 @@ struct isp_device {
|
||||
};
|
||||
|
||||
struct isp_async_subdev {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct v4l2_async_connection asd;
|
||||
struct isp_bus_cfg bus;
|
||||
};
|
||||
|
||||
|
@ -314,7 +314,7 @@ static const struct v4l2_subdev_ops video_mux_subdev_ops = {
|
||||
|
||||
static int video_mux_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct video_mux *vmux = notifier_to_video_mux(notifier);
|
||||
|
||||
@ -334,7 +334,7 @@ static int video_mux_async_register(struct video_mux *vmux,
|
||||
v4l2_async_nf_init(&vmux->notifier);
|
||||
|
||||
for (i = 0; i < num_input_pads; i++) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep, *remote_ep;
|
||||
|
||||
ep = fwnode_graph_get_endpoint_by_id(
|
||||
@ -352,7 +352,7 @@ static int video_mux_async_register(struct video_mux *vmux,
|
||||
fwnode_handle_put(remote_ep);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&vmux->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
fwnode_handle_put(ep);
|
||||
|
||||
|
@ -34,13 +34,13 @@
|
||||
* @subdev: V4L2 subdev
|
||||
*/
|
||||
struct xvip_graph_entity {
|
||||
struct v4l2_async_subdev asd; /* must be first */
|
||||
struct v4l2_async_connection asd; /* must be first */
|
||||
struct media_entity *entity;
|
||||
struct v4l2_subdev *subdev;
|
||||
};
|
||||
|
||||
static inline struct xvip_graph_entity *
|
||||
to_xvip_entity(struct v4l2_async_subdev *asd)
|
||||
to_xvip_entity(struct v4l2_async_connection *asd)
|
||||
{
|
||||
return container_of(asd, struct xvip_graph_entity, asd);
|
||||
}
|
||||
@ -54,9 +54,9 @@ xvip_graph_find_entity(struct xvip_composite_device *xdev,
|
||||
const struct fwnode_handle *fwnode)
|
||||
{
|
||||
struct xvip_graph_entity *entity;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
|
||||
list_for_each_entry(asd, &xdev->notifier.asd_list, asd_entry) {
|
||||
list_for_each_entry(asd, &xdev->notifier.asc_list, asc_entry) {
|
||||
entity = to_xvip_entity(asd);
|
||||
if (entity->asd.match.fwnode == fwnode)
|
||||
return entity;
|
||||
@ -285,13 +285,13 @@ static int xvip_graph_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
struct xvip_composite_device *xdev =
|
||||
container_of(notifier, struct xvip_composite_device, notifier);
|
||||
struct xvip_graph_entity *entity;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
int ret;
|
||||
|
||||
dev_dbg(xdev->dev, "notify complete, all subdevs registered\n");
|
||||
|
||||
/* Create links for every entity. */
|
||||
list_for_each_entry(asd, &xdev->notifier.asd_list, asd_entry) {
|
||||
list_for_each_entry(asd, &xdev->notifier.asc_list, asc_entry) {
|
||||
entity = to_xvip_entity(asd);
|
||||
ret = xvip_graph_build_one(xdev, entity);
|
||||
if (ret < 0)
|
||||
@ -312,9 +312,9 @@ static int xvip_graph_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
|
||||
static int xvip_graph_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct xvip_graph_entity *entity = to_xvip_entity(asd);
|
||||
struct xvip_graph_entity *entity = to_xvip_entity(asc);
|
||||
|
||||
entity->entity = &subdev->entity;
|
||||
entity->subdev = subdev;
|
||||
@ -380,7 +380,7 @@ err_notifier_cleanup:
|
||||
static int xvip_graph_parse(struct xvip_composite_device *xdev)
|
||||
{
|
||||
struct xvip_graph_entity *entity;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
@ -393,7 +393,7 @@ static int xvip_graph_parse(struct xvip_composite_device *xdev)
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
list_for_each_entry(asd, &xdev->notifier.asd_list, asd_entry) {
|
||||
list_for_each_entry(asd, &xdev->notifier.asc_list, asc_entry) {
|
||||
entity = to_xvip_entity(asd);
|
||||
ret = xvip_graph_parse_one(xdev, entity->asd.match.fwnode);
|
||||
if (ret < 0) {
|
||||
@ -501,7 +501,7 @@ static int xvip_graph_init(struct xvip_composite_device *xdev)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (list_empty(&xdev->notifier.asd_list)) {
|
||||
if (list_empty(&xdev->notifier.asc_list)) {
|
||||
dev_err(xdev->dev, "no subdev found in graph\n");
|
||||
ret = -ENOENT;
|
||||
goto done;
|
||||
|
@ -28,22 +28,22 @@
|
||||
|
||||
static int v4l2_async_nf_call_bound(struct v4l2_async_notifier *n,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
if (!n->ops || !n->ops->bound)
|
||||
return 0;
|
||||
|
||||
return n->ops->bound(n, subdev, asd);
|
||||
return n->ops->bound(n, subdev, asc);
|
||||
}
|
||||
|
||||
static void v4l2_async_nf_call_unbind(struct v4l2_async_notifier *n,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
if (!n->ops || !n->ops->unbind)
|
||||
return;
|
||||
|
||||
n->ops->unbind(n, subdev, asd);
|
||||
n->ops->unbind(n, subdev, asc);
|
||||
}
|
||||
|
||||
static int v4l2_async_nf_call_complete(struct v4l2_async_notifier *n)
|
||||
@ -55,12 +55,12 @@ 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_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
if (!n->ops || !n->ops->destroy)
|
||||
return;
|
||||
|
||||
n->ops->destroy(asd);
|
||||
n->ops->destroy(asc);
|
||||
}
|
||||
|
||||
static bool match_i2c(struct v4l2_async_notifier *notifier,
|
||||
@ -151,18 +151,18 @@ static LIST_HEAD(subdev_list);
|
||||
static LIST_HEAD(notifier_list);
|
||||
static DEFINE_MUTEX(list_lock);
|
||||
|
||||
static struct v4l2_async_subdev *
|
||||
static struct v4l2_async_connection *
|
||||
v4l2_async_find_match(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd)
|
||||
{
|
||||
bool (*match)(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_match_desc *match);
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
|
||||
list_for_each_entry(asd, ¬ifier->waiting_list, waiting_entry) {
|
||||
list_for_each_entry(asc, ¬ifier->waiting_list, waiting_entry) {
|
||||
/* bus_type has been verified valid before */
|
||||
switch (asd->match.type) {
|
||||
switch (asc->match.type) {
|
||||
case V4L2_ASYNC_MATCH_TYPE_I2C:
|
||||
match = match_i2c;
|
||||
break;
|
||||
@ -176,8 +176,8 @@ v4l2_async_find_match(struct v4l2_async_notifier *notifier,
|
||||
}
|
||||
|
||||
/* match cannot be NULL here */
|
||||
if (match(notifier, sd, &asd->match))
|
||||
return asd;
|
||||
if (match(notifier, sd, &asc->match))
|
||||
return asc;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -310,7 +310,7 @@ static int v4l2_async_create_ancillary_links(struct v4l2_async_notifier *n,
|
||||
static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_device *v4l2_dev,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
struct v4l2_async_notifier *subdev_notifier;
|
||||
int ret;
|
||||
@ -319,7 +319,7 @@ static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = v4l2_async_nf_call_bound(notifier, sd, asd);
|
||||
ret = v4l2_async_nf_call_bound(notifier, sd, asc);
|
||||
if (ret < 0) {
|
||||
v4l2_device_unregister_subdev(sd);
|
||||
return ret;
|
||||
@ -333,13 +333,13 @@ static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier,
|
||||
*/
|
||||
ret = v4l2_async_create_ancillary_links(notifier, sd);
|
||||
if (ret) {
|
||||
v4l2_async_nf_call_unbind(notifier, sd, asd);
|
||||
v4l2_async_nf_call_unbind(notifier, sd, asc);
|
||||
v4l2_device_unregister_subdev(sd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
list_del(&asd->waiting_entry);
|
||||
sd->asd = asd;
|
||||
list_del(&asc->waiting_entry);
|
||||
sd->asd = asc;
|
||||
sd->notifier = notifier;
|
||||
|
||||
/* Move from the global subdevice list to notifier's done */
|
||||
@ -380,17 +380,17 @@ v4l2_async_nf_try_all_subdevs(struct v4l2_async_notifier *notifier)
|
||||
|
||||
again:
|
||||
list_for_each_entry(sd, &subdev_list, async_list) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
int ret;
|
||||
|
||||
asd = v4l2_async_find_match(notifier, sd);
|
||||
if (!asd)
|
||||
asc = v4l2_async_find_match(notifier, sd);
|
||||
if (!asc)
|
||||
continue;
|
||||
|
||||
dev_dbg(notifier_dev(notifier),
|
||||
"v4l2-async: match found, subdev %s\n", sd->name);
|
||||
|
||||
ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, asd);
|
||||
ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, asc);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@ -448,11 +448,11 @@ static bool
|
||||
v4l2_async_nf_has_async_match_entry(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_async_match_desc *match)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
struct v4l2_subdev *sd;
|
||||
|
||||
list_for_each_entry(asd, ¬ifier->waiting_list, waiting_entry)
|
||||
if (v4l2_async_match_equal(&asd->match, match))
|
||||
list_for_each_entry(asc, ¬ifier->waiting_list, waiting_entry)
|
||||
if (v4l2_async_match_equal(&asc->match, match))
|
||||
return true;
|
||||
|
||||
list_for_each_entry(sd, ¬ifier->done_list, async_list) {
|
||||
@ -477,19 +477,19 @@ v4l2_async_nf_has_async_match(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_async_match_desc *match,
|
||||
bool skip_self)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
|
||||
lockdep_assert_held(&list_lock);
|
||||
|
||||
/* Check that an asd is not being added more than once. */
|
||||
list_for_each_entry(asd, ¬ifier->asd_list, asd_entry) {
|
||||
if (skip_self && &asd->match == match)
|
||||
list_for_each_entry(asc, ¬ifier->asc_list, asc_entry) {
|
||||
if (skip_self && &asc->match == match)
|
||||
continue;
|
||||
if (v4l2_async_match_equal(&asd->match, match))
|
||||
if (v4l2_async_match_equal(&asc->match, match))
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Check that an asd does not exist in other notifiers. */
|
||||
/* Check that an asc does not exist in other notifiers. */
|
||||
list_for_each_entry(notifier, ¬ifier_list, notifier_entry)
|
||||
if (v4l2_async_nf_has_async_match_entry(notifier, match))
|
||||
return true;
|
||||
@ -523,13 +523,13 @@ static int v4l2_async_nf_match_valid(struct v4l2_async_notifier *notifier,
|
||||
|
||||
void v4l2_async_nf_init(struct v4l2_async_notifier *notifier)
|
||||
{
|
||||
INIT_LIST_HEAD(¬ifier->asd_list);
|
||||
INIT_LIST_HEAD(¬ifier->asc_list);
|
||||
}
|
||||
EXPORT_SYMBOL(v4l2_async_nf_init);
|
||||
|
||||
static int __v4l2_async_nf_register(struct v4l2_async_notifier *notifier)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
int ret;
|
||||
|
||||
INIT_LIST_HEAD(¬ifier->waiting_list);
|
||||
@ -537,12 +537,12 @@ static int __v4l2_async_nf_register(struct v4l2_async_notifier *notifier)
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each_entry(asd, ¬ifier->asd_list, asd_entry) {
|
||||
ret = v4l2_async_nf_match_valid(notifier, &asd->match, true);
|
||||
list_for_each_entry(asc, ¬ifier->asc_list, asc_entry) {
|
||||
ret = v4l2_async_nf_match_valid(notifier, &asc->match, true);
|
||||
if (ret)
|
||||
goto err_unlock;
|
||||
|
||||
list_add_tail(&asd->waiting_entry, ¬ifier->waiting_list);
|
||||
list_add_tail(&asc->waiting_entry, ¬ifier->waiting_list);
|
||||
}
|
||||
|
||||
ret = v4l2_async_nf_try_all_subdevs(notifier);
|
||||
@ -634,23 +634,23 @@ EXPORT_SYMBOL(v4l2_async_nf_unregister);
|
||||
|
||||
static void __v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)
|
||||
{
|
||||
struct v4l2_async_subdev *asd, *tmp;
|
||||
struct v4l2_async_connection *asc, *tmp;
|
||||
|
||||
if (!notifier || !notifier->asd_list.next)
|
||||
if (!notifier || !notifier->asc_list.next)
|
||||
return;
|
||||
|
||||
list_for_each_entry_safe(asd, tmp, ¬ifier->asd_list, asd_entry) {
|
||||
switch (asd->match.type) {
|
||||
list_for_each_entry_safe(asc, tmp, ¬ifier->asc_list, asc_entry) {
|
||||
switch (asc->match.type) {
|
||||
case V4L2_ASYNC_MATCH_TYPE_FWNODE:
|
||||
fwnode_handle_put(asd->match.fwnode);
|
||||
fwnode_handle_put(asc->match.fwnode);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
list_del(&asd->asd_entry);
|
||||
v4l2_async_nf_call_destroy(notifier, asd);
|
||||
kfree(asd);
|
||||
list_del(&asc->asc_entry);
|
||||
v4l2_async_nf_call_destroy(notifier, asc);
|
||||
kfree(asc);
|
||||
}
|
||||
}
|
||||
|
||||
@ -664,95 +664,94 @@ void v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(v4l2_async_nf_cleanup);
|
||||
|
||||
|
||||
static int __v4l2_async_nf_add_subdev(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_async_subdev *asd)
|
||||
static int __v4l2_async_nf_add_connection(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_async_connection *asc)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
ret = v4l2_async_nf_match_valid(notifier, &asd->match, false);
|
||||
ret = v4l2_async_nf_match_valid(notifier, &asc->match, false);
|
||||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
list_add_tail(&asd->asd_entry, ¬ifier->asd_list);
|
||||
list_add_tail(&asc->asc_entry, ¬ifier->asc_list);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&list_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct v4l2_async_subdev *
|
||||
struct v4l2_async_connection *
|
||||
__v4l2_async_nf_add_fwnode(struct v4l2_async_notifier *notifier,
|
||||
struct fwnode_handle *fwnode,
|
||||
unsigned int asd_struct_size)
|
||||
unsigned int asc_struct_size)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
int ret;
|
||||
|
||||
asd = kzalloc(asd_struct_size, GFP_KERNEL);
|
||||
if (!asd)
|
||||
asc = kzalloc(asc_struct_size, GFP_KERNEL);
|
||||
if (!asc)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
asd->match.type = V4L2_ASYNC_MATCH_TYPE_FWNODE;
|
||||
asd->match.fwnode = fwnode_handle_get(fwnode);
|
||||
asc->match.type = V4L2_ASYNC_MATCH_TYPE_FWNODE;
|
||||
asc->match.fwnode = fwnode_handle_get(fwnode);
|
||||
|
||||
ret = __v4l2_async_nf_add_subdev(notifier, asd);
|
||||
ret = __v4l2_async_nf_add_connection(notifier, asc);
|
||||
if (ret) {
|
||||
fwnode_handle_put(fwnode);
|
||||
kfree(asd);
|
||||
kfree(asc);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
return asd;
|
||||
return asc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_async_nf_add_fwnode);
|
||||
|
||||
struct v4l2_async_subdev *
|
||||
struct v4l2_async_connection *
|
||||
__v4l2_async_nf_add_fwnode_remote(struct v4l2_async_notifier *notif,
|
||||
struct fwnode_handle *endpoint,
|
||||
unsigned int asd_struct_size)
|
||||
unsigned int asc_struct_size)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
struct fwnode_handle *remote;
|
||||
|
||||
remote = fwnode_graph_get_remote_endpoint(endpoint);
|
||||
if (!remote)
|
||||
return ERR_PTR(-ENOTCONN);
|
||||
|
||||
asd = __v4l2_async_nf_add_fwnode(notif, remote, asd_struct_size);
|
||||
asc = __v4l2_async_nf_add_fwnode(notif, remote, asc_struct_size);
|
||||
/*
|
||||
* Calling __v4l2_async_nf_add_fwnode grabs a refcount,
|
||||
* so drop the one we got in fwnode_graph_get_remote_port_parent.
|
||||
*/
|
||||
fwnode_handle_put(remote);
|
||||
return asd;
|
||||
return asc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_async_nf_add_fwnode_remote);
|
||||
|
||||
struct v4l2_async_subdev *
|
||||
struct v4l2_async_connection *
|
||||
__v4l2_async_nf_add_i2c(struct v4l2_async_notifier *notifier, int adapter_id,
|
||||
unsigned short address, unsigned int asd_struct_size)
|
||||
unsigned short address, unsigned int asc_struct_size)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
int ret;
|
||||
|
||||
asd = kzalloc(asd_struct_size, GFP_KERNEL);
|
||||
if (!asd)
|
||||
asc = kzalloc(asc_struct_size, GFP_KERNEL);
|
||||
if (!asc)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
asd->match.type = V4L2_ASYNC_MATCH_TYPE_I2C;
|
||||
asd->match.i2c.adapter_id = adapter_id;
|
||||
asd->match.i2c.address = address;
|
||||
asc->match.type = V4L2_ASYNC_MATCH_TYPE_I2C;
|
||||
asc->match.i2c.adapter_id = adapter_id;
|
||||
asc->match.i2c.address = address;
|
||||
|
||||
ret = __v4l2_async_nf_add_subdev(notifier, asd);
|
||||
ret = __v4l2_async_nf_add_connection(notifier, asc);
|
||||
if (ret) {
|
||||
kfree(asd);
|
||||
kfree(asc);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
return asd;
|
||||
return asc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__v4l2_async_nf_add_i2c);
|
||||
|
||||
@ -784,16 +783,16 @@ int v4l2_async_register_subdev(struct v4l2_subdev *sd)
|
||||
list_for_each_entry(notifier, ¬ifier_list, notifier_entry) {
|
||||
struct v4l2_device *v4l2_dev =
|
||||
v4l2_async_nf_find_v4l2_dev(notifier);
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
|
||||
if (!v4l2_dev)
|
||||
continue;
|
||||
|
||||
asd = v4l2_async_find_match(notifier, sd);
|
||||
if (!asd)
|
||||
asc = v4l2_async_find_match(notifier, sd);
|
||||
if (!asc)
|
||||
continue;
|
||||
|
||||
ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, asd);
|
||||
ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, asc);
|
||||
if (ret)
|
||||
goto err_unbind;
|
||||
|
||||
@ -898,14 +897,14 @@ v4l2_async_nf_name(struct v4l2_async_notifier *notifier)
|
||||
static int pending_subdevs_show(struct seq_file *s, void *data)
|
||||
{
|
||||
struct v4l2_async_notifier *notif;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asc;
|
||||
|
||||
mutex_lock(&list_lock);
|
||||
|
||||
list_for_each_entry(notif, ¬ifier_list, notifier_entry) {
|
||||
seq_printf(s, "%s:\n", v4l2_async_nf_name(notif));
|
||||
list_for_each_entry(asd, ¬if->waiting_list, waiting_entry)
|
||||
print_waiting_match(s, &asd->match);
|
||||
list_for_each_entry(asc, ¬if->waiting_list, waiting_entry)
|
||||
print_waiting_match(s, &asc->match);
|
||||
}
|
||||
|
||||
mutex_unlock(&list_lock);
|
||||
|
@ -831,10 +831,10 @@ static int v4l2_fwnode_reference_parse(struct device *dev,
|
||||
!(ret = fwnode_property_get_reference_args(dev_fwnode(dev), prop,
|
||||
NULL, 0, index, &args));
|
||||
index++) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(notifier, args.fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(args.fwnode);
|
||||
if (IS_ERR(asd)) {
|
||||
/* not an error if asd already exists */
|
||||
@ -1136,10 +1136,10 @@ v4l2_fwnode_reference_parse_int_props(struct device *dev,
|
||||
props,
|
||||
nprops)));
|
||||
index++) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode(notifier, fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(fwnode);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
|
@ -767,7 +767,7 @@ err_free_bridge:
|
||||
/******* V4L2 sub-device asynchronous registration callbacks***********/
|
||||
|
||||
struct sensor_async_subdev {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct v4l2_async_connection asd;
|
||||
int port;
|
||||
};
|
||||
|
||||
@ -777,7 +777,7 @@ struct sensor_async_subdev {
|
||||
/* .bound() notifier callback when a match is found */
|
||||
static int atomisp_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct atomisp_device *isp = notifier_to_atomisp(notifier);
|
||||
struct sensor_async_subdev *s_asd = to_sensor_asd(asd);
|
||||
@ -799,7 +799,7 @@ static int atomisp_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
/* The .unbind callback */
|
||||
static void atomisp_notifier_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct atomisp_device *isp = notifier_to_atomisp(notifier);
|
||||
struct sensor_async_subdev *s_asd = to_sensor_asd(asd);
|
||||
|
@ -1727,7 +1727,7 @@ static int isc_ctrl_init(struct isc_device *isc)
|
||||
|
||||
static int isc_async_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct isc_device *isc = container_of(notifier->v4l2_dev,
|
||||
struct isc_device, v4l2_dev);
|
||||
@ -1746,7 +1746,7 @@ static int isc_async_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void isc_async_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct isc_device *isc = container_of(notifier->v4l2_dev,
|
||||
struct isc_device, v4l2_dev);
|
||||
|
@ -44,7 +44,7 @@ struct isc_buffer {
|
||||
|
||||
struct isc_subdev_entity {
|
||||
struct v4l2_subdev *sd;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct device_node *epn;
|
||||
struct v4l2_async_notifier notifier;
|
||||
|
||||
|
@ -503,7 +503,7 @@ static int atmel_isc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
list_for_each_entry(subdev_entity, &isc->subdev_entities, list) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *fwnode =
|
||||
of_fwnode_handle(subdev_entity->epn);
|
||||
|
||||
@ -511,7 +511,7 @@ static int atmel_isc_probe(struct platform_device *pdev)
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
|
||||
fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
of_node_put(subdev_entity->epn);
|
||||
subdev_entity->epn = NULL;
|
||||
|
@ -493,7 +493,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
list_for_each_entry(subdev_entity, &isc->subdev_entities, list) {
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *fwnode =
|
||||
of_fwnode_handle(subdev_entity->epn);
|
||||
|
||||
@ -501,7 +501,7 @@ static int microchip_xisc_probe(struct platform_device *pdev)
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&subdev_entity->notifier,
|
||||
fwnode,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
of_node_put(subdev_entity->epn);
|
||||
subdev_entity->epn = NULL;
|
||||
|
@ -1892,7 +1892,7 @@ static const struct v4l2_subdev_internal_ops csi_internal_ops = {
|
||||
|
||||
static int imx_csi_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct csi_priv *priv = notifier_to_dev(notifier);
|
||||
struct media_pad *sink = &priv->sd.entity.pads[CSI_SINK_PAD];
|
||||
@ -1913,7 +1913,7 @@ static const struct v4l2_async_notifier_operations csi_notify_ops = {
|
||||
|
||||
static int imx_csi_async_register(struct csi_priv *priv)
|
||||
{
|
||||
struct v4l2_async_subdev *asd = NULL;
|
||||
struct v4l2_async_connection *asd = NULL;
|
||||
struct fwnode_handle *ep;
|
||||
unsigned int port;
|
||||
int ret;
|
||||
@ -1930,7 +1930,7 @@ static int imx_csi_async_register(struct csi_priv *priv)
|
||||
FWNODE_GRAPH_ENDPOINT_NEXT);
|
||||
if (ep) {
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&priv->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
|
||||
fwnode_handle_put(ep);
|
||||
|
||||
|
@ -384,7 +384,7 @@ int imx_media_dev_notifier_register(struct imx_media_dev *imxmd,
|
||||
int ret;
|
||||
|
||||
/* no subdevs? just bail */
|
||||
if (list_empty(&imxmd->notifier.asd_list)) {
|
||||
if (list_empty(&imxmd->notifier.asc_list)) {
|
||||
v4l2_err(&imxmd->v4l2_dev, "no subdevs\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ static inline struct imx_media_dev *notifier2dev(struct v4l2_async_notifier *n)
|
||||
/* async subdev bound notifier */
|
||||
static int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct imx_media_dev *imxmd = notifier2dev(notifier);
|
||||
int ret;
|
||||
|
@ -19,7 +19,7 @@
|
||||
static int imx_media_of_add_csi(struct imx_media_dev *imxmd,
|
||||
struct device_node *csi_np)
|
||||
{
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
int ret = 0;
|
||||
|
||||
if (!of_device_is_available(csi_np)) {
|
||||
@ -31,7 +31,7 @@ static int imx_media_of_add_csi(struct imx_media_dev *imxmd,
|
||||
/* add CSI fwnode to async notifier */
|
||||
asd = v4l2_async_nf_add_fwnode(&imxmd->notifier,
|
||||
of_fwnode_handle(csi_np),
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
if (IS_ERR(asd)) {
|
||||
ret = PTR_ERR(asd);
|
||||
if (ret == -EEXIST)
|
||||
|
@ -636,7 +636,7 @@ static const struct v4l2_subdev_internal_ops csi2_internal_ops = {
|
||||
|
||||
static int csi2_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct csi2_dev *csi2 = notifier_to_dev(notifier);
|
||||
struct media_pad *sink = &csi2->sd.entity.pads[CSI2_SINK_PAD];
|
||||
@ -659,7 +659,7 @@ static int csi2_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
|
||||
static void csi2_notify_unbind(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *sd,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct csi2_dev *csi2 = notifier_to_dev(notifier);
|
||||
|
||||
@ -676,7 +676,7 @@ static int csi2_async_register(struct csi2_dev *csi2)
|
||||
struct v4l2_fwnode_endpoint vep = {
|
||||
.bus_type = V4L2_MBUS_CSI2_DPHY,
|
||||
};
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct fwnode_handle *ep;
|
||||
int ret;
|
||||
|
||||
@ -697,7 +697,7 @@ static int csi2_async_register(struct csi2_dev *csi2)
|
||||
dev_dbg(csi2->dev, "flags: 0x%08x\n", vep.bus.mipi_csi2.flags);
|
||||
|
||||
asd = v4l2_async_nf_add_fwnode_remote(&csi2->notifier, ep,
|
||||
struct v4l2_async_subdev);
|
||||
struct v4l2_async_connection);
|
||||
fwnode_handle_put(ep);
|
||||
|
||||
if (IS_ERR(asd))
|
||||
|
@ -395,7 +395,7 @@ static int sun6i_isp_proc_link(struct sun6i_isp_device *isp_dev,
|
||||
|
||||
static int sun6i_isp_proc_notifier_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *remote_subdev,
|
||||
struct v4l2_async_subdev *async_subdev)
|
||||
struct v4l2_async_connection *async_subdev)
|
||||
{
|
||||
struct sun6i_isp_device *isp_dev =
|
||||
container_of(notifier, struct sun6i_isp_device, proc.notifier);
|
||||
|
@ -34,7 +34,7 @@ struct sun6i_isp_proc_source {
|
||||
};
|
||||
|
||||
struct sun6i_isp_proc_async_subdev {
|
||||
struct v4l2_async_subdev async_subdev;
|
||||
struct v4l2_async_connection async_subdev;
|
||||
struct sun6i_isp_proc_source *source;
|
||||
};
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
||||
* @subdev: V4L2 subdev
|
||||
*/
|
||||
struct tegra_vi_graph_entity {
|
||||
struct v4l2_async_subdev asd;
|
||||
struct v4l2_async_connection asd;
|
||||
struct media_entity *entity;
|
||||
struct v4l2_subdev *subdev;
|
||||
};
|
||||
@ -58,7 +58,7 @@ to_tegra_channel_buffer(struct vb2_v4l2_buffer *vb)
|
||||
}
|
||||
|
||||
static inline struct tegra_vi_graph_entity *
|
||||
to_tegra_vi_graph_entity(struct v4l2_async_subdev *asd)
|
||||
to_tegra_vi_graph_entity(struct v4l2_async_connection *asd)
|
||||
{
|
||||
return container_of(asd, struct tegra_vi_graph_entity, asd);
|
||||
}
|
||||
@ -1462,9 +1462,9 @@ tegra_vi_graph_find_entity(struct tegra_vi_channel *chan,
|
||||
const struct fwnode_handle *fwnode)
|
||||
{
|
||||
struct tegra_vi_graph_entity *entity;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
|
||||
list_for_each_entry(asd, &chan->notifier.asd_list, asd_entry) {
|
||||
list_for_each_entry(asd, &chan->notifier.asc_list, asc_entry) {
|
||||
entity = to_tegra_vi_graph_entity(asd);
|
||||
if (entity->asd.match.fwnode == fwnode)
|
||||
return entity;
|
||||
@ -1578,7 +1578,7 @@ create_link:
|
||||
static int tegra_vi_graph_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
{
|
||||
struct tegra_vi_graph_entity *entity;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct v4l2_subdev *subdev;
|
||||
struct tegra_vi_channel *chan;
|
||||
struct tegra_vi *vi;
|
||||
@ -1608,7 +1608,7 @@ static int tegra_vi_graph_notify_complete(struct v4l2_async_notifier *notifier)
|
||||
}
|
||||
|
||||
/* create links between the entities */
|
||||
list_for_each_entry(asd, &chan->notifier.asd_list, asd_entry) {
|
||||
list_for_each_entry(asd, &chan->notifier.asc_list, asc_entry) {
|
||||
entity = to_tegra_vi_graph_entity(asd);
|
||||
ret = tegra_vi_graph_build(chan, entity);
|
||||
if (ret < 0)
|
||||
@ -1651,7 +1651,7 @@ unregister_video:
|
||||
|
||||
static int tegra_vi_graph_notify_bound(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd)
|
||||
struct v4l2_async_connection *asd)
|
||||
{
|
||||
struct tegra_vi_graph_entity *entity;
|
||||
struct tegra_vi *vi;
|
||||
@ -1775,7 +1775,7 @@ static int tegra_vi_graph_init(struct tegra_vi *vi)
|
||||
|
||||
ret = tegra_vi_graph_parse_one(chan, remote);
|
||||
fwnode_handle_put(remote);
|
||||
if (ret < 0 || list_empty(&chan->notifier.asd_list))
|
||||
if (ret < 0 || list_empty(&chan->notifier.asc_list))
|
||||
continue;
|
||||
|
||||
chan->notifier.ops = &tegra_vi_async_ops;
|
||||
|
@ -72,7 +72,7 @@ struct vpif_capture_config {
|
||||
int i2c_adapter_id;
|
||||
const char *card_name;
|
||||
|
||||
struct v4l2_async_subdev *asd[VPIF_CAPTURE_MAX_CHANNELS];
|
||||
struct v4l2_async_connection *asd[VPIF_CAPTURE_MAX_CHANNELS];
|
||||
int asd_sizes[VPIF_CAPTURE_MAX_CHANNELS];
|
||||
};
|
||||
#endif /* _VPIF_TYPES_H */
|
||||
|
@ -25,7 +25,7 @@ struct v4l2_async_notifier;
|
||||
* @V4L2_ASYNC_MATCH_TYPE_I2C: Match will check for I2C adapter ID and address
|
||||
* @V4L2_ASYNC_MATCH_TYPE_FWNODE: Match will use firmware node
|
||||
*
|
||||
* This enum is used by the asynchronous sub-device logic to define the
|
||||
* This enum is used by the asynchronous connection logic to define the
|
||||
* algorithm that will be used to match an asynchronous device.
|
||||
*/
|
||||
enum v4l2_async_match_type {
|
||||
@ -34,7 +34,7 @@ enum v4l2_async_match_type {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct v4l2_async_match_desc - async sub-device match information
|
||||
* struct v4l2_async_match_desc - async connection match information
|
||||
*
|
||||
* @type: type of match that will be used
|
||||
* @fwnode: pointer to &struct fwnode_handle to be matched.
|
||||
@ -62,21 +62,21 @@ struct v4l2_async_match_desc {
|
||||
};
|
||||
|
||||
/**
|
||||
* struct v4l2_async_subdev - sub-device descriptor, as known to a bridge
|
||||
* struct v4l2_async_connection - connection descriptor, as known to a bridge
|
||||
*
|
||||
* @match: struct of match type and per-bus type matching data sets
|
||||
* @asd_entry: used to add struct v4l2_async_subdev objects to the
|
||||
* master notifier @asd_list
|
||||
* @waiting_entry: used to link struct v4l2_async_subdev objects, waiting to be
|
||||
* probed, to a notifier->waiting_list list
|
||||
* @asc_entry: used to add struct v4l2_async_connection objects to the
|
||||
* master notifier @asc_list
|
||||
* @waiting_entry: used to link struct v4l2_async_connection objects, waiting to
|
||||
* be probed, to a notifier->waiting_list list
|
||||
*
|
||||
* 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.
|
||||
* v4l2_async_connection as its first member.
|
||||
*/
|
||||
struct v4l2_async_subdev {
|
||||
struct v4l2_async_connection {
|
||||
struct v4l2_async_match_desc match;
|
||||
struct list_head asd_entry;
|
||||
struct list_head asc_entry;
|
||||
struct list_head waiting_entry;
|
||||
};
|
||||
|
||||
@ -86,17 +86,17 @@ struct v4l2_async_subdev {
|
||||
* @complete: All subdevices have been probed successfully. The complete
|
||||
* callback is only executed for the root notifier.
|
||||
* @unbind: a subdevice is leaving
|
||||
* @destroy: the asd is about to be freed
|
||||
* @destroy: the asc is about to be freed
|
||||
*/
|
||||
struct v4l2_async_notifier_operations {
|
||||
int (*bound)(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd);
|
||||
struct v4l2_async_connection *asc);
|
||||
int (*complete)(struct v4l2_async_notifier *notifier);
|
||||
void (*unbind)(struct v4l2_async_notifier *notifier,
|
||||
struct v4l2_subdev *subdev,
|
||||
struct v4l2_async_subdev *asd);
|
||||
void (*destroy)(struct v4l2_async_subdev *asd);
|
||||
struct v4l2_async_connection *asc);
|
||||
void (*destroy)(struct v4l2_async_connection *asc);
|
||||
};
|
||||
|
||||
/**
|
||||
@ -106,8 +106,9 @@ struct v4l2_async_notifier_operations {
|
||||
* @v4l2_dev: v4l2_device of the root notifier, NULL otherwise
|
||||
* @sd: sub-device that registered the notifier, NULL otherwise
|
||||
* @parent: parent notifier
|
||||
* @asd_list: master list of struct v4l2_async_subdev
|
||||
* @waiting_list: list of struct v4l2_async_subdev, waiting for their drivers
|
||||
* @asc_list: master list of struct v4l2_async_connection
|
||||
* @waiting_list: list of struct v4l2_async_connection, waiting for their
|
||||
* drivers
|
||||
* @done_list: list of struct v4l2_subdev, already probed
|
||||
* @notifier_entry: member in a global list of notifiers
|
||||
*/
|
||||
@ -116,7 +117,7 @@ struct v4l2_async_notifier {
|
||||
struct v4l2_device *v4l2_dev;
|
||||
struct v4l2_subdev *sd;
|
||||
struct v4l2_async_notifier *parent;
|
||||
struct list_head asd_list;
|
||||
struct list_head asc_list;
|
||||
struct list_head waiting_list;
|
||||
struct list_head done_list;
|
||||
struct list_head notifier_entry;
|
||||
@ -134,53 +135,53 @@ void v4l2_async_debug_init(struct dentry *debugfs_dir);
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
*
|
||||
* This function initializes the notifier @asd_list. It must be called
|
||||
* This function initializes the notifier @asc_list. It must be called
|
||||
* before adding a subdevice to a notifier, using one of:
|
||||
* v4l2_async_nf_add_fwnode_remote(), v4l2_async_nf_add_fwnode() or
|
||||
* v4l2_async_nf_add_i2c().
|
||||
*/
|
||||
void v4l2_async_nf_init(struct v4l2_async_notifier *notifier);
|
||||
|
||||
struct v4l2_async_subdev *
|
||||
struct v4l2_async_connection *
|
||||
__v4l2_async_nf_add_fwnode(struct v4l2_async_notifier *notifier,
|
||||
struct fwnode_handle *fwnode,
|
||||
unsigned int asd_struct_size);
|
||||
unsigned int asc_struct_size);
|
||||
/**
|
||||
* v4l2_async_nf_add_fwnode - Allocate and add a fwnode async
|
||||
* subdev to the notifier's master asd_list.
|
||||
* subdev to the notifier's master asc_list.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
* @fwnode: fwnode handle of the sub-device to be matched, pointer to
|
||||
* &struct fwnode_handle
|
||||
* @type: Type of the driver's async sub-device struct. The &struct
|
||||
* v4l2_async_subdev shall be the first member of the driver's async
|
||||
* sub-device struct, i.e. both begin at the same memory address.
|
||||
* @type: Type of the driver's async sub-device or connection struct. The
|
||||
* &struct v4l2_async_connection shall be the first member of the
|
||||
* driver's async struct, i.e. both begin at the same memory address.
|
||||
*
|
||||
* Allocate a fwnode-matched asd of size asd_struct_size, and add it to the
|
||||
* notifiers @asd_list. The function also gets a reference of the fwnode which
|
||||
* Allocate a fwnode-matched asc of size asc_struct_size, and add it to the
|
||||
* notifiers @asc_list. The function also gets a reference of the fwnode which
|
||||
* is released later at notifier cleanup time.
|
||||
*/
|
||||
#define v4l2_async_nf_add_fwnode(notifier, fwnode, type) \
|
||||
((type *)__v4l2_async_nf_add_fwnode(notifier, fwnode, sizeof(type)))
|
||||
|
||||
struct v4l2_async_subdev *
|
||||
struct v4l2_async_connection *
|
||||
__v4l2_async_nf_add_fwnode_remote(struct v4l2_async_notifier *notif,
|
||||
struct fwnode_handle *endpoint,
|
||||
unsigned int asd_struct_size);
|
||||
unsigned int asc_struct_size);
|
||||
/**
|
||||
* v4l2_async_nf_add_fwnode_remote - Allocate and add a fwnode
|
||||
* remote async subdev to the
|
||||
* notifier's master asd_list.
|
||||
* notifier's master asc_list.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
* @ep: local endpoint pointing to the remote sub-device to be matched,
|
||||
* @ep: local endpoint pointing to the remote connection to be matched,
|
||||
* pointer to &struct fwnode_handle
|
||||
* @type: Type of the driver's async sub-device struct. The &struct
|
||||
* v4l2_async_subdev shall be the first member of the driver's async
|
||||
* sub-device struct, i.e. both begin at the same memory address.
|
||||
* @type: Type of the driver's async connection struct. The &struct
|
||||
* v4l2_async_connection shall be the first member of the driver's async
|
||||
* connection struct, i.e. both begin at the same memory address.
|
||||
*
|
||||
* Gets the remote endpoint of a given local endpoint, set it up for fwnode
|
||||
* matching and adds the async sub-device to the notifier's @asd_list. The
|
||||
* matching and adds the async connection to the notifier's @asc_list. The
|
||||
* function also gets a reference of the fwnode which is released later at
|
||||
* notifier cleanup time.
|
||||
*
|
||||
@ -190,23 +191,23 @@ __v4l2_async_nf_add_fwnode_remote(struct v4l2_async_notifier *notif,
|
||||
#define v4l2_async_nf_add_fwnode_remote(notifier, ep, type) \
|
||||
((type *)__v4l2_async_nf_add_fwnode_remote(notifier, ep, sizeof(type)))
|
||||
|
||||
struct v4l2_async_subdev *
|
||||
struct v4l2_async_connection *
|
||||
__v4l2_async_nf_add_i2c(struct v4l2_async_notifier *notifier,
|
||||
int adapter_id, unsigned short address,
|
||||
unsigned int asd_struct_size);
|
||||
unsigned int asc_struct_size);
|
||||
/**
|
||||
* v4l2_async_nf_add_i2c - Allocate and add an i2c async
|
||||
* subdev to the notifier's master asd_list.
|
||||
* subdev to the notifier's master asc_list.
|
||||
*
|
||||
* @notifier: pointer to &struct v4l2_async_notifier
|
||||
* @adapter: I2C adapter ID to be matched
|
||||
* @address: I2C address of sub-device to be matched
|
||||
* @type: Type of the driver's async sub-device struct. The &struct
|
||||
* v4l2_async_subdev shall be the first member of the driver's async
|
||||
* sub-device struct, i.e. both begin at the same memory address.
|
||||
* @address: I2C address of connection to be matched
|
||||
* @type: Type of the driver's async connection struct. The &struct
|
||||
* v4l2_async_connection shall be the first member of the driver's async
|
||||
* connection struct, i.e. both begin at the same memory address.
|
||||
*
|
||||
* Same as v4l2_async_nf_add_fwnode() but for I2C matched
|
||||
* sub-devices.
|
||||
* connections.
|
||||
*/
|
||||
#define v4l2_async_nf_add_i2c(notifier, adapter, address, type) \
|
||||
((type *)__v4l2_async_nf_add_i2c(notifier, adapter, address, \
|
||||
@ -244,7 +245,7 @@ void v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier);
|
||||
* @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
|
||||
* connections allocated for the purposes of the notifier but not the notifier
|
||||
* itself. The user is responsible for calling this function to clean up the
|
||||
* notifier after calling v4l2_async_nf_add_fwnode_remote(),
|
||||
* v4l2_async_nf_add_fwnode() or v4l2_async_nf_add_i2c().
|
||||
|
@ -1022,7 +1022,7 @@ struct v4l2_subdev_platform_data {
|
||||
* either dev->of_node->fwnode or dev->fwnode (whichever is non-NULL).
|
||||
* @async_list: Links this subdev to a global subdev_list or
|
||||
* @notifier->done_list list.
|
||||
* @asd: Pointer to respective &struct v4l2_async_subdev.
|
||||
* @asd: Pointer to respective &struct v4l2_async_connection.
|
||||
* @notifier: Pointer to the managing notifier.
|
||||
* @subdev_notifier: A sub-device notifier implicitly registered for the sub-
|
||||
* device using v4l2_async_register_subdev_sensor().
|
||||
@ -1065,7 +1065,7 @@ struct v4l2_subdev {
|
||||
struct device *dev;
|
||||
struct fwnode_handle *fwnode;
|
||||
struct list_head async_list;
|
||||
struct v4l2_async_subdev *asd;
|
||||
struct v4l2_async_connection *asd;
|
||||
struct v4l2_async_notifier *notifier;
|
||||
struct v4l2_async_notifier *subdev_notifier;
|
||||
struct v4l2_subdev_platform_data *pdata;
|
||||
|
Loading…
Reference in New Issue
Block a user