Merge branch android-common-3.10
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / sid130B.c
index 89cbcfa1e8e5ae808dc983d799aa09c0cb3ba120..a022859546cfcb993a463d208fa00ab26539bd9a 100755 (executable)
@@ -19,7 +19,7 @@ o* Driver for MT9M001 CMOS Image Sensor from Micron
 #include <media/v4l2-common.h>\r
 #include <media/v4l2-chip-ident.h>\r
 #include <media/soc_camera.h>\r
-#include <mach/rk29_camera.h>\r
+#include <plat/rk_camera.h>\r
 \r
 static int debug;\r
 module_param(debug, int, S_IRUGO|S_IWUSR);\r
@@ -50,9 +50,9 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 #define SENSOR_MIN_HEIGHT   144\r
 #define SENSOR_MAX_WIDTH    1600\r
 #define SENSOR_MAX_HEIGHT   1200\r
-#define SENSOR_INIT_WIDTH      640                     /* Sensor pixel size for sensor_init_data array */\r
-#define SENSOR_INIT_HEIGHT  480\r
-#define SENSOR_INIT_WINSEQADR sensor_vga\r
+#define SENSOR_INIT_WIDTH      800                     /* Sensor pixel size for sensor_init_data array */\r
+#define SENSOR_INIT_HEIGHT  600\r
+#define SENSOR_INIT_WINSEQADR sensor_svga\r
 #define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8\r
 \r
 #define CONFIG_SENSOR_WhiteBalance 1\r
@@ -64,7 +64,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 #define CONFIG_SENSOR_DigitalZoom   0\r
 #define CONFIG_SENSOR_Focus         0\r
 #define CONFIG_SENSOR_Exposure      0\r
-#define CONFIG_SENSOR_Flash         0\r
+#define CONFIG_SENSOR_Flash         1\r
 #define CONFIG_SENSOR_Mirror        0\r
 #define CONFIG_SENSOR_Flip          0\r
 \r
@@ -89,9 +89,9 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 #define SENSOR_NAME_STRING(a) STR(CONS(SENSOR_NAME, a))\r
 #define SENSOR_NAME_VARFUN(a) CONS(SENSOR_NAME, a)\r
 \r
-#define SENSOR_AF_IS_ERR    (0x00<<0)
-#define SENSOR_AF_IS_OK                (0x01<<0)
-#define SENSOR_INIT_IS_ERR   (0x00<<28)
+#define SENSOR_AF_IS_ERR    (0x00<<0)\r
+#define SENSOR_AF_IS_OK                (0x01<<0)\r
+#define SENSOR_INIT_IS_ERR   (0x00<<28)\r
 #define SENSOR_INIT_IS_OK    (0x01<<28)\r
 \r
 struct reginfo\r
@@ -100,10 +100,23 @@ struct reginfo
     u8 val;\r
 };\r
 \r
