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