@@ -183,76 +183,37 @@ static int adv748x_csi2_init_cfg(struct v4l2_subdev *sd,
return ret;
}
-static struct v4l2_mbus_framefmt *
-adv748x_csi2_get_pad_format(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *sd_state,
- unsigned int pad, u32 which)
-{
- struct adv748x_csi2 *tx = adv748x_sd_to_csi2(sd);
-
- if (which == V4L2_SUBDEV_FORMAT_TRY)
- return v4l2_subdev_get_try_format(sd, sd_state, pad);
-
- return &tx->format;
-}
-
-static int adv748x_csi2_get_format(struct v4l2_subdev *sd,
- struct v4l2_subdev_state *sd_state,
- struct v4l2_subdev_format *sdformat)
-{
- struct adv748x_csi2 *tx = adv748x_sd_to_csi2(sd);
- struct adv748x_state *state = tx->state;
- struct v4l2_mbus_framefmt *mbusformat;
-
- mbusformat = adv748x_csi2_get_pad_format(sd, sd_state, sdformat->pad,
- sdformat->which);
- if (!mbusformat)
- return -EINVAL;
-
- mutex_lock(&state->mutex);
-
- sdformat->format = *mbusformat;
-
- mutex_unlock(&state->mutex);
-
- return 0;
-}
-
static int adv748x_csi2_set_format(struct v4l2_subdev *sd,
struct v4l2_subdev_state *sd_state,
struct v4l2_subdev_format *sdformat)
{
- struct adv748x_csi2 *tx = adv748x_sd_to_csi2(sd);
- struct adv748x_state *state = tx->state;
- struct v4l2_mbus_framefmt *mbusformat;
+ struct v4l2_mbus_framefmt *fmt;
int ret = 0;
- mbusformat = adv748x_csi2_get_pad_format(sd, sd_state, sdformat->pad,
- sdformat->which);
- if (!mbusformat)
+ /* Do not allow to set format on the multiplexed source pad. */
+ if (sdformat->pad == ADV748X_CSI2_SOURCE)
return -EINVAL;
- mutex_lock(&state->mutex);
-
- if (sdformat->pad == ADV748X_CSI2_SOURCE) {
- const struct v4l2_mbus_framefmt *sink_fmt;
-
- sink_fmt = adv748x_csi2_get_pad_format(sd, sd_state,
- ADV748X_CSI2_SINK,
- sdformat->which);
-
- if (!sink_fmt) {
- ret = -EINVAL;
- goto unlock;
- }
-
- sdformat->format = *sink_fmt;
+ v4l2_subdev_lock_state(sd_state);
+ fmt = v4l2_state_get_stream_format(sd_state, sdformat->pad,
+ sdformat->stream);
+ if (!fmt) {
+ ret = -EINVAL;
+ goto out;
+ };
+ *fmt = sdformat->format;
+
+ /* Propagate format to the other end of the route. */
+ fmt = v4l2_subdev_state_get_opposite_stream_format(sd_state, sdformat->pad,
+ sdformat->stream);
+ if (!fmt) {
+ ret = -EINVAL;
+ goto out;
}
+ *fmt = sdformat->format;
- *mbusformat = sdformat->format;
-
-unlock:
- mutex_unlock(&state->mutex);
+out:
+ v4l2_subdev_unlock_state(sd_state);
return ret;
}
@@ -289,7 +250,7 @@ static int adv748x_csi2_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad
static const struct v4l2_subdev_pad_ops adv748x_csi2_pad_ops = {
.init_cfg = adv748x_csi2_init_cfg,
- .get_fmt = adv748x_csi2_get_format,
+ .get_fmt = v4l2_subdev_get_fmt,
.set_fmt = adv748x_csi2_set_format,
.get_mbus_config = adv748x_csi2_get_mbus_config,
};
@@ -78,7 +78,6 @@ enum adv748x_csi2_pads {
struct adv748x_csi2 {
struct adv748x_state *state;
- struct v4l2_mbus_framefmt format;
unsigned int page;
unsigned int port;
unsigned int num_lanes;
Move format handling to the v4l2_subdev state and store it per (pad, stream) combination. Now that the image format is stored in the subdev state, it can be accessed through v4l2_subdev_get_fmt() instead of open-coding it. Signed-off-by: Jacopo Mondi <jacopo+renesas@jmondi.org> --- drivers/media/i2c/adv748x/adv748x-csi2.c | 83 +++++++----------------- drivers/media/i2c/adv748x/adv748x.h | 1 - 2 files changed, 22 insertions(+), 62 deletions(-)