1
2
3
4
5
6
7
8
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57static 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
179
180
181const 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
195static 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
209static struct v4l2_mbus_framefmt *
210rkisp1_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
220static struct v4l2_rect *
221rkisp1_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
233
234
235
236
237
238
239
240static 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
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
266
267static 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
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
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
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
369static 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
395static 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
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
418 rkisp1_write(rkisp1, ~0, RKISP1_CIF_MIPI_ICR);
419
420
421
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
443static 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
464static 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
483static void rkisp1_isp_stop(struct rkisp1_device *rkisp1)
484{
485 u32 val;
486
487
488
489
490
491
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
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
521static 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
532static 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
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
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
554
555
556 usleep_range(1000, 1200);
557}
558
559
560
561
562
563static 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
603static 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
645static 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
672
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
686static 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
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
715static 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
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
741static 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
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
776static 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
788static 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
807static 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
847static 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
873static 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
881static 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
893
894
895static 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
924static void rkisp1_mipi_csi2_stop(struct rkisp1_sensor_async *sensor)
925{
926 phy_power_off(sensor->dphy);
927}
928
929static 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
967mutex_unlock:
968 mutex_unlock(&isp->ops_lock);
969 return ret;
970}
971
972static 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
979 if (sub->id != 0)
980 return -EINVAL;
981
982 return v4l2_event_subscribe(fh, sub, 0, NULL);
983}
984
985static const struct media_entity_operations rkisp1_isp_media_ops = {
986 .link_validate = rkisp1_subdev_link_validate,
987};
988
989static const struct v4l2_subdev_video_ops rkisp1_isp_video_ops = {
990 .s_stream = rkisp1_isp_s_stream,
991};
992
993static 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
998static 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
1004int 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
1041err_cleanup_media_entity:
1042 media_entity_cleanup(&sd->entity);
1043
1044 return ret;
1045}
1046
1047void 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
1057
1058
1059void 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
1071
1072
1073
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
1084
1085
1086 if (status == RKISP1_CIF_MIPI_FRAME_END) {
1087
1088
1089
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
1102static 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
1112void 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
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
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
1143 rkisp1->debug.data_loss++;
1144 }
1145
1146 if (status & RKISP1_CIF_ISP_FRAME) {
1147 u32 isp_ris;
1148
1149
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
1155
1156
1157
1158 rkisp1_params_isr(rkisp1);
1159 }
1160
1161}
1162