+//flash off in fixed time to prevent from too hot , zyc\r
+struct  flash_timer{\r
+    struct soc_camera_device *icd;\r
+       struct hrtimer timer;\r
+};\r
+static enum hrtimer_restart flash_off_func(struct hrtimer *timer);\r
+\r
+static struct  flash_timer flash_off_timer;\r
+//for user defined if user want to customize the series , zyc\r
+#ifdef CONFIG_SID130B_USER_DEFINED_SERIES\r
+#include "sid130B_user_series.c"\r
+#else\r
 /* init 352X288 SVGA */\r
 static struct reginfo sensor_init_data[] =\r
 {\r
-       {0x00,  0x00},  \r
+#if 0\r
+          {0x00,  0x00},  \r
        {0x04,  0x00},  //Group A 0x10\r
        {0x05,  0x0F},  //UXGA Output\r
        {0x06,  0x86}, \r
@@ -738,8 +751,716 @@ static struct reginfo sensor_init_data[] =
        {0x00,  0x02}, \r
        {0x10,  0xd3}, \r
        {0xff,  0xff}, \r
+#else\r
+\r
+     {0x00,  0x00},  \r
+       {0x04,  0x00},  //Group A 0x10\r
+       {0x05,  0x0F},  //UXGA Output\r
+       {0x06,  0x86}, \r
+       {0x07,  0x08}, \r
+\r
+\r
+       {0x08,  0xa2},  //PLL on\r
+       {0x09,  0x12},  \r
+       {0x0A,  0x12},  \r
+       {0x10,  0x13},//17},  \r
+       {0x11,  0x01}, \r
+       {0x12,  0x8A}, \r
+\r
+    {0x13, 0x1a},//16},    \r
+    {0x15, 0x22},//16},    \r
+    {0x14, 0x27},//16},    \r
+    {0x17, 0xcb},//CF},    \r
+    {0x18, 0x38},//34},    \r
+    {0x41, 0x17},    \r
+    {0x42, 0x52},    \r
+                                              \r
+    //Flicker - 50Hz  - Still mode            \r
+    {0x00, 0x00},    \r
+       {0x20,  0x00}, \r
+       {0x21,  0x02}, \r
+       {0x23,  0x29},//15}, \r
+       {0x00,  0x01}, \r
+       {0x35,  0x50},//3c}, \r
 \r
+    //Flicker - 50Hz - Preview mode 24MHz MCLK\r
+    {0x00, 0x00},    \r
+    {0x24, 0x00},    \r
+       {0x25,  0xe6},//10}, \r
+       {0x27,  0x0d},//4b}, \r
+       {0x00,  0x01}, \r
+       {0x34,  0x80},//64}, \r
+       \r
+    //AE Block                                \r
+    {0x00, 0x01},    \r
+    {0x10, 0x80},    \r
+    {0x11, 0x0A},    \r
+    {0x12, 0x74},    \r
+    {0x13, 0x74},    \r
+    {0x14, 0x70},    \r
+    {0x17, 0xC4},    \r
+    {0x1c, 0x02},    \r
+                                              \r
+    {0x19, 0x00},//0x\r
+    {0x1A, 0x00},//0x\r
+    {0x1c, 0x02},    \r
+                                              \r
+    {0x36, 0x26},    \r
+                                              \r
+    {0x40, 0x40}, //M\r
+#if 0                                         \r
+    {0x41, 0x28},    \r
+    {0x42, 0x28},    \r
+    {0x43, 0x08},    \r
+    {0x44, 0x08},    \r
+    {0x45, 0x09},    \r
+    {0x46, 0x17},    \r
+    {0x47, 0x1D},    \r
+    {0x48, 0x21},    \r
+    {0x49, 0x23},    \r
+    {0x4A, 0x24},    \r
+    {0x4B, 0x26},    \r
+    {0x4C, 0x27},    \r
+    {0x4D, 0x27},    \r
+    {0x4E, 0x1A},    \r
+    {0x4F, 0x14},    \r
+    {0x50, 0x11},    \r
+    {0x51, 0x0F},    \r
+    {0x52, 0x0D},    \r
+    {0x53, 0x0C},    \r
+    {0x54, 0x0A},    \r
+    {0x55, 0x09},    \r
+#else                                         \r
+    {0x41, 0x20},    \r
+    {0x42, 0x20},    \r
+    {0x43, 0x00},    \r
+    {0x44, 0x00},    \r
+    {0x45, 0x01},    \r
+    {0x46, 0x0c},    \r
+    {0x47, 0x11},    \r
+    {0x48, 0x15},    \r
+    {0x49, 0x17},    \r
+    {0x4A, 0x1a},    \r
+    {0x4B, 0x1c},    \r
+    {0x4C, 0x1e},    \r
+    {0x4D, 0x1e},    \r
+    {0x4E, 0x0f},    \r
+    {0x4F, 0x09},    \r
+    {0x50, 0x07},    \r
+    {0x51, 0x05},    \r
+    {0x52, 0x04},    \r
+    {0x53, 0x03},    \r
+    {0x54, 0x02},    \r
+    {0x55, 0x01},    \r
+    {0x60, 0x7e},    \r
+    {0x61, 0xff},    \r
+    {0x62, 0xff},    \r
+    {0x63, 0xff},    \r
+    {0x64, 0xff},    \r
+    {0x65, 0x7e},    \r
+    {0x66, 0x50},    \r
+    {0x67, 0x50},    \r
+    {0x68, 0x50},    \r
+    {0x69, 0x50},    \r
+    {0x6A, 0x50},    \r
+    {0x6B, 0x00},    \r
+    {0x6C, 0x06},  \r
+       {0x9a, 0x80},\r
+       {0x6b, 0x80},\r
+\r
+\r
+#endif                                        \r
+                                              \r
+    //AWB Block                               \r
+    {0x00, 0x02},    \r
+    {0x10, 0xD3},    \r
+    {0x11, 0x11},    \r
+    {0x13, 0x80},    \r
+    {0x14, 0x80},    \r
+    {0x15, 0xE0},//FE},    \r
+    {0x16, 0x88},    \r
+    {0x17, 0xD0},    \r
+    {0x18, 0x78},    \r
+    {0x19, 0x98},    \r
+    {0x1A, 0x68},    \r
+    {0x1B, 0x8d},    \r
+    {0x1C, 0x68},    \r
+    {0x1D, 0x8C},    \r
+    {0x1E, 0x74},    \r
+    {0x20, 0xF0},    \r
+    {0x21, 0x70},    \r
+    {0x22, 0xa8},    \r
+    {0x23, 0x10},    \r
+    {0x25, 0x20},    \r
+    {0x26, 0x05},    \r
+    {0x27, 0x63},    \r
+    {0x28, 0x63},    \r
+    {0x29, 0xA0},    \r
+    {0x2A, 0x89},    \r
+    {0x30, 0x00},    \r
+    {0x31, 0x10},    \r
+    {0x32, 0x00},    \r
+    {0x33, 0x10},    \r
+    {0x34, 0x06},    \r
+    {0x35, 0x30},    \r
+    {0x36, 0x04},    \r
+    {0x37, 0xA0},    \r
+    {0x40, 0x01},    \r
+    {0x41, 0x04},    \r
+    {0x42, 0x08},    \r
+    {0x43, 0x10},    \r
+    {0x44, 0x13},    \r
+    {0x45, 0x6B},    \r
+    {0x46, 0x82},    \r
+    {0x52, 0x82},    \r
+        \r
+\r
+\r
+    //CMA change  -D65~A                      \r
+    {0x53, 0x86}, //A\r
+    {0x54, 0xA0}, //A\r
+    {0x55, 0x88}, //A\r
+    {0x56, 0x9F}, //A\r
+    {0x57, 0xA5}, //A\r
+    {0x58, 0x89}, //A\r
+    {0x59, 0xA6}, //A\r
+    {0x5A, 0x87}, //A\r
+                                              \r
+    {0x64, 0x00}, //T\r
+    {0x65, 0x00},    \r
+    {0x66, 0x00}, //T\r
+    {0x67, 0x00},    \r
+    {0x68, 0xA5}, //T\r
+    {0x69, 0xB4},    \r
+    {0x6A, 0xB3}, //T\r
+    {0x6B, 0xAC},    \r
+    {0x6C, 0xB7}, //T\r
+    {0x6D, 0x98},    \r
+    {0x6E, 0xBA}, //T\r
+    {0x6F, 0x90},    \r
+    {0x70, 0xBF}, //T\r
+    {0x71, 0x9B},    \r
+    {0x72, 0xCE}, //T\r
+    {0x73, 0x8C},    \r
+\r
+        \r
+                //IDP\r
+        \r
+\r
+    {0x74, 0x7F}, //T\r
+    {0x75, 0x8C}, //T\r
+    {0x76, 0xAD}, //T\r
+    {0x77, 0xBA}, //T\r
+    {0x78, 0x8F}, //T\r
+    {0x79, 0x9A}, //T\r
+    {0x7A, 0xA3}, //T\r
+    {0x7B, 0xAC}, //T\r
+    {0x7C, 0xA0}, //T\r
+    {0x7D, 0xA9}, //T\r
+    {0x7E, 0x95}, //T\r
+    {0x7F, 0xAC}, //T\r
+    {0x80, 0xAD}, //T\r
+    {0x81, 0xBC}, //T\r
+    {0x82, 0x98}, //T\r
+    {0x83, 0xA4}, //T\r
+    {0x84, 0x00}, //T\r
+    {0x85, 0x00}, //T\r
+    {0x86, 0x00}, //T\r
+    {0x87, 0x00}, //T\r
+    {0x88, 0xC9}, //T\r
+    {0x89, 0xD5}, //T\r
+    {0x8A, 0x70}, //T\r
+    {0x8B, 0x7B}, //T\r
+    {0x8C, 0xD0}, //T\r
+    {0x8D, 0xE5}, //T\r
+    {0x8E, 0x58}, //T\r
+    {0x8F, 0x70}, //T\r
+                                              \r
+    {0xB4, 0x05},    \r
+    {0xB5, 0x0F},    \r
+    {0xB6, 0x06},    \r
+    {0xB7, 0x06},    \r
+    {0xB8, 0x40},    \r
+    {0xB9, 0x10},    \r
+    {0xBA, 0x06},    \r
+                                              \r
+    //IDP                                     \r
+    {0x00, 0x03},    \r
+    {0x10, 0xFF},    \r
+    {0x11, 0x1D},    \r
+    {0x12, 0x1D},    \r
+    {0x13, 0xFB},    \r
+    {0x14, 0x00}, \r
+    {0x15, 0xc0},    \r
+                                              \r
+    //DPC                                     \r
+    {0x30, 0x88}, //D\r
+    {0x31, 0x14},//04}, //D\r
+    {0x32, 0x10}, //D\r
+    {0x33, 0x0C}, //D\r
+    {0x34, 0x08}, //D\r
+    {0x35, 0x04}, //D\r
+    {0x36, 0x44}, //D\r
+    {0x37, 0x66}, //D\r
+    {0x38, 0x00}, //0\r
+    {0x39, 0x08}, //0\r
+    {0x3A, 0x08}, //0\r
+    {0x3B, 0x20}, //0\r
+    {0x3C, 0x20}, // \r
+    {0x3D, 0x04}, //N\r
+    {0x3E, 0x08}, //N\r
+    {0x3F, 0x10}, //N\r
+    {0x40, 0x10}, //N\r
+    {0x41, 0x20}, //N\r
+    {0x42, 0xFF}, //N\r
+    {0x43, 0x40},//F0}, //N\r
+    {0x44, 0x40}, //B\r
+    {0x45, 0x06},//09}, //S\r
+    {0x46, 0x40}, //S\r
+    {0x47, 0x30}, //I\r
+\r
+               //DPC\r
+ #if 0                                             \r
+    //Shading                                 \r
+    {0x50, 0x24}, //R\r
+    {0x51, 0x44}, //R\r
+    {0x52, 0x20}, //R\r
+    {0x53, 0x30}, //R\r
+                                              \r
+    {0x54, 0x20}, //G\r
+    {0x55, 0x20}, //G\r
+    {0x56, 0x00}, //G\r
+    {0x57, 0x10}, //G\r
+                                              \r
+    {0x58, 0x20}, //G\r
+    {0x59, 0x20}, //G\r
+    {0x5A, 0x00}, //G\r
+    {0x5B, 0x10}, //G\r
+                                              \r
+    {0x5C, 0x34}, //B\r
+    {0x5D, 0x48}, //B\r
+    {0x5E, 0x18}, //B\r
+    {0x5F, 0x2a}, //B\r
+                                              \r
+    {0x60, 0x32}, //#\r
+    {0x61, 0x00}, //#\r
+    {0x62, 0x67}, //#\r
+                                              \r
+    {0x6B, 0x23},    \r
+    {0x6C, 0x44},    \r
+    {0x6D, 0x45},    \r
+    {0x6E, 0x67},    \r
+    {0x6F, 0x8a},    \r
+    {0x70, 0x89}, \r
+    \r
+    {0x71, 0x34},    \r
+    {0x72, 0x45},    \r
+    {0x73, 0x56},    \r
+    {0x74, 0x77},    \r
+    {0x75, 0x78},    \r
+    {0x76, 0x89},    \r
+\r
+       {0x77, 0x34},    \r
+    {0x78, 0x45},    \r
+    {0x79, 0x56},    \r
+    {0x7A, 0x77},    \r
+    {0x7B, 0x78},    \r
+    {0x7C, 0x89},    \r
+\r
+       {0x7D, 0x22},    \r
+    {0x7E, 0x32},    \r
+    {0x7F, 0x34},    \r
+    {0x80, 0x45},    \r
+    {0x81, 0x56},    \r
+    {0x82, 0x67},    \r
+    {0x83, 0x1f},    \r
+    {0x84, 0x50},    \r
+#endif\r
+\r
+    //Shading                                 \r
+    {0x50, 0x0b}, //R\r
+    {0x51, 0x0b}, //R\r
+    {0x52, 0x19}, //R\r
+    {0x53, 0x18}, //R\r
+                                              \r
+    {0x54, 0x10}, //G\r
+    {0x55, 0x00}, //G\r
+    {0x56, 0x08}, //G\r
+    {0x57, 0x00}, //G\r
+                                              \r
+    {0x58, 0x10}, //G\r
+    {0x59, 0x00}, //G\r
+    {0x5A, 0x08}, //G\r
+    {0x5B, 0x00}, //G\r
+                                              \r
+    {0x5C, 0x14}, //B\r
+    {0x5D, 0x0f}, //B\r
+    {0x5E, 0x24}, //B\r
+    {0x5F, 0x12}, //B\r
+                                              \r
+    {0x60, 0x32}, //#\r
+    {0x61, 0x00}, //#\r
+    {0x62, 0x67}, //#\r
+                                              \r
+    {0x6B, 0x23},    \r
+    {0x6C, 0x44},    \r
+    {0x6D, 0x44},    \r
+    {0x6E, 0x45},    \r
+    {0x6F, 0x44},    \r
+    {0x70, 0x00}, \r
+    \r
+    {0x71, 0x23},    \r
+    {0x72, 0x44},    \r
+    {0x73, 0x55},    \r
+    {0x74, 0x55},    \r
+    {0x75, 0x55},    \r
+    {0x76, 0x00},    \r
+\r
+       {0x77, 0x23},    \r
+    {0x78, 0x44},    \r
+    {0x79, 0x55},    \r
+    {0x7A, 0x55},    \r
+    {0x7B, 0x55},    \r
+    {0x7C, 0x00},    \r
+\r
+       {0x7D, 0x23},    \r
+    {0x7E, 0x44},    \r
+    {0x7F, 0x34},    \r
+    {0x80, 0x43},    \r
+    {0x81, 0x44},    \r
+    {0x82, 0x00},    \r
+    {0x83, 0x12},    \r
+    {0x84, 0x14},\r
+\r
+                                              \r
+    //Interpolation                           \r
+    {0xA0, 0x2F},    \r
+    {0xA1, 0xB7},    \r
+    {0xA2, 0xB7},    \r
+    {0xA3, 0xB7},    \r
+    {0xA4, 0x04},    \r
+    {0xA5, 0xFF},    \r
+    {0xA6, 0x06},    \r
+    {0xA7, 0xFF},    \r
+    {0xA8, 0x00},    \r
+    {0xA9, 0x00},    \r
+    {0xAA, 0x00},    \r
+    {0xAB, 0x00},    \r
+    {0xAC, 0x60},    \r
+    {0xAD, 0x18},    \r
+    {0xAE, 0x0c},    \r
+    {0xAF, 0x14},    \r
+    {0xB0, 0x08},    \r
+    {0xB1, 0x00},    \r
+\r
+\r
+    //Color Matrix for D65                    \r
+    {0xC0, 0xAF},// C\r
+    {0xC1, 0x66},    \r
+    {0xC2, 0xd4},    \r
+    {0xC3, 0x06},    \r
+    {0xC4, 0xf0},    \r
+    {0xC5, 0x5a},    \r
+    {0xC6, 0xF6},    \r
+    {0xC7, 0xF9},    \r
+    {0xC8, 0xbf},    \r
+    {0xC9, 0x88},    \r
+    {0xCA, 0x00},    \r
+    {0xCB, 0x00},    \r
+    {0xCC, 0x00},    \r
+    {0xCD, 0x00},    \r
+    {0xCE, 0x00},    \r
+    //Color Matrix for CWF                    \r
+    {0xD0, 0x2F},    \r
+    {0xD1, 0x72},    \r
+    {0xD2, 0xC9},    \r
+    {0xD3, 0x04},    \r
+    {0xD4, 0xE3},    \r
+    {0xD5, 0x60},    \r
+    {0xD6, 0xFC},    \r
+    {0xD7, 0xF5},    \r
+    {0xD8, 0xb0},    \r
+    {0xD9, 0x99},    \r
+    {0xDA, 0xC3},    \r
+    {0xDB, 0x14},    \r
+    {0xDC, 0x3A},    \r
+    {0xDD, 0xAD},    \r
+    {0xDE, 0x09},    \r
+                                              \r
+    //Color Matrix for A                      \r
+    {0xE0, 0x2F},    \r
+    {0xE1, 0x5C},    \r
+    {0xE2, 0xDD},    \r
+    {0xE3, 0x06},    \r
+    {0xE4, 0xE0},    \r
+    {0xE5, 0x69},    \r
+    {0xE6, 0xF6},    \r
+    {0xE7, 0xE5},    \r
+    {0xE8, 0xAB},    \r
+    {0xE9, 0xAE},    \r
+    {0xEA, 0x6A},    \r
+    {0xEB, 0x01},    \r
+    {0xEC, 0x2D},    \r
+    {0xED, 0xEE},    \r
+    {0xEE, 0x04},    \r
+                                              \r
+    //IDP 2                                   \r
+    {0x00, 0x04},    \r
+                                              \r
+    //Gamma - R                               \r
+    {0x10, 0x00},    \r
+    {0x11, 0x06},    \r
+    {0x12, 0x0e},    \r
+    {0x13, 0x20},    \r
+    {0x14, 0x40},    \r
+    {0x15, 0x5e},    \r
+    {0x16, 0x74},    \r
+    {0x17, 0x87},    \r
+    {0x18, 0x98},    \r
+    {0x19, 0xa6},    \r
+    {0x1A, 0xb3},    \r
+    {0x1B, 0xca},    \r
+    {0x1C, 0xde},    \r
+    {0x1D, 0xf0},    \r
+    {0x1E, 0xf8},    \r
+    {0x1F, 0xff},    \r
+\r
+\r
+    //Gamma - G                               \r
+    {0x20, 0x00},    \r
+    {0x21, 0x06},    \r
+    {0x22, 0x0e},    \r
+    {0x23, 0x20},    \r
+    {0x24, 0x40},    \r
+    {0x25, 0x5e},    \r
+    {0x26, 0x74},    \r
+    {0x27, 0x87},    \r
+    {0x28, 0x98},    \r
+    {0x29, 0xa6},    \r
+    {0x2A, 0xb3},    \r
+    {0x2B, 0xca},    \r
+    {0x2C, 0xde},    \r
+    {0x2D, 0xf0},    \r
+    {0x2E, 0xf8},    \r
+    {0x2F, 0xff},    \r
+                                              \r
+    //Gamma - B                               \r
+    {0x30, 0x00},    \r
+    {0x31, 0x06},    \r
+    {0x32, 0x0e},    \r
+    {0x33, 0x20},    \r
+    {0x34, 0x40},    \r
+    {0x35, 0x5e},    \r
+    {0x36, 0x74},    \r
+    {0x37, 0x87},    \r
+    {0x38, 0x98},    \r
+    {0x39, 0xa6},    \r
+    {0x3A, 0xb3},    \r
+    {0x3B, 0xca},    \r
+    {0x3C, 0xde},    \r
+    {0x3D, 0xf0},    \r
+    {0x3E, 0xf8},    \r
+    {0x3F, 0xff},    \r
+                                              \r
+    //CSC                                     \r
+    {0x60, 0x33},    \r
+    {0x61, 0x20},    \r
+    {0x62, 0xE4},    \r
+    {0x63, 0xFA},    \r
+    {0x64, 0x13},    \r
+    {0x65, 0x25},    \r
+    {0x66, 0x07},    \r
+    {0x67, 0xF5},    \r
+    {0x68, 0xEA},    \r
+    {0x69, 0x20},    \r
+    {0x6A, 0xC8},    \r
+    {0x6B, 0xC4},    \r
+    {0x6C, 0x84},    \r
+    {0x6D, 0x04},    \r
+    {0x6E, 0x0C},    \r
+    {0x6F, 0x00},    \r
+\r
+\r
+    //Edge                                    \r
+    {0x80, 0xa2},    \r
+    {0x81, 0x10},    \r
+    {0x82, 0x10},    \r
+    {0x83, 0x04},    \r
+    {0x84, 0x0a},    \r
+    {0x85, 0x06},    \r
+    {0x86, 0x00},    \r
+    {0x87, 0x04},    \r
+    {0x88, 0x0a},    \r
+    {0x89, 0x06},    \r
+    {0x8a, 0x10},    \r
+    {0x8b, 0x30},    \r
+    {0x8c, 0x30},    \r
+    {0X90, 0x16},    \r
+    {0x91, 0x03},    \r
+    {0x93, 0xE0},    \r
+\r
+    //Cr/Cb Coring                            \r
+    {0x94, 0x00},    \r
+    {0x95, 0x00},    \r
+    {0x96, 0x4c},    \r
+    {0x97, 0x66},    \r
+    {0x9A, 0xf5},    \r
+    {0xA1, 0x08},    \r
+    {0xA2, 0x10},    \r
+    {0xA3, 0x16},    \r
+    {0xA4, 0x14},    \r
+    {0xA5, 0x18},    \r
+    {0xA6, 0xa0},    \r
+    {0xA7, 0x06},    \r
+    {0xA8, 0x40},    \r
+                                              \r
+    {0xA9, 0x20},    \r
+    {0xAA, 0x28},    \r
+    {0xAc, 0xff},    \r
+    {0xAd, 0x09},    \r
+    {0xAe, 0x18},    \r
+    {0xAf, 0x18},    \r
+                                              \r
+    {0xB2, 0x24},    \r
+    {0xB3, 0x54},    \r
+    {0xB6, 0x08},    \r
+                                            \r
+    //Color Saturation                        \r
+    {0xBC, 0x10},    \r
+    {0xBD, 0x10},    \r
+    {0xBE, 0x10},    \r
+    {0xBF, 0x10},    \r
+    {0xc2, 0x12},    \r
+    {0xc3, 0x12},    \r
+                                              \r
+    //IDP 3                                   \r
+    {0x00, 0x05},    \r
+                                              \r
+    //Memory                                  \r
+    {0x40, 0x15},    \r
+    {0x41, 0x28},    \r
+    {0x42, 0x04},    \r
+    {0x43, 0x15},    \r
+    {0x44, 0x28},    \r
+    {0x45, 0x04},    \r
+    {0x46, 0x15},    \r
+    {0x47, 0x28},    \r
+    {0x48, 0x04},    \r
+                                              \r
+    //Knee                                    \r
+    {0x90, 0x00}, // \r
+    {0x91, 0x00}, //k\r
+    {0x92, 0x00}, //k\r
+    {0x93, 0x00}, //K\r
+    {0x94, 0x00}, //[\r
+    {0x95, 0x00}, //k\r
+    {0x96, 0x00}, //k\r
+                                              \r
+    //ADG                                     \r
+    #if 0                                     \r
+    {0x99, 0xC0},    \r
+    {0xA0, 0x10},    \r
+    {0xA1, 0x22},    \r
+    {0xA2, 0x36},    \r
+    {0xA3, 0x49},    \r
+    {0xA4, 0x5D},    \r
+    {0xA5, 0x70},    \r
+    {0xA6, 0x82},    \r
+    {0xA7, 0x94},    \r
+    {0xA8, 0xA5},    \r
+    {0xA9, 0xB5},    \r
+    {0xAA, 0xC3},    \r
+    {0xAB, 0xD1},    \r
+    {0xAC, 0xDE},    \r
+    {0xAD, 0xEA},    \r
+    {0xAE, 0xF5},    \r
+    {0xAF, 0xFF},    \r
+    //YXGMA                                   \r
+    {0xB0, 0xc0}, //Y\r
+    {0xB1, 0x04}, //Y\r
+    {0xB8, 0x0f}, //D\r
+    {0xB9, 0x10}, //D\r
+    //{0xBA, 0x38}, /\r
+    //{0xBB, 0x39}, /\r
+    {0xC0, 0x03},    \r
+    {0xC1, 0x0E},    \r
+    {0xC2, 0x16},    \r
+    {0xC3, 0x24},    \r
+    {0xC4, 0x3F},    \r
+    {0xC5, 0x56},    \r
+    {0xC6, 0x6A},    \r
+    {0xC7, 0x7C},    \r
+    {0xC8, 0x8C},    \r
+    {0xC9, 0x98},    \r
+    {0xCA, 0xA2},    \r
+    {0xCB, 0xB8},    \r
+    {0xCC, 0xCD},    \r
+    {0xCD, 0xE2},    \r
+    {0xCE, 0xF0},    \r
+    {0xCF, 0xFF},    \r
+   #else                                      \r
+    {0x99, 0x00},    \r
+    {0xA0, 0x00},    \r
+    {0xA1, 0x00},    \r
+    {0xA2, 0x00},    \r
+    {0xA3, 0x00},    \r
+    {0xA4, 0x00},    \r
+    {0xA5, 0x00},    \r
+    {0xA6, 0x00},    \r
+    {0xA7, 0x00},    \r
+    {0xA8, 0x00},    \r
+    {0xA9, 0x00},    \r
+    {0xAA, 0x00},    \r
+    {0xAB, 0x00},    \r
+    {0xAC, 0x00},    \r
+    {0xAD, 0x00},    \r
+    {0xAE, 0x00},    \r
+    {0xAF, 0x00},    \r
+                                              \r
+    //YXGMA                                   \r
+    {0xB0, 0x00}, //Y\r
+    {0xB1, 0x00}, //Y\r
+    {0xB8, 0x00}, //D\r
+    {0xB9, 0x00}, //D\r
+    //{0xBA, 0x38}, /\r
+    //{0xBB, 0x39}, /\r
+    {0xC0, 0x00},    \r
+    {0xC1, 0x00},    \r
+    {0xC2, 0x00},    \r
+    {0xC3, 0x00},    \r
+    {0xC4, 0x00},    \r
+    {0xC5, 0x00},    \r
+    {0xC6, 0x00},    \r
+    {0xC7, 0x00},    \r
+    {0xC8, 0x00},    \r
+    {0xC9, 0x00},    \r
+    {0xCA, 0x00},    \r
+    {0xCB, 0x00},    \r
+    {0xCC, 0x00},    \r
+    {0xCD, 0x00},    \r
+    {0xCE, 0x00},    \r
+    {0xCF, 0x00},    \r
+    {0xe0, 0x01},    \r
+    {0xe1, 0x03},    \r
+    {0xe2, 0x04},    \r
+    {0xe3, 0x0c},    \r
+    {0xe4, 0x11},    \r
+    {0xe5, 0x16},    \r
+    {0xe6, 0x1b},    \r
+    {0xe7, 0x24},    \r
+    {0xe8, 0x30},    \r
+  #endif                                      \r
+    //Sensor on                               \r
+       {0x00,  0x00}, \r
+       {0x03,  0xc5}, \r
+       {0x00,  0x01}, \r
+       {0x10,  0x84}, \r
+       {0x00,  0x02}, \r
+       {0x10,  0xd3}, \r
+       {0xff,  0xff},                            \r
+  \r
 \r
+#endif\r
 };\r
 \r
 /* 1600X1200 UXGA */\r
