@@ -29,6 +29,13 @@ static const struct stf_isp_format isp_formats_source[] = {
{ MEDIA_BUS_FMT_YUYV8_1_5X8, 8 },
};
+static const struct stf_isp_format isp_formats_source_bayer[] = {
+ { MEDIA_BUS_FMT_SRGGB12_1X12, 12 },
+ { MEDIA_BUS_FMT_SGRBG12_1X12, 12 },
+ { MEDIA_BUS_FMT_SGBRG12_1X12, 12 },
+ { MEDIA_BUS_FMT_SBGGR12_1X12, 12 },
+};
+
static const struct stf_isp_format isp_formats_source_scd[] = {
{ MEDIA_BUS_FMT_METADATA_FIXED },
};
@@ -37,6 +44,7 @@ static const struct stf_isp_format_table isp_formats_st7110[] = {
{ isp_formats_sink, ARRAY_SIZE(isp_formats_sink) },
{ isp_formats_sink_params, ARRAY_SIZE(isp_formats_sink_params) },
{ isp_formats_source, ARRAY_SIZE(isp_formats_source) },
+ { isp_formats_source_bayer, ARRAY_SIZE(isp_formats_source_bayer) },
{ isp_formats_source_scd, ARRAY_SIZE(isp_formats_source_scd) },
};
@@ -311,8 +319,11 @@ static int isp_set_selection(struct v4l2_subdev *sd,
crop.target = V4L2_SEL_TGT_CROP;
crop.r = *rect;
isp_set_selection(sd, state, &crop);
+
+ crop.pad = STF_ISP_PAD_SRC_BAYER;
+ isp_set_selection(sd, state, &crop);
} else if (sel->target == V4L2_SEL_TGT_CROP &&
- sel->pad == STF_ISP_PAD_SRC) {
+ (sel->pad == STF_ISP_PAD_SRC || sel->pad == STF_ISP_PAD_SRC_BAYER)) {
struct v4l2_subdev_format fmt = { 0 };
rect = v4l2_subdev_state_get_crop(state, sel->pad);
@@ -324,7 +335,7 @@ static int isp_set_selection(struct v4l2_subdev *sd,
/* Reset source pad format width and height */
fmt.which = sel->which;
- fmt.pad = STF_ISP_PAD_SRC;
+ fmt.pad = sel->pad;
fmt.format.width = rect->width;
fmt.format.height = rect->height;
isp_set_format(sd, state, &fmt);
@@ -368,7 +379,7 @@ static int isp_init_formats(struct v4l2_subdev *sd,
};
int ret;
- /* Init for STF_ISP_PAD_SINK and STF_ISP_PAD_SRC pad */
+ /* Init for STF_ISP_PAD_SINK, STF_ISP_PAD_SRC and STF_ISP_PAD_SRC_BAYER pad */
ret = isp_set_format(sd, sd_state, &format);
if (ret < 0)
return ret;
@@ -422,6 +433,7 @@ int stf_isp_register(struct stf_isp_dev *isp_dev, struct v4l2_device *v4l2_dev)
pads[STF_ISP_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
pads[STF_ISP_PAD_SINK_PARAMS].flags = MEDIA_PAD_FL_SINK;
pads[STF_ISP_PAD_SRC].flags = MEDIA_PAD_FL_SOURCE;
+ pads[STF_ISP_PAD_SRC_BAYER].flags = MEDIA_PAD_FL_SOURCE;
pads[STF_ISP_PAD_SRC_SCD].flags = MEDIA_PAD_FL_SOURCE;
sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_ISP;
@@ -529,6 +529,7 @@ enum stf_isp_pad_id {
STF_ISP_PAD_SINK = 0,
STF_ISP_PAD_SINK_PARAMS,
STF_ISP_PAD_SRC,
+ STF_ISP_PAD_SRC_BAYER,
STF_ISP_PAD_SRC_SCD,
STF_ISP_PAD_MAX
};