v4l2: use axi wr reset
authorchanghuang.liang <changhuang.liang@starfivetech.com>
Fri, 26 Aug 2022 03:43:19 +0000 (11:43 +0800)
committerchanghuang.liang <changhuang.liang@starfivetech.com>
Fri, 26 Aug 2022 07:01:51 +0000 (15:01 +0800)
use axi wr reset avoid stream off not clean

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

index ba00211..f6dfbab 100644 (file)
@@ -86,7 +86,7 @@ static int dvp_set_stream(struct v4l2_subdev *sd, int enable)
        mutex_lock(&dvp_dev->stream_lock);
        if (enable) {
                if (dvp_dev->stream_count == 0) {
-                       dvp_dev->hw_ops->dvp_clk_init(dvp_dev);
+                       dvp_dev->hw_ops->dvp_clk_enable(dvp_dev);
                        dvp_dev->hw_ops->dvp_config_set(dvp_dev);
                        dvp_dev->hw_ops->dvp_set_format(dvp_dev,
                                format->width, dvp_dev->formats[ret].bpp);
@@ -96,8 +96,10 @@ static int dvp_set_stream(struct v4l2_subdev *sd, int enable)
        } else {
                if (dvp_dev->stream_count == 0)
                        goto exit;
-               if (dvp_dev->stream_count == 1)
+               if (dvp_dev->stream_count == 1) {
                        dvp_dev->hw_ops->dvp_stream_set(dvp_dev, 0);
+                       dvp_dev->hw_ops->dvp_clk_disable(dvp_dev);
+               }
                dvp_dev->stream_count--;
        }
 exit:
index b61a71f..41b2ae4 100644 (file)
@@ -33,7 +33,8 @@ struct dvp_cfg {
 struct stf_dvp_dev;
 
 struct dvp_hw_ops {
-       int (*dvp_clk_init)(struct stf_dvp_dev *dvp_dev);
+       int (*dvp_clk_enable)(struct stf_dvp_dev *dvp_dev);
+       int (*dvp_clk_disable)(struct stf_dvp_dev *dvp_dev);
        int (*dvp_config_set)(struct stf_dvp_dev *dvp_dev);
        int (*dvp_set_format)(struct stf_dvp_dev *dvp_dev,
                        u32 pix_width, u8 bpp);
index 1ad3c1e..965c12a 100644 (file)
@@ -4,11 +4,35 @@
  */
 #include "stfcamss.h"
 
-static int stf_dvp_clk_init(struct stf_dvp_dev *dvp_dev)
+static int stf_dvp_clk_enable(struct stf_dvp_dev *dvp_dev)
 {
        struct stfcamss *stfcamss = dvp_dev->stfcamss;
 
-       clk_set_phase(stfcamss->sys_clk[STFCLK_DVP_INV].clk, 0);
+       switch (dvp_dev->s_type) {
+       case SENSOR_VIN:
+               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;
+}
+
+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)
+               reset_control_assert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
 
        return 0;
 }
@@ -120,9 +144,6 @@ static int stf_dvp_stream_set(struct stf_dvp_dev *dvp_dev, int on)
 
        switch (dvp_dev->s_type) {
        case SENSOR_VIN:
-               clk_set_parent(stfcamss->sys_clk[STFCLK_AXIWR].clk,
-                       stfcamss->sys_clk[STFCLK_DVP_INV].clk);
-
                reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_36,
                        U0_VIN_CNFG_ISP_DVP_EN0,
                        0);
@@ -131,9 +152,6 @@ static int stf_dvp_stream_set(struct stf_dvp_dev *dvp_dev, int on)
                        !!on<<2);
                break;
        case SENSOR_ISP:
-               clk_set_parent(stfcamss->sys_clk[STFCLK_WRAPPER_CLK_C].clk,
-                       stfcamss->sys_clk[STFCLK_DVP_INV].clk);
-
                reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_36,
                        U0_VIN_CNFG_ISP_DVP_EN0,
                        !!on<<5);
@@ -155,7 +173,8 @@ static int stf_dvp_stream_set(struct stf_dvp_dev *dvp_dev, int on)
 }
 
 struct dvp_hw_ops dvp_ops = {
-       .dvp_clk_init          = stf_dvp_clk_init,
+       .dvp_clk_enable        = stf_dvp_clk_enable,
+       .dvp_clk_disable       = stf_dvp_clk_disable,
        .dvp_config_set        = stf_dvp_config_set,
        .dvp_set_format        = stf_dvp_set_format,
        .dvp_stream_set        = stf_dvp_stream_set,
index 8a670e1..7854998 100644 (file)
@@ -292,10 +292,8 @@ static int stf_vin_wr_stream_set(struct stf_vin2_dev *vin_dev, int on)
        struct stf_vin_dev *vin = vin_dev->stfcamss->vin;
 
        //make the axiwr alway on
-       if (on) {
-               reset_control_deassert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
+       if (on)
                reg_set(vin->sysctrl_base, SYSCONSAIF_SYSCFG_20, U0_VIN_CNFG_AXIWR0_EN);
-       }
 
        return 0;
 }