diff options
author | Qinggang Zhou <qzhou@nvidia.com> | 2011-09-20 16:37:00 -0700 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2011-10-13 12:40:38 -0700 |
commit | e0f1e9c61daa5faacb0e5cb404357f7e3284c8ae (patch) | |
tree | 6e4b95349e4ffaf82297757981b78e78b5a9d344 | |
parent | 98fbb8fe516de897c967ea23e7dd36f1e11f1a7b (diff) |
ov5650: add fast set_mode
Resetting the mode does not need to reset all of the i2c
registers. This used to be called "fast set_mode". This
is added into the kernel driver in this change. This
change reduced 90ms from resetting the mode. It only
apply to still preview and capture resolutions
bug 816814
Change-Id: Id27f526dc8b4623b08a04b536d8d7ebdc904572d
Reviewed-on: http://git-master/r/53587
Tested-by: Anton Poon <antonp@nvidia.com>
Reviewed-by: Qi Wang <qiw@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r-- | drivers/media/video/tegra/ov5650.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/media/video/tegra/ov5650.c b/drivers/media/video/tegra/ov5650.c index 04535d873a1e..0f34e4b79879 100644 --- a/drivers/media/video/tegra/ov5650.c +++ b/drivers/media/video/tegra/ov5650.c @@ -27,6 +27,8 @@ struct ov5650_reg { u16 val; }; +static struct ov5650_reg *last_mode; + struct ov5650_sensor { struct i2c_client *i2c_client; struct ov5650_platform_data *pdata; @@ -948,13 +950,24 @@ static int ov5650_set_mode(struct ov5650_info *info, struct ov5650_mode *mode) ov5650_get_coarse_time_regs(reg_list + 2, mode->coarse_time); ov5650_get_gain_reg(reg_list + 5, mode->gain); - err = ov5650_write_table(info, reset_seq, NULL, 0); - if (err) - return err; + /* Check what condition reset and mode start sequences are */ + /* needed. For switching between certain modes, these are */ + /* not required. Skipping them saves time for I2C access */ + if ((info->mode == OV5650_MODE_INVALID) || + ((last_mode != mode_2592x1944) && + (last_mode != mode_1296x972)) || + ((mode_table[sensor_mode] != mode_2592x1944) && + (mode_table[sensor_mode] != mode_1296x972))) { + err = ov5650_write_table(info, reset_seq, NULL, 0); + if (err) + return err; - err = ov5650_write_table(info, mode_start, NULL, 0); - if (err) - return err; + err = ov5650_write_table(info, mode_start, NULL, 0); + if (err) + return err; + } + + last_mode = mode_table[sensor_mode]; err = ov5650_write_table(info, mode_table[sensor_mode], reg_list, 6); @@ -1179,10 +1192,13 @@ static int set_power_helper(struct ov5650_platform_data *pdata, int powerLevel) { if (pdata) { - if (powerLevel && pdata->power_on) + if (powerLevel && pdata->power_on) { pdata->power_on(); - else if (pdata->power_off) + } + else if (pdata->power_off) { pdata->power_off(); + stereo_ov5650_info->mode = OV5650_MODE_INVALID; + } } return 0; } |