int32_t msm_camera_cci_i2c_write_conf_tbl( struct msm_camera_i2c_client *client, struct msm_camera_i2c_reg_conf *reg_conf_tbl, uint16_t size, enum msm_camera_i2c_data_type data_type) { int i; int32_t rc = -EFAULT; for (i = 0; i < size; i++) { enum msm_camera_i2c_data_type dt; if (reg_conf_tbl->cmd_type == MSM_CAMERA_I2C_CMD_POLL) { rc = msm_camera_cci_i2c_poll(client, reg_conf_tbl->reg_addr, reg_conf_tbl->reg_data, reg_conf_tbl->dt); } else { if (reg_conf_tbl->dt == 0) dt = data_type; else dt = reg_conf_tbl->dt; switch (dt) { case MSM_CAMERA_I2C_BYTE_DATA: case MSM_CAMERA_I2C_WORD_DATA: rc = msm_camera_cci_i2c_write( client, reg_conf_tbl->reg_addr, reg_conf_tbl->reg_data, dt); break; case MSM_CAMERA_I2C_SET_BYTE_MASK: rc = msm_camera_cci_i2c_set_mask(client, reg_conf_tbl->reg_addr, reg_conf_tbl->reg_data, MSM_CAMERA_I2C_BYTE_DATA, 1); break; case MSM_CAMERA_I2C_UNSET_BYTE_MASK: rc = msm_camera_cci_i2c_set_mask(client, reg_conf_tbl->reg_addr, reg_conf_tbl->reg_data, MSM_CAMERA_I2C_BYTE_DATA, 0); break; case MSM_CAMERA_I2C_SET_WORD_MASK: rc = msm_camera_cci_i2c_set_mask(client, reg_conf_tbl->reg_addr, reg_conf_tbl->reg_data, MSM_CAMERA_I2C_WORD_DATA, 1); break; case MSM_CAMERA_I2C_UNSET_WORD_MASK: rc = msm_camera_cci_i2c_set_mask(client, reg_conf_tbl->reg_addr, reg_conf_tbl->reg_data, MSM_CAMERA_I2C_WORD_DATA, 0); break; case MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA: rc = msm_camera_cci_i2c_set_write_mask_data( client, reg_conf_tbl->reg_addr, reg_conf_tbl->reg_data, reg_conf_tbl->mask, MSM_CAMERA_I2C_BYTE_DATA); break; default: pr_err("%s: Unsupport data type: %d\n", __func__, dt); break; } } if (rc < 0) break; reg_conf_tbl++; } return rc; }
int32_t msm_camera_cci_i2c_write_table( struct msm_camera_i2c_client *client, struct msm_camera_i2c_reg_setting *write_setting) { int32_t rc = -EFAULT; struct msm_camera_cci_ctrl cci_ctrl; int i; struct msm_camera_i2c_reg_array *reg_setting; uint16_t client_addr_type; int special_delay = 0; if (!client || !write_setting) return rc; reg_setting = write_setting->reg_setting; for (i = 0; i < write_setting->size; i++) { if (reg_setting->reg_addr == 0xffff) { special_delay = 1; break; } reg_setting++; } if ((write_setting->addr_type != MSM_CAMERA_I2C_BYTE_ADDR && write_setting->addr_type != MSM_CAMERA_I2C_WORD_ADDR) || (write_setting->data_type != MSM_CAMERA_I2C_BYTE_DATA && write_setting->data_type != MSM_CAMERA_I2C_WORD_DATA && write_setting->data_type != MSM_CAMERA_I2C_SET_BYTE_MASK && write_setting->data_type != MSM_CAMERA_I2C_UNSET_BYTE_MASK)) return rc; if (write_setting->size == 0) rc = 0; reg_setting = write_setting->reg_setting; client_addr_type = client->addr_type; client->addr_type = write_setting->addr_type; if (write_setting->data_type == MSM_CAMERA_I2C_SET_BYTE_MASK) { for (i = 0; i < write_setting->size; i++) { rc = msm_camera_cci_i2c_set_mask(client, reg_setting->reg_addr, reg_setting->reg_data, MSM_CAMERA_I2C_BYTE_DATA, 1); if (rc < 0) { pr_err("%s:%d failed, i = %d, rc = %d\n", __func__, __LINE__, i, rc); return rc; } reg_setting++; } } else if (write_setting->data_type == MSM_CAMERA_I2C_UNSET_BYTE_MASK) { for (i = 0; i < write_setting->size; i++) { rc = msm_camera_cci_i2c_set_mask(client, reg_setting->reg_addr, reg_setting->reg_data, MSM_CAMERA_I2C_BYTE_DATA, 0); if (rc < 0) { pr_err("%s:%d failed, i = %d, rc = %d\n", __func__, __LINE__, i, rc); return rc; } reg_setting++; } } else { if(special_delay == 0) { cci_ctrl.cmd = MSM_CCI_I2C_WRITE; cci_ctrl.cci_info = client->cci_client; cci_ctrl.cfg.cci_i2c_write_cfg.reg_setting = write_setting->reg_setting; cci_ctrl.cfg.cci_i2c_write_cfg.data_type = write_setting->data_type; cci_ctrl.cfg.cci_i2c_write_cfg.addr_type = client->addr_type; cci_ctrl.cfg.cci_i2c_write_cfg.size = write_setting->size; rc = v4l2_subdev_call(client->cci_client->cci_subdev, core, ioctl, VIDIOC_MSM_CCI_CFG, &cci_ctrl); if (rc < 0) { pr_err("%s: line %d rc = %d\n", __func__, __LINE__, rc); return rc; } rc = cci_ctrl.status; } else { for (i = 0; i < write_setting->size; i++) { if (reg_setting->reg_addr == 0xffff) { int delay = reg_setting->reg_data; msleep(delay); pr_info("%s: delay %d ms\n", __func__,delay); } else { rc = msm_camera_cci_i2c_write(client, reg_setting->reg_addr, reg_setting->reg_data, write_setting->data_type); if (rc < 0) { pr_err("%s: write addr(0x%x) data:0x%x fail\n", __func__,reg_setting->reg_addr, reg_setting->reg_data); return rc; } } reg_setting++; } } } if (write_setting->delay > 20) msleep(write_setting->delay); else if (write_setting->delay) usleep_range(write_setting->delay * 1000, (write_setting->delay * 1000) + 1000); return rc; }