Selaa lähdekoodia

msm: eva: reorder MMRM Dereg in release seq &cleanup

re-order the mmrm deregister call in core release sequence;
set eva mmrm client structure ptr to NULL after deregister;
re-arrange the error handling code;
in mmrm dereg check if clk enabled before call set value to 0,
since already set value to 0 once when unprepare & disable clk.

Change-Id: Ia89919e219ffda94a19b5214e91f1b3adc575086
Signed-off-by: Yu SI <[email protected]>
Yu SI 3 vuotta sitten
vanhempi
sitoutus
16375cefa4
2 muutettua tiedostoa jossa 15 lisäystä ja 10 poistoa
  1. 12 9
      msm/eva/cvp_hfi.c
  2. 3 1
      msm/eva/msm_cvp_clocks.c

+ 12 - 9
msm/eva/cvp_hfi.c

@@ -1796,7 +1796,7 @@ static int iris_hfi_core_init(void *device)
 	if (rc) {
 		dprintk(CVP_ERR, "failed to init queues\n");
 		rc = -ENOMEM;
-		goto err_mmrm_dereg;
+		goto err_core_init;
 	}
 
 	rc = msm_cvp_map_ipcc_regs(&ipcc_iova);
@@ -1809,7 +1809,7 @@ static int iris_hfi_core_init(void *device)
 	if (rc) {
 		dprintk(CVP_ERR, "Failed to start core\n");
 		rc = -ENODEV;
-		goto err_mmrm_dereg;
+		goto err_core_init;
 	}
 
 	dev->version = __read_register(dev, CVP_VERSION_INFO);
@@ -1817,12 +1817,12 @@ static int iris_hfi_core_init(void *device)
 	rc =  call_hfi_pkt_op(dev, sys_init, &pkt, 0);
 	if (rc) {
 		dprintk(CVP_ERR, "Failed to create sys init pkt\n");
-		goto err_mmrm_dereg;
+		goto err_core_init;
 	}
 
 	if (__iface_cmdq_write(dev, &pkt)) {
 		rc = -ENOTEMPTY;
-		goto err_mmrm_dereg;
+		goto err_core_init;
 	}
 
 	rc = call_hfi_pkt_op(dev, sys_image_version, &version_pkt);
@@ -1848,11 +1848,14 @@ static int iris_hfi_core_init(void *device)
 	dprintk(CVP_CORE, "Core inited successfully\n");
 
 	return 0;
-err_mmrm_dereg:
-	msm_cvp_mmrm_deregister(dev);
+
 err_core_init:
 	__set_state(dev, IRIS_STATE_DEINIT);
 	__unload_fw(dev);
+	if (dev->mmrm_cvp)
+	{
+		msm_cvp_mmrm_deregister(dev);
+	}
 err_load_fw:
 err_no_mem:
 	dprintk(CVP_ERR, "Core init failed\n");
@@ -1882,6 +1885,9 @@ static int iris_hfi_core_release(void *dev)
 
 	__dsp_shutdown(device, 0);
 
+	__disable_subcaches(device);
+	__unload_fw(device);
+
 	if (msm_cvp_mmrm_enabled) {
 		rc = msm_cvp_mmrm_deregister(device);
 		if (rc) {
@@ -1891,9 +1897,6 @@ static int iris_hfi_core_release(void *dev)
 		}
 	}
 
-	__disable_subcaches(device);
-	__unload_fw(device);
-
 	/* unlink all sessions from device */
 	list_for_each_entry_safe(session, next, &device->sess_head, list) {
 		list_del(&session->list);

+ 3 - 1
msm/eva/msm_cvp_clocks.c

@@ -116,7 +116,7 @@ int msm_cvp_mmrm_deregister(struct iris_hfi_device *device)
 
 	/* set clk value to 0 before deregister	*/
 	iris_hfi_for_each_clock(device, cl) {
-		if (cl->has_scaling) {
+		if ((cl->has_scaling) && (__clk_is_enabled(cl->clk))){
 			// set min freq and cur freq to 0;
 			rc = msm_cvp_mmrm_set_value_in_range(device,
 				0, 0);
@@ -135,6 +135,8 @@ int msm_cvp_mmrm_deregister(struct iris_hfi_device *device)
 			__func__, rc);
 	}
 
+	device->mmrm_cvp = NULL;
+
 	return rc;
 }