camera rk30: add clock and power io control .
authorroot <root@zyc-desktop.(none)>
Tue, 27 Mar 2012 11:20:33 +0000 (19:20 +0800)
committerroot <root@zyc-desktop.(none)>
Tue, 27 Mar 2012 11:20:33 +0000 (19:20 +0800)
arch/arm/mach-rk30/board-rk30-sdk.c [changed mode: 0755->0644]
arch/arm/plat-rk/rk_camera.c [changed mode: 0755->0644]
drivers/media/video/Kconfig [changed mode: 0755->0644]
drivers/media/video/ov2659.c [changed mode: 0755->0644]
drivers/media/video/ov5642.c [changed mode: 0755->0644]
drivers/media/video/rk30_camera.c [changed mode: 0755->0644]
drivers/media/video/rk30_camera_oneframe.c [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index 0bd00a5..b000ab7
 /*---------------- 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   1
-#define CONFIG_SENSOR_CIF_INDEX_0                    0
+#define CONFIG_SENSOR_IIC_ADAPTER_ID_0   4
+#define CONFIG_SENSOR_CIF_INDEX_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      INVALID_GPIO
+#define CONFIG_SENSOR_POWERDN_PIN_0      RK30_PIN1_PD6
 #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_1 RK29_CAM_SENSOR_OV2659                                         /* front camera sensor */
 #define CONFIG_SENSOR_IIC_ADDR_1               0x60
-#define CONFIG_SENSOR_IIC_ADAPTER_ID_1   1
-#define CONFIG_SENSOR_CIF_INDEX_1                                1
+#define CONFIG_SENSOR_IIC_ADAPTER_ID_1   3
+#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      INVALID_GPIO
+#define CONFIG_SENSOR_POWERDN_PIN_1      RK30_PIN1_PB7
 #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
 #define CONFIG_SENSOR_SVGA_FPS_FIXED_1         15000
 #define CONFIG_SENSOR_720P_FPS_FIXED_1         30000
 
-#define CONFIG_USE_CIF_0       1
-#define CONFIG_USE_CIF_1      1
 #endif //#ifdef CONFIG_VIDEO_RK29
 /*---------------- Camera Sensor Configuration Macro End------------------------*/
 #include "../../../drivers/media/video/rk30_camera.c"
 /*---------------- Camera Sensor Macro Define End  ---------*/
 
-//RK30,use  ion to allocate mem , set it as 0
-#define PMEM_CAM_SIZE          0//PMEM_CAM_NECESSARY
-#ifdef CONFIG_VIDEO_RK29_WORK_IPP
-#define MEM_CAMIPP_SIZE_CIF_0  PMEM_CAMIPP_NECESSARY_CIF_0
-#define MEM_CAMIPP_SIZE_CIF_1  PMEM_CAMIPP_NECESSARY_CIF_0
-#else
-#define MEM_CAMIPP_SIZE_CIF_0  0
-#define MEM_CAMIPP_SIZE_CIF_1  0
-
-#endif
+#define PMEM_CAM_SIZE PMEM_CAM_NECESSARY
 /*****************************************************************************************
  * camera  devices
  * author: ddl@rock-chips.com
@@ -174,6 +163,8 @@ static struct rk29camera_platform_ioctl_cb  sensor_ioctl_cb = {
        .sensor_flash_cb = NULL,
        #endif
 };
+
+#if CONFIG_SENSOR_IIC_ADDR_0
 static struct reginfo_t rk_init_data_sensor_reg_0[] =
 {
                {0x0000, 0x00,0,0}
@@ -181,19 +172,39 @@ static struct reginfo_t rk_init_data_sensor_reg_0[] =
 static struct reginfo_t rk_init_data_sensor_winseqreg_0[] ={
        {0x0000, 0x00,0,0}
        };
-static rk_sensor_user_init_data_s rk_init_data_sensor_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 = rk_init_data_sensor_reg_0,
-       .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_0,
-       .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
-       
+#endif
+
+#if CONFIG_SENSOR_IIC_ADDR_1
+static struct reginfo_t rk_init_data_sensor_reg_1[] =
+{
+    {0x0000, 0x00,0,0}
+};
+static struct reginfo_t rk_init_data_sensor_winseqreg_1[] =
+{
+       {0x0000, 0x00,0,0}
 };
-static rk_sensor_user_init_data_s* rk_init_data_sensor_0_p = NULL;
-static rk_sensor_user_init_data_s* rk_init_data_sensor_1_p = NULL;
+#endif
+static rk_sensor_user_init_data_s rk_init_data_sensor[RK_CAM_NUM] = 
+{
+    {
+       .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 = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
+    },{
+        .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 = sizeof(rk_init_data_sensor_winseqreg_1) / sizeof(struct reginfo_t),
+    }
+
+ };
 #include "../../../drivers/media/video/rk30_camera.c"
 
 #endif /* CONFIG_VIDEO_RK29 */
old mode 100755 (executable)
new mode 100644 (file)
index 625e6c0..b2bcd7e
     #endif\r
 #else\r
     #ifdef CONFIG_ARCH_RK30\r
-    #error "Camera driver memory configuration is alloc from pmem, but ARCH_RK30 isn't support"\r
+//    #error "Camera driver memory configuration is alloc from pmem, but ARCH_RK30 isn't support"\r
     #endif    \r
 #endif\r
 \r
@@ -963,11 +963,7 @@ static int rk_sensor_io_init(void)
        } else {\r
                is_init = true;\r
        }\r
