xref: /linux/drivers/media/platform/rockchip/rkisp1/rkisp1-common.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
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