v4l2: modify reset cause failed
authorchanghuang.liang <changhuang.liang@starfivetech.com>
Mon, 29 Aug 2022 07:03:22 +0000 (15:03 +0800)
committerchanghuang.liang <changhuang.liang@starfivetech.com>
Tue, 30 Aug 2022 01:06:55 +0000 (09:06 +0800)
modify reset and clk configure fixed reset signal failed

Signed-off-by: changhuang.liang <changhuang.liang@starfivetech.com>
drivers/media/platform/starfive/v4l2_driver/stf_csi_hw_ops.c
drivers/media/platform/starfive/v4l2_driver/stf_dvp_hw_ops.c
drivers/media/platform/starfive/v4l2_driver/stf_isp_hw_ops.c
drivers/media/platform/starfive/v4l2_driver/stf_vin_hw_ops.c

index d5201f0..44d4fa7 100644 (file)
@@ -85,8 +85,18 @@ static int stf_csi_clk_enable(struct stf_csi_dev *csi_dev)
        reset_control_deassert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF1].rstc);
        reset_control_deassert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF2].rstc);
        reset_control_deassert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF3].rstc);
-       reset_control_deassert(stfcamss->sys_rst[STFRST_AXIRD].rstc);
-       reset_control_deassert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
+
+       switch (csi_dev->s_type) {
+       case SENSOR_VIN:
+               reset_control_deassert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
+               clk_set_parent(stfcamss->sys_clk[STFCLK_AXIWR].clk,
+                       stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
+               break;
+       case SENSOR_ISP:
+               clk_set_parent(stfcamss->sys_clk[STFCLK_WRAPPER_CLK_C].clk,
+                       stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
+               break;
+       }
 
        return 0;
 }
@@ -95,17 +105,23 @@ static int stf_csi_clk_disable(struct stf_csi_dev *csi_dev)
 {
        struct stfcamss *stfcamss = csi_dev->stfcamss;
 
-       reset_control_assert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
-       reset_control_assert(stfcamss->sys_rst[STFRST_AXIRD].rstc);
+       switch (csi_dev->s_type) {
+       case SENSOR_VIN:
+               reset_control_assert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
+               break;
+       case SENSOR_ISP:
+               break;
+       }
+
        reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF3].rstc);
        reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF2].rstc);
        reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF1].rstc);
        reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF0].rstc);
 
-       clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF0].clk);
-       clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF1].clk);
-       clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF2].clk);
        clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF3].clk);
+       clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF2].clk);
+       clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF1].clk);
+       clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF0].clk);
 
        return 0;
 }
