Commit 67673ed5 authored by Rui Miguel Silva's avatar Rui Miguel Silva Committed by Mauro Carvalho Chehab
Browse files

media: staging/imx: rearrange group id to take in account IPU



Some imx system do not have IPU, so prepare the imx media drivers to
support this kind of devices. Rename the group ids to include an _IPU_
prefix, add a new group id to support systems with only a CSI without
IPU, and also rename the create internal links to make it clear that
only systems with IPU have internal subdevices.

Signed-off-by: default avatarRui Miguel Silva <rui.silva@linaro.org>
Acked-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 174bcae1
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -41,13 +41,13 @@ static int imx_ic_probe(struct platform_device *pdev)
	pdata = priv->dev->platform_data;
	priv->ipu_id = pdata->ipu_id;
	switch (pdata->grp_id) {
	case IMX_MEDIA_GRP_ID_IC_PRP:
	case IMX_MEDIA_GRP_ID_IPU_IC_PRP:
		priv->task_id = IC_TASK_PRP;
		break;
	case IMX_MEDIA_GRP_ID_IC_PRPENC:
	case IMX_MEDIA_GRP_ID_IPU_IC_PRPENC:
		priv->task_id = IC_TASK_ENCODER;
		break;
	case IMX_MEDIA_GRP_ID_IC_PRPVF:
	case IMX_MEDIA_GRP_ID_IPU_IC_PRPVF:
		priv->task_id = IC_TASK_VIEWFINDER;
		break;
	default:
+8 −8
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ static int prp_start(struct prp_priv *priv)
	priv->ipu = priv->md->ipu[ic_priv->ipu_id];

	/* set IC to receive from CSI or VDI depending on source */
	src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC);
	src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC);

	ipu_set_ic_src_mux(priv->ipu, priv->csi_id, src_is_vdic);

@@ -237,8 +237,8 @@ static int prp_link_setup(struct media_entity *entity,
				ret = -EBUSY;
				goto out;
			}
			if (priv->sink_sd_prpenc && (remote_sd->grp_id &
						     IMX_MEDIA_GRP_ID_VDIC)) {
			if (priv->sink_sd_prpenc &&
			    (remote_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC)) {
				ret = -EINVAL;
				goto out;
			}
@@ -259,7 +259,7 @@ static int prp_link_setup(struct media_entity *entity,
				goto out;
			}
			if (priv->src_sd && (priv->src_sd->grp_id &
					     IMX_MEDIA_GRP_ID_VDIC)) {
					     IMX_MEDIA_GRP_ID_IPU_VDIC)) {
				ret = -EINVAL;
				goto out;
			}
