Pārlūkot izejas kodu

msm: camera: cdm: Fix cdm driver for single BL FIFO

Avoid iterating for masked BL fifos for single BL
fifo usecase. Also, Fix an if condition in cdm
workque function to check for fifo index correctly
for single BL FIFO usecase.

CRs-Fixed: 2893426
Change-Id: Id3c740a9d311863c0f08c331f9e5de992a721e30
Signed-off-by: Jigar Agrawal <[email protected]>
Jigar Agrawal 4 gadi atpakaļ
vecāks
revīzija
dce790a1e7
1 mainītis faili ar 9 papildinājumiem un 6 dzēšanām
  1. 9 6
      drivers/cam_cdm/cam_cdm_hw_core.c

+ 9 - 6
drivers/cam_cdm/cam_cdm_hw_core.c

@@ -1285,7 +1285,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);
@@ -1386,8 +1387,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
@@ -1420,8 +1420,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 &
@@ -1669,6 +1668,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)
@@ -1921,7 +1923,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;