1 // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
3 * Rockchip ISP1 Driver - ISP Subdevice
5 * Copyright (C) 2019 Collabora, Ltd.
7 * Based on Rockchip ISP1 driver by Rockchip Electronics Co., Ltd.
8 * Copyright (C) 2017 Rockchip Electronics Co., Ltd.
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>
19 #include "rkisp1-common.h"
21 #define RKISP1_DEF_SINK_PAD_FMT MEDIA_BUS_FMT_SRGGB10_1X10
22 #define RKISP1_DEF_SRC_PAD_FMT MEDIA_BUS_FMT_YUYV8_2X8
24 #define RKISP1_ISP_DEV_NAME RKISP1_DRIVER_NAME "_isp"
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.
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)
38 * Cropping regions of ISP
40 * +---------------------------------------------------------+
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 * +---------------------------------------------------------+
57 static const struct rkisp1_isp_mbus_info rkisp1_isp_formats[] = {
59 .mbus_code = MEDIA_BUS_FMT_YUYV8_2X8,
60 .pixel_enc = V4L2_PIXEL_ENC_YUV,
61 .direction = RKISP1_ISP_SD_SRC,
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,
68 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
75 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
82 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
89 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
96 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
103 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
110 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
117 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
124 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
131 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
138 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
145 .direction = RKISP1_ISP_SD_SINK | RKISP1_ISP_SD_SRC,
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,
152 .direction = RKISP1_ISP_SD_SINK,
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,
159 .direction = RKISP1_ISP_SD_SINK,
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,
166 .direction = RKISP1_ISP_SD_SINK,
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,
173 .direction = RKISP1_ISP_SD_SINK,
177 /* ----------------------------------------------------------------------------
181 const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code)
185 for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {
186 const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];
188 if (fmt->mbus_code == mbus_code)
195 static struct v4l2_subdev *rkisp1_get_remote_sensor(struct v4l2_subdev *sd)
197 struct media_pad *local, *remote;
198 struct media_entity *sensor_me;
200 local = &sd->entity.pads[RKISP1_ISP_PAD_SINK_VIDEO];
201 remote = media_entity_remote_pad(local);
205 sensor_me = remote->entity;
206 return media_entity_to_v4l2_subdev(sensor_me);
209 static struct v4l2_mbus_framefmt *
210 rkisp1_isp_get_pad_fmt(struct rkisp1_isp *isp,
211 struct v4l2_subdev_state *sd_state,
212 unsigned int pad, u32 which)
214 struct v4l2_subdev_state state = {
217 struct v4l2_subdev_state state = {
220 struct v4l2_subdev_state state = {
223 if (which == V4L2_SUBDEV_FORMAT_TRY)
224 return v4l2_subdev_get_try_format(&isp->sd, sd_state, pad);
226 return v4l2_subdev_get_try_format(&isp->sd, &state, pad);
229 static struct v4l2_rect *
230 rkisp1_isp_get_pad_crop(struct rkisp1_isp *isp,
231 struct v4l2_subdev_state *sd_state,
232 unsigned int pad, u32 which)
234 struct v4l2_subdev_state state = {
237 struct v4l2_subdev_state state = {
240 struct v4l2_subdev_state state = {
243 if (which == V4L2_SUBDEV_FORMAT_TRY)
244 return v4l2_subdev_get_try_crop(&isp->sd, sd_state, pad);
246 return v4l2_subdev_get_try_crop(&isp->sd, &state, pad);
249 /* ----------------------------------------------------------------------------
250 * Camera Interface registers configurations
254 * Image Stabilization.
255 * This should only be called when configuring CIF
256 * or at the frame end interrupt
258 static void rkisp1_config_ism(struct rkisp1_device *rkisp1)
260 struct v4l2_rect *src_crop =
261 rkisp1_isp_get_pad_crop(&rkisp1->isp, NULL,
262 RKISP1_ISP_PAD_SOURCE_VIDEO,
263 V4L2_SUBDEV_FORMAT_ACTIVE);
266 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_RECENTER);
267 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_MAX_DX);
268 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_MAX_DY);
269 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IS_DISPLACE);
270 rkisp1_write(rkisp1, src_crop->left, RKISP1_CIF_ISP_IS_H_OFFS);
271 rkisp1_write(rkisp1, src_crop->top, RKISP1_CIF_ISP_IS_V_OFFS);
272 rkisp1_write(rkisp1, src_crop->width, RKISP1_CIF_ISP_IS_H_SIZE);
273 rkisp1_write(rkisp1, src_crop->height, RKISP1_CIF_ISP_IS_V_SIZE);
275 /* IS(Image Stabilization) is always on, working as output crop */
276 rkisp1_write(rkisp1, 1, RKISP1_CIF_ISP_IS_CTRL);
277 val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
278 val |= RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD;
279 rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
283 * configure ISP blocks with input format, size......
285 static int rkisp1_config_isp(struct rkisp1_device *rkisp1)
287 u32 isp_ctrl = 0, irq_mask = 0, acq_mult = 0, signal = 0;
288 const struct rkisp1_isp_mbus_info *src_fmt, *sink_fmt;
289 struct rkisp1_sensor_async *sensor;
290 struct v4l2_mbus_framefmt *sink_frm;
291 struct v4l2_rect *sink_crop;
293 sensor = rkisp1->active_sensor;
294 sink_fmt = rkisp1->isp.sink_fmt;
295 src_fmt = rkisp1->isp.src_fmt;
296 sink_frm = rkisp1_isp_get_pad_fmt(&rkisp1->isp, NULL,
297 RKISP1_ISP_PAD_SINK_VIDEO,
298 V4L2_SUBDEV_FORMAT_ACTIVE);
299 sink_crop = rkisp1_isp_get_pad_crop(&rkisp1->isp, NULL,
300 RKISP1_ISP_PAD_SINK_VIDEO,
301 V4L2_SUBDEV_FORMAT_ACTIVE);
303 if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
305 if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
306 if (sensor->mbus_type == V4L2_MBUS_BT656)
307 isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT_ITU656;
309 isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_RAW_PICT;
311 rkisp1_write(rkisp1, RKISP1_CIF_ISP_DEMOSAIC_TH(0xc),
312 RKISP1_CIF_ISP_DEMOSAIC);
314 if (sensor->mbus_type == V4L2_MBUS_BT656)
315 isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU656;
317 isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_BAYER_ITU601;
319 } else if (sink_fmt->pixel_enc == V4L2_PIXEL_ENC_YUV) {
321 if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
322 isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
324 if (sensor->mbus_type == V4L2_MBUS_BT656)
325 isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU656;
327 isp_ctrl = RKISP1_CIF_ISP_CTRL_ISP_MODE_ITU601;
330 irq_mask |= RKISP1_CIF_ISP_DATA_LOSS;
333 /* Set up input acquisition properties */
334 if (sensor->mbus_type == V4L2_MBUS_BT656 ||
335 sensor->mbus_type == V4L2_MBUS_PARALLEL) {
336 if (sensor->mbus_flags & V4L2_MBUS_PCLK_SAMPLE_RISING)
337 signal = RKISP1_CIF_ISP_ACQ_PROP_POS_EDGE;
340 if (sensor->mbus_type == V4L2_MBUS_PARALLEL) {
341 if (sensor->mbus_flags & V4L2_MBUS_VSYNC_ACTIVE_LOW)
342 signal |= RKISP1_CIF_ISP_ACQ_PROP_VSYNC_LOW;
344 if (sensor->mbus_flags & V4L2_MBUS_HSYNC_ACTIVE_LOW)
345 signal |= RKISP1_CIF_ISP_ACQ_PROP_HSYNC_LOW;
348 rkisp1_write(rkisp1, isp_ctrl, RKISP1_CIF_ISP_CTRL);
349 rkisp1_write(rkisp1, signal | sink_fmt->yuv_seq |
350 RKISP1_CIF_ISP_ACQ_PROP_BAYER_PAT(sink_fmt->bayer_pat) |
351 RKISP1_CIF_ISP_ACQ_PROP_FIELD_SEL_ALL,
352 RKISP1_CIF_ISP_ACQ_PROP);
353 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_NR_FRAMES);
355 /* Acquisition Size */
356 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_H_OFFS);
357 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_ACQ_V_OFFS);
359 acq_mult * sink_frm->width, RKISP1_CIF_ISP_ACQ_H_SIZE);
360 rkisp1_write(rkisp1, sink_frm->height, RKISP1_CIF_ISP_ACQ_V_SIZE);
363 rkisp1_write(rkisp1, sink_crop->left, RKISP1_CIF_ISP_OUT_H_OFFS);
364 rkisp1_write(rkisp1, sink_crop->top, RKISP1_CIF_ISP_OUT_V_OFFS);
365 rkisp1_write(rkisp1, sink_crop->width, RKISP1_CIF_ISP_OUT_H_SIZE);
366 rkisp1_write(rkisp1, sink_crop->height, RKISP1_CIF_ISP_OUT_V_SIZE);
368 irq_mask |= RKISP1_CIF_ISP_FRAME | RKISP1_CIF_ISP_V_START |
369 RKISP1_CIF_ISP_PIC_SIZE_ERROR;
370 rkisp1_write(rkisp1, irq_mask, RKISP1_CIF_ISP_IMSC);
372 if (src_fmt->pixel_enc == V4L2_PIXEL_ENC_BAYER) {
373 rkisp1_params_disable(&rkisp1->params);
375 struct v4l2_mbus_framefmt *src_frm;
377 src_frm = rkisp1_isp_get_pad_fmt(&rkisp1->isp, NULL,
378 RKISP1_ISP_PAD_SINK_VIDEO,
379 V4L2_SUBDEV_FORMAT_ACTIVE);
380 rkisp1_params_configure(&rkisp1->params, sink_fmt->bayer_pat,
381 src_frm->quantization);
387 static int rkisp1_config_dvp(struct rkisp1_device *rkisp1)
389 const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
392 switch (sink_fmt->bus_width) {
394 input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_8B_ZERO;
397 input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_10B_ZERO;
400 input_sel = RKISP1_CIF_ISP_ACQ_PROP_IN_SEL_12B;
403 dev_err(rkisp1->dev, "Invalid bus width\n");
407 val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_ACQ_PROP);
408 rkisp1_write(rkisp1, val | input_sel, RKISP1_CIF_ISP_ACQ_PROP);
413 static int rkisp1_config_mipi(struct rkisp1_device *rkisp1)
415 const struct rkisp1_isp_mbus_info *sink_fmt = rkisp1->isp.sink_fmt;
416 unsigned int lanes = rkisp1->active_sensor->lanes;
419 if (lanes < 1 || lanes > 4)
422 mipi_ctrl = RKISP1_CIF_MIPI_CTRL_NUM_LANES(lanes - 1) |
423 RKISP1_CIF_MIPI_CTRL_SHUTDOWNLANES(0xf) |
424 RKISP1_CIF_MIPI_CTRL_ERR_SOT_SYNC_HS_SKIP |
425 RKISP1_CIF_MIPI_CTRL_CLOCKLANE_ENA;
427 rkisp1_write(rkisp1, mipi_ctrl, RKISP1_CIF_MIPI_CTRL);
429 /* Configure Data Type and Virtual Channel */
431 RKISP1_CIF_MIPI_DATA_SEL_DT(sink_fmt->mipi_dt) |
432 RKISP1_CIF_MIPI_DATA_SEL_VC(0),
433 RKISP1_CIF_MIPI_IMG_DATA_SEL);
435 /* Clear MIPI interrupts */
436 rkisp1_write(rkisp1, ~0, RKISP1_CIF_MIPI_ICR);
438 * Disable RKISP1_CIF_MIPI_ERR_DPHY interrupt here temporary for
439 * isp bus may be dead when switch isp.
442 RKISP1_CIF_MIPI_FRAME_END | RKISP1_CIF_MIPI_ERR_CSI |
443 RKISP1_CIF_MIPI_ERR_DPHY |
444 RKISP1_CIF_MIPI_SYNC_FIFO_OVFLW(0x03) |
445 RKISP1_CIF_MIPI_ADD_DATA_OVFLW,
446 RKISP1_CIF_MIPI_IMSC);
448 dev_dbg(rkisp1->dev, "\n MIPI_CTRL 0x%08x\n"
449 " MIPI_IMG_DATA_SEL 0x%08x\n"
450 " MIPI_STATUS 0x%08x\n"
451 " MIPI_IMSC 0x%08x\n",
452 rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL),
453 rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMG_DATA_SEL),
454 rkisp1_read(rkisp1, RKISP1_CIF_MIPI_STATUS),
455 rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC));
461 static int rkisp1_config_path(struct rkisp1_device *rkisp1)
463 struct rkisp1_sensor_async *sensor = rkisp1->active_sensor;
464 u32 dpcl = rkisp1_read(rkisp1, RKISP1_CIF_VI_DPCL);
467 if (sensor->mbus_type == V4L2_MBUS_BT656 ||
468 sensor->mbus_type == V4L2_MBUS_PARALLEL) {
469 ret = rkisp1_config_dvp(rkisp1);
470 dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_PARALLEL;
471 } else if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
472 ret = rkisp1_config_mipi(rkisp1);
473 dpcl |= RKISP1_CIF_VI_DPCL_IF_SEL_MIPI;
476 rkisp1_write(rkisp1, dpcl, RKISP1_CIF_VI_DPCL);
481 /* Hardware configure Entry */
482 static int rkisp1_config_cif(struct rkisp1_device *rkisp1)
487 cif_id = rkisp1_read(rkisp1, RKISP1_CIF_VI_ID);
488 dev_dbg(rkisp1->dev, "CIF_ID 0x%08x\n", cif_id);
490 ret = rkisp1_config_isp(rkisp1);
493 ret = rkisp1_config_path(rkisp1);
496 rkisp1_config_ism(rkisp1);
501 static void rkisp1_isp_stop(struct rkisp1_device *rkisp1)
506 * ISP(mi) stop in mi frame end -> Stop ISP(mipi) ->
507 * Stop ISP(isp) ->wait for ISP isp off
509 /* stop and clear MI, MIPI, and ISP interrupts */
510 rkisp1_write(rkisp1, 0, RKISP1_CIF_MIPI_IMSC);
511 rkisp1_write(rkisp1, ~0, RKISP1_CIF_MIPI_ICR);
513 rkisp1_write(rkisp1, 0, RKISP1_CIF_ISP_IMSC);
514 rkisp1_write(rkisp1, ~0, RKISP1_CIF_ISP_ICR);
516 rkisp1_write(rkisp1, 0, RKISP1_CIF_MI_IMSC);
517 rkisp1_write(rkisp1, ~0, RKISP1_CIF_MI_ICR);
518 val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
519 rkisp1_write(rkisp1, val & (~RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA),
520 RKISP1_CIF_MIPI_CTRL);
522 val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
523 val &= ~(RKISP1_CIF_ISP_CTRL_ISP_INFORM_ENABLE |
524 RKISP1_CIF_ISP_CTRL_ISP_ENABLE);
525 rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
527 val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
528 rkisp1_write(rkisp1, val | RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD,
529 RKISP1_CIF_ISP_CTRL);
531 readx_poll_timeout(readl, rkisp1->base_addr + RKISP1_CIF_ISP_RIS,
532 val, val & RKISP1_CIF_ISP_OFF, 20, 100);
534 RKISP1_CIF_IRCL_MIPI_SW_RST | RKISP1_CIF_IRCL_ISP_SW_RST,
536 rkisp1_write(rkisp1, 0x0, RKISP1_CIF_IRCL);
539 static void rkisp1_config_clk(struct rkisp1_device *rkisp1)
541 u32 val = RKISP1_CIF_ICCL_ISP_CLK | RKISP1_CIF_ICCL_CP_CLK |
542 RKISP1_CIF_ICCL_MRSZ_CLK | RKISP1_CIF_ICCL_SRSZ_CLK |
543 RKISP1_CIF_ICCL_JPEG_CLK | RKISP1_CIF_ICCL_MI_CLK |
544 RKISP1_CIF_ICCL_IE_CLK | RKISP1_CIF_ICCL_MIPI_CLK |
545 RKISP1_CIF_ICCL_DCROP_CLK;
547 rkisp1_write(rkisp1, val, RKISP1_CIF_ICCL);
550 static void rkisp1_isp_start(struct rkisp1_device *rkisp1)
552 struct rkisp1_sensor_async *sensor = rkisp1->active_sensor;
555 rkisp1_config_clk(rkisp1);
558 if (sensor->mbus_type == V4L2_MBUS_CSI2_DPHY) {
559 val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_CTRL);
560 rkisp1_write(rkisp1, val | RKISP1_CIF_MIPI_CTRL_OUTPUT_ENA,
561 RKISP1_CIF_MIPI_CTRL);
564 val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_CTRL);
565 val |= RKISP1_CIF_ISP_CTRL_ISP_CFG_UPD |
566 RKISP1_CIF_ISP_CTRL_ISP_ENABLE |
567 RKISP1_CIF_ISP_CTRL_ISP_INFORM_ENABLE;
568 rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_CTRL);
571 * CIF spec says to wait for sufficient time after enabling
572 * the MIPI interface and before starting the sensor output.
574 usleep_range(1000, 1200);
577 /* ----------------------------------------------------------------------------
578 * Subdev pad operations
581 static int rkisp1_isp_enum_mbus_code(struct v4l2_subdev *sd,
582 struct v4l2_subdev_state *sd_state,
583 struct v4l2_subdev_mbus_code_enum *code)
588 if (code->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
589 dir = RKISP1_ISP_SD_SINK;
590 } else if (code->pad == RKISP1_ISP_PAD_SOURCE_VIDEO) {
591 dir = RKISP1_ISP_SD_SRC;
595 code->code = MEDIA_BUS_FMT_METADATA_FIXED;
599 if (code->index >= ARRAY_SIZE(rkisp1_isp_formats))
602 for (i = 0; i < ARRAY_SIZE(rkisp1_isp_formats); i++) {
603 const struct rkisp1_isp_mbus_info *fmt = &rkisp1_isp_formats[i];
605 if (fmt->direction & dir)
608 if (code->index == pos - 1) {
609 code->code = fmt->mbus_code;
610 if (fmt->pixel_enc == V4L2_PIXEL_ENC_YUV &&
611 dir == RKISP1_ISP_SD_SRC)
613 V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION;
621 static int rkisp1_isp_enum_frame_size(struct v4l2_subdev *sd,
622 struct v4l2_subdev_state *sd_state,
623 struct v4l2_subdev_frame_size_enum *fse)
625 const struct rkisp1_isp_mbus_info *mbus_info;
627 if (fse->pad == RKISP1_ISP_PAD_SINK_PARAMS ||
628 fse->pad == RKISP1_ISP_PAD_SOURCE_STATS)
634 mbus_info = rkisp1_isp_mbus_info_get(fse->code);
638 if (!(mbus_info->direction & RKISP1_ISP_SD_SINK) &&
639 fse->pad == RKISP1_ISP_PAD_SINK_VIDEO)
642 if (!(mbus_info->direction & RKISP1_ISP_SD_SRC) &&
643 fse->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
646 fse->min_width = RKISP1_ISP_MIN_WIDTH;
647 fse->max_width = RKISP1_ISP_MAX_WIDTH;
648 fse->min_height = RKISP1_ISP_MIN_HEIGHT;
649 fse->max_height = RKISP1_ISP_MAX_HEIGHT;
654 static int rkisp1_isp_init_config(struct v4l2_subdev *sd,
655 struct v4l2_subdev_state *sd_state)
657 struct v4l2_mbus_framefmt *sink_fmt, *src_fmt;
658 struct v4l2_rect *sink_crop, *src_crop;
660 sink_fmt = v4l2_subdev_get_try_format(sd, sd_state,
661 RKISP1_ISP_PAD_SINK_VIDEO);
662 sink_fmt->width = RKISP1_DEFAULT_WIDTH;
663 sink_fmt->height = RKISP1_DEFAULT_HEIGHT;
664 sink_fmt->field = V4L2_FIELD_NONE;
665 sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
667 sink_crop = v4l2_subdev_get_try_crop(sd, sd_state,
668 RKISP1_ISP_PAD_SINK_VIDEO);
669 sink_crop->width = RKISP1_DEFAULT_WIDTH;
670 sink_crop->height = RKISP1_DEFAULT_HEIGHT;
674 src_fmt = v4l2_subdev_get_try_format(sd, sd_state,
675 RKISP1_ISP_PAD_SOURCE_VIDEO);
676 *src_fmt = *sink_fmt;
677 src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
679 src_crop = v4l2_subdev_get_try_crop(sd, sd_state,
680 RKISP1_ISP_PAD_SOURCE_VIDEO);
681 *src_crop = *sink_crop;
683 sink_fmt = v4l2_subdev_get_try_format(sd, sd_state,
684 RKISP1_ISP_PAD_SINK_PARAMS);
685 src_fmt = v4l2_subdev_get_try_format(sd, sd_state,
686 RKISP1_ISP_PAD_SOURCE_STATS);
688 sink_fmt->height = 0;
689 sink_fmt->field = V4L2_FIELD_NONE;
690 sink_fmt->code = MEDIA_BUS_FMT_METADATA_FIXED;
691 *src_fmt = *sink_fmt;
696 static void rkisp1_isp_set_src_fmt(struct rkisp1_isp *isp,
697 struct v4l2_subdev_state *sd_state,
698 struct v4l2_mbus_framefmt *format,
701 const struct rkisp1_isp_mbus_info *mbus_info;
702 struct v4l2_mbus_framefmt *src_fmt;
703 const struct v4l2_rect *src_crop;
705 src_fmt = rkisp1_isp_get_pad_fmt(isp, sd_state,
706 RKISP1_ISP_PAD_SOURCE_VIDEO, which);
707 src_crop = rkisp1_isp_get_pad_crop(isp, sd_state,
708 RKISP1_ISP_PAD_SOURCE_VIDEO, which);
710 src_fmt->code = format->code;
711 mbus_info = rkisp1_isp_mbus_info_get(src_fmt->code);
712 if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SRC)) {
713 src_fmt->code = RKISP1_DEF_SRC_PAD_FMT;
714 mbus_info = rkisp1_isp_mbus_info_get(src_fmt->code);
716 if (which == V4L2_SUBDEV_FORMAT_ACTIVE)
717 isp->src_fmt = mbus_info;
718 src_fmt->width = src_crop->width;
719 src_fmt->height = src_crop->height;
722 * The CSC API is used to allow userspace to force full
723 * quantization on YUV formats.
725 if (format->flags & V4L2_MBUS_FRAMEFMT_SET_CSC &&
726 format->quantization == V4L2_QUANTIZATION_FULL_RANGE &&
727 mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV)
728 src_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
729 else if (mbus_info->pixel_enc == V4L2_PIXEL_ENC_YUV)
730 src_fmt->quantization = V4L2_QUANTIZATION_LIM_RANGE;
732 src_fmt->quantization = V4L2_QUANTIZATION_FULL_RANGE;
737 static void rkisp1_isp_set_src_crop(struct rkisp1_isp *isp,
738 struct v4l2_subdev_state *sd_state,
739 struct v4l2_rect *r, unsigned int which)
741 struct v4l2_mbus_framefmt *src_fmt;
742 const struct v4l2_rect *sink_crop;
743 struct v4l2_rect *src_crop;
745 src_crop = rkisp1_isp_get_pad_crop(isp, sd_state,
746 RKISP1_ISP_PAD_SOURCE_VIDEO,
748 sink_crop = rkisp1_isp_get_pad_crop(isp, sd_state,
749 RKISP1_ISP_PAD_SINK_VIDEO,
752 src_crop->left = ALIGN(r->left, 2);
753 src_crop->width = ALIGN(r->width, 2);
754 src_crop->top = r->top;
755 src_crop->height = r->height;
756 rkisp1_sd_adjust_crop_rect(src_crop, sink_crop);
760 /* Propagate to out format */
761 src_fmt = rkisp1_isp_get_pad_fmt(isp, sd_state,
762 RKISP1_ISP_PAD_SOURCE_VIDEO, which);
763 rkisp1_isp_set_src_fmt(isp, sd_state, src_fmt, which);
766 static void rkisp1_isp_set_sink_crop(struct rkisp1_isp *isp,
767 struct v4l2_subdev_state *sd_state,
768 struct v4l2_rect *r, unsigned int which)
770 struct v4l2_rect *sink_crop, *src_crop;
771 struct v4l2_mbus_framefmt *sink_fmt;
773 sink_crop = rkisp1_isp_get_pad_crop(isp, sd_state,
774 RKISP1_ISP_PAD_SINK_VIDEO,
776 sink_fmt = rkisp1_isp_get_pad_fmt(isp, sd_state,
777 RKISP1_ISP_PAD_SINK_VIDEO,
780 sink_crop->left = ALIGN(r->left, 2);
781 sink_crop->width = ALIGN(r->width, 2);
782 sink_crop->top = r->top;
783 sink_crop->height = r->height;
784 rkisp1_sd_adjust_crop(sink_crop, sink_fmt);
788 /* Propagate to out crop */
789 src_crop = rkisp1_isp_get_pad_crop(isp, sd_state,
790 RKISP1_ISP_PAD_SOURCE_VIDEO, which);
791 rkisp1_isp_set_src_crop(isp, sd_state, src_crop, which);
794 static void rkisp1_isp_set_sink_fmt(struct rkisp1_isp *isp,
795 struct v4l2_subdev_state *sd_state,
796 struct v4l2_mbus_framefmt *format,
799 const struct rkisp1_isp_mbus_info *mbus_info;
800 struct v4l2_mbus_framefmt *sink_fmt;
801 struct v4l2_rect *sink_crop;
803 sink_fmt = rkisp1_isp_get_pad_fmt(isp, sd_state,
804 RKISP1_ISP_PAD_SINK_VIDEO,
806 sink_fmt->code = format->code;
807 mbus_info = rkisp1_isp_mbus_info_get(sink_fmt->code);
808 if (!mbus_info || !(mbus_info->direction & RKISP1_ISP_SD_SINK)) {
809 sink_fmt->code = RKISP1_DEF_SINK_PAD_FMT;
810 mbus_info = rkisp1_isp_mbus_info_get(sink_fmt->code);
812 if (which == V4L2_SUBDEV_FORMAT_ACTIVE)
813 isp->sink_fmt = mbus_info;
815 sink_fmt->width = clamp_t(u32, format->width,
816 RKISP1_ISP_MIN_WIDTH,
817 RKISP1_ISP_MAX_WIDTH);
818 sink_fmt->height = clamp_t(u32, format->height,
819 RKISP1_ISP_MIN_HEIGHT,
820 RKISP1_ISP_MAX_HEIGHT);
824 /* Propagate to in crop */
825 sink_crop = rkisp1_isp_get_pad_crop(isp, sd_state,
826 RKISP1_ISP_PAD_SINK_VIDEO,
828 rkisp1_isp_set_sink_crop(isp, sd_state, sink_crop, which);
831 static int rkisp1_isp_get_fmt(struct v4l2_subdev *sd,
832 struct v4l2_subdev_state *sd_state,
833 struct v4l2_subdev_format *fmt)
835 struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
837 mutex_lock(&isp->ops_lock);
838 fmt->format = *rkisp1_isp_get_pad_fmt(isp, sd_state, fmt->pad,
840 mutex_unlock(&isp->ops_lock);
844 static int rkisp1_isp_set_fmt(struct v4l2_subdev *sd,
845 struct v4l2_subdev_state *sd_state,
846 struct v4l2_subdev_format *fmt)
848 struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
850 mutex_lock(&isp->ops_lock);
851 if (fmt->pad == RKISP1_ISP_PAD_SINK_VIDEO)
852 rkisp1_isp_set_sink_fmt(isp, sd_state, &fmt->format,
854 else if (fmt->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
855 rkisp1_isp_set_src_fmt(isp, sd_state, &fmt->format,
858 fmt->format = *rkisp1_isp_get_pad_fmt(isp, sd_state, fmt->pad,
861 mutex_unlock(&isp->ops_lock);
865 static int rkisp1_isp_get_selection(struct v4l2_subdev *sd,
866 struct v4l2_subdev_state *sd_state,
867 struct v4l2_subdev_selection *sel)
869 struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
872 if (sel->pad != RKISP1_ISP_PAD_SOURCE_VIDEO &&
873 sel->pad != RKISP1_ISP_PAD_SINK_VIDEO)
876 mutex_lock(&isp->ops_lock);
877 switch (sel->target) {
878 case V4L2_SEL_TGT_CROP_BOUNDS:
879 if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO) {
880 struct v4l2_mbus_framefmt *fmt;
882 fmt = rkisp1_isp_get_pad_fmt(isp, sd_state, sel->pad,
884 sel->r.height = fmt->height;
885 sel->r.width = fmt->width;
889 sel->r = *rkisp1_isp_get_pad_crop(isp, sd_state,
890 RKISP1_ISP_PAD_SINK_VIDEO,
894 case V4L2_SEL_TGT_CROP:
895 sel->r = *rkisp1_isp_get_pad_crop(isp, sd_state, sel->pad,
901 mutex_unlock(&isp->ops_lock);
905 static int rkisp1_isp_set_selection(struct v4l2_subdev *sd,
906 struct v4l2_subdev_state *sd_state,
907 struct v4l2_subdev_selection *sel)
909 struct rkisp1_device *rkisp1 =
910 container_of(sd->v4l2_dev, struct rkisp1_device, v4l2_dev);
911 struct rkisp1_isp *isp = container_of(sd, struct rkisp1_isp, sd);
914 if (sel->target != V4L2_SEL_TGT_CROP)
917 dev_dbg(rkisp1->dev, "%s: pad: %d sel(%d,%d)/%dx%d\n", __func__,
918 sel->pad, sel->r.left, sel->r.top, sel->r.width, sel->r.height);
919 mutex_lock(&isp->ops_lock);
920 if (sel->pad == RKISP1_ISP_PAD_SINK_VIDEO)
921 rkisp1_isp_set_sink_crop(isp, sd_state, &sel->r, sel->which);
922 else if (sel->pad == RKISP1_ISP_PAD_SOURCE_VIDEO)
923 rkisp1_isp_set_src_crop(isp, sd_state, &sel->r, sel->which);
927 mutex_unlock(&isp->ops_lock);
931 static int rkisp1_subdev_link_validate(struct media_link *link)
933 if (link->sink->index == RKISP1_ISP_PAD_SINK_PARAMS)
936 return v4l2_subdev_link_validate(link);
939 static const struct v4l2_subdev_pad_ops rkisp1_isp_pad_ops = {
940 .enum_mbus_code = rkisp1_isp_enum_mbus_code,
941 .enum_frame_size = rkisp1_isp_enum_frame_size,
942 .get_selection = rkisp1_isp_get_selection,
943 .set_selection = rkisp1_isp_set_selection,
944 .init_cfg = rkisp1_isp_init_config,
945 .get_fmt = rkisp1_isp_get_fmt,
946 .set_fmt = rkisp1_isp_set_fmt,
947 .link_validate = v4l2_subdev_link_validate_default,
950 /* ----------------------------------------------------------------------------
954 static int rkisp1_mipi_csi2_start(struct rkisp1_isp *isp,
955 struct rkisp1_sensor_async *sensor)
957 struct rkisp1_device *rkisp1 =
958 container_of(isp->sd.v4l2_dev, struct rkisp1_device, v4l2_dev);
959 union phy_configure_opts opts;
960 struct phy_configure_opts_mipi_dphy *cfg = &opts.mipi_dphy;
963 if (!sensor->pixel_rate_ctrl) {
964 dev_warn(rkisp1->dev, "No pixel rate control in sensor subdev\n");
968 pixel_clock = v4l2_ctrl_g_ctrl_int64(sensor->pixel_rate_ctrl);
970 dev_err(rkisp1->dev, "Invalid pixel rate value\n");
974 phy_mipi_dphy_get_default_config(pixel_clock, isp->sink_fmt->bus_width,
976 phy_set_mode(sensor->dphy, PHY_MODE_MIPI_DPHY);
977 phy_configure(sensor->dphy, &opts);
978 phy_power_on(sensor->dphy);
983 static void rkisp1_mipi_csi2_stop(struct rkisp1_sensor_async *sensor)
985 phy_power_off(sensor->dphy);
988 static int rkisp1_isp_s_stream(struct v4l2_subdev *sd, int enable)
990 struct rkisp1_device *rkisp1 =
991 container_of(sd->v4l2_dev, struct rkisp1_device, v4l2_dev);
992 struct rkisp1_isp *isp = &rkisp1->isp;
993 struct v4l2_subdev *sensor_sd;
997 rkisp1_isp_stop(rkisp1);
998 rkisp1_mipi_csi2_stop(rkisp1->active_sensor);
1002 sensor_sd = rkisp1_get_remote_sensor(sd);
1004 dev_warn(rkisp1->dev, "No link between isp and sensor\n");
1008 rkisp1->active_sensor = container_of(sensor_sd->asd,
1009 struct rkisp1_sensor_async, asd);
1011 if (rkisp1->active_sensor->mbus_type != V4L2_MBUS_CSI2_DPHY)
1014 rkisp1->isp.frame_sequence = -1;
1015 mutex_lock(&isp->ops_lock);
1016 ret = rkisp1_config_cif(rkisp1);
1020 ret = rkisp1_mipi_csi2_start(&rkisp1->isp, rkisp1->active_sensor);
1024 rkisp1_isp_start(rkisp1);
1027 mutex_unlock(&isp->ops_lock);
1031 static int rkisp1_isp_subs_evt(struct v4l2_subdev *sd, struct v4l2_fh *fh,
1032 struct v4l2_event_subscription *sub)
1034 if (sub->type != V4L2_EVENT_FRAME_SYNC)
1037 /* V4L2_EVENT_FRAME_SYNC doesn't require an id, so zero should be set */
1041 return v4l2_event_subscribe(fh, sub, 0, NULL);
1044 static const struct media_entity_operations rkisp1_isp_media_ops = {
1045 .link_validate = rkisp1_subdev_link_validate,
1048 static const struct v4l2_subdev_video_ops rkisp1_isp_video_ops = {
1049 .s_stream = rkisp1_isp_s_stream,
1052 static const struct v4l2_subdev_core_ops rkisp1_isp_core_ops = {
1053 .subscribe_event = rkisp1_isp_subs_evt,
1054 .unsubscribe_event = v4l2_event_subdev_unsubscribe,
1057 static const struct v4l2_subdev_ops rkisp1_isp_ops = {
1058 .core = &rkisp1_isp_core_ops,
1059 .video = &rkisp1_isp_video_ops,
1060 .pad = &rkisp1_isp_pad_ops,
1063 int rkisp1_isp_register(struct rkisp1_device *rkisp1)
1065 struct v4l2_subdev_state state = {
1066 .pads = rkisp1->isp.pad_cfg
1068 struct v4l2_subdev_state state = {
1071 struct v4l2_subdev_state state = {
1074 struct rkisp1_isp *isp = &rkisp1->isp;
1075 struct media_pad *pads = isp->pads;
1076 struct v4l2_subdev *sd = &isp->sd;
1079 v4l2_subdev_init(sd, &rkisp1_isp_ops);
1080 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
1081 sd->entity.ops = &rkisp1_isp_media_ops;
1082 sd->entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER;
1083 sd->owner = THIS_MODULE;
1084 strscpy(sd->name, RKISP1_ISP_DEV_NAME, sizeof(sd->name));
1086 pads[RKISP1_ISP_PAD_SINK_VIDEO].flags = MEDIA_PAD_FL_SINK |
1087 MEDIA_PAD_FL_MUST_CONNECT;
1088 pads[RKISP1_ISP_PAD_SINK_PARAMS].flags = MEDIA_PAD_FL_SINK;
1089 pads[RKISP1_ISP_PAD_SOURCE_VIDEO].flags = MEDIA_PAD_FL_SOURCE;
1090 pads[RKISP1_ISP_PAD_SOURCE_STATS].flags = MEDIA_PAD_FL_SOURCE;
1092 isp->sink_fmt = rkisp1_isp_mbus_info_get(RKISP1_DEF_SINK_PAD_FMT);
1093 isp->src_fmt = rkisp1_isp_mbus_info_get(RKISP1_DEF_SRC_PAD_FMT);
1095 mutex_init(&isp->ops_lock);
1096 ret = media_entity_pads_init(&sd->entity, RKISP1_ISP_PAD_MAX, pads);
1100 ret = v4l2_device_register_subdev(&rkisp1->v4l2_dev, sd);
1102 dev_err(rkisp1->dev, "Failed to register isp subdev\n");
1103 goto err_cleanup_media_entity;
1106 rkisp1_isp_init_config(sd, &state);
1109 err_cleanup_media_entity:
1110 media_entity_cleanup(&sd->entity);
1115 void rkisp1_isp_unregister(struct rkisp1_device *rkisp1)
1117 struct v4l2_subdev *sd = &rkisp1->isp.sd;
1119 v4l2_device_unregister_subdev(sd);
1120 media_entity_cleanup(&sd->entity);
1123 /* ----------------------------------------------------------------------------
1124 * Interrupt handlers
1127 void rkisp1_mipi_isr(struct rkisp1_device *rkisp1)
1131 status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS);
1135 rkisp1_write(rkisp1, status, RKISP1_CIF_MIPI_ICR);
1138 * Disable DPHY errctrl interrupt, because this dphy
1139 * erctrl signal is asserted until the next changes
1140 * of line state. This time is may be too long and cpu
1141 * is hold in this interrupt.
1143 if (status & RKISP1_CIF_MIPI_ERR_CTRL(0x0f)) {
1144 val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC);
1145 rkisp1_write(rkisp1, val & ~RKISP1_CIF_MIPI_ERR_CTRL(0x0f),
1146 RKISP1_CIF_MIPI_IMSC);
1147 rkisp1->isp.is_dphy_errctrl_disabled = true;
1151 * Enable DPHY errctrl interrupt again, if mipi have receive
1152 * the whole frame without any error.
1154 if (status == RKISP1_CIF_MIPI_FRAME_END) {
1156 * Enable DPHY errctrl interrupt again, if mipi have receive
1157 * the whole frame without any error.
1159 if (rkisp1->isp.is_dphy_errctrl_disabled) {
1160 val = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_IMSC);
1161 val |= RKISP1_CIF_MIPI_ERR_CTRL(0x0f);
1162 rkisp1_write(rkisp1, val, RKISP1_CIF_MIPI_IMSC);
1163 rkisp1->isp.is_dphy_errctrl_disabled = false;
1166 rkisp1->debug.mipi_error++;
1170 static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp)
1172 struct v4l2_event event = {
1173 .type = V4L2_EVENT_FRAME_SYNC,
1175 event.u.frame_sync.frame_sequence = isp->frame_sequence;
1177 v4l2_event_queue(isp->sd.devnode, &event);
1180 void rkisp1_isp_isr(struct rkisp1_device *rkisp1)
1182 u32 status, isp_err;
1184 status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS);
1188 rkisp1_write(rkisp1, status, RKISP1_CIF_ISP_ICR);
1190 /* Vertical sync signal, starting generating new frame */
1191 if (status & RKISP1_CIF_ISP_V_START) {
1192 rkisp1->isp.frame_sequence++;
1193 rkisp1_isp_queue_event_sof(&rkisp1->isp);
1194 if (status & RKISP1_CIF_ISP_FRAME) {
1195 WARN_ONCE(1, "irq delay is too long, buffers might not be in sync\n");
1196 rkisp1->debug.irq_delay++;
1199 if (status & RKISP1_CIF_ISP_PIC_SIZE_ERROR) {
1200 /* Clear pic_size_error */
1201 isp_err = rkisp1_read(rkisp1, RKISP1_CIF_ISP_ERR);
1202 if (isp_err & RKISP1_CIF_ISP_ERR_INFORM_SIZE)
1203 rkisp1->debug.inform_size_error++;
1204 if (isp_err & RKISP1_CIF_ISP_ERR_IS_SIZE)
1205 rkisp1->debug.img_stabilization_size_error++;
1206 if (isp_err & RKISP1_CIF_ISP_ERR_OUTFORM_SIZE)
1207 rkisp1->debug.outform_size_error++;
1208 rkisp1_write(rkisp1, isp_err, RKISP1_CIF_ISP_ERR_CLR);
1209 } else if (status & RKISP1_CIF_ISP_DATA_LOSS) {
1210 /* keep track of data_loss in debugfs */
1211 rkisp1->debug.data_loss++;
1214 if (status & RKISP1_CIF_ISP_FRAME) {
1217 /* New frame from the sensor received */
1218 isp_ris = rkisp1_read(rkisp1, RKISP1_CIF_ISP_RIS);
1219 if (isp_ris & RKISP1_STATS_MEAS_MASK)
1220 rkisp1_stats_isr(&rkisp1->stats, isp_ris);
1222 * Then update changed configs. Some of them involve
1223 * lot of register writes. Do those only one per frame.
1224 * Do the updates in the order of the processing flow.
1226 rkisp1_params_isr(rkisp1);