1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT) 2 /* 3 * Rockchip ISP1 Driver - Common definitions 4 * 5 * Copyright (C) 2019 Collabora, Ltd. 6 */ 7 8 #include <media/mipi-csi2.h> 9 #include <media/v4l2-rect.h> 10 11 #include "rkisp1-common.h" 12 13 static const struct rkisp1_mbus_info rkisp1_formats[] = { 14 { 15 .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8, 16 .pixel_enc = V4L2_PIXEL_ENC_YUV, 17 .direction = RKISP1_ISP_SD_SRC, 18 }, { 19 .mbus_code = MEDIA_BUS_FMT_SRGGB10_1X10, 20 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 21 .mipi_dt = MIPI_CSI2_DT_RAW10, 22 .bayer_pat = RKISP1_RAW_RGGB, 23 .bus_width = 10, 24 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 25 }, { 26 .mbus_code = MEDIA_BUS_FMT_SBGGR10_1X10, 27 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 28 .mipi_dt = MIPI_CSI2_DT_RAW10, 29 .bayer_pat = RKISP1_RAW_BGGR, 30 .bus_width = 10, 31 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 32 }, { 33 .mbus_code = MEDIA_BUS_FMT_SGBRG10_1X10, 34 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 35 .mipi_dt = MIPI_CSI2_DT_RAW10, 36 .bayer_pat = RKISP1_RAW_GBRG, 37 .bus_width = 10, 38 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 39 }, { 40 .mbus_code = MEDIA_BUS_FMT_SGRBG10_1X10, 41 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 42 .mipi_dt = MIPI_CSI2_DT_RAW10, 43 .bayer_pat = RKISP1_RAW_GRBG, 44 .bus_width = 10, 45 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 46 }, { 47 .mbus_code = MEDIA_BUS_FMT_SRGGB12_1X12, 48 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 49 .mipi_dt = MIPI_CSI2_DT_RAW12, 50 .bayer_pat = RKISP1_RAW_RGGB, 51 .bus_width = 12, 52 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 53 }, { 54 .mbus_code = MEDIA_BUS_FMT_SBGGR12_1X12, 55 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 56 .mipi_dt = MIPI_CSI2_DT_RAW12, 57 .bayer_pat = RKISP1_RAW_BGGR, 58 .bus_width = 12, 59 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 60 }, { 61 .mbus_code = MEDIA_BUS_FMT_SGBRG12_1X12, 62 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 63 .mipi_dt = MIPI_CSI2_DT_RAW12, 64 .bayer_pat = RKISP1_RAW_GBRG, 65 .bus_width = 12, 66 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 67 }, { 68 .mbus_code = MEDIA_BUS_FMT_SGRBG12_1X12, 69 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 70 .mipi_dt = MIPI_CSI2_DT_RAW12, 71 .bayer_pat = RKISP1_RAW_GRBG, 72 .bus_width = 12, 73 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 74 }, { 75 .mbus_code = MEDIA_BUS_FMT_SRGGB8_1X8, 76 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 77 .mipi_dt = MIPI_CSI2_DT_RAW8, 78 .bayer_pat = RKISP1_RAW_RGGB, 79 .bus_width = 8, 80 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 81 }, { 82 .mbus_code = MEDIA_BUS_FMT_SBGGR8_1X8, 83 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 84 .mipi_dt = MIPI_CSI2_DT_RAW8, 85 .bayer_pat = RKISP1_RAW_BGGR, 86 .bus_width = 8, 87 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 88 }, { 89 .mbus_code = MEDIA_BUS_FMT_SGBRG8_1X8, 90 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 91 .mipi_dt = MIPI_CSI2_DT_RAW8, 92 .bayer_pat = RKISP1_RAW_GBRG, 93 .bus_width = 8, 94 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 95 }, { 96 .mbus_code = MEDIA_BUS_FMT_SGRBG8_1X8, 97 .pixel_enc = V4L2_PIXEL_ENC_BAYER, 98 .mipi_dt = MIPI_CSI2_DT_RAW8, 99 .bayer_pat = RKISP1_RAW_GRBG, 100 .bus_width = 8, 101 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC, 102 }, { 103 .mbus_code = MEDIA_BUS_FMT_YUYV8_1X16, 104 .pixel_enc = V4L2_PIXEL_ENC_YUV, 105 .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 106 .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_YCBYCR, 107 .bus_width = 16, 108 .direction = RKISP1_ISP_SD_SINK, 109 }, { 110 .mbus_code = MEDIA_BUS_FMT_YVYU8_1X16, 111 .pixel_enc = V4L2_PIXEL_ENC_YUV, 112 .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 113 .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_YCRYCB, 114 .bus_width = 16, 115 .direction = RKISP1_ISP_SD_SINK, 116 }, { 117 .mbus_code = MEDIA_BUS_FMT_UYVY8_1X16, 118 .pixel_enc = V4L2_PIXEL_ENC_YUV, 119 .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 120 .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_CBYCRY, 121 .bus_width = 16, 122 .direction = RKISP1_ISP_SD_SINK, 123 }, { 124 .mbus_code = MEDIA_BUS_FMT_VYUY8_1X16, 125 .pixel_enc = V4L2_PIXEL_ENC_YUV, 126 .mipi_dt = MIPI_CSI2_DT_YUV422_8B, 127 .yuv_seq = RKISP1_CIF_ISP_ACQ_PROP_CRYCBY, 128 .bus_width = 16, 129 .direction = RKISP1_ISP_SD_SINK, 130 }, 131 }; 132 133 const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_index(unsigned int index) 134 { 135 if (index >= ARRAY_SIZE(rkisp1_formats)) 136 return NULL; 137 138 return &rkisp1_formats[index]; 139 } 140 141 const struct rkisp1_mbus_info *rkisp1_mbus_info_get_by_code(u32 mbus_code) 142 { 143 unsigned int i; 144 145 for (i = 0; i < ARRAY_SIZE(rkisp1_formats); i++) { 146 const struct rkisp1_mbus_info *fmt = &rkisp1_formats[i]; 147 148 if (fmt->mbus_code == mbus_code) 149 return fmt; 150 } 151 152 return NULL; 153 } 154 155 static const struct v4l2_rect rkisp1_sd_min_crop = { 156 .width = RKISP1_ISP_MIN_WIDTH, 157 .height = RKISP1_ISP_MIN_HEIGHT, 158 .top = 0, 159 .left = 0, 160 }; 161 162 void rkisp1_sd_adjust_crop_rect(struct v4l2_rect *crop, 163 const struct v4l2_rect *bounds) 164 { 165 v4l2_rect_set_min_size(crop, &rkisp1_sd_min_crop); 166 v4l2_rect_map_inside(crop, bounds); 167 } 168 169 void rkisp1_sd_adjust_crop(struct v4l2_rect *crop, 170 const struct v4l2_mbus_framefmt *bounds) 171 { 172 struct v4l2_rect crop_bounds = { 173 .left = 0, 174 .top = 0, 175 .width = bounds->width, 176 .height = bounds->height, 177 }; 178 179 rkisp1_sd_adjust_crop_rect(crop, &crop_bounds); 180 } 181 182 void rkisp1_bls_swap_regs(enum rkisp1_fmt_raw_pat_type pattern, 183 const u32 input[4], u32 output[4]) 184 { 185 static const unsigned int swap[4][4] = { 186 [RKISP1_RAW_RGGB] = { 0, 1, 2, 3 }, 187 [RKISP1_RAW_GRBG] = { 1, 0, 3, 2 }, 188 [RKISP1_RAW_GBRG] = { 2, 3, 0, 1 }, 189 [RKISP1_RAW_BGGR] = { 3, 2, 1, 0 }, 190 }; 191 192 for (unsigned int i = 0; i < 4; ++i) 193 output[i] = input[swap[pattern][i]]; 194 } 195