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