@@ -830,7 +1551,7 @@ static struct reginfo sensor_qcif[] =
        {0x97,0x90}, \r
        {0xff, 0xff},\r
 };\r
-\r
+#endif\r
 static  struct reginfo sensor_ClrFmt_YUYV[]=\r
 {\r
     {0xff, 0xff}\r
@@ -1176,7 +1897,7 @@ static struct reginfo sensor_Zoom3[] =
 };\r
 static struct reginfo *sensor_ZoomSeqe[] = {sensor_Zoom0, sensor_Zoom1, sensor_Zoom2, sensor_Zoom3, NULL,};\r
 #endif\r
-static const struct v4l2_querymenu sensor_menus[] =\r
+static  struct v4l2_querymenu sensor_menus[] =\r
 {\r
        #if CONFIG_SENSOR_WhiteBalance\r
     { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 0,  .name = "auto",  .reserved = 0, }, {  .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 1, .name = "incandescent",  .reserved = 0,},\r
@@ -1200,7 +1921,7 @@ static const struct v4l2_querymenu sensor_menus[] =
     #endif\r
 };\r
 \r
-static const struct v4l2_queryctrl sensor_controls[] =\r
+static  struct v4l2_queryctrl sensor_controls[] =\r
 {\r
        #if CONFIG_SENSOR_WhiteBalance\r
     {\r
@@ -1393,28 +2114,28 @@ static struct soc_camera_ops sensor_ops =
     .num_menus         = ARRAY_SIZE(sensor_menus),\r
 };\r
 \r
-/* only one fixed colorspace per pixelcode */
-struct sensor_datafmt {
-       enum v4l2_mbus_pixelcode code;
-       enum v4l2_colorspace colorspace;
-};
-
-/* Find a data format by a pixel code in an array */
-static const struct sensor_datafmt *sensor_find_datafmt(
-       enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,
-       int n)
-{
-       int i;
-       for (i = 0; i < n; i++)
-               if (fmt[i].code == code)
-                       return fmt + i;
-
-       return NULL;
-}
-
-static const struct sensor_datafmt sensor_colour_fmts[] = {
-    {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},
-    {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}    
+/* only one fixed colorspace per pixelcode */\r
+struct sensor_datafmt {\r
+       enum v4l2_mbus_pixelcode code;\r
+       enum v4l2_colorspace colorspace;\r
+};\r
+\r
+/* Find a data format by a pixel code in an array */\r
+static const struct sensor_datafmt *sensor_find_datafmt(\r
+       enum v4l2_mbus_pixelcode code, const struct sensor_datafmt *fmt,\r
+       int n)\r
+{\r
+       int i;\r
+       for (i = 0; i < n; i++)\r
+               if (fmt[i].code == code)\r
+                       return fmt + i;\r
+\r
+       return NULL;\r
+}\r
+\r
+static const struct sensor_datafmt sensor_colour_fmts[] = {\r
+    {V4L2_MBUS_FMT_UYVY8_2X8, V4L2_COLORSPACE_JPEG},\r
+    {V4L2_MBUS_FMT_YUYV8_2X8, V4L2_COLORSPACE_JPEG}    \r
 };\r
 \r
 typedef struct sensor_info_priv_s\r
@@ -1504,6 +2225,7 @@ static int sensor_write(struct i2c_client *client, u8 reg, u8 val)
     //buf[0] = reg >> 8;\r
     buf[0] = reg & 0xFF;\r
     buf[1] = val;\r
+       //printk("%s----%d-----\n",__func__,__LINE__);\r
 \r
     msg->addr = client->addr;\r
     msg->flags = client->flags;\r
@@ -1528,7 +2250,7 @@ static int sensor_write(struct i2c_client *client, u8 reg, u8 val)
 \r
     return err;\r
 }\r
-\r
+#if 0\r
 /* sensor register read */\r
 static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)\r
 {\r
@@ -1569,7 +2291,7 @@ static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)
 \r
     return err;\r
 }\r
