LinuxTV Patchwork [4/5] media: tvp5150: make use of generic connector parsing

login
register
mail settings
Submitter Marco Felsch
Date Feb. 2, 2019, 12:10 p.m.
Message ID <20190202121004.9014-5-m.felsch@pengutronix.de>
Download mbox | patch
Permalink /patch/54261/
State Superseded
Delegated to: Hans Verkuil
Headers show

Comments

Marco Felsch - Feb. 2, 2019, 12:10 p.m.
Drop the driver specific connector parsing since we can use the generic
parsing provided by the v4l2-fwnode core.

Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
 drivers/media/i2c/tvp5150.c | 75 ++++++++++---------------------------
 1 file changed, 20 insertions(+), 55 deletions(-)

Patch

diff --git a/drivers/media/i2c/tvp5150.c b/drivers/media/i2c/tvp5150.c
index 1f0dd9d3655c..f3a2ad00a40d 100644
--- a/drivers/media/i2c/tvp5150.c
+++ b/drivers/media/i2c/tvp5150.c
@@ -59,10 +59,9 @@  enum tvp5150_pads_state {
 };
 
 struct tvp5150_connector {
+	struct v4l2_fwnode_connector base;
 	struct media_entity ent;
 	struct media_pad pad;
-	unsigned int port_num;
-	bool is_svideo;
 };
 #endif
 
@@ -1310,7 +1309,8 @@  static int tvp5150_link_setup(struct media_entity *entity,
 	/* check if the svideo connector should be enabled */
 	for (i = 0; i < decoder->connectors_num; i++) {
 		if (remote->entity == &decoder->connectors[i].ent) {
-			is_svideo = decoder->connectors[i].is_svideo;
+			is_svideo =
+			   decoder->connectors[i].base.type == V4L2_CON_SVIDEO;
 			break;
 		}
 	}
@@ -1555,8 +1555,9 @@  static int tvp5150_registered(struct v4l2_subdev *sd)
 	for (i = 0; i < decoder->connectors_num; i++) {
 		struct media_entity *con = &decoder->connectors[i].ent;
 		struct media_pad *pad = &decoder->connectors[i].pad;
-		unsigned int port = decoder->connectors[i].port_num;
-		bool is_svideo = decoder->connectors[i].is_svideo;
+		unsigned int port = decoder->connectors[i].base.remote_port;
+		bool is_svideo =
+			decoder->connectors[i].base.type == V4L2_CON_SVIDEO;
 		int flags = i ? 0 : MEDIA_LNK_FL_ENABLED;
 
 		pad->flags = MEDIA_PAD_FL_SOURCE;
@@ -1821,8 +1822,6 @@  static int tvp5150_init(struct i2c_client *c)
 static int tvp5150_add_of_connectors(struct tvp5150 *decoder)
 {
 	struct device *dev = decoder->sd.dev;
-	struct device_node *rp;
-	struct of_endpoint ep;
 	struct tvp5150_connector *connectors;
 	unsigned int connectors_num = decoder->connectors_num;
 	int i, ret;
@@ -1834,22 +1833,15 @@  static int tvp5150_add_of_connectors(struct tvp5150 *decoder)
 		return -ENOMEM;
 
 	for (i = 0; i < connectors_num; i++) {
-		rp = of_graph_get_remote_port_parent(decoder->endpoints[i]);
-		of_graph_parse_endpoint(decoder->endpoints[i], &ep);
-		connectors[i].port_num = ep.port;
-		connectors[i].is_svideo = !!of_device_is_compatible(rp,
-							    "svideo-connector");
-
-		if (connectors[i].is_svideo)
-			connectors[i].ent.function = MEDIA_ENT_F_CONN_SVIDEO;
-		else
-			connectors[i].ent.function = MEDIA_ENT_F_CONN_COMPOSITE;
+		struct v4l2_fwnode_connector *c = &connectors[i].base;
+
+		ret = v4l2_fwnode_parse_connector(
+				   of_fwnode_handle(decoder->endpoints[i]), c);
 
 		connectors[i].ent.flags = MEDIA_ENT_FL_CONNECTOR;
-		ret = of_property_read_string(rp, "label",
-					      &connectors[i].ent.name);
-		if (ret < 0)
-			return ret;
+		connectors[i].ent.function = c->type == V4L2_CON_SVIDEO ?
+			MEDIA_ENT_F_CONN_SVIDEO : MEDIA_ENT_F_CONN_COMPOSITE;
+		connectors[i].ent.name = c->label;
 	}
 
 	decoder->connectors = connectors;
@@ -1890,41 +1882,11 @@  static int tvp5150_mc_init(struct v4l2_subdev *sd)
 	return ret;
 }
 
-static bool tvp5150_of_valid_input(struct device_node *endpoint,
-				unsigned int port, unsigned int id)
-{
-	struct device_node *rp = of_graph_get_remote_port_parent(endpoint);
-	const char *input;
-	int ret;
-
-	/* perform some basic checks needed for later mc_init */
-	switch (port) {
-	case TVP5150_PAD_AIP1A:
-		/* svideo must be connected to endpoint@1  */
-		ret = id ? of_device_is_compatible(rp, "svideo-connector") :
-			   of_device_is_compatible(rp,
-						   "composite-video-connector");
-		if (!ret)
-			return false;
-		break;
-	case TVP5150_PAD_AIP1B:
-		ret = of_device_is_compatible(rp, "composite-video-connector");
-		if (!ret)
-			return false;
-		break;
-	}
-
-	ret = of_property_read_string(rp, "label", &input);
-	if (ret < 0)
-		return false;
-
-	return true;
-}
-
 static int tvp5150_parse_dt(struct tvp5150 *decoder, struct device_node *np)
 {
 	struct device *dev = decoder->sd.dev;
 	struct v4l2_fwnode_endpoint bus_cfg = { .bus_type = 0 };
+	struct v4l2_fwnode_connector c;
 	struct device_node *ep_np;
 	unsigned int flags;
 	int ret, i = 0, in = 0;
@@ -1953,10 +1915,13 @@  static int tvp5150_parse_dt(struct tvp5150 *decoder, struct device_node *np)
 			/* fall through */
 		case TVP5150_PAD_AIP1A:
 		case TVP5150_PAD_AIP1B:
-			if (!tvp5150_of_valid_input(ep_np, ep.port, ep.id)) {
+			ret = v4l2_fwnode_parse_connector(
+						   of_fwnode_handle(ep_np), &c);
+			if (c.type != V4L2_CON_COMPOSITE &&
+			    c.type != V4L2_CON_SVIDEO) {
 				dev_err(dev,
-					"Invalid endpoint %pOF on port %d\n",
-					ep.local_node, ep.port);
+					"Invalid endpoint %d on port %d\n",
+					c.remote_id, c.remote_port);
 				ret = -EINVAL;
 				goto err;
 			}

Privacy Policy