@@ -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;
@@ -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);
};
@@ -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[] = {
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@wolfvision.net> --- 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(-)