camera rk30 : fix erro array define of fps , optimize the define of sensor init data.
authorroot <root@zyc-desktop.(none)>
Thu, 12 Apr 2012 09:07:14 +0000 (17:07 +0800)
committerroot <root@zyc-desktop.(none)>
Thu, 12 Apr 2012 09:07:50 +0000 (17:07 +0800)
arch/arm/mach-rk30/board-rk30-sdk.c
arch/arm/plat-rk/include/plat/rk_camera.h
arch/arm/plat-rk/rk_camera.c
drivers/media/video/ov2655.c
drivers/media/video/ov2659.c [changed mode: 0644->0755]
drivers/media/video/ov5642.c [changed mode: 0644->0755]
drivers/media/video/rk30_camera_oneframe.c

index 56046b13ad29bb6aaf1d6a403c66d231223dee2c..b976131e96aa125297fa70f60db68f10a4161058 100755 (executable)
@@ -282,57 +282,186 @@ static struct reginfo_t rk_init_data_sensor_winseqreg_1[] =
        {0x0000, 0x00,0,0}
 };
 #endif
+#if CONFIG_SENSOR_IIC_ADDR_01
+static struct reginfo_t rk_init_data_sensor_reg_01[] =
+{
+    {0x0000, 0x00,0,0}
+};
+static struct reginfo_t rk_init_data_sensor_winseqreg_01[] =
+{
+       {0x0000, 0x00,0,0}
+};
+#endif
+#if CONFIG_SENSOR_IIC_ADDR_02
+static struct reginfo_t rk_init_data_sensor_reg_02[] =
+{
+    {0x0000, 0x00,0,0}
+};
+static struct reginfo_t rk_init_data_sensor_winseqreg_02[] =
+{
+       {0x0000, 0x00,0,0}
+};
+#endif
+#if CONFIG_SENSOR_IIC_ADDR_11
+static struct reginfo_t rk_init_data_sensor_reg_11[] =
+{
+    {0x0000, 0x00,0,0}
+};
+static struct reginfo_t rk_init_data_sensor_winseqreg_11[] =
+{
+       {0x0000, 0x00,0,0}
+};
+#endif
+#if CONFIG_SENSOR_IIC_ADDR_12
+static struct reginfo_t rk_init_data_sensor_reg_12[] =
+{
+    {0x0000, 0x00,0,0}
+};
+static struct reginfo_t rk_init_data_sensor_winseqreg_12[] =
+{
+       {0x0000, 0x00,0,0}
+};
+#endif
 static rk_sensor_user_init_data_s rk_init_data_sensor[RK_CAM_NUM] = 
 {
+    #if CONFIG_SENSOR_IIC_ADDR_0
     {
        .rk_sensor_init_width = INVALID_VALUE,
        .rk_sensor_init_height = INVALID_VALUE,
        .rk_sensor_init_bus_param = INVALID_VALUE,
        .rk_sensor_init_pixelcode = INVALID_VALUE,
-       .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_0,
-       .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_0,
-       .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
-    },{
-        .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_data = rk_init_data_sensor_reg_0,
+       .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_0,
+       .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
+       .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_0) / sizeof(struct reginfo_t),
+    },
+    #else
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
        .rk_sensor_init_height = INVALID_VALUE,
        .rk_sensor_init_bus_param = INVALID_VALUE,
        .rk_sensor_init_pixelcode = INVALID_VALUE,
-       .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1,
-       .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1,
-       .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
-    },{
-        .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_data = NULL,
+       .rk_sensor_init_winseq = NULL,
+       .rk_sensor_winseq_size = 0,
+       .rk_sensor_init_data_size = 0,
+    },
+    #endif
+    #if CONFIG_SENSOR_IIC_ADDR_1
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
        .rk_sensor_init_height = INVALID_VALUE,
        .rk_sensor_init_bus_param = INVALID_VALUE,
        .rk_sensor_init_pixelcode = INVALID_VALUE,
-       .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1,
-       .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1,
-       .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
-    },{
-        .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_data = rk_init_data_sensor_reg_1,
+       .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_1,
+       .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
+       .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_1) / sizeof(struct reginfo_t),
+    },
+    #else
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
        .rk_sensor_init_height = INVALID_VALUE,
        .rk_sensor_init_bus_param = INVALID_VALUE,
        .rk_sensor_init_pixelcode = INVALID_VALUE,
