Commit 9229b53f authored by Bryan O'Donoghue's avatar Bryan O'Donoghue Committed by Hans Verkuil
Browse files

Revert "media: qcom: camss: Restructure camss_link_entities"



This reverts commit cc1ecabe.

This commit has a basic flaw in that it relies on camss->res->csid_num as a
control to index the array camss->vfe[i].

Testing on a platform where csid_num > vfe_num showed this bug up.

camss->vfe should only be indexed by camss->res->vfe_num. Since this commit
is meant to make the code be more readable reverting will simply restore
the previous correct bounds checking.

We can make another pass at making camss_link_entities look prettier but,
for now we should zap the bug introduced.

Fixes: cc1ecabe ("media: qcom: camss: Restructure camss_link_entities")
Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
Reviewed-by: default avatarVladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
parent 210afa15
Loading
Loading
Loading
Loading
+52 −103
Original line number Diff line number Diff line
@@ -2298,6 +2298,7 @@ static int camss_init_subdevices(struct camss *camss)
}

/*
 * camss_link_entities - Register subdev nodes and create links
 * camss_link_err - print error in case link creation fails
 * @src_name: name for source of the link
 * @sink_name: name for sink of the link
@@ -2315,64 +2316,14 @@ inline void camss_link_err(struct camss *camss,
}

/*
 * camss_link_entities_csid - Register subdev nodes and create links
 * @camss: CAMSS device
 *
 * Return 0 on success or a negative error code on failure
 */
static int camss_link_entities_csid(struct camss *camss)
{
	struct media_entity *src_entity;
	struct media_entity *sink_entity;
	int ret, line_num;
	u16 sink_pad;
	u16 src_pad;
	int i, j;

	for (i = 0; i < camss->res->csid_num; i++) {
		if (camss->ispif)
			line_num = camss->ispif->line_num;
		else
			line_num = camss->vfe[i].res->line_num;

		src_entity = &camss->csid[i].subdev.entity;
		for (j = 0; j < line_num; j++) {
			if (camss->ispif) {
				sink_entity = &camss->ispif->line[j].subdev.entity;
				src_pad = MSM_CSID_PAD_SRC;
				sink_pad = MSM_ISPIF_PAD_SINK;
			} else {
				sink_entity = &camss->vfe[i].line[j].subdev.entity;
				src_pad = MSM_CSID_PAD_FIRST_SRC + j;
				sink_pad = MSM_VFE_PAD_SINK;
			}

			ret = media_create_pad_link(src_entity,
						    src_pad,
						    sink_entity,
						    sink_pad,
						    0);
			if (ret < 0) {
				camss_link_err(camss, src_entity->name,
					       sink_entity->name,
					       ret);
				return ret;
			}
		}
	}

	return 0;
}

/*
 * camss_link_entities_csiphy - Register subdev nodes and create links
 * camss_link_entities - Register subdev nodes and create links
 * @camss: CAMSS device
 *
 * Return 0 on success or a negative error code on failure
 */
static int camss_link_entities_csiphy(struct camss *camss)
static int camss_link_entities(struct camss *camss)
{
	int i, j;
	int i, j, k;
	int ret;

	for (i = 0; i < camss->res->csiphy_num; i++) {
@@ -2392,22 +2343,26 @@ static int camss_link_entities_csiphy(struct camss *camss)
		}
	}

	return 0;
	if (camss->ispif) {
		for (i = 0; i < camss->res->csid_num; i++) {
			for (j = 0; j < camss->ispif->line_num; j++) {
				ret = media_create_pad_link(&camss->csid[i].subdev.entity,
							    MSM_CSID_PAD_SRC,
							    &camss->ispif->line[j].subdev.entity,
							    MSM_ISPIF_PAD_SINK,
							    0);
				if (ret < 0) {
					camss_link_err(camss,
						       camss->csid[i].subdev.entity.name,
						       camss->ispif->line[j].subdev.entity.name,
						       ret);
					return ret;
				}
			}
		}

/*
 * camss_link_entities_ispif - Register subdev nodes and create links
 * @camss: CAMSS device
 *
 * Return 0 on success or a negative error code on failure
 */
static int camss_link_entities_ispif(struct camss *camss)
{
	int i, j, k;
	int ret;

	for (i = 0; i < camss->ispif->line_num; i++) {
		for (k = 0; k < camss->res->vfe_num; k++) {
		for (i = 0; i < camss->ispif->line_num; i++)
			for (k = 0; k < camss->res->vfe_num; k++)
				for (j = 0; j < camss->vfe[k].res->line_num; j++) {
					struct v4l2_subdev *ispif = &camss->ispif->line[i].subdev;
					struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev;
@@ -2424,34 +2379,28 @@ static int camss_link_entities_ispif(struct camss *camss)
						return ret;
					}
				}
	} else {
		for (i = 0; i < camss->res->csid_num; i++)
			for (k = 0; k < camss->res->vfe_num; k++)
				for (j = 0; j < camss->vfe[k].res->line_num; j++) {
					struct v4l2_subdev *csid = &camss->csid[i].subdev;
					struct v4l2_subdev *vfe = &camss->vfe[k].line[j].subdev;

					ret = media_create_pad_link(&csid->entity,
								    MSM_CSID_PAD_FIRST_SRC + j,
								    &vfe->entity,
								    MSM_VFE_PAD_SINK,
								    0);
					if (ret < 0) {
						camss_link_err(camss, csid->entity.name,
							       vfe->entity.name,
							       ret);
						return ret;
					}
				}

	return 0;
	}

/*
 * camss_link_entities - Register subdev nodes and create links
 * @camss: CAMSS device
 *
 * Return 0 on success or a negative error code on failure
 */
static int camss_link_entities(struct camss *camss)
{
	int ret;

	ret = camss_link_entities_csiphy(camss);
	if (ret < 0)
		return ret;

	ret = camss_link_entities_csid(camss);
	if (ret < 0)
		return ret;

	if (camss->ispif)
		ret = camss_link_entities_ispif(camss);

	return ret;
	return 0;
}

/*