The helper functions to parse device tree and lookup information where previously targeting a shared notifier in the shared group. This have now been reworked to separate notifiers, one for each VIN. Rename and move the functions verbatim to make it clear they now are helpers for each VINs individual notifier instead of a shared one on the group level. Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx> --- .../platform/renesas/rcar-vin/rcar-core.c | 156 +++++++++--------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/drivers/media/platform/renesas/rcar-vin/rcar-core.c b/drivers/media/platform/renesas/rcar-vin/rcar-core.c index 244ab1b3a8c0..4c5ca4dff77b 100644 --- a/drivers/media/platform/renesas/rcar-vin/rcar-core.c +++ b/drivers/media/platform/renesas/rcar-vin/rcar-core.c @@ -176,81 +176,6 @@ static void rvin_group_put(struct rvin_dev *vin) kref_put(&group->refcount, rvin_group_release); } -static int rvin_group_entity_to_remote_id(struct rvin_dev *vin, - struct media_entity *entity) -{ - struct v4l2_subdev *sd; - unsigned int i; - - sd = media_entity_to_v4l2_subdev(entity); - - for (i = 0; i < RVIN_REMOTES_MAX; i++) - if (vin->remotes[i].subdev == sd) - return i; - - return -ENODEV; -} - -static int rvin_group_parse_of(struct rvin_dev *vin, unsigned int port, - unsigned int id) -{ - struct fwnode_handle *ep, *fwnode; - struct v4l2_fwnode_endpoint vep = { - .bus_type = V4L2_MBUS_CSI2_DPHY, - }; - struct v4l2_async_connection *asc; - int ret; - - ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(vin->dev), port, id, 0); - if (!ep) - return 0; - - fwnode = fwnode_graph_get_remote_endpoint(ep); - ret = v4l2_fwnode_endpoint_parse(ep, &vep); - fwnode_handle_put(ep); - if (ret) { - vin_err(vin, "Failed to parse %pOF\n", to_of_node(fwnode)); - ret = -EINVAL; - goto out; - } - - asc = v4l2_async_nf_add_fwnode(&vin->notifier, fwnode, - struct v4l2_async_connection); - if (IS_ERR(asc)) { - ret = PTR_ERR(asc); - goto out; - } - - vin->remotes[vep.base.id].asc = asc; - - vin_dbg(vin, "Add device %pOF to slot %u\n", - to_of_node(fwnode), vep.base.id); -out: - fwnode_handle_put(fwnode); - - return ret; -} - -static int rvin_group_notifier_init(struct rvin_dev *vin, unsigned int port, - unsigned int max_id) -{ - unsigned int id; - int ret; - - for (id = 0; id < max_id; id++) { - ret = rvin_group_parse_of(vin, port, id); - if (ret) - return ret; - } - - /* Make sure at least one remote was described. */ - for (id = 0; id < max_id; id++) - if (vin->remotes[id].asc) - return 0; - - return -ENODEV; -} - /* ----------------------------------------------------------------------------- * Controls */ @@ -316,6 +241,81 @@ static int rvin_create_controls(struct rvin_dev *vin, struct v4l2_subdev *subdev * Async notifier */ +static int rvin_remote_entity_to_id(struct rvin_dev *vin, + struct media_entity *entity) +{ + struct v4l2_subdev *sd; + unsigned int i; + + sd = media_entity_to_v4l2_subdev(entity); + + for (i = 0; i < RVIN_REMOTES_MAX; i++) + if (vin->remotes[i].subdev == sd) + return i; + + return -ENODEV; +} + +static int rvin_remote_parse_of(struct rvin_dev *vin, unsigned int port, + unsigned int id) +{ + struct fwnode_handle *ep, *fwnode; + struct v4l2_fwnode_endpoint vep = { + .bus_type = V4L2_MBUS_CSI2_DPHY, + }; + struct v4l2_async_connection *asc; + int ret; + + ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(vin->dev), port, id, 0); + if (!ep) + return 0; + + fwnode = fwnode_graph_get_remote_endpoint(ep); + ret = v4l2_fwnode_endpoint_parse(ep, &vep); + fwnode_handle_put(ep); + if (ret) { + vin_err(vin, "Failed to parse %pOF\n", to_of_node(fwnode)); + ret = -EINVAL; + goto out; + } + + asc = v4l2_async_nf_add_fwnode(&vin->notifier, fwnode, + struct v4l2_async_connection); + if (IS_ERR(asc)) { + ret = PTR_ERR(asc); + goto out; + } + + vin->remotes[vep.base.id].asc = asc; + + vin_dbg(vin, "Add device %pOF to slot %u\n", + to_of_node(fwnode), vep.base.id); +out: + fwnode_handle_put(fwnode); + + return ret; +} + +static int rvin_remote_notifier_init(struct rvin_dev *vin, unsigned int port, + unsigned int max_id) +{ + unsigned int id; + int ret; + + for (id = 0; id < max_id; id++) { + ret = rvin_remote_parse_of(vin, port, id); + if (ret) + return ret; + } + + /* Make sure at least one remote was described. */ + for (id = 0; id < max_id; id++) + if (vin->remotes[id].asc) + return 0; + + return -ENODEV; +} + static int rvin_find_pad(struct v4l2_subdev *sd, int direction) { unsigned int pad; @@ -638,7 +638,7 @@ static int rvin_csi2_link_notify(struct media_link *link, u32 flags, mutex_lock(&group->lock); - csi_id = rvin_group_entity_to_remote_id(vin, link->source->entity); + csi_id = rvin_remote_entity_to_id(vin, link->source->entity); if (csi_id == -ENODEV) { struct v4l2_subdev *sd; @@ -804,7 +804,7 @@ static int rvin_csi2_init(struct rvin_dev *vin) have_parallel = ret != -ENODEV; - ret = rvin_group_notifier_init(vin, 1, RVIN_CSI_MAX); + ret = rvin_remote_notifier_init(vin, 1, RVIN_CSI_MAX); if (ret && ret != -ENODEV) goto err_group; have_remote = ret != -ENODEV; @@ -859,7 +859,7 @@ static int rvin_isp_init(struct rvin_dev *vin) if (ret) goto err_controls; - ret = rvin_group_notifier_init(vin, 2, RVIN_ISP_MAX); + ret = rvin_remote_notifier_init(vin, 2, RVIN_ISP_MAX); if (ret) goto err_group; -- 2.43.0