浏览代码

msm: camera: cci: Fix CCI Timeout during burst_read concurrency

During burst read concurrency, is_burst_read variable not updated
properly leading to missing th_complete signal. is_burst_read variable
updated per master to avoid concurrency issue.

CRs-Fixed: 2962232
Change-Id: Id741d48e0b9a6987b4aa7bc7361daf555d9bc587
Signed-off-by: Anil Kumar Kanakanti <[email protected]>
Anil Kumar Kanakanti 4 年之前
父节点
当前提交
d584013b1c

+ 3 - 5
drivers/cam_sensor_module/cam_cci/cam_cci_core.c

@@ -995,6 +995,7 @@ static int32_t cam_cci_burst_read(struct v4l2_subdev *sd,
 	}
 
 	mutex_lock(&cci_dev->cci_master_info[master].mutex_q[queue]);
+	cci_dev->is_burst_read[master] = true;
 	reinit_completion(&cci_dev->cci_master_info[master].report_q[queue]);
 
 	soc_info = &cci_dev->soc_info;
@@ -1266,6 +1267,7 @@ static int32_t cam_cci_read(struct v4l2_subdev *sd,
 	}
 
 	mutex_lock(&cci_dev->cci_master_info[master].mutex_q[queue]);
+	cci_dev->is_burst_read[master] = false;
 	reinit_completion(&cci_dev->cci_master_info[master].report_q[queue]);
 
 	soc_info = &cci_dev->soc_info;
@@ -1632,7 +1634,7 @@ static int32_t cam_cci_read_bytes_v_1_2(struct v4l2_subdev *sd,
 		else
 			read_cfg->num_byte = read_bytes;
 
-		cci_dev->is_burst_read = false;
+		cci_dev->is_burst_read[master] = false;
 		rc = cam_cci_read(sd, c_ctrl);
 		if (rc) {
 			CAM_ERR(CAM_CCI, "failed to read rc:%d", rc);
@@ -1649,7 +1651,6 @@ static int32_t cam_cci_read_bytes_v_1_2(struct v4l2_subdev *sd,
 	} while (read_bytes);
 
 ERROR:
-	cci_dev->is_burst_read = false;
 	return rc;
 }
 
@@ -1714,10 +1715,8 @@ static int32_t cam_cci_read_bytes(struct v4l2_subdev *sd,
 			read_cfg->num_byte = read_bytes;
 
 		if (read_cfg->num_byte >= CCI_READ_MAX) {
-			cci_dev->is_burst_read = true;
 			rc = cam_cci_burst_read(sd, c_ctrl);
 		} else {
-			cci_dev->is_burst_read = false;
 			rc = cam_cci_read(sd, c_ctrl);
 		}
 		if (rc) {
@@ -1736,7 +1735,6 @@ static int32_t cam_cci_read_bytes(struct v4l2_subdev *sd,
 	} while (read_bytes);
 
 ERROR:
-	cci_dev->is_burst_read = false;
 	return rc;
 }
 

+ 2 - 2
drivers/cam_sensor_module/cam_cci/cam_cci_dev.c

@@ -112,7 +112,7 @@ irqreturn_t cam_cci_irq(int irq_num, void *data)
 		(!rd_done_th_assert)) {
 		cci_dev->cci_master_info[MASTER_0].status = 0;
 		rd_done_th_assert = true;
-		if (cci_dev->is_burst_read)
+		if (cci_dev->is_burst_read[MASTER_0])
 			complete(
 			&cci_dev->cci_master_info[MASTER_0].th_complete);
 		complete(&cci_dev->cci_master_info[MASTER_0].rd_done);
@@ -168,7 +168,7 @@ irqreturn_t cam_cci_irq(int irq_num, void *data)
 		(!rd_done_th_assert)) {
 		cci_dev->cci_master_info[MASTER_1].status = 0;
 		rd_done_th_assert = true;
-		if (cci_dev->is_burst_read)
+		if (cci_dev->is_burst_read[MASTER_1])
 			complete(
 			&cci_dev->cci_master_info[MASTER_1].th_complete);
 		complete(&cci_dev->cci_master_info[MASTER_1].rd_done);

+ 1 - 1
drivers/cam_sensor_module/cam_cci/cam_cci_dev.h

@@ -225,7 +225,7 @@ struct cci_device {
 	uint32_t cpas_handle;
 	uint32_t irq_status1;
 	spinlock_t lock_status;
-	bool is_burst_read;
+	bool is_burst_read[MASTER_MAX];
 	uint32_t irqs_disabled;
 	struct mutex init_mutex;
 	uint64_t  dump_en;

+ 1 - 0
drivers/cam_sensor_module/cam_cci/cam_cci_soc.c

@@ -83,6 +83,7 @@ static int cam_cci_init_master(struct cci_device *cci_dev,
 
 		cci_dev->cci_master_info[master].status = 0;
 		cci_dev->cci_master_info[master].is_initilized = true;
+		cci_dev->is_burst_read[master] = false;
 	}
 
 	return 0;