-    printk("PMEM_CAM_NECESSARY:0x%x PMEM_CAMIPP_NECESSARY:0x%x"\r
-        "PMEM_CAM_NECESSARY_CIF_1:0x%x PMEM_CAMIPP_NECESSARY_CIF_1:0x%x"\r
-        "PMEM_CAM_NECESSARY_CIF_0:0x%x PMEM_CAMIPP_NECESSARY_CIF_0:0x%x",\r
-        PMEM_CAM_NECESSARY,PMEM_CAMIPP_NECESSARY,PMEM_CAM_NECESSARY_CIF_1,PMEM_CAMIPP_NECESSARY_CIF_1,\r
-        PMEM_CAM_NECESSARY_CIF_0,PMEM_CAMIPP_NECESSARY_CIF_0);\r
+    \r
     if (sensor_ioctl_cb.sensor_power_cb == NULL)\r
         sensor_ioctl_cb.sensor_power_cb = sensor_power_default_cb;\r
     if (sensor_ioctl_cb.sensor_reset_cb == NULL)\r
@@ -1279,7 +1275,7 @@ static int rk_sensor_powerdown(struct device *dev, int on)
        return rk_sensor_ioctrl(dev,Cam_PowerDown,on);\r
 }\r
 \r
-#ifdef PMEM_CAM_BASE\r
+#ifdef PMEM_CAM_NECESSARY\r
 static struct android_pmem_platform_data android_pmem_cam_pdata = {\r
        .name           = "pmem_cam",\r
        .start          = PMEM_CAM_BASE,\r
old mode 100755 (executable)
new mode 100644 (file)
index b3af156..59734e6
@@ -1203,7 +1203,7 @@ choice
        depends on VIDEO_RK29
        default VIDEO_RKCIF_WORK_SIMUL_OFF
        ---help---
-               where camera memory which is used for preview/raw/jpeg in android camera hal is alloced 
+               CIFs work simultaneity 
 config VIDEO_RKCIF_WORK_SIMUL_ON
        bool "Two cif controller can work sumultaneity"
 
old mode 100755 (executable)
new mode 100644 (file)
index b1830bb..0c6904f
@@ -19,8 +19,8 @@ o* Driver for MT9M001 CMOS Image Sensor from Micron
 #include <media/v4l2-common.h>
 #include <media/v4l2-chip-ident.h>
 #include <media/soc_camera.h>
-#include <mach/rk29_camera.h>
-
+#include <plat/rk_camera.h>
+#include <linux/vmalloc.h>
 static int debug;
 module_param(debug, int, S_IRUGO|S_IWUSR);
 
@@ -50,10 +50,11 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 #define SENSOR_MIN_HEIGHT   600
 #define SENSOR_MAX_WIDTH    1600
 #define SENSOR_MAX_HEIGHT   1200
-#define SENSOR_INIT_WIDTH      800                     /* Sensor pixel size for sensor_init_data array */
-#define SENSOR_INIT_HEIGHT  600
-#define SENSOR_INIT_WINSEQADR sensor_svga
-#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_YUYV8_2X8
+#define SENSOR_INIT_WIDTH      sensor_init_width                       /* Sensor pixel size for sensor_init_data array */
+#define SENSOR_INIT_HEIGHT     sensor_init_height
+#define SENSOR_INIT_WINSEQADR  sensor_init_winseq_p
+#define SENSOR_INIT_PIXFMT sensor_init_pixelcode
+#define SENSOR_BUS_PARAM  sensor_init_busparam
 
 #define CONFIG_SENSOR_WhiteBalance     1
 #define CONFIG_SENSOR_Brightness       0
@@ -1501,6 +1502,13 @@ static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd
 sensor_power_end:
        return ret;
 }
+static s32 sensor_init_width = 800;
+static s32 sensor_init_height = 600;
+static unsigned long sensor_init_busparam = (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ);
+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 int sensor_init(struct v4l2_subdev *sd, u32 val)
 {
     struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -1509,8 +1517,64 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
        const struct v4l2_queryctrl *qctrl;
     const struct sensor_datafmt *fmt;
     char value;
-    int ret,pid = 0;
-
+    int ret,pid = 0,i = 0,j=0;
+       //if val ==1,mean that sensor need to be reinit
+    struct rk29camera_platform_data* tmp_plat_data =(struct rk29camera_platform_data*)val;
+    sensor_init_data_p = sensor_init_data;
+       sensor_init_winseq_p = sensor_svga;
+       sensor_init_width = 800;
+       sensor_init_height = 600;
+   // return 0;
+       if (tmp_plat_data != NULL && (u32)tmp_plat_data != 1) { 
+               for(i = 0;i < RK_CAM_NUM;i++){
+                       if ((tmp_plat_data->sensor_init_data[i])&& tmp_plat_data->info[i].dev_name &&
+                               (strcmp(tmp_plat_data->info[i].dev_name, dev_name(icd->pdev)) == 0))
+                                       break;
+                       }
+               }
+       if(tmp_plat_data  && ((u32)tmp_plat_data != 1) &&(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;
+                               }
+                       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;
+       }
     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
 
        if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
@@ -1558,7 +1622,7 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
         goto sensor_INIT_ERR;
     }
 
