Browse Source

msm: eva: set clk to 0 before mmrm deregistration

set clock value to 0 before call mmrm_client_deregister,
fixed an issue that peak cur value overshoot between SSRs.

Change-Id: I2b884614f0c9e1b19d63102277cad7b951fdd908
Signed-off-by: Yu SI <ysi@codeaurora.org>
Yu SI 3 years ago
parent
commit
c2d59a4698
3 changed files with 50 additions and 11 deletions
  1. 2 8
      msm/eva/cvp_hfi.c
  2. 47 3
      msm/eva/msm_cvp_clocks.c
  3. 1 0
      msm/eva/msm_cvp_clocks.h

+ 2 - 8
msm/eva/cvp_hfi.c

@@ -1882,17 +1882,11 @@ static int iris_hfi_core_release(void *dev)
 	__dsp_shutdown(device, 0);
 
 	if (msm_cvp_mmrm_enabled) {
-		rc = mmrm_client_deregister(device->mmrm_cvp);
+		rc = msm_cvp_mmrm_deregister(device);
 		if (rc) {
 			dprintk(CVP_ERR,
-				"%s: Failed mmrm_client_deregister with rc: %d\n",
+				"%s: Failed msm_cvp_mmrm_deregister:%d\n",
 				__func__, rc);
-		} else {
-			dprintk(CVP_PWR,
-				"%s: Succeed mmrm_client_deregister for mmrm_cvp:%pK, type:%d, uid:%ld\n",
-				__func__, device->mmrm_cvp, device->mmrm_cvp->client_type,
-				device->mmrm_cvp->client_uid);
-			device->mmrm_cvp = NULL;
 		}
 	}
 

+ 47 - 3
msm/eva/msm_cvp_clocks.c

@@ -88,12 +88,12 @@ int msm_cvp_mmrm_register(struct iris_hfi_device *device)
 	device->mmrm_cvp = mmrm_client_register(&(device->mmrm_desc));
 	if (device->mmrm_cvp == NULL) {
 		dprintk(CVP_ERR,
-			"%s: Failed mmrm_client_register with mmrm_cvp: %p\n",
+			"%s: Failed mmrm_client_register with mmrm_cvp: %pK\n",
 			__func__, device->mmrm_cvp);
 		rc = -ENOENT;
 	} else {
 		dprintk(CVP_PWR,
-			"%s: mmrm_client_register done: %p, type:%d, uid:%ld\n",
+			"%s: mmrm_client_register done: %pK, type:%d, uid:%ld\n",
 			__func__, device->mmrm_cvp,
 			device->mmrm_cvp->client_type,
 			device->mmrm_cvp->client_uid);
@@ -102,6 +102,50 @@ int msm_cvp_mmrm_register(struct iris_hfi_device *device)
 	return rc;
 }
 
+int msm_cvp_mmrm_deregister(struct iris_hfi_device *device)
+{
+	int rc = 0;
+	struct clock_info *cl = NULL;
+
+	if (!device || !device->mmrm_cvp) {
+		dprintk(CVP_ERR,
+			"%s invalid args: device %pK, or device->mmrm_cvp \n",
+			__func__, device);
+		return -EINVAL;
+	}
+
+	/* set clk value to 0 before deregister	*/
+	iris_hfi_for_each_clock(device, cl) {
+		if (cl->has_scaling) {
+			// set min freq and cur freq to 0;
+			rc = msm_cvp_mmrm_set_value_in_range(device,
+				0, 0);
+			if (rc) {
+				dprintk(CVP_ERR,
+					"%s Failed set clock %s: %d\n",
+					__func__, cl->name, rc);
+			}
+		}
+	}
+
+	rc = mmrm_client_deregister(device->mmrm_cvp);
+	if (rc) {
+		dprintk(CVP_ERR,
+			"%s: Failed mmrm_client_deregister with rc: %d\n",
+			__func__, rc);
+	}
+	else {
+		dprintk(CVP_PWR,
+			"%s: mmrm_client_deregister done:%pK,type:%d,uid:%ld\n",
+			__func__, device->mmrm_cvp,
+			device->mmrm_cvp->client_type,
+			device->mmrm_cvp->client_uid);
+		device->mmrm_cvp = NULL;
+	}
+
+	return rc;
+}
+
 int msm_cvp_mmrm_set_value_in_range(struct iris_hfi_device *device,
 	u32 freq_min, u32 freq_cur)
 {
@@ -115,7 +159,7 @@ int msm_cvp_mmrm_set_value_in_range(struct iris_hfi_device *device,
 	}
 
 	dprintk(CVP_PWR,
-		"%s: set clock rate for mmrm_cvp: %p, type :%d, uid: %ld\n",
+		"%s: set clock rate for mmrm_cvp: %pK, type :%d, uid: %ld\n",
 		__func__, device->mmrm_cvp,
 		device->mmrm_cvp->client_type, device->mmrm_cvp->client_uid);
 

+ 1 - 0
msm/eva/msm_cvp_clocks.h

@@ -11,6 +11,7 @@
 
 int msm_cvp_set_clocks(struct msm_cvp_core *core);
 int msm_cvp_mmrm_register(struct iris_hfi_device *device);
+int msm_cvp_mmrm_deregister(struct iris_hfi_device *device);
 int msm_cvp_mmrm_set_value_in_range(struct iris_hfi_device *device,
 		u32 freq_min, u32 freq_cur);
 int msm_cvp_set_clocks_impl(struct iris_hfi_device *device, u32 freq);