162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR MIT) 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Rockchip ISP1 Driver - Common definitions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2019 Collabora, Ltd. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <media/mipi-csi2.h> 962306a36Sopenharmony_ci#include <media/v4l2-rect.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "rkisp1-common.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistatic const struct rkisp1_mbus_info rkisp1_formats[] = { 1462306a36Sopenharmony_ci { 1562306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, 1662306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_YUV, 1762306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SRC, 1862306a36Sopenharmony_ci }, { 1962306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10, 2062306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 2162306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW10, 2262306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_RGGB, 2362306a36Sopenharmony_ci .bus_width = 10, 2462306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 2562306a36Sopenharmony_ci }, { 2662306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, 2762306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 2862306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW10, 2962306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_BGGR, 3062306a36Sopenharmony_ci .bus_width = 10, 3162306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 3262306a36Sopenharmony_ci }, { 3362306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10, 3462306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 3562306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW10, 3662306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_GBRG, 3762306a36Sopenharmony_ci .bus_width = 10, 3862306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 3962306a36Sopenharmony_ci }, { 4062306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10, 4162306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 4262306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW10, 4362306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_GRBG, 4462306a36Sopenharmony_ci .bus_width = 10, 4562306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 4662306a36Sopenharmony_ci }, { 4762306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12, 4862306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 4962306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW12, 5062306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_RGGB, 5162306a36Sopenharmony_ci .bus_width = 12, 5262306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 5362306a36Sopenharmony_ci }, { 5462306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12, 5562306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 5662306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW12, 5762306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_BGGR, 5862306a36Sopenharmony_ci .bus_width = 12, 5962306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 6062306a36Sopenharmony_ci }, { 6162306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12, 6262306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 6362306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW12, 6462306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_GBRG, 6562306a36Sopenharmony_ci .bus_width = 12, 6662306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 6762306a36Sopenharmony_ci }, { 6862306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12, 6962306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 7062306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW12, 7162306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_GRBG, 7262306a36Sopenharmony_ci .bus_width = 12, 7362306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 7462306a36Sopenharmony_ci }, { 7562306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8, 7662306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 7762306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW8, 7862306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_RGGB, 7962306a36Sopenharmony_ci .bus_width = 8, 8062306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 8162306a36Sopenharmony_ci }, { 8262306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8, 8362306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 8462306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW8, 8562306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_BGGR, 8662306a36Sopenharmony_ci .bus_width = 8, 8762306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 8862306a36Sopenharmony_ci }, { 8962306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8, 9062306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 9162306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW8, 9262306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_GBRG, 9362306a36Sopenharmony_ci .bus_width = 8, 9462306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 9562306a36Sopenharmony_ci }, { 9662306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8, 9762306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_BAYER, 9862306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_RAW8, 9962306a36Sopenharmony_ci .bayer_pat = RKISP1_RAW_GRBG, 10062306a36Sopenharmony_ci .bus_width = 8, 10162306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 10262306a36Sopenharmony_ci }, { 10362306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_YUYV8_1X16, 10462306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_YUV, 10562306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 10662306a36Sopenharmony_ci .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_YCBYCR, 10762306a36Sopenharmony_ci .bus_width = 16, 10862306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK, 10962306a36Sopenharmony_ci }, { 11062306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_YVYU8_1X16, 11162306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_YUV, 11262306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 11362306a36Sopenharmony_ci .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_YCRYCB, 11462306a36Sopenharmony_ci .bus_width = 16, 11562306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK, 11662306a36Sopenharmony_ci }, { 11762306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_UYVY8_1X16, 11862306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_YUV, 11962306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 12062306a36Sopenharmony_ci .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_CBYCRY, 12162306a36Sopenharmony_ci .bus_width = 16, 12262306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK, 12362306a36Sopenharmony_ci }, { 12462306a36Sopenharmony_ci .mbus_code = MEDIA_BUS_FMT_VYUY8_1X16, 12562306a36Sopenharmony_ci .pixel_enc = V4L2_PIXEL_ENC_YUV, 12662306a36Sopenharmony_ci .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 12762306a36Sopenharmony_ci .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_CRYCBY, 12862306a36Sopenharmony_ci .bus_width = 16, 12962306a36Sopenharmony_ci .direction = RKISP1_ISP_SD_SINK, 13062306a36Sopenharmony_ci }, 13162306a36Sopenharmony_ci}; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ciconst struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci if (index >= ARRAY_SIZE(rkisp1_formats)) 13662306a36Sopenharmony_ci return NULL; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci return &rkisp1_formats[index]; 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ciconst struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci unsigned int i; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rkisp1_formats); i++) { 14662306a36Sopenharmony_ci const struct rkisp1_mbus_info *fmt = &rkisp1_formats[i]; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci if (fmt->mbus_code == mbus_code) 14962306a36Sopenharmony_ci return fmt; 15062306a36Sopenharmony_ci } 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci return NULL; 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistatic const struct v4l2_rect rkisp1_sd_min_crop = { 15662306a36Sopenharmony_ci .width = RKISP1_ISP_MIN_WIDTH, 15762306a36Sopenharmony_ci .height = RKISP1_ISP_MIN_HEIGHT, 15862306a36Sopenharmony_ci .top = 0, 15962306a36Sopenharmony_ci .left = 0, 16062306a36Sopenharmony_ci}; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_civoid rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop, 16362306a36Sopenharmony_ci const struct v4l2_rect *bounds) 16462306a36Sopenharmony_ci{ 16562306a36Sopenharmony_ci v4l2_rect_set_min_size(crop, &rkisp1_sd_min_crop); 16662306a36Sopenharmony_ci v4l2_rect_map_inside(crop, bounds); 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_civoid rkisp1_sd_adjust_crop(struct v4l2_rect *crop, 17062306a36Sopenharmony_ci const struct v4l2_mbus_framefmt *bounds) 17162306a36Sopenharmony_ci{ 17262306a36Sopenharmony_ci struct v4l2_rect crop_bounds = { 17362306a36Sopenharmony_ci .left = 0, 17462306a36Sopenharmony_ci .top = 0, 17562306a36Sopenharmony_ci .width = bounds->width, 17662306a36Sopenharmony_ci .height = bounds->height, 17762306a36Sopenharmony_ci }; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci rkisp1_sd_adjust_crop_rect(crop, &crop_bounds); 18062306a36Sopenharmony_ci} 181