.. | .. |
---|
342 | 342 | mode = (struct rkisp_vicap_mode *)arg; |
---|
343 | 343 | memcpy(&priv->mode, mode, sizeof(*mode)); |
---|
344 | 344 | 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; |
---|
346 | 349 | mode->input.index = priv->combine_index; |
---|
347 | 350 | return 0; |
---|
348 | 351 | case RKISP_VICAP_CMD_INIT_BUF: |
---|
.. | .. |
---|
430 | 433 | static int sditf_channel_enable(struct sditf_priv *priv, int user) |
---|
431 | 434 | { |
---|
432 | 435 | struct rkcif_device *cif_dev = priv->cif_dev; |
---|
| 436 | + struct rkmodule_capture_info *capture_info = &cif_dev->channels[0].capture_info; |
---|
433 | 437 | unsigned int ch0 = 0, ch1 = 0, ch2 = 0; |
---|
434 | 438 | unsigned int ctrl_val = 0; |
---|
435 | 439 | unsigned int int_en = 0; |
---|
.. | .. |
---|
437 | 441 | unsigned int offset_y = 0; |
---|
438 | 442 | unsigned int width = priv->cap_info.width; |
---|
439 | 443 | 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 | + } |
---|
440 | 458 | |
---|
441 | 459 | if (priv->hdr_cfg.hdr_mode == NO_HDR || |
---|
442 | 460 | priv->hdr_cfg.hdr_mode == HDR_COMPR) { |
---|
443 | 461 | if (cif_dev->inf_id == RKCIF_MIPI_LVDS) |
---|
444 | | - ch0 = cif_dev->csi_host_idx * 4; |
---|
| 462 | + ch0 = csi_idx * 4; |
---|
445 | 463 | else |
---|
446 | 464 | ch0 = 24;//dvp |
---|
447 | 465 | ctrl_val = (ch0 << 3) | 0x1; |
---|
.. | .. |
---|
496 | 514 | } |
---|
497 | 515 | } else { |
---|
498 | 516 | 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; |
---|
500 | 521 | width = priv->cap_info.width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; |
---|
501 | 522 | } |
---|
502 | 523 | rkcif_write_register(cif_dev, CIF_REG_TOISP1_CTRL, ctrl_val); |
---|
.. | .. |
---|
606 | 627 | struct rkcif_device *cif_dev = priv->cif_dev; |
---|
607 | 628 | struct v4l2_subdev_format fmt; |
---|
608 | 629 | unsigned int mode = RKCIF_STREAM_MODE_TOISP; |
---|
| 630 | + int ret = 0; |
---|
609 | 631 | |
---|
610 | 632 | sditf_check_capture_mode(cif_dev); |
---|
611 | 633 | sditf_get_set_fmt(&priv->sd, NULL, &fmt); |
---|
612 | 634 | if (priv->mode.rdbk_mode == RKISP_VICAP_ONLINE) { |
---|
613 | 635 | if (priv->toisp_inf.link_mode == TOISP0) { |
---|
614 | | - sditf_channel_enable(priv, 0); |
---|
| 636 | + ret = sditf_channel_enable(priv, 0); |
---|
615 | 637 | } else if (priv->toisp_inf.link_mode == TOISP1) { |
---|
616 | | - sditf_channel_enable(priv, 1); |
---|
| 638 | + ret = sditf_channel_enable(priv, 1); |
---|
617 | 639 | } 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); |
---|
620 | 642 | } |
---|
621 | 643 | mode = RKCIF_STREAM_MODE_TOISP; |
---|
622 | 644 | } else if (priv->mode.rdbk_mode == RKISP_VICAP_RDBK_AUTO) { |
---|
623 | 645 | mode = RKCIF_STREAM_MODE_TOISP_RDBK; |
---|
624 | 646 | } |
---|
| 647 | + if (ret) |
---|
| 648 | + return ret; |
---|
625 | 649 | |
---|
626 | 650 | if (priv->hdr_cfg.hdr_mode == NO_HDR || |
---|
627 | 651 | 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); |
---|
629 | 653 | } 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); |
---|
632 | 656 | } 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); |
---|
636 | 660 | } |
---|
637 | 661 | INIT_LIST_HEAD(&priv->buf_free_list); |
---|
638 | | - return 0; |
---|
| 662 | + return ret; |
---|
639 | 663 | } |
---|
640 | 664 | |
---|
641 | 665 | static int sditf_stop_stream(struct sditf_priv *priv) |
---|
.. | .. |
---|
697 | 721 | } |
---|
698 | 722 | |
---|
699 | 723 | } |
---|
| 724 | + if (on && ret) |
---|
| 725 | + atomic_dec(&priv->stream_cnt); |
---|
700 | 726 | return ret; |
---|
701 | 727 | } |
---|
702 | 728 | |
---|
.. | .. |
---|
724 | 750 | } else { |
---|
725 | 751 | v4l2_pipeline_pm_put(&node->vdev.entity); |
---|
726 | 752 | pm_runtime_put_sync(cif_dev->dev); |
---|
| 753 | + priv->mode.rdbk_mode = RKISP_VICAP_RDBK_AIQ; |
---|
727 | 754 | } |
---|
728 | 755 | v4l2_info(&node->vdev, "s_power %d, entity use_count %d\n", |
---|
729 | 756 | on, node->vdev.entity.use_count); |
---|
.. | .. |
---|
779 | 806 | return -EINVAL; |
---|
780 | 807 | |
---|
781 | 808 | 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); |
---|
783 | 811 | spin_lock_irqsave(&stream->vbq_lock, flags); |
---|
784 | | - stream->buf_num_toisp++; |
---|
785 | 812 | stream->last_rx_buf_idx = dbufs->sequence + 1; |
---|
| 813 | + atomic_inc(&stream->buf_cnt); |
---|
786 | 814 | |
---|
787 | 815 | if (!list_empty(&stream->rx_buf_head) && |
---|
788 | 816 | cif_dev->is_thunderboot && |
---|
.. | .. |
---|
791 | 819 | spin_lock_irqsave(&cif_dev->buffree_lock, buffree_flags); |
---|
792 | 820 | list_add_tail(&rx_buf->list_free, &priv->buf_free_list); |
---|
793 | 821 | spin_unlock_irqrestore(&cif_dev->buffree_lock, buffree_flags); |
---|
| 822 | + atomic_dec(&stream->buf_cnt); |
---|
| 823 | + stream->total_buf_num--; |
---|
794 | 824 | schedule_work(&priv->buffree_work.work); |
---|
795 | 825 | is_free = true; |
---|
796 | 826 | } |
---|