static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, uint32_t len, enum cci_i2c_master_t master, enum cci_i2c_queue_t queue) { int32_t rc = 0; uint32_t read_val = 0; uint32_t reg_offset = master * 0x200 + queue * 0x100; read_val = msm_camera_io_r(cci_dev->base + CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR + reg_offset); CDBG("%s line %d CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR %d len %d max %d\n", __func__, __LINE__, read_val, len, cci_dev->cci_i2c_queue_info[master][queue].max_queue_size); if ((read_val + len + 1) > cci_dev-> cci_i2c_queue_info[master][queue].max_queue_size) { uint32_t reg_val = 0; uint32_t report_val = CCI_I2C_REPORT_CMD | (1 << 8); CDBG("%s:%d CCI_I2C_REPORT_CMD\n", __func__, __LINE__); msm_camera_io_w(report_val, cci_dev->base + CCI_I2C_M0_Q0_LOAD_DATA_ADDR + reg_offset); read_val++; CDBG("%s:%d CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR %d\n", __func__, __LINE__, read_val); msm_camera_io_w(read_val, cci_dev->base + CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR + reg_offset); reg_val = 1 << ((master * 2) + queue); CDBG("%s:%d CCI_QUEUE_START_ADDR\n", __func__, __LINE__); msm_camera_io_w(reg_val, cci_dev->base + CCI_QUEUE_START_ADDR); CDBG("%s line %d wait_for_completion_interruptible\n", __func__, __LINE__); rc = wait_for_completion_interruptible_timeout(&cci_dev-> cci_master_info[master].reset_complete, CCI_TIMEOUT); if (rc == -ERESTARTSYS) { pr_err("%s:%d failed: rc %d", __func__, __LINE__, rc); } else if (rc <= 0) { pr_err("%s: wait_for_completion_interruptible_timeout %d\n", __func__, __LINE__); if (rc == 0) rc = -ETIMEDOUT; msm_cci_flush_queue(cci_dev, master); return rc; } else { rc = cci_dev->cci_master_info[master].status; if (rc < 0) pr_err("%s failed rc %d\n", __func__, rc); } } return rc; }
static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, uint32_t len, enum cci_i2c_master_t master, enum cci_i2c_queue_t queue) { int32_t rc = 0; uint32_t read_val = 0; uint32_t reg_offset = master * 0x200 + queue * 0x100; #if defined(CONFIG_SONY_CAM_V4L2) uint8_t retry_count = 0; #endif read_val = msm_camera_io_r(cci_dev->base + CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR + reg_offset); CDBG("%s line %d CCI_I2C_M0_Q0_CUR_WORD_CNT_ADDR %d len %d max %d\n", __func__, __LINE__, read_val, len, cci_dev->cci_i2c_queue_info[master][queue].max_queue_size); if ((read_val + len + 1) > cci_dev-> cci_i2c_queue_info[master][queue].max_queue_size) { uint32_t reg_val = 0; uint32_t report_val = CCI_I2C_REPORT_CMD | (1 << 8); CDBG("%s:%d CCI_I2C_REPORT_CMD\n", __func__, __LINE__); msm_camera_io_w(report_val, cci_dev->base + CCI_I2C_M0_Q0_LOAD_DATA_ADDR + reg_offset); read_val++; CDBG("%s:%d CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR %d\n", __func__, __LINE__, read_val); msm_camera_io_w(read_val, cci_dev->base + CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR + reg_offset); reg_val = 1 << ((master * 2) + queue); CDBG("%s:%d CCI_QUEUE_START_ADDR\n", __func__, __LINE__); msm_camera_io_w(reg_val, cci_dev->base + CCI_QUEUE_START_ADDR); CDBG("%s line %d wait_for_completion_interruptible\n", __func__, __LINE__); #if defined(CONFIG_SONY_CAM_V4L2) retry_count = 4; do { rc = wait_for_completion_interruptible_timeout( &cci_dev->cci_master_info[master].reset_complete , CCI_TIMEOUT); retry_count--; if (rc != -ERESTARTSYS) break; pr_debug("%s: wait_event interrupted by signal, count = %d", __func__, retry_count); msleep(20); } while (retry_count > 0); #else rc = wait_for_completion_interruptible_timeout(&cci_dev-> cci_master_info[master].reset_complete, CCI_TIMEOUT); #endif if (rc <= 0) { pr_err("%s: wait_for_completion_interruptible_timeout %d\n", __func__, __LINE__); if (rc == 0) rc = -ETIMEDOUT; msm_cci_flush_queue(cci_dev, master); return rc; } rc = cci_dev->cci_master_info[master].status; if (rc < 0) pr_err("%s failed rc %d\n", __func__, rc); } return rc; }