hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/media/platform/rockchip/cif/subdev-itf.c
....@@ -342,7 +342,10 @@
342342 mode = (struct rkisp_vicap_mode *)arg;
343343 memcpy(&priv->mode, mode, sizeof(*mode));
344344 sditf_reinit_mode(priv, &priv->mode);
345
- mode->input.merge_num = cif_dev->sditf_cnt;
345
+ if (priv->is_combine_mode)
346
+ mode->input.merge_num = cif_dev->sditf_cnt;
347
+ else
348
+ mode->input.merge_num = 1;
346349 mode->input.index = priv->combine_index;
347350 return 0;
348351 case RKISP_VICAP_CMD_INIT_BUF:
....@@ -430,6 +433,7 @@
430433 static int sditf_channel_enable(struct sditf_priv *priv, int user)
431434 {
432435 struct rkcif_device *cif_dev = priv->cif_dev;
436
+ struct rkmodule_capture_info *capture_info = &cif_dev->channels[0].capture_info;
433437 unsigned int ch0 = 0, ch1 = 0, ch2 = 0;
434438 unsigned int ctrl_val = 0;
435439 unsigned int int_en = 0;
....@@ -437,11 +441,25 @@
437441 unsigned int offset_y = 0;
438442 unsigned int width = priv->cap_info.width;
439443 unsigned int height = priv->cap_info.height;
444
+ int csi_idx = cif_dev->csi_host_idx;
445
+
446
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE &&
447
+ priv->toisp_inf.link_mode == TOISP_UNITE) {
448
+ if (capture_info->multi_dev.dev_num != 2 ||
449
+ capture_info->multi_dev.pixel_offset != RKMOUDLE_UNITE_EXTEND_PIXEL) {
450
+ v4l2_err(&cif_dev->v4l2_dev,
451
+ "param error of online mode, combine dev num %d, offset %d\n",
452
+ capture_info->multi_dev.dev_num,
453
+ capture_info->multi_dev.pixel_offset);
454
+ return -EINVAL;
455
+ }
456
+ csi_idx = capture_info->multi_dev.dev_idx[user];
457
+ }
440458
441459 if (priv->hdr_cfg.hdr_mode == NO_HDR ||
442460 priv->hdr_cfg.hdr_mode == HDR_COMPR) {
443461 if (cif_dev->inf_id == RKCIF_MIPI_LVDS)
444
- ch0 = cif_dev->csi_host_idx * 4;
462
+ ch0 = csi_idx * 4;
445463 else
446464 ch0 = 24;//dvp
447465 ctrl_val = (ch0 << 3) | 0x1;
....@@ -496,7 +514,10 @@
496514 }
497515 } else {
498516 if (priv->toisp_inf.link_mode == TOISP_UNITE) {
499
- offset_x = priv->cap_info.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL;
517
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE)
518
+ offset_x = 0;
519
+ else
520
+ offset_x = priv->cap_info.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL;
500521 width = priv->cap_info.width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL;
501522 }
502523 rkcif_write_register(cif_dev, CIF_REG_TOISP1_CTRL, ctrl_val);
....@@ -606,36 +627,39 @@
606627 struct rkcif_device *cif_dev = priv->cif_dev;
607628 struct v4l2_subdev_format fmt;
608629 unsigned int mode = RKCIF_STREAM_MODE_TOISP;
630
+ int ret = 0;
609631
610632 sditf_check_capture_mode(cif_dev);
611633 sditf_get_set_fmt(&priv->sd, NULL, &fmt);
612634 if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE) {
613635 if (priv->toisp_inf.link_mode == TOISP0) {
614
- sditf_channel_enable(priv, 0);
636
+ ret = sditf_channel_enable(priv, 0);
615637 } else if (priv->toisp_inf.link_mode == TOISP1) {
616
- sditf_channel_enable(priv, 1);
638
+ ret = sditf_channel_enable(priv, 1);
617639 } else if (priv->toisp_inf.link_mode == TOISP_UNITE) {
618
- sditf_channel_enable(priv, 0);
619
- sditf_channel_enable(priv, 1);
640
+ ret = sditf_channel_enable(priv, 0);
641
+ ret |= sditf_channel_enable(priv, 1);
620642 }
621643 mode = RKCIF_STREAM_MODE_TOISP;
622644 } else if (priv->mode.rdbk_mode == RKISP_VICAP_RDBK_AUTO) {
623645 mode = RKCIF_STREAM_MODE_TOISP_RDBK;
624646 }
647
+ if (ret)
648
+ return ret;
625649
626650 if (priv->hdr_cfg.hdr_mode == NO_HDR ||
627651 priv->hdr_cfg.hdr_mode == HDR_COMPR) {
628
- rkcif_do_start_stream(&cif_dev->stream[0], mode);
652
+ ret = rkcif_do_start_stream(&cif_dev->stream[0], mode);
629653 } else if (priv->hdr_cfg.hdr_mode == HDR_X2) {
630
- rkcif_do_start_stream(&cif_dev->stream[0], mode);
631
- rkcif_do_start_stream(&cif_dev->stream[1], mode);
654
+ ret = rkcif_do_start_stream(&cif_dev->stream[0], mode);
655
+ ret |= rkcif_do_start_stream(&cif_dev->stream[1], mode);
632656 } else if (priv->hdr_cfg.hdr_mode == HDR_X3) {
633
- rkcif_do_start_stream(&cif_dev->stream[0], mode);
634
- rkcif_do_start_stream(&cif_dev->stream[1], mode);
635
- rkcif_do_start_stream(&cif_dev->stream[2], mode);
657
+ ret = rkcif_do_start_stream(&cif_dev->stream[0], mode);
658
+ ret |= rkcif_do_start_stream(&cif_dev->stream[1], mode);
659
+ ret |= rkcif_do_start_stream(&cif_dev->stream[2], mode);
636660 }
637661 INIT_LIST_HEAD(&priv->buf_free_list);
638
- return 0;
662
+ return ret;
639663 }
640664
641665 static int sditf_stop_stream(struct sditf_priv *priv)
....@@ -697,6 +721,8 @@
697721 }
698722
699723 }
724
+ if (on && ret)
725
+ atomic_dec(&priv->stream_cnt);
700726 return ret;
701727 }
702728
....@@ -724,6 +750,7 @@
724750 } else {
725751 v4l2_pipeline_pm_put(&node->vdev.entity);
726752 pm_runtime_put_sync(cif_dev->dev);
753
+ priv->mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ;
727754 }
728755 v4l2_info(&node->vdev, "s_power %d, entity use_count %d\n",
729756 on, node->vdev.entity.use_count);
....@@ -779,10 +806,11 @@
779806 return -EINVAL;
780807
781808 rx_buf = to_cif_rx_buf(dbufs);
782
-
809
+ v4l2_dbg(rkcif_debug, 3, &cif_dev->v4l2_dev, "buf back to vicap 0x%x\n",
810
+ (u32)rx_buf->dummy.dma_addr);
783811 spin_lock_irqsave(&stream->vbq_lock, flags);
784
- stream->buf_num_toisp++;
785812 stream->last_rx_buf_idx = dbufs->sequence + 1;
813
+ atomic_inc(&stream->buf_cnt);
786814
787815 if (!list_empty(&stream->rx_buf_head) &&
788816 cif_dev->is_thunderboot &&
....@@ -791,6 +819,8 @@
791819 spin_lock_irqsave(&cif_dev->buffree_lock, buffree_flags);
792820 list_add_tail(&rx_buf->list_free, &priv->buf_free_list);
793821 spin_unlock_irqrestore(&cif_dev->buffree_lock, buffree_flags);
822
+ atomic_dec(&stream->buf_cnt);
823
+ stream->total_buf_num--;
794824 schedule_work(&priv->buffree_work.work);
795825 is_free = true;
796826 }