-       .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1,
-       .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1,
-       .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
-    },{
-        .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_data = NULL,
+       .rk_sensor_init_winseq = NULL,
+       .rk_sensor_winseq_size = 0,
+       .rk_sensor_init_data_size = 0,
+    },
+    #endif
+    #if CONFIG_SENSOR_IIC_ADDR_01
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
        .rk_sensor_init_height = INVALID_VALUE,
        .rk_sensor_init_bus_param = INVALID_VALUE,
        .rk_sensor_init_pixelcode = INVALID_VALUE,
-       .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1,
-       .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1,
-       .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
-    },{
-        .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_data = rk_init_data_sensor_reg_01,
+       .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_01,
+       .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_01) / sizeof(struct reginfo_t),
+       .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_01) / sizeof(struct reginfo_t),
+    },
+    #else
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_height = INVALID_VALUE,
+       .rk_sensor_init_bus_param = INVALID_VALUE,
+       .rk_sensor_init_pixelcode = INVALID_VALUE,
+       .rk_sensor_init_data = NULL,
+       .rk_sensor_init_winseq = NULL,
+       .rk_sensor_winseq_size = 0,
+       .rk_sensor_init_data_size = 0,
+    },
+    #endif
+    #if CONFIG_SENSOR_IIC_ADDR_02
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_height = INVALID_VALUE,
+       .rk_sensor_init_bus_param = INVALID_VALUE,
+       .rk_sensor_init_pixelcode = INVALID_VALUE,
+       .rk_sensor_init_data = rk_init_data_sensor_reg_02,
+       .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_02,
+       .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_02) / sizeof(struct reginfo_t),
+       .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_02) / sizeof(struct reginfo_t),
+    },
+    #else
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_height = INVALID_VALUE,
+       .rk_sensor_init_bus_param = INVALID_VALUE,
+       .rk_sensor_init_pixelcode = INVALID_VALUE,
+       .rk_sensor_init_data = NULL,
+       .rk_sensor_init_winseq = NULL,
+       .rk_sensor_winseq_size = 0,
+       .rk_sensor_init_data_size = 0,
+    },
+    #endif
+    #if CONFIG_SENSOR_IIC_ADDR_11
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_height = INVALID_VALUE,
+       .rk_sensor_init_bus_param = INVALID_VALUE,
+       .rk_sensor_init_pixelcode = INVALID_VALUE,
+       .rk_sensor_init_data = rk_init_data_sensor_reg_11,
+       .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_11,
+       .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_11) / sizeof(struct reginfo_t),
+       .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_11) / sizeof(struct reginfo_t),
+    },
+    #else
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_height = INVALID_VALUE,
+       .rk_sensor_init_bus_param = INVALID_VALUE,
+       .rk_sensor_init_pixelcode = INVALID_VALUE,
+       .rk_sensor_init_data = NULL,
+       .rk_sensor_init_winseq = NULL,
+       .rk_sensor_winseq_size = 0,
+       .rk_sensor_init_data_size = 0,
+    },
+    #endif
+    #if CONFIG_SENSOR_IIC_ADDR_12
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
+       .rk_sensor_init_height = INVALID_VALUE,
+       .rk_sensor_init_bus_param = INVALID_VALUE,
+       .rk_sensor_init_pixelcode = INVALID_VALUE,
+       .rk_sensor_init_data = rk_init_data_sensor_reg_12,
+       .rk_sensor_init_winseq = rk_init_data_sensor_winseqreg_12,
+       .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_12) / sizeof(struct reginfo_t),
+       .rk_sensor_init_data_size = sizeof(rk_init_data_sensor_reg_12) / sizeof(struct reginfo_t),
+    },
+    #else
+    {
+       .rk_sensor_init_width = INVALID_VALUE,
        .rk_sensor_init_height = INVALID_VALUE,
        .rk_sensor_init_bus_param = INVALID_VALUE,
        .rk_sensor_init_pixelcode = INVALID_VALUE,
-       .rk_sensor_init_data = NULL,//rk_init_data_sensor_reg_1,
-       .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_1,
-       .rk_sensor_winseq_size = 0,//sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
+       .rk_sensor_init_data = NULL,
+       .rk_sensor_init_winseq = NULL,
+       .rk_sensor_winseq_size = 0,
+       .rk_sensor_init_data_size = 0,
     },
