hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/media/platform/rockchip/cif/capture.c
....@@ -553,18 +553,21 @@
553553 case MEDIA_BUS_FMT_SGBRG8_1X8:
554554 case MEDIA_BUS_FMT_SGRBG8_1X8:
555555 case MEDIA_BUS_FMT_SRGGB8_1X8:
556
+ case MEDIA_BUS_FMT_Y8_1X8:
556557 return 0x2a;
557558 /* csi raw10 */
558559 case MEDIA_BUS_FMT_SBGGR10_1X10:
559560 case MEDIA_BUS_FMT_SGBRG10_1X10:
560561 case MEDIA_BUS_FMT_SGRBG10_1X10:
561562 case MEDIA_BUS_FMT_SRGGB10_1X10:
563
+ case MEDIA_BUS_FMT_Y10_1X10:
562564 return 0x2b;
563565 /* csi raw12 */
564566 case MEDIA_BUS_FMT_SBGGR12_1X12:
565567 case MEDIA_BUS_FMT_SGBRG12_1X12:
566568 case MEDIA_BUS_FMT_SGRBG12_1X12:
567569 case MEDIA_BUS_FMT_SRGGB12_1X12:
570
+ case MEDIA_BUS_FMT_Y12_1X12:
568571 return 0x2c;
569572 /* csi uyvy 422 */
570573 case MEDIA_BUS_FMT_UYVY8_2X8:
....@@ -2425,7 +2428,7 @@
24252428 int i;
24262429 unsigned long flags;
24272430
2428
- mutex_lock(&dev->stream_lock);
2431
+ mutex_lock(&dev->hw_dev->dev_lock);
24292432
24302433 v4l2_info(&dev->v4l2_dev, "stream[%d] start stopping\n", stream->id);
24312434
....@@ -2499,20 +2502,18 @@
24992502 if (dev->can_be_reset && can_reset) {
25002503 rkcif_do_cru_reset(dev);
25012504 dev->can_be_reset = false;
2502
- dev->reset_work_cancel = true;
2505
+ hw_dev->reset_work_cancel = true;
25032506 hw_dev->hw_timer.is_running = false;
25042507 hw_dev->reset_info.is_need_reset = 0;
25052508 }
25062509 spin_unlock_irqrestore(&hw_dev->hw_timer.timer_lock, flags);
2507
-
2508
- pm_runtime_put_sync(dev->dev);
25092510
25102511 if (!atomic_read(&dev->pipe.stream_cnt) && dev->dummy_buf.vaddr)
25112512 rkcif_destroy_dummy_buf(stream);
25122513
25132514 v4l2_info(&dev->v4l2_dev, "stream[%d] stopping finished\n", stream->id);
25142515
2515
- mutex_unlock(&dev->stream_lock);
2516
+ mutex_unlock(&dev->hw_dev->dev_lock);
25162517 }
25172518
25182519 /*
....@@ -3081,7 +3082,7 @@
30813082
30823083 v4l2_info(&dev->v4l2_dev, "stream[%d] start streaming\n", stream->id);
30833084
3084
- mutex_lock(&dev->stream_lock);
3085
+ mutex_lock(&dev->hw_dev->dev_lock);
30853086
30863087 if (WARN_ON(stream->state != RKCIF_STATE_READY)) {
30873088 ret = -EBUSY;
....@@ -3141,14 +3142,6 @@
31413142 v4l2_err(v4l2_dev, "Failed to create dummy_buf, %d\n", ret);
31423143 goto destroy_buf;
31433144 }
3144
- }
3145
-
3146
- /* enable clocks/power-domains */
3147
- ret = pm_runtime_get_sync(dev->dev);
3148
- if (ret < 0) {
3149
- v4l2_err(v4l2_dev, "Failed to get runtime pm, %d\n",
3150
- ret);
3151
- goto destroy_buf;
31523145 }
31533146
31543147 ret = dev->pipe.open(&dev->pipe, &node->vdev.entity, true);
....@@ -3218,7 +3211,8 @@
32183211 }
32193212 }
32203213
3221
- dev->reset_work_cancel = false;
3214
+ if (dev->hw_dev->reset_work_cancel)
3215
+ dev->hw_dev->reset_work_cancel = false;
32223216 if (dev->hdr.mode == NO_HDR)
32233217 stream->streamon_timestamp = ktime_get_ns();
32243218 goto out;
....@@ -3246,7 +3240,7 @@
32463240 }
32473241
32483242 out:
3249
- mutex_unlock(&dev->stream_lock);
3243
+ mutex_unlock(&dev->hw_dev->dev_lock);
32503244 return ret;
32513245 }
32523246
....@@ -3524,6 +3518,13 @@
35243518 return ret;
35253519 }
35263520
3521
+ /* enable clocks/power-domains */
3522
+ ret = pm_runtime_get_sync(cifdev->dev);
3523
+ if (ret < 0) {
3524
+ v4l2_err(vdev, "Failed to get runtime pm, %d\n",
3525
+ ret);
3526
+ return ret;
3527
+ }
35273528 /*
35283529 * Soft reset via CRU.
35293530 * Because CRU would reset iommu too, so there's not chance
....@@ -3574,6 +3575,7 @@
35743575 else if (atomic_read(&cifdev->fh_cnt) < 0)
35753576 atomic_set(&cifdev->fh_cnt, 0);
35763577 mutex_unlock(&cifdev->stream_lock);
3578
+ pm_runtime_put_sync(cifdev->dev);
35773579
35783580 return ret;
35793581 }
....@@ -3584,6 +3586,9 @@
35843586 .unlocked_ioctl = video_ioctl2,
35853587 .poll = vb2_fop_poll,
35863588 .mmap = vb2_fop_mmap,
3589
+#ifdef CONFIG_COMPAT
3590
+ .compat_ioctl32 = video_ioctl2,
3591
+#endif
35873592 };
35883593
35893594 static int rkcif_enum_input(struct file *file, void *priv,
....@@ -3925,6 +3930,7 @@
39253930 int vc = 0;
39263931 struct rkcif_reset_info *reset_info;
39273932 int reset_src = 0;
3933
+ unsigned long flags;
39283934
39293935 switch (cmd) {
39303936 case RKCIF_CMD_GET_CSI_MEMORY_MODE:
....@@ -3967,12 +3973,16 @@
39673973 break;
39683974 case RKCIF_CMD_GET_RESET_INFO:
39693975 reset_info = (struct rkcif_reset_info *)arg;
3976
+ spin_lock_irqsave(&dev->hw_dev->spin_lock, flags);
39703977 *reset_info = dev->hw_dev->reset_info;
3971
- if (dev->hw_dev->reset_info.is_need_reset)
3972
- dev->hw_dev->reset_info.is_need_reset = 0;
3978
+ spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags);
39733979 break;
39743980 case RKCIF_CMD_SET_RESET:
39753981 reset_src = *(int *)arg;
3982
+ spin_lock_irqsave(&dev->hw_dev->spin_lock, flags);
3983
+ if (dev->hw_dev->reset_info.is_need_reset)
3984
+ dev->hw_dev->reset_info.is_need_reset = 0;
3985
+ spin_unlock_irqrestore(&dev->hw_dev->spin_lock, flags);
39763986 return rkcif_do_reset_work(dev, reset_src);
39773987 default:
39783988 return -EINVAL;
....@@ -4789,6 +4799,7 @@
47894799 if (dev->irq_stats.csi_bwidth_lack_cnt) {
47904800 is_triggered = true;
47914801 dev->irq_stats.csi_bwidth_lack_cnt = 0;
4802
+ v4l2_info(&dev->v4l2_dev, "reset for bandwidth lack\n");
47924803 }
47934804 if (dev->irq_stats.csi_overflow_cnt) {
47944805 is_triggered = true;
....@@ -5402,7 +5413,6 @@
54025413
54035414 for (i = 0, j = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
54045415 stream = &cif_dev->stream[i];
5405
- mutex_lock(&cif_dev->stream_lock);
54065416 if (stream->state == RKCIF_STATE_STREAMING) {
54075417 stream_off_cnt++;
54085418
....@@ -5422,9 +5432,7 @@
54225432 stream->frame_idx,
54235433 sof_cnt);
54245434
5425
- resume_info->frm_sync_seq = sof_cnt;
5426
- if (stream->frame_idx != sof_cnt)
5427
- stream->frame_idx = sof_cnt;
5435
+ resume_info->frm_sync_seq = stream->frame_idx;
54285436 }
54295437
54305438 stream->state = RKCIF_STATE_RESET_IN_STREAMING;
....@@ -5438,7 +5446,6 @@
54385446 __func__, stream->id, stream->frame_idx, rkcif_csi2_get_sof());
54395447
54405448 }
5441
- mutex_unlock(&cif_dev->stream_lock);
54425449 }
54435450 if (!stream_off_cnt)
54445451 return 0;
....@@ -5486,7 +5493,6 @@
54865493 stream = resume_stream[i];
54875494 if (stream == NULL || stream->state != RKCIF_STATE_RESET_IN_STREAMING)
54885495 break;
5489
- mutex_lock(&cif_dev->stream_lock);
54905496 stream_on_cnt++;
54915497 stream->fs_cnt_in_single_frame = 0;
54925498 if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
....@@ -5514,7 +5520,6 @@
55145520 }
55155521 atomic_inc(&p->stream_cnt);
55165522 stream->streamon_timestamp = ktime_get_ns();
5517
- mutex_unlock(&cif_dev->stream_lock);
55185523 v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev,
55195524 "resume stream[%d], frm_idx:%d, csi_sof:%d\n",
55205525 stream->id, stream->frame_idx,
....@@ -5552,11 +5557,9 @@
55525557
55535558 v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
55545559
5555
- mutex_unlock(&cif_dev->stream_lock);
55565560 return 0;
55575561
55585562 unlock_stream:
5559
- mutex_unlock(&cif_dev->stream_lock);
55605563 return ret;
55615564 }
55625565
....@@ -5570,8 +5573,13 @@
55705573 int i = 0;
55715574 int ret = 0;
55725575
5573
- v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset\n");
5576
+ v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset\n");
55745577
5578
+ mutex_lock(&cif_dev->hw_dev->dev_lock);
5579
+ if (hw->reset_work_cancel) {
5580
+ mutex_unlock(&hw->dev_lock);
5581
+ return 0;
5582
+ }
55755583 for (i = 0; i < hw->dev_num; i++) {
55765584 cifdev = hw->cif_dev[i];
55775585 resume_info[i] = &cifdev->reset_work.resume_info;
....@@ -5585,13 +5593,7 @@
55855593
55865594 rkcif_do_cru_reset(cif_dev);
55875595
5588
- rkcif_disable_sys_clk(cif_dev->hw_dev);
5589
-
5590
- udelay(5);
5591
-
5592
- ret |= rkcif_enable_sys_clk(cif_dev->hw_dev);
5593
- if (ret < 0)
5594
- v4l2_err(&cif_dev->v4l2_dev, "%s:resume cif clk failed\n", __func__);
5596
+ udelay(30);
55955597
55965598 for (i = 0; i < hw->dev_num; i++) {
55975599 cifdev = hw->cif_dev[i];
....@@ -5607,8 +5609,8 @@
56075609 hw->hw_timer.is_running = false;
56085610 rkcif_monitor_reset_event(cif_dev->hw_dev);
56095611
5610
- v4l2_dbg(1, rkcif_debug, &cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
5611
-
5612
+ v4l2_info(&cif_dev->v4l2_dev, "do rkcif reset successfully!\n");
5613
+ mutex_unlock(&hw->dev_lock);
56125614 return ret;
56135615
56145616 }
....@@ -5710,8 +5712,10 @@
57105712 spin_unlock_irqrestore(&timer->csi2_err_lock, flags);
57115713 }
57125714 if (hw_timer->is_reset_by_user) {
5715
+ spin_lock_irqsave(&hw->spin_lock, flags);
57135716 hw->reset_info.is_need_reset = 1;
57145717 hw->reset_info.reset_src = hw_timer->reset_src;
5718
+ spin_unlock_irqrestore(&hw->spin_lock, flags);
57155719 } else {
57165720 dev->reset_work.reset_src = hw_timer->reset_src;
57175721 if (schedule_work(&dev->reset_work.work)) {
....@@ -5762,8 +5766,10 @@
57625766 hw_timer->reset_src = RKCIF_RESET_SRC_ERR_HOTPLUG;
57635767 v4l2_subdev_call(terminal_sensor->sd, core, ioctl,
57645768 RKMODULE_SET_VICAP_RST_INFO, &rst_info);
5765
- if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS)
5769
+ if (!is_reset && stream->cifdev->inf_id == RKCIF_MIPI_LVDS) {
5770
+ hw_timer->reset_src = RKICF_RESET_SRC_ERR_CUTOFF;
57665771 is_reset = rkcif_is_csi2_err_trigger_reset(timer);
5772
+ }
57675773 } else if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_CONTINUE) {
57685774 if (stream->cifdev->inf_id == RKCIF_MIPI_LVDS)
57695775 is_reset = rkcif_is_csi2_err_trigger_reset(timer);
....@@ -5859,6 +5865,7 @@
58595865 int is_reset = 0;
58605866 int check_cnt = 0;
58615867 bool is_mod_timer = false;
5868
+ struct rkmodule_vicap_reset_info rst_info;
58625869
58635870 for (i = 0; i < hw->dev_num; i++) {
58645871 dev = hw->cif_dev[i];
....@@ -5867,7 +5874,16 @@
58675874 &is_mod_timer);
58685875 if (is_reset)
58695876 break;
5877
+ }
58705878
5879
+ if (hw_timer->monitor_mode == RKCIF_MONITOR_MODE_HOTPLUG && is_reset) {
5880
+ for (i = 0; i < hw->dev_num; i++) {
5881
+ dev = hw->cif_dev[i];
5882
+ rst_info.is_reset = 0;
5883
+ if (dev->terminal_sensor.sd)
5884
+ v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl,
5885
+ RKMODULE_SET_VICAP_RST_INFO, &rst_info);
5886
+ }
58715887 }
58725888
58735889 if (!is_reset && is_mod_timer)
....@@ -6069,6 +6085,7 @@
60696085 }
60706086 }
60716087
6088
+#define CSI_START_INTSTAT(id) (0x3 << ((id) * 2))
60726089 void rkcif_irq_pingpong(struct rkcif_device *cif_dev)
60736090 {
60746091 struct rkcif_stream *stream;
....@@ -6125,27 +6142,6 @@
61256142 __func__);
61266143 }
61276144
6128
- if (intstat & CSI_FRAME0_START_ID0) {
6129
- if (mbus->type == V4L2_MBUS_CSI2)
6130
- rkcif_csi2_event_inc_sof();
6131
- else if (mbus->type == V4L2_MBUS_CCP2)
6132
- rkcif_lvds_event_inc_sof(cif_dev);
6133
- detect_stream->fs_cnt_in_single_frame++;
6134
- spin_lock_irqsave(&detect_stream->fps_lock, flags);
6135
- detect_stream->readout.fs_timestamp = ktime_get_ns();
6136
- spin_unlock_irqrestore(&detect_stream->fps_lock, flags);
6137
- }
6138
-
6139
- if (intstat & CSI_FRAME1_START_ID0) {
6140
- if (mbus->type == V4L2_MBUS_CSI2)
6141
- rkcif_csi2_event_inc_sof();
6142
- else if (mbus->type == V4L2_MBUS_CCP2)
6143
- rkcif_lvds_event_inc_sof(cif_dev);
6144
- detect_stream->fs_cnt_in_single_frame++;
6145
- spin_lock_irqsave(&detect_stream->fps_lock, flags);
6146
- detect_stream->readout.fs_timestamp = ktime_get_ns();
6147
- spin_unlock_irqrestore(&detect_stream->fps_lock, flags);
6148
- }
61496145 for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
61506146 if (intstat & CSI_LINE_INTSTAT(i)) {
61516147 stream = &cif_dev->stream[i];
....@@ -6159,11 +6155,6 @@
61596155 "%s: id0 cur line:%d\n", __func__, lastline & 0x3fff);
61606156 }
61616157 }
6162
-
6163
- /* if do not reach frame dma end, return irq */
6164
- mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev, intstat);
6165
- if (mipi_id < 0)
6166
- return;
61676158
61686159 for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
61696160 mipi_id = rkcif_csi_g_mipi_id(&cif_dev->v4l2_dev,
....@@ -6220,8 +6211,28 @@
62206211 detect_stream->fs_cnt_in_single_frame--;
62216212 }
62226213 }
6214
+ cif_dev->irq_stats.all_frm_end_cnt++;
62236215 }
6224
- cif_dev->irq_stats.all_frm_end_cnt++;
6216
+ for (i = 0; i < RKCIF_MAX_STREAM_MIPI; i++) {
6217
+ if (intstat & CSI_START_INTSTAT(i)) {
6218
+ stream = &cif_dev->stream[i];
6219
+ if (i == 0) {
6220
+ if (mbus->type == V4L2_MBUS_CSI2)
6221
+ rkcif_csi2_event_inc_sof();
6222
+ else if (mbus->type == V4L2_MBUS_CCP2)
6223
+ rkcif_lvds_event_inc_sof(cif_dev);
6224
+ stream->fs_cnt_in_single_frame++;
6225
+ spin_lock_irqsave(&stream->fps_lock, flags);
6226
+ stream->readout.fs_timestamp = ktime_get_ns();
6227
+ spin_unlock_irqrestore(&stream->fps_lock, flags);
6228
+ } else {
6229
+ spin_lock_irqsave(&stream->fps_lock, flags);
6230
+ stream->readout.fs_timestamp = ktime_get_ns();
6231
+ spin_unlock_irqrestore(&stream->fps_lock, flags);
6232
+ }
6233
+ }
6234
+ }
6235
+
62256236 } else {
62266237 u32 lastline, lastpix, ctl;
62276238 u32 cif_frmst, frmid, int_en;