Commit 256b7767 authored by Sakari Ailus's avatar Sakari Ailus Committed by Hans Verkuil
Browse files

media: ccs: Rework initialising sub-device state



Initialise sub-device state in init_cfg callback using ccs_propagate() to
the extent it covers of the initialisation. This fixes a bug where the
driver configuration was incorrectly initialised.

Fixes: d8bca3ed ("media: ccs: Use sub-device active state")
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent ab75641f
Loading
Loading
Loading
Loading
+28 −17
Original line number Diff line number Diff line
@@ -2075,6 +2075,7 @@ static void ccs_propagate(struct v4l2_subdev *subdev,
	struct ccs_sensor *sensor = to_ccs_sensor(subdev);
	struct ccs_subdev *ssd = to_ccs_subdev(subdev);
	struct v4l2_rect *comp, *crops[CCS_PADS];
	struct v4l2_mbus_framefmt *fmt;

	ccs_get_crop_compose(subdev, sd_state, crops, &comp);

@@ -2096,6 +2097,9 @@ static void ccs_propagate(struct v4l2_subdev *subdev,
		fallthrough;
	case V4L2_SEL_TGT_COMPOSE:
		*crops[CCS_PAD_SRC] = *comp;
		fmt = v4l2_subdev_get_pad_format(subdev, sd_state, CCS_PAD_SRC);
		fmt->width = comp->width;
		fmt->height = comp->height;
		if (which == V4L2_SUBDEV_FORMAT_ACTIVE && ssd == sensor->src)
			sensor->src_src = *crops[CCS_PAD_SRC];
		break;
@@ -3003,16 +3007,15 @@ static int ccs_init_cfg(struct v4l2_subdev *sd,
{
	struct ccs_subdev *ssd = to_ccs_subdev(sd);
	struct ccs_sensor *sensor = ssd->sensor;
	unsigned int i;

	mutex_lock(&sensor->mutex);

	for (i = 0; i < ssd->npads; i++) {
	unsigned int pad = ssd == sensor->pixel_array ?
		CCS_PA_PAD_SRC : CCS_PAD_SINK;
	struct v4l2_mbus_framefmt *fmt =
			v4l2_subdev_get_pad_format(sd, sd_state, i);
		v4l2_subdev_get_pad_format(sd, sd_state, pad);
	struct v4l2_rect *crop =
			v4l2_subdev_get_pad_crop(sd, sd_state, i);
		struct v4l2_rect *comp;
		v4l2_subdev_get_pad_crop(sd, sd_state, pad);
	bool is_active = !sd->active_state || sd->active_state == sd_state;

	mutex_lock(&sensor->mutex);

	ccs_get_native_size(ssd, crop);

@@ -3021,13 +3024,21 @@ static int ccs_init_cfg(struct v4l2_subdev *sd,
	fmt->code = sensor->internal_csi_format->code;
	fmt->field = V4L2_FIELD_NONE;

		if (ssd == sensor->pixel_array)
			continue;
	if (ssd == sensor->pixel_array) {
		if (is_active)
			sensor->pa_src = *crop;

		comp = v4l2_subdev_get_pad_compose(sd, sd_state, i);
		*comp = *crop;
		mutex_unlock(&sensor->mutex);
		return 0;
	}

	fmt = v4l2_subdev_get_pad_format(sd, sd_state, CCS_PAD_SRC);
	fmt->code = ssd == sensor->src ?
		sensor->csi_format->code : sensor->internal_csi_format->code;
	fmt->field = V4L2_FIELD_NONE;

	ccs_propagate(sd, sd_state, is_active, V4L2_SEL_TGT_CROP);

	mutex_unlock(&sensor->mutex);

	return 0;