+    #endif
 
  };
 #include "../../../drivers/media/video/rk30_camera.c"
index 8f8786e32b693ee1fb8f6a7b299a1bf77b70e62b..5ccc739179c374e098d95462933f6327a0b8e350 100755 (executable)
@@ -199,6 +199,7 @@ typedef struct rk_sensor_user_init_data{
        struct reginfo_t * rk_sensor_init_data;
        int rk_sensor_winseq_size;
        struct reginfo_t * rk_sensor_init_winseq;
+       int rk_sensor_init_data_size;
 }rk_sensor_user_init_data_s;
 
 typedef struct rk_camera_device_register_info {
index 8bcd22c182c34f70717d92d15500472432284e4e..8fd46a810e0917d2d025651fc1496607109abcac 100755 (executable)
@@ -824,8 +824,30 @@ static void rk29_sensor_fps_get(int idx, unsigned int *val, int w, int h)
             }\r
             break;\r
         }\r
-        #ifdef CONFIG_SENSOR_01\r
         case 1:\r
+        {\r
+            if ((w==176) && (h==144)) {\r
+                *val = CONFIG_SENSOR_QCIF_FPS_FIXED_1;\r
+            #ifdef CONFIG_SENSOR_240X160_FPS_FIXED_1\r
+            } else if ((w==240) && (h==160)) {\r
+                *val = CONFIG_SENSOR_240X160_FPS_FIXED_1;\r
+            #endif\r
+            } else if ((w==320) && (h==240)) {\r
+                *val = CONFIG_SENSOR_QVGA_FPS_FIXED_1;\r
+            } else if ((w==352) && (h==288)) {\r
+                *val = CONFIG_SENSOR_CIF_FPS_FIXED_1;\r
+            } else if ((w==640) && (h==480)) {\r
+                *val = CONFIG_SENSOR_VGA_FPS_FIXED_1;\r
+            } else if ((w==720) && (h==480)) {\r
+                *val = CONFIG_SENSOR_480P_FPS_FIXED_1;\r
+            } else if ((w==1280) && (h==720)) {\r
+                *val = CONFIG_SENSOR_720P_FPS_FIXED_1;\r
+            }\r
+            break;\r
+        }\r
+\r
+        #ifdef CONFIG_SENSOR_01\r
+        case 2:\r
         {\r
             if ((w==176) && (h==144)) {\r
                 *val = CONFIG_SENSOR_QCIF_FPS_FIXED_01;\r
@@ -848,7 +870,7 @@ static void rk29_sensor_fps_get(int idx, unsigned int *val, int w, int h)
         }\r
         #endif\r
         #ifdef CONFIG_SENSOR_02\r
-        case 2:\r
+        case 3:\r
         {\r
             if ((w==176) && (h==144)) {\r
                 *val = CONFIG_SENSOR_QCIF_FPS_FIXED_02;\r
@@ -871,27 +893,6 @@ static void rk29_sensor_fps_get(int idx, unsigned int *val, int w, int h)
         }\r
         #endif\r
         \r
-        case 3:\r
-        {\r
-            if ((w==176) && (h==144)) {\r
-                *val = CONFIG_SENSOR_QCIF_FPS_FIXED_1;\r
-            #ifdef CONFIG_SENSOR_240X160_FPS_FIXED_1\r
-            } else if ((w==240) && (h==160)) {\r
-                *val = CONFIG_SENSOR_240X160_FPS_FIXED_1;\r
-            #endif\r
-            } else if ((w==320) && (h==240)) {\r
-                *val = CONFIG_SENSOR_QVGA_FPS_FIXED_1;\r
-            } else if ((w==352) && (h==288)) {\r
-                *val = CONFIG_SENSOR_CIF_FPS_FIXED_1;\r
-            } else if ((w==640) && (h==480)) {\r
-                *val = CONFIG_SENSOR_VGA_FPS_FIXED_1;\r
-            } else if ((w==720) && (h==480)) {\r
-                *val = CONFIG_SENSOR_480P_FPS_FIXED_1;\r
-            } else if ((w==1280) && (h==720)) {\r
-                *val = CONFIG_SENSOR_720P_FPS_FIXED_1;\r
-            }\r
-            break;\r
-        }\r
         #ifdef CONFIG_SENSOR_11\r
         case 4:\r
         {\r
index fbdce216337e08e39d684aaddc53eab6a93ed460..cb059264591dd72490c6b2cf56e4e55b2938f5a2 100755 (executable)
@@ -1699,7 +1699,7 @@ static enum v4l2_mbus_pixelcode sensor_init_pixelcode = V4L2_MBUS_FMT_YUYV8_2X8;
 static struct reginfo* sensor_init_data_p = sensor_init_data;
 static struct reginfo* sensor_init_winseq_p = sensor_vga;
 static struct reginfo* sensor_init_winseq_board = NULL;
-
+static struct reginfo* sensor_init_data_board = NULL;
 static int sensor_init(struct v4l2_subdev *sd, u32 val)
 {
     struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -1728,41 +1728,53 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
        if(tmp_plat_data &&(i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]){
        //user has defined the init data
                //init reg
-               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){
-                       for(j = 0;j< sizeof(sensor_init_data)/sizeof(struct reginfo);j++) {
-                               sensor_init_data[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg;
-                               sensor_init_data[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val;
-                       }
-                       sensor_init_data_p = sensor_init_data;
-               } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data) {
-                       sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data);
-               }
+               int tmp_init_data_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data_size;
+        if(tmp_init_data_size > 2){//init data is valid 
+               if((sizeof(struct reginfo) != sizeof(struct reginfo_t))){
+                       if(sensor_init_data_board) {
+                               vfree(sensor_init_data_board);
+                               sensor_init_data_board = NULL;
+                       }
+                       sensor_init_data_board = (struct reginfo*)vmalloc(tmp_init_data_size);
+                       if(!sensor_init_data_board)
+                               SENSOR_TR("%s :vmalloc init data erro !",__FUNCTION__);
+                       for(j = 0;j< tmp_init_data_size;j++) {
+                               sensor_init_data_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg;
+                               sensor_init_data_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val;
+                       }
+                       sensor_init_data_p = sensor_init_data_board;
+               } else{
+                       sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data);
+               }
+           }
                //init winseq
-               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){
-                       int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size;
-                       if(sensor_init_winseq_board) {
-                               vfree(sensor_init_winseq_board);
-                               sensor_init_winseq_board = NULL;
-                       }
-                       sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size);
-                       if(!sensor_init_winseq_board)
-                               SENSOR_TR("%s :vmalloc erro !",__FUNCTION__);
-                       for(j = 0;j< tmp_winseq_size;j++){
-                               sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg;
-                               sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val;
-                       }
-                       sensor_init_winseq_p = sensor_init_winseq_board;
-        } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq){
-                       sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq);
-               }
+               int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size;
+        if(tmp_winseq_size > 2){
+               if(sizeof(struct reginfo) != sizeof(struct reginfo_t)){
+                       if(sensor_init_winseq_board) {
+                               vfree(sensor_init_winseq_board);
+                               sensor_init_winseq_board = NULL;
+                       }
+                       sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size);
+                       if(!sensor_init_winseq_board)
+                               SENSOR_TR("%s :vmalloc erro !",__FUNCTION__);
+                       for(j = 0;j< tmp_winseq_size;j++){
+                               sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg;
+                               sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val;
+                       }
+                       sensor_init_winseq_p = sensor_init_winseq_board;
+                } else{
+                       sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq);
+               }
+            }
                //init width,height,bus,pixelcode
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE)
                        sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width;
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE)
                        sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height;
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE)
                        sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param;
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE)
                        sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode;
        }
     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
