phone_pad: add sid130b and siv121d camera driver
authorhzf <hzf@rock-chips.com>
Wed, 1 Aug 2012 02:41:41 +0000 (10:41 +0800)
committerhzf <hzf@rock-chips.com>
Wed, 1 Aug 2012 02:41:41 +0000 (10:41 +0800)
arch/arm/configs/rk30_phonepad_defconfig
arch/arm/mach-rk30/board-rk30-phonepad.c
arch/arm/plat-rk/include/plat/rk_camera.h
drivers/media/video/Kconfig
drivers/media/video/Makefile
drivers/media/video/sid130B.c
drivers/media/video/siv121d.c [new file with mode: 0755]
include/media/v4l2-chip-ident.h

index a2f09e0c56dbf212b3865fd4c5c2becdbecd35b3..dc80af7bb5fa20648437ce87a6dfa369e8b5eb31 100644 (file)
@@ -271,8 +271,8 @@ CONFIG_RK30_PWM_REGULATOR=y
 CONFIG_MEDIA_SUPPORT=y
 CONFIG_VIDEO_DEV=y
 CONFIG_SOC_CAMERA=y
-CONFIG_SOC_CAMERA_OV2659=y
-CONFIG_SOC_CAMERA_OV5642=y
+CONFIG_SOC_CAMERA_SIV121D=y
+CONFIG_SOC_CAMERA_SID130B=y
 CONFIG_VIDEO_RK29=y
 CONFIG_VIDEO_RK29_CAMMEM_ION=y
 CONFIG_ION=y
index 6870e47d299549b740e39ccaafd94274c9461c26..86020f098eb776be4b9f0090583a8de83647f653 100755 (executable)
 #ifdef CONFIG_VIDEO_RK29
 /*---------------- Camera Sensor Macro Define Begin  ------------------------*/
 /*---------------- Camera Sensor Configuration Macro Begin ------------------------*/
-#define CONFIG_SENSOR_0 RK29_CAM_SENSOR_OV5642                                         /* back camera sensor */
-#define CONFIG_SENSOR_IIC_ADDR_0               0x78
-#define CONFIG_SENSOR_IIC_ADAPTER_ID_0   4
-#define CONFIG_SENSOR_CIF_INDEX_0                    1
+#define CONFIG_SENSOR_0 RK29_CAM_SENSOR_SID130B                                                /* back camera sensor */
+#define CONFIG_SENSOR_IIC_ADDR_0               0x6e
+#define CONFIG_SENSOR_IIC_ADAPTER_ID_0   3
+#define CONFIG_SENSOR_CIF_INDEX_0          0         // 1
 #define CONFIG_SENSOR_ORIENTATION_0      90
 #define CONFIG_SENSOR_POWER_PIN_0                INVALID_GPIO
 #define CONFIG_SENSOR_RESET_PIN_0                INVALID_GPIO
-#define CONFIG_SENSOR_POWERDN_PIN_0      RK30_PIN1_PD6
+#define CONFIG_SENSOR_POWERDN_PIN_0      RK30_PIN1_PB7
 #define CONFIG_SENSOR_FALSH_PIN_0                INVALID_GPIO
 #define CONFIG_SENSOR_POWERACTIVE_LEVEL_0 RK29_CAM_POWERACTIVE_L
 #define CONFIG_SENSOR_RESETACTIVE_LEVEL_0 RK29_CAM_RESETACTIVE_L
-#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_H
+#define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_L
 #define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
 
 #define CONFIG_SENSOR_QCIF_FPS_FIXED_0         15000
 #define CONFIG_SENSOR_SVGA_FPS_FIXED_02      15000
 #define CONFIG_SENSOR_720P_FPS_FIXED_02      30000
 
-#define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV2659                      /* front camera sensor 0 */
-#define CONFIG_SENSOR_IIC_ADDR_1           0x60
+#define CONFIG_SENSOR_1 RK29_CAM_SENSOR_SIV121D                      /* front camera sensor 0 */
+#define CONFIG_SENSOR_IIC_ADDR_1           0x66
 #define CONFIG_SENSOR_IIC_ADAPTER_ID_1   3
-#define CONFIG_SENSOR_CIF_INDEX_1                                0
+#define CONFIG_SENSOR_CIF_INDEX_1                      0       
 #define CONFIG_SENSOR_ORIENTATION_1       270
 #define CONFIG_SENSOR_POWER_PIN_1         INVALID_GPIO
 #define CONFIG_SENSOR_RESET_PIN_1         INVALID_GPIO
