[PORT FROM R2] mt9m114: add speedup ae/awb settings and change loading sequence
authorHuang Shenbo <shenbo.huang@intel.com>
Fri, 25 Nov 2011 06:26:17 +0000 (14:26 +0800)
committerbuildbot <buildbot@intel.com>
Mon, 19 Dec 2011 13:35:28 +0000 (05:35 -0800)
BZ: 17272

1. Add speedup ae/awb settings to shorten the ae/awb
initialization time leading to less s2s time.
2. Change setting loaded sequence per vendor suggestion.
3. Add QCIF resolution settings.

Change-Id: I7c9009a5701e1d2f5149b0c584d5e2ff398ecba7
Orig-Change-Id: I4904679567f5acdf0ba4cb52b93094f63c875fac
Signed-off-by: Huang Shenbo <shenbo.huang@intel.com>
Reviewed-on: http://android.intel.com:8080/25283
Reviewed-by: Hu, Gang A <gang.a.hu@intel.com>
Reviewed-by: Wang, Wen W <wen.w.wang@intel.com>
Reviewed-by: Cohen, David A <david.a.cohen@intel.com>
Tested-by: Koski, Anttu <anttu.koski@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
Reviewed-on: http://android.intel.com:8080/28035
Reviewed-by: Tuominen, TeemuX <teemux.tuominen@intel.com>
Reviewed-by: Koski, Anttu <anttu.koski@intel.com>
drivers/media/video/mt9m114.c
drivers/media/video/mt9m114.h

index 800b9f6..c6897c2 100644 (file)
@@ -462,12 +462,10 @@ static int mt9m114_init_common(struct v4l2_subdev *sd)
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        int ret;
 
-       ret = mt9m114_write_reg_array(client, mt9m114_iq);
-       ret |= mt9m114_write_reg_array(client, mt9m114_common);
+       ret = mt9m114_write_reg_array(client, mt9m114_common);
        if (ret)
-               return -EINVAL;
-
-       ret = mt9m114_wait_state(sd, MT9M114_WAIT_STAT_TIMEOUT);
+               return ret;
+       ret = mt9m114_write_reg_array(client, mt9m114_iq);
 
        return ret;
 }
