@@ -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;
}
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(-)