int32_t msm_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, int update_type, int res) { int32_t rc = 0; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_OFF_IMMEDIATELY)); printk("%s:[F_PANTECH_CAMERA] %d, %d res=%d\n", __func__, __LINE__,update_type,res); if (s_ctrl->func_tbl->sensor_stop_stream) s_ctrl->func_tbl->sensor_stop_stream(s_ctrl); msleep(30); if (update_type == MSM_SENSOR_REG_INIT) { s_ctrl->curr_csi_params = NULL; msm_sensor_enable_debugfs(s_ctrl); msm_sensor_write_init_settings(s_ctrl); } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) { msm_sensor_write_res_settings(s_ctrl, res); if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) { printk("%s:[F_PANTECH_CAMERA] ==> MIPI setting E %d\n", __func__, update_type); s_ctrl->curr_csi_params = s_ctrl->csi_params[res]; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CID_CHANGE, NULL); mb(); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); msleep(20); printk("%s:[F_PANTECH_CAMERA] ==> MIPI setting X %d\n", __func__, update_type); } v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[res].op_pixel_clk); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); if (s_ctrl->func_tbl->sensor_start_stream) { //printk("%s:kernal delay start %d x\n", __func__, __LINE__); msleep(30); // 02.03 bsy pink ¡þO?oA¡þO?? //printk("%s: kernal delay end%d x\n", __func__, __LINE__); s_ctrl->func_tbl->sensor_start_stream(s_ctrl); } msleep(30); } return rc; }
int32_t msm_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, int update_type, int res) { int32_t rc = 0; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_OFF_IMMEDIATELY)); s_ctrl->func_tbl->sensor_stop_stream(s_ctrl); msleep(30); if (update_type == MSM_SENSOR_REG_INIT) { s_ctrl->curr_csi_params = NULL; msm_sensor_enable_debugfs(s_ctrl); #if !defined(DVE005_CAMERA_DRV) msm_sensor_write_init_settings(s_ctrl); #endif } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) { #if defined(DVE005_CAMERA_DRV) rc = s_ctrl->func_tbl->sensor_write_res_settings(s_ctrl, res); #else msm_sensor_write_res_settings(s_ctrl, res); #endif if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) { s_ctrl->curr_csi_params = s_ctrl->csi_params[res]; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CID_CHANGE, NULL); mb(); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); msleep(20); } v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[res].op_pixel_clk); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); s_ctrl->func_tbl->sensor_start_stream(s_ctrl); msleep(30); } return rc; }
int32_t imx111_sensor_write_exp_gain1(struct msm_sensor_ctrl_t *s_ctrl, uint16_t gain, uint32_t line) { uint32_t fl_lines; uint8_t offset; fl_lines = s_ctrl->curr_frame_length_lines; fl_lines = (fl_lines * s_ctrl->fps_divider) / Q10; offset = s_ctrl->sensor_exp_gain_info->vert_offset; if (line > (fl_lines - offset)) fl_lines = line + offset; CDBG("\n%s:Gain:%d, Linecount:%d\n", __func__, gain, line); if (s_ctrl->curr_res == 0) { msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client, (struct msm_camera_i2c_reg_conf *) imx111_comm_confs[1].conf, imx111_comm_confs[1].size, imx111_comm_confs[1].data_type); msm_camera_i2c_write(s_ctrl->sensor_i2c_client, s_ctrl->sensor_output_reg_addr->frame_length_lines, fl_lines, MSM_CAMERA_I2C_WORD_DATA); msm_camera_i2c_write(s_ctrl->sensor_i2c_client, s_ctrl->sensor_exp_gain_info->coarse_int_time_addr, line, MSM_CAMERA_I2C_WORD_DATA); msm_camera_i2c_write(s_ctrl->sensor_i2c_client, s_ctrl->sensor_exp_gain_info->global_gain_addr, gain, MSM_CAMERA_I2C_WORD_DATA); msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client, (struct msm_camera_i2c_reg_conf *) imx111_comm_confs[2].conf, imx111_comm_confs[2].size, imx111_comm_confs[2].data_type); if (s_ctrl->curr_csi_params != s_ctrl->csi_params[s_ctrl->curr_res]) { s_ctrl->curr_csi_params = s_ctrl->csi_params[s_ctrl->curr_res]; s_ctrl->curr_csi_params->csid_params.lane_assign = s_ctrl->sensordata->sensor_platform_info-> csi_lane_params->csi_lane_assign; s_ctrl->curr_csi_params->csiphy_params.lane_mask = s_ctrl->sensordata->sensor_platform_info-> csi_lane_params->csi_lane_mask; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); mb(); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); msleep(20); } v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[s_ctrl->curr_res].op_pixel_clk); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); s_ctrl->func_tbl->sensor_start_stream(s_ctrl); msleep(30); } else { s_ctrl->func_tbl->sensor_group_hold_on(s_ctrl); msm_camera_i2c_write(s_ctrl->sensor_i2c_client, s_ctrl->sensor_output_reg_addr->frame_length_lines, fl_lines, MSM_CAMERA_I2C_WORD_DATA); msm_camera_i2c_write(s_ctrl->sensor_i2c_client, s_ctrl->sensor_exp_gain_info->coarse_int_time_addr, line, MSM_CAMERA_I2C_WORD_DATA); msm_camera_i2c_write(s_ctrl->sensor_i2c_client, s_ctrl->sensor_exp_gain_info->global_gain_addr, gain, MSM_CAMERA_I2C_WORD_DATA); s_ctrl->func_tbl->sensor_group_hold_off(s_ctrl); } return 0; }
int32_t msm_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, int update_type, int res) { int32_t rc = 0; #ifdef CONFIG_RAWCHIP struct rawchip_sensor_data rawchip_data; struct timespec ts_start, ts_end; #endif pr_info("%s update_type:%d\n", __func__,update_type); v4l2_subdev_notify(s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX0, ISPIF_OFF_IMMEDIATELY)); s_ctrl->func_tbl->sensor_stop_stream(s_ctrl); if (update_type == MSM_SENSOR_REG_INIT) { s_ctrl->curr_csi_params = NULL; msm_sensor_enable_debugfs(s_ctrl); msm_sensor_write_init_settings(s_ctrl); first_init = 1; } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) { /*TODO : pointer to each sensor driver to get correct delay time*/ if(!first_init) mdelay(50); msm_sensor_write_res_settings(s_ctrl, res); if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) { s_ctrl->curr_csi_params = s_ctrl->csi_params[res]; v4l2_subdev_notify(s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); v4l2_subdev_notify(s_ctrl->sensor_v4l2_subdev, NOTIFY_CID_CHANGE, NULL); mb(); v4l2_subdev_notify(s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); } #ifdef CONFIG_RAWCHIP if (s_ctrl->sensordata->use_rawchip) { rawchip_data.sensor_name = s_ctrl->sensordata->sensor_name; rawchip_data.datatype = s_ctrl->curr_csi_params->csid_params.lut_params.vc_cfg->dt; rawchip_data.lane_cnt = s_ctrl->curr_csi_params->csid_params.lane_cnt; rawchip_data.pixel_clk = s_ctrl->msm_sensor_reg->output_settings[res].op_pixel_clk; rawchip_data.mirror_flip = s_ctrl->mirror_flip; rawchip_data.width = s_ctrl->msm_sensor_reg->output_settings[res].x_output; rawchip_data.height = s_ctrl->msm_sensor_reg->output_settings[res].y_output; rawchip_data.line_length_pclk = s_ctrl->msm_sensor_reg->output_settings[res].line_length_pclk; rawchip_data.frame_length_lines = s_ctrl->msm_sensor_reg->output_settings[res].frame_length_lines; rawchip_data.x_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_start; rawchip_data.y_addr_start = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_start; rawchip_data.x_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].x_addr_end; rawchip_data.y_addr_end = s_ctrl->msm_sensor_reg->output_settings[res].y_addr_end; rawchip_data.x_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_even_inc; rawchip_data.x_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].x_odd_inc; rawchip_data.y_even_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_even_inc; rawchip_data.y_odd_inc = s_ctrl->msm_sensor_reg->output_settings[res].y_odd_inc; rawchip_data.binning_rawchip = s_ctrl->msm_sensor_reg->output_settings[res].binning_rawchip; rawchip_data.fullsize_width = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].x_output; rawchip_data.fullsize_height = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].y_output; rawchip_data.fullsize_line_length_pclk = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].line_length_pclk; rawchip_data.fullsize_frame_length_lines = s_ctrl->msm_sensor_reg->output_settings[MSM_SENSOR_RES_FULL].frame_length_lines; ktime_get_ts(&ts_start); rawchip_set_size(rawchip_data); ktime_get_ts(&ts_end); pr_info("%s: %ld ms\n", __func__, (ts_end.tv_sec-ts_start.tv_sec)*1000+(ts_end.tv_nsec-ts_start.tv_nsec)/1000000); } #endif v4l2_subdev_notify(s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[res].op_pixel_clk); v4l2_subdev_notify(s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX0, ISPIF_ON_FRAME_BOUNDARY)); s_ctrl->func_tbl->sensor_start_stream(s_ctrl); first_init = 0; } return rc; }
int32_t msm_ov9740_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, int update_type, int res) { int32_t rc = 0; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_OFF_IMMEDIATELY)); s_ctrl->func_tbl->sensor_stop_stream(s_ctrl); msleep(30); if (update_type == MSM_SENSOR_REG_INIT) { s_ctrl->curr_csi_params = NULL; rc=msm_sensor_enable_debugfs(s_ctrl); rc = msm_camera_i2c_write(s_ctrl->sensor_i2c_client, 0x0103, 0x01, MSM_CAMERA_I2C_BYTE_DATA); if (rc < 0) { pr_err("%s: i2c write failed\n", __func__); return rc; } msleep(10); rc = msm_camera_i2c_write(s_ctrl->sensor_i2c_client, OV9740_MODE_SELECT, 0x00, MSM_CAMERA_I2C_BYTE_DATA); if (rc < 0) { pr_err("%s: i2c write failed\n", __func__); return rc; } } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) { rc=gpio_direction_output(53, 1); if (rc < 0) pr_err("%s gpio direction 53 failed\n",__func__); rc=gpio_direction_output(76, 0); if (rc < 0) pr_err("%s gpio direction 76 failed\n",__func__); msleep(20); if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) { pr_err("%s:mipi begin res=%d\n", __func__,res); s_ctrl->curr_csi_params = s_ctrl->csi_params[res]; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CID_CHANGE, NULL); mb(); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); msleep(20); pr_err("%s:mipi end res=%d\n", __func__,res); } rc=gpio_direction_output(53, 0); if (rc < 0) pr_err("%s gpio direction 53 failed\n",__func__); rc=gpio_direction_output(76, 1); if (rc < 0) pr_err("%s gpio direction 76 failed\n",__func__); msleep(20); pr_err("%s: msm_sensor_write_res_settings res=%d \n", __func__,res); rc=msm_sensor_ov9740_write_res_settings(s_ctrl, res); if (rc < 0) { pr_err("%s: msm_sensor_write_res_settings failed\n", __func__); return rc; } v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[res].op_pixel_clk); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); rc = msm_camera_i2c_write(s_ctrl->sensor_i2c_client, OV9740_MODE_SELECT, 0x01, MSM_CAMERA_I2C_BYTE_DATA); if (rc < 0) { pr_err("%s: i2c write failed\n", __func__); } } pr_err("%s: X %d\n", __func__, __LINE__); return rc; }
static int32_t s5k8aay_sensor_setting(int update_type, int rt) { int32_t rc = 0; struct msm_camera_csid_params s5k8aay_csid_params; struct msm_camera_csiphy_params s5k8aay_csiphy_params; CAM_DEBUG(" type = %d", update_type); switch (update_type) { case REG_INIT: if (rt == RES_PREVIEW || rt == RES_CAPTURE) /* Add some condition statements */ break; case UPDATE_PERIODIC: if (rt == RES_PREVIEW || rt == RES_CAPTURE) { struct msm_camera_csid_vc_cfg s5k8aay_vccfg[] = { {0, 0x1E, CSI_DECODE_8BIT}, {1, CSI_EMBED_DATA, CSI_DECODE_8BIT}, }; CAM_DEBUG(" UPDATE_PERIODIC"); v4l2_subdev_notify(s5k8aay_ctrl->sensor_dev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_OFF_IMMEDIATELY)); msleep(30); s5k8aay_csid_params.lane_cnt = 1; s5k8aay_csid_params.lane_assign = 0xe4; s5k8aay_csid_params.lut_params.num_cid = ARRAY_SIZE(s5k8aay_vccfg); s5k8aay_csid_params.lut_params.vc_cfg = &s5k8aay_vccfg[0]; s5k8aay_csiphy_params.lane_cnt = 1; s5k8aay_csiphy_params.settle_cnt = 0x14; v4l2_subdev_notify(s5k8aay_ctrl->sensor_dev, NOTIFY_CSID_CFG, &s5k8aay_csid_params); v4l2_subdev_notify(s5k8aay_ctrl->sensor_dev, NOTIFY_CID_CHANGE, NULL); v4l2_subdev_notify(s5k8aay_ctrl->sensor_dev, NOTIFY_CSIPHY_CFG, &s5k8aay_csiphy_params); mb(); msleep(20); config_csi2 = 1; v4l2_subdev_notify(s5k8aay_ctrl->sensor_dev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); msleep(30); } break; default: rc = -EINVAL; break; } return rc; }
/* msm_sensor_setting */ int32_t yacd5c1sbdbc_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, int update_type, int res) { int32_t rc = 0; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_OFF_IMMEDIATELY)); SKYCDBG("%s:[F_PANTECH_CAMERA] %d, %d res=%d\n", __func__, __LINE__,update_type,res); if (s_ctrl->func_tbl->sensor_stop_stream) s_ctrl->func_tbl->sensor_stop_stream(s_ctrl); msleep(30); if (update_type == MSM_SENSOR_REG_INIT) { s_ctrl->curr_csi_params = NULL; g_preview_fps= 0; msm_sensor_enable_debugfs(s_ctrl); #ifdef CONFIG_PANTECH_CAMERA_TUNER SKYCDBG("[CONFIG_PANTECH_CAMERA_TUNER]%s PASS init_setting\n ",__func__); tuner_init_check = 1; #else yacd5c1sbdbc_sensor_write_init_settings(s_ctrl); #endif } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) { #ifdef CONFIG_PANTECH_CAMERA_TUNER if (tuner_init_check == 1) { SKYCDBG("[CONFIG_PANTECH_CAMERA_TUNER]%s init_setting\n ",__func__); yacd5c1sbdbc_sensor_write_init_settings(s_ctrl); tuner_init_check = 0; } SKYCDBG("[CONFIG_PANTECH_CAMERA_TUNER]%s res=%d res_setting\n ",__func__,res); yacd5c1sbdbc_sensor_write_res_settings(s_ctrl, res); #else yacd5c1sbdbc_sensor_write_res_settings(s_ctrl, res); #endif #ifdef CONFIG_PANTECH_CAMERA_YACD5C1SBDBC// for VTS //if (strcmp(s_ctrl->sensordata->sensor_name, "yacd5c1sbdbc")) if((s_ctrl->sensor_id_info->sensor_id == YACD5C1SBDBC_ID) && (preview_24fps_for_motion_detect_check == 1)){ //printk("[CONFIG_PANTECH_CAMERA for VTS] msleep(133)==>\n"); //msleep(133); SKYCDBG("[CONFIG_PANTECH_CAMERA for VTS]preview_24fps_for_motion_detect_cfg_settings\n "); rc = msm_camera_i2c_write_tbl( s_ctrl->sensor_i2c_client, s_ctrl->msm_sensor_reg->preview_24fps_for_motion_detect_cfg_settings[0], s_ctrl->msm_sensor_reg->preview_24fps_for_motion_detect_cfg_settings_size, s_ctrl->msm_sensor_reg->default_data_type); preview_24fps_for_motion_detect_check = 0; if (rc < 0) { SKYCERR("ERR:%s 24fps FAIL!!! rc=%d \n", __func__, rc); return rc; } } #if 0// for camif err else { if(res==1) yacd5c1sbdbc_sensor_set_preview_fps(s_ctrl , g_preview_fps); } #endif #endif if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) { SKYCDBG("%s:[F_PANTECH_CAMERA] ==> MIPI setting E %d\n", __func__, update_type); s_ctrl->curr_csi_params = s_ctrl->csi_params[res]; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CID_CHANGE, NULL); mb(); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); msleep(20); SKYCDBG("%s:[F_PANTECH_CAMERA] ==> MIPI setting X %d\n", __func__, update_type); } v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[res].op_pixel_clk); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); if (s_ctrl->func_tbl->sensor_start_stream) s_ctrl->func_tbl->sensor_start_stream(s_ctrl); #ifdef T_OSCAR msleep(300); //msleep(150); //msleep(30); #else msleep(200);//msleep(150); //msleep(30); #endif } SKYCDBG("%s: %d x\n", __func__, __LINE__); return rc; }
int32_t imx111_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl, int update_type, int res) { int32_t rc = 0; int linecount; int frame_time,exposure_time; struct msm_sensor_output_info_t curr_info,new_info; curr_info = imx111_dimensions[s_ctrl->curr_res]; new_info = imx111_dimensions[res]; if( res != 0) { v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_OFF_IMMEDIATELY)); s_ctrl->func_tbl->sensor_stop_stream(s_ctrl); } if (update_type == MSM_SENSOR_REG_INIT) { curr_frame_length_lines = 0; s_ctrl->curr_csi_params = NULL; rc = msm_sensor_enable_debugfs(s_ctrl); if(rc < 0){ CDBG("%s: msm_sensor_enable_debugfs (rc:%d)\n", __func__,rc); } rc = msm_sensor_write_init_settings(s_ctrl); if (rc < 0) { return rc; } } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) { if( s_ctrl->curr_res != MSM_SENSOR_INVALID_RES) { CDBG("imx111.c %s: setting change %d -> %d\n", __func__, s_ctrl->curr_res,res); if (curr_info.frame_length_lines > curr_frame_length_lines ) { linecount = curr_info.frame_length_lines; } else { linecount = curr_frame_length_lines; } frame_time = 1000/(curr_info.vt_pixel_clk/(curr_info.line_length_pclk*linecount)); if ( res != 0 ) { CDBG("imx111.c %s: current frame_out_time = %d line_length_pclk =%d linecount = %d vt_pixel_clk = %d\n", __func__,frame_time,curr_info.line_length_pclk,linecount,curr_info.vt_pixel_clk); msleep(frame_time); } } curr_frame_length_lines = new_info.frame_length_lines; exposure_time = 1000/(new_info.vt_pixel_clk/(new_info.line_length_pclk*new_info.frame_length_lines)); if( s_ctrl->curr_res != 0 && res == 0) { rc = msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client, (struct msm_camera_i2c_reg_conf *) imx111_comm_confs[0].conf, imx111_comm_confs[0].size, imx111_comm_confs[0].data_type); if (rc < 0){ return rc; } rc = msm_sensor_write_res_settings(s_ctrl, res); if (rc < 0){ return rc; } if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) { s_ctrl->curr_csi_params = s_ctrl->csi_params[res]; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CID_CHANGE, NULL); mb(); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); msleep(20); } v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[res].op_pixel_clk); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); rc = msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client, (struct msm_camera_i2c_reg_conf *) imx111_comm_confs[1].conf, imx111_comm_confs[1].size, imx111_comm_confs[1].data_type); if (rc < 0){ return rc; } s_ctrl->func_tbl->sensor_start_stream(s_ctrl); msleep(10); rc = msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client, (struct msm_camera_i2c_reg_conf *) imx111_comm_confs[2].conf, imx111_comm_confs[2].size, imx111_comm_confs[2].data_type); if (rc < 0){ return rc; } } else { rc = msm_sensor_write_res_settings(s_ctrl, res); if(rc < 0){ return rc; } if (s_ctrl->curr_csi_params != s_ctrl->csi_params[res]) { s_ctrl->curr_csi_params = s_ctrl->csi_params[res]; v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSID_CFG, &s_ctrl->curr_csi_params->csid_params); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CID_CHANGE, NULL); mb(); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_CSIPHY_CFG, &s_ctrl->curr_csi_params->csiphy_params); mb(); msleep(20); } v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg-> output_settings[res].op_pixel_clk); v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev, NOTIFY_ISPIF_STREAM, (void *)ISPIF_STREAM( PIX_0, ISPIF_ON_FRAME_BOUNDARY)); s_ctrl->func_tbl->sensor_start_stream(s_ctrl); msleep(exposure_time); } } return rc; }