コード例 #1
0
int32_t ov5693_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl,
		int update_type, int res)
{
	int32_t rc = 0;

	if (update_type == MSM_SENSOR_REG_INIT) {
		s_ctrl->func_tbl->sensor_stop_stream(s_ctrl);
		// Software reset
		msm_camera_i2c_write(
				s_ctrl->sensor_i2c_client,
				0x103, 0x1,
				MSM_CAMERA_I2C_BYTE_DATA);

		msm_sensor_write_init_settings(s_ctrl);

		msm_camera_i2c_write(s_ctrl->sensor_i2c_client, 0x100, 0x1,
			MSM_CAMERA_I2C_BYTE_DATA);

#if 0 // from QCT Reference driver
		ov5693_read_opt(s_ctrl);
		msm_camera_i2c_write(s_ctrl->sensor_i2c_client, 0x100, 0x0,
		  MSM_CAMERA_I2C_BYTE_DATA);
#endif

	} else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) {
		msm_sensor_write_res_settings(s_ctrl, res);
		v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
			NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg->
			output_settings[res].op_pixel_clk);
	}
	return rc;
}
コード例 #2
0
int32_t imx111_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl,
			int update_type, int res)
{
	int32_t rc = 0;
	pr_err("[rafal47] %s: update: %d, res : %d : Change camera mode\n", __func__, update_type, res);
//	s_ctrl->func_tbl->sensor_stop_stream(s_ctrl);
//	msleep(30);
	if (update_type == MSM_SENSOR_REG_INIT) {
		msm_sensor_enable_debugfs(s_ctrl);
		msm_sensor_write_init_settings(s_ctrl);
	} else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) {
		if (res == 0) {
			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);
         printk("[tykim] %s: csi_lane_assign not setting\n", __func__); /*                                                                     */
		} else {
			msm_sensor_write_res_settings(s_ctrl, res);
			v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
				NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg->
				output_settings[res].op_pixel_clk);
		}
	}
	printk("%s: X", __func__);
	return rc;
}
コード例 #3
0
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;
}
コード例 #4
0
int32_t imx111_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl,
			int update_type, int res)
{
	int32_t rc = 0;

	printk("%s: E: update_type=%d, res=%d\n", __func__, update_type, res);

	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) {
		if (res == 0) {
			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);
		} else {
			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];
				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[res].op_pixel_clk);
			s_ctrl->func_tbl->sensor_start_stream(s_ctrl);
			msleep(30);
		}
	}
	printk("%s: X", __func__);
	return rc;
}
コード例 #5
0
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;
}
コード例 #6
0
int32_t msm_sensor_setting(struct msm_sensor_ctrl_t *s_ctrl,
			int update_type, int res)
{
	int32_t rc = 0;

	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]) {
			s_ctrl->curr_csi_params = s_ctrl->csi_params[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[res].op_pixel_clk);
		s_ctrl->func_tbl->sensor_start_stream(s_ctrl);
		msleep(30);
	}
	return rc;
}
コード例 #7
0
int32_t iu091_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;

    IU091_LOG_INF("START\n");

    curr_info = iu091_dimensions[s_ctrl->curr_res];
    new_info  = iu091_dimensions[res];
    if( res != 0)
    {
       s_ctrl->func_tbl->sensor_stop_stream(s_ctrl);
    }


    if (update_type == MSM_SENSOR_REG_INIT) {
        curr_frame_length_lines = 0;



        rc = msm_sensor_enable_debugfs(s_ctrl);
        if(rc < 0){
            
            IU091_LOG_DBG("msm_sensor_enable_debugfs (rc:%d)\n",rc);
        }

        rc = msm_sensor_write_init_settings(s_ctrl);
        if(rc < 0){
            IU091_LOG_ERR("%s: msm_sensor_write_init_settings (rc:%d)\n", __func__,rc);
            return rc;
        }


    } else if (update_type == MSM_SENSOR_UPDATE_PERIODIC) {
        if( s_ctrl->curr_res != MSM_SENSOR_INVALID_RES)
        {
            IU091_LOG_DBG("setting change %d -> %d\n",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 )
            {
                
                IU091_LOG_DBG("current frame_out_time = %d line_length_pclk =%d linecount = %d vt_pixel_clk = %d\n", 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 == MSM_SENSOR_RES_QTR) && (res == MSM_SENSOR_RES_FULL)) ||
            ((s_ctrl->curr_res == MSM_SENSOR_RES_2  ) && (res == MSM_SENSOR_RES_FULL)) )
        {
            
            
            rc = msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client,
                (struct msm_camera_i2c_reg_conf *)
                iu091_comm_confs[0].conf,
                iu091_comm_confs[0].size,
                iu091_comm_confs[0].data_type);

            if(rc < 0){
                return rc;
            }




















            v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
                NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg->
                output_settings[res].op_pixel_clk);

            
            rc = msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client,
                (struct msm_camera_i2c_reg_conf *)
                iu091_comm_confs[1].conf,
                iu091_comm_confs[1].size,
                iu091_comm_confs[1].data_type);

            if(rc < 0){
                return rc;
            }

            
            rc = msm_camera_i2c_write_tbl(s_ctrl->sensor_i2c_client,
                (struct msm_camera_i2c_reg_conf *)
                iu091_comm_confs[2].conf,
                iu091_comm_confs[2].size,
                iu091_comm_confs[2].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 *)
                iu091_comm_confs[3].conf,
                iu091_comm_confs[3].size,
                iu091_comm_confs[3].data_type);

            if(rc < 0){
                return rc;
            }

        } else {
            rc = msm_sensor_write_res_settings(s_ctrl, res);

           if(rc < 0){
                return rc;
            }




















            v4l2_subdev_notify(&s_ctrl->sensor_v4l2_subdev,
                NOTIFY_PCLK_CHANGE, &s_ctrl->msm_sensor_reg->
                output_settings[res].op_pixel_clk);
            s_ctrl->func_tbl->sensor_start_stream(s_ctrl);
            msleep(exposure_time);
        }
    }
    IU091_LOG_INF("END\n");
    return rc;
}
コード例 #8
0
ファイル: msm_sensor.c プロジェクト: Snuzzo/funky_msm8960
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;
}
コード例 #9
0
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;
}