| .. | .. |
|---|
| 346 | 346 | default: |
|---|
| 347 | 347 | val |= CIF_CSI2_DT_RAW12; |
|---|
| 348 | 348 | } |
|---|
| 349 | | - rkisp_write(dev, CSI2RX_RAW_RD_CTRL, |
|---|
| 350 | | - stream->memory << 2, false); |
|---|
| 351 | | - rkisp_write(dev, CSI2RX_DATA_IDS_1, val, false); |
|---|
| 349 | + rkisp_unite_write(dev, CSI2RX_RAW_RD_CTRL, |
|---|
| 350 | + stream->memory << 2, false); |
|---|
| 351 | + rkisp_unite_write(dev, CSI2RX_DATA_IDS_1, val, false); |
|---|
| 352 | 352 | rkisp_rawrd_set_pic_size(dev, stream->out_fmt.width, |
|---|
| 353 | 353 | stream->out_fmt.height); |
|---|
| 354 | 354 | mi_raw_length(stream); |
|---|
| .. | .. |
|---|
| 364 | 364 | { |
|---|
| 365 | 365 | struct rkisp_device *dev = stream->ispdev; |
|---|
| 366 | 366 | void __iomem *base = dev->base_addr; |
|---|
| 367 | + struct capture_fmt *fmt = &stream->out_isp_fmt; |
|---|
| 368 | + u32 val = 0; |
|---|
| 367 | 369 | |
|---|
| 368 | 370 | if (stream->curr_buf) { |
|---|
| 369 | | - rkisp_write(dev, stream->config->mi.y_base_ad_init, |
|---|
| 370 | | - stream->curr_buf->buff_addr[RKISP_PLANE_Y], |
|---|
| 371 | | - false); |
|---|
| 371 | + if (dev->vicap_in.merge_num > 1) { |
|---|
| 372 | + val = stream->out_fmt.plane_fmt[0].bytesperline; |
|---|
| 373 | + val /= dev->vicap_in.merge_num; |
|---|
| 374 | + val *= dev->vicap_in.index; |
|---|
| 375 | + } |
|---|
| 376 | + val += stream->curr_buf->buff_addr[RKISP_PLANE_Y]; |
|---|
| 377 | + rkisp_write(dev, stream->config->mi.y_base_ad_init, val, false); |
|---|
| 378 | + if (dev->hw_dev->unite) { |
|---|
| 379 | + u32 offs = stream->out_fmt.width / 2 - RKMOUDLE_UNITE_EXTEND_PIXEL; |
|---|
| 380 | + |
|---|
| 381 | + if (stream->memory) |
|---|
| 382 | + offs *= DIV_ROUND_UP(fmt->bpp[0], 8); |
|---|
| 383 | + else |
|---|
| 384 | + offs = offs * fmt->bpp[0] / 8; |
|---|
| 385 | + val += offs; |
|---|
| 386 | + rkisp_next_write(dev, stream->config->mi.y_base_ad_init, val, false); |
|---|
| 387 | + } |
|---|
| 372 | 388 | stream->frame_end = false; |
|---|
| 373 | | - if (stream->id == RKISP_STREAM_RAWRD2 && |
|---|
| 374 | | - stream->out_isp_fmt.fmt_type == FMT_YUV) { |
|---|
| 389 | + if (stream->id == RKISP_STREAM_RAWRD2 && stream->out_isp_fmt.fmt_type == FMT_YUV) { |
|---|
| 375 | 390 | struct vb2_v4l2_buffer *vbuf = &stream->curr_buf->vb; |
|---|
| 376 | 391 | struct isp2x_csi_trigger trigger = { |
|---|
| 377 | 392 | .frame_timestamp = vbuf->vb2_buf.timestamp, |
|---|
| 378 | 393 | .sof_timestamp = vbuf->vb2_buf.timestamp, |
|---|
| 379 | 394 | .frame_id = vbuf->sequence, |
|---|
| 380 | | - .mode = T_START_X1, |
|---|
| 395 | + .mode = 0, |
|---|
| 381 | 396 | .times = 0, |
|---|
| 382 | 397 | }; |
|---|
| 383 | 398 | |
|---|
| 384 | 399 | if (!vbuf->sequence) |
|---|
| 385 | | - trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq); |
|---|
| 400 | + trigger.frame_id = atomic_inc_return(&dev->isp_sdev.frm_sync_seq) - 1; |
|---|
| 386 | 401 | rkisp_rdbk_trigger_event(dev, T_CMD_QUEUE, &trigger); |
|---|
| 387 | 402 | } |
|---|
| 388 | 403 | } else if (dev->dmarx_dev.trigger == T_AUTO) { |
|---|
| .. | .. |
|---|
| 430 | 445 | |
|---|
| 431 | 446 | spin_lock_irqsave(&stream->vbq_lock, lock_flags); |
|---|
| 432 | 447 | if (stream->curr_buf) { |
|---|
| 433 | | - vb2_buffer_done(&stream->curr_buf->vb.vb2_buf, |
|---|
| 434 | | - VB2_BUF_STATE_DONE); |
|---|
| 448 | + if (stream->curr_buf->other) { |
|---|
| 449 | + struct rkisp_device *dev = stream->ispdev; |
|---|
| 450 | + struct v4l2_subdev *sd = dev->active_sensor->sd; |
|---|
| 451 | + struct rkisp_rx_buf *rx_buf = stream->curr_buf->other; |
|---|
| 452 | + |
|---|
| 453 | + if (rx_buf->is_switch && stream->id == RKISP_STREAM_RAWRD2) { |
|---|
| 454 | + switch (dev->rd_mode) { |
|---|
| 455 | + case HDR_RDBK_FRAME3: |
|---|
| 456 | + dev->rd_mode = HDR_LINEX3_DDR; |
|---|
| 457 | + break; |
|---|
| 458 | + case HDR_RDBK_FRAME2: |
|---|
| 459 | + dev->rd_mode = HDR_LINEX2_DDR; |
|---|
| 460 | + break; |
|---|
| 461 | + default: |
|---|
| 462 | + dev->rd_mode = HDR_NORMAL; |
|---|
| 463 | + } |
|---|
| 464 | + dev->hdr.op_mode = dev->rd_mode; |
|---|
| 465 | + rkisp_unite_write(dev, CSI2RX_CTRL0, |
|---|
| 466 | + SW_IBUF_OP_MODE(dev->hdr.op_mode), true); |
|---|
| 467 | + rkisp_unite_set_bits(dev, CSI2RX_MASK_STAT, |
|---|
| 468 | + 0, ISP21_MIPI_DROP_FRM, true); |
|---|
| 469 | + rkisp_unite_clear_bits(dev, CIF_ISP_IMSC, CIF_ISP_FRAME_IN, true); |
|---|
| 470 | + dev_info(dev->dev, |
|---|
| 471 | + "switch online seq:%d mode:0x%x\n", |
|---|
| 472 | + rx_buf->sequence, dev->rd_mode); |
|---|
| 473 | + } |
|---|
| 474 | + rx_buf->runtime_us = dev->isp_sdev.dbg.interval / 1000; |
|---|
| 475 | + v4l2_subdev_call(sd, video, s_rx_buffer, rx_buf, NULL); |
|---|
| 476 | + } else { |
|---|
| 477 | + vb2_buffer_done(&stream->curr_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); |
|---|
| 478 | + } |
|---|
| 435 | 479 | stream->curr_buf = NULL; |
|---|
| 436 | 480 | } |
|---|
| 437 | 481 | |
|---|
| .. | .. |
|---|
| 443 | 487 | list_del(&stream->curr_buf->queue); |
|---|
| 444 | 488 | } |
|---|
| 445 | 489 | |
|---|
| 446 | | - stream->ops->update_mi(stream); |
|---|
| 490 | + if (stream->curr_buf) |
|---|
| 491 | + stream->ops->update_mi(stream); |
|---|
| 447 | 492 | spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); |
|---|
| 448 | 493 | return 0; |
|---|
| 449 | 494 | } |
|---|
| .. | .. |
|---|
| 457 | 502 | int ret = 0; |
|---|
| 458 | 503 | |
|---|
| 459 | 504 | stream->stopping = true; |
|---|
| 460 | | - if ((dev->isp_state & ISP_START) && !stream->frame_end) { |
|---|
| 505 | + if ((dev->isp_state & ISP_START) && !stream->frame_end && |
|---|
| 506 | + !dev->hw_dev->is_shutdown) { |
|---|
| 461 | 507 | ret = wait_event_timeout(stream->done, |
|---|
| 462 | 508 | !stream->streaming, |
|---|
| 463 | | - msecs_to_jiffies(100)); |
|---|
| 509 | + msecs_to_jiffies(300)); |
|---|
| 464 | 510 | if (!ret) |
|---|
| 465 | 511 | v4l2_warn(v4l2_dev, |
|---|
| 466 | 512 | "dmarx:%d waiting on event return error %d\n", |
|---|
| .. | .. |
|---|
| 512 | 558 | } |
|---|
| 513 | 559 | |
|---|
| 514 | 560 | rkisp_chk_tb_over(dev); |
|---|
| 515 | | - v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s count %d, size %d\n", |
|---|
| 516 | | - v4l2_type_names[queue->type], *num_buffers, sizes[0]); |
|---|
| 561 | + v4l2_dbg(1, rkisp_debug, &dev->v4l2_dev, "%s %s count %d, size %d\n", |
|---|
| 562 | + stream->vnode.vdev.name, v4l2_type_names[queue->type], *num_buffers, sizes[0]); |
|---|
| 517 | 563 | |
|---|
| 518 | 564 | return 0; |
|---|
| 519 | 565 | } |
|---|
| .. | .. |
|---|
| 534 | 580 | struct sg_table *sgt; |
|---|
| 535 | 581 | int i; |
|---|
| 536 | 582 | |
|---|
| 583 | + ispbuf->other = NULL; |
|---|
| 537 | 584 | memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); |
|---|
| 538 | 585 | for (i = 0; i < isp_fmt->mplanes; i++) { |
|---|
| 539 | 586 | void *vaddr = vb2_plane_vaddr(vb, i); |
|---|
| .. | .. |
|---|
| 601 | 648 | unsigned long lock_flags = 0; |
|---|
| 602 | 649 | |
|---|
| 603 | 650 | spin_lock_irqsave(&stream->vbq_lock, lock_flags); |
|---|
| 604 | | - if (stream->curr_buf) { |
|---|
| 651 | + if (stream->curr_buf && !stream->curr_buf->other) |
|---|
| 605 | 652 | list_add_tail(&stream->curr_buf->queue, &stream->buf_queue); |
|---|
| 606 | | - stream->curr_buf = NULL; |
|---|
| 607 | | - } |
|---|
| 653 | + stream->curr_buf = NULL; |
|---|
| 608 | 654 | while (!list_empty(&stream->buf_queue)) { |
|---|
| 609 | 655 | buf = list_first_entry(&stream->buf_queue, |
|---|
| 610 | 656 | struct rkisp_buffer, queue); |
|---|
| 611 | 657 | list_del(&buf->queue); |
|---|
| 612 | | - vb2_buffer_done(&buf->vb.vb2_buf, state); |
|---|
| 658 | + if (!buf->other) |
|---|
| 659 | + vb2_buffer_done(&buf->vb.vb2_buf, state); |
|---|
| 613 | 660 | } |
|---|
| 614 | 661 | spin_unlock_irqrestore(&stream->vbq_lock, lock_flags); |
|---|
| 615 | 662 | } |
|---|
| .. | .. |
|---|
| 617 | 664 | static void dmarx_stop_streaming(struct vb2_queue *queue) |
|---|
| 618 | 665 | { |
|---|
| 619 | 666 | struct rkisp_stream *stream = queue->drv_priv; |
|---|
| 667 | + struct v4l2_device *v4l2_dev = &stream->ispdev->v4l2_dev; |
|---|
| 668 | + |
|---|
| 669 | + v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n", |
|---|
| 670 | + __func__, stream->vnode.vdev.name, stream->id); |
|---|
| 620 | 671 | |
|---|
| 621 | 672 | if (!stream->streaming) |
|---|
| 622 | 673 | return; |
|---|
| .. | .. |
|---|
| 625 | 676 | destroy_buf_queue(stream, VB2_BUF_STATE_ERROR); |
|---|
| 626 | 677 | |
|---|
| 627 | 678 | if (stream->id == RKISP_STREAM_RAWRD2 && |
|---|
| 628 | | - (stream->ispdev->isp_ver == ISP_V20 || stream->ispdev->isp_ver == ISP_V21)) |
|---|
| 679 | + stream->ispdev->isp_ver >= ISP_V20) |
|---|
| 629 | 680 | kfifo_reset(&stream->ispdev->rdbk_kfifo); |
|---|
| 630 | 681 | } |
|---|
| 631 | 682 | |
|---|
| .. | .. |
|---|
| 637 | 688 | struct v4l2_device *v4l2_dev = &dev->v4l2_dev; |
|---|
| 638 | 689 | int ret = -1; |
|---|
| 639 | 690 | |
|---|
| 691 | + v4l2_dbg(1, rkisp_debug, v4l2_dev, "%s %s id:%d\n", |
|---|
| 692 | + __func__, stream->vnode.vdev.name, stream->id); |
|---|
| 693 | + |
|---|
| 640 | 694 | if (WARN_ON(stream->streaming)) |
|---|
| 641 | 695 | return -EBUSY; |
|---|
| 642 | 696 | |
|---|
| 643 | 697 | if (!stream->linked) { |
|---|
| 644 | | - v4l2_err(v4l2_dev, "check video link\n"); |
|---|
| 698 | + v4l2_err(v4l2_dev, "check %s link\n", stream->vnode.vdev.name); |
|---|
| 645 | 699 | goto free_buf_queue; |
|---|
| 646 | 700 | } |
|---|
| 647 | 701 | |
|---|
| 648 | 702 | ret = dmarx_start(stream); |
|---|
| 649 | 703 | if (ret < 0) { |
|---|
| 650 | | - v4l2_err(v4l2_dev, |
|---|
| 651 | | - "start dmarx stream:%d failed\n", |
|---|
| 652 | | - stream->id); |
|---|
| 704 | + v4l2_err(v4l2_dev, "start %s failed\n", stream->vnode.vdev.name); |
|---|
| 653 | 705 | goto free_buf_queue; |
|---|
| 654 | 706 | } |
|---|
| 655 | 707 | return 0; |
|---|
| .. | .. |
|---|
| 684 | 736 | q->allow_cache_hints = 1; |
|---|
| 685 | 737 | q->bidirectional = 1; |
|---|
| 686 | 738 | q->gfp_flags = GFP_DMA32; |
|---|
| 739 | + if (stream->ispdev->hw_dev->is_dma_contig) |
|---|
| 740 | + q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS; |
|---|
| 687 | 741 | return vb2_queue_init(q); |
|---|
| 688 | 742 | } |
|---|
| 689 | 743 | |
|---|
| .. | .. |
|---|
| 735 | 789 | fmt->fmt_type == FMT_BAYER) |
|---|
| 736 | 790 | height += RKMODULE_EXTEND_LINE; |
|---|
| 737 | 791 | |
|---|
| 738 | | - if ((stream->ispdev->isp_ver == ISP_V20 || |
|---|
| 739 | | - stream->ispdev->isp_ver == ISP_V21) && |
|---|
| 792 | + if (stream->ispdev->isp_ver >= ISP_V20 && |
|---|
| 740 | 793 | fmt->fmt_type == FMT_BAYER && |
|---|
| 741 | 794 | !stream->memory && |
|---|
| 742 | 795 | stream->id != RKISP_STREAM_DMARX) |
|---|
| 743 | 796 | bytesperline = ALIGN(width * fmt->bpp[i] / 8, 256); |
|---|
| 744 | 797 | else |
|---|
| 745 | 798 | bytesperline = width * DIV_ROUND_UP(fmt->bpp[i], 8); |
|---|
| 746 | | - /* stride is only available for sp stream and y plane */ |
|---|
| 799 | + |
|---|
| 800 | + if (stream->ispdev->vicap_in.merge_num > 1) |
|---|
| 801 | + bytesperline *= stream->ispdev->vicap_in.merge_num; |
|---|
| 802 | + |
|---|
| 747 | 803 | if (i != 0 || |
|---|
| 748 | 804 | plane_fmt->bytesperline < bytesperline) |
|---|
| 749 | 805 | plane_fmt->bytesperline = bytesperline; |
|---|
| .. | .. |
|---|
| 769 | 825 | DIV_ROUND_UP(fmt->bpp[0], 8); |
|---|
| 770 | 826 | |
|---|
| 771 | 827 | v4l2_dbg(1, rkisp_debug, &stream->ispdev->v4l2_dev, |
|---|
| 772 | | - "%s: stream: %d req(%d, %d) out(%d, %d)\n", __func__, |
|---|
| 828 | + "%s: rx:%d req(%d, %d) out(%d, %d)\n", __func__, |
|---|
| 773 | 829 | stream->id, pixm->width, pixm->height, |
|---|
| 774 | 830 | stream->out_fmt.width, stream->out_fmt.height); |
|---|
| 775 | 831 | } |
|---|
| .. | .. |
|---|
| 822 | 878 | struct rkisp_device *dev = stream->ispdev; |
|---|
| 823 | 879 | |
|---|
| 824 | 880 | if (vb2_is_busy(&node->buf_queue)) { |
|---|
| 825 | | - v4l2_err(&dev->v4l2_dev, "%s queue busy\n", __func__); |
|---|
| 881 | + v4l2_err(&dev->v4l2_dev, "%s rx:%d queue busy\n", |
|---|
| 882 | + __func__, stream->id); |
|---|
| 826 | 883 | return -EBUSY; |
|---|
| 827 | 884 | } |
|---|
| 828 | 885 | |
|---|
| .. | .. |
|---|
| 906 | 963 | .vidioc_streamon = vb2_ioctl_streamon, |
|---|
| 907 | 964 | .vidioc_streamoff = vb2_ioctl_streamoff, |
|---|
| 908 | 965 | .vidioc_try_fmt_vid_out_mplane = rkisp_try_fmt_vid_out_mplane, |
|---|
| 909 | | - .vidioc_enum_fmt_vid_out_mplane = rkisp_enum_fmt_vid_out_mplane, |
|---|
| 966 | + .vidioc_enum_fmt_vid_out = rkisp_enum_fmt_vid_out_mplane, |
|---|
| 910 | 967 | .vidioc_s_fmt_vid_out_mplane = rkisp_s_fmt_vid_out_mplane, |
|---|
| 911 | 968 | .vidioc_g_fmt_vid_out_mplane = rkisp_g_fmt_vid_out_mplane, |
|---|
| 912 | 969 | .vidioc_querycap = rkisp_querycap, |
|---|
| .. | .. |
|---|
| 947 | 1004 | V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); |
|---|
| 948 | 1005 | vdev->queue = &node->buf_queue; |
|---|
| 949 | 1006 | |
|---|
| 950 | | - ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1); |
|---|
| 1007 | + ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); |
|---|
| 951 | 1008 | if (ret < 0) { |
|---|
| 952 | 1009 | v4l2_err(v4l2_dev, |
|---|
| 953 | 1010 | "%s failed with error %d\n", __func__, ret); |
|---|
| .. | .. |
|---|
| 1074 | 1131 | { |
|---|
| 1075 | 1132 | struct rkisp_isp_subdev *sdev = &dev->isp_sdev; |
|---|
| 1076 | 1133 | u8 mult = sdev->in_fmt.fmt_type == FMT_YUV ? 2 : 1; |
|---|
| 1134 | + bool is_unite = !!dev->hw_dev->unite; |
|---|
| 1135 | + u32 w = !is_unite ? width : width / 2 + RKMOUDLE_UNITE_EXTEND_PIXEL; |
|---|
| 1077 | 1136 | |
|---|
| 1078 | 1137 | /* rx height should equal to isp height + offset for read back mode */ |
|---|
| 1079 | 1138 | height = sdev->in_crop.top + sdev->in_crop.height; |
|---|
| .. | .. |
|---|
| 1085 | 1144 | dev->rd_mode == HDR_RDBK_FRAME1) |
|---|
| 1086 | 1145 | height += RKMODULE_EXTEND_LINE; |
|---|
| 1087 | 1146 | |
|---|
| 1088 | | - rkisp_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | width * mult, false); |
|---|
| 1147 | + w *= mult; |
|---|
| 1148 | + rkisp_unite_write(dev, CSI2RX_RAW_RD_PIC_SIZE, height << 16 | w, false); |
|---|
| 1089 | 1149 | } |
|---|
| 1090 | 1150 | |
|---|
| 1091 | 1151 | void rkisp_dmarx_get_frame(struct rkisp_device *dev, u32 *id, |
|---|
| .. | .. |
|---|
| 1096 | 1156 | u64 sof_time = 0, frame_timestamp = 0; |
|---|
| 1097 | 1157 | u32 frame_id = 0; |
|---|
| 1098 | 1158 | |
|---|
| 1099 | | - if (!dev->dmarx_dev.trigger && id) { |
|---|
| 1100 | | - *id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1; |
|---|
| 1101 | | - return; |
|---|
| 1159 | + if (!IS_HDR_RDBK(dev->rd_mode)) { |
|---|
| 1160 | + frame_id = atomic_read(&dev->isp_sdev.frm_sync_seq) - 1; |
|---|
| 1161 | + frame_timestamp = dev->isp_sdev.frm_timestamp; |
|---|
| 1162 | + goto end; |
|---|
| 1102 | 1163 | } |
|---|
| 1103 | 1164 | |
|---|
| 1104 | 1165 | spin_lock_irqsave(&dev->rdbk_lock, flag); |
|---|
| .. | .. |
|---|
| 1112 | 1173 | frame_timestamp = dev->dmarx_dev.pre_frame.timestamp; |
|---|
| 1113 | 1174 | } |
|---|
| 1114 | 1175 | spin_unlock_irqrestore(&dev->rdbk_lock, flag); |
|---|
| 1176 | +end: |
|---|
| 1115 | 1177 | if (id) |
|---|
| 1116 | 1178 | *id = frame_id; |
|---|
| 1117 | 1179 | if (sof_timestamp) |
|---|
| .. | .. |
|---|
| 1133 | 1195 | if (ret < 0) |
|---|
| 1134 | 1196 | goto err; |
|---|
| 1135 | 1197 | #endif |
|---|
| 1136 | | - if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) { |
|---|
| 1198 | + if (dev->isp_ver >= ISP_V20) { |
|---|
| 1137 | 1199 | ret = dmarx_init(dev, RKISP_STREAM_RAWRD0); |
|---|
| 1138 | 1200 | if (ret < 0) |
|---|
| 1139 | 1201 | goto err_free_dmarx; |
|---|
| .. | .. |
|---|
| 1141 | 1203 | if (ret < 0) |
|---|
| 1142 | 1204 | goto err_free_dmarx0; |
|---|
| 1143 | 1205 | } |
|---|
| 1144 | | - if (dev->isp_ver == ISP_V20) { |
|---|
| 1206 | + if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) { |
|---|
| 1145 | 1207 | ret = dmarx_init(dev, RKISP_STREAM_RAWRD1); |
|---|
| 1146 | 1208 | if (ret < 0) |
|---|
| 1147 | 1209 | goto err_free_dmarx2; |
|---|
| .. | .. |
|---|
| 1170 | 1232 | rkisp_unregister_dmarx_video(stream); |
|---|
| 1171 | 1233 | #endif |
|---|
| 1172 | 1234 | |
|---|
| 1173 | | - if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V21) { |
|---|
| 1235 | + if (dev->isp_ver >= ISP_V20) { |
|---|
| 1174 | 1236 | stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD0]; |
|---|
| 1175 | 1237 | rkisp_unregister_dmarx_video(stream); |
|---|
| 1176 | 1238 | |
|---|
| 1177 | 1239 | stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD2]; |
|---|
| 1178 | 1240 | rkisp_unregister_dmarx_video(stream); |
|---|
| 1179 | 1241 | } |
|---|
| 1180 | | - if (dev->isp_ver == ISP_V20) { |
|---|
| 1242 | + if (dev->isp_ver == ISP_V20 || dev->isp_ver == ISP_V30) { |
|---|
| 1181 | 1243 | stream = &dmarx_dev->stream[RKISP_STREAM_RAWRD1]; |
|---|
| 1182 | 1244 | rkisp_unregister_dmarx_video(stream); |
|---|
| 1183 | 1245 | } |
|---|