浏览代码

video: driver: set clk_rate to zero before clk_disable

Video driver clk scaling is through mmrm. So without informing
to mmrm if we disable_clk, then mmrm will hold stale peak_current
values and that will lead to incorrect calculations at mmrm side.
So always request to set lowest clk corner to mmrm before calling
clk_disable_unprepare() api.

Change-Id: I3e54249430ec4e886afb42f5af6863c7e40686c4
Signed-off-by: Govindaraj Rajagopal <[email protected]>
Govindaraj Rajagopal 3 年之前
父节点
当前提交
03471f2f11
共有 2 个文件被更改,包括 8 次插入1 次删除
  1. 4 1
      driver/variant/iris2/src/msm_vidc_iris2.c
  2. 4 0
      driver/vidc/src/venus_hfi.c

+ 4 - 1
driver/variant/iris2/src/msm_vidc_iris2.c

@@ -192,8 +192,9 @@ static int __disable_unprepare_clock_iris2(struct msm_vidc_core *core,
 		if (strcmp(cl->name, clk_name))
 		if (strcmp(cl->name, clk_name))
 			continue;
 			continue;
 		found = true;
 		found = true;
-
 		clk_disable_unprepare(cl->clk);
 		clk_disable_unprepare(cl->clk);
+		if (cl->has_scaling)
+			__set_clk_rate(core, cl, 0);
 		cl->prev = 0;
 		cl->prev = 0;
 		d_vpr_h("%s: clock %s disable unprepared\n", __func__, cl->name);
 		d_vpr_h("%s: clock %s disable unprepared\n", __func__, cl->name);
 		break;
 		break;
@@ -245,6 +246,8 @@ static int __prepare_enable_clock_iris2(struct msm_vidc_core *core,
 			d_vpr_e("%s: clock %s not enabled\n",
 			d_vpr_e("%s: clock %s not enabled\n",
 				__func__, cl->name);
 				__func__, cl->name);
 			clk_disable_unprepare(cl->clk);
 			clk_disable_unprepare(cl->clk);
+			if (cl->has_scaling)
+				__set_clk_rate(core, cl, 0);
 			return -EINVAL;
 			return -EINVAL;
 		}
 		}
 		d_vpr_h("%s: clock %s prepare enabled\n", __func__, cl->name);
 		d_vpr_h("%s: clock %s prepare enabled\n", __func__, cl->name);

+ 4 - 0
driver/vidc/src/venus_hfi.c

@@ -1560,6 +1560,8 @@ void __disable_unprepare_clks(struct msm_vidc_core *core)
 				__func__, cl->name);
 				__func__, cl->name);
 
 
 		clk_disable_unprepare(cl->clk);
 		clk_disable_unprepare(cl->clk);
+		if (cl->has_scaling)
+			__set_clk_rate(core, cl, 0);
 		cl->prev = 0;
 		cl->prev = 0;
 	}
 	}
 }
 }
@@ -1647,6 +1649,8 @@ fail_clk_enable:
 		d_vpr_e("Clock: %s disable and unprepare\n",
 		d_vpr_e("Clock: %s disable and unprepare\n",
 			cl->name);
 			cl->name);
 		clk_disable_unprepare(cl->clk);
 		clk_disable_unprepare(cl->clk);
+		if (cl->has_scaling)
+			__set_clk_rate(core, cl, 0);
 		cl->prev = 0;
 		cl->prev = 0;
 	}
 	}