-\r
+#endif\r
 /* write a array of registers  */\r
 static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)\r
 {\r
@@ -1662,6 +2384,11 @@ static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd
 \r
                        if (sensor->sensor_io_request && sensor->sensor_io_request->sensor_ioctrl) {\r
                                sensor->sensor_io_request->sensor_ioctrl(icd->pdev,Cam_Flash, on);\r
+                if(on){\r
+                    //flash off after 2 secs\r
+                       hrtimer_cancel(&(flash_off_timer.timer));\r
+                       hrtimer_start(&(flash_off_timer.timer),ktime_set(0, 800*1000*1000),HRTIMER_MODE_REL);\r
+                    }\r
                        }\r
             break;\r
                }\r
@@ -1674,15 +2401,22 @@ static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd
 sensor_power_end:\r
        return ret;\r
 }\r
+\r
+static enum hrtimer_restart flash_off_func(struct hrtimer *timer){\r
+       struct flash_timer *fps_timer = container_of(timer, struct flash_timer, timer);\r
+    sensor_ioctrl(fps_timer->icd,Sensor_Flash,0);\r
+       SENSOR_DG("%s %s !!!!!!",SENSOR_NAME_STRING(),__FUNCTION__);\r
+    return 0;\r
+    \r
+}\r
 static int sensor_init(struct v4l2_subdev *sd, u32 val)\r
 {\r
-    struct i2c_client *client = sd->priv;\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
     struct soc_camera_device *icd = client->dev.platform_data;\r
     struct sensor *sensor = to_sensor(client);\r
        const struct v4l2_queryctrl *qctrl;\r
     const struct sensor_datafmt *fmt;\r
-    char value;\r
-    int ret,pid = 0;\r
+    int ret;\r
 \r
     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
 \r
@@ -1743,6 +2477,7 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
         goto sensor_INIT_ERR;\r
     }\r
 #endif\r