-    ret = sensor_write_array(client, sensor_init_data);
+    ret = sensor_write_array(client, sensor_init_data_p);
     if (ret != 0)
     {
         SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());
@@ -2761,6 +2825,7 @@ static int sensor_video_probe(struct soc_camera_device *icd,
                return -ENODEV;
 
        if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
+        SENSOR_TR("power down %s failed\n",SENSOR_NAME_STRING());
                ret = -ENODEV;
                goto sensor_video_probe_err;
        }
@@ -2831,23 +2896,21 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
                {
                        sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;           
             if (sensor->sensor_io_request != NULL) { 
-                sensor->sensor_gpio_res = NULL;
-                for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {
-                    if (sensor->sensor_io_request->gpio_res[i].dev_name && 
-                        (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {
-                        sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];
-                    }
-                }
-                if (sensor->sensor_gpio_res == NULL) {
-                    SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);
-                    ret = -EINVAL;
-                    goto sensor_ioctl_end;
-                }
-            } else {
-                SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
-                ret = -EINVAL;
-                goto sensor_ioctl_end;
-            }
+                       int j = 0;
+                       for(j = 0;j < RK_CAM_NUM;j++){
+                       if (sensor->sensor_io_request->gpio_res[j].dev_name && 
+                           (strcmp(sensor->sensor_io_request->gpio_res[j].dev_name, dev_name(icd->pdev)) == 0)) {
+                           sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[j];
+                               break;
+                         } 
+                       }
+                       if(j == RK_CAM_NUM){
+                               SENSOR_TR("%s %s RK_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
+                               ret = -EINVAL;
+                               goto sensor_ioctl_end;
+                               }
+               }
+                       
             /* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control 
                for this project */
             #if CONFIG_SENSOR_Flash    
old mode 100755 (executable)
new mode 100644 (file)
index c238e39..961b837
@@ -19,7 +19,8 @@
 #include <media/v4l2-common.h>
 #include <media/v4l2-chip-ident.h>
 #include <media/soc_camera.h>
-#include <mach/rk29_camera.h>
+#include <plat/rk_camera.h>
+#include <linux/vmalloc.h>
 #include "ov5642.h"
 
 static int debug;
@@ -50,10 +51,11 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 #define SENSOR_MIN_HEIGHT   144
 #define SENSOR_MAX_WIDTH    2592
 #define SENSOR_MAX_HEIGHT   1944
-#define SENSOR_INIT_WIDTH      800                     /* Sensor pixel size for sensor_init_data array */
-#define SENSOR_INIT_HEIGHT  600
-#define SENSOR_INIT_WINSEQADR sensor_svga
-#define SENSOR_INIT_PIXFMT V4L2_MBUS_FMT_UYVY8_2X8
+#define SENSOR_INIT_WIDTH      sensor_init_width                       /* Sensor pixel size for sensor_init_data array */
+#define SENSOR_INIT_HEIGHT     sensor_init_height
+#define SENSOR_INIT_WINSEQADR  sensor_init_winseq_p
+#define SENSOR_INIT_PIXFMT sensor_init_pixelcode
+#define SENSOR_BUS_PARAM  sensor_init_busparam
 
 #define CONFIG_SENSOR_WhiteBalance     1
 #define CONFIG_SENSOR_Brightness       0
@@ -78,11 +80,6 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 #define CONFIG_SENSOR_I2C_NOSCHED   0
 #define CONFIG_SENSOR_I2C_RDWRCHK   0
 
-
-#define SENSOR_BUS_PARAM  (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING |\
-                          SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |\
-                          SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ)
-
 #define COLOR_TEMPERATURE_CLOUDY_DN  6500
 #define COLOR_TEMPERATURE_CLOUDY_UP    8000
 #define COLOR_TEMPERATURE_CLEARDAY_DN  5000
@@ -4248,6 +4245,14 @@ static int sensor_ioctrl(struct soc_camera_device *icd,enum rk29sensor_power_cmd
 sensor_power_end:
        return ret;
 }
