diff --git a/drivers/media/video/msm/sensors/msm_sensor.c b/drivers/media/video/msm/sensors/msm_sensor.c index c0e06f8207a..9fbbd489d56 100644 --- a/drivers/media/video/msm/sensors/msm_sensor.c +++ b/drivers/media/video/msm/sensors/msm_sensor.c @@ -617,6 +617,18 @@ int32_t msm_sensor_config(struct msm_sensor_ctrl_t *s_ctrl, void __user *argp) cdata.cfg.exp_compensation); break; + case CFG_GET_AF_CALIB: + if (s_ctrl->func_tbl->sensor_get_af_calib) + s_ctrl->func_tbl->sensor_get_af_calib(s_ctrl, + &cdata.cfg.sensor_otp_afcalib); + else + rc = -EIO; + + if (copy_to_user((void *)argp, + &cdata, + sizeof(cdata))) + rc = -EFAULT; + break; default: rc = -EFAULT; break; diff --git a/drivers/media/video/msm/sensors/msm_sensor.h b/drivers/media/video/msm/sensors/msm_sensor.h index 94b0e2bfb1b..24a01a048fd 100644 --- a/drivers/media/video/msm/sensors/msm_sensor.h +++ b/drivers/media/video/msm/sensors/msm_sensor.h @@ -157,6 +157,8 @@ struct msm_sensor_fn_t { (struct msm_sensor_ctrl_t *, int); int32_t (*sensor_set_ev) (struct msm_sensor_ctrl_t *, int); + void (*sensor_get_af_calib)(struct msm_sensor_ctrl_t *s_ctrl, + struct msm_calib_af *); }; struct msm_sensor_csi_info { diff --git a/drivers/media/video/msm/sensors/ov5693_v4l2.c b/drivers/media/video/msm/sensors/ov5693_v4l2.c index 5154e435d02..8badbd5ce41 100644 --- a/drivers/media/video/msm/sensors/ov5693_v4l2.c +++ b/drivers/media/video/msm/sensors/ov5693_v4l2.c @@ -32,6 +32,7 @@ #define OTP_BANK_START 0x3D00 static struct msm_sensor_ctrl_t ov5693_s_ctrl; +static struct msm_calib_af ov5693_af_position; DEFINE_MUTEX(ov5693_mut); @@ -160,6 +161,56 @@ static int32_t ov5693_write_exp_gain(struct msm_sensor_ctrl_t *s_ctrl, return 0; } + +static void ov5693_read_afcal(struct msm_sensor_ctrl_t *s_ctrl, + struct msm_calib_af *af_pos) +{ + uint8_t data[2]; + uint16_t address; + + /* select otp bank 1 */ + msm_camera_i2c_write(s_ctrl->sensor_i2c_client, OTP_BANK_SELECT, 0xc1, + MSM_CAMERA_I2C_BYTE_DATA); + + /* load otp */ + msm_camera_i2c_write(s_ctrl->sensor_i2c_client, OTP_LOAD_DUMP, 0x01, + MSM_CAMERA_I2C_BYTE_DATA); + + /* read inf */ + address = OTP_BANK_START; + msm_camera_i2c_read_seq(s_ctrl->sensor_i2c_client, address, data, 2); + + af_pos->inf_dac = data[0] << 8 | data[1]; + + /* read 1m */ + address += 2; +/* msm_camera_i2c_read_seq(s_ctrl->sensor_i2c_client, address, data, 2); */ + + /* read mac */ + address += 2; + msm_camera_i2c_read_seq(s_ctrl->sensor_i2c_client, address, data, 2); + + af_pos->macro_dac = data[0] << 8 | data[1]; + + /* read start position */ + address += 2; + msm_camera_i2c_read_seq(s_ctrl->sensor_i2c_client, address, data, 2); + + af_pos->start_dac = data[0] << 8 | data[1]; + + pr_info("* inf = 0x%x * mac = 0x%x * start = 0x%x", + af_pos->inf_dac, af_pos->macro_dac, af_pos->start_dac); + + CDBG("OTP inf = 0x%x", af_pos->inf_dac); + CDBG("OTP mac = 0x%x", af_pos->macro_dac); + CDBG("OTP start = 0x%x", af_pos->start_dac); +} + +static void ov5693_read_otp(struct msm_sensor_ctrl_t *s_ctrl) +{ + ov5693_read_afcal(s_ctrl, &ov5693_af_position); +} + int32_t ov5693_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, int update_type, int res) { @@ -170,6 +221,13 @@ int32_t ov5693_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, if (update_type == MSM_SENSOR_REG_INIT) { s_ctrl->curr_csi_params = NULL; msm_sensor_write_init_settings(s_ctrl); + + msm_camera_i2c_write(s_ctrl->sensor_i2c_client, 0x100, 0x1, + MSM_CAMERA_I2C_BYTE_DATA); + ov5693_read_otp(s_ctrl); + msm_camera_i2c_write(s_ctrl->sensor_i2c_client, 0x100, 0x0, + MSM_CAMERA_I2C_BYTE_DATA); + } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) { msm_sensor_write_res_settings(s_ctrl, res); @@ -200,6 +258,19 @@ int32_t ov5693_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, } return rc; } + +void ov5693_get_af_calib(struct msm_sensor_ctrl_t *s_ctrl, + struct msm_calib_af *af) +{ + af->inf_dac = ov5693_af_position.inf_dac; + af->macro_dac = ov5693_af_position.macro_dac; + af->start_dac = ov5693_af_position.start_dac; + + CDBG("* inf = 0x%x", af->inf_dac); + CDBG("* mac = 0x%x", af->macro_dac); + CDBG("* start = 0x%x", af->start_dac); +} + static const struct i2c_device_id ov5693_i2c_id[] = { {SENSOR_NAME, (kernel_ulong_t)&ov5693_s_ctrl}, { } @@ -700,6 +771,7 @@ static struct msm_sensor_fn_t ov5693_func_tbl = { .sensor_power_up = ov5693_sensor_power_up, .sensor_power_down = ov5693_sensor_power_down, .sensor_get_csi_params = msm_sensor_get_csi_params, + .sensor_get_af_calib = ov5693_get_af_calib, }; static struct msm_sensor_reg_t ov5693_regs = { diff --git a/include/media/msm_camera.h b/include/media/msm_camera.h old mode 100755 new mode 100644 index 1825b5c8506..fb6a3e53dab --- a/include/media/msm_camera.h +++ b/include/media/msm_camera.h @@ -910,7 +910,8 @@ struct msm_snapshot_pp_status { #define CFG_START_STREAM 44 #define CFG_STOP_STREAM 45 #define CFG_GET_CSI_PARAMS 46 -#define CFG_MAX 47 +#define CFG_GET_AF_CALIB 47 +#define CFG_MAX 48 #define MOVE_NEAR 0 #define MOVE_FAR 1 @@ -1360,6 +1361,12 @@ struct ispif_cfg_data { } cfg; }; +struct msm_calib_af { + uint16_t macro_dac; + uint16_t inf_dac; + uint16_t start_dac; +}; + struct sensor_cfg_data { int cfgtype; int mode; @@ -1387,6 +1394,7 @@ struct sensor_cfg_data { struct sensor_output_info_t output_info; struct msm_eeprom_data_t eeprom_data; struct csi_lane_params_t csi_lane_params; + struct msm_calib_af sensor_otp_afcalib; /* QRD */ uint16_t antibanding; uint8_t contrast; @@ -1533,12 +1541,6 @@ struct msm_calib_wb { uint16_t gr_over_gb; }; -struct msm_calib_af { - uint16_t macro_dac; - uint16_t inf_dac; - uint16_t start_dac; -}; - struct msm_calib_lsc { uint16_t r_gain[221]; uint16_t b_gain[221];