summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQinggang Zhou <qzhou@nvidia.com>2011-09-20 16:37:00 -0700
committerSimone Willett <swillett@nvidia.com>2011-10-13 12:40:38 -0700
commite0f1e9c61daa5faacb0e5cb404357f7e3284c8ae (patch)
tree6e4b95349e4ffaf82297757981b78e78b5a9d344
parent98fbb8fe516de897c967ea23e7dd36f1e11f1a7b (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.c32
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;
}