Evo MR3 updates
/drivers/media/video/msm/ov9665.c
blob:962a9457dfa7acc75289f169da5d11a42980a218 -> blob:65f449c4cd2d67b5877184449c2083899c8a098e
--- drivers/media/video/msm/ov9665.c
+++ drivers/media/video/msm/ov9665.c
@@ -54,6 +54,9 @@ DECLARE_MUTEX(ov9665_sem);
static int sensor_probe_node = 0;
+static enum wb_mode current_wb = CAMERA_AWB_AUTO;
+static int ov9665_set_wb(enum wb_mode wb_value);
+
#define MAX_I2C_RETRIES 20
static int i2c_transfer_retry(struct i2c_adapter *adap,
struct i2c_msg *msgs,
@@ -228,7 +231,14 @@ static int ov9665_pwd(const struct msm_c
else
pr_err("GPIO(%d) request faile",info->sensor_pwd);
gpio_free(info->sensor_pwd);
-
+ /*for 2nd camera 2nd source*/
+ /*main camera pwd pull down*/
+ rc = gpio_request(105, "ov9665");
+ if (!rc)
+ gpio_direction_output(105, 0);
+ else
+ pr_err("GPIO(105) request faile");
+ gpio_free(105);
return rc;
}
@@ -297,6 +307,7 @@ static int ov9665_set_sensor_mode(int mo
ov9665_i2c_write(ov9665_client->addr, 0x0d, 0x90, BYTE_LEN);
/*enable 3A*/
ov9665_i2c_write(ov9665_client->addr, 0x13, 0xe7, BYTE_LEN);
+ ov9665_set_wb(current_wb);
/*VGA 30fps*/
ov9665_i2c_write(ov9665_client->addr, 0x11, 0x80, BYTE_LEN);
//ov9665_i2c_write(ov9665_client->addr, 0x09, 0x01, BYTE_LEN);
@@ -563,6 +574,7 @@ static int ov9665_set_wb(enum wb_mode wb
default:
break;
}
+ current_wb = wb_value;
return 0;
}
@@ -789,14 +801,21 @@ int ov9665_sensor_open_init(struct msm_c
pr_info("GPIO(%d) request faile",data->sensor_pwd);
gpio_free(data->sensor_pwd);
mdelay(3);
-
/* Input MCLK = 24MHz */
msm_camio_clk_rate_set(24000000);
mdelay(5);
+ /* Config reset */
+ rc = gpio_request(data->sensor_reset, "ov9665");
+ if (!rc)
+ gpio_direction_output(data->sensor_reset, 1);
+ else
+ pr_info("GPIO(%d) request faile", data->sensor_reset);
+ gpio_free(data->sensor_reset);
+ mdelay(20);
msm_camio_camif_pad_reg_reset();
- rc = ov9665_i2c_write_table(&ov9665_regs.plltbl[0],
+ rc = ov9665_i2c_write_table(&ov9665_regs.plltbl[0],
ov9665_regs.plltbl_size);
/*read ID*/
@@ -815,10 +834,8 @@ init_done:
return rc;
init_fail:
- if (ov9665_ctrl) {
- kfree(ov9665_ctrl);
- ov9665_ctrl = NULL;
- }
+ /* remove free ov9665_ctrl to prevent kernel panic in sensor release */
+ pr_info("ov9665_sensor_open_init failed\n");
return rc;
}
@@ -894,6 +911,19 @@ int ov9665_sensor_release(void)
ov9665_ctrl->sensordata->sensor_pwd);
gpio_free(ov9665_ctrl->sensordata->sensor_pwd);
+ if (ov9665_ctrl->sensordata->camera_get_source() == SECOND_SOURCE) {
+ rc = gpio_request(
+ ov9665_ctrl->sensordata->sensor_reset, "ov9665");
+ if (!rc)
+ gpio_direction_output(
+ ov9665_ctrl->sensordata->sensor_reset, 0);
+ else
+ pr_info("GPIO(%d) request faile",
+ ov9665_ctrl->sensordata->sensor_reset);
+ gpio_free(ov9665_ctrl->sensordata->sensor_reset);
+ }
+
+
if (ov9665_ctrl) {
kfree(ov9665_ctrl);
ov9665_ctrl = NULL;
@@ -1058,9 +1088,9 @@ static int ov9665_sensor_probe(struct ms
pr_info("ov9665: ov9665_sensor_probe switch clk\n");
if(info->camera_clk_switch != NULL)
info->camera_clk_switch();
+
/* Config power down */
-
if(ov9665_pwd(info)<0)
goto probe_fail;
mdelay(3);
@@ -1086,7 +1116,9 @@ static int ov9665_sensor_probe(struct ms
rc = ov9665_reg_init();
if (rc < 0)
goto probe_fail;
-
+ if (info->camera_main_set_probe != NULL)
+ info->camera_main_set_probe(true);
+
s->s_init = ov9665_sensor_open_init;
s->s_release = ov9665_sensor_release;
s->s_config = ov9665_sensor_config;
@@ -1107,6 +1139,14 @@ probe_fail:
static int __ov9665_probe(struct platform_device *pdev)
{
+ struct msm_camera_sensor_info *sdata = pdev->dev.platform_data;
+
+ if (sdata->camera_main_get_probe != NULL) {
+ if (sdata->camera_main_get_probe()) {
+ pr_info("__s5k6aafx_probe camera main get probed already.\n");
+ return 0;
+ }
+ }
return msm_camera_drv_start(pdev, ov9665_sensor_probe);
}