old mode 100644 (file)
new mode 100755 (executable)
index d40b1c0..29dcb24
@@ -1505,6 +1505,7 @@ static enum v4l2_mbus_pixelcode sensor_init_pixelcode = V4L2_MBUS_FMT_YUYV8_2X8;
 static struct reginfo* sensor_init_data_p = sensor_init_data;
 static struct reginfo* sensor_init_winseq_p = sensor_svga;
 static struct reginfo* sensor_init_winseq_board = NULL;
+static struct reginfo* sensor_init_data_board = NULL;
 static int sensor_init(struct v4l2_subdev *sd, u32 val)
 {
     struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -1534,41 +1535,53 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
        if(tmp_plat_data &&(i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]){
        //user has defined the init data
                //init reg
-               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){
-                       for(j = 0;j< sizeof(sensor_init_data)/sizeof(struct reginfo);j++) {
-                               sensor_init_data[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg;
-                               sensor_init_data[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val;
-                       }
-                       sensor_init_data_p = sensor_init_data;
-               } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data) {
-                       sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data);
-               }
+               int tmp_init_data_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data_size;
+        if(tmp_init_data_size > 2){//init data is valid 
+               if((sizeof(struct reginfo) != sizeof(struct reginfo_t))){
+                       if(sensor_init_data_board) {
+                               vfree(sensor_init_data_board);
+                               sensor_init_data_board = NULL;
+                       }
+                       sensor_init_data_board = (struct reginfo*)vmalloc(tmp_init_data_size);
+                       if(!sensor_init_data_board)
+                               SENSOR_TR("%s :vmalloc init data erro !",__FUNCTION__);
+                       for(j = 0;j< tmp_init_data_size;j++) {
+                               sensor_init_data_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg;
+                               sensor_init_data_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val;
+                       }
+                       sensor_init_data_p = sensor_init_data_board;
+               } else{
+                       sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data);
+               }
+           }
                //init winseq
