Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3314d1a authored by Depeng Shao's avatar Depeng Shao
Browse files

msm: camera: cci: Move load report cmd in lock context



This change moves load report cmd in lock context,
then all sequence in one queue will be defined as
atomic queue commands without interruption from
the other queue commands.

CRs-Fixed: 3494720
Change-Id: Icda2271b580bd3f462c306ad0f229969a94079f6
Signed-off-by: default avatarDepeng Shao <quic_depengs@quicinc.com>
parent 608de04c
Loading
Loading
Loading
Loading
+35 −4
Original line number Diff line number Diff line
@@ -183,13 +183,39 @@ static int32_t cam_cci_lock_queue(struct cci_device *cci_dev,
	enum cci_i2c_master_t master,
	enum cci_i2c_queue_t queue, uint32_t en)
{
	uint32_t val;
	int32_t                 rc = 0;
	uint32_t                val = 0;
	uint32_t                read_val = 0;
	struct cam_hw_soc_info *soc_info =
		&cci_dev->soc_info;
	void __iomem           *base =
		soc_info->reg_map[0].mem_base;
	uint32_t                reg_offset =
		master * 0x200 + queue * 0x100;

	if (queue != PRIORITY_QUEUE)
		return 0;
		goto end;

	read_val = cam_io_r_mb(base +
		CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR + reg_offset);

	val = en ? CCI_I2C_LOCK_CMD : CCI_I2C_UNLOCK_CMD;
	return cam_cci_write_i2c_queue(cci_dev, val, master, queue);
	rc = cam_cci_write_i2c_queue(cci_dev, val, master, queue);

	if (rc) {
		CAM_ERR(CAM_CCI,
			"CCI%d_I2C_M%d_Q%d Failed to write i2c data:0x%x rc:%d",
			cci_dev->soc_info.index, master, queue, val, rc);
		goto end;
	}

	read_val++;

	cam_io_w_mb(read_val, base +
		CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR + reg_offset);

end:
	return rc;
}

#ifdef DUMP_CCI_REGISTERS
@@ -328,7 +354,6 @@ static int32_t cam_cci_wait_report_cmd(struct cci_device *cci_dev,

	uint32_t reg_val = 1 << ((master * 2) + queue);

	cam_cci_load_report_cmd(cci_dev, master, queue);
	spin_lock_irqsave(
		&cci_dev->cci_master_info[master].lock_q[queue], flags);
	atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 1);
@@ -353,6 +378,7 @@ static int32_t cam_cci_transfer_end(struct cci_device *cci_dev,
	if (atomic_read(&cci_dev->cci_master_info[master].q_free[queue]) == 0) {
		spin_unlock_irqrestore(
			&cci_dev->cci_master_info[master].lock_q[queue], flags);
		cam_cci_load_report_cmd(cci_dev, master, queue);
		rc = cam_cci_lock_queue(cci_dev, master, queue, 0);
		if (rc < 0) {
			CAM_ERR(CAM_CCI, "failed rc: %d", rc);
@@ -374,6 +400,7 @@ static int32_t cam_cci_transfer_end(struct cci_device *cci_dev,
			CAM_ERR(CAM_CCI, "failed rc %d", rc);
			return rc;
		}
		cam_cci_load_report_cmd(cci_dev, master, queue);
		rc = cam_cci_lock_queue(cci_dev, master, queue, 0);
		if (rc < 0) {
			CAM_ERR(CAM_CCI, "failed rc %d", rc);
@@ -453,6 +480,10 @@ static int32_t cam_cci_process_full_q(struct cci_device *cci_dev,
	} else {
		spin_unlock_irqrestore(
			&cci_dev->cci_master_info[master].lock_q[queue], flags);
		CAM_DBG(CAM_CCI, "CCI%d_I2C_M%d_Q%d is set to 0",
			cci_dev->soc_info.index, master, queue);

		cam_cci_load_report_cmd(cci_dev, master, queue);
		rc = cam_cci_wait_report_cmd(cci_dev, master, queue);
		if (rc < 0) {
			CAM_ERR(CAM_CCI, "failed rc %d", rc);