@@ -726,6 +724,10 @@ static int mt9m114_res2size(unsigned int res, int *h_size, int *v_size)
        unsigned short vsize;
 
        switch (res) {
+       case MT9M114_RES_QCIF:
+               hsize = MT9M114_RES_QCIF_SIZE_H;
+               vsize = MT9M114_RES_QCIF_SIZE_V;
+               break;
        case MT9M114_RES_QVGA:
                hsize = MT9M114_RES_QVGA_SIZE_H;
                vsize = MT9M114_RES_QVGA_SIZE_V;
@@ -791,6 +793,9 @@ static int mt9m114_set_mbus_fmt(struct v4l2_subdev *sd,
        }
 
        switch (res_index->res) {
+       case MT9M114_RES_QCIF:
+               ret = mt9m114_write_reg_array(c, mt9m114_qcif_init);
+               break;
        case MT9M114_RES_QVGA:
                ret = mt9m114_write_reg_array(c, mt9m114_qvga_init);
                /* set sensor read_mode to Skipping */
@@ -823,8 +828,9 @@ static int mt9m114_set_mbus_fmt(struct v4l2_subdev *sd,
        if (ret)
                return -EINVAL;
 
-       if (mt9m114_write_reg_array(c, mt9m114_common))
-               return -EINVAL;
+       ret = mt9m114_write_reg_array(c, mt9m114_chgstat_reg);
+       if (ret < 0)
+               return ret;
        if (mt9m114_wait_state(sd, MT9M114_WAIT_STAT_TIMEOUT))
                return -EINVAL;
 
@@ -1266,7 +1272,7 @@ static int mt9m114_s_stream(struct v4l2_subdev *sd, int enable)
        struct i2c_client *c = v4l2_get_subdevdata(sd);
 
        if (enable) {
-               ret = mt9m114_write_reg_array(c, mt9m114_common);
+               ret = mt9m114_write_reg_array(c, mt9m114_chgstat_reg);
                if (ret < 0)
                        return ret;
                ret = mt9m114_wait_state(sd, MT9M114_WAIT_STAT_TIMEOUT);
index 3169f8c..1a8055a 100644 (file)
 
 /* Supported resolutions */
 enum {
+       MT9M114_RES_QCIF,
        MT9M114_RES_QVGA,
        MT9M114_RES_VGA,
        MT9M114_RES_720P,
@@ -152,7 +153,8 @@ enum {
 #define MT9M114_RES_VGA_SIZE_V         480
 #define MT9M114_RES_QVGA_SIZE_H                320
 #define MT9M114_RES_QVGA_SIZE_V                240
-
+#define MT9M114_RES_QCIF_SIZE_H                176
+#define MT9M114_RES_QCIF_SIZE_V                144
 /*
  * struct misensor_reg - MI sensor  register format
  * @length: length of the register
@@ -290,6 +292,15 @@ static struct mt9m114_format_struct  mt9m114_formats[] = {
  */
 static struct mt9m114_res_struct mt9m114_res[] = {
        {
+       .desc   = "QCIF",
+       .res    = MT9M114_RES_QCIF,
+       .width  = 176,
+       .height = 144,
+       .fps    = 30,
+       .used   = 0,
+       .regs   = NULL,
+       },
+       {
        .desc   = "QVGA",
        .res    = MT9M114_RES_QVGA,
        .width  = 320,
@@ -361,14 +372,53 @@ static struct misensor_reg const mt9m114_wakeup_reg[] = {
         {MISENSOR_TOK_TERM, 0, 0}
 };
 
+static struct misensor_reg const mt9m114_chgstat_reg[] = {
+       {MISENSOR_16BIT,  0x098E, 0xDC00},
+       {MISENSOR_8BIT,  0xDC00, 0x28},
+       {MISENSOR_16BIT,  0x0080, 0x8002},
+       {MISENSOR_TOK_TERM, 0, 0}
+};
+static struct misensor_reg const mt9m114_qcif_init[] = {
+
+       {MISENSOR_16BIT,  0x98E, 0x1000},
+       {MISENSOR_16BIT,  0xC800, 0x0034},
+       {MISENSOR_16BIT,  0xC802, 0x0074},
+       {MISENSOR_16BIT,  0xC804, 0x039B},
+       {MISENSOR_16BIT,  0xC806, 0x049B},
+       {MISENSOR_32BIT,  0xC808, 0x2DC6C00},
+       {MISENSOR_16BIT,  0xC80C, 0x0001},
+       {MISENSOR_16BIT,  0xC80E, 0x00DB},
+       {MISENSOR_16BIT,  0xC810, 0x04D1},
+       {MISENSOR_16BIT,  0xC812, 0x0495},
+       {MISENSOR_16BIT,  0xC814, 0x0554},
+       {MISENSOR_16BIT,  0xC816, 0x0060},
+       {MISENSOR_16BIT,  0xC818, 0x0363},
+       {MISENSOR_16BIT,  0xC826, 0x0020},
+       {MISENSOR_16BIT | MISENSOR_TOK_RMW, 0xC834, 0x0330, 0},
+       {MISENSOR_16BIT,  0xC854, 0x0000},
+       {MISENSOR_16BIT,  0xC856, 0x0000},
+       {MISENSOR_16BIT,  0xC858, 0x0420},
+       {MISENSOR_16BIT,  0xC85A, 0x0360},
+       {MISENSOR_8BIT,  0xC85C, 0x03},
+       {MISENSOR_16BIT,  0xC868, 0x00B0},
+       {MISENSOR_16BIT,  0xC86A, 0x0090},
+       {MISENSOR_8BIT,  0xC878, 0x0E},
+       {MISENSOR_16BIT,  0xC88C, 0x1E00},
+       {MISENSOR_16BIT,  0xC88E, 0x1E00},
+       {MISENSOR_16BIT,  0xC914, 0x0000},
+       {MISENSOR_16BIT,  0xC916, 0x0000},
+       {MISENSOR_16BIT,  0xC918, 0x00AF},
+       {MISENSOR_16BIT,  0xC91A, 0x008F},
+       {MISENSOR_16BIT,  0xC91C, 0x0000},
+       {MISENSOR_16BIT,  0xC91E, 0x0000},
+       {MISENSOR_16BIT,  0xC920, 0x0022},
+       {MISENSOR_16BIT,  0xC922, 0x001B},
+       {MISENSOR_TOK_TERM, 0, 0}
+};
+
 static struct misensor_reg const mt9m114_qvga_init[] = {
 
-       {MISENSOR_16BIT,  0x301A, 0x0234},
        {MISENSOR_16BIT,  0x98E, 0x1000},
-       {MISENSOR_8BIT,  0xC97E, 0x01},
-       {MISENSOR_16BIT,  0xC980, 0x0128},
-       {MISENSOR_16BIT,  0xC982, 0x0700},
-       {MISENSOR_16BIT,  0xC984, 0x8041},
        {MISENSOR_16BIT,  0xC800, 0x0000},
        {MISENSOR_16BIT,  0xC802, 0x0000},
        {MISENSOR_16BIT,  0xC804, 0x03CD},
@@ -382,6 +432,7 @@ static struct misensor_reg const mt9m114_qvga_init[] = {
        {MISENSOR_16BIT,  0xC816, 0x0060},
        {MISENSOR_16BIT,  0xC818, 0x01E3},
        {MISENSOR_16BIT,  0xC826, 0x0020},
+       {MISENSOR_16BIT | MISENSOR_TOK_RMW, 0xC834, 0x0330, 0x11},
        {MISENSOR_16BIT,  0xC854, 0x0000},
        {MISENSOR_16BIT,  0xC856, 0x0000},
        {MISENSOR_16BIT,  0xC858, 0x0280},
@@ -389,7 +440,7 @@ static struct misensor_reg const mt9m114_qvga_init[] = {
        {MISENSOR_8BIT,  0xC85C, 0x03},
        {MISENSOR_16BIT,  0xC868, 0x0140},
        {MISENSOR_16BIT,  0xC86A, 0x00F0},
-       {MISENSOR_8BIT,  0xC878, 0x0},
+       {MISENSOR_8BIT,  0xC878, 0xE},
        {MISENSOR_16BIT,  0xC88C, 0x1E03},
        {MISENSOR_16BIT,  0xC88E, 0x1E03},
        {MISENSOR_16BIT,  0xC914, 0x0000},
@@ -400,18 +451,12 @@ static struct misensor_reg const mt9m114_qvga_init[] = {
        {MISENSOR_16BIT,  0xC91E, 0x0000},
        {MISENSOR_16BIT,  0xC920, 0x003F},
        {MISENSOR_16BIT,  0xC922, 0x002F},
-       {MISENSOR_8BIT,  0xE801, 0x00},
        {MISENSOR_TOK_TERM, 0, 0}
 };
 
 static struct misensor_reg const mt9m114_720p_init[] = {
 
-       {MISENSOR_16BIT,  0x301A, 0x0234},
-       {MISENSOR_16BIT,  0x98E0, 0x0000},
-       {MISENSOR_8BIT,   0xC97E, 0x01},
-       {MISENSOR_16BIT,  0xC980, 0x0128},
-       {MISENSOR_16BIT,  0xC982, 0x0700},
-       {MISENSOR_16BIT,  0x98E0, 0x0000},
+       {MISENSOR_16BIT,   0x98E, 0x1000},
        {MISENSOR_16BIT,  0xC800, 0x007C},
        {MISENSOR_16BIT,  0xC802, 0x0004},
        {MISENSOR_16BIT,  0xC804, 0x0353},
@@ -425,8 +470,7 @@ static struct misensor_reg const mt9m114_720p_init[] = {
        {MISENSOR_16BIT,  0xC816, 0x0060},
        {MISENSOR_16BIT,  0xC818, 0x02D3},
        {MISENSOR_16BIT,  0xC826, 0x0020},
-
-
+       {MISENSOR_16BIT | MISENSOR_TOK_RMW, 0xC834, 0x0330, 0},
        {MISENSOR_16BIT,  0xC854, 0x0000},
        {MISENSOR_16BIT,  0xC856, 0x0000},
        {MISENSOR_16BIT,  0xC858, 0x0500},
@@ -444,24 +488,12 @@ static struct misensor_reg const mt9m114_720p_init[] = {
        {MISENSOR_16BIT,  0xC91E, 0x0000},
        {MISENSOR_16BIT,  0xC920, 0x00FF},
        {MISENSOR_16BIT,  0xC922, 0x008F},
-       {MISENSOR_8BIT,   0xE801, 0x00},
        {MISENSOR_TOK_TERM, 0, 0}
 };
 
 static struct misensor_reg const mt9m114_vga_init[] = {
 
-       {MISENSOR_16BIT,  0x301A, 0x0234},
        {MISENSOR_16BIT,   0x98E, 0x1000},
-       {MISENSOR_8BIT,   0xC97E, 0x01},
-       {MISENSOR_16BIT,   0xC980, 0x0128},
-       {MISENSOR_16BIT,   0xC982, 0x0700},
-       {MISENSOR_16BIT,   0xC984, 0x8001},
-       {MISENSOR_16BIT,   0xC988, 0x0F00},
-       {MISENSOR_16BIT,   0xC98A, 0x0B07},
-       {MISENSOR_16BIT,   0xC98C, 0x0D01},
-       {MISENSOR_16BIT,   0xC98E, 0x071D},
-       {MISENSOR_16BIT,   0xC990, 0x0006},
-       {MISENSOR_16BIT,   0xC992, 0x0A0C},
        {MISENSOR_16BIT,   0xC800, 0x0000},
        {MISENSOR_16BIT,   0xC802, 0x0000},
        {MISENSOR_16BIT,   0xC804, 0x03CD},
@@ -475,6 +507,7 @@ static struct misensor_reg const mt9m114_vga_init[] = {
        {MISENSOR_16BIT,   0xC816, 0x00E0},
        {MISENSOR_16BIT,   0xC818, 0x01E3},
        {MISENSOR_16BIT,   0xC826, 0x0020},
+       {MISENSOR_16BIT | MISENSOR_TOK_RMW, 0xC834, 0x0330, 0x33},
        {MISENSOR_16BIT,   0xC854, 0x0000},
        {MISENSOR_16BIT,   0xC856, 0x0000},
        {MISENSOR_16BIT,   0xC858, 0x0280},
@@ -482,7 +515,7 @@ static struct misensor_reg const mt9m114_vga_init[] = {
        {MISENSOR_8BIT,   0xC85C, 0x03},
        {MISENSOR_16BIT,   0xC868, 0x0280},
        {MISENSOR_16BIT,   0xC86A, 0x01E0},
-       {MISENSOR_8BIT,   0xC878, 0x00},
+       {MISENSOR_8BIT,   0xC878, 0x0E},
        {MISENSOR_16BIT,   0xC88C, 0x1E04},
        {MISENSOR_16BIT,   0xC88E, 0x1E04},
        {MISENSOR_16BIT,   0xC914, 0x0000},
@@ -493,15 +526,11 @@ static struct misensor_reg const mt9m114_vga_init[] = {
        {MISENSOR_16BIT,   0xC91E, 0x0000},
        {MISENSOR_16BIT,   0xC920, 0x007F},
        {MISENSOR_16BIT,   0xC922, 0x005F},
-       {MISENSOR_8BIT,  0xE801, 0x00},
        {MISENSOR_TOK_TERM, 0, 0}
 };
 
 static struct misensor_reg const mt9m114_960P_init[] = {
        {MISENSOR_16BIT, 0x98E, 0x1000},
-       {MISENSOR_8BIT, 0xC97E, 0x01},
-       {MISENSOR_16BIT, 0xC980, 0x0128},
-       {MISENSOR_16BIT, 0xC982, 0x0700},
        {MISENSOR_16BIT, 0xC800, 0x0004},
        {MISENSOR_16BIT, 0xC802, 0x0004},
        {MISENSOR_16BIT, 0xC804, 0x03CB},
@@ -515,6 +544,7 @@ static struct misensor_reg const mt9m114_960P_init[] = {
        {MISENSOR_16BIT, 0xC816, 0x0060},
        {MISENSOR_16BIT, 0xC818, 0x03C3},
        {MISENSOR_16BIT, 0xC826, 0x0020},
+       {MISENSOR_16BIT | MISENSOR_TOK_RMW, 0xC834, 0x0330, 0},
        {MISENSOR_16BIT, 0xC854, 0x0000},
        {MISENSOR_16BIT, 0xC856, 0x0000},
        {MISENSOR_16BIT, 0xC858, 0x0500},
@@ -522,7 +552,7 @@ static struct misensor_reg const mt9m114_960P_init[] = {
        {MISENSOR_8BIT, 0xC85C, 0x03},
        {MISENSOR_16BIT, 0xC868, 0x0500},
        {MISENSOR_16BIT, 0xC86A, 0x03C0},
-       {MISENSOR_8BIT, 0xC878, 0x00},
+       {MISENSOR_8BIT, 0xC878, 0x0E},
        {MISENSOR_16BIT, 0xC88C, 0x0F00},
        {MISENSOR_16BIT, 0xC88E, 0x0F00},
        {MISENSOR_16BIT, 0xC914, 0x0000},
@@ -538,22 +568,22 @@ static struct misensor_reg const mt9m114_960P_init[] = {
 
 
 static struct misensor_reg const mt9m114_common[] = {
-        /*Step8-Features*/
-        {MISENSOR_16BIT,  0x98E0, 0x0000},
-        {MISENSOR_16BIT,  0xC984, 0x8040},
-        {MISENSOR_16BIT,  0x001E, 0x0777},
-        /*MIPI settings for MT9M114*/
-        {MISENSOR_16BIT,  0xC984, 0x8041},
-        {MISENSOR_16BIT,  0xC988, 0x0F00},
-        {MISENSOR_16BIT,  0xC98A, 0x0B07},
-        {MISENSOR_16BIT,  0xC98C, 0x0D01},
-        {MISENSOR_16BIT,  0xC98E, 0x071D},
-        {MISENSOR_16BIT,  0xC990, 0x0006},
-        {MISENSOR_16BIT,  0xC992, 0x0A0C},
-        {MISENSOR_16BIT,  0x098E, 0xDC00},
-        {MISENSOR_8BIT,  0xDC00, 0x28},
-        {MISENSOR_16BIT,  0x0080, 0x8002},
-        {MISENSOR_TOK_TERM, 0, 0}
+       /* reset */
+       {MISENSOR_16BIT,  0x301A, 0x0234},
+       /* pll settings for MT9M114 */
+       {MISENSOR_16BIT,   0x98E, 0x1000},
+       {MISENSOR_8BIT,   0xC97E, 0x01},
+       {MISENSOR_16BIT,   0xC980, 0x0128},
+       {MISENSOR_16BIT,   0xC982, 0x0700},
+       /*MIPI settings for MT9M114*/
+       {MISENSOR_16BIT,  0xC984, 0x8041},
+       {MISENSOR_16BIT,  0xC988, 0x0F00},
+       {MISENSOR_16BIT,  0xC98A, 0x0B07},
+       {MISENSOR_16BIT,  0xC98C, 0x0D01},
+       {MISENSOR_16BIT,  0xC98E, 0x071D},
+       {MISENSOR_16BIT,  0xC990, 0x0006},
+       {MISENSOR_16BIT,  0xC992, 0x0A0C},
+       {MISENSOR_TOK_TERM, 0, 0}
 };
 
 static struct misensor_reg const mt9m114_antiflicker_50hz[] = {
@@ -1526,6 +1556,18 @@ static struct misensor_reg const mt9m114_iq[] = {
        {MISENSOR_16BIT,        0xC87C, 0x005A},
        {MISENSOR_8BIT,   0xB42A, 0x05},
        {MISENSOR_8BIT,   0xA80A, 0x20},
+
+       /* Speed up AE/AWB */
+       {MISENSOR_16BIT,        0x098E, 0x2802},
+       {MISENSOR_16BIT,        0xA802, 0x0008},
+       {MISENSOR_8BIT,   0xC908, 0x01},
+       {MISENSOR_8BIT,   0xC879, 0x01},
+       {MISENSOR_8BIT,   0xC909, 0x02},
+       {MISENSOR_8BIT,   0xA80A, 0x18},
+       {MISENSOR_8BIT,   0xA80B, 0x18},
+       {MISENSOR_8BIT,   0xAC16, 0x18},
+       {MISENSOR_8BIT,   0xC878, 0x0E},
+
        {MISENSOR_TOK_TERM, 0, 0}
 };