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@xxxxxxxxxxxxxx> --- drivers/media/i2c/tvp5150.c | 75 ++++++++++--------------------------- 1 file changed, 20 insertions(+), 55 deletions(-) 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; } -- 2.20.1