+\r
     ret = sensor_write_array(client, sensor_init_data);\r
     if (ret != 0)\r
     {\r
@@ -1752,11 +2487,11 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
     sensor_task_lock(client,0);\r
     sensor->info_priv.winseqe_cur_addr  = (int)SENSOR_INIT_WINSEQADR;\r
     fmt = sensor_find_datafmt(SENSOR_INIT_PIXFMT,sensor_colour_fmts, ARRAY_SIZE(sensor_colour_fmts));\r
-    if (!fmt) {
-        SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());
-        ret = -EINVAL;
-        goto sensor_INIT_ERR;
-    }
+    if (!fmt) {\r
+        SENSOR_TR("error: %s initial array colour fmts is not support!!",SENSOR_NAME_STRING());\r
+        ret = -EINVAL;\r
+        goto sensor_INIT_ERR;\r
+    }\r
        sensor->info_priv.fmt = *fmt;\r
 \r
     /* sensor sensor information for initialization  */\r
@@ -1801,10 +2536,11 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
        #endif\r
 \r
        #if CONFIG_SENSOR_Flash\r
-       sensor_set_flash();\r
        qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);\r
        if (qctrl)\r
         sensor->info_priv.flash = qctrl->default_value;\r
+    flash_off_timer.icd = icd;\r
+       flash_off_timer.timer.function = flash_off_func;\r
     #endif\r
 \r
     SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),((val == 0)?__FUNCTION__:"sensor_reinit"),icd->user_width,icd->user_height);\r
