Pārlūkot izejas kodu

video: driver: set force mem and pheripheral on flags

Set mvs0c clock flags (force mem and pheripheral on).

Change-Id: I52380a30a4c74d9658f989377b5c77209cd8a33e
Signed-off-by: Maheshwar Ajja <[email protected]>
Maheshwar Ajja 2 gadi atpakaļ
vecāks
revīzija
4716d7bc72

+ 19 - 0
driver/variant/iris33/src/msm_vidc_iris33.c

@@ -434,6 +434,15 @@ static int __power_off_iris33_controller(struct msm_vidc_core *core)
 	rc = call_res_op(core, reset_control_assert, core, "video_axi_reset");
 	if (rc)
 		d_vpr_e("%s: assert video_axi_reset failed\n", __func__);
+	/* set retain mem and peripheral before asset mvs0c reset */
+	rc = call_res_op(core, clk_set_flag, core,
+		"video_cc_mvs0c_clk", CLKFLAG_RETAIN_MEM);
+	if (rc)
+		d_vpr_e("%s: set retain mem failed\n", __func__);
+	rc = call_res_op(core, clk_set_flag, core,
+		"video_cc_mvs0c_clk", CLKFLAG_RETAIN_PERIPH);
+	if (rc)
+		d_vpr_e("%s: set retain peripheral failed\n", __func__);
 	rc = call_res_op(core, reset_control_assert, core, "video_mvs0c_reset");
 	if (rc)
 		d_vpr_e("%s: assert video_mvs0c_reset failed\n", __func__);
@@ -487,6 +496,16 @@ static int __power_off_iris33_controller(struct msm_vidc_core *core)
 	if (rc)
 		return rc;
 
+        /* remove retain mem and retain peripheral */
+        rc = call_res_op(core, clk_set_flag, core,
+                "video_cc_mvs0c_clk", CLKFLAG_NORETAIN_PERIPH);
+        if (rc)
+                d_vpr_e("%s: set noretain peripheral failed\n", __func__);
+        rc = call_res_op(core, clk_set_flag, core,
+                "video_cc_mvs0c_clk", CLKFLAG_NORETAIN_MEM);
+        if (rc)
+                d_vpr_e("%s: set noretain mem failed\n", __func__);
+
 	/* Turn off MVP MVS0C core clock */
 	rc = call_res_op(core, clk_disable, core, "video_cc_mvs0c_clk");
 	if (rc) {

+ 4 - 0
driver/vidc/inc/resources.h

@@ -6,6 +6,8 @@
 #ifndef _MSM_VIDC_RESOURCES_H_
 #define _MSM_VIDC_RESOURCES_H_
 
+#include <linux/clk/qcom.h>
+
 struct icc_path;
 struct regulator;
 struct clk;
@@ -223,6 +225,8 @@ struct msm_vidc_resources_ops {
 
 	int (*clk_disable)(struct msm_vidc_core *core, const char *name);
 	int (*clk_enable)(struct msm_vidc_core *core, const char *name);
+	int (*clk_set_flag)(struct msm_vidc_core *core,
+		const char *name, enum branch_mem_flags flag);
 };
 
 const struct msm_vidc_resources_ops *get_resources_ops(void);

+ 23 - 0
driver/vidc/src/resources.c

@@ -346,6 +346,28 @@ static int __init_clocks(struct msm_vidc_core *core)
 	return rc;
 }
 
+static int __clock_set_flag(struct msm_vidc_core *core,
+	const char *name, enum branch_mem_flags flag)
+{
+        struct clock_info *cinfo = NULL;
+	bool found = false;
+
+        /* get clock handle */
+        venus_hfi_for_each_clock(core, cinfo) {
+		if (strcmp(cinfo->name, name))
+			continue;
+		found = true;
+		qcom_clk_set_flags(cinfo->clk, flag);
+		d_vpr_h("%s: set flag %d on clock %s\n", __func__, flag, name);
+		break;
+	}
+	if (!found) {
+		d_vpr_e("%s: failed to find clock: %s\n", __func__, name);
+		return -EINVAL;
+	}
+	return 0;
+}
+
 static int __init_reset_clocks(struct msm_vidc_core *core)
 {
 	const struct clk_rst_table *rst_tbl;
@@ -1437,6 +1459,7 @@ static const struct msm_vidc_resources_ops res_ops = {
 	.set_clks = __set_clocks,
 	.clk_enable = __prepare_enable_clock,
 	.clk_disable = __disable_unprepare_clock,
+	.clk_set_flag = __clock_set_flag,
 };
 
 const struct msm_vidc_resources_ops *get_resources_ops(void)