-               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){
-                       int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size;
-                       if(sensor_init_winseq_board) {
-                               vfree(sensor_init_winseq_board);
-                               sensor_init_winseq_board = NULL;
-                       }
-                       sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size);
-                       if(!sensor_init_winseq_board)
-                               SENSOR_TR("%s :vmalloc erro !",__FUNCTION__);
-                       for(j = 0;j< tmp_winseq_size;j++){
-                               sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg;
-                               sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val;
-                       }
-                       sensor_init_winseq_p = sensor_init_winseq_board;
-        } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq){
-                       sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq);
-               }
+               int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size;
+        if(tmp_winseq_size > 2){
+               if(sizeof(struct reginfo) != sizeof(struct reginfo_t)){
+                       if(sensor_init_winseq_board) {
+                               vfree(sensor_init_winseq_board);
+                               sensor_init_winseq_board = NULL;
+                       }
+                       sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size);
+                       if(!sensor_init_winseq_board)
+                               SENSOR_TR("%s :vmalloc erro !",__FUNCTION__);
+                       for(j = 0;j< tmp_winseq_size;j++){
+                               sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg;
+                               sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val;
+                       }
+                       sensor_init_winseq_p = sensor_init_winseq_board;
+                } else{
+                       sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq);
+               }
+            }
                //init width,height,bus,pixelcode
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE)
                        sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width;
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE)
                        sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height;
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE)
                        sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param;
-               if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE)
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE)
                        sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode;
        }
     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
old mode 100644 (file)
new mode 100755 (executable)
index db0ac11..35d0f6e
@@ -4254,6 +4254,7 @@ static enum v4l2_mbus_pixelcode sensor_init_pixelcode = V4L2_MBUS_FMT_YUYV8_2X8;
 static struct reginfo* sensor_init_data_p = NULL;
 static struct reginfo* sensor_init_winseq_p = NULL;
 static struct reginfo* sensor_init_winseq_board = NULL;
+static struct reginfo* sensor_init_data_board = NULL;
 static int sensor_init(struct v4l2_subdev *sd, u32 val)
 {
     struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -4277,45 +4278,57 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
                        }
                }
        }
