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>
Esse commit está contido em:
Yu SI
2021-08-10 18:54:34 -07:00
commit c2d59a4698
3 arquivos alterados com 50 adições e 11 exclusões

Ver arquivo

@@ -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;
}
}

Ver arquivo

@@ -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);

Ver arquivo

@@ -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);