瀏覽代碼

msm: camera: req_mgr: Fix deadlock in ICP driver in close

ICP driver is not releasing mutex in error scenario
in close sequence and causing deadlock further in open.

Fix the deadlock and avoid prints in other driver
while close in provider crash.

CRs-Fixed: 2938073
Change-Id: I226c9a8e9b2d0c30e90282b11fbd15ea0b085f87
Signed-off-by: Alok Chauhan <[email protected]>
Alok Chauhan 4 年之前
父節點
當前提交
777919597e

+ 2 - 2
drivers/cam_icp/cam_icp_subdev.c

@@ -107,8 +107,8 @@ int cam_icp_subdev_close_internal(struct v4l2_subdev *sd,
 
 	mutex_lock(&g_icp_dev.icp_lock);
 	if (g_icp_dev.open_cnt <= 0) {
-		CAM_WARN(CAM_ICP, "ICP subdev is already closed");
-		return 0;
+		CAM_DBG(CAM_ICP, "ICP subdev is already closed");
+		goto end;
 	}
 	g_icp_dev.open_cnt--;
 	if (!node) {

+ 1 - 1
drivers/cam_sensor_module/cam_actuator/cam_actuator_dev.c

@@ -34,7 +34,7 @@ static int cam_actuator_subdev_close(struct v4l2_subdev *sd,
 	bool crm_active = cam_req_mgr_is_open(CAM_ACTUATOR);
 
 	if (crm_active) {
-		CAM_INFO(CAM_ACTUATOR,
+		CAM_DBG(CAM_ACTUATOR,
 			"CRM is ACTIVE, close should be from CRM");
 		return 0;
 	}

+ 1 - 1
drivers/cam_sensor_module/cam_csiphy/cam_csiphy_dev.c

@@ -100,7 +100,7 @@ static int cam_csiphy_subdev_close(struct v4l2_subdev *sd,
 	bool crm_active = cam_req_mgr_is_open(CAM_CSIPHY);
 
 	if (crm_active) {
-		CAM_INFO(CAM_CSIPHY, "CRM is ACTIVE, close should be from CRM");
+		CAM_DBG(CAM_CSIPHY, "CRM is ACTIVE, close should be from CRM");
 		return 0;
 	}
 

+ 1 - 1
drivers/cam_sensor_module/cam_eeprom/cam_eeprom_dev.c

@@ -34,7 +34,7 @@ static int cam_eeprom_subdev_close(struct v4l2_subdev *sd,
 	bool crm_active = cam_req_mgr_is_open(CAM_EEPROM);
 
 	if (crm_active) {
-		CAM_INFO(CAM_EEPROM, "CRM is ACTIVE, close should be from CRM");
+		CAM_DBG(CAM_EEPROM, "CRM is ACTIVE, close should be from CRM");
 		return 0;
 	}
 

+ 1 - 1
drivers/cam_sensor_module/cam_flash/cam_flash_dev.c

@@ -260,7 +260,7 @@ static int cam_flash_subdev_close(struct v4l2_subdev *sd,
 	bool crm_active = cam_req_mgr_is_open(CAM_FLASH);
 
 	if (crm_active) {
-		CAM_INFO(CAM_FLASH, "CRM is ACTIVE, close should be from CRM");
+		CAM_DBG(CAM_FLASH, "CRM is ACTIVE, close should be from CRM");
 		return 0;
 	}
 

+ 1 - 1
drivers/cam_sensor_module/cam_ois/cam_ois_dev.c

@@ -34,7 +34,7 @@ static int cam_ois_subdev_close(struct v4l2_subdev *sd,
 	bool crm_active = cam_req_mgr_is_open(CAM_OIS);
 
 	if (crm_active) {
-		CAM_INFO(CAM_OIS, "CRM is ACTIVE, close should be from CRM");
+		CAM_DBG(CAM_OIS, "CRM is ACTIVE, close should be from CRM");
 		return 0;
 	}
 

+ 1 - 1
drivers/cam_sensor_module/cam_sensor/cam_sensor_dev.c

@@ -33,7 +33,7 @@ static int cam_sensor_subdev_close(struct v4l2_subdev *sd,
 	bool crm_active = cam_req_mgr_is_open(CAM_SENSOR);
 
 	if (crm_active) {
-		CAM_INFO(CAM_SENSOR, "CRM is ACTIVE, close should be from CRM");
+		CAM_DBG(CAM_SENSOR, "CRM is ACTIVE, close should be from CRM");
 		return 0;
 	}