summaryrefslogtreecommitdiffstats
path: root/drivers/media/platform/rcar-vin/rcar-core.c
diff options
context:
space:
mode:
authorNiklas Söderlund2017-05-24 02:15:30 +0200
committerMauro Carvalho Chehab2017-06-06 19:38:45 +0200
commitf4dbfbc75b6416a07f8106ee4931bfbc9c11f451 (patch)
tree37c974908aa1aa87227d148135837c2d7f6e6199 /drivers/media/platform/rcar-vin/rcar-core.c
parent[media] rcar-vin: refactor pad lookup code (diff)
downloadkernel-qcow2-linux-f4dbfbc75b6416a07f8106ee4931bfbc9c11f451.tar.gz
kernel-qcow2-linux-f4dbfbc75b6416a07f8106ee4931bfbc9c11f451.tar.xz
kernel-qcow2-linux-f4dbfbc75b6416a07f8106ee4931bfbc9c11f451.zip
[media] rcar-vin: move pad lookup to async bound handler
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> [hans.verkuil@cisco.com: fix typo: surce -> source] Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/platform/rcar-vin/rcar-core.c')
-rw-r--r--drivers/media/platform/rcar-vin/rcar-core.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/media/platform/rcar-vin/rcar-core.c b/drivers/media/platform/rcar-vin/rcar-core.c
index 264604a9bcf8..24ce6967f711 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,13 +115,27 @@ 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.fwnode.fwnode ==
of_fwnode_handle(subdev->dev->of_node)) {
- vin_dbg(vin, "bound digital subdev %s\n", subdev->name);
+ /* Find source 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);
+ vin->digital.sink_pad = ret < 0 ? 0 : ret;
+
vin->digital.subdev = subdev;
+
+ vin_dbg(vin, "bound subdev %s source pad: %u sink pad: %u\n",
+ subdev->name, vin->digital.source_pad,
+ vin->digital.sink_pad);
return 0;
}