[PATCH 10/14] media: rockchip: cif: add variant specific input format list

From: Michael Riesch
Date: Tue Feb 20 2024 - 04:43:45 EST


The different variants of the Rockchip CIF may feature different input
formats. Add a variant specific input format list to account for this.

Signed-off-by: Michael Riesch <michael.riesch@xxxxxxxxxxxxxx>
---
drivers/media/platform/rockchip/cif/cif-capture.c | 154 +---------------------
drivers/media/platform/rockchip/cif/cif-common.h | 2 +
drivers/media/platform/rockchip/cif/cif-dev.c | 147 +++++++++++++++++++++
3 files changed, 154 insertions(+), 149 deletions(-)

diff --git a/drivers/media/platform/rockchip/cif/cif-capture.c b/drivers/media/platform/rockchip/cif/cif-capture.c
index c80a52028a21..b26e6023c2b0 100644
--- a/drivers/media/platform/rockchip/cif/cif-capture.c
+++ b/drivers/media/platform/rockchip/cif/cif-capture.c
@@ -109,154 +109,10 @@ static struct cif_output_fmt out_fmts[] = {
}
};

-static const struct cif_input_fmt in_fmts[] = {
- {
- .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_YUYV,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_YUYV,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_INTERLACED,
- }, {
- .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_YVYU,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_YVYU,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_INTERLACED,
- }, {
- .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_UYVY,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_UYVY,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_INTERLACED,
- }, {
- .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_VYUY,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8,
- .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
- CIF_FORMAT_YUV_INPUT_ORDER_VYUY,
- .fmt_type = CIF_FMT_TYPE_YUV,
- .field = V4L2_FIELD_INTERLACED,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_8,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_8,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_8,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_8,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_10,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_10,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_10,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_10,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_12,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_12,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_12,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_12,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_RGB888_1X24,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_Y8_1X8,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_8,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_Y10_1X10,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_10,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }, {
- .mbus_code = MEDIA_BUS_FMT_Y12_1X12,
- .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
- CIF_FORMAT_RAW_DATA_WIDTH_12,
- .fmt_type = CIF_FMT_TYPE_RAW,
- .field = V4L2_FIELD_NONE,
- }
-};
-
-static const struct
-cif_input_fmt *get_input_fmt(struct v4l2_subdev *sd)
+static const struct cif_input_fmt *get_input_fmt(struct cif_device *cif_dev,
+ struct v4l2_subdev *sd)
{
+ const struct cif_input_fmt *in_fmts = cif_dev->match_data->in_fmts;
struct v4l2_subdev_format fmt;
u32 i;

@@ -264,7 +120,7 @@ cif_input_fmt *get_input_fmt(struct v4l2_subdev *sd)
fmt.pad = 0;
v4l2_subdev_call(sd, pad, get_fmt, NULL, &fmt);

- for (i = 0; i < ARRAY_SIZE(in_fmts); i++)
+ for (i = 0; i < cif_dev->match_data->in_fmts_num; i++)
if (fmt.format.code == in_fmts[i].mbus_code &&
fmt.format.field == in_fmts[i].field)
return &in_fmts[i];
@@ -550,7 +406,7 @@ static int cif_start_streaming(struct vb2_queue *queue, unsigned int count)

sd = cif_dev->remote.sd;

- stream->cif_fmt_in = get_input_fmt(cif_dev->remote.sd);
+ stream->cif_fmt_in = get_input_fmt(cif_dev, sd);
if (!stream->cif_fmt_in)
goto runtime_put;

diff --git a/drivers/media/platform/rockchip/cif/cif-common.h b/drivers/media/platform/rockchip/cif/cif-common.h
index ae8fedeadd1c..84a7545422e1 100644
--- a/drivers/media/platform/rockchip/cif/cif-common.h
+++ b/drivers/media/platform/rockchip/cif/cif-common.h
@@ -97,6 +97,8 @@ static inline struct cif_stream *to_cif_stream(struct video_device *vdev)
struct cif_match_data {
struct clk_bulk_data *clks;
int clks_num;
+ const struct cif_input_fmt *in_fmts;
+ int in_fmts_num;
void (*grf_dvp_setup)(struct cif_device *cif_dev);
};

diff --git a/drivers/media/platform/rockchip/cif/cif-dev.c b/drivers/media/platform/rockchip/cif/cif-dev.c
index b75b76508793..fb80e8f8dcab 100644
--- a/drivers/media/platform/rockchip/cif/cif-dev.c
+++ b/drivers/media/platform/rockchip/cif/cif-dev.c
@@ -132,9 +132,156 @@ static struct clk_bulk_data px30_cif_clks[] = {
{ .id = "pclk", },
};

+static const struct cif_input_fmt px30_in_fmts[] = {
+ {
+ .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_YUYV,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_YUYV,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_INTERLACED,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_YVYU,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_YVYU8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_YVYU,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_INTERLACED,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_UYVY,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_UYVY8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_UYVY,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_INTERLACED,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_VYUY,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_VYUY8_2X8,
+ .dvp_fmt_val = CIF_FORMAT_YUV_INPUT_422 |
+ CIF_FORMAT_YUV_INPUT_ORDER_VYUY,
+ .fmt_type = CIF_FMT_TYPE_YUV,
+ .field = V4L2_FIELD_INTERLACED,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_8,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_8,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_8,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_8,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_10,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_10,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_10,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_10,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_12,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_12,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_12,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_12,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_RGB888_1X24,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_Y8_1X8,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_8,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_Y10_1X10,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_10,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }, {
+ .mbus_code = MEDIA_BUS_FMT_Y12_1X12,
+ .dvp_fmt_val = CIF_FORMAT_INPUT_MODE_RAW |
+ CIF_FORMAT_RAW_DATA_WIDTH_12,
+ .fmt_type = CIF_FMT_TYPE_RAW,
+ .field = V4L2_FIELD_NONE,
+ }
+};
+
static const struct cif_match_data px30_cif_match_data = {
.clks = px30_cif_clks,
.clks_num = ARRAY_SIZE(px30_cif_clks),
+ .in_fmts = px30_in_fmts,
+ .in_fmts_num = ARRAY_SIZE(px30_in_fmts),
};

static const struct of_device_id cif_plat_of_match[] = {

--
2.30.2