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

Commit 24105ebc authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Mauro Carvalho Chehab
Browse files

[media] soc-camera: fix a recent multi-camera breakage on sh-mobile



With the introduction of CSI2 support on sh-mobile, the host driver
switched to using v4l2_device_call_until_err() with grp_id == 0 to
call subdev operations on the sensor and the CSI2 subdev. However,
this has broken multi-client set ups like the one on migor, because
that way all operations get called on both clients. To fix this add
a grp_id and set it to the client private context.

Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent c6c73544
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -922,7 +922,7 @@ static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int
			/* Try 2560x1920, 1280x960, 640x480, 320x240 */
			mf.width	= 2560 >> shift;
			mf.height	= 1920 >> shift;
			ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
			ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
							 s_mbus_fmt, &mf);
			if (ret < 0)
				return ret;
@@ -1224,7 +1224,7 @@ static int client_s_fmt(struct soc_camera_device *icd,
	struct v4l2_cropcap cap;
	int ret;

	ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
					 s_mbus_fmt, mf);
	if (ret < 0)
		return ret;
@@ -1254,7 +1254,7 @@ static int client_s_fmt(struct soc_camera_device *icd,
		tmp_h = min(2 * tmp_h, max_height);
		mf->width = tmp_w;
		mf->height = tmp_h;
		ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
		ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
						 s_mbus_fmt, mf);
		dev_geo(dev, "Camera scaled to %ux%u\n",
			mf->width, mf->height);
@@ -1658,7 +1658,7 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
	mf.code		= xlate->code;
	mf.colorspace	= pix->colorspace;

	ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, try_mbus_fmt, &mf);
	ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf);
	if (ret < 0)
		return ret;

@@ -1682,7 +1682,7 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd,
			 */
			mf.width = 2560;
			mf.height = 1920;
			ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video,
			ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
							 try_mbus_fmt, &mf);
			if (ret < 0) {
				/* Shouldn't actually happen... */
+1 −0
Original line number Diff line number Diff line
@@ -208,6 +208,7 @@ static int sh_csi2_notify(struct notifier_block *nb,
	case BUS_NOTIFY_BOUND_DRIVER:
		snprintf(priv->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s%s",
			 dev_name(v4l2_dev->dev), ".mipi-csi");
		priv->subdev.grp_id = (long)icd;
		ret = v4l2_device_register_subdev(v4l2_dev, &priv->subdev);
		dev_dbg(dev, "%s(%p): ret(register_subdev) = %d\n", __func__, priv, ret);
		if (ret < 0)
+3 −1
Original line number Diff line number Diff line
@@ -1071,6 +1071,9 @@ static int soc_camera_probe(struct device *dev)
		}
	}

	sd = soc_camera_to_subdev(icd);
	sd->grp_id = (long)icd;

	/* At this point client .probe() should have run already */
	ret = soc_camera_init_user_formats(icd);
	if (ret < 0)
@@ -1092,7 +1095,6 @@ static int soc_camera_probe(struct device *dev)
		goto evidstart;

	/* Try to improve our guess of a reasonable window format */
	sd = soc_camera_to_subdev(icd);
	if (!v4l2_subdev_call(sd, video, g_mbus_fmt, &mf)) {
		icd->user_width		= mf.width;
		icd->user_height	= mf.height;