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

Commit 5b3e0f57 authored by Camera Software Integration's avatar Camera Software Integration Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: cci: Move load report cmd in lock context" into camera-kernel.lnx.1.0

parents d42d9bdd a3314d1a
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);