Parcourir la source

msm: camera: icp: lock before updating clock status

Clock status can be updated in two ways, either through
timer or through the recovery. In case the clock is not
available during the recovery then it would try to access
registers which are unclocked. To prevent this before
updating the clock status spinlock should be acquired.

Change-Id: I16aea5e7dafacfe6b520699af195194d5d171c7c
Signed-off-by: Tejas Prajapati <[email protected]>
Signed-off-by: Jigarkumar Zala <[email protected]>
Jigarkumar Zala il y a 6 ans
Parent
commit
692d184a62

+ 5 - 0
drivers/cam_icp/icp_hw/bps_hw/bps_core.c

@@ -306,6 +306,7 @@ int cam_bps_process_cmd(void *device_priv, uint32_t cmd_type,
 	struct cam_bps_device_core_info *core_info = NULL;
 	struct cam_bps_device_hw_info *hw_info = NULL;
 	int rc = 0;
+	unsigned long flags;
 
 	if (!device_priv) {
 		CAM_ERR(CAM_ICP, "Invalid arguments");
@@ -395,12 +396,16 @@ int cam_bps_process_cmd(void *device_priv, uint32_t cmd_type,
 		}
 		break;
 	case CAM_ICP_BPS_CMD_DISABLE_CLK:
+		spin_lock_irqsave(&bps_dev->hw_lock, flags);
 		if (core_info->clk_enable == true)
 			cam_bps_toggle_clk(soc_info, false);
 		core_info->clk_enable = false;
+		spin_unlock_irqrestore(&bps_dev->hw_lock, flags);
 		break;
 	case CAM_ICP_BPS_CMD_RESET:
+		spin_lock_irqsave(&bps_dev->hw_lock, flags);
 		rc = cam_bps_cmd_reset(soc_info, core_info);
+		spin_unlock_irqrestore(&bps_dev->hw_lock, flags);
 		break;
 	default:
 		CAM_ERR(CAM_ICP, "Invalid Cmd Type:%u", cmd_type);

+ 5 - 0
drivers/cam_icp/icp_hw/ipe_hw/ipe_core.c

@@ -305,6 +305,7 @@ int cam_ipe_process_cmd(void *device_priv, uint32_t cmd_type,
 	struct cam_ipe_device_core_info *core_info = NULL;
 	struct cam_ipe_device_hw_info *hw_info = NULL;
 	int rc = 0;
+	unsigned long flags;
 
 	if (!device_priv) {
 		CAM_ERR(CAM_ICP, "Invalid arguments");
@@ -389,12 +390,16 @@ int cam_ipe_process_cmd(void *device_priv, uint32_t cmd_type,
 		}
 		break;
 	case CAM_ICP_IPE_CMD_DISABLE_CLK:
+		spin_lock_irqsave(&ipe_dev->hw_lock, flags);
 		if (core_info->clk_enable == true)
 			cam_ipe_toggle_clk(soc_info, false);
 		core_info->clk_enable = false;
+		spin_unlock_irqrestore(&ipe_dev->hw_lock, flags);
 		break;
 	case CAM_ICP_IPE_CMD_RESET:
+		spin_lock_irqsave(&ipe_dev->hw_lock, flags);
 		rc = cam_ipe_cmd_reset(soc_info, core_info);
+		spin_unlock_irqrestore(&ipe_dev->hw_lock, flags);
 		break;
 	default:
 		CAM_ERR(CAM_ICP, "Invalid Cmd Type:%u", cmd_type);