• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
2 /*
3  * Rockchip ISP1 Driver - ISP Subdevice
4  *
5  * Copyright (C) 2019 Collabora, Ltd.
6  *
7  * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd.
8  * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
9  */
10 
11 #include <linux/iopoll.h>
12 #include <linux/phy/phy.h>
13 #include <linux/phy/phy-mipi-dphy.h>
14 #include <linux/pm_runtime.h>
15 #include <linux/videodev2.h>
16 #include <linux/vmalloc.h>
17 #include <media/v4l2-event.h>
18 
19 #include "rkisp1-common.h"
20 
21 #define RKISP1_DEF_SINK_PAD_FMT MEDIA_BUS_FMT_SRGGB10_1X10
22 #define RKISP1_DEF_SRC_PAD_FMT MEDIA_BUS_FMT_YUYV8_2X8
23 
24 #define RKISP1_ISP_DEV_NAME	RKISP1_DRIVER_NAME "_isp"
25 
26 /*
27  * NOTE: MIPI controller and input MUX are also configured in this file.
28  * This is because ISP Subdev describes not only ISP submodule (input size,
29  * format, output size, format), but also a virtual route device.
30  */
31 
32 /*
33  * There are many variables named with format/frame in below code,
34  * please see here for their meaning.
35  * Cropping in the sink pad defines the image region from the sensor.
36  * Cropping in the source pad defines the region for the Image Stabilizer (IS)
37  *
38  * Cropping regions of ISP
39  *
40  * +---------------------------------------------------------+
41  * | Sensor image                                            |
42  * | +---------------------------------------------------+   |
43  * | | CIF_ISP_ACQ (for black level)                     |   |
44  * | | sink pad format                                   |   |
45  * | | +--------------------------------------------+    |   |
46  * | | |    CIF_ISP_OUT                             |    |   |
47  * | | |    sink pad crop                           |    |   |
48  * | | |    +---------------------------------+     |    |   |
49  * | | |    |   CIF_ISP_IS                    |     |    |   |
50  * | | |    |   source pad crop and format    |     |    |   |
51  * | | |    +---------------------------------+     |    |   |
52  * | | +--------------------------------------------+    |   |
53  * | +---------------------------------------------------+   |
54  * +---------------------------------------------------------+
55  */
56 
57 static const struct rkisp1_isp_mbus_info rkisp1_isp_formats[] = {
58 	{
59 		.mbus_code	= MEDIA_BUS_FMT_YUYV8_2X8,
60 		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
61 		.direction	= RKISP1_ISP_SD_SRC,
62 	}, {
63 		.mbus_code	= MEDIA_BUS_FMT_SRGGB10_1X10,
64 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
65 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW10,
66 		.bayer_pat	= RKISP1_RAW_RGGB,
67 		.bus_width	= 10,
68 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
69 	}, {
70 		.mbus_code	= MEDIA_BUS_FMT_SBGGR10_1X10,
71 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
72 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW10,
73 		.bayer_pat	= RKISP1_RAW_BGGR,
74 		.bus_width	= 10,
75 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
76 	}, {
77 		.mbus_code	= MEDIA_BUS_FMT_SGBRG10_1X10,
78 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
79 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW10,
80 		.bayer_pat	= RKISP1_RAW_GBRG,
81 		.bus_width	= 10,
82 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
83 	}, {
84 		.mbus_code	= MEDIA_BUS_FMT_SGRBG10_1X10,
85 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
86 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW10,
87 		.bayer_pat	= RKISP1_RAW_GRBG,
88 		.bus_width	= 10,
89 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
90 	}, {
91 		.mbus_code	= MEDIA_BUS_FMT_SRGGB12_1X12,
92 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
93 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW12,
94 		.bayer_pat	= RKISP1_RAW_RGGB,
95 		.bus_width	= 12,
96 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
97 	}, {
98 		.mbus_code	= MEDIA_BUS_FMT_SBGGR12_1X12,
99 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
100 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW12,
101 		.bayer_pat	= RKISP1_RAW_BGGR,
102 		.bus_width	= 12,
103 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
104 	}, {
105 		.mbus_code	= MEDIA_BUS_FMT_SGBRG12_1X12,
106 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
107 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW12,
108 		.bayer_pat	= RKISP1_RAW_GBRG,
109 		.bus_width	= 12,
110 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
111 	}, {
112 		.mbus_code	= MEDIA_BUS_FMT_SGRBG12_1X12,
113 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
114 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW12,
115 		.bayer_pat	= RKISP1_RAW_GRBG,
116 		.bus_width	= 12,
117 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
118 	}, {
119 		.mbus_code	= MEDIA_BUS_FMT_SRGGB8_1X8,
120 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
121 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW8,
122 		.bayer_pat	= RKISP1_RAW_RGGB,
123 		.bus_width	= 8,
124 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
125 	}, {
126 		.mbus_code	= MEDIA_BUS_FMT_SBGGR8_1X8,
127 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
128 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW8,
129 		.bayer_pat	= RKISP1_RAW_BGGR,
130 		.bus_width	= 8,
131 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
132 	}, {
133 		.mbus_code	= MEDIA_BUS_FMT_SGBRG8_1X8,
134 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
135 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW8,
136 		.bayer_pat	= RKISP1_RAW_GBRG,
137 		.bus_width	= 8,
138 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
139 	}, {
140 		.mbus_code	= MEDIA_BUS_FMT_SGRBG8_1X8,
141 		.pixel_enc	= V4L2_PIXEL_ENC_BAYER,
142 		.mipi_dt	= RKISP1_CIF_CSI2_DT_RAW8,
143 		.bayer_pat	= RKISP1_RAW_GRBG,
144 		.bus_width	= 8,
145 		.direction	= RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
146 	}, {
147 		.mbus_code	= MEDIA_BUS_FMT_YUYV8_1X16,
148 		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
149 		.mipi_dt	= RKISP1_CIF_CSI2_DT_YUV422_8b,
150 		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_YCBYCR,
151 		.bus_width	= 16,
152 		.direction	= RKISP1_ISP_SD_SINK,
153 	}, {
154 		.mbus_code	= MEDIA_BUS_FMT_YVYU8_1X16,
155 		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
156 		.mipi_dt	= RKISP1_CIF_CSI2_DT_YUV422_8b,
157 		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_YCRYCB,
158 		.bus_width	= 16,
159 		.direction	= RKISP1_ISP_SD_SINK,
160 	}, {
161 		.mbus_code	= MEDIA_BUS_FMT_UYVY8_1X16,
162 		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
163 		.mipi_dt	= RKISP1_CIF_CSI2_DT_YUV422_8b,
164 		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_CBYCRY,
165 		.bus_width	= 16,
166 		.direction	= RKISP1_ISP_SD_SINK,
167 	}, {
168 		.mbus_code	= MEDIA_BUS_FMT_VYUY8_1X16,
169 		.pixel_enc	= V4L2_PIXEL_ENC_YUV,
170 		.mipi_dt	= RKISP1_CIF_CSI2_DT_YUV422_8b,
171 		.yuv_seq	= RKISP1_CIF_ISP_ACQ_PROP_CRYCBY,
172 		.bus_width	= 16,
173 		.direction	= RKISP1_ISP_SD_SINK,
174 	},
175 };
176 
177 /* ----------------------------------------------------------------------------
178  * Helpers
179  */
180 
rkisp1_isp_mbus_info_get(u32 mbus_code)181 const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code)
182 {
183 	unsigned int i;
184 
185 	for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {
186 		const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];
187 
188 		if (fmt->mbus_code == mbus_code)
189 			return fmt;
190 	}
191 
192 	return NULL;
193 }
194 
rkisp1_get_remote_sensor(struct v4l2_subdev * sd)195 static struct v4l2_subdev *rkisp1_get_remote_sensor(struct v4l2_subdev *sd)
196 {
197 	struct media_pad *local, *remote;
198 	struct media_entity *sensor_me;
199 
200 	local = &sd->entity.pads[RKISP1_ISP_PAD_SINK_VIDEO];
201 	remote = media_entity_remote_pad(local);
202 	if (!remote)
203 		return NULL;
204 
205 	sensor_me = remote->entity;
206 	return media_entity_to_v4l2_subdev(sensor_me);
207 }
208 
209 static struct v4l2_mbus_framefmt *
rkisp1_isp_get_pad_fmt(struct rkisp1_isp * isp,struct v4l2_subdev_pad_config * cfg,unsigned int pad,u32 which)210 rkisp1_isp_get_pad_fmt(struct rkisp1_isp *isp,
211 		       struct v4l2_subdev_pad_config *cfg,
212 		       unsigned int pad, u32 which)
213 {
214 	if (which == V4L2_SUBDEV_FORMAT_TRY)
215 		return v4l2_subdev_get_try_format(&isp->sd, cfg, pad);
216 	else
217 		return v4l2_subdev_get_try_format(&isp->sd, isp->pad_cfg, pad);
218 }
219 
220 static struct v4l2_rect *
rkisp1_isp_get_pad_crop(struct rkisp1_isp * isp,struct v4l2_subdev_pad_config * cfg,unsigned int pad,u32 which)221 rkisp1_isp_get_pad_crop(struct rkisp1_isp *isp,
222 			struct v4l2_subdev_pad_config *cfg,
223 			unsigned int pad, u32 which)
224 {
225 	if (which == V4L2_SUBDEV_FORMAT_TRY)
226 		return v4l2_subdev_get_try_crop(&isp->sd, cfg, pad);
227 	else
228 		return v4l2_subdev_get_try_crop(&isp->sd, isp->pad_cfg, pad);
229 }
230 
231 /* ----------------------------------------------------------------------------
232  * Camera Interface registers configurations
233  */
234 
235 /*
236  * Image Stabilization.
237  * This should only be called when configuring CIF
238  * or at the frame end interrupt
239  */
rkisp1_config_ism(struct rkisp1_device * rkisp1)240 static void rkisp1_config_ism(struct rkisp1_device *rkisp1)
241 {
242 	struct v4l2_rect *src_crop =
243 		rkisp1_isp_get_pad_crop(&rkisp1->isp, NULL,
244 					RKISP1_ISP_PAD_SOURCE_VIDEO,
245 					V4L2_SUBDEV_FORMAT_ACTIVE);
246 	u32 val;
247 
248 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_RECENTER);
249 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_MAX_DX);
250 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_MAX_DY);
251 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_DISPLACE);
252 	rkisp1_write(rkisp1, src_crop->left, RKISP1_CIF_ISP_IS_H_OFFS);
253 	rkisp1_write(rkisp1, src_crop->top, RKISP1_CIF_ISP_IS_V_OFFS);
254 	rkisp1_write(rkisp1, src_crop->width, RKISP1_CIF_ISP_IS_H_SIZE);
255 	rkisp1_write(rkisp1, src_crop->height, RKISP1_CIF_ISP_IS_V_SIZE);
256 
257 	/* IS(Image Stabilization) is always on, working as output crop */
258 	rkisp1_write(rkisp1, 1, RKISP1_CIF_ISP_IS_CTRL);
259 	val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
260 	val |= RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD;
261 	rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
262 }
263 
264 /*
265  * configure ISP blocks with input format, size......
266  */
rkisp1_config_isp(struct rkisp1_device * rkisp1)267 static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
268 {
269 	u32 isp_ctrl = 0, irq_mask = 0, acq_mult = 0, signal = 0;
270 	const struct rkisp1_isp_mbus_info *src_fmt, *sink_fmt;
271 	struct rkisp1_sensor_async *sensor;
272 	struct v4l2_mbus_framefmt *sink_frm;
273 	struct v4l2_rect *sink_crop;
274 
275 	sensor = rkisp1->active_sensor;
276 	sink_fmt = rkisp1->isp.sink_fmt;
277 	src_fmt = rkisp1->isp.src_fmt;
278 	sink_frm = rkisp1_isp_get_pad_fmt(&rkisp1->isp, NULL,
279 					  RKISP1_ISP_PAD_SINK_VIDEO,
280 					  V4L2_SUBDEV_FORMAT_ACTIVE);
281 	sink_crop = rkisp1_isp_get_pad_crop(&rkisp1->isp, NULL,
282 					    RKISP1_ISP_PAD_SINK_VIDEO,
283 					    V4L2_SUBDEV_FORMAT_ACTIVE);
284 
285 	if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
286 		acq_mult = 1;
287 		if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
288 			if (sensor->mbus_type == V4L2_MBUS_BT656)
289 				isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT_ITU656;
290 			else
291 				isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT;
292 		} else {
293 			rkisp1_write(rkisp1, RKISP1_CIF_ISP_DEMOSAIC_TH(0xc),
294 				     RKISP1_CIF_ISP_DEMOSAIC);
295 
296 			if (sensor->mbus_type == V4L2_MBUS_BT656)
297 				isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU656;
298 			else
299 				isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU601;
300 		}
301 	} else if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_YUV) {
302 		acq_mult = 2;
303 		if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
304 			isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
305 		} else {
306 			if (sensor->mbus_type == V4L2_MBUS_BT656)
307 				isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU656;
308 			else
309 				isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
310 		}
311 
312 		irq_mask |= RKISP1_CIF_ISP_DATA_LOSS;
313 	}
314 
315 	/* Set up input acquisition properties */
316 	if (sensor->mbus_type == V4L2_MBUS_BT656 ||
317 	    sensor->mbus_type == V4L2_MBUS_PARALLEL) {
318 		if (sensor->mbus_flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
319 			signal = RKISP1_CIF_ISP_ACQ_PROP_POS_EDGE;
320 	}
321 
322 	if (sensor->mbus_type == V4L2_MBUS_PARALLEL) {
323 		if (sensor->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
324 			signal |= RKISP1_CIF_ISP_ACQ_PROP_VSYNC_LOW;
325 
326 		if (sensor->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
327 			signal |= RKISP1_CIF_ISP_ACQ_PROP_HSYNC_LOW;
328 	}
329 
330 	rkisp1_write(rkisp1, isp_ctrl, RKISP1_CIF_ISP_CTRL);
331 	rkisp1_write(rkisp1, signal | sink_fmt->yuv_seq |
332 		     RKISP1_CIF_ISP_ACQ_PROP_BAYER_PAT(sink_fmt->bayer_pat) |
333 		     RKISP1_CIF_ISP_ACQ_PROP_FIELD_SEL_ALL,
334 		     RKISP1_CIF_ISP_ACQ_PROP);
335 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_NR_FRAMES);
336 
337 	/* Acquisition Size */
338 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_H_OFFS);
339 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_V_OFFS);
340 	rkisp1_write(rkisp1,
341 		     acq_mult * sink_frm->width, RKISP1_CIF_ISP_ACQ_H_SIZE);
342 	rkisp1_write(rkisp1, sink_frm->height, RKISP1_CIF_ISP_ACQ_V_SIZE);
343 
344 	/* ISP Out Area */
345 	rkisp1_write(rkisp1, sink_crop->left, RKISP1_CIF_ISP_OUT_H_OFFS);
346 	rkisp1_write(rkisp1, sink_crop->top, RKISP1_CIF_ISP_OUT_V_OFFS);
347 	rkisp1_write(rkisp1, sink_crop->width, RKISP1_CIF_ISP_OUT_H_SIZE);
348 	rkisp1_write(rkisp1, sink_crop->height, RKISP1_CIF_ISP_OUT_V_SIZE);
349 
350 	irq_mask |= RKISP1_CIF_ISP_FRAME | RKISP1_CIF_ISP_V_START |
351 		    RKISP1_CIF_ISP_PIC_SIZE_ERROR;
352 	rkisp1_write(rkisp1, irq_mask, RKISP1_CIF_ISP_IMSC);
353 
354 	if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
355 		rkisp1_params_disable(&rkisp1->params);
356 	} else {
357 		struct v4l2_mbus_framefmt *src_frm;
358 
359 		src_frm = rkisp1_isp_get_pad_fmt(&rkisp1->isp, NULL,
360 						 RKISP1_ISP_PAD_SINK_VIDEO,
361 						 V4L2_SUBDEV_FORMAT_ACTIVE);
362 		rkisp1_params_configure(&rkisp1->params, sink_fmt->bayer_pat,
363 					src_frm->quantization);
364 	}
365 
366 	return 0;
367 }
368 
rkisp1_config_dvp(struct rkisp1_device * rkisp1)369 static int rkisp1_config_dvp(struct rkisp1_device *rkisp1)
370 {
371 	const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
372 	u32 val, input_sel;
373 
374 	switch (sink_fmt->bus_width) {
375 	case 8:
376 		input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_8B_ZERO;
377 		break;
378 	case 10:
379 		input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_10B_ZERO;
380 		break;
381 	case 12:
382 		input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_12B;
383 		break;
384 	default:
385 		dev_err(rkisp1->dev, "Invalid bus width\n");
386 		return -EINVAL;
387 	}
388 
389 	val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_ACQ_PROP);
390 	rkisp1_write(rkisp1, val | input_sel, RKISP1_CIF_ISP_ACQ_PROP);
391 
392 	return 0;
393 }
394 
rkisp1_config_mipi(struct rkisp1_device * rkisp1)395 static int rkisp1_config_mipi(struct rkisp1_device *rkisp1)
396 {
397 	const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
398 	unsigned int lanes = rkisp1->active_sensor->lanes;
399 	u32 mipi_ctrl;
400 
401 	if (lanes < 1 || lanes > 4)
402 		return -EINVAL;
403 
404 	mipi_ctrl = RKISP1_CIF_MIPI_CTRL_NUM_LANES(lanes - 1) |
405 		    RKISP1_CIF_MIPI_CTRL_SHUTDOWNLANES(0xf) |
406 		    RKISP1_CIF_MIPI_CTRL_ERR_SOT_SYNC_HS_SKIP |
407 		    RKISP1_CIF_MIPI_CTRL_CLOCKLANE_ENA;
408 
409 	rkisp1_write(rkisp1, mipi_ctrl, RKISP1_CIF_MIPI_CTRL);
410 
411 	/* Configure Data Type and Virtual Channel */
412 	rkisp1_write(rkisp1,
413 		     RKISP1_CIF_MIPI_DATA_SEL_DT(sink_fmt->mipi_dt) |
414 		     RKISP1_CIF_MIPI_DATA_SEL_VC(0),
415 		     RKISP1_CIF_MIPI_IMG_DATA_SEL);
416 
417 	/* Clear MIPI interrupts */
418 	rkisp1_write(rkisp1, ~0, RKISP1_CIF_MIPI_ICR);
419 	/*
420 	 * Disable RKISP1_CIF_MIPI_ERR_DPHY interrupt here temporary for
421 	 * isp bus may be dead when switch isp.
422 	 */
423 	rkisp1_write(rkisp1,
424 		     RKISP1_CIF_MIPI_FRAME_END | RKISP1_CIF_MIPI_ERR_CSI |
425 		     RKISP1_CIF_MIPI_ERR_DPHY |
426 		     RKISP1_CIF_MIPI_SYNC_FIFO_OVFLW(0x03) |
427 		     RKISP1_CIF_MIPI_ADD_DATA_OVFLW,
428 		     RKISP1_CIF_MIPI_IMSC);
429 
430 	dev_dbg(rkisp1->dev, "\n  MIPI_CTRL 0x%08x\n"
431 		"  MIPI_IMG_DATA_SEL 0x%08x\n"
432 		"  MIPI_STATUS 0x%08x\n"
433 		"  MIPI_IMSC 0x%08x\n",
434 		rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL),
435 		rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMG_DATA_SEL),
436 		rkisp1_read(rkisp1, RKISP1_CIF_MIPI_STATUS),
437 		rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC));
438 
439 	return 0;
440 }
441 
442 /* Configure MUX */
rkisp1_config_path(struct rkisp1_device * rkisp1)443 static int rkisp1_config_path(struct rkisp1_device *rkisp1)
444 {
445 	struct rkisp1_sensor_async *sensor = rkisp1->active_sensor;
446 	u32 dpcl = rkisp1_read(rkisp1, RKISP1_CIF_VI_DPCL);
447 	int ret = 0;
448 
449 	if (sensor->mbus_type == V4L2_MBUS_BT656 ||
450 	    sensor->mbus_type == V4L2_MBUS_PARALLEL) {
451 		ret = rkisp1_config_dvp(rkisp1);
452 		dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_PARALLEL;
453 	} else if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
454 		ret = rkisp1_config_mipi(rkisp1);
455 		dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_MIPI;
456 	}
457 
458 	rkisp1_write(rkisp1, dpcl, RKISP1_CIF_VI_DPCL);
459 
460 	return ret;
461 }
462 
463 /* Hardware configure Entry */
rkisp1_config_cif(struct rkisp1_device * rkisp1)464 static int rkisp1_config_cif(struct rkisp1_device *rkisp1)
465 {
466 	u32 cif_id;
467 	int ret;
468 
469 	cif_id = rkisp1_read(rkisp1, RKISP1_CIF_VI_ID);
470 	dev_dbg(rkisp1->dev, "CIF_ID 0x%08x\n", cif_id);
471 
472 	ret = rkisp1_config_isp(rkisp1);
473 	if (ret)
474 		return ret;
475 	ret = rkisp1_config_path(rkisp1);
476 	if (ret)
477 		return ret;
478 	rkisp1_config_ism(rkisp1);
479 
480 	return 0;
481 }
482 
rkisp1_isp_stop(struct rkisp1_device * rkisp1)483 static void rkisp1_isp_stop(struct rkisp1_device *rkisp1)
484 {
485 	u32 val;
486 
487 	/*
488 	 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
489 	 * Stop ISP(isp) ->wait for ISP isp off
490 	 */
491 	/* stop and clear MI, MIPI, and ISP interrupts */
492 	rkisp1_write(rkisp1, 0, RKISP1_CIF_MIPI_IMSC);
493 	rkisp1_write(rkisp1, ~0, RKISP1_CIF_MIPI_ICR);
494 
495 	rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IMSC);
496 	rkisp1_write(rkisp1, ~0, RKISP1_CIF_ISP_ICR);
497 
498 	rkisp1_write(rkisp1, 0, RKISP1_CIF_MI_IMSC);
499 	rkisp1_write(rkisp1, ~0, RKISP1_CIF_MI_ICR);
500 	val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
501 	rkisp1_write(rkisp1, val & (~RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA),
502 		     RKISP1_CIF_MIPI_CTRL);
503 	/* stop ISP */
504 	val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
505 	val &= ~(RKISP1_CIF_ISP_CTRL_ISP_INFORM_ENABLE |
506 		 RKISP1_CIF_ISP_CTRL_ISP_ENABLE);
507 	rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
508 
509 	val = rkisp1_read(rkisp1,	RKISP1_CIF_ISP_CTRL);
510 	rkisp1_write(rkisp1, val | RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD,
511 		     RKISP1_CIF_ISP_CTRL);
512 
513 	readx_poll_timeout(readl, rkisp1->base_addr + RKISP1_CIF_ISP_RIS,
514 			   val, val & RKISP1_CIF_ISP_OFF, 20, 100);
515 	rkisp1_write(rkisp1,
516 		     RKISP1_CIF_IRCL_MIPI_SW_RST | RKISP1_CIF_IRCL_ISP_SW_RST,
517 		     RKISP1_CIF_IRCL);
518 	rkisp1_write(rkisp1, 0x0, RKISP1_CIF_IRCL);
519 }
520 
rkisp1_config_clk(struct rkisp1_device * rkisp1)521 static void rkisp1_config_clk(struct rkisp1_device *rkisp1)
522 {
523 	u32 val = RKISP1_CIF_ICCL_ISP_CLK | RKISP1_CIF_ICCL_CP_CLK |
524 		  RKISP1_CIF_ICCL_MRSZ_CLK | RKISP1_CIF_ICCL_SRSZ_CLK |
525 		  RKISP1_CIF_ICCL_JPEG_CLK | RKISP1_CIF_ICCL_MI_CLK |
526 		  RKISP1_CIF_ICCL_IE_CLK | RKISP1_CIF_ICCL_MIPI_CLK |
527 		  RKISP1_CIF_ICCL_DCROP_CLK;
528 
529 	rkisp1_write(rkisp1, val, RKISP1_CIF_ICCL);
530 }
531 
rkisp1_isp_start(struct rkisp1_device * rkisp1)532 static void rkisp1_isp_start(struct rkisp1_device *rkisp1)
533 {
534 	struct rkisp1_sensor_async *sensor = rkisp1->active_sensor;
535 	u32 val;
536 
537 	rkisp1_config_clk(rkisp1);
538 
539 	/* Activate MIPI */
540 	if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
541 		val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
542 		rkisp1_write(rkisp1, val | RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA,
543 			     RKISP1_CIF_MIPI_CTRL);
544 	}
545 	/* Activate ISP */
546 	val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
547 	val |= RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD |
548 	       RKISP1_CIF_ISP_CTRL_ISP_ENABLE |
549 	       RKISP1_CIF_ISP_CTRL_ISP_INFORM_ENABLE;
550 	rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
551 
552 	/*
553 	 * CIF spec says to wait for sufficient time after enabling
554 	 * the MIPI interface and before starting the sensor output.
555 	 */
556 	usleep_range(1000, 1200);
557 }
558 
559 /* ----------------------------------------------------------------------------
560  * Subdev pad operations
561  */
562 
rkisp1_isp_enum_mbus_code(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_mbus_code_enum * code)563 static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,
564 				     struct v4l2_subdev_pad_config *cfg,
565 				     struct v4l2_subdev_mbus_code_enum *code)
566 {
567 	unsigned int i, dir;
568 	int pos = 0;
569 
570 	if (code->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
571 		dir = RKISP1_ISP_SD_SINK;
572 	} else if (code->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) {
573 		dir = RKISP1_ISP_SD_SRC;
574 	} else {
575 		if (code->index > 0)
576 			return -EINVAL;
577 		code->code = MEDIA_BUS_FMT_FIXED;
578 		return 0;
579 	}
580 
581 	if (code->index >= ARRAY_SIZE(rkisp1_isp_formats))
582 		return -EINVAL;
583 
584 	for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {
585 		const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];
586 
587 		if (fmt->direction & dir)
588 			pos++;
589 
590 		if (code->index == pos - 1) {
591 			code->code = fmt->mbus_code;
592 			if (fmt->pixel_enc == V4L2_PIXEL_ENC_YUV &&
593 			    dir == RKISP1_ISP_SD_SRC)
594 				code->flags =
595 					V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION;
596 			return 0;
597 		}
598 	}
599 
600 	return -EINVAL;
601 }
602 
rkisp1_isp_init_config(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg)603 static int rkisp1_isp_init_config(struct v4l2_subdev *sd,
604 				  struct v4l2_subdev_pad_config *cfg)
605 {
606 	struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
607 	struct v4l2_rect *sink_crop, *src_crop;
608 
609 	sink_fmt = v4l2_subdev_get_try_format(sd, cfg,
610 					      RKISP1_ISP_PAD_SINK_VIDEO);
611 	sink_fmt->width = RKISP1_DEFAULT_WIDTH;
612 	sink_fmt->height = RKISP1_DEFAULT_HEIGHT;
613 	sink_fmt->field = V4L2_FIELD_NONE;
614 	sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
615 
616 	sink_crop = v4l2_subdev_get_try_crop(sd, cfg,
617 					     RKISP1_ISP_PAD_SINK_VIDEO);
618 	sink_crop->width = RKISP1_DEFAULT_WIDTH;
619 	sink_crop->height = RKISP1_DEFAULT_HEIGHT;
620 	sink_crop->left = 0;
621 	sink_crop->top = 0;
622 
623 	src_fmt = v4l2_subdev_get_try_format(sd, cfg,
624 					     RKISP1_ISP_PAD_SOURCE_VIDEO);
625 	*src_fmt = *sink_fmt;
626 	src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
627 
628 	src_crop = v4l2_subdev_get_try_crop(sd, cfg,
629 					    RKISP1_ISP_PAD_SOURCE_VIDEO);
630 	*src_crop = *sink_crop;
631 
632 	sink_fmt = v4l2_subdev_get_try_format(sd, cfg,
633 					      RKISP1_ISP_PAD_SINK_PARAMS);
634 	src_fmt = v4l2_subdev_get_try_format(sd, cfg,
635 					     RKISP1_ISP_PAD_SOURCE_STATS);
636 	sink_fmt->width = RKISP1_DEFAULT_WIDTH;
637 	sink_fmt->height = RKISP1_DEFAULT_HEIGHT;
638 	sink_fmt->field = V4L2_FIELD_NONE;
639 	sink_fmt->code = MEDIA_BUS_FMT_FIXED;
640 	*src_fmt = *sink_fmt;
641 
642 	return 0;
643 }
644 
rkisp1_isp_set_src_fmt(struct rkisp1_isp * isp,struct v4l2_subdev_pad_config * cfg,struct v4l2_mbus_framefmt * format,unsigned int which)645 static void rkisp1_isp_set_src_fmt(struct rkisp1_isp *isp,
646 				   struct v4l2_subdev_pad_config *cfg,
647 				   struct v4l2_mbus_framefmt *format,
648 				   unsigned int which)
649 {
650 	const struct rkisp1_isp_mbus_info *mbus_info;
651 	struct v4l2_mbus_framefmt *src_fmt;
652 	const struct v4l2_rect *src_crop;
653 
654 	src_fmt = rkisp1_isp_get_pad_fmt(isp, cfg,
655 					 RKISP1_ISP_PAD_SOURCE_VIDEO, which);
656 	src_crop = rkisp1_isp_get_pad_crop(isp, cfg,
657 					   RKISP1_ISP_PAD_SOURCE_VIDEO, which);
658 
659 	src_fmt->code = format->code;
660 	mbus_info = rkisp1_isp_mbus_info_get(src_fmt->code);
661 	if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SRC)) {
662 		src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
663 		mbus_info = rkisp1_isp_mbus_info_get(src_fmt->code);
664 	}
665 	if (which == V4L2_SUBDEV_FORMAT_ACTIVE)
666 		isp->src_fmt = mbus_info;
667 	src_fmt->width  = src_crop->width;
668 	src_fmt->height = src_crop->height;
669 
670 	/*
671 	 * The CSC API is used to allow userspace to force full
672 	 * quantization on YUV formats.
673 	 */
674 	if (format->flags & V4L2_MBUS_FRAMEFMT_SET_CSC &&
675 	    format->quantization == V4L2_QUANTIZATION_FULL_RANGE &&
676 	    mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV)
677 		src_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
678 	else if (mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV)
679 		src_fmt->quantization = V4L2_QUANTIZATION_LIM_RANGE;
680 	else
681 		src_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
682 
683 	*format = *src_fmt;
684 }
685 
rkisp1_isp_set_src_crop(struct rkisp1_isp * isp,struct v4l2_subdev_pad_config * cfg,struct v4l2_rect * r,unsigned int which)686 static void rkisp1_isp_set_src_crop(struct rkisp1_isp *isp,
687 				    struct v4l2_subdev_pad_config *cfg,
688 				    struct v4l2_rect *r, unsigned int which)
689 {
690 	struct v4l2_mbus_framefmt *src_fmt;
691 	const struct v4l2_rect *sink_crop;
692 	struct v4l2_rect *src_crop;
693 
694 	src_crop = rkisp1_isp_get_pad_crop(isp, cfg,
695 					   RKISP1_ISP_PAD_SOURCE_VIDEO,
696 					   which);
697 	sink_crop = rkisp1_isp_get_pad_crop(isp, cfg,
698 					    RKISP1_ISP_PAD_SINK_VIDEO,
699 					    which);
700 
701 	src_crop->left = ALIGN(r->left, 2);
702 	src_crop->width = ALIGN(r->width, 2);
703 	src_crop->top = r->top;
704 	src_crop->height = r->height;
705 	rkisp1_sd_adjust_crop_rect(src_crop, sink_crop);
706 
707 	*r = *src_crop;
708 
709 	/* Propagate to out format */
710 	src_fmt = rkisp1_isp_get_pad_fmt(isp, cfg,
711 					 RKISP1_ISP_PAD_SOURCE_VIDEO, which);
712 	rkisp1_isp_set_src_fmt(isp, cfg, src_fmt, which);
713 }
714 
rkisp1_isp_set_sink_crop(struct rkisp1_isp * isp,struct v4l2_subdev_pad_config * cfg,struct v4l2_rect * r,unsigned int which)715 static void rkisp1_isp_set_sink_crop(struct rkisp1_isp *isp,
716 				     struct v4l2_subdev_pad_config *cfg,
717 				     struct v4l2_rect *r, unsigned int which)
718 {
719 	struct v4l2_rect *sink_crop, *src_crop;
720 	struct v4l2_mbus_framefmt *sink_fmt;
721 
722 	sink_crop = rkisp1_isp_get_pad_crop(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
723 					    which);
724 	sink_fmt = rkisp1_isp_get_pad_fmt(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
725 					  which);
726 
727 	sink_crop->left = ALIGN(r->left, 2);
728 	sink_crop->width = ALIGN(r->width, 2);
729 	sink_crop->top = r->top;
730 	sink_crop->height = r->height;
731 	rkisp1_sd_adjust_crop(sink_crop, sink_fmt);
732 
733 	*r = *sink_crop;
734 
735 	/* Propagate to out crop */
736 	src_crop = rkisp1_isp_get_pad_crop(isp, cfg,
737 					   RKISP1_ISP_PAD_SOURCE_VIDEO, which);
738 	rkisp1_isp_set_src_crop(isp, cfg, src_crop, which);
739 }
740 
rkisp1_isp_set_sink_fmt(struct rkisp1_isp * isp,struct v4l2_subdev_pad_config * cfg,struct v4l2_mbus_framefmt * format,unsigned int which)741 static void rkisp1_isp_set_sink_fmt(struct rkisp1_isp *isp,
742 				    struct v4l2_subdev_pad_config *cfg,
743 				    struct v4l2_mbus_framefmt *format,
744 				    unsigned int which)
745 {
746 	const struct rkisp1_isp_mbus_info *mbus_info;
747 	struct v4l2_mbus_framefmt *sink_fmt;
748 	struct v4l2_rect *sink_crop;
749 
750 	sink_fmt = rkisp1_isp_get_pad_fmt(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
751 					  which);
752 	sink_fmt->code = format->code;
753 	mbus_info = rkisp1_isp_mbus_info_get(sink_fmt->code);
754 	if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SINK)) {
755 		sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
756 		mbus_info = rkisp1_isp_mbus_info_get(sink_fmt->code);
757 	}
758 	if (which == V4L2_SUBDEV_FORMAT_ACTIVE)
759 		isp->sink_fmt = mbus_info;
760 
761 	sink_fmt->width = clamp_t(u32, format->width,
762 				  RKISP1_ISP_MIN_WIDTH,
763 				  RKISP1_ISP_MAX_WIDTH);
764 	sink_fmt->height = clamp_t(u32, format->height,
765 				   RKISP1_ISP_MIN_HEIGHT,
766 				   RKISP1_ISP_MAX_HEIGHT);
767 
768 	*format = *sink_fmt;
769 
770 	/* Propagate to in crop */
771 	sink_crop = rkisp1_isp_get_pad_crop(isp, cfg, RKISP1_ISP_PAD_SINK_VIDEO,
772 					    which);
773 	rkisp1_isp_set_sink_crop(isp, cfg, sink_crop, which);
774 }
775 
rkisp1_isp_get_fmt(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_format * fmt)776 static int rkisp1_isp_get_fmt(struct v4l2_subdev *sd,
777 			      struct v4l2_subdev_pad_config *cfg,
778 			      struct v4l2_subdev_format *fmt)
779 {
780 	struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
781 
782 	mutex_lock(&isp->ops_lock);
783 	fmt->format = *rkisp1_isp_get_pad_fmt(isp, cfg, fmt->pad, fmt->which);
784 	mutex_unlock(&isp->ops_lock);
785 	return 0;
786 }
787 
rkisp1_isp_set_fmt(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_format * fmt)788 static int rkisp1_isp_set_fmt(struct v4l2_subdev *sd,
789 			      struct v4l2_subdev_pad_config *cfg,
790 			      struct v4l2_subdev_format *fmt)
791 {
792 	struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
793 
794 	mutex_lock(&isp->ops_lock);
795 	if (fmt->pad == RKISP1_ISP_PAD_SINK_VIDEO)
796 		rkisp1_isp_set_sink_fmt(isp, cfg, &fmt->format, fmt->which);
797 	else if (fmt->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
798 		rkisp1_isp_set_src_fmt(isp, cfg, &fmt->format, fmt->which);
799 	else
800 		fmt->format = *rkisp1_isp_get_pad_fmt(isp, cfg, fmt->pad,
801 						      fmt->which);
802 
803 	mutex_unlock(&isp->ops_lock);
804 	return 0;
805 }
806 
rkisp1_isp_get_selection(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_selection * sel)807 static int rkisp1_isp_get_selection(struct v4l2_subdev *sd,
808 				    struct v4l2_subdev_pad_config *cfg,
809 				    struct v4l2_subdev_selection *sel)
810 {
811 	struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
812 	int ret = 0;
813 
814 	if (sel->pad != RKISP1_ISP_PAD_SOURCE_VIDEO &&
815 	    sel->pad != RKISP1_ISP_PAD_SINK_VIDEO)
816 		return -EINVAL;
817 
818 	mutex_lock(&isp->ops_lock);
819 	switch (sel->target) {
820 	case V4L2_SEL_TGT_CROP_BOUNDS:
821 		if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
822 			struct v4l2_mbus_framefmt *fmt;
823 
824 			fmt = rkisp1_isp_get_pad_fmt(isp, cfg, sel->pad,
825 						     sel->which);
826 			sel->r.height = fmt->height;
827 			sel->r.width = fmt->width;
828 			sel->r.left = 0;
829 			sel->r.top = 0;
830 		} else {
831 			sel->r = *rkisp1_isp_get_pad_crop(isp, cfg,
832 						RKISP1_ISP_PAD_SINK_VIDEO,
833 						sel->which);
834 		}
835 		break;
836 	case V4L2_SEL_TGT_CROP:
837 		sel->r = *rkisp1_isp_get_pad_crop(isp, cfg, sel->pad,
838 						  sel->which);
839 		break;
840 	default:
841 		ret = -EINVAL;
842 	}
843 	mutex_unlock(&isp->ops_lock);
844 	return ret;
845 }
846 
rkisp1_isp_set_selection(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_selection * sel)847 static int rkisp1_isp_set_selection(struct v4l2_subdev *sd,
848 				    struct v4l2_subdev_pad_config *cfg,
849 				    struct v4l2_subdev_selection *sel)
850 {
851 	struct rkisp1_device *rkisp1 =
852 		container_of(sd->v4l2_dev, struct rkisp1_device, v4l2_dev);
853 	struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
854 	int ret = 0;
855 
856 	if (sel->target != V4L2_SEL_TGT_CROP)
857 		return -EINVAL;
858 
859 	dev_dbg(rkisp1->dev, "%s: pad: %d sel(%d,%d)/%dx%d\n", __func__,
860 		sel->pad, sel->r.left, sel->r.top, sel->r.width, sel->r.height);
861 	mutex_lock(&isp->ops_lock);
862 	if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO)
863 		rkisp1_isp_set_sink_crop(isp, cfg, &sel->r, sel->which);
864 	else if (sel->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
865 		rkisp1_isp_set_src_crop(isp, cfg, &sel->r, sel->which);
866 	else
867 		ret = -EINVAL;
868 
869 	mutex_unlock(&isp->ops_lock);
870 	return ret;
871 }
872 
rkisp1_subdev_link_validate(struct media_link * link)873 static int rkisp1_subdev_link_validate(struct media_link *link)
874 {
875 	if (link->sink->index == RKISP1_ISP_PAD_SINK_PARAMS)
876 		return 0;
877 
878 	return v4l2_subdev_link_validate(link);
879 }
880 
881 static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {
882 	.enum_mbus_code = rkisp1_isp_enum_mbus_code,
883 	.get_selection = rkisp1_isp_get_selection,
884 	.set_selection = rkisp1_isp_set_selection,
885 	.init_cfg = rkisp1_isp_init_config,
886 	.get_fmt = rkisp1_isp_get_fmt,
887 	.set_fmt = rkisp1_isp_set_fmt,
888 	.link_validate = v4l2_subdev_link_validate_default,
889 };
890 
891 /* ----------------------------------------------------------------------------
892  * Stream operations
893  */
894 
rkisp1_mipi_csi2_start(struct rkisp1_isp * isp,struct rkisp1_sensor_async * sensor)895 static int rkisp1_mipi_csi2_start(struct rkisp1_isp *isp,
896 				  struct rkisp1_sensor_async *sensor)
897 {
898 	struct rkisp1_device *rkisp1 =
899 		container_of(isp->sd.v4l2_dev, struct rkisp1_device, v4l2_dev);
900 	union phy_configure_opts opts;
901 	struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;
902 	s64 pixel_clock;
903 
904 	if (!sensor->pixel_rate_ctrl) {
905 		dev_warn(rkisp1->dev, "No pixel rate control in sensor subdev\n");
906 		return -EPIPE;
907 	}
908 
909 	pixel_clock = v4l2_ctrl_g_ctrl_int64(sensor->pixel_rate_ctrl);
910 	if (!pixel_clock) {
911 		dev_err(rkisp1->dev, "Invalid pixel rate value\n");
912 		return -EINVAL;
913 	}
914 
915 	phy_mipi_dphy_get_default_config(pixel_clock, isp->sink_fmt->bus_width,
916 					 sensor->lanes, cfg);
917 	phy_set_mode(sensor->dphy, PHY_MODE_MIPI_DPHY);
918 	phy_configure(sensor->dphy, &opts);
919 	phy_power_on(sensor->dphy);
920 
921 	return 0;
922 }
923 
rkisp1_mipi_csi2_stop(struct rkisp1_sensor_async * sensor)924 static void rkisp1_mipi_csi2_stop(struct rkisp1_sensor_async *sensor)
925 {
926 	phy_power_off(sensor->dphy);
927 }
928 
rkisp1_isp_s_stream(struct v4l2_subdev * sd,int enable)929 static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
930 {
931 	struct rkisp1_device *rkisp1 =
932 		container_of(sd->v4l2_dev, struct rkisp1_device, v4l2_dev);
933 	struct rkisp1_isp *isp = &rkisp1->isp;
934 	struct v4l2_subdev *sensor_sd;
935 	int ret = 0;
936 
937 	if (!enable) {
938 		rkisp1_isp_stop(rkisp1);
939 		rkisp1_mipi_csi2_stop(rkisp1->active_sensor);
940 		return 0;
941 	}
942 
943 	sensor_sd = rkisp1_get_remote_sensor(sd);
944 	if (!sensor_sd) {
945 		dev_warn(rkisp1->dev, "No link between isp and sensor\n");
946 		return -ENODEV;
947 	}
948 
949 	rkisp1->active_sensor = container_of(sensor_sd->asd,
950 					     struct rkisp1_sensor_async, asd);
951 
952 	if (rkisp1->active_sensor->mbus_type != V4L2_MBUS_CSI2_DPHY)
953 		return -EINVAL;
954 
955 	rkisp1->isp.frame_sequence = -1;
956 	mutex_lock(&isp->ops_lock);
957 	ret = rkisp1_config_cif(rkisp1);
958 	if (ret)
959 		goto mutex_unlock;
960 
961 	ret = rkisp1_mipi_csi2_start(&rkisp1->isp, rkisp1->active_sensor);
962 	if (ret)
963 		goto mutex_unlock;
964 
965 	rkisp1_isp_start(rkisp1);
966 
967 mutex_unlock:
968 	mutex_unlock(&isp->ops_lock);
969 	return ret;
970 }
971 
rkisp1_isp_subs_evt(struct v4l2_subdev * sd,struct v4l2_fh * fh,struct v4l2_event_subscription * sub)972 static int rkisp1_isp_subs_evt(struct v4l2_subdev *sd, struct v4l2_fh *fh,
973 			       struct v4l2_event_subscription *sub)
974 {
975 	if (sub->type != V4L2_EVENT_FRAME_SYNC)
976 		return -EINVAL;
977 
978 	/* V4L2_EVENT_FRAME_SYNC doesn't require an id, so zero should be set */
979 	if (sub->id != 0)
980 		return -EINVAL;
981 
982 	return v4l2_event_subscribe(fh, sub, 0, NULL);
983 }
984 
985 static const struct media_entity_operations rkisp1_isp_media_ops = {
986 	.link_validate = rkisp1_subdev_link_validate,
987 };
988 
989 static const struct v4l2_subdev_video_ops rkisp1_isp_video_ops = {
990 	.s_stream = rkisp1_isp_s_stream,
991 };
992 
993 static const struct v4l2_subdev_core_ops rkisp1_isp_core_ops = {
994 	.subscribe_event = rkisp1_isp_subs_evt,
995 	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
996 };
997 
998 static const struct v4l2_subdev_ops rkisp1_isp_ops = {
999 	.core = &rkisp1_isp_core_ops,
1000 	.video = &rkisp1_isp_video_ops,
1001 	.pad = &rkisp1_isp_pad_ops,
1002 };
1003 
rkisp1_isp_register(struct rkisp1_device * rkisp1)1004 int rkisp1_isp_register(struct rkisp1_device *rkisp1)
1005 {
1006 	struct rkisp1_isp *isp = &rkisp1->isp;
1007 	struct media_pad *pads = isp->pads;
1008 	struct v4l2_subdev *sd = &isp->sd;
1009 	int ret;
1010 
1011 	v4l2_subdev_init(sd, &rkisp1_isp_ops);
1012 	sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
1013 	sd->entity.ops = &rkisp1_isp_media_ops;
1014 	sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
1015 	sd->owner = THIS_MODULE;
1016 	strscpy(sd->name, RKISP1_ISP_DEV_NAME, sizeof(sd->name));
1017 
1018 	pads[RKISP1_ISP_PAD_SINK_VIDEO].flags = MEDIA_PAD_FL_SINK |
1019 						MEDIA_PAD_FL_MUST_CONNECT;
1020 	pads[RKISP1_ISP_PAD_SINK_PARAMS].flags = MEDIA_PAD_FL_SINK;
1021 	pads[RKISP1_ISP_PAD_SOURCE_VIDEO].flags = MEDIA_PAD_FL_SOURCE;
1022 	pads[RKISP1_ISP_PAD_SOURCE_STATS].flags = MEDIA_PAD_FL_SOURCE;
1023 
1024 	isp->sink_fmt = rkisp1_isp_mbus_info_get(RKISP1_DEF_SINK_PAD_FMT);
1025 	isp->src_fmt = rkisp1_isp_mbus_info_get(RKISP1_DEF_SRC_PAD_FMT);
1026 
1027 	mutex_init(&isp->ops_lock);
1028 	ret = media_entity_pads_init(&sd->entity, RKISP1_ISP_PAD_MAX, pads);
1029 	if (ret)
1030 		return ret;
1031 
1032 	ret = v4l2_device_register_subdev(&rkisp1->v4l2_dev, sd);
1033 	if (ret) {
1034 		dev_err(rkisp1->dev, "Failed to register isp subdev\n");
1035 		goto err_cleanup_media_entity;
1036 	}
1037 
1038 	rkisp1_isp_init_config(sd, rkisp1->isp.pad_cfg);
1039 	return 0;
1040 
1041 err_cleanup_media_entity:
1042 	media_entity_cleanup(&sd->entity);
1043 
1044 	return ret;
1045 }
1046 
rkisp1_isp_unregister(struct rkisp1_device * rkisp1)1047 void rkisp1_isp_unregister(struct rkisp1_device *rkisp1)
1048 {
1049 	struct v4l2_subdev *sd = &rkisp1->isp.sd;
1050 
1051 	v4l2_device_unregister_subdev(sd);
1052 	media_entity_cleanup(&sd->entity);
1053 }
1054 
1055 /* ----------------------------------------------------------------------------
1056  * Interrupt handlers
1057  */
1058 
rkisp1_mipi_isr(struct rkisp1_device * rkisp1)1059 void rkisp1_mipi_isr(struct rkisp1_device *rkisp1)
1060 {
1061 	u32 val, status;
1062 
1063 	status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS);
1064 	if (!status)
1065 		return;
1066 
1067 	rkisp1_write(rkisp1, status, RKISP1_CIF_MIPI_ICR);
1068 
1069 	/*
1070 	 * Disable DPHY errctrl interrupt, because this dphy
1071 	 * erctrl signal is asserted until the next changes
1072 	 * of line state. This time is may be too long and cpu
1073 	 * is hold in this interrupt.
1074 	 */
1075 	if (status & RKISP1_CIF_MIPI_ERR_CTRL(0x0f)) {
1076 		val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC);
1077 		rkisp1_write(rkisp1, val & ~RKISP1_CIF_MIPI_ERR_CTRL(0x0f),
1078 			     RKISP1_CIF_MIPI_IMSC);
1079 		rkisp1->isp.is_dphy_errctrl_disabled = true;
1080 	}
1081 
1082 	/*
1083 	 * Enable DPHY errctrl interrupt again, if mipi have receive
1084 	 * the whole frame without any error.
1085 	 */
1086 	if (status == RKISP1_CIF_MIPI_FRAME_END) {
1087 		/*
1088 		 * Enable DPHY errctrl interrupt again, if mipi have receive
1089 		 * the whole frame without any error.
1090 		 */
1091 		if (rkisp1->isp.is_dphy_errctrl_disabled) {
1092 			val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC);
1093 			val |= RKISP1_CIF_MIPI_ERR_CTRL(0x0f);
1094 			rkisp1_write(rkisp1, val, RKISP1_CIF_MIPI_IMSC);
1095 			rkisp1->isp.is_dphy_errctrl_disabled = false;
1096 		}
1097 	} else {
1098 		rkisp1->debug.mipi_error++;
1099 	}
1100 }
1101 
rkisp1_isp_queue_event_sof(struct rkisp1_isp * isp)1102 static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp)
1103 {
1104 	struct v4l2_event event = {
1105 		.type = V4L2_EVENT_FRAME_SYNC,
1106 	};
1107 	event.u.frame_sync.frame_sequence = isp->frame_sequence;
1108 
1109 	v4l2_event_queue(isp->sd.devnode, &event);
1110 }
1111 
rkisp1_isp_isr(struct rkisp1_device * rkisp1)1112 void rkisp1_isp_isr(struct rkisp1_device *rkisp1)
1113 {
1114 	u32 status, isp_err;
1115 
1116 	status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS);
1117 	if (!status)
1118 		return;
1119 
1120 	rkisp1_write(rkisp1, status, RKISP1_CIF_ISP_ICR);
1121 
1122 	/* Vertical sync signal, starting generating new frame */
1123 	if (status & RKISP1_CIF_ISP_V_START) {
1124 		rkisp1->isp.frame_sequence++;
1125 		rkisp1_isp_queue_event_sof(&rkisp1->isp);
1126 		if (status & RKISP1_CIF_ISP_FRAME) {
1127 			WARN_ONCE(1, "irq delay is too long, buffers might not be in sync\n");
1128 			rkisp1->debug.irq_delay++;
1129 		}
1130 	}
1131 	if (status & RKISP1_CIF_ISP_PIC_SIZE_ERROR) {
1132 		/* Clear pic_size_error */
1133 		isp_err = rkisp1_read(rkisp1, RKISP1_CIF_ISP_ERR);
1134 		if (isp_err & RKISP1_CIF_ISP_ERR_INFORM_SIZE)
1135 			rkisp1->debug.inform_size_error++;
1136 		if (isp_err & RKISP1_CIF_ISP_ERR_IS_SIZE)
1137 			rkisp1->debug.img_stabilization_size_error++;
1138 		if (isp_err & RKISP1_CIF_ISP_ERR_OUTFORM_SIZE)
1139 			rkisp1->debug.outform_size_error++;
1140 		rkisp1_write(rkisp1, isp_err, RKISP1_CIF_ISP_ERR_CLR);
1141 	} else if (status & RKISP1_CIF_ISP_DATA_LOSS) {
1142 		/* keep track of data_loss in debugfs */
1143 		rkisp1->debug.data_loss++;
1144 	}
1145 
1146 	if (status & RKISP1_CIF_ISP_FRAME) {
1147 		u32 isp_ris;
1148 
1149 		/* New frame from the sensor received */
1150 		isp_ris = rkisp1_read(rkisp1, RKISP1_CIF_ISP_RIS);
1151 		if (isp_ris & RKISP1_STATS_MEAS_MASK)
1152 			rkisp1_stats_isr(&rkisp1->stats, isp_ris);
1153 		/*
1154 		 * Then update changed configs. Some of them involve
1155 		 * lot of register writes. Do those only one per frame.
1156 		 * Do the updates in the order of the processing flow.
1157 		 */
1158 		rkisp1_params_isr(rkisp1);
1159 	}
1160 
1161 }
1162