The upcoming CSI receiver split from the ISP to a separate source file will need to be able to access the list of formats supported by the driver. Move it out of the ISP's header and into the common header, and add helper functions for accessing it so that the format list doesn't need to be stored in the header. Signed-off-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Dafna Hirschfeld <dafna@fastmail.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
180 lines
4.9 KiB
C
180 lines
4.9 KiB
C
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
|
/*
|
|
* Rockchip ISP1 Driver - Common definitions
|
|
*
|
|
* Copyright (C) 2019 Collabora, Ltd.
|
|
*/
|
|
|
|
#include <media/mipi-csi2.h>
|
|
#include <media/v4l2-rect.h>
|
|
|
|
#include "rkisp1-common.h"
|
|
|
|
static const struct rkisp1_mbus_info rkisp1_formats[] = {
|
|
{
|
|
.mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
|
|
.pixel_enc = V4L2_PIXEL_ENC_YUV,
|
|
.direction = RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW10,
|
|
.bayer_pat = RKISP1_RAW_RGGB,
|
|
.bus_width = 10,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW10,
|
|
.bayer_pat = RKISP1_RAW_BGGR,
|
|
.bus_width = 10,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW10,
|
|
.bayer_pat = RKISP1_RAW_GBRG,
|
|
.bus_width = 10,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW10,
|
|
.bayer_pat = RKISP1_RAW_GRBG,
|
|
.bus_width = 10,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW12,
|
|
.bayer_pat = RKISP1_RAW_RGGB,
|
|
.bus_width = 12,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW12,
|
|
.bayer_pat = RKISP1_RAW_BGGR,
|
|
.bus_width = 12,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW12,
|
|
.bayer_pat = RKISP1_RAW_GBRG,
|
|
.bus_width = 12,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW12,
|
|
.bayer_pat = RKISP1_RAW_GRBG,
|
|
.bus_width = 12,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW8,
|
|
.bayer_pat = RKISP1_RAW_RGGB,
|
|
.bus_width = 8,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW8,
|
|
.bayer_pat = RKISP1_RAW_BGGR,
|
|
.bus_width = 8,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW8,
|
|
.bayer_pat = RKISP1_RAW_GBRG,
|
|
.bus_width = 8,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8,
|
|
.pixel_enc = V4L2_PIXEL_ENC_BAYER,
|
|
.mipi_dt = MIPI_CSI2_DT_RAW8,
|
|
.bayer_pat = RKISP1_RAW_GRBG,
|
|
.bus_width = 8,
|
|
.direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_YUYV8_1X16,
|
|
.pixel_enc = V4L2_PIXEL_ENC_YUV,
|
|
.mipi_dt = MIPI_CSI2_DT_YUV422_8B,
|
|
.yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_YCBYCR,
|
|
.bus_width = 16,
|
|
.direction = RKISP1_ISP_SD_SINK,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_YVYU8_1X16,
|
|
.pixel_enc = V4L2_PIXEL_ENC_YUV,
|
|
.mipi_dt = MIPI_CSI2_DT_YUV422_8B,
|
|
.yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_YCRYCB,
|
|
.bus_width = 16,
|
|
.direction = RKISP1_ISP_SD_SINK,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_UYVY8_1X16,
|
|
.pixel_enc = V4L2_PIXEL_ENC_YUV,
|
|
.mipi_dt = MIPI_CSI2_DT_YUV422_8B,
|
|
.yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_CBYCRY,
|
|
.bus_width = 16,
|
|
.direction = RKISP1_ISP_SD_SINK,
|
|
}, {
|
|
.mbus_code = MEDIA_BUS_FMT_VYUY8_1X16,
|
|
.pixel_enc = V4L2_PIXEL_ENC_YUV,
|
|
.mipi_dt = MIPI_CSI2_DT_YUV422_8B,
|
|
.yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_CRYCBY,
|
|
.bus_width = 16,
|
|
.direction = RKISP1_ISP_SD_SINK,
|
|
},
|
|
};
|
|
|
|
const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index)
|
|
{
|
|
if (index >= ARRAY_SIZE(rkisp1_formats))
|
|
return NULL;
|
|
|
|
return &rkisp1_formats[index];
|
|
}
|
|
|
|
const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code)
|
|
{
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < ARRAY_SIZE(rkisp1_formats); i++) {
|
|
const struct rkisp1_mbus_info *fmt = &rkisp1_formats[i];
|
|
|
|
if (fmt->mbus_code == mbus_code)
|
|
return fmt;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static const struct v4l2_rect rkisp1_sd_min_crop = {
|
|
.width = RKISP1_ISP_MIN_WIDTH,
|
|
.height = RKISP1_ISP_MIN_HEIGHT,
|
|
.top = 0,
|
|
.left = 0,
|
|
};
|
|
|
|
void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop,
|
|
const struct v4l2_rect *bounds)
|
|
{
|
|
v4l2_rect_set_min_size(crop, &rkisp1_sd_min_crop);
|
|
v4l2_rect_map_inside(crop, bounds);
|
|
}
|
|
|
|
void rkisp1_sd_adjust_crop(struct v4l2_rect *crop,
|
|
const struct v4l2_mbus_framefmt *bounds)
|
|
{
|
|
struct v4l2_rect crop_bounds = {
|
|
.left = 0,
|
|
.top = 0,
|
|
.width = bounds->width,
|
|
.height = bounds->height,
|
|
};
|
|
|
|
rkisp1_sd_adjust_crop_rect(crop, &crop_bounds);
|
|
}
|