Re: [PATCH 03/22] [media] v4l: of: add v4l2_of_subdev_registered

Marek Vasut
2016-10-07T18:50:48Z

On 10/07/2016 06:00 PM, Philipp Zabel wrote:
> Provide a default registered callback for device tree probed subdevices
> that use OF graph bindings to add still missing source subdevices to
> the async notifier waiting list.
> This is only necessary for subdevices that have input ports to which
> other subdevices are connected that are not initially known to the
> master/bridge device when it sets up the notifier.
>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>

[...]

> +int v4l2_of_subdev_registered(struct v4l2_subdev *sd)
> +{
> + struct device_node *ep;
> +
> + for_each_endpoint_of_node(sd->of_node, ep) {
> + struct v4l2_of_link link;
> + struct media_entity *entity;
> + unsigned int pad;
> + int ret;
> +
> + ret = v4l2_of_parse_link(ep, &link);
> + if (ret)
> + continue;
> +
> + /*
> + * Assume 1:1 correspondence between OF node and entity,
> + * and between OF port numbers and pad indices.
> + */
> + entity = &sd->entity;

This here will not compile if CONFIG_MEDIA_CONTROLLER is not set,
because ->entity will be missing from struct v4l2_subdev {} .

> + pad = link.local_port;
> +
> + if (pad >= entity->num_pads)
> + return -EINVAL;
> +
> + /* Add source subdevs to async notifier */
> + if (entity->pads[pad].flags & MEDIA_PAD_FL_SINK) {
> + struct v4l2_async_subdev *asd;
> +
> + asd = devm_kzalloc(sd->dev, sizeof(*asd), GFP_KERNEL);
> + if (!asd) {
> + v4l2_of_put_link(&link);
> + return -ENOMEM;
> + }
> +
> + asd->match_type = V4L2_ASYNC_MATCH_OF;
> + asd->match.of.node = link.remote_node;
> +
> + __v4l2_async_notifier_add_subdev(sd->notifier, asd);
> + }
> +
> + v4l2_of_put_link(&link);
> + }
> +
> + return 0;
> +}
> diff --git a/include/media/v4l2-of.h b/include/media/v4l2-of.h
> index 4dc34b2..67d4f8b 100644
> --- a/include/media/v4l2-of.h
> +++ b/include/media/v4l2-of.h
> @@ -22,6 +22,8 @@
> #include <media/v4l2-mediabus.h>
>
> struct device_node;
> +struct v4l2_device;
> +struct v4l2_subdev;
>
> /**
> * struct v4l2_of_bus_mipi_csi2 - MIPI CSI-2 bus data structure
> @@ -95,6 +97,9 @@ void v4l2_of_free_endpoint(struct v4l2_of_endpoint *endpoint);
> int v4l2_of_parse_link(const struct device_node *node,
> struct v4l2_of_link *link);
> void v4l2_of_put_link(struct v4l2_of_link *link);
> +int v4l2_of_subdev_registered(struct v4l2_subdev *sd);
> +struct v4l2_subdev *v4l2_find_subdev_by_node(struct v4l2_device *v4l2_dev,
> + struct device_node *node);
> #else /* CONFIG_OF */
>
> static inline int v4l2_of_parse_endpoint(const struct device_node *node,
> @@ -123,6 +128,13 @@ static inline void v4l2_of_put_link(struct v4l2_of_link *link)
> {
> }
>
> +#define v4l2_of_subdev_registered NULL
> +
> +struct v4l2_subdev *v4l2_find_subdev_by_node(struct v4l2_device *v4l2_dev,
> + struct device_node *node)
> +{
> + return NULL;
> +}
> #endif /* CONFIG_OF */
>
> #endif /* _V4L2_OF_H */
>

--
Best regards,
Marek Vasut