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