-#include "rk_camera.h"\r
-#include "rk30_camera.h"\r
-#include <linux/gpio.h>\r
-#include <linux/delay.h>\r
-#include <linux/version.h>\r
-#include <linux/moduleparam.h>\r
-#include <linux/of_gpio.h>\r
-/**********yzm***********/\r
-#include <linux/of.h>\r
-#include <linux/of_irq.h>\r
-#include <linux/kernel.h>\r
-#include <linux/of_address.h>\r
-#include <linux/of_platform.h>\r
-#include <linux/of_fdt.h>\r
-#include <linux/module.h>\r
-/**********yzm***********/\r
-\r
-//#define PMEM_CAM_NECESSARY 0x00000000 /*yzm*/\r
-\r
-static int camio_version = KERNEL_VERSION(0,1,9);/*yzm camio_version*/ \r
-module_param(camio_version, int, S_IRUGO);\r
-\r
-static int camera_debug = 0;/*yzm*/ \r
-module_param(camera_debug, int, S_IRUGO|S_IWUSR); \r
-\r
-#undef CAMMODULE_NAME\r
-#define CAMMODULE_NAME "rk_cam_io"\r
-\r
-#define ddprintk(level, fmt, arg...) do { \\r
- if (camera_debug >= level) \\r
- printk(KERN_WARNING"%s(%d):" fmt"\n", CAMMODULE_NAME,__LINE__,## arg); } while (0)\r
-\r
-#define dprintk(format, ...) ddprintk(1, format, ## __VA_ARGS__) \r
-#define eprintk(format, ...) printk(KERN_ERR "%s(%d):" format"\n",CAMMODULE_NAME,__LINE__,## __VA_ARGS__) \r
-#define debug_printk(format, ...) ddprintk(3, format, ## __VA_ARGS__) \r
-\r
-static int rk_sensor_io_init(void);\r
-static int rk_sensor_io_deinit(int sensor);\r
-static int rk_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, int on);\r
-static int rk_sensor_power(struct device *dev, int on);\r
-static int rk_sensor_register(void);\r
-/*static int rk_sensor_reset(struct device *dev);*/\r
-\r
-static int rk_dts_sensor_probe(struct platform_device *pdev);\r
-static int rk_dts_sensor_remove(struct platform_device *pdev);\r
-static int rk_dts_cif_probe(struct platform_device *pdev);\r
-static int rk_dts_cif_remove(struct platform_device *pdev);\r
-\r
-static int rk_sensor_powerdown(struct device *dev, int on);\r
-\r
-static struct rkcamera_platform_data *new_camera_head; \r
-\r
-static struct rk29camera_platform_data rk_camera_platform_data = {\r
- .io_init = rk_sensor_io_init,\r
- .io_deinit = rk_sensor_io_deinit,\r
- .sensor_ioctrl = rk_sensor_ioctrl,\r
- .sensor_register = rk_sensor_register,\r
-\r
-};\r
-\r
-struct rk29camera_platform_ioctl_cb sensor_ioctl_cb = {\r
- .sensor_power_cb = NULL,\r
- .sensor_reset_cb = NULL,\r
- .sensor_powerdown_cb = NULL,\r
- .sensor_flash_cb = NULL,\r
- .sensor_af_cb = NULL,\r
-};\r
-\r
-\r
-static u64 rockchip_device_camera_dmamask = 0xffffffffUL;\r
-#if RK_SUPPORT_CIF0\r
-static struct resource rk_camera_resource_host_0[2] = {};\r
-#endif\r
-#if RK_SUPPORT_CIF1\r
-static struct resource rk_camera_resource_host_1[2] = {};\r
-#endif\r
-\r
-#if RK_SUPPORT_CIF0\r
- struct platform_device rk_device_camera_host_0 = {\r
- .name = RK29_CAM_DRV_NAME,\r
- .id = RK_CAM_PLATFORM_DEV_ID_0, /* This is used to put cameras on this interface*/ \r
- .num_resources= 2,\r
- .resource = rk_camera_resource_host_0,/*yzm*/\r
- .dev = {\r
- .dma_mask = &rockchip_device_camera_dmamask,\r
- .coherent_dma_mask = 0xffffffffUL,\r
- .platform_data = &rk_camera_platform_data,\r
- }\r
-};\r
-#endif\r
-\r
-#if RK_SUPPORT_CIF1\r
- struct platform_device rk_device_camera_host_1 = {\r
- .name = RK29_CAM_DRV_NAME,\r
- .id = RK_CAM_PLATFORM_DEV_ID_1, /* This is used to put cameras on this interface */\r
- .num_resources = ARRAY_SIZE(rk_camera_resource_host_1),\r
- .resource = rk_camera_resource_host_1,/*yzm*/\r
- .dev = {\r
- .dma_mask = &rockchip_device_camera_dmamask,\r
- .coherent_dma_mask = 0xffffffffUL,\r
- .platform_data = &rk_camera_platform_data,\r
- }\r
-};\r
-#endif\r
-\r
-\r
-\r
-static const struct of_device_id of_match_cif[] = {\r
- { .compatible = "rockchip,cif" },\r
- {},\r
-};\r
-\r
-MODULE_DEVICE_TABLE(of,of_match_cif);\r
-static struct platform_driver rk_cif_driver =\r
-{\r
- .driver = {\r
- .name = RK_CIF_NAME, \r
- .owner = THIS_MODULE,\r
- .of_match_table = of_match_ptr(of_match_cif),\r
- },\r
- .probe = rk_dts_cif_probe,\r
- .remove = rk_dts_cif_remove,\r
-};\r
-\r
-static const struct of_device_id of_match_sensor[] = {\r
- { .compatible = "rockchip,sensor" },\r
-};\r
-MODULE_DEVICE_TABLE(of,of_match_sensor);\r
-static struct platform_driver rk_sensor_driver =\r
-{\r
- .driver = {\r
- .name = RK_SENSOR_NAME, \r
- .owner = THIS_MODULE,\r
- .of_match_table = of_match_ptr(of_match_sensor),\r
- },\r
- .probe = rk_dts_sensor_probe,\r
- .remove = rk_dts_sensor_remove,\r
-};\r
-\r
-\r
-static int rk_dts_sensor_remove(struct platform_device *pdev)\r
-{\r
- return 0;\r
-}\r
-static int rk_dts_sensor_probe(struct platform_device *pdev)\r
-{\r
- struct device_node *np, *cp;\r
- int sensor_num = 0;\r
- struct device *dev = &pdev->dev;\r
- struct rkcamera_platform_data *new_camera_list;\r
- \r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
- \r
- np = dev->of_node;\r
- if (!np)\r
- return -ENODEV;\r
- for_each_child_of_node(np, cp) {\r
- u32 flash_attach = 0,mir = 0,i2c_rata = 0,i2c_chl = 0,i2c_add = 0;\r
- u32 cif_chl = 0, mclk_rate = 0, is_front = 0;\r
- u32 resolution = 0, powerup_sequence = 0;\r
- \r
- u32 powerdown = INVALID_GPIO,power = INVALID_GPIO,reset = INVALID_GPIO;\r
- u32 af = INVALID_GPIO,flash = INVALID_GPIO;\r
-\r
- int pwr_active = 0, rst_active = 0, pwdn_active = 0;\r
- int orientation = 0;\r
- struct rkcamera_platform_data *new_camera; \r
- new_camera = kzalloc(sizeof(struct rkcamera_platform_data),GFP_KERNEL);\r
- if(!sensor_num)\r
- { \r
- new_camera_head = new_camera;\r
- rk_camera_platform_data.register_dev_new = new_camera_head;\r
- new_camera_list = new_camera;\r
- }\r
- sensor_num ++;\r
- new_camera_list->next_camera = new_camera;\r
- new_camera_list = new_camera;\r
- \r
- if (of_property_read_u32(cp, "flash_attach", &flash_attach)) {\r
- dprintk("%s:Get %s rockchip,flash_attach failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "mir", &mir)) {\r
- dprintk("%s:Get %s rockchip,mir failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "i2c_rata", &i2c_rata)) {\r
- dprintk("%s:Get %s rockchip,i2c_rata failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "i2c_chl", &i2c_chl)) {\r
- dprintk("%s:Get %s rockchip,i2c_chl failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "cif_chl", &cif_chl)) {\r
- dprintk("%s:Get %s rockchip,cif_chl failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "mclk_rate", &mclk_rate)) {\r
- dprintk("%s:Get %s rockchip,mclk_rate failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "is_front", &is_front)) {\r
- dprintk("%s:Get %s rockchip,is_front failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "rockchip,powerdown", &powerdown)) {\r
- printk("%s:Get %s rockchip,powerdown failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "pwdn_active", &pwdn_active)) {\r
- dprintk("%s:Get %s pwdn_active failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "rockchip,power", &power)) {\r
- printk("%s:Get %s rockchip,power failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "pwr_active", &pwr_active)) {\r
- dprintk("%s:Get %s pwr_active failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "rockchip,reset", &reset)) {\r
- dprintk("%s:Get %s rockchip,reset failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "rst_active", &rst_active)) {\r
- dprintk("%s:Get %s rst_active failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "rockchip,af", &af)) {\r
- dprintk("%s:Get %s rockchip,af failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "rockchip,flash", &flash)) {\r
- dprintk("%s:Get %s rockchip,flash failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "i2c_add", &i2c_add)) {\r
- printk("%s:Get %s rockchip,i2c_add failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "resolution", &resolution)) {\r
- printk("%s:Get %s rockchip,resolution failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "powerup_sequence", &powerup_sequence)) {\r
- printk("%s:Get %s rockchip,powerup_sequence failed!\n",__func__, cp->name); \r
- }\r
- if (of_property_read_u32(cp, "orientation", &orientation)) {\r
- printk("%s:Get %s rockchip,orientation failed!\n",__func__, cp->name); \r
- }\r
- \r
- strcpy(new_camera->dev.i2c_cam_info.type, cp->name);\r
- new_camera->dev.i2c_cam_info.addr = i2c_add>>1;\r
- new_camera->dev.desc_info.host_desc.bus_id = RK29_CAM_PLATFORM_DEV_ID+cif_chl;/*yzm*/\r
- new_camera->dev.desc_info.host_desc.i2c_adapter_id = i2c_chl;/*yzm*/\r
- new_camera->dev.desc_info.host_desc.module_name = cp->name;/*const*/\r
- new_camera->dev.device_info.name = "soc-camera-pdrv";\r
- if(is_front)\r
- sprintf(new_camera->dev_name,"%s_%s",cp->name,"front");\r
- else\r
- sprintf(new_camera->dev_name,"%s_%s",cp->name,"back");\r
- new_camera->dev.device_info.dev.init_name =(const char*)&new_camera->dev_name[0];\r
- new_camera->io.gpio_reset = reset;\r
- new_camera->io.gpio_powerdown = powerdown;\r
- new_camera->io.gpio_power = power;\r
- new_camera->io.gpio_af = af;\r
- new_camera->io.gpio_flash = flash;\r
- new_camera->io.gpio_flag = ((pwr_active&0x01)<<RK29_CAM_POWERACTIVE_BITPOS)|((rst_active&0x01)<<RK29_CAM_RESETACTIVE_BITPOS)|((pwdn_active&0x01)<<RK29_CAM_POWERDNACTIVE_BITPOS);\r
- new_camera->orientation = orientation;\r
- new_camera->resolution = resolution;\r
- new_camera->mirror = mir;\r
- new_camera->i2c_rate = i2c_rata;\r
- new_camera->flash = flash_attach;\r
- new_camera->pwdn_info = ((pwdn_active&0x10)|0x01);\r
- new_camera->powerup_sequence = powerup_sequence;\r
- new_camera->mclk_rate = mclk_rate;\r
- new_camera->of_node = cp;\r
- \r
- debug_printk( "******************* /n power = %x\n", power);\r
- debug_printk( "******************* /n powerdown = %x\n", powerdown);\r
- debug_printk( "******************* /n i2c_add = %x\n", new_camera->dev.i2c_cam_info.addr << 1);\r
- debug_printk( "******************* /n i2c_chl = %d\n", new_camera->dev.desc_info.host_desc.i2c_adapter_id);\r
- debug_printk( "******************* /n init_name = %s\n", new_camera->dev.device_info.dev.init_name);\r
- debug_printk( "******************* /n dev_name = %s\n", new_camera->dev_name);\r
- debug_printk( "******************* /n module_name = %s\n", new_camera->dev.desc_info.host_desc.module_name);\r
- };\r
- new_camera_list->next_camera = NULL;\r
- return 0;\r
-}\r
- \r
-static int rk_dts_cif_remove(struct platform_device *pdev)\r
-{\r
- return 0;\r
-}\r
- \r
-static int rk_dts_cif_probe(struct platform_device *pdev) /*yzm*/\r
-{\r
- int irq,err;\r
- struct device *dev = &pdev->dev;\r
- const char *compatible = NULL;\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
- \r
- rk_camera_platform_data.cif_dev = &pdev->dev;\r
- \r
- err = of_address_to_resource(dev->of_node, 0, &rk_camera_resource_host_0[0]);\r
- if (err < 0){\r
- printk(KERN_EMERG "Get register resource from %s platform device failed!",pdev->name);\r
- return -ENODEV;\r
- }\r
- rk_camera_resource_host_0[0].flags = IORESOURCE_MEM;\r
- /*map irqs*/\r
- irq = irq_of_parse_and_map(dev->of_node, 0);\r
- if (irq < 0) {\r
- printk(KERN_EMERG "Get irq resource from %s platform device failed!",pdev->name);\r
- return -ENODEV;;\r
- }\r
- err = of_property_read_string(dev->of_node->parent,"compatible",&compatible); \r
- rk_camera_platform_data.rockchip_name = compatible;\r
-\r
- if (err < 0){\r
- printk(KERN_EMERG "Get rockchip compatible failed!!!!!!");\r
- return -ENODEV;\r
- }\r
- \r
- //printk(KERN_ERR "***************%s*************\n", rk_camera_platform_data.rockchip_name);\r
- rk_camera_resource_host_0[1].start = irq;\r
- rk_camera_resource_host_0[1].end = irq;\r
- rk_camera_resource_host_0[1].flags = IORESOURCE_IRQ;\r
- return 0;\r
-}\r
- \r
-static int rk_cif_sensor_init(void)\r
-{\r
- \r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
- platform_driver_register(&rk_cif_driver); \r
- \r
- platform_driver_register(&rk_sensor_driver); \r
-\r
- return 0;\r
-}\r
-\r
-/************yzm**************end*/\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
-debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\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 PowerPin=%d ..PinLevel = %x",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 PowerPin=%d ..PinLevel = %x",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
- eprintk("%s PowerPin=%d request failed!", 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
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\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 ResetPin=%d ..PinLevel = %x",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 ResetPin= %d..PinLevel = %x",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
- eprintk("%s ResetPin=%d request failed!", 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
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\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 PowerDownPin=%d ..PinLevel = %x" ,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 PowerDownPin= %d..PinLevel = %x" ,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 PowerDownPin=%d request failed!", 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
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
-\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("%s FlashPin= %d..PinLevel = %x", 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 FlashPin=%d ..PinLevel = %x", 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 FlashPin=%d ..PinLevel = %x", res->dev_name,camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
- break;\r
- }\r
-\r
- default:\r
- {\r
- eprintk("%s Flash command(%d) is invalidate", res->dev_name,on);\r
- break;\r
- }\r
- }\r
- } else {\r
- ret = RK29_CAM_EIO_REQUESTFAIL;\r
- eprintk("%s FlashPin=%d request failed!", res->dev_name,camera_flash);\r
- }\r
- } else {\r
- ret = RK29_CAM_EIO_INVALID;\r
- }\r
- return ret;\r
-}\r
-\r
-static int sensor_afpower_default_cb (struct rk29camera_gpio_res *res, int on)\r
-{\r
- int ret = 0; \r
- int camera_af = res->gpio_af;\r
- \r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- \r
- if (camera_af != INVALID_GPIO) {\r
- gpio_set_value(camera_af, on);\r
- }\r
-\r
- return ret;\r
-}\r
-\r
-static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct device_node *of_node)\r
-{\r
- int ret = 0;\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_af = INVALID_GPIO,camera_ioflag;\r
- struct rk29camera_gpio_res *io_res;\r
- bool io_requested_in_camera;\r
- enum of_gpio_flags flags;\r
- \r
- struct rkcamera_platform_data *new_camera;/*yzm*/\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
-\r
- camera_reset = gpio_res->gpio_reset;\r
- camera_power = gpio_res->gpio_power;\r
- camera_powerdown = gpio_res->gpio_powerdown;\r
- camera_flash = gpio_res->gpio_flash;\r
- camera_af = gpio_res->gpio_af; \r
- camera_ioflag = gpio_res->gpio_flag;\r
- gpio_res->gpio_init = 0;\r
-\r
- if (camera_power != INVALID_GPIO) {\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_power = %x\n", camera_power );\r
-\r
- camera_power = of_get_named_gpio_flags(of_node,"rockchip,power",0,&flags);/*yzm*/\r
- gpio_res->gpio_power = camera_power;/*yzm information back to the IO*/\r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_power = %x\n", camera_power ); \r
-\r
- ret = gpio_request(camera_power, "camera power"); \r
- if (ret) {\r
- \r
- io_requested_in_camera = false;\r
-\r
- if (io_requested_in_camera==false) {\r
-\r
- new_camera = new_camera_head;\r
- while (new_camera != NULL) {\r
- io_res = &new_camera->io;\r
- if (io_res->gpio_init & RK29_CAM_POWERACTIVE_MASK) {\r
- if (io_res->gpio_power == camera_power)\r
- io_requested_in_camera = true; \r
- }\r
- new_camera = new_camera->next_camera;\r
- }\r
-\r
- }\r
- \r
- if (io_requested_in_camera==false) {\r
- printk( "%s power pin(%d) init failed\n", gpio_res->dev_name,camera_power);\r
- goto _rk_sensor_io_init_end_;\r
- } else {\r
- ret =0;\r
- }\r
- }\r
- \r
- gpio_res->gpio_init |= RK29_CAM_POWERACTIVE_MASK;\r
- gpio_set_value(camera_power, (((~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)" ,gpio_res->dev_name,camera_power,(((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
-\r
- }\r
-\r
- if (camera_reset != INVALID_GPIO) {\r
- \r
- camera_power = of_get_named_gpio_flags(of_node,"rockchip,reset",0,&flags);/*yzm*/\r
- gpio_res->gpio_reset = camera_reset;/*yzm information back to the IO*/\r
- ret = gpio_request(camera_reset, "camera reset");\r
- if (ret) {\r
- io_requested_in_camera = false;\r
-\r
- if (io_requested_in_camera==false) {\r
- \r
- new_camera = new_camera_head;\r
- while (new_camera != NULL) {\r
- io_res = &new_camera->io;\r
- if (io_res->gpio_init & RK29_CAM_RESETACTIVE_MASK) {\r
- if (io_res->gpio_reset == camera_reset)\r
- io_requested_in_camera = true; \r
- }\r
- new_camera = new_camera->next_camera;\r
- }\r
- }\r
- \r
- if (io_requested_in_camera==false) {\r
- eprintk("%s reset pin(%d) init failed" ,gpio_res->dev_name,camera_reset);\r
- goto _rk_sensor_io_init_end_;\r
- } else {\r
- ret =0;\r
- }\r
- }\r
- \r
- gpio_res->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)" ,gpio_res->dev_name,camera_reset,((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
-\r
- }\r
-\r
- if (camera_powerdown != INVALID_GPIO) {\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_powerdown = %x\n", camera_powerdown );\r
-\r
- camera_powerdown = of_get_named_gpio_flags(of_node,"rockchip,powerdown",0,&flags);/*yzm*/\r
- gpio_res->gpio_powerdown = camera_powerdown;/*yzm information back to the IO*/\r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_powerdown = %x\n", camera_powerdown ); \r
- ret = gpio_request(camera_powerdown, "camera powerdown");\r
- if (ret) {\r
- io_requested_in_camera = false;\r
-\r
- if (io_requested_in_camera==false) {\r
- \r
- new_camera = new_camera_head;\r
- while (new_camera != NULL) {\r
- io_res = &new_camera->io;\r
- if (io_res->gpio_init & RK29_CAM_POWERDNACTIVE_MASK) {\r
- if (io_res->gpio_powerdown == camera_powerdown)\r
- io_requested_in_camera = true; \r
- }\r
- new_camera = new_camera->next_camera;\r
- }\r
- }\r
- \r
- if (io_requested_in_camera==false) {\r
- eprintk("%s powerdown pin(%d) init failed",gpio_res->dev_name,camera_powerdown);\r
- goto _rk_sensor_io_init_end_;\r
- } else {\r
- ret =0;\r
- }\r
- }\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s(),iomux is ok\n", __FILE__, __LINE__,__FUNCTION__);\r
- \r
- gpio_res->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)" ,gpio_res->dev_name,camera_powerdown,((camera_ioflag&RK29_CAM_POWERDNACTIVE_BITPOS)>>RK29_CAM_POWERDNACTIVE_BITPOS));\r
-\r
- }\r
-\r
- if (camera_flash != INVALID_GPIO) {\r
-\r
- camera_flash = of_get_named_gpio_flags(of_node,"rockchip,flash",0,&flags);/*yzm*/\r
- gpio_res->gpio_flash = camera_flash;/*yzm information back to the IO*/\r
- ret = gpio_request(camera_flash, "camera flash");\r
- if (ret) {\r
- io_requested_in_camera = false;\r
-\r
- if (io_requested_in_camera==false) {\r
-\r
- new_camera = new_camera_head;\r
- while (new_camera != NULL) {\r
- io_res = &new_camera->io;\r
- if (io_res->gpio_init & RK29_CAM_POWERDNACTIVE_MASK) {\r
- if (io_res->gpio_powerdown == camera_powerdown)\r
- io_requested_in_camera = true; \r
- }\r
- new_camera = new_camera->next_camera;\r
- }\r
- }\r
- \r
- ret = 0; //ddl@rock-chips.com : flash is only a function, sensor is also run;\r
- if (io_requested_in_camera==false) {\r
- eprintk("%s flash pin(%d) init failed",gpio_res->dev_name,camera_flash);\r
- goto _rk_sensor_io_init_end_;\r
- }\r
- }\r
-\r
-\r
- \r
- gpio_res->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)",gpio_res->dev_name, camera_flash,((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));\r
-\r
- } \r
-\r
- if (camera_af != INVALID_GPIO) {\r
- \r
- camera_af = of_get_named_gpio_flags(of_node,"rockchip,af",0,&flags);/*yzm*/\r
- gpio_res->gpio_af = camera_af;/*yzm information back to the IO*/\r
- ret = gpio_request(camera_af, "camera af");\r
- if (ret) {\r
- io_requested_in_camera = false;\r
-\r
- if (io_requested_in_camera==false) {\r
-\r
- new_camera = new_camera_head;\r
- while (new_camera != NULL) {\r
- io_res = &new_camera->io;\r
- if (io_res->gpio_init & RK29_CAM_AFACTIVE_MASK) {\r
- if (io_res->gpio_af == camera_af)\r
- io_requested_in_camera = true; \r
- }\r
- new_camera = new_camera->next_camera;\r
- }\r
- }\r
- \r
- if (io_requested_in_camera==false) {\r
- eprintk("%s af pin(%d) init failed",gpio_res->dev_name,camera_af);\r
- goto _rk_sensor_io_init_end_;\r
- } else {\r
- ret =0;\r
- }\r
- \r
- }\r
- \r
- gpio_res->gpio_init |= RK29_CAM_AFACTIVE_MASK;\r
- //gpio_direction_output(camera_af, ((camera_ioflag&RK29_CAM_AFACTIVE_MASK)>>RK29_CAM_AFACTIVE_BITPOS));\r
- dprintk("%s af pin(%d) init success",gpio_res->dev_name, camera_af);\r
-\r
- }\r
-\r
- \r
-_rk_sensor_io_init_end_:\r
- return ret;\r
-\r
-}\r
-\r
-static int _rk_sensor_io_deinit_(struct rk29camera_gpio_res *gpio_res)\r
-{\r
- unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;\r
- unsigned int camera_powerdown = INVALID_GPIO, camera_flash = INVALID_GPIO,camera_af = INVALID_GPIO;\r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- \r
- camera_reset = gpio_res->gpio_reset;\r
- camera_power = gpio_res->gpio_power;\r
- camera_powerdown = gpio_res->gpio_powerdown;\r
- camera_flash = gpio_res->gpio_flash;\r
- camera_af = gpio_res->gpio_af;\r
-\r
- if (gpio_res->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 (gpio_res->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 (gpio_res->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 (gpio_res->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
- if (gpio_res->gpio_init & RK29_CAM_AFACTIVE_MASK) {\r
- if (camera_af != INVALID_GPIO) {\r
- /* gpio_direction_input(camera_af);*/\r
- gpio_free(camera_af);\r
- }\r
- } \r
- gpio_res->gpio_init = 0;\r
- \r
- return 0;\r
-}\r
-\r
-static int rk_sensor_io_init(void)\r
-{\r
- static bool is_init = false;\r
- \r
- struct rkcamera_platform_data *new_camera;\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- if(is_init) { \r
- return 0;\r
- } else {\r
- is_init = true;\r
- }\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
- if (sensor_ioctl_cb.sensor_af_cb == NULL)\r
- sensor_ioctl_cb.sensor_af_cb = sensor_afpower_default_cb; \r
-\r
- /**********yzm*********/\r
- new_camera = new_camera_head;\r
- while(new_camera != NULL)\r
- {\r
- if (_rk_sensor_io_init_(&new_camera->io,new_camera->of_node)<0)\r
- _rk_sensor_io_deinit_(&new_camera->io);\r
- new_camera = new_camera->next_camera;\r
- }\r
- return 0;\r
-}\r
-\r
-static int rk_sensor_io_deinit(int sensor)\r
-{\r
- struct rkcamera_platform_data *new_camera;\r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- new_camera = new_camera_head;\r
- while(new_camera != NULL)\r
- {\r
- _rk_sensor_io_deinit_(&new_camera->io);\r
- new_camera = new_camera->next_camera;\r
- }\r
-\r
- return 0;\r
-}\r
-static int rk_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, int on)\r
-{\r
- struct rk29camera_gpio_res *res = NULL;\r
- struct rkcamera_platform_data *new_cam_dev = NULL;\r
- struct rk29camera_platform_data* plat_data = &rk_camera_platform_data;\r
- int ret = RK29_CAM_IO_SUCCESS,i = 0;\r
- struct soc_camera_desc *dev_icl = NULL;/*yzm*/\r
- struct rkcamera_platform_data *new_camera;\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- if (res == NULL) {\r
- new_camera = new_camera_head;\r
- while(new_camera != NULL)\r
- {\r
- if (strcmp(new_camera->dev_name, dev_name(dev)) == 0) {\r
- res = (struct rk29camera_gpio_res *)&new_camera->io; \r
- new_cam_dev = &new_camera[i];\r
- dev_icl = &new_camera->dev.desc_info;/*yzm*/\r
- break;\r
- }\r
- new_camera = new_camera->next_camera;;\r
- } \r
- }\r
- \r
- if (res == NULL) {\r
- eprintk("%s is not regisiterd in rk29_camera_platform_data!!",dev_name(dev));\r
- ret = RK29_CAM_EIO_INVALID;\r
- goto rk_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
- ret = (ret != RK29_CAM_EIO_INVALID)?ret:0; /* ddl@rock-chips.com: v0.1.1 */ \r
- } else {\r
- eprintk("sensor_ioctl_cb.sensor_power_cb is NULL");\r
- WARN_ON(1);\r
- }\r
-\r
- printk("ret: %d\n",ret);\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
-\r
- ret = (ret != RK29_CAM_EIO_INVALID)?ret:0;\r
- } else {\r
- eprintk( "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
- eprintk( "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
- eprintk( "sensor_ioctl_cb.sensor_flash_cb is NULL!");\r
- WARN_ON(1);\r
- }\r
- break;\r
- }\r
- \r
- case Cam_Af:\r
- {\r
- if (sensor_ioctl_cb.sensor_af_cb) {\r
- ret = sensor_ioctl_cb.sensor_af_cb(res, on);\r
- } else {\r
- eprintk( "sensor_ioctl_cb.sensor_af_cb is NULL!");\r
- WARN_ON(1);\r
- }\r
- break;\r
- }\r
-\r
- case Cam_Mclk:\r
- {\r
- if (plat_data->sensor_mclk && dev_icl) {\r
- plat_data->sensor_mclk(dev_icl->host_desc.bus_id,(on!=0)?1:0,on);/*yzm*/\r
- } else { \r
- eprintk( "%s(%d): sensor_mclk(%p) or dev_icl(%p) is NULL",\r
- __FUNCTION__,__LINE__,plat_data->sensor_mclk,dev_icl);\r
- }\r
- break;\r
- }\r
- \r
- default:\r
- {\r
- eprintk("%s cmd(0x%x) is unknown!",__FUNCTION__, cmd);\r
- break;\r
- }\r
- }\r
-rk_sensor_ioctrl_end:\r
- return ret;\r
-}\r
-\r
-static int rk_sensor_pwrseq(struct device *dev,int powerup_sequence, int on, int mclk_rate)\r
-{\r
- int ret =0;\r
- int i,powerup_type;\r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- \r
- for (i=0; i<8; i++) {\r
-\r
- if (on == 1)\r
- powerup_type = SENSOR_PWRSEQ_GET(powerup_sequence,i);\r
- else\r
- powerup_type = SENSOR_PWRSEQ_GET(powerup_sequence,(7-i));\r
- \r
- switch (powerup_type)\r
- {\r
- case SENSOR_PWRSEQ_AVDD:\r
- case SENSOR_PWRSEQ_DOVDD:\r
- case SENSOR_PWRSEQ_DVDD:\r
- case SENSOR_PWRSEQ_PWR:\r
- { \r
- ret = rk_sensor_ioctrl(dev,Cam_Power, on);\r
- if (ret<0) {\r
- eprintk("SENSOR_PWRSEQ_PWR failed");\r
- } else { \r
- msleep(10);\r
- dprintk("SensorPwrSeq-power: %d",on);\r
- }\r
- break;\r
- }\r
-\r
- case SENSOR_PWRSEQ_HWRST:\r
- {\r
- if(!on){\r
- rk_sensor_ioctrl(dev,Cam_Reset, 1);\r
- }else{\r
- ret = rk_sensor_ioctrl(dev,Cam_Reset, 1);\r
- msleep(2);\r
- ret |= rk_sensor_ioctrl(dev,Cam_Reset, 0); \r
- }\r
- if (ret<0) {\r
- eprintk("SENSOR_PWRSEQ_HWRST failed");\r
- } else {\r
- dprintk("SensorPwrSeq-reset: %d",on);\r
- }\r
- break;\r
- }\r
-\r
- case SENSOR_PWRSEQ_PWRDN:\r
- { \r
- ret = rk_sensor_ioctrl(dev,Cam_PowerDown, !on);\r
- if (ret<0) {\r
- eprintk("SENSOR_PWRSEQ_PWRDN failed");\r
- } else {\r
- dprintk("SensorPwrSeq-power down: %d",!on);\r
- }\r
- break;\r
- }\r
-\r
- case SENSOR_PWRSEQ_CLKIN:\r
- {\r
- ret = rk_sensor_ioctrl(dev,Cam_Mclk, (on?mclk_rate:on));\r
- if (ret<0) {\r
- eprintk("SENSOR_PWRSEQ_CLKIN failed");\r
- } else {\r
- dprintk("SensorPwrSeq-clock: %d",on);\r
- }\r
- break;\r
- }\r
-\r
- default:\r
- break;\r
- }\r
- \r
- } \r
-\r
- return ret;\r
-}\r
-\r
-static int rk_sensor_power(struct device *dev, int on) /*icd->pdev*/\r
-{\r
- int powerup_sequence,mclk_rate;\r
- \r
- struct rk29camera_platform_data* plat_data = &rk_camera_platform_data;\r
- struct rk29camera_gpio_res *dev_io = NULL;\r
- struct rkcamera_platform_data *new_camera=NULL, *new_device=NULL;\r
- bool real_pwroff = true;\r
- int ret = 0;\r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- new_camera = plat_data->register_dev_new; /*new_camera[]*/\r
- \r
- while (new_camera != NULL) {\r
-\r
- if (new_camera->io.gpio_powerdown != INVALID_GPIO) { \r
- gpio_direction_output(new_camera->io.gpio_powerdown,\r
- ((new_camera->io.gpio_flag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS)); \r
- }\r
-\r
- debug_printk( "new_camera->dev_name= %s \n", new_camera->dev_name); /*yzm*/\r
- debug_printk( "dev_name(dev)= %s \n", dev_name(dev)); /*yzm*/\r
- \r
- if (strcmp(new_camera->dev_name,dev_name(dev))) { \r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);\r
- if (sensor_ioctl_cb.sensor_powerdown_cb && on)\r
- {\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);\r
- sensor_ioctl_cb.sensor_powerdown_cb(&new_camera->io,1);\r
- }\r
- } else {\r
- new_device = new_camera;\r
- dev_io = &new_camera->io;\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);/*yzm*/\r
- if (!Sensor_Support_DirectResume(new_camera->pwdn_info))\r
- real_pwroff = true; \r
- else\r
- real_pwroff = false;\r
- }\r
- new_camera = new_camera->next_camera;\r
- }\r
-\r
- if (new_device != NULL) {\r
- powerup_sequence = new_device->powerup_sequence;\r
- if ((new_device->mclk_rate == 24) || (new_device->mclk_rate == 48))\r
- mclk_rate = new_device->mclk_rate*1000000;\r
- else \r
- mclk_rate = 24000000;\r
- } else {\r
- powerup_sequence = sensor_PWRSEQ_DEFAULT;\r
- mclk_rate = 24000000;\r
- }\r
- \r
- if (on) {\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);\r
- rk_sensor_pwrseq(dev, powerup_sequence, on,mclk_rate); \r
- } else {\r
- if (real_pwroff) {\r
- if (rk_sensor_pwrseq(dev, powerup_sequence, on,mclk_rate)<0) /* ddl@rock-chips.com: v0.1.5 */\r
- goto PowerDown;\r
- \r
- /*ddl@rock-chips.com: all power down switch to Hi-Z after power off*/\r
- new_camera = plat_data->register_dev_new;\r
- while (new_camera != NULL) {\r
- if (new_camera->io.gpio_powerdown != INVALID_GPIO) {\r
- gpio_direction_input(new_camera->io.gpio_powerdown); \r
- }\r
- new_camera->pwdn_info |= 0x01;\r
- new_camera = new_camera->next_camera;\r
- }\r
- } else { \r
-PowerDown:\r
- rk_sensor_ioctrl(dev,Cam_PowerDown, !on);\r
-\r
- rk_sensor_ioctrl(dev,Cam_Mclk, 0);\r
- }\r
-\r
- mdelay(10);/* ddl@rock-chips.com: v0.1.3 */\r
- }\r
- return ret;\r
-}\r
-#if 0\r
-static int rk_sensor_reset(struct device *dev)\r
-{\r
-#if 0\r
- rk_sensor_ioctrl(dev,Cam_Reset,1);\r
- msleep(2);\r
- rk_sensor_ioctrl(dev,Cam_Reset,0);\r
-#else\r
- /*\r
- *ddl@rock-chips.com : the rest function invalidate, because this operate is put together in rk_sensor_power;\r
- */\r
-#endif\r
- return 0;\r
-}\r
-#endif\r
-static int rk_sensor_powerdown(struct device *dev, int on)\r
-{\r
-\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- return rk_sensor_ioctrl(dev,Cam_PowerDown,on);\r
-}\r
-\r
-int rk_sensor_register(void)\r
-{\r
- int i; \r
- struct rkcamera_platform_data *new_camera; \r
- \r
- i = 0;\r
- debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);\r
-\r
- new_camera = new_camera_head;\r
- \r
- while (new_camera != NULL) { \r
- if (new_camera->dev.i2c_cam_info.addr == INVALID_VALUE) {\r
- WARN(1, \r
- KERN_ERR "%s(%d): new_camera[%d] i2c addr is invalidate!",\r
- __FUNCTION__,__LINE__,i);\r
- continue;\r
- }\r
- sprintf(new_camera->dev_name,"%s_%d",new_camera->dev.device_info.dev.init_name,i+3);\r
- new_camera->dev.device_info.dev.init_name =(const char*)&new_camera->dev_name[0];\r
- new_camera->io.dev_name =(const char*)&new_camera->dev_name[0];\r
- if (new_camera->orientation == INVALID_VALUE) {\r
- if (strstr(new_camera->dev_name,"back")) { \r
- new_camera->orientation = 90;\r
- } else {\r
- new_camera->orientation = 270;\r
- }\r
- }\r
- /* ddl@rock-chips.com: v0.1.3 */\r
- if ((new_camera->fov_h <= 0) || (new_camera->fov_h>360))\r
- new_camera->fov_h = 100;\r
- \r
- if ((new_camera->fov_v <= 0) || (new_camera->fov_v>360))\r
- new_camera->fov_v = 100; \r
-\r
- new_camera->dev.desc_info.subdev_desc.power = rk_sensor_power;\r
- new_camera->dev.desc_info.subdev_desc.powerdown = rk_sensor_powerdown;\r
- new_camera->dev.desc_info.host_desc.board_info =&new_camera->dev.i2c_cam_info; \r
-\r
- new_camera->dev.device_info.id = i+6;\r
- new_camera->dev.device_info.dev.platform_data = &new_camera->dev.desc_info;\r
- new_camera->dev.desc_info.subdev_desc.drv_priv = &rk_camera_platform_data;\r
-\r
- platform_device_register(&(new_camera->dev.device_info));\r
- i++;\r
- new_camera = new_camera->next_camera;\r
- }\r
- \r
- return 0;\r
-}\r
-#include "../../../drivers/media/video/rk30_camera.c"\r
+#include "rk_camera.h"
+#include "rk30_camera.h"
+#include <linux/gpio.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <linux/moduleparam.h>
+#include <linux/of_gpio.h>
+/**********yzm***********/
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/kernel.h>
+#include <linux/of_address.h>
+#include <linux/of_platform.h>
+#include <linux/of_fdt.h>
+#include <linux/module.h>
+#include <linux/regulator/consumer.h>
+/**********yzm***********/
+
+//#define PMEM_CAM_NECESSARY 0x00000000 /*yzm*/
+
+static int camio_version = KERNEL_VERSION(0,1,9);/*yzm camio_version*/
+module_param(camio_version, int, S_IRUGO);
+
+static int camera_debug = 0;/*yzm*/
+module_param(camera_debug, int, S_IRUGO|S_IWUSR);
+
+#undef CAMMODULE_NAME
+#define CAMMODULE_NAME "rk_cam_io"
+
+#define ddprintk(level, fmt, arg...) do { \
+ if (camera_debug >= level) \
+ printk(KERN_WARNING"%s(%d):" fmt"\n", CAMMODULE_NAME,__LINE__,## arg); } while (0)
+
+#define dprintk(format, ...) ddprintk(1, format, ## __VA_ARGS__)
+#define eprintk(format, ...) printk(KERN_ERR "%s(%d):" format"\n",CAMMODULE_NAME,__LINE__,## __VA_ARGS__)
+#define debug_printk(format, ...) ddprintk(3, format, ## __VA_ARGS__)
+
+static int rk_sensor_io_init(void);
+static int rk_sensor_io_deinit(int sensor);
+static int rk_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, int on);
+static int rk_sensor_power(struct device *dev, int on);
+static int rk_sensor_register(void);
+/*static int rk_sensor_reset(struct device *dev);*/
+
+static int rk_dts_sensor_probe(struct platform_device *pdev);
+static int rk_dts_sensor_remove(struct platform_device *pdev);
+static int rk_dts_cif_probe(struct platform_device *pdev);
+static int rk_dts_cif_remove(struct platform_device *pdev);
+
+static int rk_sensor_powerdown(struct device *dev, int on);
+
+static struct rkcamera_platform_data *new_camera_head;
+
+static struct rk29camera_platform_data rk_camera_platform_data = {
+ .io_init = rk_sensor_io_init,
+ .io_deinit = rk_sensor_io_deinit,
+ .sensor_ioctrl = rk_sensor_ioctrl,
+ .sensor_register = rk_sensor_register,
+
+};
+
+struct rk29camera_platform_ioctl_cb sensor_ioctl_cb = {
+ .sensor_power_cb = NULL,
+ .sensor_reset_cb = NULL,
+ .sensor_powerdown_cb = NULL,
+ .sensor_flash_cb = NULL,
+ .sensor_af_cb = NULL,
+};
+
+
+static u64 rockchip_device_camera_dmamask = 0xffffffffUL;
+#if RK_SUPPORT_CIF0
+static struct resource rk_camera_resource_host_0[2] = {};
+#endif
+#if RK_SUPPORT_CIF1
+static struct resource rk_camera_resource_host_1[2] = {};
+#endif
+
+#if RK_SUPPORT_CIF0
+ struct platform_device rk_device_camera_host_0 = {
+ .name = RK29_CAM_DRV_NAME,
+ .id = RK_CAM_PLATFORM_DEV_ID_0, /* This is used to put cameras on this interface*/
+ .num_resources= 2,
+ .resource = rk_camera_resource_host_0,/*yzm*/
+ .dev = {
+ .dma_mask = &rockchip_device_camera_dmamask,
+ .coherent_dma_mask = 0xffffffffUL,
+ .platform_data = &rk_camera_platform_data,
+ }
+};
+#endif
+
+#if RK_SUPPORT_CIF1
+ struct platform_device rk_device_camera_host_1 = {
+ .name = RK29_CAM_DRV_NAME,
+ .id = RK_CAM_PLATFORM_DEV_ID_1, /* This is used to put cameras on this interface */
+ .num_resources = ARRAY_SIZE(rk_camera_resource_host_1),
+ .resource = rk_camera_resource_host_1,/*yzm*/
+ .dev = {
+ .dma_mask = &rockchip_device_camera_dmamask,
+ .coherent_dma_mask = 0xffffffffUL,
+ .platform_data = &rk_camera_platform_data,
+ }
+};
+#endif
+
+
+
+static const struct of_device_id of_match_cif[] = {
+ { .compatible = "rockchip,cif" },
+ {},
+};
+
+MODULE_DEVICE_TABLE(of,of_match_cif);
+static struct platform_driver rk_cif_driver =
+{
+ .driver = {
+ .name = RK_CIF_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(of_match_cif),
+ },
+ .probe = rk_dts_cif_probe,
+ .remove = rk_dts_cif_remove,
+};
+
+static const struct of_device_id of_match_sensor[] = {
+ { .compatible = "rockchip,sensor" },
+};
+MODULE_DEVICE_TABLE(of,of_match_sensor);
+static struct platform_driver rk_sensor_driver =
+{
+ .driver = {
+ .name = RK_SENSOR_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(of_match_sensor),
+ },
+ .probe = rk_dts_sensor_probe,
+ .remove = rk_dts_sensor_remove,
+};
+
+
+static int rk_dts_sensor_remove(struct platform_device *pdev)
+{
+ return 0;
+}
+static int rk_dts_sensor_probe(struct platform_device *pdev)
+{
+ struct device_node *np, *cp;
+ int sensor_num = 0,err;
+ struct device *dev = &pdev->dev;
+ struct rkcamera_platform_data *new_camera_list;
+
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+
+ np = dev->of_node;
+ if (!np)
+ return -ENODEV;
+ for_each_child_of_node(np, cp) {
+ u32 flash_attach = 0,mir = 0,i2c_rata = 0,i2c_chl = 0,i2c_add = 0;
+ u32 cif_chl = 0, mclk_rate = 0, is_front = 0;
+ u32 resolution = 0, powerup_sequence = 0;
+
+ u32 powerdown = INVALID_GPIO,power = INVALID_GPIO,reset = INVALID_GPIO;
+ u32 af = INVALID_GPIO,flash = INVALID_GPIO;
+
+ int pwr_active = 0, rst_active = 0, pwdn_active = 0;
+ int orientation = 0;
+ struct rkcamera_platform_data *new_camera;
+ new_camera = kzalloc(sizeof(struct rkcamera_platform_data),GFP_KERNEL);
+ if(!sensor_num)
+ {
+ new_camera_head = new_camera;
+ rk_camera_platform_data.register_dev_new = new_camera_head;
+ new_camera_list = new_camera;
+ }
+ sensor_num ++;
+ new_camera_list->next_camera = new_camera;
+ new_camera_list = new_camera;
+
+ if (of_property_read_u32(cp, "flash_attach", &flash_attach)) {
+ dprintk("%s:Get %s rockchip,flash_attach failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "mir", &mir)) {
+ dprintk("%s:Get %s rockchip,mir failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "i2c_rata", &i2c_rata)) {
+ dprintk("%s:Get %s rockchip,i2c_rata failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "i2c_chl", &i2c_chl)) {
+ dprintk("%s:Get %s rockchip,i2c_chl failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "cif_chl", &cif_chl)) {
+ dprintk("%s:Get %s rockchip,cif_chl failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "mclk_rate", &mclk_rate)) {
+ dprintk("%s:Get %s rockchip,mclk_rate failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "is_front", &is_front)) {
+ dprintk("%s:Get %s rockchip,is_front failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rockchip,powerdown", &powerdown)) {
+ printk("%s:Get %s rockchip,powerdown failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "pwdn_active", &pwdn_active)) {
+ dprintk("%s:Get %s pwdn_active failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rockchip,power", &power)) {
+ printk("%s:Get %s rockchip,power failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "pwr_active", &pwr_active)) {
+ dprintk("%s:Get %s pwr_active failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rockchip,reset", &reset)) {
+ dprintk("%s:Get %s rockchip,reset failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rst_active", &rst_active)) {
+ dprintk("%s:Get %s rst_active failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rockchip,af", &af)) {
+ dprintk("%s:Get %s rockchip,af failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rockchip,flash", &flash)) {
+ dprintk("%s:Get %s rockchip,flash failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "i2c_add", &i2c_add)) {
+ printk("%s:Get %s rockchip,i2c_add failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "resolution", &resolution)) {
+ printk("%s:Get %s rockchip,resolution failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "powerup_sequence", &powerup_sequence)) {
+ printk("%s:Get %s rockchip,powerup_sequence failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "orientation", &orientation)) {
+ printk("%s:Get %s rockchip,orientation failed!\n",__func__, cp->name);
+ }
+
+ strcpy(new_camera->dev.i2c_cam_info.type, cp->name);
+ new_camera->dev.i2c_cam_info.addr = i2c_add>>1;
+ new_camera->dev.desc_info.host_desc.bus_id = RK29_CAM_PLATFORM_DEV_ID+cif_chl;/*yzm*/
+ new_camera->dev.desc_info.host_desc.i2c_adapter_id = i2c_chl;/*yzm*/
+ new_camera->dev.desc_info.host_desc.module_name = cp->name;/*const*/
+ new_camera->dev.device_info.name = "soc-camera-pdrv";
+ if(is_front)
+ sprintf(new_camera->dev_name,"%s_%s",cp->name,"front");
+ else
+ sprintf(new_camera->dev_name,"%s_%s",cp->name,"back");
+ new_camera->dev.device_info.dev.init_name =(const char*)&new_camera->dev_name[0];
+ new_camera->io.gpio_reset = reset;
+ new_camera->io.gpio_powerdown = powerdown;
+ new_camera->io.gpio_power = power;
+ new_camera->io.gpio_af = af;
+ new_camera->io.gpio_flash = flash;
+ new_camera->io.gpio_flag = ((pwr_active&0x01)<<RK29_CAM_POWERACTIVE_BITPOS)|((rst_active&0x01)<<RK29_CAM_RESETACTIVE_BITPOS)|((pwdn_active&0x01)<<RK29_CAM_POWERDNACTIVE_BITPOS);
+ new_camera->orientation = orientation;
+ new_camera->resolution = resolution;
+ new_camera->mirror = mir;
+ new_camera->i2c_rate = i2c_rata;
+ new_camera->flash = flash_attach;
+ new_camera->pwdn_info = ((pwdn_active&0x10)|0x01);
+ new_camera->powerup_sequence = powerup_sequence;
+ new_camera->mclk_rate = mclk_rate;
+ new_camera->of_node = cp;
+
+ new_camera->powerdown_pmu_name = NULL;
+ new_camera->power_pmu_name1 = NULL;
+ new_camera->power_pmu_name2 = NULL;
+ new_camera->powerdown_pmu_voltage = 0;
+ new_camera->power_pmu_name1 = 0;
+ new_camera->power_pmu_name2 = 0;
+ err = of_property_read_string(cp,"rockchip,powerdown_pmu",&(new_camera->powerdown_pmu_name));
+ if(err < 0) {
+ dprintk("Get rockchip,powerdown_pmu failed\n");
+ }
+ err = of_property_read_string(cp,"rockchip,power_pmu_name1",&(new_camera->power_pmu_name1));
+ if(err < 0) {
+ dprintk("Get rockchip,power_pmu_name1 failed\n");
+ }
+ err = of_property_read_string(cp,"rockchip,power_pmu_name2",&(new_camera->power_pmu_name2));
+ if(err < 0){
+ dprintk("rockchip,power_pmu_name2 failed\n");
+ }
+
+ if (of_property_read_u32(cp, "rockchip,powerdown_pmu_voltage", &(new_camera->powerdown_pmu_voltage))) {
+ dprintk("%s:Get %s rockchip,resolution failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rockchip,power_pmu_voltage1", &(new_camera->power_pmu_voltage1))) {
+ dprintk("%s:Get %s rockchip,resolution failed!\n",__func__, cp->name);
+ }
+ if (of_property_read_u32(cp, "rockchip,power_pmu_voltage2", &(new_camera->power_pmu_voltage2))) {
+ dprintk("%s:Get %s rockchip,resolution failed!\n",__func__, cp->name);
+ }
+ debug_printk( "******************* /n power = %x\n", power);
+ debug_printk( "******************* /n powerdown = %x\n", powerdown);
+ debug_printk( "******************* /n i2c_add = %x\n", new_camera->dev.i2c_cam_info.addr << 1);
+ debug_printk( "******************* /n i2c_chl = %d\n", new_camera->dev.desc_info.host_desc.i2c_adapter_id);
+ debug_printk( "******************* /n init_name = %s\n", new_camera->dev.device_info.dev.init_name);
+ debug_printk( "******************* /n dev_name = %s\n", new_camera->dev_name);
+ debug_printk( "******************* /n module_name = %s\n", new_camera->dev.desc_info.host_desc.module_name);
+ };
+ new_camera_list->next_camera = NULL;
+ return 0;
+}
+
+static int rk_dts_cif_remove(struct platform_device *pdev)
+{
+ return 0;
+}
+
+static int rk_dts_cif_probe(struct platform_device *pdev) /*yzm*/
+{
+ int irq,err;
+ struct device *dev = &pdev->dev;
+ const char *compatible = NULL;
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+ rk_camera_platform_data.cif_dev = &pdev->dev;
+
+ err = of_address_to_resource(dev->of_node, 0, &rk_camera_resource_host_0[0]);
+ if (err < 0){
+ printk(KERN_EMERG "Get register resource from %s platform device failed!",pdev->name);
+ return -ENODEV;
+ }
+ rk_camera_resource_host_0[0].flags = IORESOURCE_MEM;
+ /*map irqs*/
+ irq = irq_of_parse_and_map(dev->of_node, 0);
+ if (irq < 0) {
+ printk(KERN_EMERG "Get irq resource from %s platform device failed!",pdev->name);
+ return -ENODEV;;
+ }
+ err = of_property_read_string(dev->of_node->parent,"compatible",&compatible);
+ rk_camera_platform_data.rockchip_name = compatible;
+
+ if (err < 0){
+ printk(KERN_EMERG "Get rockchip compatible failed!!!!!!");
+ return -ENODEV;
+ }
+
+ //printk(KERN_ERR "***************%s*************\n", rk_camera_platform_data.rockchip_name);
+ rk_camera_resource_host_0[1].start = irq;
+ rk_camera_resource_host_0[1].end = irq;
+ rk_camera_resource_host_0[1].flags = IORESOURCE_IRQ;
+ return 0;
+}
+
+static int rk_cif_sensor_init(void)
+{
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+ platform_driver_register(&rk_cif_driver);
+
+ platform_driver_register(&rk_sensor_driver);
+
+ return 0;
+}
+
+/************yzm**************end*/
+
+static int sensor_power_default_cb (struct rk29camera_gpio_res *res, int on)
+{
+ int camera_power = res->gpio_power;
+ int camera_ioflag = res->gpio_flag;
+ int camera_io_init = res->gpio_init;
+ int ret = 0;
+
+ struct regulator *ldo_18,*ldo_28;
+ struct rkcamera_platform_data *dev = container_of(res,struct rkcamera_platform_data,io);
+
+ int power_pmu_voltage1 = dev->power_pmu_voltage1;
+ int power_pmu_voltage2 = dev->power_pmu_voltage2;
+ const char *camera_power_pmu_name1 = dev->power_pmu_name1;
+ const char *camera_power_pmu_name2 = dev->power_pmu_name2;;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+ if(camera_power_pmu_name1 != NULL) {
+ ldo_28 = regulator_get(NULL, camera_power_pmu_name1); // vcc28_cif
+ if (on) {
+ regulator_set_voltage(ldo_28, power_pmu_voltage1, power_pmu_voltage1);
+ ret = regulator_enable(ldo_28);
+ //printk("%s set ldo7 vcc28_cif=%dmV end\n", __func__, regulator_get_voltage(ldo_28));
+ regulator_put(ldo_28);
+
+ msleep(10);
+ } else {
+ while(regulator_is_enabled(ldo_28)>0)
+ regulator_disable(ldo_28);
+ regulator_put(ldo_28);
+ }
+ }
+
+ if(camera_power_pmu_name2 != NULL) {
+ ldo_18 = regulator_get(NULL, camera_power_pmu_name2); // vcc18_cif
+ if (on) {
+ regulator_set_voltage(ldo_18, power_pmu_voltage2, power_pmu_voltage2);
+ //regulator_set_suspend_voltage(ldo, 1800000);
+ ret = regulator_enable(ldo_18);
+ //printk("%s set ldo1 vcc18_cif=%dmV end\n", __func__, regulator_get_voltage(ldo_18));
+ regulator_put(ldo_18);
+
+ msleep(10);
+ } else {
+ while(regulator_is_enabled(ldo_18)>0)
+ regulator_disable(ldo_18);
+ regulator_put(ldo_18);
+ }
+ }
+
+ if (camera_power != INVALID_GPIO) {
+ if (camera_io_init & RK29_CAM_POWERACTIVE_MASK) {
+ if (on) {
+ gpio_set_value(camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
+ dprintk("%s PowerPin=%d ..PinLevel = %x",res->dev_name, camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
+ msleep(10);
+ } else {
+ gpio_set_value(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
+ dprintk("%s PowerPin=%d ..PinLevel = %x",res->dev_name, camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
+ }
+ } else {
+ ret = RK29_CAM_EIO_REQUESTFAIL;
+ eprintk("%s PowerPin=%d request failed!", res->dev_name,camera_power);
+ }
+ }
+ else {
+ ret = RK29_CAM_EIO_INVALID;
+ }
+
+ return ret;
+}
+
+static int sensor_reset_default_cb (struct rk29camera_gpio_res *res, int on)
+{
+ int camera_reset = res->gpio_reset;
+ int camera_ioflag = res->gpio_flag;
+ int camera_io_init = res->gpio_init;
+ int ret = 0;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+
+ if (camera_reset != INVALID_GPIO) {
+ if (camera_io_init & RK29_CAM_RESETACTIVE_MASK) {
+ if (on) {
+ gpio_set_value(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
+ dprintk("%s ResetPin=%d ..PinLevel = %x",res->dev_name,camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
+ } else {
+ gpio_set_value(camera_reset,(((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
+ dprintk("%s ResetPin= %d..PinLevel = %x",res->dev_name, camera_reset, (((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
+ }
+ } else {
+ ret = RK29_CAM_EIO_REQUESTFAIL;
+ eprintk("%s ResetPin=%d request failed!", res->dev_name,camera_reset);
+ }
+ } else {
+ ret = RK29_CAM_EIO_INVALID;
+ }
+
+ return ret;
+}
+
+static int sensor_powerdown_default_cb (struct rk29camera_gpio_res *res, int on)
+{
+ int camera_powerdown = res->gpio_powerdown;
+ int camera_ioflag = res->gpio_flag;
+ int camera_io_init = res->gpio_init;
+ int ret = 0;
+
+ struct regulator *powerdown_pmu;
+ struct rkcamera_platform_data *dev = container_of(res,struct rkcamera_platform_data,io);
+ int powerdown_pmu_voltage = dev->powerdown_pmu_voltage;
+ const char *powerdown_pmu_name = dev->powerdown_pmu_name;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+ if(powerdown_pmu_name != NULL) {
+ powerdown_pmu = regulator_get(NULL, powerdown_pmu_name);
+ if (on) {
+ regulator_set_voltage(powerdown_pmu, powerdown_pmu_voltage, powerdown_pmu_voltage);
+ ret = regulator_enable(powerdown_pmu);
+ regulator_put(powerdown_pmu);
+ } else {
+ while(regulator_is_enabled(powerdown_pmu)>0)
+ regulator_disable(powerdown_pmu);
+ regulator_put(powerdown_pmu);
+ }
+ }
+
+ if (camera_powerdown != INVALID_GPIO) {
+ if (camera_io_init & RK29_CAM_POWERDNACTIVE_MASK) {
+ if (on) {
+ gpio_set_value(camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+ dprintk("%s PowerDownPin=%d ..PinLevel = %x" ,res->dev_name,camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+ } else {
+ gpio_set_value(camera_powerdown,(((~camera_ioflag)&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+ dprintk("%s PowerDownPin= %d..PinLevel = %x" ,res->dev_name, camera_powerdown, (((~camera_ioflag)&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+ }
+ } else {
+ ret = RK29_CAM_EIO_REQUESTFAIL;
+ dprintk("%s PowerDownPin=%d request failed!", res->dev_name,camera_powerdown);
+ }
+ }else {
+ ret = RK29_CAM_EIO_INVALID;
+ }
+ return ret;
+}
+
+
+static int sensor_flash_default_cb (struct rk29camera_gpio_res *res, int on)
+{
+ int camera_flash = res->gpio_flash;
+ int camera_ioflag = res->gpio_flag;
+ int camera_io_init = res->gpio_init;
+ int ret = 0;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+
+
+ if (camera_flash != INVALID_GPIO) {
+ if (camera_io_init & RK29_CAM_FLASHACTIVE_MASK) {
+ switch (on)
+ {
+ case Flash_Off:
+ {
+ gpio_set_value(camera_flash,(((~camera_ioflag)&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+ dprintk("%s FlashPin= %d..PinLevel = %x", res->dev_name, camera_flash, (((~camera_ioflag)&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+ break;
+ }
+
+ case Flash_On:
+ {
+ gpio_set_value(camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+ dprintk("%s FlashPin=%d ..PinLevel = %x", res->dev_name,camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+ break;
+ }
+
+ case Flash_Torch:
+ {
+ gpio_set_value(camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+ dprintk("%s FlashPin=%d ..PinLevel = %x", res->dev_name,camera_flash, ((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+ break;
+ }
+
+ default:
+ {
+ eprintk("%s Flash command(%d) is invalidate", res->dev_name,on);
+ break;
+ }
+ }
+ } else {
+ ret = RK29_CAM_EIO_REQUESTFAIL;
+ eprintk("%s FlashPin=%d request failed!", res->dev_name,camera_flash);
+ }
+ } else {
+ ret = RK29_CAM_EIO_INVALID;
+ }
+ return ret;
+}
+
+static int sensor_afpower_default_cb (struct rk29camera_gpio_res *res, int on)
+{
+ int ret = 0;
+ int camera_af = res->gpio_af;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+
+
+ if (camera_af != INVALID_GPIO) {
+ gpio_set_value(camera_af, on);
+ }
+
+ return ret;
+}
+
+static int _rk_sensor_io_init_(struct rk29camera_gpio_res *gpio_res,struct device_node *of_node)
+{
+ int ret = 0;
+ unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
+ unsigned int camera_powerdown = INVALID_GPIO, camera_flash = INVALID_GPIO;
+ unsigned int camera_af = INVALID_GPIO,camera_ioflag;
+ struct rk29camera_gpio_res *io_res;
+ bool io_requested_in_camera;
+ enum of_gpio_flags flags;
+
+ struct rkcamera_platform_data *new_camera;/*yzm*/
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+
+ camera_reset = gpio_res->gpio_reset;
+ camera_power = gpio_res->gpio_power;
+ camera_powerdown = gpio_res->gpio_powerdown;
+ camera_flash = gpio_res->gpio_flash;
+ camera_af = gpio_res->gpio_af;
+ camera_ioflag = gpio_res->gpio_flag;
+ gpio_res->gpio_init = 0;
+
+ if (camera_power != INVALID_GPIO) {
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_power = %x\n", camera_power );
+
+ camera_power = of_get_named_gpio_flags(of_node,"rockchip,power",0,&flags);/*yzm*/
+ gpio_res->gpio_power = camera_power;/*yzm information back to the IO*/
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_power = %x\n", camera_power );
+
+ ret = gpio_request(camera_power, "camera power");
+ if (ret) {
+
+ io_requested_in_camera = false;
+
+ if (io_requested_in_camera==false) {
+
+ new_camera = new_camera_head;
+ while (new_camera != NULL) {
+ io_res = &new_camera->io;
+ if (io_res->gpio_init & RK29_CAM_POWERACTIVE_MASK) {
+ if (io_res->gpio_power == camera_power)
+ io_requested_in_camera = true;
+ }
+ new_camera = new_camera->next_camera;
+ }
+
+ }
+
+ if (io_requested_in_camera==false) {
+ printk( "%s power pin(%d) init failed\n", gpio_res->dev_name,camera_power);
+ goto _rk_sensor_io_init_end_;
+ } else {
+ ret =0;
+ }
+ }
+
+ gpio_res->gpio_init |= RK29_CAM_POWERACTIVE_MASK;
+ gpio_set_value(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
+ gpio_direction_output(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
+
+ dprintk("%s power pin(%d) init success(0x%x)" ,gpio_res->dev_name,camera_power,(((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));
+
+ }
+
+ if (camera_reset != INVALID_GPIO) {
+
+ camera_power = of_get_named_gpio_flags(of_node,"rockchip,reset",0,&flags);/*yzm*/
+ gpio_res->gpio_reset = camera_reset;/*yzm information back to the IO*/
+ ret = gpio_request(camera_reset, "camera reset");
+ if (ret) {
+ io_requested_in_camera = false;
+
+ if (io_requested_in_camera==false) {
+
+ new_camera = new_camera_head;
+ while (new_camera != NULL) {
+ io_res = &new_camera->io;
+ if (io_res->gpio_init & RK29_CAM_RESETACTIVE_MASK) {
+ if (io_res->gpio_reset == camera_reset)
+ io_requested_in_camera = true;
+ }
+ new_camera = new_camera->next_camera;
+ }
+ }
+
+ if (io_requested_in_camera==false) {
+ eprintk("%s reset pin(%d) init failed" ,gpio_res->dev_name,camera_reset);
+ goto _rk_sensor_io_init_end_;
+ } else {
+ ret =0;
+ }
+ }
+
+ gpio_res->gpio_init |= RK29_CAM_RESETACTIVE_MASK;
+ gpio_set_value(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
+ gpio_direction_output(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
+
+ dprintk("%s reset pin(%d) init success(0x%x)" ,gpio_res->dev_name,camera_reset,((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));
+
+ }
+
+ if (camera_powerdown != INVALID_GPIO) {
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_powerdown = %x\n", camera_powerdown );
+
+ camera_powerdown = of_get_named_gpio_flags(of_node,"rockchip,powerdown",0,&flags);/*yzm*/
+ gpio_res->gpio_powerdown = camera_powerdown;/*yzm information back to the IO*/
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$/ camera_powerdown = %x\n", camera_powerdown );
+ ret = gpio_request(camera_powerdown, "camera powerdown");
+ if (ret) {
+ io_requested_in_camera = false;
+
+ if (io_requested_in_camera==false) {
+
+ new_camera = new_camera_head;
+ while (new_camera != NULL) {
+ io_res = &new_camera->io;
+ if (io_res->gpio_init & RK29_CAM_POWERDNACTIVE_MASK) {
+ if (io_res->gpio_powerdown == camera_powerdown)
+ io_requested_in_camera = true;
+ }
+ new_camera = new_camera->next_camera;
+ }
+ }
+
+ if (io_requested_in_camera==false) {
+ eprintk("%s powerdown pin(%d) init failed",gpio_res->dev_name,camera_powerdown);
+ goto _rk_sensor_io_init_end_;
+ } else {
+ ret =0;
+ }
+ }
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s(),iomux is ok\n", __FILE__, __LINE__,__FUNCTION__);
+
+ gpio_res->gpio_init |= RK29_CAM_POWERDNACTIVE_MASK;
+ gpio_set_value(camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+ gpio_direction_output(camera_powerdown, ((camera_ioflag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+
+ dprintk("%s powerdown pin(%d) init success(0x%x)" ,gpio_res->dev_name,camera_powerdown,((camera_ioflag&RK29_CAM_POWERDNACTIVE_BITPOS)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+
+ }
+
+ if (camera_flash != INVALID_GPIO) {
+
+ camera_flash = of_get_named_gpio_flags(of_node,"rockchip,flash",0,&flags);/*yzm*/
+ gpio_res->gpio_flash = camera_flash;/*yzm information back to the IO*/
+ ret = gpio_request(camera_flash, "camera flash");
+ if (ret) {
+ io_requested_in_camera = false;
+
+ if (io_requested_in_camera==false) {
+
+ new_camera = new_camera_head;
+ while (new_camera != NULL) {
+ io_res = &new_camera->io;
+ if (io_res->gpio_init & RK29_CAM_POWERDNACTIVE_MASK) {
+ if (io_res->gpio_powerdown == camera_powerdown)
+ io_requested_in_camera = true;
+ }
+ new_camera = new_camera->next_camera;
+ }
+ }
+
+ ret = 0; //ddl@rock-chips.com : flash is only a function, sensor is also run;
+ if (io_requested_in_camera==false) {
+ eprintk("%s flash pin(%d) init failed",gpio_res->dev_name,camera_flash);
+ goto _rk_sensor_io_init_end_;
+ }
+ }
+
+
+
+ gpio_res->gpio_init |= RK29_CAM_FLASHACTIVE_MASK;
+ gpio_set_value(camera_flash, ((~camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS)); // falsh off
+ gpio_direction_output(camera_flash, ((~camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+
+ dprintk("%s flash pin(%d) init success(0x%x)",gpio_res->dev_name, camera_flash,((camera_ioflag&RK29_CAM_FLASHACTIVE_MASK)>>RK29_CAM_FLASHACTIVE_BITPOS));
+
+ }
+
+ if (camera_af != INVALID_GPIO) {
+
+ camera_af = of_get_named_gpio_flags(of_node,"rockchip,af",0,&flags);/*yzm*/
+ gpio_res->gpio_af = camera_af;/*yzm information back to the IO*/
+ ret = gpio_request(camera_af, "camera af");
+ if (ret) {
+ io_requested_in_camera = false;
+
+ if (io_requested_in_camera==false) {
+
+ new_camera = new_camera_head;
+ while (new_camera != NULL) {
+ io_res = &new_camera->io;
+ if (io_res->gpio_init & RK29_CAM_AFACTIVE_MASK) {
+ if (io_res->gpio_af == camera_af)
+ io_requested_in_camera = true;
+ }
+ new_camera = new_camera->next_camera;
+ }
+ }
+
+ if (io_requested_in_camera==false) {
+ eprintk("%s af pin(%d) init failed",gpio_res->dev_name,camera_af);
+ goto _rk_sensor_io_init_end_;
+ } else {
+ ret =0;
+ }
+
+ }
+
+ gpio_res->gpio_init |= RK29_CAM_AFACTIVE_MASK;
+ //gpio_direction_output(camera_af, ((camera_ioflag&RK29_CAM_AFACTIVE_MASK)>>RK29_CAM_AFACTIVE_BITPOS));
+ dprintk("%s af pin(%d) init success",gpio_res->dev_name, camera_af);
+
+ }
+
+
+_rk_sensor_io_init_end_:
+ return ret;
+
+}
+
+static int _rk_sensor_io_deinit_(struct rk29camera_gpio_res *gpio_res)
+{
+ unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
+ unsigned int camera_powerdown = INVALID_GPIO, camera_flash = INVALID_GPIO,camera_af = INVALID_GPIO;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+
+
+ camera_reset = gpio_res->gpio_reset;
+ camera_power = gpio_res->gpio_power;
+ camera_powerdown = gpio_res->gpio_powerdown;
+ camera_flash = gpio_res->gpio_flash;
+ camera_af = gpio_res->gpio_af;
+
+ if (gpio_res->gpio_init & RK29_CAM_POWERACTIVE_MASK) {
+ if (camera_power != INVALID_GPIO) {
+ gpio_direction_input(camera_power);
+ gpio_free(camera_power);
+ }
+ }
+
+ if (gpio_res->gpio_init & RK29_CAM_RESETACTIVE_MASK) {
+ if (camera_reset != INVALID_GPIO) {
+ gpio_direction_input(camera_reset);
+ gpio_free(camera_reset);
+ }
+ }
+
+ if (gpio_res->gpio_init & RK29_CAM_POWERDNACTIVE_MASK) {
+ if (camera_powerdown != INVALID_GPIO) {
+ gpio_direction_input(camera_powerdown);
+ gpio_free(camera_powerdown);
+ }
+ }
+
+ if (gpio_res->gpio_init & RK29_CAM_FLASHACTIVE_MASK) {
+ if (camera_flash != INVALID_GPIO) {
+ gpio_direction_input(camera_flash);
+ gpio_free(camera_flash);
+ }
+ }
+ if (gpio_res->gpio_init & RK29_CAM_AFACTIVE_MASK) {
+ if (camera_af != INVALID_GPIO) {
+ /* gpio_direction_input(camera_af);*/
+ gpio_free(camera_af);
+ }
+ }
+ gpio_res->gpio_init = 0;
+
+ return 0;
+}
+
+static int rk_sensor_io_init(void)
+{
+ static bool is_init = false;
+
+ struct rkcamera_platform_data *new_camera;
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+ if(is_init) {
+ return 0;
+ } else {
+ is_init = true;
+ }
+
+ if (sensor_ioctl_cb.sensor_power_cb == NULL)
+ sensor_ioctl_cb.sensor_power_cb = sensor_power_default_cb;
+ if (sensor_ioctl_cb.sensor_reset_cb == NULL)
+ sensor_ioctl_cb.sensor_reset_cb = sensor_reset_default_cb;
+ if (sensor_ioctl_cb.sensor_powerdown_cb == NULL)
+ sensor_ioctl_cb.sensor_powerdown_cb = sensor_powerdown_default_cb;
+ if (sensor_ioctl_cb.sensor_flash_cb == NULL)
+ sensor_ioctl_cb.sensor_flash_cb = sensor_flash_default_cb;
+ if (sensor_ioctl_cb.sensor_af_cb == NULL)
+ sensor_ioctl_cb.sensor_af_cb = sensor_afpower_default_cb;
+
+ /**********yzm*********/
+ new_camera = new_camera_head;
+ while(new_camera != NULL)
+ {
+ if (_rk_sensor_io_init_(&new_camera->io,new_camera->of_node)<0)
+ _rk_sensor_io_deinit_(&new_camera->io);
+ new_camera = new_camera->next_camera;
+ }
+ return 0;
+}
+
+static int rk_sensor_io_deinit(int sensor)
+{
+ struct rkcamera_platform_data *new_camera;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+
+ new_camera = new_camera_head;
+ while(new_camera != NULL)
+ {
+ _rk_sensor_io_deinit_(&new_camera->io);
+ new_camera = new_camera->next_camera;
+ }
+
+ return 0;
+}
+static int rk_sensor_ioctrl(struct device *dev,enum rk29camera_ioctrl_cmd cmd, int on)
+{
+ struct rk29camera_gpio_res *res = NULL;
+ struct rkcamera_platform_data *new_cam_dev = NULL;
+ struct rk29camera_platform_data* plat_data = &rk_camera_platform_data;
+ int ret = RK29_CAM_IO_SUCCESS,i = 0;
+ struct soc_camera_desc *dev_icl = NULL;/*yzm*/
+ struct rkcamera_platform_data *new_camera;
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+
+ if (res == NULL) {
+ new_camera = new_camera_head;
+ while(new_camera != NULL)
+ {
+ if (strcmp(new_camera->dev_name, dev_name(dev)) == 0) {
+ res = (struct rk29camera_gpio_res *)&new_camera->io;
+ new_cam_dev = &new_camera[i];
+ dev_icl = &new_camera->dev.desc_info;/*yzm*/
+ break;
+ }
+ new_camera = new_camera->next_camera;;
+ }
+ }
+
+ if (res == NULL) {
+ eprintk("%s is not regisiterd in rk29_camera_platform_data!!",dev_name(dev));
+ ret = RK29_CAM_EIO_INVALID;
+ goto rk_sensor_ioctrl_end;
+ }
+
+ switch (cmd)
+ {
+ case Cam_Power:
+ {
+ if (sensor_ioctl_cb.sensor_power_cb) {
+ ret = sensor_ioctl_cb.sensor_power_cb(res, on);
+ ret = (ret != RK29_CAM_EIO_INVALID)?ret:0; /* ddl@rock-chips.com: v0.1.1 */
+ } else {
+ eprintk("sensor_ioctl_cb.sensor_power_cb is NULL");
+ WARN_ON(1);
+ }
+
+ printk("ret: %d\n",ret);
+ break;
+ }
+ case Cam_Reset:
+ {
+ if (sensor_ioctl_cb.sensor_reset_cb) {
+ ret = sensor_ioctl_cb.sensor_reset_cb(res, on);
+
+ ret = (ret != RK29_CAM_EIO_INVALID)?ret:0;
+ } else {
+ eprintk( "sensor_ioctl_cb.sensor_reset_cb is NULL");
+ WARN_ON(1);
+ }
+ break;
+ }
+
+ case Cam_PowerDown:
+ {
+ if (sensor_ioctl_cb.sensor_powerdown_cb) {
+ ret = sensor_ioctl_cb.sensor_powerdown_cb(res, on);
+ } else {
+ eprintk( "sensor_ioctl_cb.sensor_powerdown_cb is NULL");
+ WARN_ON(1);
+ }
+ break;
+ }
+
+ case Cam_Flash:
+ {
+ if (sensor_ioctl_cb.sensor_flash_cb) {
+ ret = sensor_ioctl_cb.sensor_flash_cb(res, on);
+ } else {
+ eprintk( "sensor_ioctl_cb.sensor_flash_cb is NULL!");
+ WARN_ON(1);
+ }
+ break;
+ }
+
+ case Cam_Af:
+ {
+ if (sensor_ioctl_cb.sensor_af_cb) {
+ ret = sensor_ioctl_cb.sensor_af_cb(res, on);
+ } else {
+ eprintk( "sensor_ioctl_cb.sensor_af_cb is NULL!");
+ WARN_ON(1);
+ }
+ break;
+ }
+
+ case Cam_Mclk:
+ {
+ if (plat_data->sensor_mclk && dev_icl) {
+ plat_data->sensor_mclk(dev_icl->host_desc.bus_id,(on!=0)?1:0,on);/*yzm*/
+ } else {
+ eprintk( "%s(%d): sensor_mclk(%p) or dev_icl(%p) is NULL",
+ __FUNCTION__,__LINE__,plat_data->sensor_mclk,dev_icl);
+ }
+ break;
+ }
+
+ default:
+ {
+ eprintk("%s cmd(0x%x) is unknown!",__FUNCTION__, cmd);
+ break;
+ }
+ }
+rk_sensor_ioctrl_end:
+ return ret;
+}
+
+static int rk_sensor_pwrseq(struct device *dev,int powerup_sequence, int on, int mclk_rate)
+{
+ int ret =0;
+ int i,powerup_type;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+
+ for (i=0; i<8; i++) {
+
+ if (on == 1)
+ powerup_type = SENSOR_PWRSEQ_GET(powerup_sequence,i);
+ else
+ powerup_type = SENSOR_PWRSEQ_GET(powerup_sequence,(7-i));
+
+ switch (powerup_type)
+ {
+ case SENSOR_PWRSEQ_AVDD:
+ case SENSOR_PWRSEQ_DOVDD:
+ case SENSOR_PWRSEQ_DVDD:
+ case SENSOR_PWRSEQ_PWR:
+ {
+ ret = rk_sensor_ioctrl(dev,Cam_Power, on);
+ if (ret<0) {
+ eprintk("SENSOR_PWRSEQ_PWR failed");
+ } else {
+ msleep(10);
+ dprintk("SensorPwrSeq-power: %d",on);
+ }
+ break;
+ }
+
+ case SENSOR_PWRSEQ_HWRST:
+ {
+ if(!on){
+ rk_sensor_ioctrl(dev,Cam_Reset, 1);
+ }else{
+ ret = rk_sensor_ioctrl(dev,Cam_Reset, 1);
+ msleep(2);
+ ret |= rk_sensor_ioctrl(dev,Cam_Reset, 0);
+ }
+ if (ret<0) {
+ eprintk("SENSOR_PWRSEQ_HWRST failed");
+ } else {
+ dprintk("SensorPwrSeq-reset: %d",on);
+ }
+ break;
+ }
+
+ case SENSOR_PWRSEQ_PWRDN:
+ {
+ ret = rk_sensor_ioctrl(dev,Cam_PowerDown, !on);
+ if (ret<0) {
+ eprintk("SENSOR_PWRSEQ_PWRDN failed");
+ } else {
+ dprintk("SensorPwrSeq-power down: %d",!on);
+ }
+ break;
+ }
+
+ case SENSOR_PWRSEQ_CLKIN:
+ {
+ ret = rk_sensor_ioctrl(dev,Cam_Mclk, (on?mclk_rate:on));
+ if (ret<0) {
+ eprintk("SENSOR_PWRSEQ_CLKIN failed");
+ } else {
+ dprintk("SensorPwrSeq-clock: %d",on);
+ }
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ }
+
+ return ret;
+}
+
+static int rk_sensor_power(struct device *dev, int on) /*icd->pdev*/
+{
+ int powerup_sequence,mclk_rate;
+
+ struct rk29camera_platform_data* plat_data = &rk_camera_platform_data;
+ struct rk29camera_gpio_res *dev_io = NULL;
+ struct rkcamera_platform_data *new_camera=NULL, *new_device=NULL;
+ bool real_pwroff = true;
+ int ret = 0;
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+ new_camera = plat_data->register_dev_new; /*new_camera[]*/
+
+ while (new_camera != NULL) {
+
+ if (new_camera->io.gpio_powerdown != INVALID_GPIO) {
+ gpio_direction_output(new_camera->io.gpio_powerdown,
+ ((new_camera->io.gpio_flag&RK29_CAM_POWERDNACTIVE_MASK)>>RK29_CAM_POWERDNACTIVE_BITPOS));
+ }
+
+ debug_printk( "new_camera->dev_name= %s \n", new_camera->dev_name); /*yzm*/
+ debug_printk( "dev_name(dev)= %s \n", dev_name(dev)); /*yzm*/
+
+ if (strcmp(new_camera->dev_name,dev_name(dev))) {
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);
+ if (sensor_ioctl_cb.sensor_powerdown_cb && on)
+ {
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);
+ sensor_ioctl_cb.sensor_powerdown_cb(&new_camera->io,1);
+ }
+ } else {
+ new_device = new_camera;
+ dev_io = &new_camera->io;
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);/*yzm*/
+ if (!Sensor_Support_DirectResume(new_camera->pwdn_info))
+ real_pwroff = true;
+ else
+ real_pwroff = false;
+ }
+ new_camera = new_camera->next_camera;
+ }
+
+ if (new_device != NULL) {
+ powerup_sequence = new_device->powerup_sequence;
+ if ((new_device->mclk_rate == 24) || (new_device->mclk_rate == 48))
+ mclk_rate = new_device->mclk_rate*1000000;
+ else
+ mclk_rate = 24000000;
+ } else {
+ powerup_sequence = sensor_PWRSEQ_DEFAULT;
+ mclk_rate = 24000000;
+ }
+
+ if (on) {
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i\n", __FILE__, __LINE__);
+ rk_sensor_pwrseq(dev, powerup_sequence, on,mclk_rate);
+ } else {
+ if (real_pwroff) {
+ if (rk_sensor_pwrseq(dev, powerup_sequence, on,mclk_rate)<0) /* ddl@rock-chips.com: v0.1.5 */
+ goto PowerDown;
+
+ /*ddl@rock-chips.com: all power down switch to Hi-Z after power off*/
+ new_camera = plat_data->register_dev_new;
+ while (new_camera != NULL) {
+ if (new_camera->io.gpio_powerdown != INVALID_GPIO) {
+ gpio_direction_input(new_camera->io.gpio_powerdown);
+ }
+ new_camera->pwdn_info |= 0x01;
+ new_camera = new_camera->next_camera;
+ }
+ } else {
+PowerDown:
+ rk_sensor_ioctrl(dev,Cam_PowerDown, !on);
+
+ rk_sensor_ioctrl(dev,Cam_Mclk, 0);
+ }
+
+ mdelay(10);/* ddl@rock-chips.com: v0.1.3 */
+ }
+ return ret;
+}
+#if 0
+static int rk_sensor_reset(struct device *dev)
+{
+#if 0
+ rk_sensor_ioctrl(dev,Cam_Reset,1);
+ msleep(2);
+ rk_sensor_ioctrl(dev,Cam_Reset,0);
+#else
+ /*
+ *ddl@rock-chips.com : the rest function invalidate, because this operate is put together in rk_sensor_power;
+ */
+#endif
+ return 0;
+}
+#endif
+static int rk_sensor_powerdown(struct device *dev, int on)
+{
+
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()/n", __FILE__, __LINE__,__FUNCTION__);
+
+ return rk_sensor_ioctrl(dev,Cam_PowerDown,on);
+}
+
+int rk_sensor_register(void)
+{
+ int i;
+ struct rkcamera_platform_data *new_camera;
+
+ i = 0;
+ debug_printk( "/$$$$$$$$$$$$$$$$$$$$$$//n Here I am: %s:%i-------%s()\n", __FILE__, __LINE__,__FUNCTION__);
+
+ new_camera = new_camera_head;
+
+ while (new_camera != NULL) {
+ if (new_camera->dev.i2c_cam_info.addr == INVALID_VALUE) {
+ WARN(1,
+ KERN_ERR "%s(%d): new_camera[%d] i2c addr is invalidate!",
+ __FUNCTION__,__LINE__,i);
+ continue;
+ }
+ sprintf(new_camera->dev_name,"%s_%d",new_camera->dev.device_info.dev.init_name,i+3);
+ new_camera->dev.device_info.dev.init_name =(const char*)&new_camera->dev_name[0];
+ new_camera->io.dev_name =(const char*)&new_camera->dev_name[0];
+ if (new_camera->orientation == INVALID_VALUE) {
+ if (strstr(new_camera->dev_name,"back")) {
+ new_camera->orientation = 90;
+ } else {
+ new_camera->orientation = 270;
+ }
+ }
+ /* ddl@rock-chips.com: v0.1.3 */
+ if ((new_camera->fov_h <= 0) || (new_camera->fov_h>360))
+ new_camera->fov_h = 100;
+
+ if ((new_camera->fov_v <= 0) || (new_camera->fov_v>360))
+ new_camera->fov_v = 100;
+
+ new_camera->dev.desc_info.subdev_desc.power = rk_sensor_power;
+ new_camera->dev.desc_info.subdev_desc.powerdown = rk_sensor_powerdown;
+ new_camera->dev.desc_info.host_desc.board_info =&new_camera->dev.i2c_cam_info;
+
+ new_camera->dev.device_info.id = i+6;
+ new_camera->dev.device_info.dev.platform_data = &new_camera->dev.desc_info;
+ new_camera->dev.desc_info.subdev_desc.drv_priv = &rk_camera_platform_data;
+
+ platform_device_register(&(new_camera->dev.device_info));
+ i++;
+ new_camera = new_camera->next_camera;
+ }
+
+ return 0;
+}
+#include "../../../drivers/media/video/rk30_camera.c"