| .. | .. |
|---|
| 17 | 17 | #include <linux/pm_runtime.h> |
|---|
| 18 | 18 | #include <linux/pinctrl/consumer.h> |
|---|
| 19 | 19 | #include <linux/regmap.h> |
|---|
| 20 | +#include <media/videobuf2-cma-sg.h> |
|---|
| 20 | 21 | #include <media/videobuf2-dma-contig.h> |
|---|
| 22 | +#include <media/videobuf2-dma-sg.h> |
|---|
| 21 | 23 | #include <media/v4l2-fwnode.h> |
|---|
| 22 | 24 | #include <linux/iommu.h> |
|---|
| 23 | 25 | #include <dt-bindings/soc/rockchip-system-status.h> |
|---|
| 24 | 26 | #include <soc/rockchip/rockchip-system-status.h> |
|---|
| 25 | 27 | #include <linux/io.h> |
|---|
| 26 | 28 | #include <linux/mfd/syscon.h> |
|---|
| 27 | | -#include "dev.h" |
|---|
| 29 | +#include <soc/rockchip/rockchip_iommu.h> |
|---|
| 30 | +#include "common.h" |
|---|
| 28 | 31 | |
|---|
| 29 | 32 | static const struct cif_reg px30_cif_regs[] = { |
|---|
| 30 | 33 | [CIF_REG_DVP_CTRL] = CIF_REG(CIF_CTRL), |
|---|
| .. | .. |
|---|
| 597 | 600 | [CIF_REG_GRF_CIFIO_CON1] = CIF_REG(CIF_GRF_VI_CON1), |
|---|
| 598 | 601 | }; |
|---|
| 599 | 602 | |
|---|
| 603 | +static const char * const rk3588_cif_clks[] = { |
|---|
| 604 | + "aclk_cif", |
|---|
| 605 | + "hclk_cif", |
|---|
| 606 | + "dclk_cif", |
|---|
| 607 | + "iclk_host0", |
|---|
| 608 | + "iclk_host1", |
|---|
| 609 | +}; |
|---|
| 610 | + |
|---|
| 611 | +static const char * const rk3588_cif_rsts[] = { |
|---|
| 612 | + "rst_cif_a", |
|---|
| 613 | + "rst_cif_h", |
|---|
| 614 | + "rst_cif_d", |
|---|
| 615 | + "rst_cif_host0", |
|---|
| 616 | + "rst_cif_host1", |
|---|
| 617 | + "rst_cif_host2", |
|---|
| 618 | + "rst_cif_host3", |
|---|
| 619 | + "rst_cif_host4", |
|---|
| 620 | + "rst_cif_host5", |
|---|
| 621 | +}; |
|---|
| 622 | + |
|---|
| 623 | +static const struct cif_reg rk3588_cif_regs[] = { |
|---|
| 624 | + [CIF_REG_DVP_CTRL] = CIF_REG(DVP_CTRL), |
|---|
| 625 | + [CIF_REG_DVP_INTEN] = CIF_REG(DVP_INTEN), |
|---|
| 626 | + [CIF_REG_DVP_INTSTAT] = CIF_REG(DVP_INTSTAT), |
|---|
| 627 | + [CIF_REG_DVP_FOR] = CIF_REG(DVP_FOR), |
|---|
| 628 | + [CIF_REG_DVP_MULTI_ID] = CIF_REG(DVP_MULTI_ID), |
|---|
| 629 | + [CIF_REG_DVP_SAV_EAV] = CIF_REG(DVP_SAV_EAV), |
|---|
| 630 | + [CIF_REG_DVP_FRM0_ADDR_Y] = CIF_REG(DVP_FRM0_ADDR_Y_ID0), |
|---|
| 631 | + [CIF_REG_DVP_FRM0_ADDR_UV] = CIF_REG(DVP_FRM0_ADDR_UV_ID0), |
|---|
| 632 | + [CIF_REG_DVP_FRM1_ADDR_Y] = CIF_REG(DVP_FRM1_ADDR_Y_ID0), |
|---|
| 633 | + [CIF_REG_DVP_FRM1_ADDR_UV] = CIF_REG(DVP_FRM1_ADDR_UV_ID0), |
|---|
| 634 | + [CIF_REG_DVP_FRM0_ADDR_Y_ID1] = CIF_REG(DVP_FRM0_ADDR_Y_ID1), |
|---|
| 635 | + [CIF_REG_DVP_FRM0_ADDR_UV_ID1] = CIF_REG(DVP_FRM0_ADDR_UV_ID1), |
|---|
| 636 | + [CIF_REG_DVP_FRM1_ADDR_Y_ID1] = CIF_REG(DVP_FRM1_ADDR_Y_ID1), |
|---|
| 637 | + [CIF_REG_DVP_FRM1_ADDR_UV_ID1] = CIF_REG(DVP_FRM1_ADDR_UV_ID1), |
|---|
| 638 | + [CIF_REG_DVP_FRM0_ADDR_Y_ID2] = CIF_REG(DVP_FRM0_ADDR_Y_ID2), |
|---|
| 639 | + [CIF_REG_DVP_FRM0_ADDR_UV_ID2] = CIF_REG(DVP_FRM0_ADDR_UV_ID2), |
|---|
| 640 | + [CIF_REG_DVP_FRM1_ADDR_Y_ID2] = CIF_REG(DVP_FRM1_ADDR_Y_ID2), |
|---|
| 641 | + [CIF_REG_DVP_FRM1_ADDR_UV_ID2] = CIF_REG(DVP_FRM1_ADDR_UV_ID2), |
|---|
| 642 | + [CIF_REG_DVP_FRM0_ADDR_Y_ID3] = CIF_REG(DVP_FRM0_ADDR_Y_ID3), |
|---|
| 643 | + [CIF_REG_DVP_FRM0_ADDR_UV_ID3] = CIF_REG(DVP_FRM0_ADDR_UV_ID3), |
|---|
| 644 | + [CIF_REG_DVP_FRM1_ADDR_Y_ID3] = CIF_REG(DVP_FRM1_ADDR_Y_ID3), |
|---|
| 645 | + [CIF_REG_DVP_FRM1_ADDR_UV_ID3] = CIF_REG(DVP_FRM1_ADDR_UV_ID3), |
|---|
| 646 | + [CIF_REG_DVP_VIR_LINE_WIDTH] = CIF_REG(DVP_VIR_LINE_WIDTH), |
|---|
| 647 | + [CIF_REG_DVP_SET_SIZE] = CIF_REG(DVP_CROP_SIZE), |
|---|
| 648 | + [CIF_REG_DVP_CROP] = CIF_REG(DVP_CROP), |
|---|
| 649 | + [CIF_REG_DVP_LINE_INT_NUM] = CIF_REG(DVP_LINE_INT_NUM_01), |
|---|
| 650 | + [CIF_REG_DVP_LINE_INT_NUM1] = CIF_REG(DVP_LINE_INT_NUM_23), |
|---|
| 651 | + [CIF_REG_DVP_LINE_CNT] = CIF_REG(DVP_LINE_INT_NUM_01), |
|---|
| 652 | + [CIF_REG_DVP_LINE_CNT1] = CIF_REG(DVP_LINE_INT_NUM_23), |
|---|
| 653 | + |
|---|
| 654 | + [CIF_REG_MIPI_LVDS_ID0_CTRL0] = CIF_REG(CSI_MIPI0_ID0_CTRL0), |
|---|
| 655 | + [CIF_REG_MIPI_LVDS_ID0_CTRL1] = CIF_REG(CSI_MIPI0_ID0_CTRL1), |
|---|
| 656 | + [CIF_REG_MIPI_LVDS_ID1_CTRL0] = CIF_REG(CSI_MIPI0_ID1_CTRL0), |
|---|
| 657 | + [CIF_REG_MIPI_LVDS_ID1_CTRL1] = CIF_REG(CSI_MIPI0_ID1_CTRL1), |
|---|
| 658 | + [CIF_REG_MIPI_LVDS_ID2_CTRL0] = CIF_REG(CSI_MIPI0_ID2_CTRL0), |
|---|
| 659 | + [CIF_REG_MIPI_LVDS_ID2_CTRL1] = CIF_REG(CSI_MIPI0_ID2_CTRL1), |
|---|
| 660 | + [CIF_REG_MIPI_LVDS_ID3_CTRL0] = CIF_REG(CSI_MIPI0_ID3_CTRL0), |
|---|
| 661 | + [CIF_REG_MIPI_LVDS_ID3_CTRL1] = CIF_REG(CSI_MIPI0_ID3_CTRL1), |
|---|
| 662 | + [CIF_REG_MIPI_LVDS_CTRL] = CIF_REG(CSI_MIPI0_CTRL), |
|---|
| 663 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID0] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID0), |
|---|
| 664 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID0] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID0), |
|---|
| 665 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID0] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID0), |
|---|
| 666 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID0] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID0), |
|---|
| 667 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID0] = CIF_REG(CSI_MIPI0_VLW_ID0), |
|---|
| 668 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID1] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID1), |
|---|
| 669 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID1] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID1), |
|---|
| 670 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID1] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID1), |
|---|
| 671 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID1] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID1), |
|---|
| 672 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID1] = CIF_REG(CSI_MIPI0_VLW_ID1), |
|---|
| 673 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID2] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID2), |
|---|
| 674 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID2] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID2), |
|---|
| 675 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID2] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID2), |
|---|
| 676 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID2] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID2), |
|---|
| 677 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID2] = CIF_REG(CSI_MIPI0_VLW_ID2), |
|---|
| 678 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID3] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID3), |
|---|
| 679 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID3] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID3), |
|---|
| 680 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID3] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID3), |
|---|
| 681 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID3] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID3), |
|---|
| 682 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID3] = CIF_REG(CSI_MIPI0_VLW_ID3), |
|---|
| 683 | + [CIF_REG_MIPI_LVDS_INTEN] = CIF_REG(CSI_MIPI0_INTEN), |
|---|
| 684 | + [CIF_REG_MIPI_LVDS_INTSTAT] = CIF_REG(CSI_MIPI0_INTSTAT), |
|---|
| 685 | + [CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1] = CIF_REG(CSI_MIPI0_LINE_INT_NUM_ID0_1), |
|---|
| 686 | + [CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3] = CIF_REG(CSI_MIPI0_LINE_INT_NUM_ID2_3), |
|---|
| 687 | + [CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID0_1] = CIF_REG(CSI_MIPI0_LINE_CNT_ID0_1), |
|---|
| 688 | + [CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID2_3] = CIF_REG(CSI_MIPI0_LINE_CNT_ID2_3), |
|---|
| 689 | + [CIF_REG_MIPI_LVDS_ID0_CROP_START] = CIF_REG(CSI_MIPI0_ID0_CROP_START), |
|---|
| 690 | + [CIF_REG_MIPI_LVDS_ID1_CROP_START] = CIF_REG(CSI_MIPI0_ID1_CROP_START), |
|---|
| 691 | + [CIF_REG_MIPI_LVDS_ID2_CROP_START] = CIF_REG(CSI_MIPI0_ID2_CROP_START), |
|---|
| 692 | + [CIF_REG_MIPI_LVDS_ID3_CROP_START] = CIF_REG(CSI_MIPI0_ID3_CROP_START), |
|---|
| 693 | + [CIF_REG_MIPI_FRAME_NUM_VC0] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC0), |
|---|
| 694 | + [CIF_REG_MIPI_FRAME_NUM_VC1] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC1), |
|---|
| 695 | + [CIF_REG_MIPI_FRAME_NUM_VC2] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC2), |
|---|
| 696 | + [CIF_REG_MIPI_FRAME_NUM_VC3] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC3), |
|---|
| 697 | + [CIF_REG_MIPI_EFFECT_CODE_ID0] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID0), |
|---|
| 698 | + [CIF_REG_MIPI_EFFECT_CODE_ID1] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID1), |
|---|
| 699 | + [CIF_REG_MIPI_EFFECT_CODE_ID2] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID2), |
|---|
| 700 | + [CIF_REG_MIPI_EFFECT_CODE_ID3] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID3), |
|---|
| 701 | + [CIF_REG_MIPI_ON_PAD] = CIF_REG(CSI_MIPI0_ON_PAD), |
|---|
| 702 | + |
|---|
| 703 | + [CIF_REG_GLB_CTRL] = CIF_REG(GLB_CTRL), |
|---|
| 704 | + [CIF_REG_GLB_INTEN] = CIF_REG(GLB_INTEN), |
|---|
| 705 | + [CIF_REG_GLB_INTST] = CIF_REG(GLB_INTST), |
|---|
| 706 | + |
|---|
| 707 | + [CIF_REG_SCL_CH_CTRL] = CIF_REG(SCL_CH_CTRL), |
|---|
| 708 | + [CIF_REG_SCL_CTRL] = CIF_REG(SCL_CTRL), |
|---|
| 709 | + [CIF_REG_SCL_FRM0_ADDR_CH0] = CIF_REG(SCL_FRM0_ADDR_CH0), |
|---|
| 710 | + [CIF_REG_SCL_FRM1_ADDR_CH0] = CIF_REG(SCL_FRM1_ADDR_CH0), |
|---|
| 711 | + [CIF_REG_SCL_VLW_CH0] = CIF_REG(SCL_VLW_CH0), |
|---|
| 712 | + [CIF_REG_SCL_FRM0_ADDR_CH1] = CIF_REG(SCL_FRM0_ADDR_CH1), |
|---|
| 713 | + [CIF_REG_SCL_FRM1_ADDR_CH1] = CIF_REG(SCL_FRM1_ADDR_CH1), |
|---|
| 714 | + [CIF_REG_SCL_VLW_CH1] = CIF_REG(SCL_VLW_CH1), |
|---|
| 715 | + [CIF_REG_SCL_FRM0_ADDR_CH2] = CIF_REG(SCL_FRM0_ADDR_CH2), |
|---|
| 716 | + [CIF_REG_SCL_FRM1_ADDR_CH2] = CIF_REG(SCL_FRM1_ADDR_CH2), |
|---|
| 717 | + [CIF_REG_SCL_VLW_CH2] = CIF_REG(SCL_VLW_CH2), |
|---|
| 718 | + [CIF_REG_SCL_FRM0_ADDR_CH3] = CIF_REG(SCL_FRM0_ADDR_CH3), |
|---|
| 719 | + [CIF_REG_SCL_FRM1_ADDR_CH3] = CIF_REG(SCL_FRM1_ADDR_CH3), |
|---|
| 720 | + [CIF_REG_SCL_VLW_CH3] = CIF_REG(SCL_VLW_CH3), |
|---|
| 721 | + [CIF_REG_SCL_BLC_CH0] = CIF_REG(SCL_BLC_CH0), |
|---|
| 722 | + [CIF_REG_SCL_BLC_CH1] = CIF_REG(SCL_BLC_CH1), |
|---|
| 723 | + [CIF_REG_SCL_BLC_CH2] = CIF_REG(SCL_BLC_CH2), |
|---|
| 724 | + [CIF_REG_SCL_BLC_CH3] = CIF_REG(SCL_BLC_CH3), |
|---|
| 725 | + [CIF_REG_TOISP0_CTRL] = CIF_REG(TOISP0_CH_CTRL), |
|---|
| 726 | + [CIF_REG_TOISP0_SIZE] = CIF_REG(TOISP0_CROP_SIZE), |
|---|
| 727 | + [CIF_REG_TOISP0_CROP] = CIF_REG(TOISP0_CROP), |
|---|
| 728 | + [CIF_REG_TOISP1_CTRL] = CIF_REG(TOISP1_CH_CTRL), |
|---|
| 729 | + [CIF_REG_TOISP1_SIZE] = CIF_REG(TOISP1_CROP_SIZE), |
|---|
| 730 | + [CIF_REG_TOISP1_CROP] = CIF_REG(TOISP1_CROP), |
|---|
| 731 | + [CIF_REG_GRF_CIFIO_CON] = CIF_REG(CIF_GRF_SOC_CON2), |
|---|
| 732 | +}; |
|---|
| 733 | + |
|---|
| 734 | +static const char * const rv1106_cif_clks[] = { |
|---|
| 735 | + "aclk_cif", |
|---|
| 736 | + "hclk_cif", |
|---|
| 737 | + "dclk_cif", |
|---|
| 738 | + "pclk_cif", |
|---|
| 739 | + "i0clk_cif", |
|---|
| 740 | + "i1clk_cif", |
|---|
| 741 | + "rx0clk_cif", |
|---|
| 742 | + "rx1clk_cif", |
|---|
| 743 | + "isp0clk_cif", |
|---|
| 744 | + "sclk_m0_cif", |
|---|
| 745 | + "sclk_m1_cif", |
|---|
| 746 | + "pclk_vepu_cif", |
|---|
| 747 | +}; |
|---|
| 748 | + |
|---|
| 749 | +static const char * const rv1106_cif_rsts[] = { |
|---|
| 750 | + "rst_cif_a", |
|---|
| 751 | + "rst_cif_h", |
|---|
| 752 | + "rst_cif_d", |
|---|
| 753 | + "rst_cif_p", |
|---|
| 754 | + "rst_cif_i0", |
|---|
| 755 | + "rst_cif_i1", |
|---|
| 756 | + "rst_cif_rx0", |
|---|
| 757 | + "rst_cif_rx1", |
|---|
| 758 | + "rst_cif_isp0", |
|---|
| 759 | + "rst_cif_pclk_vepu", |
|---|
| 760 | +}; |
|---|
| 761 | + |
|---|
| 762 | +static const struct cif_reg rv1106_cif_regs[] = { |
|---|
| 763 | + [CIF_REG_DVP_CTRL] = CIF_REG(DVP_CTRL), |
|---|
| 764 | + [CIF_REG_DVP_INTEN] = CIF_REG(DVP_INTEN), |
|---|
| 765 | + [CIF_REG_DVP_INTSTAT] = CIF_REG(DVP_INTSTAT), |
|---|
| 766 | + [CIF_REG_DVP_FOR] = CIF_REG(DVP_FOR), |
|---|
| 767 | + [CIF_REG_DVP_SAV_EAV] = CIF_REG(DVP_SAV_EAV), |
|---|
| 768 | + [CIF_REG_DVP_FRM0_ADDR_Y] = CIF_REG(DVP_FRM0_ADDR_Y_ID0), |
|---|
| 769 | + [CIF_REG_DVP_FRM0_ADDR_UV] = CIF_REG(DVP_FRM0_ADDR_UV_ID0), |
|---|
| 770 | + [CIF_REG_DVP_FRM1_ADDR_Y] = CIF_REG(DVP_FRM1_ADDR_Y_ID0), |
|---|
| 771 | + [CIF_REG_DVP_FRM1_ADDR_UV] = CIF_REG(DVP_FRM1_ADDR_UV_ID0), |
|---|
| 772 | + [CIF_REG_DVP_VIR_LINE_WIDTH] = CIF_REG(DVP_VIR_LINE_WIDTH), |
|---|
| 773 | + [CIF_REG_DVP_SET_SIZE] = CIF_REG(DVP_CROP_SIZE), |
|---|
| 774 | + [CIF_REG_DVP_CROP] = CIF_REG(DVP_CROP), |
|---|
| 775 | + [CIF_REG_DVP_LINE_INT_NUM] = CIF_REG(DVP_LINE_INT_NUM_01), |
|---|
| 776 | + [CIF_REG_DVP_LINE_CNT] = CIF_REG(DVP_LINE_CNT_01), |
|---|
| 777 | + |
|---|
| 778 | + [CIF_REG_MIPI_LVDS_ID0_CTRL0] = CIF_REG(CSI_MIPI0_ID0_CTRL0), |
|---|
| 779 | + [CIF_REG_MIPI_LVDS_ID0_CTRL1] = CIF_REG(CSI_MIPI0_ID0_CTRL1), |
|---|
| 780 | + [CIF_REG_MIPI_LVDS_ID1_CTRL0] = CIF_REG(CSI_MIPI0_ID1_CTRL0), |
|---|
| 781 | + [CIF_REG_MIPI_LVDS_ID1_CTRL1] = CIF_REG(CSI_MIPI0_ID1_CTRL1), |
|---|
| 782 | + [CIF_REG_MIPI_LVDS_ID2_CTRL0] = CIF_REG(CSI_MIPI0_ID2_CTRL0), |
|---|
| 783 | + [CIF_REG_MIPI_LVDS_ID2_CTRL1] = CIF_REG(CSI_MIPI0_ID2_CTRL1), |
|---|
| 784 | + [CIF_REG_MIPI_LVDS_ID3_CTRL0] = CIF_REG(CSI_MIPI0_ID3_CTRL0), |
|---|
| 785 | + [CIF_REG_MIPI_LVDS_ID3_CTRL1] = CIF_REG(CSI_MIPI0_ID3_CTRL1), |
|---|
| 786 | + [CIF_REG_MIPI_LVDS_CTRL] = CIF_REG(CSI_MIPI0_CTRL), |
|---|
| 787 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID0] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID0), |
|---|
| 788 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID0] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID0), |
|---|
| 789 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID0] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID0), |
|---|
| 790 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID0] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID0), |
|---|
| 791 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID0] = CIF_REG(CSI_MIPI0_VLW_ID0), |
|---|
| 792 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID1] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID1), |
|---|
| 793 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID1] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID1), |
|---|
| 794 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID1] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID1), |
|---|
| 795 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID1] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID1), |
|---|
| 796 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID1] = CIF_REG(CSI_MIPI0_VLW_ID1), |
|---|
| 797 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID2] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID2), |
|---|
| 798 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID2] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID2), |
|---|
| 799 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID2] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID2), |
|---|
| 800 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID2] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID2), |
|---|
| 801 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID2] = CIF_REG(CSI_MIPI0_VLW_ID2), |
|---|
| 802 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID3] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID3), |
|---|
| 803 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID3] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID3), |
|---|
| 804 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID3] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID3), |
|---|
| 805 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID3] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID3), |
|---|
| 806 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID3] = CIF_REG(CSI_MIPI0_VLW_ID3), |
|---|
| 807 | + [CIF_REG_MIPI_LVDS_INTEN] = CIF_REG(CSI_MIPI0_INTEN), |
|---|
| 808 | + [CIF_REG_MIPI_LVDS_INTSTAT] = CIF_REG(CSI_MIPI0_INTSTAT), |
|---|
| 809 | + [CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1] = CIF_REG(CSI_MIPI0_LINE_INT_NUM_ID0_1), |
|---|
| 810 | + [CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3] = CIF_REG(CSI_MIPI0_LINE_INT_NUM_ID2_3), |
|---|
| 811 | + [CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID0_1] = CIF_REG(CSI_MIPI0_LINE_CNT_ID0_1), |
|---|
| 812 | + [CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID2_3] = CIF_REG(CSI_MIPI0_LINE_CNT_ID2_3), |
|---|
| 813 | + [CIF_REG_MIPI_LVDS_ID0_CROP_START] = CIF_REG(CSI_MIPI0_ID0_CROP_START), |
|---|
| 814 | + [CIF_REG_MIPI_LVDS_ID1_CROP_START] = CIF_REG(CSI_MIPI0_ID1_CROP_START), |
|---|
| 815 | + [CIF_REG_MIPI_LVDS_ID2_CROP_START] = CIF_REG(CSI_MIPI0_ID2_CROP_START), |
|---|
| 816 | + [CIF_REG_MIPI_LVDS_ID3_CROP_START] = CIF_REG(CSI_MIPI0_ID3_CROP_START), |
|---|
| 817 | + [CIF_REG_MIPI_FRAME_NUM_VC0] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC0), |
|---|
| 818 | + [CIF_REG_MIPI_FRAME_NUM_VC1] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC1), |
|---|
| 819 | + [CIF_REG_MIPI_FRAME_NUM_VC2] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC2), |
|---|
| 820 | + [CIF_REG_MIPI_FRAME_NUM_VC3] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC3), |
|---|
| 821 | + [CIF_REG_MIPI_EFFECT_CODE_ID0] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID0), |
|---|
| 822 | + [CIF_REG_MIPI_EFFECT_CODE_ID1] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID1), |
|---|
| 823 | + [CIF_REG_MIPI_EFFECT_CODE_ID2] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID2), |
|---|
| 824 | + [CIF_REG_MIPI_EFFECT_CODE_ID3] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID3), |
|---|
| 825 | + [CIF_REG_MIPI_ON_PAD] = CIF_REG(CSI_MIPI0_ON_PAD), |
|---|
| 826 | + [CIF_REG_LVDS_ID0_CTRL0] = CIF_REG(CIF_LVDS0_ID0_CTRL0), |
|---|
| 827 | + [CIF_REG_LVDS_ID1_CTRL0] = CIF_REG(CIF_LVDS0_ID1_CTRL0), |
|---|
| 828 | + [CIF_REG_LVDS_ID2_CTRL0] = CIF_REG(CIF_LVDS0_ID2_CTRL0), |
|---|
| 829 | + [CIF_REG_LVDS_ID3_CTRL0] = CIF_REG(CIF_LVDS0_ID3_CTRL0), |
|---|
| 830 | + [CIF_REG_LVDS_SAV_EAV_ACT0_ID0] = CIF_REG(CIF_LVDS_SAV_EAV_ACT0_ID0_RV1106), |
|---|
| 831 | + [CIF_REG_LVDS_SAV_EAV_BLK0_ID0] = CIF_REG(CIF_LVDS_SAV_EAV_BLK0_ID0_RV1106), |
|---|
| 832 | + [CIF_REG_LVDS_SAV_EAV_ACT1_ID0] = CIF_REG(CIF_LVDS_SAV_EAV_ACT1_ID0_RV1106), |
|---|
| 833 | + [CIF_REG_LVDS_SAV_EAV_BLK1_ID0] = CIF_REG(CIF_LVDS_SAV_EAV_BLK1_ID0_RV1106), |
|---|
| 834 | + [CIF_REG_LVDS_SAV_EAV_ACT0_ID1] = CIF_REG(CIF_LVDS_SAV_EAV_ACT0_ID1_RV1106), |
|---|
| 835 | + [CIF_REG_LVDS_SAV_EAV_BLK0_ID1] = CIF_REG(CIF_LVDS_SAV_EAV_BLK0_ID1_RV1106), |
|---|
| 836 | + [CIF_REG_LVDS_SAV_EAV_ACT1_ID1] = CIF_REG(CIF_LVDS_SAV_EAV_ACT1_ID1_RV1106), |
|---|
| 837 | + [CIF_REG_LVDS_SAV_EAV_BLK1_ID1] = CIF_REG(CIF_LVDS_SAV_EAV_BLK1_ID1_RV1106), |
|---|
| 838 | + [CIF_REG_LVDS_SAV_EAV_ACT0_ID2] = CIF_REG(CIF_LVDS_SAV_EAV_ACT0_ID2_RV1106), |
|---|
| 839 | + [CIF_REG_LVDS_SAV_EAV_BLK0_ID2] = CIF_REG(CIF_LVDS_SAV_EAV_BLK0_ID2_RV1106), |
|---|
| 840 | + [CIF_REG_LVDS_SAV_EAV_ACT1_ID2] = CIF_REG(CIF_LVDS_SAV_EAV_ACT1_ID2_RV1106), |
|---|
| 841 | + [CIF_REG_LVDS_SAV_EAV_BLK1_ID2] = CIF_REG(CIF_LVDS_SAV_EAV_BLK1_ID2_RV1106), |
|---|
| 842 | + [CIF_REG_LVDS_SAV_EAV_ACT0_ID3] = CIF_REG(CIF_LVDS_SAV_EAV_ACT0_ID3_RV1106), |
|---|
| 843 | + [CIF_REG_LVDS_SAV_EAV_BLK0_ID3] = CIF_REG(CIF_LVDS_SAV_EAV_BLK0_ID3_RV1106), |
|---|
| 844 | + [CIF_REG_LVDS_SAV_EAV_ACT1_ID3] = CIF_REG(CIF_LVDS_SAV_EAV_ACT1_ID3_RV1106), |
|---|
| 845 | + [CIF_REG_LVDS_SAV_EAV_BLK1_ID3] = CIF_REG(CIF_LVDS_SAV_EAV_BLK1_ID3_RV1106), |
|---|
| 846 | + [CIF_REG_GLB_CTRL] = CIF_REG(GLB_CTRL), |
|---|
| 847 | + [CIF_REG_GLB_INTEN] = CIF_REG(GLB_INTEN), |
|---|
| 848 | + [CIF_REG_GLB_INTST] = CIF_REG(GLB_INTST), |
|---|
| 849 | + |
|---|
| 850 | + [CIF_REG_SCL_CH_CTRL] = CIF_REG(SCL_CH_CTRL), |
|---|
| 851 | + [CIF_REG_SCL_CTRL] = CIF_REG(SCL_CTRL), |
|---|
| 852 | + [CIF_REG_SCL_FRM0_ADDR_CH0] = CIF_REG(SCL_FRM0_ADDR_CH0), |
|---|
| 853 | + [CIF_REG_SCL_FRM1_ADDR_CH0] = CIF_REG(SCL_FRM1_ADDR_CH0), |
|---|
| 854 | + [CIF_REG_SCL_VLW_CH0] = CIF_REG(SCL_VLW_CH0), |
|---|
| 855 | + [CIF_REG_SCL_FRM0_ADDR_CH1] = CIF_REG(SCL_FRM0_ADDR_CH1), |
|---|
| 856 | + [CIF_REG_SCL_FRM1_ADDR_CH1] = CIF_REG(SCL_FRM1_ADDR_CH1), |
|---|
| 857 | + [CIF_REG_SCL_VLW_CH1] = CIF_REG(SCL_VLW_CH1), |
|---|
| 858 | + [CIF_REG_SCL_FRM0_ADDR_CH2] = CIF_REG(SCL_FRM0_ADDR_CH2), |
|---|
| 859 | + [CIF_REG_SCL_FRM1_ADDR_CH2] = CIF_REG(SCL_FRM1_ADDR_CH2), |
|---|
| 860 | + [CIF_REG_SCL_VLW_CH2] = CIF_REG(SCL_VLW_CH2), |
|---|
| 861 | + [CIF_REG_SCL_FRM0_ADDR_CH3] = CIF_REG(SCL_FRM0_ADDR_CH3), |
|---|
| 862 | + [CIF_REG_SCL_FRM1_ADDR_CH3] = CIF_REG(SCL_FRM1_ADDR_CH3), |
|---|
| 863 | + [CIF_REG_SCL_VLW_CH3] = CIF_REG(SCL_VLW_CH3), |
|---|
| 864 | + [CIF_REG_SCL_BLC_CH0] = CIF_REG(SCL_BLC_CH0), |
|---|
| 865 | + [CIF_REG_SCL_BLC_CH1] = CIF_REG(SCL_BLC_CH1), |
|---|
| 866 | + [CIF_REG_SCL_BLC_CH2] = CIF_REG(SCL_BLC_CH2), |
|---|
| 867 | + [CIF_REG_SCL_BLC_CH3] = CIF_REG(SCL_BLC_CH3), |
|---|
| 868 | + |
|---|
| 869 | + [CIF_REG_TOISP0_CTRL] = CIF_REG(TOISP0_CH_CTRL), |
|---|
| 870 | + [CIF_REG_TOISP0_SIZE] = CIF_REG(TOISP0_CROP_SIZE), |
|---|
| 871 | + [CIF_REG_TOISP0_CROP] = CIF_REG(TOISP0_CROP), |
|---|
| 872 | + [CIF_REG_GRF_CIFIO_CON] = CIF_REG(RV1106_CIF_GRF_VI_CON), |
|---|
| 873 | + [CIF_REG_GRF_CIFIO_VENC] = CIF_REG(RV1106_CIF_GRF_VENC_WRAPPER), |
|---|
| 874 | +}; |
|---|
| 875 | + |
|---|
| 876 | +static const char * const rk3562_cif_clks[] = { |
|---|
| 877 | + "aclk_cif", |
|---|
| 878 | + "hclk_cif", |
|---|
| 879 | + "dclk_cif", |
|---|
| 880 | + "csirx0_data", |
|---|
| 881 | + "csirx1_data", |
|---|
| 882 | + "csirx2_data", |
|---|
| 883 | + "csirx3_data", |
|---|
| 884 | +}; |
|---|
| 885 | + |
|---|
| 886 | +static const char * const rk3562_cif_rsts[] = { |
|---|
| 887 | + "rst_cif_a", |
|---|
| 888 | + "rst_cif_h", |
|---|
| 889 | + "rst_cif_d", |
|---|
| 890 | + "rst_cif_i0", |
|---|
| 891 | + "rst_cif_i1", |
|---|
| 892 | + "rst_cif_i2", |
|---|
| 893 | + "rst_cif_i3", |
|---|
| 894 | +}; |
|---|
| 895 | + |
|---|
| 896 | +static const struct cif_reg rk3562_cif_regs[] = { |
|---|
| 897 | + [CIF_REG_MIPI_LVDS_ID0_CTRL0] = CIF_REG(CSI_MIPI0_ID0_CTRL0), |
|---|
| 898 | + [CIF_REG_MIPI_LVDS_ID0_CTRL1] = CIF_REG(CSI_MIPI0_ID0_CTRL1), |
|---|
| 899 | + [CIF_REG_MIPI_LVDS_ID1_CTRL0] = CIF_REG(CSI_MIPI0_ID1_CTRL0), |
|---|
| 900 | + [CIF_REG_MIPI_LVDS_ID1_CTRL1] = CIF_REG(CSI_MIPI0_ID1_CTRL1), |
|---|
| 901 | + [CIF_REG_MIPI_LVDS_ID2_CTRL0] = CIF_REG(CSI_MIPI0_ID2_CTRL0), |
|---|
| 902 | + [CIF_REG_MIPI_LVDS_ID2_CTRL1] = CIF_REG(CSI_MIPI0_ID2_CTRL1), |
|---|
| 903 | + [CIF_REG_MIPI_LVDS_ID3_CTRL0] = CIF_REG(CSI_MIPI0_ID3_CTRL0), |
|---|
| 904 | + [CIF_REG_MIPI_LVDS_ID3_CTRL1] = CIF_REG(CSI_MIPI0_ID3_CTRL1), |
|---|
| 905 | + [CIF_REG_MIPI_LVDS_CTRL] = CIF_REG(CSI_MIPI0_CTRL), |
|---|
| 906 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID0] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID0), |
|---|
| 907 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID0] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID0), |
|---|
| 908 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID0] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID0), |
|---|
| 909 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID0] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID0), |
|---|
| 910 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID0] = CIF_REG(CSI_MIPI0_VLW_ID0), |
|---|
| 911 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID1] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID1), |
|---|
| 912 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID1] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID1), |
|---|
| 913 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID1] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID1), |
|---|
| 914 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID1] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID1), |
|---|
| 915 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID1] = CIF_REG(CSI_MIPI0_VLW_ID1), |
|---|
| 916 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID2] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID2), |
|---|
| 917 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID2] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID2), |
|---|
| 918 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID2] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID2), |
|---|
| 919 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID2] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID2), |
|---|
| 920 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID2] = CIF_REG(CSI_MIPI0_VLW_ID2), |
|---|
| 921 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_Y_ID3] = CIF_REG(CSI_MIPI0_FRM0_ADDR_Y_ID3), |
|---|
| 922 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_Y_ID3] = CIF_REG(CSI_MIPI0_FRM1_ADDR_Y_ID3), |
|---|
| 923 | + [CIF_REG_MIPI_LVDS_FRAME0_ADDR_UV_ID3] = CIF_REG(CSI_MIPI0_FRM0_ADDR_UV_ID3), |
|---|
| 924 | + [CIF_REG_MIPI_LVDS_FRAME1_ADDR_UV_ID3] = CIF_REG(CSI_MIPI0_FRM1_ADDR_UV_ID3), |
|---|
| 925 | + [CIF_REG_MIPI_LVDS_FRAME0_VLW_Y_ID3] = CIF_REG(CSI_MIPI0_VLW_ID3), |
|---|
| 926 | + [CIF_REG_MIPI_LVDS_INTEN] = CIF_REG(CSI_MIPI0_INTEN), |
|---|
| 927 | + [CIF_REG_MIPI_LVDS_INTSTAT] = CIF_REG(CSI_MIPI0_INTSTAT), |
|---|
| 928 | + [CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1] = CIF_REG(CSI_MIPI0_LINE_INT_NUM_ID0_1), |
|---|
| 929 | + [CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3] = CIF_REG(CSI_MIPI0_LINE_INT_NUM_ID2_3), |
|---|
| 930 | + [CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID0_1] = CIF_REG(CSI_MIPI0_LINE_CNT_ID0_1), |
|---|
| 931 | + [CIF_REG_MIPI_LVDS_LINE_LINE_CNT_ID2_3] = CIF_REG(CSI_MIPI0_LINE_CNT_ID2_3), |
|---|
| 932 | + [CIF_REG_MIPI_LVDS_ID0_CROP_START] = CIF_REG(CSI_MIPI0_ID0_CROP_START), |
|---|
| 933 | + [CIF_REG_MIPI_LVDS_ID1_CROP_START] = CIF_REG(CSI_MIPI0_ID1_CROP_START), |
|---|
| 934 | + [CIF_REG_MIPI_LVDS_ID2_CROP_START] = CIF_REG(CSI_MIPI0_ID2_CROP_START), |
|---|
| 935 | + [CIF_REG_MIPI_LVDS_ID3_CROP_START] = CIF_REG(CSI_MIPI0_ID3_CROP_START), |
|---|
| 936 | + [CIF_REG_MIPI_FRAME_NUM_VC0] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC0), |
|---|
| 937 | + [CIF_REG_MIPI_FRAME_NUM_VC1] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC1), |
|---|
| 938 | + [CIF_REG_MIPI_FRAME_NUM_VC2] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC2), |
|---|
| 939 | + [CIF_REG_MIPI_FRAME_NUM_VC3] = CIF_REG(CSI_MIPI0_FRAME_NUM_VC3), |
|---|
| 940 | + [CIF_REG_MIPI_EFFECT_CODE_ID0] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID0), |
|---|
| 941 | + [CIF_REG_MIPI_EFFECT_CODE_ID1] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID1), |
|---|
| 942 | + [CIF_REG_MIPI_EFFECT_CODE_ID2] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID2), |
|---|
| 943 | + [CIF_REG_MIPI_EFFECT_CODE_ID3] = CIF_REG(CSI_MIPI0_EFFECT_CODE_ID3), |
|---|
| 944 | + [CIF_REG_MIPI_ON_PAD] = CIF_REG(CSI_MIPI0_ON_PAD), |
|---|
| 945 | + |
|---|
| 946 | + [CIF_REG_GLB_CTRL] = CIF_REG(GLB_CTRL), |
|---|
| 947 | + [CIF_REG_GLB_INTEN] = CIF_REG(GLB_INTEN), |
|---|
| 948 | + [CIF_REG_GLB_INTST] = CIF_REG(GLB_INTST), |
|---|
| 949 | + |
|---|
| 950 | + [CIF_REG_SCL_CH_CTRL] = CIF_REG(SCL_CH_CTRL), |
|---|
| 951 | + [CIF_REG_SCL_CTRL] = CIF_REG(SCL_CTRL), |
|---|
| 952 | + [CIF_REG_SCL_FRM0_ADDR_CH0] = CIF_REG(SCL_FRM0_ADDR_CH0), |
|---|
| 953 | + [CIF_REG_SCL_FRM1_ADDR_CH0] = CIF_REG(SCL_FRM1_ADDR_CH0), |
|---|
| 954 | + [CIF_REG_SCL_VLW_CH0] = CIF_REG(SCL_VLW_CH0), |
|---|
| 955 | + [CIF_REG_SCL_BLC_CH0] = CIF_REG(SCL_BLC_CH0), |
|---|
| 956 | + |
|---|
| 957 | + [CIF_REG_TOISP0_CTRL] = CIF_REG(TOISP0_CH_CTRL), |
|---|
| 958 | + [CIF_REG_TOISP0_SIZE] = CIF_REG(TOISP0_CROP_SIZE), |
|---|
| 959 | + [CIF_REG_TOISP0_CROP] = CIF_REG(TOISP0_CROP), |
|---|
| 960 | +}; |
|---|
| 961 | + |
|---|
| 600 | 962 | static const struct rkcif_hw_match_data px30_cif_match_data = { |
|---|
| 601 | 963 | .chip_id = CHIP_PX30_CIF, |
|---|
| 602 | 964 | .clks = px30_cif_clks, |
|---|
| .. | .. |
|---|
| 678 | 1040 | .cif_regs = rk3568_cif_regs, |
|---|
| 679 | 1041 | }; |
|---|
| 680 | 1042 | |
|---|
| 1043 | +static const struct rkcif_hw_match_data rk3588_cif_match_data = { |
|---|
| 1044 | + .chip_id = CHIP_RK3588_CIF, |
|---|
| 1045 | + .clks = rk3588_cif_clks, |
|---|
| 1046 | + .clks_num = ARRAY_SIZE(rk3588_cif_clks), |
|---|
| 1047 | + .rsts = rk3588_cif_rsts, |
|---|
| 1048 | + .rsts_num = ARRAY_SIZE(rk3588_cif_rsts), |
|---|
| 1049 | + .cif_regs = rk3588_cif_regs, |
|---|
| 1050 | +}; |
|---|
| 1051 | + |
|---|
| 1052 | +static const struct rkcif_hw_match_data rv1106_cif_match_data = { |
|---|
| 1053 | + .chip_id = CHIP_RV1106_CIF, |
|---|
| 1054 | + .clks = rv1106_cif_clks, |
|---|
| 1055 | + .clks_num = ARRAY_SIZE(rv1106_cif_clks), |
|---|
| 1056 | + .rsts = rv1106_cif_rsts, |
|---|
| 1057 | + .rsts_num = ARRAY_SIZE(rv1106_cif_rsts), |
|---|
| 1058 | + .cif_regs = rv1106_cif_regs, |
|---|
| 1059 | +}; |
|---|
| 1060 | + |
|---|
| 1061 | +static const struct rkcif_hw_match_data rk3562_cif_match_data = { |
|---|
| 1062 | + .chip_id = CHIP_RK3562_CIF, |
|---|
| 1063 | + .clks = rk3562_cif_clks, |
|---|
| 1064 | + .clks_num = ARRAY_SIZE(rk3562_cif_clks), |
|---|
| 1065 | + .rsts = rk3562_cif_rsts, |
|---|
| 1066 | + .rsts_num = ARRAY_SIZE(rk3562_cif_rsts), |
|---|
| 1067 | + .cif_regs = rk3562_cif_regs, |
|---|
| 1068 | +}; |
|---|
| 681 | 1069 | |
|---|
| 682 | 1070 | static const struct of_device_id rkcif_plat_of_match[] = { |
|---|
| 683 | 1071 | #ifdef CONFIG_CPU_PX30 |
|---|
| .. | .. |
|---|
| 722 | 1110 | .data = &rk3568_cif_match_data, |
|---|
| 723 | 1111 | }, |
|---|
| 724 | 1112 | #endif |
|---|
| 1113 | +#ifdef CONFIG_CPU_RK3588 |
|---|
| 1114 | + { |
|---|
| 1115 | + .compatible = "rockchip,rk3588-cif", |
|---|
| 1116 | + .data = &rk3588_cif_match_data, |
|---|
| 1117 | + }, |
|---|
| 1118 | +#endif |
|---|
| 725 | 1119 | #ifdef CONFIG_CPU_RV1126 |
|---|
| 726 | 1120 | { |
|---|
| 727 | 1121 | .compatible = "rockchip,rv1126-cif", |
|---|
| .. | .. |
|---|
| 732 | 1126 | .data = &rv1126_cif_lite_match_data, |
|---|
| 733 | 1127 | }, |
|---|
| 734 | 1128 | #endif |
|---|
| 1129 | +#ifdef CONFIG_CPU_RV1106 |
|---|
| 1130 | + { |
|---|
| 1131 | + .compatible = "rockchip,rv1106-cif", |
|---|
| 1132 | + .data = &rv1106_cif_match_data, |
|---|
| 1133 | + }, |
|---|
| 1134 | +#endif |
|---|
| 1135 | +#ifdef CONFIG_CPU_RK3562 |
|---|
| 1136 | + { |
|---|
| 1137 | + .compatible = "rockchip,rk3562-cif", |
|---|
| 1138 | + .data = &rk3562_cif_match_data, |
|---|
| 1139 | + }, |
|---|
| 1140 | +#endif |
|---|
| 735 | 1141 | {}, |
|---|
| 736 | 1142 | }; |
|---|
| 737 | 1143 | |
|---|
| .. | .. |
|---|
| 739 | 1145 | { |
|---|
| 740 | 1146 | struct device *dev = ctx; |
|---|
| 741 | 1147 | struct rkcif_hw *cif_hw = dev_get_drvdata(dev); |
|---|
| 1148 | + unsigned int intstat_glb = 0; |
|---|
| 1149 | + u64 irq_start, irq_stop; |
|---|
| 742 | 1150 | int i; |
|---|
| 743 | | - struct rkcif_device *tmp_dev = NULL; |
|---|
| 744 | 1151 | |
|---|
| 745 | | - for (i = 0; i < cif_hw->dev_num; i++) { |
|---|
| 746 | | - tmp_dev = cif_hw->cif_dev[i]; |
|---|
| 747 | | - if (tmp_dev->isr_hdl && |
|---|
| 748 | | - (atomic_read(&tmp_dev->pipe.stream_cnt) != 0)) |
|---|
| 749 | | - tmp_dev->isr_hdl(irq, tmp_dev); |
|---|
| 1152 | + irq_start = ktime_get_ns(); |
|---|
| 1153 | + if (cif_hw->chip_id >= CHIP_RK3588_CIF) { |
|---|
| 1154 | + intstat_glb = rkcif_irq_global(cif_hw->cif_dev[0]); |
|---|
| 1155 | + if (intstat_glb) |
|---|
| 1156 | + rkcif_write_register(cif_hw->cif_dev[0], CIF_REG_GLB_INTST, intstat_glb); |
|---|
| 750 | 1157 | } |
|---|
| 751 | 1158 | |
|---|
| 1159 | + for (i = 0; i < cif_hw->dev_num; i++) { |
|---|
| 1160 | + if (cif_hw->cif_dev[i]->isr_hdl) { |
|---|
| 1161 | + cif_hw->cif_dev[i]->isr_hdl(irq, cif_hw->cif_dev[i]); |
|---|
| 1162 | + if (cif_hw->cif_dev[i]->err_state && |
|---|
| 1163 | + (!work_busy(&cif_hw->cif_dev[i]->err_state_work.work))) { |
|---|
| 1164 | + cif_hw->cif_dev[i]->err_state_work.err_state = cif_hw->cif_dev[i]->err_state; |
|---|
| 1165 | + cif_hw->cif_dev[i]->err_state = 0; |
|---|
| 1166 | + schedule_work(&cif_hw->cif_dev[i]->err_state_work.work); |
|---|
| 1167 | + } |
|---|
| 1168 | + if (cif_hw->chip_id >= CHIP_RK3588_CIF && intstat_glb) |
|---|
| 1169 | + rkcif_irq_handle_toisp(cif_hw->cif_dev[i], intstat_glb); |
|---|
| 1170 | + } |
|---|
| 1171 | + } |
|---|
| 1172 | + irq_stop = ktime_get_ns(); |
|---|
| 1173 | + cif_hw->irq_time = irq_stop - irq_start; |
|---|
| 752 | 1174 | return IRQ_HANDLED; |
|---|
| 753 | 1175 | } |
|---|
| 754 | 1176 | |
|---|
| .. | .. |
|---|
| 783 | 1205 | |
|---|
| 784 | 1206 | static void rkcif_iommu_cleanup(struct rkcif_hw *cif_hw) |
|---|
| 785 | 1207 | { |
|---|
| 786 | | - if (cif_hw->domain) |
|---|
| 787 | | - iommu_detach_device(cif_hw->domain, cif_hw->dev); |
|---|
| 1208 | + if (cif_hw->iommu_en) |
|---|
| 1209 | + rockchip_iommu_disable(cif_hw->dev); |
|---|
| 788 | 1210 | } |
|---|
| 789 | 1211 | |
|---|
| 790 | 1212 | static void rkcif_iommu_enable(struct rkcif_hw *cif_hw) |
|---|
| 791 | 1213 | { |
|---|
| 792 | | - if (!cif_hw->domain) |
|---|
| 793 | | - cif_hw->domain = iommu_get_domain_for_dev(cif_hw->dev); |
|---|
| 794 | | - |
|---|
| 795 | | - if (cif_hw->domain) |
|---|
| 796 | | - iommu_attach_device(cif_hw->domain, cif_hw->dev); |
|---|
| 1214 | + if (cif_hw->iommu_en) |
|---|
| 1215 | + rockchip_iommu_enable(cif_hw->dev); |
|---|
| 797 | 1216 | } |
|---|
| 798 | 1217 | |
|---|
| 799 | 1218 | static inline bool is_iommu_enable(struct device *dev) |
|---|
| .. | .. |
|---|
| 833 | 1252 | rkcif_iommu_enable(cif_hw); |
|---|
| 834 | 1253 | } |
|---|
| 835 | 1254 | |
|---|
| 836 | | -static char *rkcif_get_monitor_mode(enum rkcif_monitor_mode mode) |
|---|
| 837 | | -{ |
|---|
| 838 | | - switch (mode) { |
|---|
| 839 | | - case RKCIF_MONITOR_MODE_IDLE: |
|---|
| 840 | | - return "idle"; |
|---|
| 841 | | - case RKCIF_MONITOR_MODE_CONTINUE: |
|---|
| 842 | | - return "continue"; |
|---|
| 843 | | - case RKCIF_MONITOR_MODE_TRIGGER: |
|---|
| 844 | | - return "trigger"; |
|---|
| 845 | | - case RKCIF_MONITOR_MODE_HOTPLUG: |
|---|
| 846 | | - return "hotplug"; |
|---|
| 847 | | - default: |
|---|
| 848 | | - return "unknown"; |
|---|
| 849 | | - } |
|---|
| 850 | | -} |
|---|
| 851 | | - |
|---|
| 852 | | -static void rkcif_init_reset_timer(struct rkcif_hw *hw) |
|---|
| 853 | | -{ |
|---|
| 854 | | - struct device_node *node = hw->dev->of_node; |
|---|
| 855 | | - struct rkcif_hw_timer *hw_timer = &hw->hw_timer; |
|---|
| 856 | | - u32 para[8]; |
|---|
| 857 | | - int i; |
|---|
| 858 | | - |
|---|
| 859 | | - if (!of_property_read_u32_array(node, |
|---|
| 860 | | - OF_CIF_MONITOR_PARA, |
|---|
| 861 | | - para, |
|---|
| 862 | | - CIF_MONITOR_PARA_NUM)) { |
|---|
| 863 | | - for (i = 0; i < CIF_MONITOR_PARA_NUM; i++) { |
|---|
| 864 | | - if (i == 0) { |
|---|
| 865 | | - hw_timer->monitor_mode = para[0]; |
|---|
| 866 | | - dev_info(hw->dev, |
|---|
| 867 | | - "%s: timer monitor mode:%s\n", |
|---|
| 868 | | - __func__, rkcif_get_monitor_mode(hw_timer->monitor_mode)); |
|---|
| 869 | | - } |
|---|
| 870 | | - |
|---|
| 871 | | - if (i == 1) { |
|---|
| 872 | | - hw_timer->monitor_cycle = para[1]; |
|---|
| 873 | | - dev_info(hw->dev, |
|---|
| 874 | | - "timer of monitor cycle:%d\n", |
|---|
| 875 | | - hw_timer->monitor_cycle); |
|---|
| 876 | | - } |
|---|
| 877 | | - |
|---|
| 878 | | - if (i == 2) { |
|---|
| 879 | | - hw_timer->err_time_interval = para[2]; |
|---|
| 880 | | - dev_info(hw->dev, |
|---|
| 881 | | - "timer err time for keeping:%d ms\n", |
|---|
| 882 | | - hw_timer->err_time_interval); |
|---|
| 883 | | - } |
|---|
| 884 | | - |
|---|
| 885 | | - if (i == 3) { |
|---|
| 886 | | - hw_timer->err_ref_cnt = para[3]; |
|---|
| 887 | | - dev_info(hw->dev, |
|---|
| 888 | | - "timer err ref val for resetting:%d\n", |
|---|
| 889 | | - hw_timer->err_ref_cnt); |
|---|
| 890 | | - } |
|---|
| 891 | | - |
|---|
| 892 | | - if (i == 4) { |
|---|
| 893 | | - hw_timer->is_reset_by_user = para[4]; |
|---|
| 894 | | - dev_info(hw->dev, |
|---|
| 895 | | - "reset by user:%d\n", |
|---|
| 896 | | - hw_timer->is_reset_by_user); |
|---|
| 897 | | - } |
|---|
| 898 | | - } |
|---|
| 899 | | - } else { |
|---|
| 900 | | - hw_timer->monitor_mode = RKCIF_MONITOR_MODE_IDLE; |
|---|
| 901 | | - hw_timer->err_time_interval = 0xffffffff; |
|---|
| 902 | | - hw_timer->monitor_cycle = 0xffffffff; |
|---|
| 903 | | - hw_timer->err_ref_cnt = 0xffffffff; |
|---|
| 904 | | - hw_timer->is_reset_by_user = 0; |
|---|
| 905 | | - } |
|---|
| 906 | | - |
|---|
| 907 | | - hw_timer->is_running = false; |
|---|
| 908 | | - spin_lock_init(&hw_timer->timer_lock); |
|---|
| 909 | | - hw->reset_info.is_need_reset = 0; |
|---|
| 910 | | - timer_setup(&hw_timer->timer, rkcif_reset_watchdog_timer_handler, 0); |
|---|
| 911 | | -} |
|---|
| 912 | | - |
|---|
| 913 | 1255 | static int rkcif_plat_hw_probe(struct platform_device *pdev) |
|---|
| 914 | 1256 | { |
|---|
| 915 | 1257 | const struct of_device_id *match; |
|---|
| .. | .. |
|---|
| 921 | 1263 | const struct rkcif_hw_match_data *data; |
|---|
| 922 | 1264 | struct resource *res; |
|---|
| 923 | 1265 | int i, ret, irq; |
|---|
| 1266 | + bool is_mem_reserved = false; |
|---|
| 1267 | + struct notifier_block *notifier; |
|---|
| 924 | 1268 | |
|---|
| 925 | 1269 | match = of_match_node(rkcif_plat_of_match, node); |
|---|
| 926 | 1270 | if (IS_ERR(match)) |
|---|
| .. | .. |
|---|
| 949 | 1293 | cif_hw->irq = irq; |
|---|
| 950 | 1294 | cif_hw->match_data = data; |
|---|
| 951 | 1295 | cif_hw->chip_id = data->chip_id; |
|---|
| 952 | | - if (data->chip_id == CHIP_RK1808_CIF || |
|---|
| 953 | | - data->chip_id == CHIP_RV1126_CIF || |
|---|
| 954 | | - data->chip_id == CHIP_RV1126_CIF_LITE || |
|---|
| 955 | | - data->chip_id == CHIP_RK3568_CIF) { |
|---|
| 1296 | + if (data->chip_id >= CHIP_RK1808_CIF) { |
|---|
| 956 | 1297 | res = platform_get_resource_byname(pdev, |
|---|
| 957 | 1298 | IORESOURCE_MEM, |
|---|
| 958 | 1299 | "cif_regs"); |
|---|
| .. | .. |
|---|
| 972 | 1313 | cif_hw->base_addr = devm_ioremap_resource(dev, res); |
|---|
| 973 | 1314 | if (IS_ERR(cif_hw->base_addr)) |
|---|
| 974 | 1315 | return PTR_ERR(cif_hw->base_addr); |
|---|
| 1316 | + } |
|---|
| 1317 | + |
|---|
| 1318 | + if (of_property_read_bool(np, "rockchip,android-usb-camerahal-enable")) { |
|---|
| 1319 | + dev_info(dev, "config cif adapt to android usb camera hal!\n"); |
|---|
| 1320 | + cif_hw->adapt_to_usbcamerahal = true; |
|---|
| 975 | 1321 | } |
|---|
| 976 | 1322 | |
|---|
| 977 | 1323 | cif_hw->grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); |
|---|
| .. | .. |
|---|
| 1003 | 1349 | if (data->rsts[i]) |
|---|
| 1004 | 1350 | rst = devm_reset_control_get(dev, data->rsts[i]); |
|---|
| 1005 | 1351 | if (IS_ERR(rst)) { |
|---|
| 1352 | + cif_hw->cif_rst[i] = NULL; |
|---|
| 1006 | 1353 | dev_err(dev, "failed to get %s\n", data->rsts[i]); |
|---|
| 1007 | | - return PTR_ERR(rst); |
|---|
| 1354 | + } else { |
|---|
| 1355 | + cif_hw->cif_rst[i] = rst; |
|---|
| 1008 | 1356 | } |
|---|
| 1009 | | - cif_hw->cif_rst[i] = rst; |
|---|
| 1010 | 1357 | } |
|---|
| 1011 | 1358 | |
|---|
| 1012 | 1359 | cif_hw->cif_regs = data->cif_regs; |
|---|
| 1013 | 1360 | |
|---|
| 1014 | | - cif_hw->iommu_en = is_iommu_enable(dev); |
|---|
| 1015 | | - if (!cif_hw->iommu_en) { |
|---|
| 1016 | | - ret = of_reserved_mem_device_init(dev); |
|---|
| 1017 | | - if (ret) |
|---|
| 1018 | | - dev_info(dev, "No reserved memory region assign to CIF\n"); |
|---|
| 1019 | | - } |
|---|
| 1361 | + cif_hw->is_dma_sg_ops = true; |
|---|
| 1362 | + cif_hw->is_dma_contig = true; |
|---|
| 1363 | + mutex_init(&cif_hw->dev_lock); |
|---|
| 1364 | + spin_lock_init(&cif_hw->group_lock); |
|---|
| 1365 | + atomic_set(&cif_hw->power_cnt, 0); |
|---|
| 1020 | 1366 | |
|---|
| 1021 | | - if (data->chip_id != CHIP_RK1808_CIF && |
|---|
| 1022 | | - data->chip_id != CHIP_RV1126_CIF && |
|---|
| 1023 | | - data->chip_id != CHIP_RV1126_CIF_LITE && |
|---|
| 1024 | | - data->chip_id != CHIP_RK3568_CIF) { |
|---|
| 1367 | + cif_hw->iommu_en = is_iommu_enable(dev); |
|---|
| 1368 | + ret = of_reserved_mem_device_init(dev); |
|---|
| 1369 | + if (ret) { |
|---|
| 1370 | + is_mem_reserved = false; |
|---|
| 1371 | + dev_info(dev, "No reserved memory region assign to CIF\n"); |
|---|
| 1372 | + } |
|---|
| 1373 | + if (cif_hw->iommu_en && !is_mem_reserved) |
|---|
| 1374 | + cif_hw->is_dma_contig = false; |
|---|
| 1375 | + cif_hw->mem_ops = &vb2_cma_sg_memops; |
|---|
| 1376 | + |
|---|
| 1377 | + if (data->chip_id < CHIP_RK1808_CIF) { |
|---|
| 1025 | 1378 | cif_dev = devm_kzalloc(dev, sizeof(*cif_dev), GFP_KERNEL); |
|---|
| 1026 | 1379 | if (!cif_dev) |
|---|
| 1027 | 1380 | return -ENOMEM; |
|---|
| .. | .. |
|---|
| 1036 | 1389 | return ret; |
|---|
| 1037 | 1390 | } |
|---|
| 1038 | 1391 | |
|---|
| 1039 | | - rkcif_hw_soft_reset(cif_hw, true); |
|---|
| 1040 | | - |
|---|
| 1041 | 1392 | mutex_init(&cif_hw->dev_lock); |
|---|
| 1042 | | - spin_lock_init(&cif_hw->spin_lock); |
|---|
| 1043 | 1393 | |
|---|
| 1044 | 1394 | pm_runtime_enable(&pdev->dev); |
|---|
| 1045 | | - rkcif_init_reset_timer(cif_hw); |
|---|
| 1046 | 1395 | |
|---|
| 1047 | | - if (data->chip_id == CHIP_RK1808_CIF || |
|---|
| 1048 | | - data->chip_id == CHIP_RV1126_CIF || |
|---|
| 1049 | | - data->chip_id == CHIP_RK3568_CIF) { |
|---|
| 1396 | + if (data->chip_id >= CHIP_RK1808_CIF && |
|---|
| 1397 | + data->chip_id != CHIP_RV1126_CIF_LITE) { |
|---|
| 1050 | 1398 | platform_driver_register(&rkcif_plat_drv); |
|---|
| 1051 | 1399 | platform_driver_register(&rkcif_subdev_driver); |
|---|
| 1052 | 1400 | } |
|---|
| 1401 | + |
|---|
| 1402 | + notifier = &cif_hw->reset_notifier; |
|---|
| 1403 | + notifier->priority = 1; |
|---|
| 1404 | + notifier->notifier_call = rkcif_reset_notifier; |
|---|
| 1405 | + rkcif_csi2_register_notifier(notifier); |
|---|
| 1053 | 1406 | |
|---|
| 1054 | 1407 | return 0; |
|---|
| 1055 | 1408 | } |
|---|
| .. | .. |
|---|
| 1063 | 1416 | rkcif_iommu_cleanup(cif_hw); |
|---|
| 1064 | 1417 | |
|---|
| 1065 | 1418 | mutex_destroy(&cif_hw->dev_lock); |
|---|
| 1066 | | - if (cif_hw->chip_id != CHIP_RK1808_CIF && |
|---|
| 1067 | | - cif_hw->chip_id != CHIP_RV1126_CIF && |
|---|
| 1068 | | - cif_hw->chip_id != CHIP_RV1126_CIF_LITE && |
|---|
| 1069 | | - cif_hw->chip_id != CHIP_RK3568_CIF) |
|---|
| 1419 | + if (cif_hw->chip_id < CHIP_RK1808_CIF) |
|---|
| 1070 | 1420 | rkcif_plat_uninit(cif_hw->cif_dev[0]); |
|---|
| 1071 | | - del_timer_sync(&cif_hw->hw_timer.timer); |
|---|
| 1421 | + |
|---|
| 1422 | + rkcif_csi2_unregister_notifier(&cif_hw->reset_notifier); |
|---|
| 1423 | + |
|---|
| 1072 | 1424 | return 0; |
|---|
| 1425 | +} |
|---|
| 1426 | + |
|---|
| 1427 | +static void rkcif_hw_shutdown(struct platform_device *pdev) |
|---|
| 1428 | +{ |
|---|
| 1429 | + struct rkcif_hw *cif_hw = platform_get_drvdata(pdev); |
|---|
| 1430 | + struct rkcif_device *cif_dev = NULL; |
|---|
| 1431 | + int i = 0; |
|---|
| 1432 | + |
|---|
| 1433 | + if (pm_runtime_get_if_in_use(&pdev->dev) <= 0) |
|---|
| 1434 | + return; |
|---|
| 1435 | + |
|---|
| 1436 | + if (cif_hw->chip_id == CHIP_RK3588_CIF || |
|---|
| 1437 | + cif_hw->chip_id == CHIP_RV1106_CIF || |
|---|
| 1438 | + cif_hw->chip_id == CHIP_RK3562_CIF) { |
|---|
| 1439 | + write_cif_reg(cif_hw->base_addr, 0, 0); |
|---|
| 1440 | + } else { |
|---|
| 1441 | + for (i = 0; i < cif_hw->dev_num; i++) { |
|---|
| 1442 | + cif_dev = cif_hw->cif_dev[i]; |
|---|
| 1443 | + if (atomic_read(&cif_dev->pipe.stream_cnt)) { |
|---|
| 1444 | + if (cif_dev->inf_id == RKCIF_MIPI_LVDS) |
|---|
| 1445 | + rkcif_write_register(cif_dev, |
|---|
| 1446 | + CIF_REG_MIPI_LVDS_CTRL, |
|---|
| 1447 | + 0); |
|---|
| 1448 | + else |
|---|
| 1449 | + rkcif_write_register(cif_dev, |
|---|
| 1450 | + CIF_REG_DVP_CTRL, |
|---|
| 1451 | + 0); |
|---|
| 1452 | + } |
|---|
| 1453 | + } |
|---|
| 1454 | + } |
|---|
| 1455 | + if (cif_hw->irq > 0) |
|---|
| 1456 | + disable_irq(cif_hw->irq); |
|---|
| 1457 | + pm_runtime_put(&pdev->dev); |
|---|
| 1073 | 1458 | } |
|---|
| 1074 | 1459 | |
|---|
| 1075 | 1460 | static int __maybe_unused rkcif_runtime_suspend(struct device *dev) |
|---|
| 1076 | 1461 | { |
|---|
| 1077 | 1462 | struct rkcif_hw *cif_hw = dev_get_drvdata(dev); |
|---|
| 1078 | 1463 | |
|---|
| 1464 | + if (atomic_dec_return(&cif_hw->power_cnt)) |
|---|
| 1465 | + return 0; |
|---|
| 1079 | 1466 | rkcif_disable_sys_clk(cif_hw); |
|---|
| 1080 | 1467 | |
|---|
| 1081 | 1468 | return pinctrl_pm_select_sleep_state(dev); |
|---|
| .. | .. |
|---|
| 1086 | 1473 | struct rkcif_hw *cif_hw = dev_get_drvdata(dev); |
|---|
| 1087 | 1474 | int ret; |
|---|
| 1088 | 1475 | |
|---|
| 1476 | + if (atomic_inc_return(&cif_hw->power_cnt) > 1) |
|---|
| 1477 | + return 0; |
|---|
| 1089 | 1478 | ret = pinctrl_pm_select_default_state(dev); |
|---|
| 1090 | 1479 | if (ret < 0) |
|---|
| 1091 | 1480 | return ret; |
|---|
| 1092 | 1481 | rkcif_enable_sys_clk(cif_hw); |
|---|
| 1482 | + rkcif_hw_soft_reset(cif_hw, true); |
|---|
| 1093 | 1483 | |
|---|
| 1094 | 1484 | return 0; |
|---|
| 1095 | 1485 | } |
|---|
| 1096 | 1486 | |
|---|
| 1097 | 1487 | static const struct dev_pm_ops rkcif_plat_pm_ops = { |
|---|
| 1098 | | - SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, |
|---|
| 1099 | | - pm_runtime_force_resume) |
|---|
| 1100 | 1488 | SET_RUNTIME_PM_OPS(rkcif_runtime_suspend, rkcif_runtime_resume, NULL) |
|---|
| 1101 | 1489 | }; |
|---|
| 1102 | 1490 | |
|---|
| .. | .. |
|---|
| 1108 | 1496 | }, |
|---|
| 1109 | 1497 | .probe = rkcif_plat_hw_probe, |
|---|
| 1110 | 1498 | .remove = rkcif_plat_remove, |
|---|
| 1499 | + .shutdown = rkcif_hw_shutdown, |
|---|
| 1111 | 1500 | }; |
|---|
| 1112 | 1501 | |
|---|
| 1113 | | -static int __init rk_cif_plat_drv_init(void) |
|---|
| 1502 | +int rk_cif_plat_drv_init(void) |
|---|
| 1114 | 1503 | { |
|---|
| 1115 | 1504 | int ret; |
|---|
| 1116 | 1505 | |
|---|
| .. | .. |
|---|
| 1126 | 1515 | rkcif_csi2_plat_drv_exit(); |
|---|
| 1127 | 1516 | } |
|---|
| 1128 | 1517 | |
|---|
| 1518 | +#if defined(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP) && !defined(CONFIG_INITCALL_ASYNC) |
|---|
| 1519 | +subsys_initcall(rk_cif_plat_drv_init); |
|---|
| 1520 | +#else |
|---|
| 1521 | +#if !defined(CONFIG_VIDEO_REVERSE_IMAGE) |
|---|
| 1129 | 1522 | module_init(rk_cif_plat_drv_init); |
|---|
| 1523 | +#endif |
|---|
| 1524 | +#endif |
|---|
| 1130 | 1525 | module_exit(rk_cif_plat_drv_exit); |
|---|
| 1131 | 1526 | |
|---|
| 1132 | 1527 | MODULE_AUTHOR("Rockchip Camera/ISP team"); |
|---|