+
+static s32 sensor_init_width = 800;
+static s32 sensor_init_height = 600;
+static unsigned long sensor_init_busparam = (SOCAM_MASTER | SOCAM_PCLK_SAMPLE_RISING|SOCAM_HSYNC_ACTIVE_HIGH | SOCAM_VSYNC_ACTIVE_LOW |SOCAM_DATA_ACTIVE_HIGH | SOCAM_DATAWIDTH_8  |SOCAM_MCLK_24MHZ);
+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 int sensor_init(struct v4l2_subdev *sd, u32 val)
 {
     struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -4256,8 +4261,62 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
        const struct v4l2_queryctrl *qctrl;
     const struct sensor_datafmt *fmt;
     char value;
-    int ret,pid = 0;
-
+    int ret,pid = 0,i = 0,j=0;
+    struct rk29camera_platform_data* tmp_plat_data =(struct rk29camera_platform_data*)val;
+    sensor_init_data_p = sensor_init_data;
+       sensor_init_winseq_p = sensor_svga;
+       sensor_init_width = 800;
+       sensor_init_height = 600;
+       if (tmp_plat_data != NULL) { 
+               for(i = 0;i < RK_CAM_NUM;i++){
+                       if ((tmp_plat_data->sensor_init_data[i])&& tmp_plat_data->info[i].dev_name &&
+                               (strcmp(tmp_plat_data->info[i].dev_name, dev_name(icd->pdev)) == 0))
+                                       break;
+                       }
+               }
+       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;
+                               }
+                       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;
+       }
     SENSOR_DG("\n%s..%s.. \n",SENSOR_NAME_STRING(),__FUNCTION__);
 
        if (sensor_ioctrl(icd, Sensor_PowerDown, 0) < 0) {
@@ -4304,7 +4363,7 @@ static int sensor_init(struct v4l2_subdev *sd, u32 val)
         goto sensor_INIT_ERR;
     }
 
-    ret = sensor_write_array(client, sensor_init_data);
+    ret = sensor_write_array(client, sensor_init_data_p);
     if (ret != 0) {
         SENSOR_TR("error: %s initial failed\n",SENSOR_NAME_STRING());
         goto sensor_INIT_ERR;
@@ -5779,26 +5838,24 @@ static long sensor_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
                        break;
                }
                case RK29_CAM_SUBDEV_IOREQUEST:
-               {           
-            sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;           
+               {
+                       sensor->sensor_io_request = (struct rk29camera_platform_data*)arg;    
+            
             if (sensor->sensor_io_request != NULL) { 
-                sensor->sensor_gpio_res = NULL;
-                for (i=0; i<RK29_CAM_SUPPORT_NUMS;i++) {
-                    if (sensor->sensor_io_request->gpio_res[i].dev_name && 
-                        (strcmp(sensor->sensor_io_request->gpio_res[i].dev_name, dev_name(icd->pdev)) == 0)) {
-                        sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[i];
-                    }
-                }
-                if (sensor->sensor_gpio_res == NULL) {
-                    SENSOR_TR("%s %s obtain gpio resource failed when RK29_CAM_SUBDEV_IOREQUEST \n",SENSOR_NAME_STRING(),__FUNCTION__);
-                    ret = -EINVAL;
-                    goto sensor_ioctl_end;
-                }
-            } else {
-                SENSOR_TR("%s %s RK29_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
-                ret = -EINVAL;
-                goto sensor_ioctl_end;
-            }
+                       int j = 0;
+                       for(j = 0;j < RK_CAM_NUM;j++){
+                                       if (sensor->sensor_io_request->gpio_res[j].dev_name && 
+                                               (strcmp(sensor->sensor_io_request->gpio_res[j].dev_name, dev_name(icd->pdev)) == 0)) {
+                                               sensor->sensor_gpio_res = (struct rk29camera_gpio_res*)&sensor->sensor_io_request->gpio_res[j];
+                                               break;
+                                         } 
+                       }
+                       if(j == RK_CAM_NUM){
+                               SENSOR_TR("%s %s RK_CAM_SUBDEV_IOREQUEST fail\n",SENSOR_NAME_STRING(),__FUNCTION__);
+                               ret = -EINVAL;
+                               goto sensor_ioctl_end;
+                               }
+            } 
             
             /* ddl@rock-chips.com : if gpio_flash havn't been set in board-xxx.c, sensor driver must notify is not support flash control 
                for this project */
old mode 100755 (executable)
new mode 100644 (file)
index 1ef40b8..c594c7b
@@ -2,7 +2,7 @@
 #include <mach/iomux.h>\r
 #include <media/soc_camera.h>\r
 #include <linux/android_pmem.h>\r
-\r
+#include <mach/rk30_camera.h>\r
 #ifndef PMEM_CAM_SIZE\r
 #include "../../../arch/arm/plat-rk/rk_camera.c"\r
 #else\r
@@ -848,7 +848,7 @@ static int rk_sensor_iomux(int pin)
     }\r
     return 0;\r
 }\r
-\r
+#define PMEM_CAM_BASE 0 //just for compile ,no meaning\r
 #include "../../../arch/arm/plat-rk/rk_camera.c"\r
 \r
 \r
@@ -939,7 +939,12 @@ static void rk30_camera_request_reserve_mem(void)
         rk_camera_platform_data.meminfo_cif1.start =board_mem_reserve_add("camera_ipp_mem_1",PMEM_CAMIPP_NECESSARY_CIF_1);\r
         rk_camera_platform_data.meminfo_cif1.size= PMEM_CAMIPP_NECESSARY_CIF_1;\r
     #endif\r
