camsys_drv : v0.9.0
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / rk29_camera.c
index e8c4898f4f94a216846597881488c83658f3c051..e8cf5d2ecca1bdca7ae26a55c04b441ee18768b3 100755 (executable)
 #include <mach/rk29_camera.h> \r
 #include <mach/iomux.h>\r
-#ifndef PMEM_CAM_SIZE\r
-#ifdef CONFIG_VIDEO_RK29 \r
-/*---------------- Camera Sensor Fixed Macro Begin  ------------------------*/\r
-// Below Macro is fixed, programer don't change it!!!!!!\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
-#if (CONFIG_SENSOR_IIC_ADDR_0 != 0x00)\r
-#define PMEM_SENSOR_FULL_RESOLUTION_0  CONS(CONFIG_SENSOR_0,_FULL_RESOLUTION)\r
-#if !(PMEM_SENSOR_FULL_RESOLUTION_0)\r
-#undef PMEM_SENSOR_FULL_RESOLUTION_0\r
-#define PMEM_SENSOR_FULL_RESOLUTION_0  0x500000\r
-#endif\r
-#else\r
-#define PMEM_SENSOR_FULL_RESOLUTION_0  0x00\r
-#endif\r
\r
-#if (CONFIG_SENSOR_IIC_ADDR_1 != 0x00)\r
-#define PMEM_SENSOR_FULL_RESOLUTION_1  CONS(CONFIG_SENSOR_1,_FULL_RESOLUTION)\r
-#if !(PMEM_SENSOR_FULL_RESOLUTION_1)\r
-#undef PMEM_SENSOR_FULL_RESOLUTION_1\r
-#define PMEM_SENSOR_FULL_RESOLUTION_1  0x500000\r
-#endif\r
-#else\r
-#define PMEM_SENSOR_FULL_RESOLUTION_1  0x00\r
-#endif\r
 \r
-#if (PMEM_SENSOR_FULL_RESOLUTION_0 > PMEM_SENSOR_FULL_RESOLUTION_1)\r
-#define PMEM_CAM_FULL_RESOLUTION   PMEM_SENSOR_FULL_RESOLUTION_0\r
-#else\r
-#define PMEM_CAM_FULL_RESOLUTION   PMEM_SENSOR_FULL_RESOLUTION_1\r
-#endif\r
-\r
-#if (PMEM_CAM_FULL_RESOLUTION == 0x500000)\r
-#define PMEM_CAM_NECESSARY   0x1400000       /* 1280*720*1.5*4(preview) + 7.5M(capture raw) + 4M(jpeg encode output) */\r
-#define PMEM_CAMIPP_NECESSARY    0x800000\r
-#elif (PMEM_CAM_FULL_RESOLUTION == 0x300000)\r
-#define PMEM_CAM_NECESSARY   0xe00000        /* 1280*720*1.5*4(preview) + 4.5M(capture raw) + 3M(jpeg encode output) */\r
-#define PMEM_CAMIPP_NECESSARY    0x500000\r
-#elif (PMEM_CAM_FULL_RESOLUTION == 0x200000) /* 1280*720*1.5*4(preview) + 3M(capture raw) + 3M(jpeg encode output) */\r
-#define PMEM_CAM_NECESSARY   0xc00000\r
-#define PMEM_CAMIPP_NECESSARY    0x400000\r
-#elif ((PMEM_CAM_FULL_RESOLUTION == 0x100000) || (PMEM_CAM_FULL_RESOLUTION == 0x130000))\r
-#define PMEM_CAM_NECESSARY   0x800000        /* 800*600*1.5*4(preview) + 2M(capture raw) + 2M(jpeg encode output) */\r
-#define PMEM_CAMIPP_NECESSARY    0x400000\r
-#elif (PMEM_CAM_FULL_RESOLUTION == 0x30000)\r
-#define PMEM_CAM_NECESSARY   0x400000        /* 640*480*1.5*4(preview) + 1M(capture raw) + 1M(jpeg encode output) */\r
-#define PMEM_CAMIPP_NECESSARY    0x400000\r
+#ifndef PMEM_CAM_SIZE\r
+#include "../../../arch/arm/plat-rk/rk_camera.c"\r
 #else\r
