public inbox for linux-media@vger.kernel.org
 help / color / mirror / Atom feed
From: Philipp Zabel <p.zabel@pengutronix.de>
To: linux-media@vger.kernel.org
Cc: Steve Longerbeam <steve_longerbeam@mentor.com>,
	Marek Vasut <marex@denx.de>, Hans Verkuil <hverkuil@xs4all.nl>,
	kernel@pengutronix.de, Philipp Zabel <p.zabel@pengutronix.de>
Subject: [PATCH 03/22] [media] v4l: of: add v4l2_of_subdev_registered
Date: Fri,  7 Oct 2016 18:00:48 +0200	[thread overview]
Message-ID: <20161007160107.5074-4-p.zabel@pengutronix.de> (raw)
In-Reply-To: <20161007160107.5074-1-p.zabel@pengutronix.de>

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>
---
 drivers/media/v4l2-core/v4l2-of.c | 68 +++++++++++++++++++++++++++++++++++++++
 include/media/v4l2-of.h           | 12 +++++++
 2 files changed, 80 insertions(+)

diff --git a/drivers/media/v4l2-core/v4l2-of.c b/drivers/media/v4l2-core/v4l2-of.c
index 93b3368..fbdd6b4 100644
--- a/drivers/media/v4l2-core/v4l2-of.c
+++ b/drivers/media/v4l2-core/v4l2-of.c
@@ -19,6 +19,7 @@
 #include <linux/types.h>
 
 #include <media/v4l2-of.h>
+#include <media/v4l2-device.h>
 
 static int v4l2_of_parse_csi_bus(const struct device_node *node,
 				 struct v4l2_of_endpoint *endpoint)
@@ -314,3 +315,70 @@ void v4l2_of_put_link(struct v4l2_of_link *link)
 	of_node_put(link->remote_node);
 }
 EXPORT_SYMBOL(v4l2_of_put_link);
