Hi Niklas, Thank you for the patch. On Tuesday 14 Mar 2017 19:59:48 Niklas Söderlund wrote: > Information about pads will be needed when enumerating the media bus > codes in the async complete handler which is run before > rvin_v4l2_probe(). Move the pad lookup to the async bound handler so > they are available when needed. > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx> > --- > drivers/media/platform/rcar-vin/rcar-core.c | 32 +++++++++++++++++++++++++- > drivers/media/platform/rcar-vin/rcar-v4l2.c | 24 ---------------------- > 2 files changed, 31 insertions(+), 25 deletions(-) > > diff --git a/drivers/media/platform/rcar-vin/rcar-core.c > b/drivers/media/platform/rcar-vin/rcar-core.c index > 098a0b1cc10a26ba..d7aba15f6761259b 100644 > --- a/drivers/media/platform/rcar-vin/rcar-core.c > +++ b/drivers/media/platform/rcar-vin/rcar-core.c > @@ -31,6 +31,20 @@ > > #define notifier_to_vin(n) container_of(n, struct rvin_dev, notifier) > > +static int rvin_find_pad(struct v4l2_subdev *sd, int direction) > +{ > + unsigned int pad; > + > + if (sd->entity.num_pads <= 1) > + return 0; > + > + for (pad = 0; pad < sd->entity.num_pads; pad++) > + if (sd->entity.pads[pad].flags & direction) > + return pad; > + > + return -EINVAL; > +} > + > static bool rvin_mbus_supported(struct rvin_graph_entity *entity) > { > struct v4l2_subdev *sd = entity->subdev; > @@ -101,12 +115,28 @@ static int rvin_digital_notify_bound(struct > v4l2_async_notifier *notifier, struct v4l2_async_subdev *asd) > { > struct rvin_dev *vin = notifier_to_vin(notifier); > + int ret; > > v4l2_set_subdev_hostdata(subdev, vin); > > if (vin->digital.asd.match.of.node == subdev->dev->of_node) { > - vin_dbg(vin, "bound digital subdev %s\n", subdev->name); > + /* Find surce and sink pad of remote subdevice */ > + > + ret = rvin_find_pad(subdev, MEDIA_PAD_FL_SOURCE); > + if (ret < 0) > + return ret; > + vin->digital.source_pad = ret; > + > + ret = rvin_find_pad(subdev, MEDIA_PAD_FL_SINK); > + if (ret < 0) > + return ret; > + vin->digital.sink_pad = ret; > + > vin->digital.subdev = subdev; > + > + vin_dbg(vin, "bound subdev %s source pad: %d sink pad: %d\n", > + subdev->name, vin->digital.source_pad, > + vin->digital.sink_pad); As source_pad and sink_pad are unsigned, s/%d/%u/g > return 0; > } > > diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c > b/drivers/media/platform/rcar-vin/rcar-v4l2.c index > ce29a21888da48d5..be6f41bf82ac3bc5 100644 > --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c > +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c > @@ -870,20 +870,6 @@ static void rvin_notify(struct v4l2_subdev *sd, > } > } > > -static int rvin_find_pad(struct v4l2_subdev *sd, int direction) > -{ > - unsigned int pad; > - > - if (sd->entity.num_pads <= 1) > - return 0; > - > - for (pad = 0; pad < sd->entity.num_pads; pad++) > - if (sd->entity.pads[pad].flags & direction) > - return pad; > - > - return -EINVAL; > -} > - > int rvin_v4l2_probe(struct rvin_dev *vin) > { > struct video_device *vdev = &vin->vdev; > @@ -934,16 +920,6 @@ int rvin_v4l2_probe(struct rvin_dev *vin) > vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | > V4L2_CAP_READWRITE; > > - ret = rvin_find_pad(sd, MEDIA_PAD_FL_SOURCE); > - if (ret < 0) > - return ret; > - vin->digital.source_pad = ret; > - > - ret = rvin_find_pad(sd, MEDIA_PAD_FL_SINK); > - if (ret < 0) > - return ret; > - vin->digital.sink_pad = ret; > - > vin->format.pixelformat = RVIN_DEFAULT_FORMAT; > rvin_reset_format(vin); -- Regards, Laurent Pinchart