Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3ef46bc9 authored by Steve Longerbeam's avatar Steve Longerbeam Committed by Mauro Carvalho Chehab
Browse files

media: staging/imx: Improve pipeline searching



Export find_pipeline_pad(), renaming to imx_media_pipeline_pad(), and
extend its functionality to allow searching for video devices in the
enabled pipeline in addition to sub-devices.

As part of this:

- Rename imx_media_find_mipi_csi2_channel() to
  imx_media_pipeline_csi2_channel().

- Remove imx_media_find_upstream_pad(), it is redundant now.

- Rename imx_media_find_upstream_subdev() to imx_media_pipeline_subdev()
  with an additional boolean argument for searching upstream or downstream.

- Add imx_media_pipeline_video_device() which is analogous to
  imx_media_pipeline_subdev() but searches for video devices.

- Remove imxmd pointer arg from all of the functions above, it was
  never used in those functions. With that change the i.MX5/6 CSI,
  VDIC, and IC sub-devices no longer require the media_device.

Signed-off-by: default avatarSteve Longerbeam <slongerbeam@gmail.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 6b8952db
Loading
Loading
Loading
Loading
+1 −3
Original line number Original line Diff line number Diff line
@@ -18,12 +18,11 @@ static struct imx_ic_ops *ic_ops[IC_NUM_OPS] = {
	[IC_TASK_VIEWFINDER]     = &imx_ic_prpencvf_ops,
	[IC_TASK_VIEWFINDER]     = &imx_ic_prpencvf_ops,
};
};


struct v4l2_subdev *imx_media_ic_register(struct imx_media_dev *imxmd,
struct v4l2_subdev *imx_media_ic_register(struct v4l2_device *v4l2_dev,
					  struct device *ipu_dev,
					  struct device *ipu_dev,
					  struct ipu_soc *ipu,
					  struct ipu_soc *ipu,
					  u32 grp_id)
					  u32 grp_id)
{
{
	struct v4l2_device *v4l2_dev = &imxmd->v4l2_dev;
	struct imx_ic_priv *priv;
	struct imx_ic_priv *priv;
	int ret;
	int ret;


@@ -33,7 +32,6 @@ struct v4l2_subdev *imx_media_ic_register(struct imx_media_dev *imxmd,


	priv->ipu_dev = ipu_dev;
	priv->ipu_dev = ipu_dev;
	priv->ipu = ipu;
	priv->ipu = ipu;
	priv->md = imxmd;


	/* get our IC task id */
	/* get our IC task id */
	switch (grp_id) {
	switch (grp_id) {
+2 −2
Original line number Original line Diff line number Diff line
@@ -298,8 +298,8 @@ static int prp_link_validate(struct v4l2_subdev *sd,
	if (ret)
	if (ret)
		return ret;
		return ret;


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


+0 −1
Original line number Original line Diff line number Diff line
@@ -12,7 +12,6 @@
struct imx_ic_priv {
struct imx_ic_priv {
	struct device *ipu_dev;
	struct device *ipu_dev;
	struct ipu_soc *ipu;
	struct ipu_soc *ipu;
	struct imx_media_dev *md;
	struct v4l2_subdev sd;
	struct v4l2_subdev sd;
	int    task_id;
	int    task_id;
	void   *task_priv;
	void   *task_priv;
+4 −9
Original line number Original line Diff line number Diff line
@@ -56,7 +56,6 @@ struct csi_skip_desc {
struct csi_priv {
struct csi_priv {
	struct device *dev;
	struct device *dev;
	struct ipu_soc *ipu;
	struct ipu_soc *ipu;
	struct imx_media_dev *md;
	struct v4l2_subdev sd;
	struct v4l2_subdev sd;
	struct media_pad pad[CSI_NUM_PADS];
	struct media_pad pad[CSI_NUM_PADS];
	/* the video device at IDMAC output pad */
	/* the video device at IDMAC output pad */
@@ -178,8 +177,8 @@ static int csi_get_upstream_endpoint(struct csi_priv *priv,
		 * CSI-2 receiver if it is in the path, otherwise stay
		 * CSI-2 receiver if it is in the path, otherwise stay
		 * with video mux.
		 * with video mux.
		 */
		 */
		sd = imx_media_find_upstream_subdev(priv->md, src,
		sd = imx_media_pipeline_subdev(src, IMX_MEDIA_GRP_ID_CSI2,
						    IMX_MEDIA_GRP_ID_CSI2);
					       true);
		if (!IS_ERR(sd))
		if (!IS_ERR(sd))
			src = &sd->entity;
			src = &sd->entity;
	}
	}
@@ -193,7 +192,7 @@ static int csi_get_upstream_endpoint(struct csi_priv *priv,
		src = &priv->sd.entity;
		src = &priv->sd.entity;


	/* get source pad of entity directly upstream from src */
	/* get source pad of entity directly upstream from src */
	pad = imx_media_find_upstream_pad(priv->md, src, 0);
	pad = imx_media_pipeline_pad(src, 0, 0, true);
	if (IS_ERR(pad))
	if (IS_ERR(pad))
		return PTR_ERR(pad);
		return PTR_ERR(pad);


@@ -1134,8 +1133,7 @@ static int csi_link_validate(struct v4l2_subdev *sd,
		 */
		 */
#if 0
#if 0
		mutex_unlock(&priv->lock);
		mutex_unlock(&priv->lock);
		vc_num = imx_media_find_mipi_csi2_channel(priv->md,
		vc_num = imx_media_find_mipi_csi2_channel(&priv->sd.entity);
							  &priv->sd.entity);
		if (vc_num < 0)
		if (vc_num < 0)
			return vc_num;
			return vc_num;
		mutex_lock(&priv->lock);
		mutex_lock(&priv->lock);
@@ -1749,9 +1747,6 @@ static int csi_registered(struct v4l2_subdev *sd)
	int i, ret;
	int i, ret;
	u32 code;
	u32 code;


	/* get media device */
	priv->md = dev_get_drvdata(sd->v4l2_dev->dev);

	/* get handle to IPU CSI */
	/* get handle to IPU CSI */
	csi = ipu_csi_get(priv->ipu, priv->csi_id);
	csi = ipu_csi_get(priv->ipu, priv->csi_id);
	if (IS_ERR(csi)) {
	if (IS_ERR(csi)) {
+0 −4
Original line number Original line Diff line number Diff line
@@ -37,8 +37,6 @@ enum {
#define FIM_CL_TOLERANCE_MAX_DEF   0 /* no max tolerance (unbounded) */
#define FIM_CL_TOLERANCE_MAX_DEF   0 /* no max tolerance (unbounded) */


struct imx_media_fim {
struct imx_media_fim {
	struct imx_media_dev *md;

	/* the owning subdev of this fim instance */
	/* the owning subdev of this fim instance */
	struct v4l2_subdev *sd;
	struct v4l2_subdev *sd;


@@ -470,8 +468,6 @@ struct imx_media_fim *imx_media_fim_init(struct v4l2_subdev *sd)
	if (!fim)
	if (!fim)
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);


	/* get media device */
	fim->md = dev_get_drvdata(sd->v4l2_dev->dev);
	fim->sd = sd;
	fim->sd = sd;


	spin_lock_init(&fim->lock);
	spin_lock_init(&fim->lock);
Loading