@@ -214,15 +230,11 @@ static void csi2rx_stop(struct stf_csi_dev *csi_dev, void *reg_base)
 static int stf_csi_stream_set(struct stf_csi_dev *csi_dev,
                                        int on, u32 dt, u32 width)
 {
-       struct stfcamss *stfcamss = csi_dev->stfcamss;
        struct stf_vin_dev *vin = csi_dev->stfcamss->vin;
        void __iomem *reg_base = vin->csi2rx_base;
 
        switch (csi_dev->s_type) {
        case SENSOR_VIN:
-               clk_set_parent(stfcamss->sys_clk[STFCLK_AXIWR].clk,
-                       stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
-
                reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_20,
                        BIT(3)|BIT(2)|BIT(1)|BIT(0),
                        0<<0);          //u0_vin_cnfg_axiwr0_channel_sel
@@ -237,9 +249,6 @@ static int stf_csi_stream_set(struct stf_csi_dev *csi_dev,
                        (width / 4 - 1)<<2);    //u0_vin_cnfg_axiwr0_pix_cnt_end
                break;
        case SENSOR_ISP:
-               clk_set_parent(stfcamss->sys_clk[STFCLK_WRAPPER_CLK_C].clk,
-                       stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
-
                reg_set_bit(vin->sysctrl_base,  SYSCONSAIF_SYSCFG_36,
                        BIT(7)|BIT(6),
                        0<<6);          //u0_vin_cnfg_mipi_byte_en_isp
@@ -255,8 +264,6 @@ static int stf_csi_stream_set(struct stf_csi_dev *csi_dev,
                                BIT(12),
                                1<<12);         //u0_vin_cnfg_p_i_mipi_header_en0
                break;
-       default:
-               break;
        }
 
        if (on)
index 965c12a..c618159 100644 (file)
@@ -10,18 +10,16 @@ static int stf_dvp_clk_enable(struct stf_dvp_dev *dvp_dev)
 
        switch (dvp_dev->s_type) {
        case SENSOR_VIN:
+               reset_control_deassert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
                clk_set_phase(stfcamss->sys_clk[STFCLK_DVP_INV].clk, 0);
                clk_set_parent(stfcamss->sys_clk[STFCLK_AXIWR].clk,
                        stfcamss->sys_clk[STFCLK_DVP_INV].clk);
-               reset_control_deassert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
                break;
        case SENSOR_ISP:
                clk_set_phase(stfcamss->sys_clk[STFCLK_DVP_INV].clk, 0);
                clk_set_parent(stfcamss->sys_clk[STFCLK_WRAPPER_CLK_C].clk,
                        stfcamss->sys_clk[STFCLK_DVP_INV].clk);
                break;
-       default:
-               break;
        }
 
        return 0;
@@ -31,8 +29,17 @@ static int stf_dvp_clk_disable(struct stf_dvp_dev *dvp_dev)
 {
        struct stfcamss *stfcamss = dvp_dev->stfcamss;
 
-       if (dvp_dev->s_type == SENSOR_VIN)
+       switch (dvp_dev->s_type) {
+       case SENSOR_VIN:
+               clk_set_parent(stfcamss->sys_clk[STFCLK_AXIWR].clk,
+                       stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
                reset_control_assert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
+               break;
+       case SENSOR_ISP:
+               clk_set_parent(stfcamss->sys_clk[STFCLK_WRAPPER_CLK_C].clk,
+                       stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
+               break;
+       }
 
        return 0;
 }
@@ -139,7 +146,6 @@ static int stf_dvp_set_format(struct stf_dvp_dev *dvp_dev,
 
 static int stf_dvp_stream_set(struct stf_dvp_dev *dvp_dev, int on)
 {
-       struct stfcamss *stfcamss = dvp_dev->stfcamss;
        struct stf_vin_dev *vin = dvp_dev->stfcamss->vin;
 
        switch (dvp_dev->s_type) {
@@ -165,8 +171,6 @@ static int stf_dvp_stream_set(struct stf_dvp_dev *dvp_dev, int on)
                        U0_VIN_CNFG_GEN_EN_AXIRD,
                        0);
                break;
-       default:
-               break;
        }
 
        return 0;
index 415cc72..d2e9021 100644 (file)
@@ -775,8 +775,7 @@ static int stf_isp_clk_disable(struct stf_isp_dev *isp_dev)
 {
        struct stfcamss *stfcamss = isp_dev->stfcamss;
 
-       //reset STFRST_WRAPPER_C would cause error
-       //reset_control_assert(stfcamss->sys_rst[STFRST_WRAPPER_C].rstc);
+       reset_control_assert(stfcamss->sys_rst[STFRST_WRAPPER_C].rstc);
        reset_control_assert(stfcamss->sys_rst[STFRST_WRAPPER_P].rstc);
        clk_disable_unprepare(stfcamss->sys_clk[STFCLK_WRAPPER_CLK_C].clk);
 
index 7854998..8080e2c 100644 (file)
@@ -288,7 +288,6 @@ static int stf_vin_config_set(struct stf_vin2_dev *vin_dev)
 
 static int stf_vin_wr_stream_set(struct stf_vin2_dev *vin_dev, int on)
 {
-       struct stfcamss *stfcamss = vin_dev->stfcamss;
        struct stf_vin_dev *vin = vin_dev->stfcamss->vin;
 
        //make the axiwr alway on