hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/media/platform/rockchip/cif/subdev-itf.c
....@@ -283,14 +283,14 @@
283283 struct rkcif_device *cif_dev = priv->cif_dev;
284284
285285 if (priv->hdr_cfg.hdr_mode == HDR_X2) {
286
- rkcif_free_rx_buf(&cif_dev->stream[0], priv->buf_num);
287
- rkcif_free_rx_buf(&cif_dev->stream[1], priv->buf_num);
286
+ rkcif_free_rx_buf(&cif_dev->stream[0], cif_dev->stream[0].rx_buf_num);
287
+ rkcif_free_rx_buf(&cif_dev->stream[1], cif_dev->stream[1].rx_buf_num);
288288 } else if (priv->hdr_cfg.hdr_mode == HDR_X3) {
289
- rkcif_free_rx_buf(&cif_dev->stream[0], priv->buf_num);
290
- rkcif_free_rx_buf(&cif_dev->stream[1], priv->buf_num);
291
- rkcif_free_rx_buf(&cif_dev->stream[2], priv->buf_num);
289
+ rkcif_free_rx_buf(&cif_dev->stream[0], cif_dev->stream[0].rx_buf_num);
290
+ rkcif_free_rx_buf(&cif_dev->stream[1], cif_dev->stream[1].rx_buf_num);
291
+ rkcif_free_rx_buf(&cif_dev->stream[2], cif_dev->stream[2].rx_buf_num);
292292 } else {
293
- rkcif_free_rx_buf(&cif_dev->stream[0], priv->buf_num);
293
+ rkcif_free_rx_buf(&cif_dev->stream[0], cif_dev->stream[0].rx_buf_num);
294294 }
295295 if (cif_dev->is_thunderboot) {
296296 cif_dev->wait_line_cache = 0;
....@@ -327,6 +327,7 @@
327327 __func__, mode->rdbk_mode, mode->name, priv->toisp_inf.link_mode);
328328 }
329329
330
+static void sditf_channel_disable(struct sditf_priv *priv, int user);
330331 static long sditf_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
331332 {
332333 struct sditf_priv *priv = to_sditf_priv(sd);
....@@ -336,13 +337,19 @@
336337 struct v4l2_subdev *sensor_sd;
337338 int *pbuf_num = NULL;
338339 int ret = 0;
340
+ int *on = NULL;
339341
340342 switch (cmd) {
341343 case RKISP_VICAP_CMD_MODE:
342344 mode = (struct rkisp_vicap_mode *)arg;
345
+ mutex_lock(&cif_dev->stream_lock);
343346 memcpy(&priv->mode, mode, sizeof(*mode));
347
+ mutex_unlock(&cif_dev->stream_lock);
344348 sditf_reinit_mode(priv, &priv->mode);
345
- mode->input.merge_num = cif_dev->sditf_cnt;
349
+ if (priv->is_combine_mode)
350
+ mode->input.merge_num = cif_dev->sditf_cnt;
351
+ else
352
+ mode->input.merge_num = 1;
346353 mode->input.index = priv->combine_index;
347354 return 0;
348355 case RKISP_VICAP_CMD_INIT_BUF:
....@@ -358,6 +365,28 @@
358365 if (cif_dev->terminal_sensor.sd) {
359366 sensor_sd = cif_dev->terminal_sensor.sd;
360367 return v4l2_subdev_call(sensor_sd, core, ioctl, cmd, arg);
368
+ }
369
+ break;
370
+ case RKISP_VICAP_CMD_QUICK_STREAM:
371
+ on = (int *)arg;
372
+ if (*on) {
373
+ rkcif_stream_resume(cif_dev, RKCIF_RESUME_ISP);
374
+ } else {
375
+ if (priv->toisp_inf.link_mode == TOISP0) {
376
+ sditf_channel_disable(priv, 0);
377
+ } else if (priv->toisp_inf.link_mode == TOISP1) {
378
+ sditf_channel_disable(priv, 1);
379
+ } else if (priv->toisp_inf.link_mode == TOISP_UNITE) {
380
+ sditf_channel_disable(priv, 0);
381
+ sditf_channel_disable(priv, 1);
382
+ }
383
+ rkcif_stream_suspend(cif_dev, RKCIF_RESUME_ISP);
384
+ }
385
+ break;
386
+ case RKISP_VICAP_CMD_SET_RESET:
387
+ if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE) {
388
+ cif_dev->is_toisp_reset = true;
389
+ return 0;
361390 }
362391 break;
363392 default:
....@@ -379,6 +408,7 @@
379408 struct rkmodule_hdr_cfg *hdr_cfg;
380409 int buf_num;
381410 int ret = 0;
411
+ int on;
382412
383413 switch (cmd) {
384414 case RKISP_VICAP_CMD_MODE:
....@@ -411,6 +441,14 @@
411441 }
412442 ret = sditf_ioctl(sd, cmd, hdr_cfg);
413443 return ret;
444
+ case RKISP_VICAP_CMD_QUICK_STREAM:
445
+ if (copy_from_user(&on, up, sizeof(int)))
446
+ return -EFAULT;
447
+ ret = sditf_ioctl(sd, cmd, &on);
448
+ return ret;
449
+ case RKISP_VICAP_CMD_SET_RESET:
450
+ ret = sditf_ioctl(sd, cmd, NULL);
451
+ return ret;
414452 default:
415453 break;
416454 }
....@@ -430,6 +468,7 @@
430468 static int sditf_channel_enable(struct sditf_priv *priv, int user)
431469 {
432470 struct rkcif_device *cif_dev = priv->cif_dev;
471
+ struct rkmodule_capture_info *capture_info = &cif_dev->channels[0].capture_info;
433472 unsigned int ch0 = 0, ch1 = 0, ch2 = 0;
434473 unsigned int ctrl_val = 0;
435474 unsigned int int_en = 0;
....@@ -437,18 +476,32 @@
437476 unsigned int offset_y = 0;
438477 unsigned int width = priv->cap_info.width;
439478 unsigned int height = priv->cap_info.height;
479
+ int csi_idx = cif_dev->csi_host_idx;
480
+
481
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE &&
482
+ priv->toisp_inf.link_mode == TOISP_UNITE) {
483
+ if (capture_info->multi_dev.dev_num != 2 ||
484
+ capture_info->multi_dev.pixel_offset != RKMOUDLE_UNITE_EXTEND_PIXEL) {
485
+ v4l2_err(&cif_dev->v4l2_dev,
486
+ "param error of online mode, combine dev num %d, offset %d\n",
487
+ capture_info->multi_dev.dev_num,
488
+ capture_info->multi_dev.pixel_offset);
489
+ return -EINVAL;
490
+ }
491
+ csi_idx = capture_info->multi_dev.dev_idx[user];
492
+ }
440493
441494 if (priv->hdr_cfg.hdr_mode == NO_HDR ||
442495 priv->hdr_cfg.hdr_mode == HDR_COMPR) {
443496 if (cif_dev->inf_id == RKCIF_MIPI_LVDS)
444
- ch0 = cif_dev->csi_host_idx * 4;
497
+ ch0 = csi_idx * 4;
445498 else
446499 ch0 = 24;//dvp
447500 ctrl_val = (ch0 << 3) | 0x1;
448501 if (user == 0)
449
- int_en = CIF_TOISP0_FS(0);
502
+ int_en = CIF_TOISP0_FS(0) | CIF_TOISP0_FE(0);
450503 else
451
- int_en = CIF_TOISP1_FS(0);
504
+ int_en = CIF_TOISP1_FS(0) | CIF_TOISP1_FE(0);
452505 priv->toisp_inf.ch_info[0].is_valid = true;
453506 priv->toisp_inf.ch_info[0].id = ch0;
454507 } else if (priv->hdr_cfg.hdr_mode == HDR_X2) {
....@@ -457,9 +510,11 @@
457510 ctrl_val = (ch0 << 3) | 0x1;
458511 ctrl_val |= (ch1 << 11) | 0x100;
459512 if (user == 0)
460
- int_en = CIF_TOISP0_FS(0) | CIF_TOISP0_FS(1);
513
+ int_en = CIF_TOISP0_FS(0) | CIF_TOISP0_FS(1) |
514
+ CIF_TOISP0_FE(0) | CIF_TOISP0_FE(1);
461515 else
462
- int_en = CIF_TOISP1_FS(0) | CIF_TOISP1_FS(1);
516
+ int_en = CIF_TOISP1_FS(0) | CIF_TOISP1_FS(1) |
517
+ CIF_TOISP1_FE(0) | CIF_TOISP1_FE(1);
463518 priv->toisp_inf.ch_info[0].is_valid = true;
464519 priv->toisp_inf.ch_info[0].id = ch0;
465520 priv->toisp_inf.ch_info[1].is_valid = true;
....@@ -472,9 +527,11 @@
472527 ctrl_val |= (ch1 << 11) | 0x100;
473528 ctrl_val |= (ch2 << 19) | 0x10000;
474529 if (user == 0)
475
- int_en = CIF_TOISP0_FS(0) | CIF_TOISP0_FS(1) | CIF_TOISP0_FS(2);
530
+ int_en = CIF_TOISP0_FS(0) | CIF_TOISP0_FS(1) | CIF_TOISP0_FS(2) |
531
+ CIF_TOISP0_FE(0) | CIF_TOISP0_FE(1) | CIF_TOISP0_FE(2);
476532 else
477
- int_en = CIF_TOISP1_FS(0) | CIF_TOISP1_FS(1) | CIF_TOISP1_FS(2);
533
+ int_en = CIF_TOISP1_FS(0) | CIF_TOISP1_FS(1) | CIF_TOISP1_FS(2) |
534
+ CIF_TOISP1_FE(0) | CIF_TOISP1_FE(1) | CIF_TOISP1_FE(2);
478535 priv->toisp_inf.ch_info[0].is_valid = true;
479536 priv->toisp_inf.ch_info[0].id = ch0;
480537 priv->toisp_inf.ch_info[1].is_valid = true;
....@@ -496,7 +553,10 @@
496553 }
497554 } else {
498555 if (priv->toisp_inf.link_mode == TOISP_UNITE) {
499
- offset_x = priv->cap_info.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL;
556
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE)
557
+ offset_x = 0;
558
+ else
559
+ offset_x = priv->cap_info.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL;
500560 width = priv->cap_info.width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
501561 }
502562 rkcif_write_register(cif_dev, CIF_REG_TOISP1_CTRL, ctrl_val);
....@@ -566,22 +626,41 @@
566626 sditf_channel_enable(priv, 0);
567627 sditf_channel_enable(priv, 1);
568628 }
569
- if (priv->hdr_cfg.hdr_mode == NO_HDR) {
570
- rkcif_free_rx_buf(&cif_dev->stream[0], priv->buf_num);
571
- cif_dev->stream[0].is_line_wake_up = false;
572
- } else if (priv->hdr_cfg.hdr_mode == HDR_X2) {
573
- rkcif_free_rx_buf(&cif_dev->stream[1], priv->buf_num);
574
- cif_dev->stream[0].is_line_wake_up = false;
575
- cif_dev->stream[1].is_line_wake_up = false;
576
- } else if (priv->hdr_cfg.hdr_mode == HDR_X3) {
577
- rkcif_free_rx_buf(&cif_dev->stream[2], priv->buf_num);
578
- cif_dev->stream[0].is_line_wake_up = false;
579
- cif_dev->stream[1].is_line_wake_up = false;
580
- cif_dev->stream[2].is_line_wake_up = false;
629
+
630
+ if (cif_dev->is_thunderboot) {
631
+ if (priv->hdr_cfg.hdr_mode == NO_HDR) {
632
+ rkcif_free_rx_buf(&cif_dev->stream[0], cif_dev->stream[0].rx_buf_num);
633
+ cif_dev->stream[0].is_line_wake_up = false;
634
+ } else if (priv->hdr_cfg.hdr_mode == HDR_X2) {
635
+ rkcif_free_rx_buf(&cif_dev->stream[1], cif_dev->stream[1].rx_buf_num);
636
+ cif_dev->stream[0].is_line_wake_up = false;
637
+ cif_dev->stream[1].is_line_wake_up = false;
638
+ } else if (priv->hdr_cfg.hdr_mode == HDR_X3) {
639
+ rkcif_free_rx_buf(&cif_dev->stream[2], cif_dev->stream[2].rx_buf_num);
640
+ cif_dev->stream[0].is_line_wake_up = false;
641
+ cif_dev->stream[1].is_line_wake_up = false;
642
+ cif_dev->stream[2].is_line_wake_up = false;
643
+ }
644
+ cif_dev->wait_line_cache = 0;
645
+ cif_dev->wait_line = 0;
646
+ cif_dev->wait_line_bak = 0;
647
+ cif_dev->is_thunderboot = false;
581648 }
582
- cif_dev->wait_line_cache = 0;
583
- cif_dev->wait_line = 0;
584
- cif_dev->wait_line_bak = 0;
649
+}
650
+
651
+void sditf_disable_immediately(struct sditf_priv *priv)
652
+{
653
+ struct rkcif_device *cif_dev = priv->cif_dev;
654
+ u32 ctrl_val = 0x10101;
655
+
656
+ if (priv->toisp_inf.link_mode == TOISP0) {
657
+ rkcif_write_register_and(cif_dev, CIF_REG_TOISP0_CTRL, ~ctrl_val);
658
+ } else if (priv->toisp_inf.link_mode == TOISP1) {
659
+ rkcif_write_register_and(cif_dev, CIF_REG_TOISP1_CTRL, ~ctrl_val);
660
+ } else if (priv->toisp_inf.link_mode == TOISP_UNITE) {
661
+ rkcif_write_register_and(cif_dev, CIF_REG_TOISP0_CTRL, ~ctrl_val);
662
+ rkcif_write_register_and(cif_dev, CIF_REG_TOISP1_CTRL, ~ctrl_val);
663
+ }
585664 }
586665
587666 static void sditf_check_capture_mode(struct rkcif_device *cif_dev)
....@@ -694,9 +773,12 @@
694773 } else {
695774 ret = sditf_stop_stream(priv);
696775 sditf_free_buf(priv);
776
+ priv->mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ;
697777 }
698778
699779 }
780
+ if (on && ret)
781
+ atomic_dec(&priv->stream_cnt);
700782 return ret;
701783 }
702784
....@@ -724,6 +806,7 @@
724806 } else {
725807 v4l2_pipeline_pm_put(&node->vdev.entity);
726808 pm_runtime_put_sync(cif_dev->dev);
809
+ priv->mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ;
727810 }
728811 v4l2_info(&node->vdev, "s_power %d, entity use_count %d\n",
729812 on, node->vdev.entity.use_count);
....@@ -779,25 +862,37 @@
779862 return -EINVAL;
780863
781864 rx_buf = to_cif_rx_buf(dbufs);
782
-
865
+ v4l2_dbg(3, rkcif_debug, &cif_dev->v4l2_dev, "buf back to vicap 0x%x\n",
866
+ (u32)rx_buf->dummy.dma_addr);
783867 spin_lock_irqsave(&stream->vbq_lock, flags);
784
- stream->buf_num_toisp++;
785868 stream->last_rx_buf_idx = dbufs->sequence + 1;
869
+ atomic_inc(&stream->buf_cnt);
786870
787871 if (!list_empty(&stream->rx_buf_head) &&
788872 cif_dev->is_thunderboot &&
873
+ (!cif_dev->is_rtt_suspend) &&
789874 (dbufs->type == BUF_SHORT ||
790875 (dbufs->type != BUF_SHORT && (!dbufs->is_switch)))) {
791876 spin_lock_irqsave(&cif_dev->buffree_lock, buffree_flags);
792877 list_add_tail(&rx_buf->list_free, &priv->buf_free_list);
793878 spin_unlock_irqrestore(&cif_dev->buffree_lock, buffree_flags);
879
+ atomic_dec(&stream->buf_cnt);
880
+ stream->total_buf_num--;
794881 schedule_work(&priv->buffree_work.work);
795882 is_free = true;
796883 }
797884
798885 if (!is_free && (!dbufs->is_switch)) {
799886 list_add_tail(&rx_buf->list, &stream->rx_buf_head);
800
- rkcif_assign_check_buffer_update_toisp(stream);
887
+ if (cif_dev->resume_mode != RKISP_RTT_MODE_ONE_FRAME) {
888
+ rkcif_assign_check_buffer_update_toisp(stream);
889
+ if (!stream->dma_en) {
890
+ stream->to_en_dma = RKCIF_DMAEN_BY_ISP;
891
+ rkcif_enable_dma_capture(stream, true);
892
+ cif_dev->sensor_work.on = 1;
893
+ schedule_work(&cif_dev->sensor_work.work);
894
+ }
895
+ }
801896 if (cif_dev->rdbk_debug) {
802897 u32 offset = 0;
803898
....@@ -825,6 +920,10 @@
825920 }
826921 spin_unlock_irqrestore(&stream->vbq_lock, flags);
827922
923
+ if (!cif_dev->is_thunderboot ||
924
+ cif_dev->is_rdbk_to_online == false)
925
+ return 0;
926
+
828927 if (dbufs->runtime_us && cif_dev->early_line == 0) {
829928 if (!cif_dev->sensor_linetime)
830929 cif_dev->sensor_linetime = rkcif_get_linetime(stream);