-       if(tmp_plat_data  && (i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]) {
-        //user has defined the init data
-        //init reg
-        if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){
-               for(j = 0;j< sizeof(sensor_init_data)/sizeof(struct reginfo);j++){
-                       sensor_init_data[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg;
-                       sensor_init_data[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val;
-               }
-               sensor_init_data_p = sensor_init_data;
-        } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data) {
-               sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data);
-        }
-        //init winseq
-        if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq && (sizeof(struct reginfo) != sizeof(struct reginfo_t))){
-               int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size;
-               if(sensor_init_winseq_board) {
-                       vfree(sensor_init_winseq_board);
-                       sensor_init_winseq_board = NULL;
-               }
-               sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size);
-               if(!sensor_init_winseq_board)
-                       SENSOR_TR("%s :vmalloc erro !",__FUNCTION__);
-               for(j = 0;j< tmp_winseq_size;j++) {
-                       sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg;
-                       sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val;
+       if(tmp_plat_data &&(i < RK_CAM_NUM) && tmp_plat_data->sensor_init_data[i]){
+       //user has defined the init data
+               //init reg
+               int tmp_init_data_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data_size;
+        if(tmp_init_data_size > 2){//init data is valid 
+               if((sizeof(struct reginfo) != sizeof(struct reginfo_t))){
+                       if(sensor_init_data_board) {
+                               vfree(sensor_init_data_board);
+                               sensor_init_data_board = NULL;
+                       }
+                       sensor_init_data_board = (struct reginfo*)vmalloc(tmp_init_data_size);
+                       if(!sensor_init_data_board)
+                               SENSOR_TR("%s :vmalloc init data erro !",__FUNCTION__);
+                       for(j = 0;j< tmp_init_data_size;j++) {
+                               sensor_init_data_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].reg;
+                               sensor_init_data_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data[j].val;
+                       }
+                       sensor_init_data_p = sensor_init_data_board;
+               } else{
+                       sensor_init_data_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_data);
                }
-               sensor_init_winseq_p = sensor_init_winseq_board;
-        } else if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq) {
-               sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq);
-        }
-        //init width,height,bus,pixelcode
-        if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE)
-               sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width;
-        if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE)
-               sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height;
-        if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE)
-               sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param;
-        if(tmp_plat_data->sensor_init_data[i] && tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE)
-               sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode;
+           }
+               //init winseq
+               int tmp_winseq_size = tmp_plat_data->sensor_init_data[i]->rk_sensor_winseq_size;
+        if(tmp_winseq_size > 2){
+               if(sizeof(struct reginfo) != sizeof(struct reginfo_t)){
+                       if(sensor_init_winseq_board) {
+                               vfree(sensor_init_winseq_board);
+                               sensor_init_winseq_board = NULL;
+                       }
+                       sensor_init_winseq_board = (struct reginfo*)vmalloc(tmp_winseq_size);
+                       if(!sensor_init_winseq_board)
+                               SENSOR_TR("%s :vmalloc erro !",__FUNCTION__);
+                       for(j = 0;j< tmp_winseq_size;j++){
+                               sensor_init_winseq_board[j].reg = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].reg;
+                               sensor_init_winseq_board[j].val = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq[j].val;
+                       }
+                       sensor_init_winseq_p = sensor_init_winseq_board;
+                } else{
+                       sensor_init_winseq_p = (struct reginfo*)(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_winseq);
+               }
+            }
+               //init width,height,bus,pixelcode
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width != INVALID_VALUE)
+                       sensor_init_width = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_width;
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height != INVALID_VALUE)
+                       sensor_init_height = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_height;
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param != INVALID_VALUE)
+                       sensor_init_busparam = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_bus_param;
+               if(tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode != INVALID_VALUE)
+                       sensor_init_pixelcode = tmp_plat_data->sensor_init_data[i]->rk_sensor_init_pixelcode;
        }
     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
 
index 783afb308cfab736894c99638c6699ed430ff36b..204f8b98bc87e2e94c1e15267286a31dc05434e2 100755 (executable)
@@ -382,9 +382,6 @@ static int rk_videobuf_setup(struct videobuf_queue *vq, unsigned int *count,
                        pcdev->camera_work_count = *count;
                }
        }
-    //must be reinit,or will be somthing wrong in irq process.
-    pcdev->active = NULL;
-    INIT_LIST_HEAD(&pcdev->capture);
     RKCAMERA_DG("%s..%d.. videobuf size:%d, vipmem_buf size:%d, count:%d \n",__FUNCTION__,__LINE__, *size,pcdev->vipmem_size, *count);
 
     return 0;
@@ -1811,7 +1808,11 @@ static int rk_camera_s_stream(struct soc_camera_device *icd, int enable)
                RKCAMERA_DG("STREAM_OFF cancel timer and flush work:0x%x \n", ret);
        }
        write_cif_reg(pcdev->base,CIF_CIF_CTRL, cif_ctrl_val);
-
+    //must be reinit,or will be somthing wrong in irq process.
+    if(enable == false){
+        pcdev->active = NULL;
+        INIT_LIST_HEAD(&pcdev->capture);\r
+        }
        RKCAMERA_DG("%s.. enable : 0x%x , CIF_CIF_CTRL = 0x%x\n", __FUNCTION__, enable,read_cif_reg(pcdev->base,CIF_CIF_CTRL));
        return 0;
 }