| .. | .. |
|---|
| 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 | } |
|---|