-#endif\r
+ #endif\r
+ #if PMEM_CAM_NECESSARY\r
+        android_pmem_cam_pdata.start = board_mem_reserve_add((char*)(android_pmem_cam_pdata.name),PMEM_CAM_NECESSARY);\r
+        android_pmem_cam_pdata.size= PMEM_CAM_NECESSARY;\r
+ #endif\r
+\r
 }\r
 static int rk_register_camera_devices(void)\r
 {\r
@@ -971,6 +976,10 @@ static int rk_register_camera_devices(void)
             platform_device_register(&rk_camera_platform_data.register_dev[i].device_info);\r
         }\r
     }\r
+ #if PMEM_CAM_NECESSARY\r
+            platform_device_register(&android_pmem_cam_device);\r
+ #endif\r
+    \r
        return 0;\r
 }\r
 \r
old mode 100755 (executable)
new mode 100644 (file)
index f95f530..dfeca38
@@ -29,7 +29,6 @@
 #include <linux/platform_device.h>
 #include <linux/mutex.h>
 #include <linux/videodev2.h>
-#include <plat/rk_camera.h>
 #include <mach/iomux.h>
 #include <media/v4l2-common.h>
 #include <media/v4l2-dev.h>
@@ -38,7 +37,7 @@
 #include <media/soc_mediabus.h>
 #include <mach/io.h>
 #include <plat/ipp.h>
-
+#include <mach/rk30_camera.h>
 
 static int debug;
 module_param(debug, int, S_IRUGO|S_IWUSR);
@@ -147,7 +146,7 @@ module_param(debug, int, S_IRUGO|S_IWUSR);
 
 #define MIN(x,y)   ((x<y) ? x: y)
 #define MAX(x,y)    ((x>y) ? x: y)
-#define RK_SENSOR_24MHZ      24           /* MHz */
+#define RK_SENSOR_24MHZ      24*1000*1000          /* MHz */
 #define RK_SENSOR_48MHZ      48
 
 #define write_cif_reg(base,addr, val)  __raw_writel(val, addr+(base))
@@ -268,20 +267,10 @@ struct rk_camera_dev
        struct soc_camera_device *icd;
 
        //************must modify start************/
-       struct clk *aclk_ddr_lcdc;
-       struct clk *aclk_disp_matrix;
-
-       struct clk *hclk_cpu_display;
-       struct clk *vip_slave;
-
-       struct clk *vip_out;
-       struct clk *vip_input;
-       struct clk *vip_bus;
-
-       struct clk *hclk_disp_matrix;
-       struct clk *vip_matrix;
-
-       struct clk *pd_display;
+       struct clk *aclk_cif;
+    struct clk *hclk_cif;
+    struct clk *cif_clk_in;
+    struct clk *cif_clk_out;
        //************must modify end************/
        void __iomem *base;
        int frame_inval;           /* ddl@rock-chips.com : The first frames is invalidate  */
