Message ID | 20170314185957.25253-8-niklas.soderlund+renesas@ragnatech.se (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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@ragnatech.se> > --- > 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);
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); 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);
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@ragnatech.se> --- 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(-)