Browse Source

Merge "msm: camera: cdm: Fix cdm driver for single BL FIFO" into camera-kernel.lnx.5.0

Savita Patted 4 years ago
parent
commit
af5d84791b
1 changed files with 9 additions and 6 deletions
  1. 9 6
      drivers/cam_cdm/cam_cdm_hw_core.c

+ 9 - 6
drivers/cam_cdm/cam_cdm_hw_core.c

@@ -1286,7 +1286,8 @@ static void cam_hw_cdm_work(struct work_struct *work)
 	cdm_hw = payload->hw;
 	core = (struct cam_cdm *)cdm_hw->core_info;
 	fifo_idx = payload->fifo_idx;
-	if (fifo_idx >= core->offsets->reg_data->num_bl_fifo) {
+	if ((fifo_idx >= core->offsets->reg_data->num_bl_fifo) ||
+		(!core->bl_fifo[fifo_idx].bl_depth)) {
 		CAM_ERR(CAM_CDM, "Invalid fifo idx %d",
 			fifo_idx);
 		kfree(payload);
@@ -1387,8 +1388,7 @@ static void cam_hw_cdm_work(struct work_struct *work)
 			cdm_hw->soc_info.index, payload->irq_status);
 		set_bit(CAM_CDM_ERROR_HW_STATUS, &core->cdm_status);
 		mutex_lock(&cdm_hw->hw_mutex);
-		for (i = 0; i < core->offsets->reg_data->num_bl_fifo;
-				i++)
+		for (i = 0; i < core->offsets->reg_data->num_bl_fifo; i++)
 			mutex_lock(&core->bl_fifo[i].fifo_lock);
 		/*
 		 * First pause CDM, If it fails still proceed
@@ -1421,8 +1421,7 @@ static void cam_hw_cdm_work(struct work_struct *work)
 		}
 		/* Resume CDM back */
 		cam_hw_cdm_pause_core(cdm_hw, false);
-		for (i = 0; i < core->offsets->reg_data->num_bl_fifo;
-				i++)
+		for (i = 0; i < core->offsets->reg_data->num_bl_fifo; i++)
 			mutex_unlock(&core->bl_fifo[i].fifo_lock);
 
 		if (payload->irq_status &
@@ -1670,6 +1669,9 @@ int cam_hw_cdm_release_genirq_mem(void *hw_priv)
 
 	cdm_core = (struct cam_cdm *)cdm_hw->core_info;
 	for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++) {
+		if (!cdm_core->bl_fifo[i].bl_depth)
+			continue;
+
 		genirq_release_cmd.mem_handle = cdm_core->gen_irq[i].handle;
 		rc = cam_mem_mgr_release_mem(&genirq_release_cmd);
 		if (rc)
@@ -1924,7 +1926,8 @@ int cam_hw_cdm_hang_detect(
 	for (i = 0; i < cdm_core->offsets->reg_data->num_bl_fifo; i++)
 		if (atomic_read(&cdm_core->bl_fifo[i].work_record)) {
 			CAM_WARN(CAM_CDM,
-				"workqueue got delayed, work_record :%u",
+				"fifo: %d Workqueue got delayed, work_record :%u",
+				i,
 				atomic_read(&cdm_core->bl_fifo[i].work_record));
 			rc = 0;
 			break;