Skip to content

Commit

Permalink
media: adv748x: Move format to subdev state
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jacopo Mondi authored and intel-lab-lkp committed Dec 16, 2021
1 parent beac1be commit 90158bf
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 62 deletions.
83 changes: 22 additions & 61 deletions drivers/media/i2c/adv748x/adv748x-csi2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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,
};
Expand Down
1 change: 0 additions & 1 deletion drivers/media/i2c/adv748x/adv748x.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 90158bf

Please sign in to comment.