-#define PMEM_CAM_NECESSARY   0x1200000\r
-#define PMEM_CAMIPP_NECESSARY    0x800000\r
-#endif\r
-/*---------------- Camera Sensor Fixed Macro End  ------------------------*/\r
-#else   //#ifdef CONFIG_VIDEO_RK29 \r
-#define PMEM_CAM_NECESSARY   0x00000000\r
-#endif\r
-#else   // #ifdef PMEM_CAM_SIZE\r
 \r
 /*****************************************************************************************\r
  * camera  devices\r
  * author: ddl@rock-chips.com\r
  *****************************************************************************************/\r
 #ifdef CONFIG_VIDEO_RK29 \r
-static int camera_debug;\r
-module_param(camera_debug, int, S_IRUGO|S_IWUSR);\r
-\r
-#define ddprintk(level, fmt, arg...) do {                      \\r
-       if (camera_debug >= level)                                      \\r
-           printk(KERN_WARNING"rk29_cam_io: " fmt , ## arg); } while (0)\r
-\r
-#define dprintk(format, ...) ddprintk(1, format, ## __VA_ARGS__)    \r
-\r
-#define SENSOR_NAME_0 STR(CONFIG_SENSOR_0)                     /* back camera sensor */\r
-#define SENSOR_NAME_1 STR(CONFIG_SENSOR_1)                     /* front camera sensor */\r
-#define SENSOR_DEVICE_NAME_0  STR(CONS(CONFIG_SENSOR_0, _back))\r
-#define SENSOR_DEVICE_NAME_1  STR(CONS(CONFIG_SENSOR_1, _front))\r
-\r
-static int rk29_sensor_io_init(void);\r
-static int rk29_sensor_io_deinit(int sensor);\r
-static int rk29_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd,int on);\r
-\r
-static struct rk29camera_platform_data rk29_camera_platform_data = {\r
-    .io_init = rk29_sensor_io_init,\r
-    .io_deinit = rk29_sensor_io_deinit,\r
-    .sensor_ioctrl = rk29_sensor_ioctrl,\r
-    .gpio_res = {\r
-        {\r
-            .gpio_reset = CONFIG_SENSOR_RESET_PIN_0,\r
-            .gpio_power = CONFIG_SENSOR_POWER_PIN_0,\r
-            .gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_0,\r
-            .gpio_flash = CONFIG_SENSOR_FALSH_PIN_0,\r
-            .gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_0|CONFIG_SENSOR_RESETACTIVE_LEVEL_0|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0|CONFIG_SENSOR_FLASHACTIVE_LEVEL_0),\r
-            .gpio_init = 0,            \r
-            .dev_name = SENSOR_DEVICE_NAME_0,\r
-        }, {\r
-            .gpio_reset = CONFIG_SENSOR_RESET_PIN_1,\r
-            .gpio_power = CONFIG_SENSOR_POWER_PIN_1,\r
-            .gpio_powerdown = CONFIG_SENSOR_POWERDN_PIN_1,\r
-            .gpio_flash = CONFIG_SENSOR_FALSH_PIN_1,\r
-            .gpio_flag = (CONFIG_SENSOR_POWERACTIVE_LEVEL_1|CONFIG_SENSOR_RESETACTIVE_LEVEL_1|CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1|CONFIG_SENSOR_FLASHACTIVE_LEVEL_1),\r
-            .gpio_init = 0,\r
-            .dev_name = SENSOR_DEVICE_NAME_1,\r
-        }\r
-    },\r
-       #ifdef CONFIG_VIDEO_RK29_WORK_IPP\r
-       .meminfo = {\r
-           .name  = "camera_ipp_mem",\r
-               .start = MEM_CAMIPP_BASE,\r
-               .size   = MEM_CAMIPP_SIZE,\r
-       },\r
-       #endif\r
-    .info = {\r
-        {\r
-            .dev_name = SENSOR_DEVICE_NAME_0,\r
-            .orientation = CONFIG_SENSOR_ORIENTATION_0, \r
-           },{\r
-            .dev_name = SENSOR_DEVICE_NAME_1,\r
-            .orientation = CONFIG_SENSOR_ORIENTATION_1,\r
-        }\r
-       }\r
-};\r
-\r
-static int rk29_sensor_iomux(int pin)\r
+static int rk_sensor_iomux(int pin)\r
 {    \r
     switch (pin)\r
     {\r
@@ -1090,549 +974,8 @@ static int rk29_sensor_iomux(int pin)
     }\r
     return 0;\r
 }\r
