Commit 2452171e authored by Paul Elder's avatar Paul Elder Committed by Mauro Carvalho Chehab
Browse files

media: rkisp1: Use fwnode_graph_for_each_endpoint



When registering the notifier, replace the manual while loop with
fwnode_graph_for_each_endpoint. This simplifies error handling.

Signed-off-by: default avatarPaul Elder <paul.elder@ideasonboard.com>
Reviewed-by: default avatarDafna Hirschfeld <dafna@fastmail.com>
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent 98bfd0cd
Loading
Loading
Loading
Loading
+20 −24
Original line number Diff line number Diff line
@@ -168,29 +168,28 @@ static const struct v4l2_async_notifier_operations rkisp1_subdev_notifier_ops =
static int rkisp1_subdev_notifier_register(struct rkisp1_device *rkisp1)
{
	struct v4l2_async_notifier *ntf = &rkisp1->notifier;
	unsigned int next_id = 0;
	struct fwnode_handle *fwnode = dev_fwnode(rkisp1->dev);
	struct fwnode_handle *ep;
	unsigned int index = 0;
	int ret;
	int ret = 0;

	v4l2_async_nf_init(ntf);

	while (1) {
	ntf->ops = &rkisp1_subdev_notifier_ops;

	fwnode_graph_for_each_endpoint(fwnode, ep) {
		struct v4l2_fwnode_endpoint vep = {
			.bus_type = V4L2_MBUS_CSI2_DPHY
		};
		struct rkisp1_sensor_async *rk_asd;
		struct fwnode_handle *source = NULL;
		struct fwnode_handle *ep;

		ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(rkisp1->dev),
						     0, next_id,
						     FWNODE_GRAPH_ENDPOINT_NEXT);
		if (!ep)
			break;
		struct fwnode_handle *source;

		ret = v4l2_fwnode_endpoint_parse(ep, &vep);
		if (ret)
			goto err_parse;
		if (ret) {
			dev_err(rkisp1->dev, "failed to parse endpoint %pfw\n",
				ep);
			break;
		}

		source = fwnode_graph_get_remote_endpoint(ep);
		if (!source) {
@@ -198,14 +197,15 @@ static int rkisp1_subdev_notifier_register(struct rkisp1_device *rkisp1)
				"endpoint %pfw has no remote endpoint\n",
				ep);
			ret = -ENODEV;
			goto err_parse;
			break;
		}

		rk_asd = v4l2_async_nf_add_fwnode(ntf, source,
						  struct rkisp1_sensor_async);
		if (IS_ERR(rk_asd)) {
			fwnode_handle_put(source);
			ret = PTR_ERR(rk_asd);
			goto err_parse;
			break;
		}

		rk_asd->index = index++;
@@ -216,27 +216,23 @@ static int rkisp1_subdev_notifier_register(struct rkisp1_device *rkisp1)

		dev_dbg(rkisp1->dev, "registered ep id %d with %d lanes\n",
			vep.base.id, rk_asd->lanes);
	}

		next_id = vep.base.id + 1;

		fwnode_handle_put(ep);

		continue;
err_parse:
	if (ret) {
		fwnode_handle_put(ep);
		fwnode_handle_put(source);
		v4l2_async_nf_cleanup(ntf);
		return ret;
	}

	if (next_id == 0)
	if (!index)
		dev_dbg(rkisp1->dev, "no remote subdevice found\n");
	ntf->ops = &rkisp1_subdev_notifier_ops;

	ret = v4l2_async_nf_register(&rkisp1->v4l2_dev, ntf);
	if (ret) {
		v4l2_async_nf_cleanup(ntf);
		return ret;
	}

	return 0;
}