@@ -759,64 +748,24 @@ static void rk_camera_init_videobuf(struct videobuf_queue *q,
 }
 static int rk_camera_activate(struct rk_camera_dev *pcdev, struct soc_camera_device *icd)
 {
-    unsigned long sensor_bus_flags = SOCAM_MCLK_24MHZ;
-    struct clk *parent;
-
-    RKCAMERA_TR("%s..%d.. \n",__FUNCTION__,__LINE__);
-       #if 0
-    if (!pcdev->aclk_ddr_lcdc || !pcdev->aclk_disp_matrix ||  !pcdev->hclk_cpu_display ||
-               !pcdev->vip_slave || !pcdev->vip_out || !pcdev->vip_input || !pcdev->vip_bus || !pcdev->pd_display ||
-               IS_ERR(pcdev->aclk_ddr_lcdc) || IS_ERR(pcdev->aclk_disp_matrix) ||  IS_ERR(pcdev->hclk_cpu_display) || IS_ERR(pcdev->pd_display) ||
-               IS_ERR(pcdev->vip_slave) || IS_ERR(pcdev->vip_out) || IS_ERR(pcdev->vip_input) || IS_ERR(pcdev->vip_bus))  {
-
-        RKCAMERA_TR(KERN_ERR "failed to get vip_clk(axi) source\n");
-        goto RK_CAMERA_ACTIVE_ERR;
-    }
-       RKCAMERA_TR("%s..%d.. \n",__FUNCTION__,__LINE__);
-       if (!pcdev->hclk_disp_matrix || !pcdev->vip_matrix ||
-               IS_ERR(pcdev->hclk_disp_matrix) || IS_ERR(pcdev->vip_matrix))  {
-
-        RKCAMERA_TR(KERN_ERR "failed to get vip_clk(ahb) source\n");
+    int err = 0;
+    if(!pcdev->aclk_cif || !pcdev->hclk_cif || !pcdev->cif_clk_in || !pcdev->cif_clk_out){
+        RKCAMERA_TR(KERN_ERR "failed to get cif clock source\n");
+        err = -ENOENT;
         goto RK_CAMERA_ACTIVE_ERR;
-    }
-       clk_enable(pcdev->pd_display);
-
-       clk_enable(pcdev->aclk_ddr_lcdc);
-       clk_enable(pcdev->aclk_disp_matrix);
-
-       clk_enable(pcdev->hclk_cpu_display);
-       clk_enable(pcdev->vip_slave);
-       RK29CAMERA_TR("%s..%d.. \n",__FUNCTION__,__LINE__);
+        }
+       clk_enable(pcdev->aclk_cif);
 
-       clk_enable(pcdev->vip_input);
-       clk_enable(pcdev->vip_bus);
+       clk_enable(pcdev->hclk_cif);
+       clk_enable(pcdev->cif_clk_in);
 
     //if (icd->ops->query_bus_param)                                                  /* ddl@rock-chips.com : Query Sensor's xclk */
         //sensor_bus_flags = icd->ops->query_bus_param(icd);
 
-    if (sensor_bus_flags & SOCAM_MCLK_48MHZ) {
-        parent = clk_get(NULL, "clk48m");
-        if (!parent || IS_ERR(parent))
-             goto RK_CAMERA_ACTIVE_ERR;
-    } else if (sensor_bus_flags & SOCAM_MCLK_27MHZ) {
-        parent = clk_get(NULL, "extclk");
-        if (!parent || IS_ERR(parent))
-             goto RK_CAMERA_ACTIVE_ERR;
-    } else {
-        parent = clk_get(NULL, "xin24m");
-        if (!parent || IS_ERR(parent))
-             goto RK_CAMERA_ACTIVE_ERR;
-    }
-    clk_set_parent(pcdev->vip_out, parent);
-
-    clk_enable(pcdev->vip_out);
-   // rk30_mux_api_set(GPIO1B4_VIPCLKOUT_NAME, GPIO1L_VIP_CLKOUT);
-    ndelay(10);
+       clk_enable(pcdev->cif_clk_out);
+    clk_set_rate(pcdev->cif_clk_out,RK_SENSOR_24MHZ);
 
        ndelay(10);
-//    write_vip_reg(pcdev->base,RK29_VIP_RESET, 0x76543210);  /* ddl@rock-chips.com : vip software reset */
-//    udelay(10);
-#endif
     write_cif_reg(pcdev->base,CIF_CIF_CTRL,AXI_BURST_16|MODE_ONEFRAME|DISABLE_CAPTURE);   /* ddl@rock-chips.com : vip ahb burst 16 */
     write_cif_reg(pcdev->base,CIF_CIF_INTEN, 0x01);    //capture complete interrupt enable
    RKCAMERA_TR("%s..%d.. CIF_CIF_CTRL = 0x%x\n",__FUNCTION__,__LINE__,read_cif_reg(pcdev->base, CIF_CIF_CTRL));
@@ -828,25 +777,11 @@ RK_CAMERA_ACTIVE_ERR:
 static void rk_camera_deactivate(struct rk_camera_dev *pcdev)
 {
     //pcdev->active = NULL;
-#if 0
-    write_cif_reg(pcdev->base,CIF_CIF_CTRL, 0);
-    read_cif_reg(pcdev->base,CIF_CIF_INTSTAT);             //clear vip interrupte single
-
-//    rk29_mux_api_set(GPIO1B4_VIPCLKOUT_NAME, GPIO1L_GPIO1B4);
-    clk_disable(pcdev->vip_out);
+       clk_disable(pcdev->aclk_cif);
 
-       clk_disable(pcdev->vip_input);
-       clk_disable(pcdev->vip_bus);
-
-
-       clk_disable(pcdev->hclk_cpu_display);
-       clk_disable(pcdev->vip_slave);
-
-       clk_disable(pcdev->aclk_ddr_lcdc);
-       clk_disable(pcdev->aclk_disp_matrix);
-
-       clk_disable(pcdev->pd_display);
-       #endif
+       clk_disable(pcdev->hclk_cif);
+       clk_disable(pcdev->cif_clk_in);
+       clk_disable(pcdev->cif_clk_out);
     return;
 }
 
@@ -1426,8 +1361,8 @@ static int rk_camera_set_fmt(struct soc_camera_device *icd,
                if (CAM_IPPWORK_IS_EN()) {
                        BUG_ON(pcdev->vipmem_phybase == 0);
                }
-        pix->width = mf.width;
-       pix->height = mf.height;
+        pix->width = usr_w;
+       pix->height = usr_h;
        pix->field = mf.field;
        pix->colorspace = mf.colorspace;
        icd->current_fmt = xlate;        
@@ -1719,22 +1654,22 @@ static void rk_camera_reinit_work(struct work_struct *work)
        struct rk_camera_dev *pcdev = camera_work->pcdev;
        //dump regs
        {
-               RKCAMERA_TR("CIF_CIF_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
-               RKCAMERA_TR("CIF_CIF_INTEN = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
-               RKCAMERA_TR("CIF_CIF_INTSTAT = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
-               RKCAMERA_TR("CIF_CIF_FOR = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
-               RKCAMERA_TR("CIF_CIF_CROP = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
-               RKCAMERA_TR("CIF_CIF_SET_SIZE = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
-               RKCAMERA_TR("CIF_CIF_SCL_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
-               RKCAMERA_TR("CRU_PCLK_REG30 = 0X%x\n",read_cru_reg(CRU_PCLK_REG30));
-               RKCAMERA_TR("CIF_CIF_LAST_LINE = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
+               RKCAMERA_DG("CIF_CIF_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CTRL));
+               RKCAMERA_DG("CIF_CIF_INTEN = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTEN));
+               RKCAMERA_DG("CIF_CIF_INTSTAT = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_INTSTAT));
+               RKCAMERA_DG("CIF_CIF_FOR = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_FOR));
+               RKCAMERA_DG("CIF_CIF_CROP = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_CROP));
+               RKCAMERA_DG("CIF_CIF_SET_SIZE = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SET_SIZE));
+               RKCAMERA_DG("CIF_CIF_SCL_CTRL = 0x%x\n",read_cif_reg(pcdev->base,CIF_CIF_SCL_CTRL));
+               RKCAMERA_DG("CRU_PCLK_REG30 = 0X%x\n",read_cru_reg(CRU_PCLK_REG30));
+               RKCAMERA_DG("CIF_CIF_LAST_LINE = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_LINE));
                
-               RKCAMERA_TR("CIF_CIF_LAST_PIX = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
-               RKCAMERA_TR("CIF_CIF_VIR_LINE_WIDTH = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
-       RKCAMERA_TR("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
-       RKCAMERA_TR("CIF_CIF_FRM0_ADDR_Y = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
-       RKCAMERA_TR("CIF_CIF_FRM0_ADDR_UV = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
-       RKCAMERA_TR("CIF_CIF_FRAME_STATUS = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
+               RKCAMERA_DG("CIF_CIF_LAST_PIX = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LAST_PIX));
+               RKCAMERA_DG("CIF_CIF_VIR_LINE_WIDTH = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_VIR_LINE_WIDTH));
+       RKCAMERA_DG("CIF_CIF_LINE_NUM_ADDR = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_LINE_NUM_ADDR));
+       RKCAMERA_DG("CIF_CIF_FRM0_ADDR_Y = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_Y));
+       RKCAMERA_DG("CIF_CIF_FRM0_ADDR_UV = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRM0_ADDR_UV));
+       RKCAMERA_DG("CIF_CIF_FRAME_STATUS = 0X%x\n",read_cif_reg(pcdev->base,CIF_CIF_FRAME_STATUS));
        }
        write_cif_reg(pcdev->base,CIF_CIF_CTRL, (read_cif_reg(pcdev->base,CIF_CIF_CTRL)&(~ENABLE_CAPTURE)));
 
@@ -2084,47 +2019,38 @@ static int rk_camera_probe(struct platform_device *pdev)
         goto exit_alloc;
     }
 
-
-    /*config output clk*/ // must modify start
-    #if 0
-       pcdev->aclk_ddr_lcdc = clk_get(&pdev->dev, "aclk_ddr_lcdc");
-       pcdev->aclk_disp_matrix = clk_get(&pdev->dev, "aclk_disp_matrix");
-
-       pcdev->hclk_cpu_display = clk_get(&pdev->dev, "hclk_cpu_display");
-       pcdev->vip_slave = clk_get(&pdev->dev, "vip_slave");
-       pcdev->vip_out = clk_get(&pdev->dev,"vip_out");
-       pcdev->vip_input = clk_get(&pdev->dev,"vip_input");
-       pcdev->vip_bus = clk_get(&pdev->dev, "vip_bus");
-
-       pcdev->hclk_disp_matrix = clk_get(&pdev->dev,"hclk_disp_matrix");
-       pcdev->vip_matrix = clk_get(&pdev->dev,"vip_matrix");
-
-       pcdev->pd_display = clk_get(&pdev->dev,"pd_display");
-
        pcdev->zoominfo.zoom_rate = 100;
-
-    if (!pcdev->aclk_ddr_lcdc || !pcdev->aclk_disp_matrix ||  !pcdev->hclk_cpu_display ||
-               !pcdev->vip_slave || !pcdev->vip_out || !pcdev->vip_input || !pcdev->vip_bus || !pcdev->pd_display ||
-               IS_ERR(pcdev->aclk_ddr_lcdc) || IS_ERR(pcdev->aclk_disp_matrix) ||  IS_ERR(pcdev->hclk_cpu_display) || IS_ERR(pcdev->pd_display) ||
-               IS_ERR(pcdev->vip_slave) || IS_ERR(pcdev->vip_out) || IS_ERR(pcdev->vip_input) || IS_ERR(pcdev->vip_bus))  {
-//must modify end
-        RKCAMERA_TR(KERN_ERR "failed to get vip_clk(axi) source\n");
-        err = -ENOENT;
-        goto exit_reqmem_vip;
-    }
-
-       if (!pcdev->hclk_disp_matrix || !pcdev->vip_matrix ||
-               IS_ERR(pcdev->hclk_disp_matrix) || IS_ERR(pcdev->vip_matrix))  {
-
-        RKCAMERA_TR(KERN_ERR "failed to get vip_clk(ahb) source\n");
+       pcdev->hostid = pdev->id;
+    /*config output clk*/ // must modify start
+    if(IS_CIF0()){
+     //   printk("it is cif 0!!!!!!!1\n");
+        pcdev->aclk_cif = clk_get(NULL, "aclk_cif0");
+        pcdev->hclk_cif = clk_get(NULL, "hclk_cif0");
+        pcdev->cif_clk_in = clk_get(NULL, "cif0_in");
+        pcdev->cif_clk_out = clk_get(NULL, "cif0_out");
+        rk30_mux_api_set(GPIO1B3_CIF0CLKOUT_NAME, GPIO1B_CIF0_CLKOUT);
+        }
+    else{
+    //    printk("it is cif 1!!!!!!!1\n");
+        pcdev->aclk_cif = clk_get(NULL, "aclk_cif1");
+        pcdev->hclk_cif = clk_get(NULL, "hclk_cif1");
+        pcdev->cif_clk_in = clk_get(NULL, "cif1_in");
+        pcdev->cif_clk_out = clk_get(NULL, "cif1_out");
+        rk30_mux_api_set(GPIO1D7_CIF1CLKOUT_NAME,GPIO1D_CIF1_CLKOUT);
+        rk30_mux_api_set(GPIO1D2_CIF1CLKIN_NAME,GPIO1D_CIF1_CLKIN);
+        rk30_mux_api_set(GPIO1D1_CIF1HREF_MIIMDCLK_NAME,GPIO1D_CIF1_HREF);
+        rk30_mux_api_set(GPIO1D0_CIF1VSYNC_MIIMD_NAME,GPIO1D_CIF1_VSYNC);
+        rk30_mux_api_set(GPIO1C0_CIF1DATA2_RMIICLKOUT_RMIICLKIN_NAME,GPIO1C_CIF1_DATA2);
+        rk30_mux_api_set(GPIO1C2_CIF1DATA4_RMIITXD1_NAME,GPIO1C_CIF1_DATA4);
+        }
+    if(!pcdev->aclk_cif || !pcdev->hclk_cif || !pcdev->cif_clk_in || !pcdev->cif_clk_out){
+        RKCAMERA_TR(KERN_ERR "failed to get cif clock source\n");
         err = -ENOENT;
         goto exit_reqmem_vip;
-    }
-#endif
+        }
     dev_set_drvdata(&pdev->dev, pcdev);
     pcdev->res = res;
     pcdev->pdata = pdev->dev.platform_data;             /* ddl@rock-chips.com : Request IO in init function */
-       pcdev->hostid = pdev->id;
 
        if (pcdev->pdata && pcdev->pdata->io_init) {
         pcdev->pdata->io_init();
@@ -2231,42 +2157,15 @@ exit_ioremap_vip:
     release_mem_region(res->start, res->end - res->start + 1);
 
 exit_reqmem_vip:
-    if (pcdev->aclk_ddr_lcdc) {
-               clk_put(pcdev->aclk_ddr_lcdc);
-               pcdev->aclk_ddr_lcdc = NULL;
-    }
-       if (pcdev->aclk_disp_matrix) {
-               clk_put(pcdev->aclk_disp_matrix);
-               pcdev->aclk_disp_matrix = NULL;
-    }
-       if (pcdev->hclk_cpu_display) {
-               clk_put(pcdev->hclk_cpu_display);
-               pcdev->hclk_cpu_display = NULL;
-    }
-       if (pcdev->vip_slave) {
-               clk_put(pcdev->vip_slave);
-               pcdev->vip_slave = NULL;
-    }
-       if (pcdev->vip_out) {
-               clk_put(pcdev->vip_out);
-               pcdev->vip_out = NULL;
-    }
-       if (pcdev->vip_input) {
-               clk_put(pcdev->vip_input);
-               pcdev->vip_input = NULL;
-    }
-       if (pcdev->vip_bus) {
-               clk_put(pcdev->vip_bus);
-               pcdev->vip_bus = NULL;
-    }
-    if (pcdev->hclk_disp_matrix) {
-               clk_put(pcdev->hclk_disp_matrix);
-               pcdev->hclk_disp_matrix = NULL;
-    }
-       if (pcdev->vip_matrix) {
-               clk_put(pcdev->vip_matrix);
-               pcdev->vip_matrix = NULL;
-    }
+    if(pcdev->aclk_cif)
+        pcdev->aclk_cif = NULL;
+    if(pcdev->hclk_cif)
+        pcdev->hclk_cif = NULL;
+    if(pcdev->cif_clk_in)
+        pcdev->cif_clk_in = NULL;
+    if(pcdev->cif_clk_out)
+        pcdev->cif_clk_out = NULL;
+
     kfree(pcdev);
 exit_alloc:
 //    rk_camdev_info_ptr = NULL;
@@ -2303,7 +2202,8 @@ static int __devexit rk_camera_remove(struct platform_device *pdev)
     res = pcdev->res;
     release_mem_region(res->start, res->end - res->start + 1);
     if (pcdev->pdata && pcdev->pdata->io_deinit) {         /* ddl@rock-chips.com : Free IO in deinit function */
-        pcdev->pdata->io_deinit(pcdev->hostid);
+        pcdev->pdata->io_deinit(0);
+        pcdev->pdata->io_deinit(1);
     }
 
     kfree(pcdev);