+#include "../../../arch/arm/plat-rk/rk_camera.c"\r
 \r
-static int sensor_power_default_cb (struct rk29camera_gpio_res *res, int on)\r
-{\r
-    int camera_power = res->gpio_power;\r
-    int camera_ioflag = res->gpio_flag;\r
-    int camera_io_init = res->gpio_init;\r
-    int ret = 0;\r
-    \r
-    if (camera_power != INVALID_GPIO)  {\r
-                    if (camera_io_init & RK29_CAM_POWERACTIVE_MASK) {\r
-            if (on) {\r
-               gpio_set_value(camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-                       dprintk("%s..%s..PowerPin=%d ..PinLevel = %x   \n",__FUNCTION__,res->dev_name, camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-                       msleep(10);\r
-               } else {\r
-                       gpio_set_value(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-                       dprintk("%s..%s..PowerPin=%d ..PinLevel = %x   \n",__FUNCTION__,res->dev_name, camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-               }\r
-               } else {\r
-                       ret = RK29_CAM_EIO_REQUESTFAIL;\r
-                       printk("%s..%s..PowerPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_power);\r
-           }        \r
-    } else {\r
-               ret = RK29_CAM_EIO_INVALID;\r
-    } \r
-\r
-    return ret;\r
-}\r
-\r
-static int sensor_reset_default_cb (struct rk29camera_gpio_res *res, int on)\r
-{\r
-    int camera_reset = res->gpio_reset;\r
-    int camera_ioflag = res->gpio_flag;\r
-    int camera_io_init = res->gpio_init;  \r
-    int ret = 0;\r
-    \r
-    if (camera_reset != INVALID_GPIO) {\r
-               if (camera_io_init & RK29_CAM_RESETACTIVE_MASK) {\r
-                       if (on) {\r
-                       gpio_set_value(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-                       dprintk("%s..%s..ResetPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-                       } else {\r
-                               gpio_set_value(camera_reset,(((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-                       dprintk("%s..%s..ResetPin= %d..PinLevel = %x   \n",__FUNCTION__,res->dev_name, camera_reset, (((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-               }\r
-               } else {\r
-                       ret = RK29_CAM_EIO_REQUESTFAIL;\r
-                       printk("%s..%s..ResetPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_reset);\r
-               }\r
-    } else {\r
-               ret = RK29_CAM_EIO_INVALID;\r
-    }\r
-\r
-    return ret;\r
-}\r
-\r
-static int sensor_powerdown_default_cb (struct rk29camera_gpio_res *res, int on)\r
-{\r
-    int camera_powerdown = res->gpio_powerdown;\r
-    int camera_ioflag = res->gpio_flag;\r
-    int camera_io_init = res->gpio_init;  \r
-    int ret = 0;    \r
-\r
-    if (camera_powerdown != INVALID_GPIO) {\r
-               if (camera_io_init & RK29_CAM_POWERDNACTIVE_MASK) {\r
-                       if (on) {\r
-                       gpio_set_value(camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-                       dprintk("%s..%s..PowerDownPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-                       } else {\r
-                               gpio_set_value(camera_powerdown,(((~camera_ioflag)&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-                       dprintk("%s..%s..PowerDownPin= %d..PinLevel = %x   \n",__FUNCTION__,res->dev_name, camera_powerdown, (((~camera_ioflag)&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-               }\r
-               } else {\r
-                       ret = RK29_CAM_EIO_REQUESTFAIL;\r
-                       dprintk("%s..%s..PowerDownPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_powerdown);\r
-               }\r
-    } else {\r
-               ret = RK29_CAM_EIO_INVALID;\r
-    }\r
-    return ret;\r
-}\r
-\r
-\r
-static int sensor_flash_default_cb (struct rk29camera_gpio_res *res, int on)\r
-{\r
-    int camera_flash = res->gpio_flash;\r
-    int camera_ioflag = res->gpio_flag;\r
-    int camera_io_init = res->gpio_init;  \r
-    int ret = 0;    \r
-\r
-    if (camera_flash != INVALID_GPIO) {\r
-               if (camera_io_init & RK29_CAM_FLASHACTIVE_MASK) {\r
-            switch (on)\r
-            {\r
-                case Flash_Off:\r
-                {\r
-                    gpio_set_value(camera_flash,(((~camera_ioflag)&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-                           dprintk("\n%s..%s..FlashPin= %d..PinLevel = %x   \n",__FUNCTION__,res->dev_name, camera_flash, (((~camera_ioflag)&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS)); \r
-                           break;\r
-                }\r
-\r
-                case Flash_On:\r
-                {\r
-                    gpio_set_value(camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-                           dprintk("%s..%s..FlashPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-                           break;\r
-                }\r
-\r
-                case Flash_Torch:\r
-                {\r
-                    gpio_set_value(camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-                           dprintk("%s..%s..FlashPin=%d ..PinLevel = %x \n",__FUNCTION__,res->dev_name,camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-                           break;\r
-                }\r
-\r
-                default:\r
-                {\r
-                    printk("%s..%s..Flash command(%d) is invalidate \n",__FUNCTION__,res->dev_name,on);\r
-                    break;\r
-                }\r
-            }\r
-               } else {\r
-                       ret = RK29_CAM_EIO_REQUESTFAIL;\r
-                       printk("%s..%s..FlashPin=%d request failed!\n",__FUNCTION__,res->dev_name,camera_flash);\r
-               }\r
-    } else {\r
-               ret = RK29_CAM_EIO_INVALID;\r
-    }\r
-    return ret;\r
-}\r
-\r
-\r
-static int rk29_sensor_io_init(void)\r
-{\r
-    int ret = 0, i,j;\r
-    unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;\r
-       unsigned int camera_powerdown = INVALID_GPIO, camera_flash = INVALID_GPIO;\r
-       unsigned int camera_ioflag;\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
-        sensor_ioctl_cb.sensor_reset_cb = sensor_reset_default_cb;\r
-    if (sensor_ioctl_cb.sensor_powerdown_cb == NULL)\r
-        sensor_ioctl_cb.sensor_powerdown_cb = sensor_powerdown_default_cb;\r
-    if (sensor_ioctl_cb.sensor_flash_cb == NULL)\r
-        sensor_ioctl_cb.sensor_flash_cb = sensor_flash_default_cb;\r
-    \r
-    for (i=0; i<2; i++) {\r
-        camera_reset = rk29_camera_platform_data.gpio_res[i].gpio_reset;\r
-        camera_power = rk29_camera_platform_data.gpio_res[i].gpio_power;\r
-               camera_powerdown = rk29_camera_platform_data.gpio_res[i].gpio_powerdown;\r
-        camera_flash = rk29_camera_platform_data.gpio_res[i].gpio_flash;\r
-               camera_ioflag = rk29_camera_platform_data.gpio_res[i].gpio_flag;\r
-               rk29_camera_platform_data.gpio_res[i].gpio_init = 0;\r
-\r
-        if (camera_power != INVALID_GPIO) {\r
-            ret = gpio_request(camera_power, "camera power");\r
-            if (ret) {\r
-                if (i == 0) {\r
-                    printk("%s..%s..power pin(%d) init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_power);\r
-                                   goto sensor_io_int_loop_end;\r
-                } else {\r
-                    if (camera_power != rk29_camera_platform_data.gpio_res[0].gpio_power) {\r
-                        printk("%s..%s..power pin(%d) init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_power);\r
-                        goto sensor_io_int_loop_end;\r
-                    }\r
-                }\r
-            }\r
-\r
-            if (rk29_sensor_iomux(camera_power) < 0) {\r
-                printk(KERN_ERR "%s..%s..power pin(%d) iomux init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_power);\r
-                goto sensor_io_int_loop_end;\r
-            }\r
-            \r
-                       rk29_camera_platform_data.gpio_res[i].gpio_init |= RK29_CAM_POWERACTIVE_MASK;\r
-            gpio_set_value(camera_reset, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-            gpio_direction_output(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-\r
-                       dprintk("%s....power pin(%d) init success(0x%x)  \n",__FUNCTION__,camera_power,(((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-\r
-        }\r
-\r
-        if (camera_reset != INVALID_GPIO) {\r
-            ret = gpio_request(camera_reset, "camera reset");\r
-            if (ret) {\r
-                printk("%s..%s..reset pin(%d) init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_reset);\r
-                goto sensor_io_int_loop_end;\r
-            }\r
-\r
-            if (rk29_sensor_iomux(camera_reset) < 0) {\r
-                printk(KERN_ERR "%s..%s..reset pin(%d) iomux init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_reset);\r
-                goto sensor_io_int_loop_end;\r
-            }\r
-            \r
-                       rk29_camera_platform_data.gpio_res[i].gpio_init |= RK29_CAM_RESETACTIVE_MASK;\r
-            gpio_set_value(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-            gpio_direction_output(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-\r
-                       dprintk("%s....reset pin(%d) init success(0x%x)\n",__FUNCTION__,camera_reset,((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-\r
-        }\r
-\r
-               if (camera_powerdown != INVALID_GPIO) {\r
-            ret = gpio_request(camera_powerdown, "camera powerdown");\r
-            if (ret) {\r
-                printk("%s..%s..powerdown pin(%d) init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_powerdown);\r
-                goto sensor_io_int_loop_end;\r
-            }\r
-\r
-            if (rk29_sensor_iomux(camera_powerdown) < 0) {\r
-                printk(KERN_ERR "%s..%s..powerdown pin(%d) iomux init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_powerdown);\r
-                goto sensor_io_int_loop_end;\r
-            }\r
-            \r
-                       rk29_camera_platform_data.gpio_res[i].gpio_init |= RK29_CAM_POWERDNACTIVE_MASK;\r
-            gpio_set_value(camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-            gpio_direction_output(camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-\r
-                       dprintk("%s....powerdown pin(%d) init success(0x%x) \n",__FUNCTION__,camera_powerdown,((camera_ioflag&RK29_CAM_POWERDNACTIVE_BITPOS)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-\r
-        }\r
-\r
-               if (camera_flash != INVALID_GPIO) {\r
-            ret = gpio_request(camera_flash, "camera flash");\r
-            if (ret) {\r
-                printk("%s..%s..flash pin(%d) init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_flash);\r
-                               goto sensor_io_int_loop_end;\r
-            }\r
-\r
-            if (rk29_sensor_iomux(camera_flash) < 0) {\r
-                printk(KERN_ERR "%s..%s..flash pin(%d) iomux init failed\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[i].dev_name,camera_flash);                \r
-            }\r
-            \r
-                       rk29_camera_platform_data.gpio_res[i].gpio_init |= RK29_CAM_FLASHACTIVE_MASK;\r
-            gpio_set_value(camera_flash, ((~camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));    /* falsh off */\r
-            gpio_direction_output(camera_flash, ((~camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-\r
-                       dprintk("%s....flash pin(%d) init success(0x%x) \n",__FUNCTION__,camera_flash,((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-\r
-        }  \r
-\r
-        \r
-        for (j=0; j<10; j++) {\r
-            memset(&rk29_camera_platform_data.info[i].fival[j],0x00,sizeof(struct v4l2_frmivalenum));\r
-        }\r
-        j=0;\r
-        if (strstr(rk29_camera_platform_data.info[i].dev_name,"_back")) {\r
-            \r
-            #if CONFIG_SENSOR_QCIF_FPS_FIXED_0\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QCIF_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 176;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 144;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_QVGA_FPS_FIXED_0\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QVGA_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 320;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 240;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_CIF_FPS_FIXED_0\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_CIF_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 352;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 288;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_VGA_FPS_FIXED_0\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_VGA_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 640;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 480;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_480P_FPS_FIXED_0\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_480P_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 720;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 480;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif            \r
-\r
-            #if CONFIG_SENSOR_SVGA_FPS_FIXED_0\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_SVGA_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 800;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 600;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_720P_FPS_FIXED_0\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_720P_FPS_FIXED_0;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 1280;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 720;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-        } else {\r
-            #if CONFIG_SENSOR_QCIF_FPS_FIXED_1\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QCIF_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 176;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 144;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_QVGA_FPS_FIXED_1\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_QVGA_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 320;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 240;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_CIF_FPS_FIXED_1\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_CIF_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 352;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 288;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_VGA_FPS_FIXED_1\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_VGA_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 640;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 480;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_480P_FPS_FIXED_1\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_480P_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 720;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 480;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif \r
-\r
-            #if CONFIG_SENSOR_SVGA_FPS_FIXED_1\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_SVGA_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 800;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 600;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-\r
-            #if CONFIG_SENSOR_720P_FPS_FIXED_1\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.denominator = CONFIG_SENSOR_720P_FPS_FIXED_1;\r
-            rk29_camera_platform_data.info[i].fival[j].discrete.numerator= 1000;\r
-            rk29_camera_platform_data.info[i].fival[j].index = 0;\r
-            rk29_camera_platform_data.info[i].fival[j].pixel_format = V4L2_PIX_FMT_NV12;\r
-            rk29_camera_platform_data.info[i].fival[j].width = 1280;\r
-            rk29_camera_platform_data.info[i].fival[j].height = 720;\r
-            rk29_camera_platform_data.info[i].fival[j].type = V4L2_FRMIVAL_TYPE_DISCRETE;\r
-            j++;\r
-            #endif\r
-        }\r
-        \r
-               continue;\r
-sensor_io_int_loop_end:\r
-               rk29_sensor_io_deinit(i);\r
-               continue;\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-static int rk29_sensor_io_deinit(int sensor)\r
-{\r
-    unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;\r
-       unsigned int camera_powerdown = INVALID_GPIO, camera_flash = INVALID_GPIO;\r
-\r
-    camera_reset = rk29_camera_platform_data.gpio_res[sensor].gpio_reset;\r
-    camera_power = rk29_camera_platform_data.gpio_res[sensor].gpio_power;\r
-       camera_powerdown = rk29_camera_platform_data.gpio_res[sensor].gpio_powerdown;\r
-    camera_flash = rk29_camera_platform_data.gpio_res[sensor].gpio_flash;\r
-\r
-    printk("%s..%s enter..\n",__FUNCTION__,rk29_camera_platform_data.gpio_res[sensor].dev_name);\r
-\r
-       if (rk29_camera_platform_data.gpio_res[sensor].gpio_init & RK29_CAM_POWERACTIVE_MASK) {\r
-           if (camera_power != INVALID_GPIO) {\r
-               gpio_direction_input(camera_power);\r
-               gpio_free(camera_power);\r
-           }\r
-       }\r
-\r
-       if (rk29_camera_platform_data.gpio_res[sensor].gpio_init & RK29_CAM_RESETACTIVE_MASK) {\r
-           if (camera_reset != INVALID_GPIO)  {\r
-               gpio_direction_input(camera_reset);\r
-               gpio_free(camera_reset);\r
-           }\r
-       }\r
-\r
-       if (rk29_camera_platform_data.gpio_res[sensor].gpio_init & RK29_CAM_POWERDNACTIVE_MASK) {\r
-           if (camera_powerdown != INVALID_GPIO)  {\r
-               gpio_direction_input(camera_powerdown);\r
-               gpio_free(camera_powerdown);\r
-           }\r
-       }\r
-\r
-       if (rk29_camera_platform_data.gpio_res[sensor].gpio_init & RK29_CAM_FLASHACTIVE_MASK) {\r
-           if (camera_flash != INVALID_GPIO)  {\r
-               gpio_direction_input(camera_flash);\r
-               gpio_free(camera_flash);\r
-           }\r
-       }\r
-\r
-       rk29_camera_platform_data.gpio_res[sensor].gpio_init = 0;\r
-    return 0;\r
-}\r
-static int rk29_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, int on)\r
-{\r
-    struct rk29camera_gpio_res *res = NULL;    \r
-       int ret = RK29_CAM_IO_SUCCESS;\r
-\r
-    if(rk29_camera_platform_data.gpio_res[0].dev_name &&  (strcmp(rk29_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) {\r
-               res = (struct rk29camera_gpio_res *)&rk29_camera_platform_data.gpio_res[0];\r
-    } else if (rk29_camera_platform_data.gpio_res[1].dev_name && (strcmp(rk29_camera_platform_data.gpio_res[1].dev_name, dev_name(dev)) == 0)) {\r
-       res = (struct rk29camera_gpio_res *)&rk29_camera_platform_data.gpio_res[1];\r
-    } else {\r
-        printk(KERN_ERR "%s is not regisiterd in rk29_camera_platform_data!!\n",dev_name(dev));\r
-        ret = RK29_CAM_EIO_INVALID;\r
-        goto rk29_sensor_ioctrl_end;\r
-    }\r
-\r
-       switch (cmd)\r
-       {\r
-               case Cam_Power:\r
-               {\r
-                       if (sensor_ioctl_cb.sensor_power_cb) {\r
-                ret = sensor_ioctl_cb.sensor_power_cb(res, on);\r
-                       } else {\r
-                printk(KERN_ERR "sensor_ioctl_cb.sensor_power_cb is NULL");\r
-                WARN_ON(1);\r
-                       }\r
-                       break;\r
-               }\r
-               case Cam_Reset:\r
-               {\r
-                       if (sensor_ioctl_cb.sensor_reset_cb) {\r
-                ret = sensor_ioctl_cb.sensor_reset_cb(res, on);\r
-                       } else {\r
-                printk(KERN_ERR "sensor_ioctl_cb.sensor_reset_cb is NULL");\r
-                WARN_ON(1);\r
-                       }\r
-                       break;\r
-               }\r
-\r
-               case Cam_PowerDown:\r
-               {\r
-                       if (sensor_ioctl_cb.sensor_powerdown_cb) {\r
-                ret = sensor_ioctl_cb.sensor_powerdown_cb(res, on);\r
-                       } else {\r
-                printk(KERN_ERR "sensor_ioctl_cb.sensor_powerdown_cb is NULL");\r
-                WARN_ON(1);\r
-                       }\r
-                       break;\r
-               }\r
-\r
-               case Cam_Flash:\r
-               {\r
-                       if (sensor_ioctl_cb.sensor_flash_cb) {\r
-                ret = sensor_ioctl_cb.sensor_flash_cb(res, on);\r
-                       } else {\r
-                printk(KERN_ERR "sensor_ioctl_cb.sensor_flash_cb is NULL!");\r
-                WARN_ON(1);\r
-                       }\r
-                       break;\r
-               }\r
-               default:\r
-               {\r
-                       printk("%s cmd(0x%x) is unknown!\n",__FUNCTION__, cmd);\r
-                       break;\r
-               }\r
-       }\r
-rk29_sensor_ioctrl_end:\r
-    return ret;\r
-}\r
-static int rk29_sensor_power(struct device *dev, int on)\r
-{\r
-       rk29_sensor_ioctrl(dev,Cam_Power,on);\r
-    return 0;\r
-}\r
-#if (CONFIG_SENSOR_RESET_PIN_0 != INVALID_GPIO) || (CONFIG_SENSOR_RESET_PIN_1 != INVALID_GPIO)\r
-static int rk29_sensor_reset(struct device *dev)\r
-{\r
-       rk29_sensor_ioctrl(dev,Cam_Reset,1);\r
-       msleep(2);\r
-       rk29_sensor_ioctrl(dev,Cam_Reset,0);\r
-       return 0;\r
-}\r
-#endif\r
-static int rk29_sensor_powerdown(struct device *dev, int on)\r
-{\r
-       return rk29_sensor_ioctrl(dev,Cam_PowerDown,on);\r
-}\r
 #if (CONFIG_SENSOR_IIC_ADDR_0 != 0x00)\r
 static struct i2c_board_info rk29_i2c_cam_info_0[] = {\r
        {\r
@@ -1642,11 +985,11 @@ static struct i2c_board_info rk29_i2c_cam_info_0[] = {
 \r
 static struct soc_camera_link rk29_iclink_0 = {\r
        .bus_id         = RK29_CAM_PLATFORM_DEV_ID,\r
-       .power          = rk29_sensor_power,\r
+       .power          = rk_sensor_power,\r
 #if (CONFIG_SENSOR_RESET_PIN_0 != INVALID_GPIO)\r
-    .reset      = rk29_sensor_reset,\r
+    .reset      = rk_sensor_reset,\r
 #endif    \r
-       .powerdown  = rk29_sensor_powerdown,\r
+       .powerdown  = rk_sensor_powerdown,\r
        .board_info     = &rk29_i2c_cam_info_0[0],\r
        .i2c_adapter_id = CONFIG_SENSOR_IIC_ADAPTER_ID_0,\r
        .module_name    = SENSOR_NAME_0,\r
@@ -1671,11 +1014,11 @@ static struct i2c_board_info rk29_i2c_cam_info_1[] = {
 \r
 static struct soc_camera_link rk29_iclink_1 = {\r
        .bus_id         = RK29_CAM_PLATFORM_DEV_ID,\r
-       .power          = rk29_sensor_power,\r
+       .power          = rk_sensor_power,\r
 #if (CONFIG_SENSOR_RESET_PIN_1 != INVALID_GPIO)\r
-    .reset      = rk29_sensor_reset,\r
+    .reset      = rk_sensor_reset,\r
 #endif         \r
-       .powerdown  = rk29_sensor_powerdown,\r
+       .powerdown  = rk_sensor_powerdown,\r
        .board_info     = &rk29_i2c_cam_info_1[0],\r
        .i2c_adapter_id = CONFIG_SENSOR_IIC_ADAPTER_ID_1,\r
        .module_name    = SENSOR_NAME_1,\r
@@ -1715,25 +1058,43 @@ static struct platform_device rk29_device_camera = {
        .dev            = {\r
                .dma_mask = &rockchip_device_camera_dmamask,\r
                .coherent_dma_mask = 0xffffffffUL,\r
-               .platform_data  = &rk29_camera_platform_data,\r
+               .platform_data  = &rk_camera_platform_data,\r
        }\r
 };\r
 \r
-static struct android_pmem_platform_data android_pmem_cam_pdata = {\r
-       .name           = "pmem_cam",\r
-       .start          = PMEM_CAM_BASE,\r
-       .size           = PMEM_CAM_SIZE,\r
-       .no_allocator   = 1,\r
-       .cached         = 1,\r
-};\r
+static void rk_init_camera_plateform_data(void)\r
+{\r
+    int i,dev_idx;\r
+    \r
+    dev_idx = 0;\r
+    for (i=0; i<RK_CAM_NUM; i++) {\r
+        if (rk_camera_platform_data.register_dev[i].device_info.name) {            \r
+            rk_camera_platform_data.register_dev[i].link_info.board_info = \r
+                &rk_camera_platform_data.register_dev[i].i2c_cam_info;\r
+            rk_camera_platform_data.register_dev[i].device_info.id = dev_idx;\r
+            rk_camera_platform_data.register_dev[i].device_info.dev.platform_data = \r
+                &rk_camera_platform_data.register_dev[i].link_info;\r
+            dev_idx++;\r
+        }\r
+    }\r
+}\r
 \r
-static struct platform_device android_pmem_cam_device = {\r
-       .name           = "android_pmem",\r
-       .id             = 1,\r
-       .dev            = {\r
-               .platform_data = &android_pmem_cam_pdata,\r
-       },\r
-};\r
+static int rk_register_camera_devices(void)\r
+{   \r
+    int i;\r
+    \r
+       rk_init_camera_plateform_data();\r
+    for (i=0; i<RK_CAM_NUM; i++) {\r
+        if (rk_camera_platform_data.register_dev[i].device_info.name\r
+            && !strcmp(rk_camera_platform_data.register_dev[i].device_info.dev.init_name,SENSOR_DEVICE_NAME_0)\r
+            && !strcmp(rk_camera_platform_data.register_dev[i].device_info.dev.init_name,SENSOR_DEVICE_NAME_1)) {\r
+            platform_device_register(&rk_camera_platform_data.register_dev[i].device_info);\r
+        }\r
+    }\r
+       return 0;\r
+}\r
+\r
+module_init(rk_register_camera_devices);\r
 \r
 #endif\r
 \r