@@ -309,13 +309,13 @@ static int prp_link_validate(struct v4l2_subdev *sd,
		return ret;

	csi = imx_media_find_upstream_subdev(priv->md, &ic_priv->sd.entity,
					     IMX_MEDIA_GRP_ID_CSI);
					     IMX_MEDIA_GRP_ID_IPU_CSI);
	if (IS_ERR(csi))
		csi = NULL;

	mutex_lock(&priv->lock);

	if (priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC) {
	if (priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC) {
		/*
		 * the ->PRPENC link cannot be enabled if the source
		 * is the VDIC
@@ -334,10 +334,10 @@ static int prp_link_validate(struct v4l2_subdev *sd,

	if (csi) {
		switch (csi->grp_id) {
		case IMX_MEDIA_GRP_ID_CSI0:
		case IMX_MEDIA_GRP_ID_IPU_CSI0:
			priv->csi_id = 0;
			break;
		case IMX_MEDIA_GRP_ID_CSI1:
		case IMX_MEDIA_GRP_ID_IPU_CSI1:
			priv->csi_id = 1;
			break;
		default:
+3 −3
Original line number Diff line number Diff line
@@ -1074,10 +1074,10 @@ static int csi_link_setup(struct media_entity *entity,

		remote_sd = media_entity_to_v4l2_subdev(remote->entity);
		switch (remote_sd->grp_id) {
		case IMX_MEDIA_GRP_ID_VDIC:
		case IMX_MEDIA_GRP_ID_IPU_VDIC:
			priv->dest = IPU_CSI_DEST_VDIC;
			break;
		case IMX_MEDIA_GRP_ID_IC_PRP:
		case IMX_MEDIA_GRP_ID_IPU_IC_PRP:
			priv->dest = IPU_CSI_DEST_IC;
			break;
		default:
@@ -1973,7 +1973,7 @@ static int imx_csi_probe(struct platform_device *pdev)
	priv->sd.owner = THIS_MODULE;
	priv->sd.flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
	priv->sd.grp_id = priv->csi_id ?
		IMX_MEDIA_GRP_ID_CSI1 : IMX_MEDIA_GRP_ID_CSI0;
		IMX_MEDIA_GRP_ID_IPU_CSI1 : IMX_MEDIA_GRP_ID_IPU_CSI0;
	imx_media_grp_id_to_sd_name(priv->sd.name, sizeof(priv->sd.name),
				    priv->sd.grp_id, ipu_get_num(priv->ipu));

+13 −9
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,

	mutex_lock(&imxmd->mutex);

	if (sd->grp_id & IMX_MEDIA_GRP_ID_CSI) {
	if (sd->grp_id & IMX_MEDIA_GRP_ID_IPU_CSI) {
		ret = imx_media_get_ipu(imxmd, sd);
		if (ret)
			goto out;
@@ -149,13 +149,13 @@ static int imx_media_create_links(struct v4l2_async_notifier *notifier)

	list_for_each_entry(sd, &imxmd->v4l2_dev.subdevs, list) {
		switch (sd->grp_id) {
		case IMX_MEDIA_GRP_ID_VDIC:
		case IMX_MEDIA_GRP_ID_IC_PRP:
		case IMX_MEDIA_GRP_ID_IC_PRPENC:
		case IMX_MEDIA_GRP_ID_IC_PRPVF:
		case IMX_MEDIA_GRP_ID_CSI0:
		case IMX_MEDIA_GRP_ID_CSI1:
			ret = imx_media_create_internal_links(imxmd, sd);
		case IMX_MEDIA_GRP_ID_IPU_VDIC:
		case IMX_MEDIA_GRP_ID_IPU_IC_PRP:
		case IMX_MEDIA_GRP_ID_IPU_IC_PRPENC:
		case IMX_MEDIA_GRP_ID_IPU_IC_PRPVF:
		case IMX_MEDIA_GRP_ID_IPU_CSI0:
		case IMX_MEDIA_GRP_ID_IPU_CSI1:
			ret = imx_media_create_ipu_internal_links(imxmd, sd);
			if (ret)
				return ret;
			/*
@@ -163,9 +163,13 @@ static int imx_media_create_links(struct v4l2_async_notifier *notifier)
			 * internal entities, so create the external links
			 * to the CSI sink pads.
			 */
			if (sd->grp_id & IMX_MEDIA_GRP_ID_CSI)
			if (sd->grp_id & IMX_MEDIA_GRP_ID_IPU_CSI)
				imx_media_create_csi_of_links(imxmd, sd);
			break;
		case IMX_MEDIA_GRP_ID_CSI:
			imx_media_create_csi_of_links(imxmd, sd);

			break;
		default:
			/*
			 * if this subdev has fwnode links, create media
+10 −10
Original line number Diff line number Diff line
@@ -30,32 +30,32 @@ static const struct internal_subdev_id {
} isd_id[num_isd] = {
	[isd_csi0] = {
		.index = isd_csi0,
		.grp_id = IMX_MEDIA_GRP_ID_CSI0,
		.grp_id = IMX_MEDIA_GRP_ID_IPU_CSI0,
		.name = "imx-ipuv3-csi",
	},
	[isd_csi1] = {
		.index = isd_csi1,
		.grp_id = IMX_MEDIA_GRP_ID_CSI1,
		.grp_id = IMX_MEDIA_GRP_ID_IPU_CSI1,
		.name = "imx-ipuv3-csi",
	},
	[isd_vdic] = {
		.index = isd_vdic,
		.grp_id = IMX_MEDIA_GRP_ID_VDIC,
		.grp_id = IMX_MEDIA_GRP_ID_IPU_VDIC,
		.name = "imx-ipuv3-vdic",
	},
	[isd_ic_prp] = {
		.index = isd_ic_prp,
		.grp_id = IMX_MEDIA_GRP_ID_IC_PRP,
		.grp_id = IMX_MEDIA_GRP_ID_IPU_IC_PRP,
		.name = "imx-ipuv3-ic",
	},
	[isd_ic_prpenc] = {
		.index = isd_ic_prpenc,
		.grp_id = IMX_MEDIA_GRP_ID_IC_PRPENC,
		.grp_id = IMX_MEDIA_GRP_ID_IPU_IC_PRPENC,
		.name = "imx-ipuv3-ic",
	},
	[isd_ic_prpvf] = {
		.index = isd_ic_prpvf,
		.grp_id = IMX_MEDIA_GRP_ID_IC_PRPVF,
		.grp_id = IMX_MEDIA_GRP_ID_IPU_IC_PRPVF,
		.name = "imx-ipuv3-ic",
	},
};
@@ -229,7 +229,7 @@ static int create_ipu_internal_link(struct imx_media_dev *imxmd,
	return ret;
}

int imx_media_create_internal_links(struct imx_media_dev *imxmd,
int imx_media_create_ipu_internal_links(struct imx_media_dev *imxmd,
					struct v4l2_subdev *sd)
{
	const struct internal_subdev *intsd;
@@ -312,8 +312,8 @@ static int add_ipu_internal_subdevs(struct imx_media_dev *imxmd, int ipu_id)
		 * of_parse_subdev().
		 */
		switch (isd->id->grp_id) {
		case IMX_MEDIA_GRP_ID_CSI0:
		case IMX_MEDIA_GRP_ID_CSI1:
		case IMX_MEDIA_GRP_ID_IPU_CSI0:
		case IMX_MEDIA_GRP_ID_IPU_CSI1:
			ret = 0;
			break;
		default:
Loading