@@ -1897,58 +2633,58 @@ static unsigned long sensor_query_bus_param(struct soc_camera_device *icd)
     return soc_camera_apply_sensor_flags(icl, flags);\r
 }\r
 \r
-static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
-    struct i2c_client *client = sd->priv;
-    struct soc_camera_device *icd = client->dev.platform_data;
-    struct sensor *sensor = to_sensor(client);
-
-    mf->width  = icd->user_width;
-       mf->height      = icd->user_height;
-       mf->code        = sensor->info_priv.fmt.code;
-       mf->colorspace  = sensor->info_priv.fmt.colorspace;
-       mf->field       = V4L2_FIELD_NONE;
-
-    return 0;
-}
-static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
-    bool ret = false;
-
-       if ((mf->width == 1024) && (mf->height == 768)) {
-               ret = true;
-       } else if ((mf->width == 1280) && (mf->height == 1024)) {
-               ret = true;
-       } else if ((mf->width == 1600) && (mf->height == 1200)) {
-               ret = true;
-       } else if ((mf->width == 2048) && (mf->height == 1536)) {
-               ret = true;
-       } else if ((mf->width == 2592) && (mf->height == 1944)) {
-               ret = true;
-       }
-
-       if (ret == true)
-               SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);
-       return ret;
-}
-
-static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
-    bool ret = false;
-
-       if ((mf->width == 1280) && (mf->height == 720)) {
-               ret = true;
-       } else if ((mf->width == 1920) && (mf->height == 1080)) {
-               ret = true;
-       }
-
-       if (ret == true)
-               SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);
-       return ret;
-}
+static int sensor_g_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
+    struct soc_camera_device *icd = client->dev.platform_data;\r
+    struct sensor *sensor = to_sensor(client);\r
+\r
+    mf->width  = icd->user_width;\r
+       mf->height      = icd->user_height;\r
+       mf->code        = sensor->info_priv.fmt.code;\r
+       mf->colorspace  = sensor->info_priv.fmt.colorspace;\r
+       mf->field       = V4L2_FIELD_NONE;\r
+\r
+    return 0;\r
+}\r
+static bool sensor_fmt_capturechk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+    bool ret = false;\r
+\r
+       if ((mf->width == 1024) && (mf->height == 768)) {\r
+               ret = true;\r
+       } else if ((mf->width == 1280) && (mf->height == 1024)) {\r
+               ret = true;\r
+       } else if ((mf->width == 1600) && (mf->height == 1200)) {\r
+               ret = true;\r
+       } else if ((mf->width == 2048) && (mf->height == 1536)) {\r
+               ret = true;\r
+       } else if ((mf->width == 2592) && (mf->height == 1944)) {\r
+               ret = true;\r
+       }\r
+\r
+       if (ret == true)\r
+               SENSOR_DG("%s %dx%d is capture format\n", __FUNCTION__, mf->width, mf->height);\r
+       return ret;\r
+}\r
+\r
+static bool sensor_fmt_videochk(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+    bool ret = false;\r
+\r
+       if ((mf->width == 1280) && (mf->height == 720)) {\r
+               ret = true;\r
+       } else if ((mf->width == 1920) && (mf->height == 1080)) {\r
+               ret = true;\r
+       }\r
+\r
+       if (ret == true)\r
+               SENSOR_DG("%s %dx%d is video format\n", __FUNCTION__, mf->width, mf->height);\r
+       return ret;\r
+}\r
 static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
 {\r
-    struct i2c_client *client = sd->priv;\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
     struct sensor *sensor = to_sensor(client);\r
     const struct sensor_datafmt *fmt;\r
        const struct v4l2_queryctrl *qctrl;\r
@@ -1956,40 +2692,40 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
     struct reginfo *winseqe_set_addr=NULL;\r
     int ret=0, set_w,set_h;\r
 \r
-       fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
-                                  ARRAY_SIZE(sensor_colour_fmts));
-       if (!fmt) {
-        ret = -EINVAL;
-        goto sensor_s_fmt_end;
-    }
-
-       if (sensor->info_priv.fmt.code != mf->code) {
-               switch (mf->code)
-               {
-                       case V4L2_MBUS_FMT_YUYV8_2X8:
-                       {
-                               winseqe_set_addr = sensor_ClrFmt_YUYV;
-                               break;
-                       }
-                       case V4L2_MBUS_FMT_UYVY8_2X8:
-                       {
-                               winseqe_set_addr = sensor_ClrFmt_UYVY;
-                               break;
-                       }
-                       default:
-                               break;
-               }
-               if (winseqe_set_addr != NULL) {
-            sensor_write_array(client, winseqe_set_addr);
-                       sensor->info_priv.fmt.code = mf->code;
-            sensor->info_priv.fmt.colorspace= mf->colorspace;            
-                       SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);
-               } else {
-                       SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);
-               }
-       }
-
-    set_w = mf->width;
+       fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
+                                  ARRAY_SIZE(sensor_colour_fmts));\r
+       if (!fmt) {\r
+        ret = -EINVAL;\r
+        goto sensor_s_fmt_end;\r
+    }\r
+\r
+       if (sensor->info_priv.fmt.code != mf->code) {\r
+               switch (mf->code)\r
+               {\r
+                       case V4L2_MBUS_FMT_YUYV8_2X8:\r
+                       {\r
+                               winseqe_set_addr = sensor_ClrFmt_YUYV;\r
+                               break;\r
+                       }\r
+                       case V4L2_MBUS_FMT_UYVY8_2X8:\r
+                       {\r
+                               winseqe_set_addr = sensor_ClrFmt_UYVY;\r
+                               break;\r
+                       }\r
+                       default:\r
+                               break;\r
+               }\r
+               if (winseqe_set_addr != NULL) {\r
+            sensor_write_array(client, winseqe_set_addr);\r
+                       sensor->info_priv.fmt.code = mf->code;\r
+            sensor->info_priv.fmt.colorspace= mf->colorspace;            \r
+                       SENSOR_DG("%s v4l2_mbus_code:%d set success!\n", SENSOR_NAME_STRING(),mf->code);\r
+               } else {\r
+                       SENSOR_TR("%s v4l2_mbus_code:%d is invalidate!\n", SENSOR_NAME_STRING(),mf->code);\r
+               }\r
+       }\r
+\r
+    set_w = mf->width;\r
     set_h = mf->height;\r
 \r
        if (((set_w <= 176) && (set_h <= 144)) &&( sensor_qcif[0].reg!=0xff))\r
