summaryrefslogtreecommitdiff
path: root/drivers/media/video
diff options
context:
space:
mode:
authorPhil Breczinski <pbreczinski@nvidia.com>2012-11-16 18:36:58 -0800
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-11-22 10:35:45 -0800
commitb70cb5d5004e6451f7360f5626fd7f3144560788 (patch)
tree9112b9a410605fa8e8e111df1135c23d051c6769 /drivers/media/video
parenta845b9af1802a6e65c64b7535f65bf6eb526ae92 (diff)
media: video: tegra: ov9772: reduce set mode time
Reduces time to set mode on ov9772 sensor. Eliminate unneeded sleep times at mode switch. Implement active wait following software reset. Change-Id: I25e978eaf64815ba73f8cc42f7ecfdabac95f46c Signed-off-by: Phil Breczinski <pbreczinski@nvidia.com> Reviewed-on: http://git-master/r/164502 Reviewed-by: Rohan Somvanshi <rsomvanshi@nvidia.com> Tested-by: Rohan Somvanshi <rsomvanshi@nvidia.com>
Diffstat (limited to 'drivers/media/video')
-rw-r--r--drivers/media/video/tegra/ov9772.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/drivers/media/video/tegra/ov9772.c b/drivers/media/video/tegra/ov9772.c
index 37fcb1491a40..950e9bbe4de2 100644
--- a/drivers/media/video/tegra/ov9772.c
+++ b/drivers/media/video/tegra/ov9772.c
@@ -149,6 +149,8 @@
#define OV9772_SIZEOF_I2C_BUF 16
#define OV9772_TABLE_WAIT_MS 0
#define OV9772_TABLE_END 1
+#define OV9772_TABLE_RESET 2
+#define OV9772_TABLE_RESET_TIMEOUT 50
#define OV9772_NUM_MODES ARRAY_SIZE(ov9772_mode_table)
#define OV9772_MODE_UNKNOWN (OV9772_NUM_MODES + 1)
#define OV9772_LENS_MAX_APERTURE 0 /* / _INT2FLOAT_DIVISOR */
@@ -307,8 +309,7 @@ static struct ov9772_reg *test_patterns[] = {
};
#ifdef OV9772_ENABLE_1284x724
static struct ov9772_reg ov9772_1284x724_i2c[] = {
- {0x0103, 0x01},
- {OV9772_TABLE_WAIT_MS, 100},
+ {OV9772_TABLE_RESET, 0},
{0x0300, 0x00},
{0x0301, 0x0a},
{0x0302, 0x00},
@@ -393,14 +394,12 @@ static struct ov9772_reg ov9772_1284x724_i2c[] = {
{0x53c4, 0x03},
{0x0101, 0x01},
{0x0100, 0x01},
- {OV9772_TABLE_WAIT_MS, 100},
{OV9772_TABLE_END, 0x0000}
};
#endif
#ifdef OV9772_ENABLE_960x720
static struct ov9772_reg ov9772_960x720_i2c[] = {
- {0x0103, 0x01},
- {OV9772_TABLE_WAIT_MS, 100},
+ {OV9772_TABLE_RESET, 0},
{0x3745, 0x00},
{0x3746, 0x18},
{0x3620, 0x36},
@@ -504,7 +503,6 @@ static struct ov9772_reg ov9772_960x720_i2c[] = {
{0x373c, 0x08},
{0x0345, 0xa1},
{0x0100, 0x01},
- {OV9772_TABLE_WAIT_MS, 100},
{OV9772_TABLE_END, 0x0000}
};
#endif
@@ -747,11 +745,29 @@ static int ov9772_i2c_wr_table(struct ov9772_info *info,
const struct ov9772_reg *n_next;
u8 *b_ptr = info->i2c_buf;
u16 buf_count = 0;
+ u8 reset_status = 1;
+ u8 reset_tries_left = OV9772_TABLE_RESET_TIMEOUT;
for (next = table; next->addr != OV9772_TABLE_END; next++) {
if (next->addr == OV9772_TABLE_WAIT_MS) {
msleep(next->val);
continue;
+ } else if (next->addr == OV9772_TABLE_RESET) {
+ err = ov9772_i2c_wr8(info, 0x0103, 0x01);
+ if (err)
+ return err;
+ while (reset_status) {
+ usleep_range(200, 300);
+ if (reset_tries_left < 1)
+ return -EIO;
+ err = ov9772_i2c_rd8(info, 0x0103,
+ &reset_status);
+ if (err)
+ return err;
+ reset_status &= 0x01;
+ reset_tries_left -= 1;
+ }
+ continue;
}
if (!buf_count) {
@@ -766,6 +782,7 @@ static int ov9772_i2c_wr_table(struct ov9772_info *info,
if (n_next->addr == next->addr + 1 &&
n_next->addr != OV9772_TABLE_WAIT_MS &&
buf_count < OV9772_SIZEOF_I2C_BUF &&
+ n_next->addr != OV9772_TABLE_RESET &&
n_next->addr != OV9772_TABLE_END)
continue;