+
+struct v4l2_subdev *v4l2_find_subdev_by_node(struct v4l2_device *v4l2_dev,
+					     struct device_node *node)
+{
+	struct v4l2_subdev *sd;
+
+	list_for_each_entry(sd, &v4l2_dev->subdevs, list) {
+		if (sd->of_node == node)
+			return sd;
+	}
+
+	return NULL;
+}
+EXPORT_SYMBOL(v4l2_find_subdev_by_node);
+
+/**
+ * v4l2_of_subdev_registered() - default OF probed subdev registered callback
+ * @subdev: subdevice with initialized entities
+ *
+ * Parse all OF graph endpoints corrensponding to the subdev's entity input pads
+ * and add the remote subdevs to the async subdev notifier.
+ */
+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;
+		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 */
-- 
2.9.3


  parent reply	other threads:[~2016-10-07 16:01 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-07 16:00 [PATCH 00/22] Basic i.MX IPUv3 capture support Philipp Zabel
2016-10-07 16:00 ` [PATCH 01/22] [media] v4l2-async: move code out of v4l2_async_notifier_register into v4l2_async_test_nofity_all Philipp Zabel
2016-10-07 16:30   ` Marek Vasut
2016-10-07 16:53     ` Philipp Zabel
2016-10-07 16:00 ` [PATCH 02/22] [media] v4l2-async: allow subdevices to add further subdevices to the notifier waiting list Philipp Zabel
2016-10-07 21:52   ` Sakari Ailus
2016-10-12 13:26     ` Philipp Zabel
2016-10-13 11:56       ` Sakari Ailus
2016-10-14 15:47         ` Philipp Zabel
2016-10-07 22:43   ` Sakari Ailus
2016-10-14 15:48     ` Philipp Zabel
2016-10-14 17:06       ` Ian Arkver
2016-10-14 17:30         ` Philipp Zabel
2016-10-07 16:00 ` Philipp Zabel [this message]
2016-10-07 18:50   ` [PATCH 03/22] [media] v4l: of: add v4l2_of_subdev_registered Marek Vasut
2016-10-14 15:48     ` Philipp Zabel
2016-10-07 22:50   ` Sakari Ailus
2016-10-14 15:49     ` Philipp Zabel
2016-10-07 16:00 ` [PATCH 04/22] [media] v4l2-subdev.h: add prepare_stream op Philipp Zabel
2016-10-07 23:16   ` Sakari Ailus
2016-10-14 15:48     ` Philipp Zabel
2016-10-16 22:59       ` Sakari Ailus
2016-10-07 16:00 ` [PATCH 05/22] [media] v4l2-async: add new subdevices to the tail of subdev_list Philipp Zabel
2016-10-07 16:00 ` [PATCH 06/22] [media] imx: Add i.MX SoC wide media device driver Philipp Zabel
2016-10-07 16:00 ` [PATCH 07/22] [media] imx: Add IPUv3 media common code Philipp Zabel
2016-10-17  7:04   ` Ian Arkver
2016-10-07 16:00 ` [PATCH 08/22] [media] imx-ipu: Add i.MX IPUv3 CSI subdevice driver Philipp Zabel
2016-10-07 16:00 ` [PATCH 09/22] [media] imx: Add i.MX IPUv3 capture driver Philipp Zabel
2016-10-07 16:00 ` [PATCH 10/22] [media] platform: add video-multiplexer subdevice driver Philipp Zabel
2016-10-07 16:00 ` [PATCH 11/22] [media] imx: Add i.MX MIPI CSI-2 " Philipp Zabel
2016-10-07 16:00 ` [PATCH 12/22] [media] tc358743: put lanes in STOP state before starting streaming Philipp Zabel
2016-10-07 19:02   ` Marek Vasut
2016-10-14 15:49     ` Philipp Zabel
2016-10-07 16:00 ` [PATCH 13/22] ARM: dts: imx6qdl: Add capture-subsystem node Philipp Zabel
2016-10-07 16:00 ` [PATCH 14/22] ARM: dts: imx6qdl: Add mipi_ipu1/2 multiplexers, mipi_csi, and their connections Philipp Zabel
2016-10-07 16:01 ` [PATCH 15/22] ARM: dts: imx6qdl: Add MIPI CSI-2 D-PHY compatible and clocks Philipp Zabel
2016-10-07 16:01 ` [PATCH 16/22] ARM: dts: nitrogen6x: Add dtsi for BD_HDMI_MIPI HDMI to MIPI CSI-2 receiver board Philipp Zabel
2016-10-10 15:48   ` [16/22] " Gary Bisson
2016-10-14 16:45     ` Philipp Zabel
2016-10-07 16:01 ` [PATCH 17/22] gpu: ipuv3: add ipu_csi_set_downsize Philipp Zabel
2016-10-07 16:01 ` [PATCH 18/22] [media] imx-ipuv3-csi: support downsizing Philipp Zabel
2016-10-07 19:01   ` Marek Vasut
2016-10-14 15:48     ` Philipp Zabel
2016-10-16 15:09       ` Marek Vasut
2016-10-07 16:01 ` [PATCH 19/22] [media] add mux and video interface bridge entity functions Philipp Zabel
2016-10-07 16:01 ` [PATCH 20/22] [media] video-multiplexer: set entity function to mux Philipp Zabel
2016-10-07 16:01 ` [PATCH 21/22] [media] imx: Set i.MX MIPI CSI-2 entity function to bridge Philipp Zabel
2016-10-07 16:01 ` [PATCH 22/22] [media] tc358743: set entity function to video interface bridge Philipp Zabel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161007160107.5074-4-p.zabel@pengutronix.de \
    --to=p.zabel@pengutronix.de \
    --cc=hverkuil@xs4all.nl \
    --cc=kernel@pengutronix.de \
    --cc=linux-media@vger.kernel.org \
    --cc=marex@denx.de \
    --cc=steve_longerbeam@mentor.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox