浏览代码

msm: camera: cdm: Fix component unbind failures in cdm hw

In cdm hw unbind, smmu handle is destroyed before handler is
unset. Also, mutex unlock is unbalanced during error case. Fix
invalid unset handler call and unbalanced mutex in component
unbind for hw cdm.

CRs-Fixed: 2584631
Change-Id: I8e117ce9623ba631d9457ef851b8f271591091b6
Signed-off-by: Mukund Madhusudan Atre <[email protected]>
Mukund Madhusudan Atre 5 年之前
父节点
当前提交
afb504ab34
共有 2 个文件被更改,包括 3 次插入4 次删除
  1. 2 2
      drivers/cam_cdm/cam_cdm_hw_core.c
  2. 1 2
      drivers/cam_cdm/cam_cdm_intf.c

+ 2 - 2
drivers/cam_cdm/cam_cdm_hw_core.c

@@ -1894,10 +1894,10 @@ static void cam_hw_cdm_component_unbind(struct device *dev,
 		destroy_workqueue(cdm_core->bl_fifo[i].work_queue);
 	}
 
-	if (cam_smmu_destroy_handle(cdm_core->iommu_hdl.non_secure))
-		CAM_ERR(CAM_CDM, "Release iommu secure hdl failed");
 	cam_smmu_unset_client_page_fault_handler(
 		cdm_core->iommu_hdl.non_secure, cdm_hw);
+	if (cam_smmu_destroy_handle(cdm_core->iommu_hdl.non_secure))
+		CAM_ERR(CAM_CDM, "Release iommu secure hdl failed");
 
 	mutex_destroy(&cdm_hw->hw_mutex);
 	kfree(cdm_hw->soc_info.soc_private);

+ 1 - 2
drivers/cam_cdm/cam_cdm_intf.c

@@ -620,7 +620,7 @@ static void cam_cdm_intf_component_unbind(struct device *dev,
 
 	if (cam_virtual_cdm_remove(pdev)) {
 		CAM_ERR(CAM_CDM, "Virtual CDM remove failed");
-		goto end;
+		return;
 	}
 	put_cdm_mgr_refcount();
 
@@ -635,7 +635,6 @@ static void cam_cdm_intf_component_unbind(struct device *dev,
 		if (cdm_mgr.nodes[i].device || cdm_mgr.nodes[i].data ||
 			(cdm_mgr.nodes[i].refcount != 0)) {
 			CAM_ERR(CAM_CDM, "Valid node present in index=%d", i);
-			mutex_unlock(&cam_cdm_mgr_lock);
 			goto end;
 		}
 		mutex_destroy(&cdm_mgr.nodes[i].lock);