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@xxxxxxxxxxxxxx> [...] > +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 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html