media: imx: imx7-mipi-csis: Centralize initialization of pad formats

Pad formats for the active configuration are manually initialized in
mipi_csis_subdev_init(), while pad formats for the TRY configurations
are initialized by the subdev .init_cfg() operation. This creates a risk
of the two configurations not being synchronized. Fix it by initializing
formats in the .init_cfg() operation only, and calling it from
mipi_csis_subdev_init().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Rui Miguel Silva <rmfrfs@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
Laurent Pinchart 2020-03-13 00:47:10 +01:00 коммит произвёл Mauro Carvalho Chehab
Родитель d321dd233b
Коммит 45cde0aab7
1 изменённых файлов: 32 добавлений и 24 удалений

Просмотреть файл

@ -649,26 +649,6 @@ out:
return ret;
}
static int mipi_csis_init_cfg(struct v4l2_subdev *mipi_sd,
struct v4l2_subdev_pad_config *cfg)
{
struct v4l2_mbus_framefmt *mf;
unsigned int i;
int ret;
for (i = 0; i < CSIS_PADS_NUM; i++) {
mf = v4l2_subdev_get_try_format(mipi_sd, cfg, i);
ret = imx_media_init_mbus_fmt(mf, MIPI_CSIS_DEF_PIX_HEIGHT,
MIPI_CSIS_DEF_PIX_WIDTH, 0,
V4L2_FIELD_NONE, NULL);
if (ret < 0)
return ret;
}
return 0;
}
static struct v4l2_mbus_framefmt *
mipi_csis_get_format(struct csi_state *state,
struct v4l2_subdev_pad_config *cfg,
@ -681,6 +661,37 @@ mipi_csis_get_format(struct csi_state *state,
return &state->format_mbus;
}
static int mipi_csis_init_cfg(struct v4l2_subdev *mipi_sd,
struct v4l2_subdev_pad_config *cfg)
{
struct csi_state *state = mipi_sd_to_csis_state(mipi_sd);
struct v4l2_mbus_framefmt *fmt_sink;
struct v4l2_mbus_framefmt *fmt_source;
enum v4l2_subdev_format_whence which;
int ret;
which = cfg ? V4L2_SUBDEV_FORMAT_TRY : V4L2_SUBDEV_FORMAT_ACTIVE;
fmt_sink = mipi_csis_get_format(state, cfg, which, CSIS_PAD_SINK);
ret = imx_media_init_mbus_fmt(fmt_sink, MIPI_CSIS_DEF_PIX_WIDTH,
MIPI_CSIS_DEF_PIX_HEIGHT, 0,
V4L2_FIELD_NONE, NULL);
if (ret < 0)
return ret;
/*
* When called from mipi_csis_subdev_init() to initialize the active
* configuration, cfg is NULL, which indicates there's no source pad
* configuration to set.
*/
if (!cfg)
return 0;
fmt_source = mipi_csis_get_format(state, cfg, which, CSIS_PAD_SOURCE);
*fmt_source = *fmt_sink;
return 0;
}
static int mipi_csis_get_fmt(struct v4l2_subdev *mipi_sd,
struct v4l2_subdev_pad_config *cfg,
struct v4l2_subdev_format *sdformat)
@ -875,10 +886,7 @@ static int mipi_csis_subdev_init(struct v4l2_subdev *mipi_sd,
mipi_sd->dev = &pdev->dev;
state->csis_fmt = &mipi_csis_formats[0];
state->format_mbus.code = mipi_csis_formats[0].code;
state->format_mbus.width = MIPI_CSIS_DEF_PIX_WIDTH;
state->format_mbus.height = MIPI_CSIS_DEF_PIX_HEIGHT;
state->format_mbus.field = V4L2_FIELD_NONE;
mipi_csis_init_cfg(mipi_sd, NULL);
v4l2_set_subdevdata(mipi_sd, &pdev->dev);