-#define CONFIG_SENSOR_POWERDN_PIN_1      RK30_PIN1_PB7
+#define CONFIG_SENSOR_POWERDN_PIN_1      RK30_PIN1_PB6
 #define CONFIG_SENSOR_FALSH_PIN_1         INVALID_GPIO
 #define CONFIG_SENSOR_POWERACTIVE_LEVEL_1 RK29_CAM_POWERACTIVE_L
 #define CONFIG_SENSOR_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
 static void rk_cif_power(int on)
 {
     struct regulator *ldo_18,*ldo_28;
-       ldo_28 = regulator_get(NULL, "ldo7");   // vcc28_cif
-       ldo_18 = regulator_get(NULL, "ldo1");   // vcc18_cif
+       ldo_28 = regulator_get(NULL, "vmmc");   // vcc28_cif   ldo7
+       ldo_18 = regulator_get(NULL, "vdig1");  // vcc18_cif   ldo1
        if (ldo_28 == NULL || IS_ERR(ldo_28) || ldo_18 == NULL || IS_ERR(ldo_18)){
         printk("get cif ldo failed!\n");
                return;
index 19ca16b0692d29948c86077d79ed31284ea6fc8d..39f31b11facb4187c9085bbf495e26870168b28a 100755 (executable)
 #define RK29_CAM_SENSOR_GC0309  gc0309
 #define RK29_CAM_SENSOR_GC2015  gc2015
 #define RK29_CAM_SENSOR_SIV120B  siv120b
+#define RK29_CAM_SENSOR_SIV121D  siv121d
 #define RK29_CAM_SENSOR_SID130B  sid130B
 #define RK29_CAM_SENSOR_HI253  hi253
 #define RK29_CAM_SENSOR_HI704  hi704
 #define RK29_CAM_SENSOR_NT99250 nt99250
-#define RK29_CAM_SENSOR_SP0838  sp0838
-#define RK29_CAM_SENSOR_GC0329  gc0329
-#define RK29_CAM_SENSOR_S5K5CA  s5k5ca
-
 
 #define RK29_CAM_SENSOR_NAME_OV7675 "ov7675"
 #define RK29_CAM_SENSOR_NAME_OV9650 "ov9650"
 #define RK29_CAM_SENSOR_NAME_GC0309  "gc0309"
 #define RK29_CAM_SENSOR_NAME_GC2015  "gc2015"
 #define RK29_CAM_SENSOR_NAME_SIV120B "siv120b"
+#define RK29_CAM_SENSOR_NAME_SIV121D "siv121d"
 #define RK29_CAM_SENSOR_NAME_SID130B "sid130B"
 #define RK29_CAM_SENSOR_NAME_HI253  "hi253"
 #define RK29_CAM_SENSOR_NAME_HI704  "hi704"
 #define RK29_CAM_SENSOR_NAME_NT99250 "nt99250"
-#define RK29_CAM_SENSOR_NAME_SP0838  "sp0838"
-#define RK29_CAM_SENSOR_NAME_GC0329  "gc0329"
-#define RK29_CAM_SENSOR_NAME_S5K5CA  "s5k5ca"
 
 #define ov7675_FULL_RESOLUTION     0x30000            // 0.3 megapixel
 #define ov9650_FULL_RESOLUTION     0x130000           // 1.3 megapixel   
 #define gc0309_FULL_RESOLUTION     0x30000            // 0.3 megapixel
 #define gc2015_FULL_RESOLUTION     0x200000           // 2 megapixel
 #define siv120b_FULL_RESOLUTION     0x30000            // 0.3 megapixel
+#define siv121d_FULL_RESOLUTION     0x30000            // 0.3 megapixel
 #define sid130B_FULL_RESOLUTION     0x200000           // 2 megapixel    
 #define hi253_FULL_RESOLUTION       0x200000           // 2 megapixel
 #define hi704_FULL_RESOLUTION       0x30000            // 0.3 megapixel
 #define nt99250_FULL_RESOLUTION     0x200000           // 2 megapixel
-#define sp0838_FULL_RESOLUTION      0x30000            // 0.3 megapixel
-#define gc0329_FULL_RESOLUTION      0x30000            // 0.3 megapixel
-#define s5k5ca_FULL_RESOLUTION      0x300000            // 3 megapixel
 /*---------------- Camera Sensor Must Define Macro End  ------------------------*/
 
 
index 08120f7a91da75cb1b9e028784b7a340421952e2..f3d35931decd57b7953ec3aa0bf9d765254e41c9 100755 (executable)
@@ -1194,7 +1194,13 @@ config SIV120B_USER_DEFINED_SERIES
        depends on SOC_CAMERA_SIV120B
        bool "SIV120B user defined init series"
        default n
-
+       
+config SOC_CAMERA_SIV121D
+       tristate "siv121d support for rockchip"
+       depends on SOC_CAMERA && I2C
+       help
+         This is a SIV121D camera driver for rockchip
+         
 config SOC_CAMERA_SID130B
        tristate "sid130b support for rockchip"
        depends on SOC_CAMERA && I2C
index b96c68fdef76da7088b795017b10844c9577875e..30585000fc037a05c58b8dd73cd4f09f67e851c3 100755 (executable)
@@ -108,6 +108,7 @@ obj-$(CONFIG_SOC_CAMERA_GC0309)             += gc0309.o
 obj-$(CONFIG_SOC_CAMERA_GC0309_FOR_TD8801)             += gc0309_for_td8801.o
 obj-$(CONFIG_SOC_CAMERA_GC2015)                += gc2015.o
 obj-$(CONFIG_SOC_CAMERA_SIV120B)       += siv120b.o
+obj-$(CONFIG_SOC_CAMERA_SIV121D)       += siv121d.o
 obj-$(CONFIG_SOC_CAMERA_SID130B)       += sid130B.o
 obj-$(CONFIG_SOC_CAMERA_HI253) += hi253.o
 obj-$(CONFIG_SOC_CAMERA_HI704) += hi704.o
index 4028cf199d569f1bf6929b99e28f3a94e3812fa5..13f75d6d51b9c47cd3b03126825a5f7b45654c60 100755 (executable)
@@ -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
@@ -115,7 +115,8 @@ static struct  flash_timer flash_off_timer;
 /* 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
@@ -750,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
@@ -1516,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
@@ -1767,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
diff --git a/drivers/media/video/siv121d.c b/drivers/media/video/siv121d.c
new file mode 100755 (executable)
index 0000000..41a06b8
--- /dev/null
@@ -0,0 +1,2728 @@
+\r
+/*\r
+o* Driver for MT9M001 CMOS Image Sensor from Micron\r
+ *\r
+ * Copyright (C) 2008, Guennadi Liakhovetski <kernel@pengutronix.de>\r
+ *\r
+ * This program is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License version 2 as\r
+ * published by the Free Software Foundation.\r
+ */\r
+\r
+#include <linux/videodev2.h>\r
+#include <linux/slab.h>\r
+#include <linux/i2c.h>\r
+#include <linux/log2.h>\r
+#include <linux/platform_device.h>\r
+#include <linux/delay.h>\r
+#include <linux/circ_buf.h>\r
+#include <linux/miscdevice.h>\r
+#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
+\r
+#define dprintk(level, fmt, arg...) do {                       \\r
+       if (debug >= level)                                     \\r
+       printk(KERN_WARNING fmt , ## arg); } while (0)\r
+\r
+#define SENSOR_TR(format, ...) printk(KERN_ERR format, ## __VA_ARGS__)\r
+#define SENSOR_DG(format, ...) dprintk(1, format, ## __VA_ARGS__)\r
+\r
+\r
+#define _CONS(a,b) a##b\r
+#define CONS(a,b) _CONS(a,b)\r
+\r
+#define __STR(x) #x\r
+#define _STR(x) __STR(x)\r
+#define STR(x) _STR(x)\r
+\r
+#define MIN(x,y)   ((x<y) ? x: y)\r
+#define MAX(x,y)    ((x>y) ? x: y)\r
+\r
+/* Sensor Driver Configuration */\r
+#define SENSOR_NAME RK29_CAM_SENSOR_SIV121D\r
+#define SENSOR_V4L2_IDENT V4L2_IDENT_SIV121D\r
+#define SENSOR_ID 0xde\r
+#define SENSOR_MIN_WIDTH    640//176\r
+#define SENSOR_MIN_HEIGHT   480//144\r
+#define SENSOR_MAX_WIDTH    640\r
+#define SENSOR_MAX_HEIGHT   480\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_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8\r
+\r
+#define CONFIG_SENSOR_WhiteBalance     1\r
+#define CONFIG_SENSOR_Brightness       0\r
+#define CONFIG_SENSOR_Contrast      0\r
+#define CONFIG_SENSOR_Saturation    0\r
+#define CONFIG_SENSOR_Effect        1\r
+#define CONFIG_SENSOR_Scene         1\r
+#define CONFIG_SENSOR_DigitalZoom   0\r
+#define CONFIG_SENSOR_Focus         0\r
+#define CONFIG_SENSOR_Exposure      1\r
+#define CONFIG_SENSOR_Flash         0\r
+#define CONFIG_SENSOR_Mirror        0\r
+#define CONFIG_SENSOR_Flip          0\r
+\r
+#define CONFIG_SENSOR_I2C_SPEED     250000       /* Hz */\r
+/* Sensor write register continues by preempt_disable/preempt_enable for current process not be scheduled */\r
+#define CONFIG_SENSOR_I2C_NOSCHED   0\r
+#define CONFIG_SENSOR_I2C_RDWRCHK   0\r
+\r
+#define SENSOR_BUS_PARAM  (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\\r
+                          SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |\\r
+                          SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)\r
+\r
+#define COLOR_TEMPERATURE_CLOUDY_DN  6500\r
+#define COLOR_TEMPERATURE_CLOUDY_UP    8000\r
+#define COLOR_TEMPERATURE_CLEARDAY_DN  5000\r
+#define COLOR_TEMPERATURE_CLEARDAY_UP    6500\r
+#define COLOR_TEMPERATURE_OFFICE_DN     3500\r
+#define COLOR_TEMPERATURE_OFFICE_UP     5000\r
+#define COLOR_TEMPERATURE_HOME_DN       2500\r
+#define COLOR_TEMPERATURE_HOME_UP       3500\r
+\r
+#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)\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
+{\r
+    u8 reg;\r
+    u8 val;\r
+};\r
+\r
+/* init 640X480 VGA */\r
+static struct reginfo sensor_init_data[] =\r
+{\r
+    {0x00, 0x01},\r
+    {0x03, 0x0a},\r
+    \r
+    {0x00, 0x00},\r
+    {0x03, 0x04},\r
+    {0x10, 0x85},\r
+    {0x11, 0x74},      \r
+    \r
+    {0x00, 0x01},\r
+    //{0x03, 0x0a},\r
+    {0x04, 0x01}, \r
+    {0x06, 0x04}, \r
+     \r
+    {0x10, 0x46}, \r
+    {0x11, 0x23}, \r
+    {0x12, 0x21},\r
+     \r
+    {0x17, 0x86}, //ABS 1.74V\r
+    {0x18, 0x00},\r
+      \r
+    {0x20, 0x00},\r
+    {0x21, 0x05},\r
+    {0x22, 0x01},\r
+    {0x23, 0x69},\r
+     \r
+    {0x40, 0x0F}, \r
+    {0x41, 0x90},\r
+    {0x42, 0xd2},\r
+    {0x43, 0x00},\r
+    \r
+    // AE\r
+    {0x00, 0x02},\r
+    {0x11, 0x0c},\r
+    {0x12, 0x64},\r
+    {0x14, 0x60},\r
+    {0x34, 0x96},\r
+    {0x40, 0x48},\r
+    {0x5f, 0x01},\r
+    {0x41, 0x28},\r
+    {0x42, 0x28},\r
+    {0x44, 0x08},\r
+    {0x45, 0x08},\r
+    {0x46, 0x15},\r
+    {0x47, 0x1c},\r
+    {0x48, 0x20},\r
+    {0x49, 0x21},\r
+    {0x4a, 0x23},\r
+    {0x4b, 0x24},\r
+    {0x4c, 0x25},\r
+    {0x4d, 0x28},\r
+    {0x4e, 0x1c},\r
+    {0x4f, 0x15},\r
+    {0x50, 0x12},\r
+    {0x51, 0x10},\r
+    {0x52, 0x0e},\r
+    {0x53, 0x0c},\r
+    {0x54, 0x0b},\r
+    {0x55, 0x0a},\r
+    {0x90, 0x80},\r
+    {0x91, 0x80},\r
+    {0x10, 0x80},\r
+    \r
+    // AWB\r
+    {0x00, 0x03},\r
+    {0x10, 0xd0},\r
+    {0x11, 0xc1},\r
+    {0x13, 0x7e}, //Cr target\r
+    {0x14, 0x7d}, //Cb target\r
+    {0x15, 0xd8}, // R gain Top\r
+    {0x16, 0x7c}, // R gain bottom \r
+    {0x17, 0xe0}, // B gain Top\r
+    {0x18, 0x88}, // B gain bottom 0x80\r
+    {0x19, 0x8c}, // Cr top value 0x90\r
+    {0x1a, 0x64}, // Cr bottom value 0x70\r
+    {0x1b, 0x98}, // Cb top value 0x90\r
+    {0x1c, 0x6c}, // Cb bottom value 0x70\r
+    {0x1d, 0x94}, // 0xa0\r
+    {0x1e, 0x6c}, // 0x60\r
+    {0x20, 0xe8}, // AWB luminous top value\r
+    {0x21, 0x30}, // AWB luminous bottom value 0x20\r
+    {0x22, 0xb8},\r
+    {0x23, 0x10},\r
+    {0x25, 0x08},\r
+    {0x26, 0x20},\r
+    {0x27, 0x08}, // BRTSRT \r
+    {0x28, 0x0f}, // BRTEND\r
+    {0x29, 0xba}, // BRTRGNBOT \r
+    {0x2a, 0xa0}, // BRTBGNTOP\r
+                                                               \r
+    {0x40, 0x01},\r
+    {0x41, 0x03},\r
+    {0x42, 0x08},\r
+    {0x43, 0x10},\r
+    {0x44, 0x13},\r
+    {0x45, 0x8f},\r
+    {0x46, 0xfc},\r
+    \r
+    {0x62, 0x80},\r
+    {0x63, 0x90}, // R D30 to D20\r
+    {0x64, 0xd0}, // B D30 to D20\r
+    {0x65, 0x98}, // R D20 to D30\r
+    {0x66, 0xd0}, // B D20 to D30\r
+    \r
+    // IDP\r
+    {0x00, 0x04},\r
+    {0x10, 0xff},\r
+    {0x11, 0x0d},//1   d},\r
+    {0x12, 0xfd},\r
+    \r
+    // DPCBNR\r
+    {0x18, 0xbe},      // DPCNRCTRL\r
+    {0x19, 0x00},      // DPCTHV\r
+    {0x1A, 0x00},      // DPCTHVSLP\r
+    {0x1B, 0x00},      // DPCTHVDIFSRT\r
+    {0x1C, 0x0f},      // DPCTHVDIFSLP\r
+    {0x1d, 0xFF},      // DPCTHVMAX\r
+    \r
+    {0x1E, 0x04},      // BNRTHV  0c\r
+    {0x1F, 0x04},      // BNRTHVSLPN 10\r
+    {0x20, 0x10},      // BNRTHVSLPD\r
+    {0x21, 0x00},      // BNRNEICNT\r
+    {0x22, 0x10},      // STRTNOR\r
+    {0x23, 0x40},      // STRTDRK\r
+    {0x24, 0x00},\r
+    \r
+    // Gamma\r
+    {0x31, 0x08}, //0x08\r
+    {0x32, 0x12}, //0x10\r
+    {0x33, 0x24}, //0x1B\r
+    {0x34, 0x47}, //0x37\r
+    {0x35, 0x64}, //0x4D\r
+    {0x36, 0x7c}, //0x60\r
+    {0x37, 0x8f}, //0x72\r
+    {0x38, 0x9f}, //0x82\r
+    {0x39, 0xad}, //0x91\r
+    {0x3a, 0xba}, //0xA0\r
+    {0x3b, 0xcf}, //0xBA\r
+    {0x3c, 0xe2}, //0xD3\r
+    {0x3d, 0xf0}, //0xEA\r
+    \r
+    // Shading Register Setting                                 \r
+    {0x40, 0x06},                                                 \r
+    {0x41, 0x44},                                                 \r
+    {0x42, 0x44},                                                 \r
+    {0x43, 0x20},                                                 \r
+    {0x44, 0x22}, // left R gain[7:4], right R gain[3:0]                                               \r
+    {0x45, 0x22}, // top R gain[7:4], bottom R gain[3:0]                                                \r
+    {0x46, 0x00}, // left G gain[7:4], right G gain[3:0]         \r
+    {0x47, 0x11}, // top G gain[7:4], bottom G gain[3:0]         \r
+    {0x48, 0x00}, // left B gain[7:4], right B gain[3:0]         \r
+    {0x49, 0x00}, // top B gain[7:4], bottom B gain[3:0]        \r
+    {0x4a, 0x04}, // X-axis center high[3:2], Y-axis center high[1:0]   \r
+    {0x4b, 0x48}, // X-axis center low[7:0]                                            \r
+    {0x4c, 0xe8}, // Y-axis center low[7:0]                                       \r
+    {0x4d, 0x84}, // Shading Center Gain\r
+    {0x4e, 0x00}, // Shading R Offset   \r
+    {0x4f, 0x00}, // Shading Gr Offset  \r
+    {0x50, 0x00}, // Shading B Offset  \r
+    \r
+    // Interpolation\r
+    {0x60,  0x7f},\r
+    {0x61,  0x08},     // INTCTRL outdoor\r
+    \r
+    // Color matrix (D65) - Daylight\r
+    {0x71, 0x34},       \r
+    {0x72, 0xCE},       \r
+    {0x73, 0xFe},       \r
+    {0x74, 0x13},       \r
+    {0x75, 0x25},       \r
+    {0x76, 0x08},       \r
+    {0x77, 0xec},      \r
+    {0x78, 0xcd},       \r
+    {0x79, 0x47},       \r
+    \r
+    // Color matrix (D20) - A\r
+    {0x83, 0x38}, //0x3c       \r
+    {0x84, 0xd1}, //0xc6       \r
+    {0x85, 0xf7}, //0xff   \r
+    {0x86, 0x12}, //0x12    \r
+    {0x87, 0x25}, //0x24       \r
+    {0x88, 0x09}, //0x0a       \r
+    {0x89, 0xed}, //0xed   \r
+    {0x8a, 0xbb}, //0xc2       \r
+    {0x8b, 0x58}, //0x51\r
+    \r
+    {0x8c, 0x10}, //CMA select   \r
+    \r
+    //G Edge\r
+    {0x90, 0x18}, //Upper gain\r
+    {0x91, 0x28}, //down gain\r
+    {0x92, 0x55}, //[7:4] upper coring [3:0] down coring\r
+    {0x9a, 0x40},\r
+    {0x9b, 0x40},\r
+    {0x9c, 0x38}, //edge suppress start\r
+    {0x9d, 0x30}, //edge suppress slope\r
+    \r
+    {0xa9, 0x11},\r
+    {0xaa, 0x11},\r
+    \r
+    {0xb9, 0x30}, // nightmode 38 at gain 0x48 5fps\r
+    {0xba, 0x44}, // nightmode 80 at gain 0x48 5fps\r
+    \r
+    {0xc0, 0x24},       \r
+    {0xc1, 0x00},       \r
+    {0xc2, 0x80},      \r
+    {0xc3, 0x00},       \r
+    {0xc4, 0xe0},       \r
+    \r
+    {0xde, 0x80},\r
+    \r
+    {0xe5, 0x15}, //MEMSPDA\r
+    {0xe6, 0x02}, //MEMSPDB\r
+    {0xe7, 0x04}, //MEMSPDC\r
+    \r
+    //Sensor On  \r
+    {0x00, 0x01},\r
+    {0x03, 0x01} // SNR Enable\r
+    //{0xff,  0xff}    \r
+};\r
+\r
+\r
+/* 1280X1024 SXGA */\r
+static struct reginfo sensor_sxga[] =\r
+{\r
+    {0x00,0x00}\r
+};\r
+\r
+/* 800X600 SVGA*/\r
+static struct reginfo sensor_svga[] =\r
+{\r
+    {0x0, 0x0},\r
+};\r
+\r
+/* 640X480 VGA @30fps for both preview & capture. */\r
+static struct reginfo sensor_vga[] =\r
+{\r
+    {0x00,  0x01}, \r
+    {0x06,     0x04},\r
+    {0x12,     0x3d},\r
+    {0x00,  0x04}, \r
+    {0xc0,     0x24},\r
+    {0xc1,     0x00},\r
+    {0xc2,     0x80},\r
+    {0xc3,     0x00},\r
+    {0xc4,  0xe0},\r
+};\r
+\r
+/* 352X288 CIF @30fps*/\r
+static struct reginfo sensor_cif[] =\r
+{\r
+    {0x00,  0x01}, \r
+    {0x06,     0x00},\r
+    {0x12,     0x3d},\r
+    {0x00,  0x04}, \r
+    {0xc0,     0x11},\r
+    {0xc1,     0x00},\r
+    {0xc2,     0x60},\r
+    {0xc3,     0x00},\r
+    {0xc4,  0x20},\r
+};\r
+\r
+/* 320*240 QVGA */\r
+static  struct reginfo sensor_qvga[] =\r
+{\r
+    {0x00,  0x01}, \r
+    {0x06,     0x06},\r
+    {0x12,     0x3d},\r
+    {0x00,  0x04}, \r
+    {0xc0,     0x10},\r
+    {0xc1,     0x00},\r
+    {0xc2,     0x40},\r
+    {0xc3,     0x00},\r
+    {0xc4,  0xf0},\r
+};\r
+\r
+/* 176X144 QCIF*/\r
+static struct reginfo sensor_qcif[] =\r
+{\r
+    {0x00,  0x01}, \r
+    {0x06,     0x02},\r
+    {0x00,  0x04}, \r
+    {0x12,     0x3d},\r
+    {0xc0,     0x00},\r
+    {0xc1,     0x00},\r
+    {0xc2,     0xb0},\r
+    {0xc3,     0x00},\r
+    {0xc4,  0x90},\r
+};\r
+\r
+static  struct reginfo sensor_ClrFmt_YUYV[]=\r
+{\r
+    {0x00,  0x04}, \r
+    {0x12,     0x3d},\r
+};\r
+\r
+static  struct reginfo sensor_ClrFmt_UYVY[]=\r
+{\r
+    {0x00,  0x04}, \r
+    {0x12,     0xcd},\r
+};\r
+\r
+\r
+#if CONFIG_SENSOR_WhiteBalance\r
+static  struct reginfo sensor_WhiteB_Auto[]=\r
+{\r
+    {0x00,  0x03}, \r
+    {0x10,  0xd3}, \r
+    {0xff,0xff}\r
+};\r
+/* Cloudy Colour Temperature : 6500K - 8000K  */\r
+static  struct reginfo sensor_WhiteB_Cloudy[]=\r
+{\r
+    {0x00,  0x03}, \r
+    {0x10, 0x00},  // disable AWB\r
+    {0x60, 0xb4}, \r
+    {0x61, 0x74}, \r
+    {0xff,0xff}\r
+\r
+};\r
+/* ClearDay Colour Temperature : 5000K - 6500K  */\r
+static  struct reginfo sensor_WhiteB_ClearDay[]=\r
+{\r
+    {0x00,  0x03}, \r
+    {0x10, 0x00},   // disable AWB\r
+    {0x60, 0xd8}, \r
+    {0x61, 0x90},\r
+    {0xff,0xff}\r
+    \r
+};\r
+/* Office Colour Temperature : 3500K - 5000K  */\r
+static  struct reginfo sensor_WhiteB_TungstenLamp1[]=\r
+{\r
+    {0x00,  0x03}, \r
+    {0x10, 0x00},  // disable AWB\r
+    {0x60, 0x80},\r
+    {0x61, 0xe0},\r
+    {0xff,0xff}\r
+};\r
+/* Home Colour Temperature : 2500K - 3500K  */\r
+static  struct reginfo sensor_WhiteB_TungstenLamp2[]=\r
+{\r
+    {0x00,  0x03}, \r
+    {0x10, 0x00},  // disable AWB\r
+    {0x60, 0xb8},\r
+    {0x61, 0xcc},\r
+    {0xff,0xff}\r
+};\r
+static struct reginfo *sensor_WhiteBalanceSeqe[] = {sensor_WhiteB_Auto, sensor_WhiteB_TungstenLamp1,sensor_WhiteB_TungstenLamp2,\r
+    sensor_WhiteB_ClearDay, sensor_WhiteB_Cloudy,NULL,\r
+};\r
+#endif\r
+\r
+#if CONFIG_SENSOR_Brightness\r
+static  struct reginfo sensor_Brightness0[]=\r
+{\r
+    // Brightness -2\r
+    {0x00,  0x04}, \r
+    {0xab,  0xb0}, \r
+    {0xff,0xff}    \r
+};\r
+\r
+static  struct reginfo sensor_Brightness1[]=\r
+{\r
+    // Brightness -1\r
+    {0x00,  0x04}, \r
+    {0xab,  0xa0}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Brightness2[]=\r
+{\r
+    //  Brightness 0\r
+    {0x00,  0x04}, \r
+    {0xab,  0x82},\r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Brightness3[]=\r
+{\r
+    // Brightness +1\r
+    {0x00,  0x04}, \r
+    {0xab,  0x00}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Brightness4[]=\r
+{\r
+    //  Brightness +2\r
+    {0x00,  0x04}, \r
+    {0xab,  0x10}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Brightness5[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xab,  0x20}, \r
+    {0xff,0xff} \r
+};\r
+static struct reginfo *sensor_BrightnessSeqe[] = {sensor_Brightness0, sensor_Brightness1, sensor_Brightness2, sensor_Brightness3,\r
+    sensor_Brightness4, sensor_Brightness5,NULL,\r
+};\r
+\r
+#endif\r
+\r
+#if CONFIG_SENSOR_Effect\r
+static  struct reginfo sensor_Effect_Normal[] =\r
+{\r
+    {0x00,0x04}, \r
+    {0x90,0x14},\r
+    {0x91,0x18},\r
+    {0xb6,0x00},\r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Effect_WandB[] =\r
+{\r
+    //mono \r
+    {0x00,0x04}, \r
+    {0x90,0x14},\r
+    {0x91,0x18},\r
+    {0xb6,0x40},\r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Effect_Sepia[] =\r
+{\r
+    {0x00,0x04}, \r
+    {0x90, 0x14},\r
+    {0x91, 0x18},\r
+    {0xB6, 0x80},\r
+    {0xB7, 0x58},\r
+    {0xB8, 0x98},\r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Effect_Negative[] =\r
+{\r
+    //Negative\r
+    {0x00,0x04}, \r
+    {0x90, 0x18},\r
+    {0x91, 0x18},\r
+    {0xB6, 0x20},\r
+    {0xff,0xff} \r
+};\r
+static  struct reginfo sensor_Effect_Bluish[] =\r
+{\r
+    {0x00,0x04}, \r
+    {0x90, 0x14},\r
+    {0x91, 0x18},\r
+    {0xB6, 0x80},\r
+    {0xB7, 0xb8},\r
+    {0xB8, 0x50},\r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Effect_Green[] =\r
+{\r
+    //  Greenish\r
+    {0x00,0x04}, \r
+    {0x90, 0x14},\r
+    {0x91, 0x18},\r
+    {0xB6, 0x80},\r
+    {0xB7, 0x68},\r
+    {0xB8, 0x68},\r
+    {0xff,0xff} \r
+};\r
+static struct reginfo *sensor_EffectSeqe[] = {sensor_Effect_Normal, sensor_Effect_WandB, sensor_Effect_Negative,sensor_Effect_Sepia,\r
+    /*sensor_Effect_Bluish,*/ sensor_Effect_Green,NULL,\r
+};\r
+#endif\r
+#if CONFIG_SENSOR_Exposure\r
+static  struct reginfo sensor_Exposure0[]=\r
+{\r
+    {0x00,0x02},\r
+    {0x12,0x44},\r
+    {0x14,0x44},\r
+    {0xff,0xff}\r
+};\r
+\r
+static  struct reginfo sensor_Exposure1[]=\r
+{\r
+    {0x00,0x02},\r
+    {0x12,0x54},\r
+    {0x14,0x54},\r
+    {0xff,0xff}\r
+};\r
+\r
+static  struct reginfo sensor_Exposure2[]=\r
+{\r
+    {0x00,0x02},\r
+    {0x12,0x54},\r
+    {0x14,0x54},\r
+    {0xff,0xff}\r
+};\r
+\r
+static  struct reginfo sensor_Exposure3[]=\r
+{\r
+    {0x00,0x02},\r
+    {0x12,0x78},\r
+    {0x14,0x78},\r
+    {0xff,0xff}\r
+};\r
+\r
+static  struct reginfo sensor_Exposure4[]=\r
+{\r
+    {0x00,0x02},\r
+    {0x12,0x84},\r
+    {0x14,0x84},\r
+    {0xff,0xff}\r
+};\r
+\r
+static  struct reginfo sensor_Exposure5[]=\r
+{\r
+    {0x00,0x02},\r
+    {0x12,0x94},\r
+    {0x14,0x94},\r
+    {0xff,0xff}\r
+};\r
+\r
+static  struct reginfo sensor_Exposure6[]=\r
+{\r
+    {0x00,0x02},\r
+    {0x12,0xa4},\r
+    {0x14,0xa4},\r
+    {0xff,0xff}\r
+};\r
+\r
+static struct reginfo *sensor_ExposureSeqe[] = {sensor_Exposure0, sensor_Exposure1, sensor_Exposure2, sensor_Exposure3,\r
+    sensor_Exposure4, sensor_Exposure5,sensor_Exposure6,NULL,\r
+};\r
+#endif\r
+#if CONFIG_SENSOR_Saturation\r
+static  struct reginfo sensor_Saturation0[]=\r
+{\r
+    {0x00, 0x00}\r
+};\r
+\r
+static  struct reginfo sensor_Saturation1[]=\r
+{\r
+    {0x00, 0x00}\r
+};\r
+\r
+static  struct reginfo sensor_Saturation2[]=\r
+{\r
+    {0x00, 0x00}\r
+};\r
+static struct reginfo *sensor_SaturationSeqe[] = {sensor_Saturation0, sensor_Saturation1, sensor_Saturation2, NULL,};\r
+\r
+#endif\r
+#if CONFIG_SENSOR_Contrast\r
+static  struct reginfo sensor_Contrast0[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xa8,  0xb0}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Contrast1[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xa8,  0xa0}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Contrast2[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xa8,  0x90}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Contrast3[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xa8,  0x00}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Contrast4[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xa8,  0x10}, \r
+    {0xff,0xff} \r
+};\r
+\r
+\r
+static  struct reginfo sensor_Contrast5[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xa8,  0x20}, \r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_Contrast6[]=\r
+{\r
+    //  Brightness +3\r
+    {0x00,  0x04}, \r
+    {0xa8,  0x30}, \r
+    {0xff,0xff} \r
+};\r
+static struct reginfo *sensor_ContrastSeqe[] = {sensor_Contrast0, sensor_Contrast1, sensor_Contrast2, sensor_Contrast3,\r
+    sensor_Contrast4, sensor_Contrast5, sensor_Contrast6, NULL,\r
+};\r
+\r
+#endif\r
+#if CONFIG_SENSOR_Mirror\r
+static  struct reginfo sensor_MirrorOn[]=\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+               \r
+};\r
+\r
+static  struct reginfo sensor_MirrorOff[]=\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+               \r
+};\r
+static struct reginfo *sensor_MirrorSeqe[] = {sensor_MirrorOff, sensor_MirrorOn,NULL,};\r
+#endif\r
+#if CONFIG_SENSOR_Flip\r
+static  struct reginfo sensor_FlipOn[]=\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+};\r
+\r
+static  struct reginfo sensor_FlipOff[]=\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+};\r
+static struct reginfo *sensor_FlipSeqe[] = {sensor_FlipOff, sensor_FlipOn,NULL,};\r
+\r
+#endif\r
+#if CONFIG_SENSOR_Scene\r
+static  struct reginfo sensor_SceneAuto[] =\r
+{\r
+    {0x00, 0x02},\r
+       {0x40, 0x45},   \r
+           {0x00, 0x04},\r
+       {0xab, 0x00},\r
+       {0xff,0xff}\r
+};\r
+\r
+static  struct reginfo sensor_SceneNight[] =\r
+{\r
+    {0x00, 0x02},\r
+       {0x40, 0x60},   \r
+           {0x00, 0x04},\r
+       {0xab, 0x30},\r
+       {0xff,0xff}\r
+};\r
+static struct reginfo *sensor_SceneSeqe[] = {sensor_SceneAuto, sensor_SceneNight,NULL,};\r
+\r
+#endif\r
+#if CONFIG_SENSOR_DigitalZoom\r
+static struct reginfo sensor_Zoom0[] =\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+               \r
+};\r
+\r
+static struct reginfo sensor_Zoom1[] =\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+};\r
+\r
+static struct reginfo sensor_Zoom2[] =\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+};\r
+\r
+\r
+static struct reginfo sensor_Zoom3[] =\r
+{\r
+    {0x00, 0x00},\r
+    {0xff,0xff} \r
+};\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
+{\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
+    { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 2,  .name = "fluorescent", .reserved = 0,}, {  .id = V4L2_CID_DO_WHITE_BALANCE, .index = 3,  .name = "daylight", .reserved = 0,},\r
+    { .id = V4L2_CID_DO_WHITE_BALANCE,  .index = 4,  .name = "cloudy-daylight", .reserved = 0,},\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Effect\r
+    { .id = V4L2_CID_EFFECT,  .index = 0,  .name = "none",  .reserved = 0, }, {  .id = V4L2_CID_EFFECT,  .index = 1, .name = "mono",  .reserved = 0,},\r
+    { .id = V4L2_CID_EFFECT,  .index = 2,  .name = "negative", .reserved = 0,}, {  .id = V4L2_CID_EFFECT, .index = 3,  .name = "sepia", .reserved = 0,},\r
+    { .id = V4L2_CID_EFFECT,  .index = 4, .name = "posterize", .reserved = 0,} ,{ .id = V4L2_CID_EFFECT,  .index = 5,  .name = "aqua", .reserved = 0,},\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Scene\r
+    { .id = V4L2_CID_SCENE,  .index = 0, .name = "auto", .reserved = 0,} ,{ .id = V4L2_CID_SCENE,  .index = 1,  .name = "night", .reserved = 0,},\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Flash\r
+    { .id = V4L2_CID_FLASH,  .index = 0,  .name = "off",  .reserved = 0, }, {  .id = V4L2_CID_FLASH,  .index = 1, .name = "auto",  .reserved = 0,},\r
+    { .id = V4L2_CID_FLASH,  .index = 2,  .name = "on", .reserved = 0,}, {  .id = V4L2_CID_FLASH, .index = 3,  .name = "torch", .reserved = 0,},\r
+    #endif\r
+};\r
+\r
+static const struct v4l2_queryctrl sensor_controls[] =\r
+{\r
+       #if CONFIG_SENSOR_WhiteBalance\r
+    {\r
+        .id            = V4L2_CID_DO_WHITE_BALANCE,\r
+        .type          = V4L2_CTRL_TYPE_MENU,\r
+        .name          = "White Balance Control",\r
+        .minimum       = 0,\r
+        .maximum       = 4,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Brightness\r
+       {\r
+        .id            = V4L2_CID_BRIGHTNESS,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "Brightness Control",\r
+        .minimum       = -3,\r
+        .maximum       = 2,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Effect\r
+       {\r
+        .id            = V4L2_CID_EFFECT,\r
+        .type          = V4L2_CTRL_TYPE_MENU,\r
+        .name          = "Effect Control",\r
+        .minimum       = 0,\r
+        .maximum       = 5,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+       #endif\r
+\r
+       #if CONFIG_SENSOR_Exposure\r
+       {\r
+        .id            = V4L2_CID_EXPOSURE,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "Exposure Control",\r
+        .minimum       = 0,\r
+        .maximum       = 6,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+       #endif\r
+\r
+       #if CONFIG_SENSOR_Saturation\r
+       {\r
+        .id            = V4L2_CID_SATURATION,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "Saturation Control",\r
+        .minimum       = 0,\r
+        .maximum       = 2,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Contrast\r
+       {\r
+        .id            = V4L2_CID_CONTRAST,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "Contrast Control",\r
+        .minimum       = -3,\r
+        .maximum       = 3,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+       #endif\r
+\r
+       #if CONFIG_SENSOR_Mirror\r
+       {\r
+        .id            = V4L2_CID_HFLIP,\r
+        .type          = V4L2_CTRL_TYPE_BOOLEAN,\r
+        .name          = "Mirror Control",\r
+        .minimum       = 0,\r
+        .maximum       = 1,\r
+        .step          = 1,\r
+        .default_value = 1,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Flip\r
+       {\r
+        .id            = V4L2_CID_VFLIP,\r
+        .type          = V4L2_CTRL_TYPE_BOOLEAN,\r
+        .name          = "Flip Control",\r
+        .minimum       = 0,\r
+        .maximum       = 1,\r
+        .step          = 1,\r
+        .default_value = 1,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Scene\r
+    {\r
+        .id            = V4L2_CID_SCENE,\r
+        .type          = V4L2_CTRL_TYPE_MENU,\r
+        .name          = "Scene Control",\r
+        .minimum       = 0,\r
+        .maximum       = 1,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_DigitalZoom\r
+    {\r
+        .id            = V4L2_CID_ZOOM_RELATIVE,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "DigitalZoom Control",\r
+        .minimum       = -1,\r
+        .maximum       = 1,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    }, {\r
+        .id            = V4L2_CID_ZOOM_ABSOLUTE,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "DigitalZoom Control",\r
+        .minimum       = 0,\r
+        .maximum       = 3,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Focus\r
+       {\r
+        .id            = V4L2_CID_FOCUS_RELATIVE,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "Focus Control",\r
+        .minimum       = -1,\r
+        .maximum       = 1,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    }, {\r
+        .id            = V4L2_CID_FOCUS_ABSOLUTE,\r
+        .type          = V4L2_CTRL_TYPE_INTEGER,\r
+        .name          = "Focus Control",\r
+        .minimum       = 0,\r
+        .maximum       = 255,\r
+        .step          = 1,\r
+        .default_value = 125,\r
+    },\r
+    #endif\r
+\r
+       #if CONFIG_SENSOR_Flash\r
+       {\r
+        .id            = V4L2_CID_FLASH,\r
+        .type          = V4L2_CTRL_TYPE_MENU,\r
+        .name          = "Flash Control",\r
+        .minimum       = 0,\r
+        .maximum       = 3,\r
+        .step          = 1,\r
+        .default_value = 0,\r
+    },\r
+       #endif\r
+};\r
+\r
+static int sensor_probe(struct i2c_client *client, const struct i2c_device_id *did);\r
+static int sensor_video_probe(struct soc_camera_device *icd, struct i2c_client *client);\r
+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
+static int sensor_g_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
+static int sensor_s_ext_controls(struct v4l2_subdev *sd,  struct v4l2_ext_controls *ext_ctrl);\r
+static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg);\r
+static int sensor_resume(struct soc_camera_device *icd);\r
+static int sensor_set_bus_param(struct soc_camera_device *icd,unsigned long flags);\r
+static unsigned long sensor_query_bus_param(struct soc_camera_device *icd);\r
+static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
+static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value);\r
+static int sensor_deactivate(struct i2c_client *client);\r
+\r
+static struct soc_camera_ops sensor_ops =\r
+{\r
+    .suspend                     = sensor_suspend,\r
+    .resume                       = sensor_resume,\r
+    .set_bus_param             = sensor_set_bus_param,\r
+    .query_bus_param   = sensor_query_bus_param,\r
+    .controls          = sensor_controls,\r
+    .menus                         = sensor_menus,\r
+    .num_controls              = ARRAY_SIZE(sensor_controls),\r
+    .num_menus         = ARRAY_SIZE(sensor_menus),\r
+};\r
+\r
+/* 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_YUYV8_2X8, V4L2_COLORSPACE_JPEG}    \r
+};\r
+\r
+typedef struct sensor_info_priv_s\r
+{\r
+    int whiteBalance;\r
+    int brightness;\r
+    int contrast;\r
+    int saturation;\r
+    int effect;\r
+    int scene;\r
+    int digitalzoom;\r
+    int focus;\r
+    int flash;\r
+    int exposure;\r
+       bool snap2preview;\r
+       bool video2preview;\r
+    unsigned char mirror;                                        /* HFLIP */\r
+    unsigned char flip;                                          /* VFLIP */\r
+    unsigned int winseqe_cur_addr;\r
+    struct sensor_datafmt fmt;\r
+    unsigned int funmodule_state;\r
+} sensor_info_priv_t;\r
+\r
+struct sensor\r
+{\r
+    struct v4l2_subdev subdev;\r
+    struct i2c_client *client;\r
+    sensor_info_priv_t info_priv;\r
+    int model; /* V4L2_IDENT_OV* codes from v4l2-chip-ident.h */\r
+#if CONFIG_SENSOR_I2C_NOSCHED\r
+       atomic_t tasklock_cnt;\r
+#endif\r
+       struct rk29camera_platform_data *sensor_io_request;\r
+    struct rk29camera_gpio_res *sensor_gpio_res;\r
+};\r
+\r
+static struct sensor* to_sensor(const struct i2c_client *client)\r
+{\r
+    return container_of(i2c_get_clientdata(client), struct sensor, subdev);\r
+}\r
+\r
+static int sensor_task_lock(struct i2c_client *client, int lock)\r
+{\r
+#if CONFIG_SENSOR_I2C_NOSCHED\r
+       int cnt = 3;\r
+    struct sensor *sensor = to_sensor(client);\r
+\r
+       if (lock) {\r
+               if (atomic_read(&sensor->tasklock_cnt) == 0) {\r
+                       while ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt>0)) {\r
+                               SENSOR_TR("\n %s will obtain i2c in atomic, but i2c bus is locked! Wait...\n",SENSOR_NAME_STRING());\r
+                               msleep(35);\r
+                               cnt--;\r
+                       }\r
+                       if ((atomic_read(&client->adapter->bus_lock.count) < 1) && (cnt<=0)) {\r
+                               SENSOR_TR("\n %s obtain i2c fail in atomic!!\n",SENSOR_NAME_STRING());\r
+                               goto sensor_task_lock_err;\r
+                       }\r
+                       preempt_disable();\r
+               }\r
+\r
+               atomic_add(1, &sensor->tasklock_cnt);\r
+       } else {\r
+               if (atomic_read(&sensor->tasklock_cnt) > 0) {\r
+                       atomic_sub(1, &sensor->tasklock_cnt);\r
+\r
+                       if (atomic_read(&sensor->tasklock_cnt) == 0)\r
+                               preempt_enable();\r
+               }\r
+       }\r
+       return 0;\r
+sensor_task_lock_err:\r
+       return -1;  \r
+#else\r
+    return 0;\r
+#endif\r
+\r
+}\r
+\r
+/* sensor register write */\r
+static int sensor_write(struct i2c_client *client, u8 reg, u8 val)\r
+{\r
+    int err,cnt;\r
+    u8 buf[2];\r
+    struct i2c_msg msg[1];\r
+\r
+    buf[0] = reg & 0xFF;\r
+    buf[1] = val;\r
+\r
+    msg->addr = client->addr;\r
+    msg->flags = client->flags;\r
+    msg->buf = buf;\r
+    msg->len = sizeof(buf);\r
+    msg->scl_rate = CONFIG_SENSOR_I2C_SPEED;                                        /* ddl@rock-chips.com : 100kHz */\r
+    msg->read_type = 0;               /* fpga i2c:0==I2C_NORMAL : direct use number not enum for don't want include spi_fpga.h */\r
+\r
+    cnt = 3;\r
+    err = -EAGAIN;\r
+\r
+    while ((cnt-- > 0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
+        err = i2c_transfer(client->adapter, msg, 1);\r
+\r
+        if (err >= 0) {\r
+            return 0;\r
+        } else {\r
+               SENSOR_TR("\n %s write reg(0x%x, val:0x%x) failed, try to write again!\n",SENSOR_NAME_STRING(),reg, val);\r
+               udelay(10);\r
+        }\r
+    }\r
+\r
+    return err;\r
+}\r
+\r
+/* sensor register read */\r
+static int sensor_read(struct i2c_client *client, u8 reg, u8 *val)\r
+{\r
+    int err,cnt;\r
+    //u8 buf[2];\r
+    u8 buf[1];\r
+    struct i2c_msg msg[2];\r
+\r
+    //buf[0] = reg >> 8;\r
+    buf[0] = reg;\r
+    buf[1] = reg & 0xFF;\r
+\r
+    msg[0].addr = client->addr;\r
+    msg[0].flags = client->flags;\r
+    msg[0].buf = buf;\r
+    msg[0].len = sizeof(buf);\r
+    msg[0].scl_rate = CONFIG_SENSOR_I2C_SPEED;       /* ddl@rock-chips.com : 100kHz */\r
+    msg[0].read_type = 2;   /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */\r
+\r
+    msg[1].addr = client->addr;\r
+    msg[1].flags = client->flags|I2C_M_RD;\r
+    msg[1].buf = buf;\r
+    msg[1].len = 1;\r
+    msg[1].scl_rate = CONFIG_SENSOR_I2C_SPEED;                       /* ddl@rock-chips.com : 100kHz */\r
+    msg[1].read_type = 2;                             /* fpga i2c:0==I2C_NO_STOP : direct use number not enum for don't want include spi_fpga.h */\r
+\r
+    cnt = 1;\r
+    err = -EAGAIN;\r
+    while ((cnt-- > 0) && (err < 0)) {                       /* ddl@rock-chips.com :  Transfer again if transent is failed   */\r
+        err = i2c_transfer(client->adapter, msg, 2);\r
+\r
+        if (err >= 0) {\r
+            *val = buf[0];\r
+            return 0;\r
+        } else {\r
+               SENSOR_TR("\n %s read reg(0x%x val:0x%x) failed, try to read again! \n",SENSOR_NAME_STRING(),reg, *val);\r
+            udelay(10);\r
+        }\r
+    }\r
+\r
+    return err;\r
+}\r
+static int sensor_effect_write_array(struct i2c_client *client,struct reginfo *regarray)\r
+{\r
+       int err;\r
+    int i = 0;\r
+\r
+    //for(i=0; i < sizeof(sensor_init_data) / 2;i++)\r
+       while((regarray[i].reg != 0xff) && (regarray[i].val != 0xff))\r
+    {\r
+        err = sensor_write(client, regarray[i].reg, regarray[i].val);\r
+        if (err != 0)\r
+        {\r
+            SENSOR_TR("%s..write failed current i = %d\n", SENSOR_NAME_STRING(),i);\r
+            return err;\r
+        }\r
+        i++;\r
+    }\r
+    \r
+    return 0;\r
+\r
+}\r
+/* write a array of registers  */\r
+#if 1\r
+static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)\r
+{\r
+    int err;\r
+    int i = 0;\r
+\r
+    for(i=0; i < sizeof(sensor_init_data) / 2;i++)\r
+       //while((regarray[i].reg != 0xff) && (regarray[i].val != 0xff))\r
+    {\r
+        err = sensor_write(client, regarray[i].reg, regarray[i].val);\r
+        if (err != 0)\r
+        {\r
+            SENSOR_TR("%s..write failed current i = %d\n", SENSOR_NAME_STRING(),i);\r
+            return err;\r
+        }\r
+        //i++;\r
+    }\r
+    \r
+    return 0;\r
+}\r
+#else\r
+static int sensor_write_array(struct i2c_client *client, struct reginfo *regarray)\r
+{\r
+    int err;\r
+    int i = 0;\r
+       u8 val_read;\r
+    while (regarray[i].reg != 0)\r
+    {\r
+        err = sensor_write(client, regarray[i].reg, regarray[i].val);\r
+        if (err != 0)\r
+        {\r
+            SENSOR_TR("%s..write failed current i = %d\n", SENSOR_NAME_STRING(),i);\r
+            return err;\r
+        }\r
+               err = sensor_read(client, regarray[i].reg, &val_read);\r
+               SENSOR_TR("%s..reg[0x%x]=0x%x,0x%x\n", SENSOR_NAME_STRING(),regarray[i].reg, val_read, regarray[i].val);\r
+        i++;\r
+    }\r
+    return 0;\r
+}\r
+#endif\r
+\r
+#if CONFIG_SENSOR_I2C_RDWRCHK\r
+static int sensor_check_array(struct i2c_client *client, struct reginfo *regarray)\r
+{\r
+  int ret;\r
+  int i = 0;\r
+  \r
+  u8 value;\r
+  \r
+  SENSOR_DG("%s >>>>>>>>>>>>>>>>>>>>>>\n",__FUNCTION__);\r
+  for(i=0;i<sizeof(sensor_init_data) / 2;i++)\r
+       {\r
+     ret = sensor_read(client,regarray[i].reg,&value);\r
+        if(ret !=0)\r
+        {\r
+         SENSOR_TR("read value failed\n");\r
+\r
+        }\r
+        if(regarray[i].val != value)\r
+        {\r
+         SENSOR_DG("%s reg[0x%x] check err,writte :0x%x  read:0x%x\n",__FUNCTION__,regarray[i].reg,regarray[i].val,value);\r
+        }\r
+        \r
+  }\r
+  \r
+       \r
+  return 0;\r
+}\r
+#endif\r
+static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd cmd, int on)\r
+{\r
+       struct soc_camera_link *icl = to_soc_camera_link(icd);\r
+       int ret = 0;\r
+\r
+    SENSOR_DG("%s %s  cmd(%d) on(%d)\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd,on);\r
+       switch (cmd)\r
+       {\r
+               case Sensor_PowerDown:\r
+               {\r
+                       if (icl->powerdown) {\r
+                               ret = icl->powerdown(icd->pdev, on);\r
+                               if (ret == RK29_CAM_IO_SUCCESS) {\r
+                                       if (on == 0) {\r
+                                               mdelay(2);\r
+                                               if (icl->reset)\r
+                                                       icl->reset(icd->pdev);\r
+                                       }\r
+                               } else if (ret == RK29_CAM_EIO_REQUESTFAIL) {\r
+                                       ret = -ENODEV;\r
+                                       goto sensor_power_end;\r
+                               }\r
+                       }\r
+                       break;\r
+               }\r
+               case Sensor_Flash:\r
+               {\r
+                       struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+               struct sensor *sensor = to_sensor(client);\r
+\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
+                       }\r
+            break;\r
+               }\r
+               default:\r
+               {\r
+                       SENSOR_TR("%s %s cmd(0x%x) is unknown!",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
+                       break;\r
+               }\r
+       }\r
+sensor_power_end:\r
+       return ret;\r
+}\r
+\r
+static int sensor_init(struct v4l2_subdev *sd, u32 val)\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
+       const struct v4l2_queryctrl *qctrl;\r
+    const struct sensor_datafmt *fmt;\r
+    int ret;\r
+\r
+    SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);\r
+\r
+       if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
+               ret = -ENODEV;\r
+               goto sensor_INIT_ERR;\r
+       }\r
+\r
+    /* soft reset */\r
+       if (sensor_task_lock(client,1)<0)\r
+               goto sensor_INIT_ERR;\r
+   /* ret = sensor_write(client, 0x12, 0x80);\r
+    if (ret != 0)\r
+    {\r
+        SENSOR_TR("%s soft reset sensor failed\n",SENSOR_NAME_STRING());\r
+        ret = -ENODEV;\r
+               goto sensor_INIT_ERR;\r
+    }\r
+\r
+    mdelay(5); */ //delay 5 microseconds\r
+\r
+    ret = sensor_write_array(client, sensor_init_data);\r
+    if (ret != 0)\r
+    {\r
+        SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());\r
+        goto sensor_INIT_ERR;\r
+    }\r
+       \r
+       sensor_task_lock(client,0);\r
+    \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) {\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
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
+       if (qctrl)\r
+       sensor->info_priv.whiteBalance = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_BRIGHTNESS);\r
+       if (qctrl)\r
+       sensor->info_priv.brightness = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
+       if (qctrl)\r
+       sensor->info_priv.effect = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EXPOSURE);\r
+       if (qctrl)\r
+        sensor->info_priv.exposure = qctrl->default_value;\r
+\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SATURATION);\r
+       if (qctrl)\r
+        sensor->info_priv.saturation = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_CONTRAST);\r
+       if (qctrl)\r
+        sensor->info_priv.contrast = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_HFLIP);\r
+       if (qctrl)\r
+        sensor->info_priv.mirror = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_VFLIP);\r
+       if (qctrl)\r
+        sensor->info_priv.flip = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_SCENE);\r
+       if (qctrl)\r
+        sensor->info_priv.scene = qctrl->default_value;\r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
+       if (qctrl)\r
+        sensor->info_priv.digitalzoom = qctrl->default_value;\r
+\r
+    /* ddl@rock-chips.com : if sensor support auto focus and flash, programer must run focus and flash code  */\r
+       #if CONFIG_SENSOR_Focus\r
+    sensor_set_focus();\r
+    qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FOCUS_ABSOLUTE);\r
+       if (qctrl)\r
+        sensor->info_priv.focus = qctrl->default_value;\r
+       #endif\r
+\r
+       #if CONFIG_SENSOR_Flash \r
+       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_FLASH);\r
+       if (qctrl)\r
+        sensor->info_priv.flash = qctrl->default_value;\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
+    sensor->info_priv.funmodule_state |= SENSOR_INIT_IS_OK;\r
+    return 0;\r
+sensor_INIT_ERR:\r
+    sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
+       sensor_task_lock(client,0);\r
+       sensor_deactivate(client);\r
+    return ret;\r
+}\r
+\r
+static int sensor_deactivate(struct i2c_client *client)\r
+{\r
+       struct soc_camera_device *icd = client->dev.platform_data;\r
+       //u8 reg_val;\r
+    struct sensor *sensor = to_sensor(client);\r
+       SENSOR_DG("\n%s..%s.. Enter\n",SENSOR_NAME_STRING(),__FUNCTION__);\r
+\r
+       /* ddl@rock-chips.com : all sensor output pin must change to input for other sensor */\r
+       sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
+    msleep(100); \r
+\r
+       /* ddl@rock-chips.com : sensor config init width , because next open sensor quickly(soc_camera_open -> Try to configure with default parameters) */\r
+       icd->user_width = SENSOR_INIT_WIDTH;\r
+    icd->user_height = SENSOR_INIT_HEIGHT;\r
+    sensor->info_priv.funmodule_state &= ~SENSOR_INIT_IS_OK;\r
+       \r
+       return 0;\r
+}\r
+static  struct reginfo sensor_power_down_sequence[]=\r
+{\r
+    {0x00,0x00},\r
+    {0x03,0x02}\r
+};\r
+static int sensor_suspend(struct soc_camera_device *icd, pm_message_t pm_msg)\r
+{\r
+    int ret;\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if (pm_msg.event == PM_EVENT_SUSPEND) {\r
+        SENSOR_DG("\n %s Enter Suspend.. \n", SENSOR_NAME_STRING());\r
+        ret = sensor_write_array(client, sensor_power_down_sequence) ;\r
+        if (ret != 0) {\r
+            SENSOR_TR("\n %s..%s WriteReg Fail.. \n", SENSOR_NAME_STRING(),__FUNCTION__);\r
+            return ret;\r
+        } else {\r
+            ret = sensor_ioctrl(icd, Sensor_PowerDown, 1);\r
+            if (ret < 0) {\r
+                           SENSOR_TR("\n %s suspend fail for turn on power!\n", SENSOR_NAME_STRING());\r
+                return -EINVAL;\r
+            }\r
+        }\r
+    } else {\r
+        SENSOR_TR("\n %s cann't suppout Suspend..\n",SENSOR_NAME_STRING());\r
+        return -EINVAL;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int sensor_resume(struct soc_camera_device *icd)\r
+{\r
+       int ret;\r
+\r
+    ret = sensor_ioctrl(icd, Sensor_PowerDown, 0);\r
+    if (ret < 0) {\r
+               SENSOR_TR("\n %s resume fail for turn on power!\n", SENSOR_NAME_STRING());\r
+        return -EINVAL;\r
+    }\r
+\r
+       SENSOR_DG("\n %s Enter Resume.. \n", SENSOR_NAME_STRING());\r
+\r
+    return 0;\r
+\r
+}\r
+\r
+static int sensor_set_bus_param(struct soc_camera_device *icd,\r
+                                unsigned long flags)\r
+{\r
+\r
+    return 0;\r
+}\r
+\r
+static unsigned long sensor_query_bus_param(struct soc_camera_device *icd)\r
+{\r
+    struct soc_camera_link *icl = to_soc_camera_link(icd);\r
+    unsigned long flags = SENSOR_BUS_PARAM;\r
+\r
+    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)\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 = v4l2_get_subdevdata(sd);\r
+    const struct sensor_datafmt *fmt;\r
+    struct sensor *sensor = to_sensor(client);\r
+       const struct v4l2_queryctrl *qctrl;\r
+       struct soc_camera_device *icd = client->dev.platform_data;\r
+    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,\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)\r
+       {\r
+               winseqe_set_addr = sensor_qcif;\r
+        set_w = 176;\r
+        set_h = 144;\r
+       }\r
+       else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg)\r
+    {\r
+        winseqe_set_addr = sensor_qvga;\r
+        set_w = 320;\r
+        set_h = 240;\r
+    }\r
+    else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg)\r
+    {\r
+        winseqe_set_addr = sensor_cif;\r
+        set_w = 352;\r
+        set_h = 288;\r
+    }\r
+    else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg)\r
+    {\r
+        winseqe_set_addr = sensor_vga;\r
+        set_w = 640;\r
+        set_h = 480;\r
+    }\r
+    else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg)\r
+    {\r
+        winseqe_set_addr = sensor_svga;\r
+        set_w = 800;\r
+        set_h = 600;\r
+    }\r
+    else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)\r
+    {\r
+        winseqe_set_addr = sensor_sxga;\r
+        set_w = 1280;\r
+        set_h = 1024;\r
+    }\r
+    else\r
+    {\r
+        winseqe_set_addr = SENSOR_INIT_WINSEQADR;               /* ddl@rock-chips.com : Sensor output smallest size if  isn't support app  */\r
+        set_w = SENSOR_INIT_WIDTH;\r
+        set_h = SENSOR_INIT_HEIGHT;            \r
+               SENSOR_TR("\n %s..%s Format is Invalidate. pix->width = %d.. pix->height = %d\n",SENSOR_NAME_STRING(),__FUNCTION__,mf->width,mf->height);\r
+    }\r
+\r
+    if ((int)winseqe_set_addr  != sensor->info_priv.winseqe_cur_addr) {\r
+        #if CONFIG_SENSOR_Flash\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
+            }           \r
+        } else {                                        /* ddl@rock-chips.com : Video */\r
+            if ((sensor->info_priv.flash == 1) || (sensor->info_priv.flash == 2)) {\r
+                sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
+                SENSOR_DG("%s flash off in preivew!\n", SENSOR_NAME_STRING());\r
+            }\r
+        }\r
+        #endif\r
+        ret |= sensor_write_array(client, winseqe_set_addr);\r
+        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,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
+                }\r
+            }\r
+            #endif\r
+            goto sensor_s_fmt_end;\r
+        }\r
+\r
+        sensor->info_priv.winseqe_cur_addr  = (int)winseqe_set_addr;\r
+\r
+               if (sensor_fmt_capturechk(sd,mf) == true) {                                 /* ddl@rock-chips.com : Capture */\r
+                       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
+                       sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
+                       if (sensor->info_priv.whiteBalance != 0) {\r
+                               qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
+                               sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
+                       }\r
+                       sensor->info_priv.snap2preview = true;\r
+               } else if (sensor_fmt_videochk(sd,mf) == true) {                        /* ddl@rock-chips.com : Video */\r
+                       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
+                       sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
+                       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
+                       sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
+                       sensor->info_priv.video2preview = true;\r
+               } else if ((sensor->info_priv.snap2preview == true) || (sensor->info_priv.video2preview == true)) {\r
+                       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_EFFECT);\r
+                       sensor_set_effect(icd, qctrl,sensor->info_priv.effect);\r
+                       qctrl = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_DO_WHITE_BALANCE);\r
+                       sensor_set_whiteBalance(icd, qctrl,sensor->info_priv.whiteBalance);\r
+            msleep(600);\r
+                       sensor->info_priv.video2preview = false;\r
+                       sensor->info_priv.snap2preview = false;\r
+               }\r
+\r
+        SENSOR_DG("\n%s..%s.. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),__FUNCTION__,set_w,set_h);\r
+    }\r
+    else\r
+    {\r
+        SENSOR_DG("\n %s .. Current Format is validate. icd->width = %d.. icd->height %d\n",SENSOR_NAME_STRING(),set_w,set_h);\r
+    }\r
+\r
+       mf->width = set_w;\r
+    mf->height = set_h;\r
+\r
+sensor_s_fmt_end:\r
+    return ret;\r
+}\r
+\r
+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)\r
+       {\r
+        set_w = 176;\r
+        set_h = 144;\r
+       }\r
+       else if (((set_w <= 320) && (set_h <= 240)) && sensor_qvga[0].reg)\r
+    {\r
+        set_w = 320;\r
+        set_h = 240;\r
+    }\r
+    else if (((set_w <= 352) && (set_h<= 288)) && sensor_cif[0].reg)\r
+    {\r
+        set_w = 352;\r
+        set_h = 288;\r
+    }\r
+    else if (((set_w <= 640) && (set_h <= 480)) && sensor_vga[0].reg)\r
+    {\r
+        set_w = 640;\r
+        set_h = 480;\r
+    }\r
+    else if (((set_w <= 800) && (set_h <= 600)) && sensor_svga[0].reg)\r
+    {\r
+        set_w = 800;\r
+        set_h = 600;\r
+    }\r
+    else if (((set_w <= 1280) && (set_h <= 1024)) && sensor_sxga[0].reg)\r
+    {\r
+        set_w = 1280;\r
+        set_h = 1024;\r
+    }\r
+    else\r
+    {\r
+        set_w = SENSOR_INIT_WIDTH;\r
+        set_h = SENSOR_INIT_HEIGHT;            \r
+    }\r
+\r
+    mf->width = set_w;\r
+    mf->height = set_h; \r
+    \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 = v4l2_get_subdevdata(sd);\r
+\r
+    if (id->match.type != V4L2_CHIP_MATCH_I2C_ADDR)\r
+        return -EINVAL;\r
+\r
+    if (id->match.addr != client->addr)\r
+        return -ENODEV;\r
+\r
+    id->ident = SENSOR_V4L2_IDENT;      /* ddl@rock-chips.com :  Return OV9650  identifier */\r
+    id->revision = 0;\r
+\r
+    return 0;\r
+}\r
+#if CONFIG_SENSOR_Brightness\r
+static int sensor_set_brightness(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_BrightnessSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_BrightnessSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+       SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Effect\r
+static int sensor_set_effect(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_EffectSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_EffectSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+       SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Exposure\r
+static int sensor_set_exposure(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_ExposureSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_ExposureSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+       SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Saturation\r
+static int sensor_set_saturation(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_SaturationSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_SaturationSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+    SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Contrast\r
+static int sensor_set_contrast(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_ContrastSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_ContrastSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+    SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Mirror\r
+static int sensor_set_mirror(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_MirrorSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_MirrorSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+    SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Flip\r
+static int sensor_set_flip(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_FlipSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_FlipSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+    SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Scene\r
+static int sensor_set_scene(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_SceneSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_SceneSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+    SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_WhiteBalance\r
+static int sensor_set_whiteBalance(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+\r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum))\r
+    {\r
+        if (sensor_WhiteBalanceSeqe[value - qctrl->minimum] != NULL)\r
+        {\r
+            if (sensor_effect_write_array(client, sensor_WhiteBalanceSeqe[value - qctrl->minimum]) != 0)\r
+            {\r
+                SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+                return -EINVAL;\r
+            }\r
+            SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+            return 0;\r
+        }\r
+    }\r
+       SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_DigitalZoom\r
+static int sensor_set_digitalzoom(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int *value)\r
+{\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+    struct sensor *sensor = to_sensor(client);\r
+       const struct v4l2_queryctrl *qctrl_info;\r
+    int digitalzoom_cur, digitalzoom_total;\r
+\r
+       qctrl_info = soc_camera_find_qctrl(&sensor_ops, V4L2_CID_ZOOM_ABSOLUTE);\r
+       if (qctrl_info)\r
+               return -EINVAL;\r
+\r
+    digitalzoom_cur = sensor->info_priv.digitalzoom;\r
+    digitalzoom_total = qctrl_info->maximum;\r
+\r
+    if ((*value > 0) && (digitalzoom_cur >= digitalzoom_total))\r
+    {\r
+        SENSOR_TR("%s digitalzoom is maximum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
+        return -EINVAL;\r
+    }\r
+\r
+    if  ((*value < 0) && (digitalzoom_cur <= qctrl_info->minimum))\r
+    {\r
+        SENSOR_TR("%s digitalzoom is minimum - %x\n", SENSOR_NAME_STRING(), digitalzoom_cur);\r
+        return -EINVAL;\r
+    }\r
+\r
+    if ((*value > 0) && ((digitalzoom_cur + *value) > digitalzoom_total))\r
+    {\r
+        *value = digitalzoom_total - digitalzoom_cur;\r
+    }\r
+\r
+    if ((*value < 0) && ((digitalzoom_cur + *value) < 0))\r
+    {\r
+        *value = 0 - digitalzoom_cur;\r
+    }\r
+\r
+    digitalzoom_cur += *value;\r
+\r
+    if (sensor_ZoomSeqe[digitalzoom_cur] != NULL)\r
+    {\r
+        if (sensor_effect_write_array(client, sensor_ZoomSeqe[digitalzoom_cur]) != 0)\r
+        {\r
+            SENSOR_TR("%s..%s WriteReg Fail.. \n",SENSOR_NAME_STRING(), __FUNCTION__);\r
+            return -EINVAL;\r
+        }\r
+        SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, *value);\r
+        return 0;\r
+    }\r
+\r
+    return -EINVAL;\r
+}\r
+#endif\r
+#if CONFIG_SENSOR_Flash\r
+static int sensor_set_flash(struct soc_camera_device *icd, const struct v4l2_queryctrl *qctrl, int value)\r
+{    \r
+    if ((value >= qctrl->minimum) && (value <= qctrl->maximum)) {\r
+        if (value == 3) {       /* ddl@rock-chips.com: torch */\r
+            sensor_ioctrl(icd, Sensor_Flash, Flash_Torch);   /* Flash On */\r
+        } else {\r
+            sensor_ioctrl(icd, Sensor_Flash, Flash_Off);\r
+        }\r
+        SENSOR_DG("%s..%s : %x\n",SENSOR_NAME_STRING(),__FUNCTION__, value);\r
+        return 0;\r
+    }\r
+    \r
+       SENSOR_TR("\n %s..%s valure = %d is invalidate..    \n",SENSOR_NAME_STRING(),__FUNCTION__,value);\r
+    return -EINVAL;\r
+}\r
+#endif\r
+\r
+static int sensor_g_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
+{\r
+    struct i2c_client *client = v4l2_get_subdevdata(sd);\r
+    struct sensor *sensor = to_sensor(client);\r
+    const struct v4l2_queryctrl *qctrl;\r
+\r
+    qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
+\r
+    if (!qctrl)\r
+    {\r
+        SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
+        return -EINVAL;\r
+    }\r
+\r
+    switch (ctrl->id)\r
+    {\r
+        case V4L2_CID_BRIGHTNESS:\r
+            {\r
+                ctrl->value = sensor->info_priv.brightness;\r
+                break;\r
+            }\r
+        case V4L2_CID_SATURATION:\r
+            {\r
+                ctrl->value = sensor->info_priv.saturation;\r
+                break;\r
+            }\r
+        case V4L2_CID_CONTRAST:\r
+            {\r
+                ctrl->value = sensor->info_priv.contrast;\r
+                break;\r
+            }\r
+        case V4L2_CID_DO_WHITE_BALANCE:\r
+            {\r
+                ctrl->value = sensor->info_priv.whiteBalance;\r
+                break;\r
+            }\r
+        case V4L2_CID_EXPOSURE:\r
+            {\r
+                ctrl->value = sensor->info_priv.exposure;\r
+                break;\r
+            }\r
+        case V4L2_CID_HFLIP:\r
+            {\r
+                ctrl->value = sensor->info_priv.mirror;\r
+                break;\r
+            }\r
+        case V4L2_CID_VFLIP:\r
+            {\r
+                ctrl->value = sensor->info_priv.flip;\r
+                break;\r
+            }\r
+        default :\r
+                break;\r
+    }\r
+    return 0;\r
+}\r
+\r
+\r
+\r
+static int sensor_s_control(struct v4l2_subdev *sd, struct v4l2_control *ctrl)\r
+{\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
+\r
+\r
+    qctrl = soc_camera_find_qctrl(&sensor_ops, ctrl->id);\r
+\r
+    if (!qctrl)\r
+    {\r
+        SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ctrl->id);\r
+        return -EINVAL;\r
+    }\r
+\r
+    switch (ctrl->id)\r
+    {\r
+#if CONFIG_SENSOR_Brightness\r
+        case V4L2_CID_BRIGHTNESS:\r
+            {\r
+                if (ctrl->value != sensor->info_priv.brightness)\r
+                {\r
+                    if (sensor_set_brightness(icd, qctrl,ctrl->value) != 0)\r
+                    {\r
+                        return -EINVAL;\r
+                    }\r
+                    sensor->info_priv.brightness = ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Exposure\r
+        case V4L2_CID_EXPOSURE:\r
+            {\r
+                if (ctrl->value != sensor->info_priv.exposure)\r
+                {\r
+                    if (sensor_set_exposure(icd, qctrl,ctrl->value) != 0)\r
+                    {\r
+                        return -EINVAL;\r
+                    }\r
+                    sensor->info_priv.exposure = ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Saturation\r
+        case V4L2_CID_SATURATION:\r
+            {\r
+                if (ctrl->value != sensor->info_priv.saturation)\r
+                {\r
+                    if (sensor_set_saturation(icd, qctrl,ctrl->value) != 0)\r
+                    {\r
+                        return -EINVAL;\r
+                    }\r
+                    sensor->info_priv.saturation = ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Contrast\r
+        case V4L2_CID_CONTRAST:\r
+            {\r
+                if (ctrl->value != sensor->info_priv.contrast)\r
+                {\r
+                    if (sensor_set_contrast(icd, qctrl,ctrl->value) != 0)\r
+                    {\r
+                        return -EINVAL;\r
+                    }\r
+                    sensor->info_priv.contrast = ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_WhiteBalance\r
+        case V4L2_CID_DO_WHITE_BALANCE:\r
+            {\r
+                if (ctrl->value != sensor->info_priv.whiteBalance)\r
+                {\r
+                    if (sensor_set_whiteBalance(icd, qctrl,ctrl->value) != 0)\r
+                    {\r
+                        return -EINVAL;\r
+                    }\r
+                    sensor->info_priv.whiteBalance = ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Mirror\r
+        case V4L2_CID_HFLIP:\r
+            {\r
+                if (ctrl->value != sensor->info_priv.mirror)\r
+                {\r
+                    if (sensor_set_mirror(icd, qctrl,ctrl->value) != 0)\r
+                        return -EINVAL;\r
+                    sensor->info_priv.mirror = ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Flip\r
+        case V4L2_CID_VFLIP:\r
+            {\r
+                if (ctrl->value != sensor->info_priv.flip)\r
+                {\r
+                    if (sensor_set_flip(icd, qctrl,ctrl->value) != 0)\r
+                        return -EINVAL;\r
+                    sensor->info_priv.flip = ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return 0;\r
+}\r
+static int sensor_g_ext_control(struct soc_camera_device *icd , struct v4l2_ext_control *ext_ctrl)\r
+{\r
+    const struct v4l2_queryctrl *qctrl;\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+    struct sensor *sensor = to_sensor(client);\r
+\r
+    qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
+\r
+    if (!qctrl)\r
+    {\r
+        SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
+        return -EINVAL;\r
+    }\r
+\r
+    switch (ext_ctrl->id)\r
+    {\r
+        case V4L2_CID_SCENE:\r
+            {\r
+                ext_ctrl->value = sensor->info_priv.scene;\r
+                break;\r
+            }\r
+        case V4L2_CID_EFFECT:\r
+            {\r
+                ext_ctrl->value = sensor->info_priv.effect;\r
+                break;\r
+            }\r
+        case V4L2_CID_ZOOM_ABSOLUTE:\r
+            {\r
+                ext_ctrl->value = sensor->info_priv.digitalzoom;\r
+                break;\r
+            }\r
+        case V4L2_CID_ZOOM_RELATIVE:\r
+            {\r
+                return -EINVAL;\r
+            }\r
+        case V4L2_CID_FOCUS_ABSOLUTE:\r
+            {\r
+                ext_ctrl->value = sensor->info_priv.focus;\r
+                break;\r
+            }\r
+        case V4L2_CID_FOCUS_RELATIVE:\r
+            {\r
+                return -EINVAL;\r
+            }\r
+        case V4L2_CID_FLASH:\r
+            {\r
+                ext_ctrl->value = sensor->info_priv.flash;\r
+                break;\r
+            }\r
+        default :\r
+            break;\r
+    }\r
+    return 0;\r
+}\r
+static int sensor_s_ext_control(struct soc_camera_device *icd, struct v4l2_ext_control *ext_ctrl)\r
+{\r
+    const struct v4l2_queryctrl *qctrl;\r
+    struct i2c_client *client = to_i2c_client(to_soc_camera_control(icd));\r
+    struct sensor *sensor = to_sensor(client);\r
+    int val_offset;\r
+\r
+    qctrl = soc_camera_find_qctrl(&sensor_ops, ext_ctrl->id);\r
+\r
+    if (!qctrl)\r
+    {\r
+        SENSOR_TR("\n %s ioctrl id = %d  is invalidate \n", SENSOR_NAME_STRING(), ext_ctrl->id);\r
+        return -EINVAL;\r
+    }\r
+\r
+       val_offset = 0;\r
+    switch (ext_ctrl->id)\r
+    {\r
+#if CONFIG_SENSOR_Scene\r
+        case V4L2_CID_SCENE:\r
+            {\r
+                if (ext_ctrl->value != sensor->info_priv.scene)\r
+                {\r
+                    if (sensor_set_scene(icd, qctrl,ext_ctrl->value) != 0)\r
+                        return -EINVAL;\r
+                    sensor->info_priv.scene = ext_ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Effect\r
+        case V4L2_CID_EFFECT:\r
+            {\r
+                if (ext_ctrl->value != sensor->info_priv.effect)\r
+                {\r
+                    if (sensor_set_effect(icd, qctrl,ext_ctrl->value) != 0)\r
+                        return -EINVAL;\r
+                    sensor->info_priv.effect= ext_ctrl->value;\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_DigitalZoom\r
+        case V4L2_CID_ZOOM_ABSOLUTE:\r
+            {\r
+                if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
+                    return -EINVAL;\r
+\r
+                if (ext_ctrl->value != sensor->info_priv.digitalzoom)\r
+                {\r
+                    val_offset = ext_ctrl->value -sensor->info_priv.digitalzoom;\r
+\r
+                    if (sensor_set_digitalzoom(icd, qctrl,&val_offset) != 0)\r
+                        return -EINVAL;\r
+                    sensor->info_priv.digitalzoom += val_offset;\r
+\r
+                    SENSOR_DG("%s digitalzoom is %x\n",SENSOR_NAME_STRING(),  sensor->info_priv.digitalzoom);\r
+                }\r
+\r
+                break;\r
+            }\r
+        case V4L2_CID_ZOOM_RELATIVE:\r
+            {\r
+                if (ext_ctrl->value)\r
+                {\r
+                    if (sensor_set_digitalzoom(icd, qctrl,&ext_ctrl->value) != 0)\r
+                        return -EINVAL;\r
+                    sensor->info_priv.digitalzoom += ext_ctrl->value;\r
+\r
+                    SENSOR_DG("%s digitalzoom is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.digitalzoom);\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Focus\r
+        case V4L2_CID_FOCUS_ABSOLUTE:\r
+            {\r
+                if ((ext_ctrl->value < qctrl->minimum) || (ext_ctrl->value > qctrl->maximum))\r
+                    return -EINVAL;\r
+\r
+                if (ext_ctrl->value != sensor->info_priv.focus)\r
+                {\r
+                    val_offset = ext_ctrl->value -sensor->info_priv.focus;\r
+\r
+                    sensor->info_priv.focus += val_offset;\r
+                }\r
+\r
+                break;\r
+            }\r
+        case V4L2_CID_FOCUS_RELATIVE:\r
+            {\r
+                if (ext_ctrl->value)\r
+                {\r
+                    sensor->info_priv.focus += ext_ctrl->value;\r
+\r
+                    SENSOR_DG("%s focus is %x\n", SENSOR_NAME_STRING(), sensor->info_priv.focus);\r
+                }\r
+                break;\r
+            }\r
+#endif\r
+#if CONFIG_SENSOR_Flash\r
+        case V4L2_CID_FLASH:\r
+            {\r
+                if (sensor_set_flash(icd, qctrl,ext_ctrl->value) != 0)\r
+                    return -EINVAL;\r
+                sensor->info_priv.flash = ext_ctrl->value;\r
+\r
+                SENSOR_DG("%s flash is %x\n",SENSOR_NAME_STRING(), sensor->info_priv.flash);\r
+                break;\r
+            }\r
+#endif\r
+        default:\r
+            break;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static int sensor_g_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
+{\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
+\r
+    for (i=0; i<ext_ctrl->count; i++) {\r
+        if (sensor_g_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
+            error_cnt++;\r
+            error_idx = i;\r
+        }\r
+    }\r
+\r
+    if (error_cnt > 1)\r
+        error_idx = ext_ctrl->count;\r
+\r
+    if (error_idx != -1) {\r
+        ext_ctrl->error_idx = error_idx;\r
+        return -EINVAL;\r
+    } else {\r
+        return 0;\r
+    }\r
+}\r
+\r
+static int sensor_s_ext_controls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ext_ctrl)\r
+{\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
+\r
+    for (i=0; i<ext_ctrl->count; i++) {\r
+        if (sensor_s_ext_control(icd, &ext_ctrl->controls[i]) != 0) {\r
+            error_cnt++;\r
+            error_idx = i;\r
+        }\r
+    }\r
+\r
+    if (error_cnt > 1)\r
+        error_idx = ext_ctrl->count;\r
+\r
+    if (error_idx != -1) {\r
+        ext_ctrl->error_idx = error_idx;\r
+        return -EINVAL;\r
+    } else {\r
+        return 0;\r
+    }\r
+}\r
+\r
+/* Interface active, can use i2c. If it fails, it can indeed mean, that\r
+ * this wasn't our capture interface, so, we wait for the right one */\r
+static int sensor_video_probe(struct soc_camera_device *icd,\r
+                              struct i2c_client *client)\r
+{\r
+    char pid = 0;\r
+    int ret;\r
+    struct sensor *sensor = to_sensor(client);\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
+    if (!icd->dev.parent ||\r
+           to_soc_camera_host(icd->dev.parent)->nr != icd->iface)\r
+               return -ENODEV;\r
+\r
+       if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {\r
+               ret = -ENODEV;\r
+               goto sensor_video_probe_err;\r
+       }\r
+\r
+    /* soft reset */\r
+   /* ret = sensor_write(client, 0x12, 0x80);\r
+    if (ret != 0)\r
+    {\r
+        SENSOR_TR("soft reset %s failed\n",SENSOR_NAME_STRING());\r
+        return -ENODEV;\r
+    }\r
+    mdelay(50);          *///delay 5 microseconds\r
+     sensor_write(client, 0x00, 0x01);\r
+     sensor_write(client, 0x03, 0x0a);\r
+       mdelay(100);          //delay 5 microseconds\r
+     sensor_write(client, 0x00, 0x01);\r
+     sensor_write(client, 0x03, 0x0a);\r
+       mdelay(100);          //delay 5 microseconds\r
+        \r
+    /* check if it is an sensor sensor */\r
+            sensor_write(client, 0x00, 0x00);\r
+\r
+    ret = sensor_read(client, 0x01, &pid);\r
+    if (ret != 0) {\r
+        SENSOR_TR("%s read chip id high byte failed\n",SENSOR_NAME_STRING());\r
+        ret = -ENODEV;\r
+        goto sensor_video_probe_err;\r
+    }\r
+\r
+    SENSOR_DG("\n %s  pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
+    if (pid == SENSOR_ID) {\r
+        sensor->model = SENSOR_V4L2_IDENT;\r
+    } else {\r
+        SENSOR_TR("error: %s mismatched   pid = 0x%x\n", SENSOR_NAME_STRING(), pid);\r
+        ret = -ENODEV;\r
+        goto sensor_video_probe_err;\r
+    }\r
+\r
+    return 0;\r
+\r
+sensor_video_probe_err:\r
+\r
+    return ret;\r
+}\r
+\r
+static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)\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
+    int ret = 0;\r
+\r
+    int i;\r
+\r
+    \r
+       SENSOR_DG("\n%s..%s..cmd:%x \n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
+       switch (cmd)\r
+       {\r
+               case RK29_CAM_SUBDEV_DEACTIVATE:\r
+               {\r
+                       sensor_deactivate(client);\r
+                       break;\r
+               }\r
+\r
+               case RK29_CAM_SUBDEV_IOREQUEST:\r
+               {\r
+                       sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;           \r
+            if (sensor->sensor_io_request != NULL) { \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
+                ret = -EINVAL;\r
+                goto sensor_ioctl_end;\r
+            }\r
+            /* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control \r
+               for this project */\r
+            #if CONFIG_SENSOR_Flash    \r
+               if (sensor->sensor_gpio_res) { \r
+                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
+                               }\r
+                    }\r
+                    sensor->info_priv.flash = 0xff;\r
+                    SENSOR_DG("%s flash gpio is invalidate!\n",SENSOR_NAME_STRING());\r
+                }\r
+               }\r
+            #endif\r
+                       break;\r
+               }\r
+               default:\r
+               {\r
+                       SENSOR_TR("%s %s cmd(0x%x) is unknown !\n",SENSOR_NAME_STRING(),__FUNCTION__,cmd);\r
+                       break;\r
+               }\r
+       }\r
+sensor_ioctl_end:\r
+       return ret;\r
+\r
+}\r
+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
+       .g_ctrl         = sensor_g_control,\r
+       .s_ctrl         = sensor_s_control,\r
+       .g_ext_ctrls          = sensor_g_ext_controls,\r
+       .s_ext_ctrls          = sensor_s_ext_controls,\r
+       .g_chip_ident   = sensor_g_chip_ident,\r
+       .ioctl = sensor_ioctl,\r
+};\r
+\r
+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
+       .core   = &sensor_subdev_core_ops,\r
+       .video = &sensor_subdev_video_ops,\r
+};\r
+\r
+static int sensor_probe(struct i2c_client *client,\r
+                        const struct i2c_device_id *did)\r
+{\r
+    struct sensor *sensor;\r
+    struct soc_camera_device *icd = client->dev.platform_data;\r
+    struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);\r
+    struct soc_camera_link *icl;\r
+    int ret;\r
+\r
+    SENSOR_DG("\n%s..%s..%d..\n",__FUNCTION__,__FILE__,__LINE__);\r
+    if (!icd) {\r
+        dev_err(&client->dev, "%s: missing soc-camera data!\n",SENSOR_NAME_STRING());\r
+        return -EINVAL;\r
+    }\r
+\r
+    icl = to_soc_camera_link(icd);\r
+    if (!icl) {\r
+        dev_err(&client->dev, "%s driver needs platform data\n", SENSOR_NAME_STRING());\r
+        return -EINVAL;\r
+    }\r
+\r
+    if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) {\r
+        dev_warn(&adapter->dev,\r
+                "I2C-Adapter doesn't support I2C_FUNC_I2C\n");\r
+        return -EIO;\r
+    }\r
+\r
+    sensor = kzalloc(sizeof(struct sensor), GFP_KERNEL);\r
+    if (!sensor)\r
+        return -ENOMEM;\r
+\r
+    v4l2_i2c_subdev_init(&sensor->subdev, client, &sensor_subdev_ops);\r
+\r
+    /* Second stage probe - when a capture adapter is there */\r
+    icd->ops           = &sensor_ops;\r
+\r
+    sensor->info_priv.fmt = sensor_colour_fmts[0];\r
+    \r
+       #if CONFIG_SENSOR_I2C_NOSCHED\r
+       atomic_set(&sensor->tasklock_cnt,0);\r
+       #endif\r
+\r
+    ret = sensor_video_probe(icd, client);\r
+    if (ret < 0) {\r
+        icd->ops = NULL;\r
+        i2c_set_clientdata(client, NULL);\r
+        kfree(sensor);\r
+               sensor = NULL;\r
+    }\r
+    SENSOR_DG("\n%s..%s..%d  ret = %x \n",__FUNCTION__,__FILE__,__LINE__,ret);\r
+    return ret;\r
+}\r
+\r
+static int sensor_remove(struct i2c_client *client)\r
+{\r
+    struct sensor *sensor = to_sensor(client);\r
+    struct soc_camera_device *icd = client->dev.platform_data;\r
+\r
+    icd->ops = NULL;\r
+    i2c_set_clientdata(client, NULL);\r
+    client->driver = NULL;\r
+    kfree(sensor);\r
+       sensor = NULL;\r
+    return 0;\r
+}\r
+\r
+static const struct i2c_device_id sensor_id[] = {\r
+       {SENSOR_NAME_STRING(), 0 },\r
+       { }\r
+};\r
+MODULE_DEVICE_TABLE(i2c, sensor_id);\r
+\r
+static struct i2c_driver sensor_i2c_driver = {\r
+       .driver = {\r
+               .name = SENSOR_NAME_STRING(),\r
+       },\r
+       .probe          = sensor_probe,\r
+       .remove         = sensor_remove,\r
+       .id_table       = sensor_id,\r
+};\r
+\r
+static int __init sensor_mod_init(void)\r
+{\r
+    SENSOR_DG("\n%s..%s.. \n",__FUNCTION__,SENSOR_NAME_STRING());\r
+    return i2c_add_driver(&sensor_i2c_driver);\r
+}\r
+\r
+static void __exit sensor_mod_exit(void)\r
+{\r
+    i2c_del_driver(&sensor_i2c_driver);\r
+}\r
+\r
+device_initcall_sync(sensor_mod_init);\r
+module_exit(sensor_mod_exit);\r
+\r
+MODULE_DESCRIPTION(SENSOR_NAME_STRING(Camera sensor driver));\r
+MODULE_AUTHOR("ddl <kernel@rock-chips>");\r
+MODULE_LICENSE("GPL");\r
+\r
+\r
index 53724b2be00c95ad52d1d63b614efdff6c0202fa..a27a50910a6c97386e100ec2f2e10678afc32bc2 100755 (executable)
@@ -90,7 +90,6 @@ enum {
 
        /* Samsung sensors: reserved range 310-319 */
        V4L2_IDENT_S5K66A = 310,                                                        /* ddl@rock-chips.com : s5k66a support */
-       V4L2_IDENT_S5K5CA = 311,                                                        /* ddl@rock-chips.com : s5k5ca support */
 
        /* Conexant MPEG encoder/decoders: reserved range 400-420 */
        V4L2_IDENT_CX23418_843 = 403, /* Integrated A/V Decoder on the '418 */
@@ -349,9 +348,8 @@ enum {
     V4L2_IDENT_HI704 = 64107,      /* ddl@rock-chips.com : hi704 support */
     V4L2_IDENT_NT99250 = 64108,    /* ddl@rock-chips.com : nt99250 support */
     V4L2_IDENT_SID130B = 64109,      /* ddl@rock-chips.com : sid130B support */
+    V4L2_IDENT_SIV121D= 64109,      /* ddl@rock-chips.com : sid130B support */
 
-    V4L2_IDENT_SP0838 = 64110,      /* ddl@rock-chips.com : SP0838 support */
-    V4L2_IDENT_GC0329 = 64111,      /* ddl@rock-chips.com : GC0329 support */
        /* Don't just add new IDs at the end: KEEP THIS LIST ORDERED BY ID! */
 };