@@ -2050,7 +2786,7 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
 \r
     if ((int)winseqe_set_addr  != sensor->info_priv.winseqe_cur_addr) {\r
         #if CONFIG_SENSOR_Flash\r
-        if (sensor_fmt_capturechk(sd,f) == true) {      /* ddl@rock-chips.com : Capture */\r
+        if (sensor_fmt_capturechk(sd,mf) == true) {      /* ddl@rock-chips.com : Capture */\r
             if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
                 sensor_ioctrl(icd, Sensor_Flash, Flash_On);\r
                 SENSOR_DG("%s flash on in capture!\n", SENSOR_NAME_STRING());\r
@@ -2066,7 +2802,7 @@ static int sensor_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
         if (ret != 0) {\r
             SENSOR_TR("%s set format capability failed\n", SENSOR_NAME_STRING());\r
             #if CONFIG_SENSOR_Flash\r
-            if (sensor_fmt_capturechk(sd,f) == true) {\r
+            if (sensor_fmt_capturechk(sd,mf) == true) {\r
                 if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
                     sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
                     SENSOR_TR("%s Capture format set fail, flash off !\n", SENSOR_NAME_STRING());\r
@@ -2126,38 +2862,88 @@ sensor_s_fmt_end:
     return ret;\r
 }\r
 \r
-static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
-{
-    struct i2c_client *client = sd->priv;
-    struct sensor *sensor = to_sensor(client);
-    const struct sensor_datafmt *fmt;
-    int ret = 0;
-   
-       fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,
-                                  ARRAY_SIZE(sensor_colour_fmts));
-       if (fmt == NULL) {
-               fmt = &sensor->info_priv.fmt;
-        mf->code = fmt->code;
-       } 
-
-    if (mf->height > SENSOR_MAX_HEIGHT)
-        mf->height = SENSOR_MAX_HEIGHT;
-    else if (mf->height < SENSOR_MIN_HEIGHT)
-        mf->height = SENSOR_MIN_HEIGHT;
-
-    if (mf->width > SENSOR_MAX_WIDTH)
-        mf->width = SENSOR_MAX_WIDTH;
-    else if (mf->width < SENSOR_MIN_WIDTH)
-        mf->width = SENSOR_MIN_WIDTH;
-
-    mf->colorspace = fmt->colorspace;
-    
-    return ret;
+static int sensor_try_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)\r
+{\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
+    struct sensor *sensor = to_sensor(client);\r
+    const struct sensor_datafmt *fmt;\r
+    int ret = 0,set_w,set_h;\r
+   \r
+       fmt = sensor_find_datafmt(mf->code, sensor_colour_fmts,\r
+                                  ARRAY_SIZE(sensor_colour_fmts));\r
+       if (fmt == NULL) {\r
+               fmt = &sensor->info_priv.fmt;\r
+        mf->code = fmt->code;\r
+       } \r
+\r
+    if (mf->height > SENSOR_MAX_HEIGHT)\r
+        mf->height = SENSOR_MAX_HEIGHT;\r
+    else if (mf->height < SENSOR_MIN_HEIGHT)\r
+        mf->height = SENSOR_MIN_HEIGHT;\r
+\r
+    if (mf->width > SENSOR_MAX_WIDTH)\r
+        mf->width = SENSOR_MAX_WIDTH;\r
+    else if (mf->width < SENSOR_MIN_WIDTH)\r
+        mf->width = SENSOR_MIN_WIDTH;\r
+\r
+    set_w = mf->width;\r
+    set_h = mf->height;\r
+\r
+       if (((set_w <= 176) && (set_h <= 144)) &&( sensor_qcif[0].reg!=0xff))\r
+       {\r
+        set_w = 176;\r
+        set_h = 144;\r
+       }\r
+       else if (((set_w <= 320) && (set_h <= 240)) && (sensor_qvga[0].reg!=0xff))\r
+    {\r
+        set_w = 320;\r
+        set_h = 240;\r
+    }\r
+    else if (((set_w <= 352) && (set_h<= 288)) && (sensor_cif[0].reg!=0xff))\r
+    {\r
+        set_w = 352;\r
+        set_h = 288;\r
+    }\r
+    else if (((set_w <= 640) && (set_h <= 480)) &&( sensor_vga[0].reg!=0xff))\r
+    {\r
+        set_w =640;\r
+        set_h = 480;\r
+    }\r
+    else if (((set_w <= 800) && (set_h <= 600)) && (sensor_svga[0].reg!=0xff))\r
+    {\r
+        set_w = 800;\r
+        set_h = 600;\r
+    }\r
+       else if (((set_w <= 1024) && (set_h <= 768)) &&( sensor_xga[0].reg!=0xff))\r
+    {\r
+        set_w = 1024;\r
+        set_h = 768;\r
+    }\r
+    else if (((set_w <= 1280) && (set_h <= 1024)) && (sensor_sxga[0].reg!=0xff))\r
+    {\r
+        set_w = 1280;\r
+        set_h = 1024;\r
+    }\r
+    else if (((set_w <= 1600) && (set_h <= 1200)) && (sensor_uxga[0].reg!=0xff))\r
+    {\r
+        set_w = 1600;\r
+        set_h = 1200;\r
+    }\r
+    else\r
+    {\r
+        set_w = SENSOR_INIT_WIDTH;\r
+        set_h = SENSOR_INIT_HEIGHT;            \r
+    }\r
+    mf->width = set_w;\r
+    mf->height = set_h;  \r
+    mf->colorspace = fmt->colorspace;\r
+    \r
+    return ret;\r
 }\r
 \r
  static int sensor_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *id)\r
 {\r
-    struct i2c_client *client = sd->priv;\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
 \r
     if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)\r
         return -EINVAL;\r
@@ -2441,7 +3227,7 @@ static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_que
 \r
 static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
 {\r
-    struct i2c_client *client = sd->priv;\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
     struct sensor *sensor = to_sensor(client);\r
     const struct v4l2_queryctrl *qctrl;\r
 \r
@@ -2500,7 +3286,7 @@ static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)
 \r
 static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
 {\r
-    struct i2c_client *client = sd->priv;\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
     struct sensor *sensor = to_sensor(client);\r
     struct soc_camera_device *icd = client->dev.platform_data;\r
     const struct v4l2_queryctrl *qctrl;\r
@@ -2790,7 +3576,7 @@ static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_c
 \r
 static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
 {\r
-    struct i2c_client *client = sd->priv;\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
     struct soc_camera_device *icd = client->dev.platform_data;\r
     int i, error_cnt=0, error_idx=-1;\r
 \r
@@ -2815,7 +3601,7 @@ static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_control
 \r
 static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
 {\r
-    struct i2c_client *client = sd->priv;\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
     struct soc_camera_device *icd = client->dev.platform_data;\r
     int i, error_cnt=0, error_idx=-1;\r
 \r
@@ -2843,9 +3629,8 @@ static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_control
 static int sensor_video_probe(struct soc_camera_device *icd,\r
                               struct i2c_client *client)\r
 {\r
-    char value;\r
-    int ret,pid = 0;\r
-    struct sensor *sensor = to_sensor(client);\r
+    int ret;\r
+    \r
 \r
     /* We must have a parent by now. And it cannot be a wrong one.\r
      * So this entire test is completely redundant. */\r
@@ -2902,7 +3687,7 @@ sensor_video_probe_err:
 }\r
 static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)\r
 {\r
-       struct i2c_client *client = sd->priv;\r
+       struct i2c_client *client = v4l2_get_subdevdata(sd);\r
     struct soc_camera_device *icd = client->dev.platform_data;\r
     struct sensor *sensor = to_sensor(client);\r
     int ret = 0;\r
@@ -2923,12 +3708,17 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
                {\r
                        sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;           \r
             if (sensor->sensor_io_request != NULL) { \r
-                if (sensor->sensor_io_request->gpio_res[0].dev_name && \r
-                    (strcmp(sensor->sensor_io_request->gpio_res[0].dev_name, dev_name(icd->pdev)) == 0)) {\r
-                    sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[0];\r
-                } else if (sensor->sensor_io_request->gpio_res[1].dev_name && \r
-                    (strcmp(sensor->sensor_io_request->gpio_res[1].dev_name, dev_name(icd->pdev)) == 0)) {\r
-                    sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[1];\r
+                sensor->sensor_gpio_res = NULL;\r
+                for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {\r
+                    if (sensor->sensor_io_request->gpio_res[i].dev_name && \r
+                        (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {\r
+                        sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];\r
+                    }\r
+                }\r
+                if (sensor->sensor_gpio_res == NULL) {\r
+                    SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
+                    ret = -EINVAL;\r
+                    goto sensor_ioctl_end;\r
                 }\r
             } else {\r
                 SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
@@ -2942,11 +3732,18 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
                 if (sensor->sensor_gpio_res->gpio_flash == INVALID_GPIO) {\r
                     for (i = 0; i < icd->ops->num_controls; i++) {\r
                                if (V4L2_CID_FLASH == icd->ops->controls[i].id) {\r
-                                       memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));                                       \r
+                                       //memset((char*)&icd->ops->controls[i],0x00,sizeof(struct v4l2_queryctrl));  \r
+                              sensor_controls[i].id=0xffff;                            \r
                                }\r
                     }\r
                     sensor->info_priv.flash = 0xff;\r
                     SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING());\r
+                }else{ //two cameras are the same,need to deal diffrently ,zyc\r
+                    for (i = 0; i < icd->ops->num_controls; i++) {\r
+                           if(0xffff == icd->ops->controls[i].id){\r
+                              sensor_controls[i].id=V4L2_CID_FLASH;\r
+                           }               \r
+                    }\r
                 }\r
                }\r
             #endif\r
@@ -2962,14 +3759,14 @@ sensor_ioctl_end:
        return ret;\r
 \r
 }\r
-static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,
-                           enum v4l2_mbus_pixelcode *code)
-{
-       if (index >= ARRAY_SIZE(sensor_colour_fmts))
-               return -EINVAL;
-
-       *code = sensor_colour_fmts[index].code;
-       return 0;
+static int sensor_enum_fmt(struct v4l2_subdev *sd, unsigned int index,\r
+                           enum v4l2_mbus_pixelcode *code)\r
+{\r
+       if (index >= ARRAY_SIZE(sensor_colour_fmts))\r
+               return -EINVAL;\r
+\r
+       *code = sensor_colour_fmts[index].code;\r
+       return 0;\r
 }\r
 static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {\r
        .init           = sensor_init,\r
@@ -2981,11 +3778,11 @@ static struct v4l2_subdev_core_ops sensor_subdev_core_ops = {
        .ioctl = sensor_ioctl,\r
 };\r
 \r
-static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {
-       .s_mbus_fmt     = sensor_s_fmt,
-       .g_mbus_fmt     = sensor_g_fmt,
-       .try_mbus_fmt   = sensor_try_fmt,
-       .enum_mbus_fmt  = sensor_enum_fmt,
+static struct v4l2_subdev_video_ops sensor_subdev_video_ops = {\r
+       .s_mbus_fmt     = sensor_s_fmt,\r
+       .g_mbus_fmt     = sensor_g_fmt,\r
+       .try_mbus_fmt   = sensor_try_fmt,\r
+       .enum_mbus_fmt  = sensor_enum_fmt,\r
 };\r
 \r
 static struct v4l2_subdev_ops sensor_subdev_ops = {\r
@@ -3040,6 +3837,7 @@ static int sensor_probe(struct i2c_client *client,
         kfree(sensor);\r
                sensor = NULL;\r
     }\r
+       hrtimer_init(&(flash_off_timer.timer), CLOCK_MONOTONIC, HRTIMER_MODE_REL);\r
     SENSOR_DG("\n%s..%s..%d  ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);\r
     return ret;\r
 }\r
@@ -3088,4 +3886,4 @@ module_exit(sensor_mod_exit);
 \r
 MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver));\r
 MODULE_AUTHOR("ddl <kernel@rock-chips>");\r
-MODULE_LICENSE("GPL");
\ No newline at end of file
+MODULE_LICENSE("GPL");\r