Commit 287fe160 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Hans Verkuil
Browse files

media: v4l2-subdev: Turn .[gs]_frame_interval into pad operations



The subdev .[gs]_frame_interval are video operations, but they operate
on pads (and even on streams). Not only is this confusing, it causes
practical issues for drivers as the operations don't receive a subdev
state pointer, requiring manual state handling.

To improve the situation, turn the operations into pad operations, and
extend them to receive a state pointer like other pad operations.

While at it, rename the operations to .[gs]et_frame_interval at the same
time to match the naming scheme of other pad operations. This isn't
strictly necessary, but given that all drivers using those operations
need to be modified, handling the rename separately would generate more
churn for very little gain (if at all).

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> # for imx-media
Reviewed-by: Luca Ceresoli <luca.ceresoli@bootlin.com> # for tegra-video
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent 08e5c364
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -463,7 +463,8 @@ static int adv7180_g_std(struct v4l2_subdev *sd, v4l2_std_id *norm)
	return 0;
}

static int adv7180_g_frame_interval(struct v4l2_subdev *sd,
static int adv7180_get_frame_interval(struct v4l2_subdev *sd,
				      struct v4l2_subdev_state *sd_state,
				      struct v4l2_subdev_frame_interval *fi)
{
	struct adv7180_state *state = to_state(sd);
@@ -913,7 +914,6 @@ static int adv7180_subscribe_event(struct v4l2_subdev *sd,
static const struct v4l2_subdev_video_ops adv7180_video_ops = {
	.s_std = adv7180_s_std,
	.g_std = adv7180_g_std,
	.g_frame_interval = adv7180_g_frame_interval,
	.querystd = adv7180_querystd,
	.g_input_status = adv7180_g_input_status,
	.s_routing = adv7180_s_routing,
@@ -932,6 +932,7 @@ static const struct v4l2_subdev_pad_ops adv7180_pad_ops = {
	.enum_mbus_code = adv7180_enum_mbus_code,
	.set_fmt = adv7180_set_pad_format,
	.get_fmt = adv7180_get_pad_format,
	.get_frame_interval = adv7180_get_frame_interval,
	.get_mbus_config = adv7180_get_mbus_config,
};

+4 −7
Original line number Diff line number Diff line
@@ -1649,6 +1649,7 @@ static int alvium_hw_init(struct alvium_dev *alvium)
/* --------------- Subdev Operations --------------- */

static int alvium_g_frame_interval(struct v4l2_subdev *sd,
				   struct v4l2_subdev_state *sd_state,
				   struct v4l2_subdev_frame_interval *fi)
{
	struct alvium_dev *alvium = sd_to_alvium(sd);
@@ -1696,23 +1697,19 @@ static int alvium_set_frame_interval(struct alvium_dev *alvium,
}

static int alvium_s_frame_interval(struct v4l2_subdev *sd,
				   struct v4l2_subdev_state *sd_state,
				   struct v4l2_subdev_frame_interval *fi)
{
	struct alvium_dev *alvium = sd_to_alvium(sd);
	struct v4l2_subdev_state *state;
	int ret;

	if (alvium->streaming)
		return -EBUSY;

	state = v4l2_subdev_lock_and_get_active_state(sd);

	ret = alvium_set_frame_interval(alvium, fi);
	if (!ret)
		ret = alvium_set_frame_rate(alvium);

	v4l2_subdev_unlock_state(state);

	return ret;
}

@@ -2238,8 +2235,6 @@ static const struct v4l2_subdev_core_ops alvium_core_ops = {
};

static const struct v4l2_subdev_video_ops alvium_video_ops = {
	.g_frame_interval	= alvium_g_frame_interval,
	.s_frame_interval	= alvium_s_frame_interval,
	.s_stream		= alvium_s_stream,
};

@@ -2249,6 +2244,8 @@ static const struct v4l2_subdev_pad_ops alvium_pad_ops = {
	.set_fmt = alvium_set_fmt,
	.get_selection = alvium_get_selection,
	.set_selection = alvium_set_selection,
	.get_frame_interval = alvium_g_frame_interval,
	.set_frame_interval = alvium_s_frame_interval,
};

static const struct v4l2_subdev_internal_ops alvium_internal_ops = {
+4 −2
Original line number Diff line number Diff line
@@ -1046,6 +1046,7 @@ static int et8ek8_set_pad_format(struct v4l2_subdev *subdev,
}

static int et8ek8_get_frame_interval(struct v4l2_subdev *subdev,
				     struct v4l2_subdev_state *sd_state,
				     struct v4l2_subdev_frame_interval *fi)
{
	struct et8ek8_sensor *sensor = to_et8ek8_sensor(subdev);
@@ -1057,6 +1058,7 @@ static int et8ek8_get_frame_interval(struct v4l2_subdev *subdev,
}

static int et8ek8_set_frame_interval(struct v4l2_subdev *subdev,
				     struct v4l2_subdev_state *sd_state,
				     struct v4l2_subdev_frame_interval *fi)
{
	struct et8ek8_sensor *sensor = to_et8ek8_sensor(subdev);
@@ -1342,8 +1344,6 @@ static int et8ek8_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)

static const struct v4l2_subdev_video_ops et8ek8_video_ops = {
	.s_stream = et8ek8_s_stream,
	.g_frame_interval = et8ek8_get_frame_interval,
	.s_frame_interval = et8ek8_set_frame_interval,
};

static const struct v4l2_subdev_core_ops et8ek8_core_ops = {
@@ -1356,6 +1356,8 @@ static const struct v4l2_subdev_pad_ops et8ek8_pad_ops = {
	.enum_frame_interval = et8ek8_enum_frame_ival,
	.get_fmt = et8ek8_get_pad_format,
	.set_fmt = et8ek8_set_pad_format,
	.get_frame_interval = et8ek8_get_frame_interval,
	.set_frame_interval = et8ek8_set_frame_interval,
};

static const struct v4l2_subdev_ops et8ek8_ops = {
+5 −4
Original line number Diff line number Diff line
@@ -901,7 +901,8 @@ static int imx214_s_stream(struct v4l2_subdev *subdev, int enable)
	return ret;
}

static int imx214_g_frame_interval(struct v4l2_subdev *subdev,
static int imx214_get_frame_interval(struct v4l2_subdev *subdev,
				     struct v4l2_subdev_state *sd_state,
				     struct v4l2_subdev_frame_interval *fival)
{
	fival->interval.numerator = 1;
@@ -934,8 +935,6 @@ static int imx214_enum_frame_interval(struct v4l2_subdev *subdev,

static const struct v4l2_subdev_video_ops imx214_video_ops = {
	.s_stream = imx214_s_stream,
	.g_frame_interval = imx214_g_frame_interval,
	.s_frame_interval = imx214_g_frame_interval,
};

static const struct v4l2_subdev_pad_ops imx214_subdev_pad_ops = {
@@ -945,6 +944,8 @@ static const struct v4l2_subdev_pad_ops imx214_subdev_pad_ops = {
	.get_fmt = imx214_get_format,
	.set_fmt = imx214_set_format,
	.get_selection = imx214_get_selection,
	.get_frame_interval = imx214_get_frame_interval,
	.set_frame_interval = imx214_get_frame_interval,
};

static const struct v4l2_subdev_ops imx214_subdev_ops = {
+16 −32
Original line number Diff line number Diff line
@@ -594,7 +594,7 @@ static int imx274_set_gain(struct stimx274 *priv, struct v4l2_ctrl *ctrl);
static int imx274_set_exposure(struct stimx274 *priv, int val);
static int imx274_set_vflip(struct stimx274 *priv, int val);
static int imx274_set_test_pattern(struct stimx274 *priv, int val);
static int imx274_set_frame_interval(struct stimx274 *priv,
static int __imx274_set_frame_interval(struct stimx274 *priv,
				       struct v4l2_fract frame_interval);

static inline void msleep_range(unsigned int delay_base)
@@ -1327,16 +1327,8 @@ static int imx274_apply_trimming(struct stimx274 *imx274)
	return err;
}

/**
 * imx274_g_frame_interval - Get the frame interval
 * @sd: Pointer to V4L2 Sub device structure
 * @fi: Pointer to V4l2 Sub device frame interval structure
 *
 * This function is used to get the frame interval.
 *
 * Return: 0 on success
 */
static int imx274_g_frame_interval(struct v4l2_subdev *sd,
static int imx274_get_frame_interval(struct v4l2_subdev *sd,
				     struct v4l2_subdev_state *sd_state,
				     struct v4l2_subdev_frame_interval *fi)
{
	struct stimx274 *imx274 = to_imx274(sd);
@@ -1349,16 +1341,8 @@ static int imx274_g_frame_interval(struct v4l2_subdev *sd,
	return 0;
}

/**
 * imx274_s_frame_interval - Set the frame interval
 * @sd: Pointer to V4L2 Sub device structure
 * @fi: Pointer to V4l2 Sub device frame interval structure
 *
 * This function is used to set the frame intervavl.
 *
 * Return: 0 on success
 */
static int imx274_s_frame_interval(struct v4l2_subdev *sd,
static int imx274_set_frame_interval(struct v4l2_subdev *sd,
				     struct v4l2_subdev_state *sd_state,
				     struct v4l2_subdev_frame_interval *fi)
{
	struct stimx274 *imx274 = to_imx274(sd);
@@ -1371,7 +1355,7 @@ static int imx274_s_frame_interval(struct v4l2_subdev *sd,
		return ret;

	mutex_lock(&imx274->lock);
	ret = imx274_set_frame_interval(imx274, fi->interval);
	ret = __imx274_set_frame_interval(imx274, fi->interval);

	if (!ret) {
		fi->interval = imx274->frame_interval;
@@ -1466,7 +1450,7 @@ static int imx274_s_stream(struct v4l2_subdev *sd, int on)
		 * are changed.
		 * gain is not affected.
		 */
		ret = imx274_set_frame_interval(imx274,
		ret = __imx274_set_frame_interval(imx274,
						  imx274->frame_interval);
		if (ret)
			goto fail;
@@ -1830,7 +1814,7 @@ static int imx274_set_frame_length(struct stimx274 *priv, u32 val)
}

/*
 * imx274_set_frame_interval - Function called when setting frame interval
 * __imx274_set_frame_interval - Function called when setting frame interval
 * @priv: Pointer to device structure
 * @frame_interval: Variable for frame interval
 *
@@ -1839,7 +1823,7 @@ static int imx274_set_frame_length(struct stimx274 *priv, u32 val)
 *
 * Return: 0 on success
 */
static int imx274_set_frame_interval(struct stimx274 *priv,
static int __imx274_set_frame_interval(struct stimx274 *priv,
				       struct v4l2_fract frame_interval)
{
	int err;
@@ -1927,11 +1911,11 @@ static const struct v4l2_subdev_pad_ops imx274_pad_ops = {
	.set_fmt = imx274_set_fmt,
	.get_selection = imx274_get_selection,
	.set_selection = imx274_set_selection,
	.get_frame_interval = imx274_get_frame_interval,
	.set_frame_interval = imx274_set_frame_interval,
};

static const struct v4l2_subdev_video_ops imx274_video_ops = {
	.g_frame_interval = imx274_g_frame_interval,
	.s_frame_interval = imx274_s_frame_interval,
	.s_stream = imx274_s_stream,
};

Loading