From 854c43f0aca27b4523c6e66146bb90ef1b97bf72 Mon Sep 17 00:00:00 2001 From: ddl Date: Thu, 2 Sep 2010 10:52:43 +0800 Subject: [PATCH] camera:add sensor power and reset active level configuration --- arch/arm/mach-rk2818/board-infosdk.c | 44 ++++++---- arch/arm/mach-rk2818/board-raho.c | 84 +++++++++++-------- .../mach-rk2818/include/mach/rk2818_camera.h | 10 +++ 3 files changed, 91 insertions(+), 47 deletions(-) mode change 100755 => 100644 arch/arm/mach-rk2818/board-infosdk.c mode change 100755 => 100644 arch/arm/mach-rk2818/board-raho.c diff --git a/arch/arm/mach-rk2818/board-infosdk.c b/arch/arm/mach-rk2818/board-infosdk.c old mode 100755 new mode 100644 index c432f6c9e8ab..a8f6471b6b8b --- a/arch/arm/mach-rk2818/board-infosdk.c +++ b/arch/arm/mach-rk2818/board-infosdk.c @@ -625,6 +625,7 @@ struct rk28camera_platform_data rk28_camera_platform_data = { { .gpio_reset = RK2818_CAM_RESET_PIN, .gpio_power = RK2818_CAM_POWER_PIN, + .gpio_flag = (RK28_CAM_POWERACTIVE_L|RK28_CAM_RESETACTIVE_L), .dev_name = "ov2655" }, { .gpio_reset = INVALID_GPIO, @@ -638,20 +639,24 @@ static int rk28_sensor_io_init(void) { int ret = 0, i; unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; - - printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); + unsigned int camera_ioflag; + //printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); for (i=0; i<2; i++) { camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset; camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; + camera_ioflag = rk28_camera_platform_data.gpio_res[i].gpio_flag; if (camera_power != INVALID_GPIO) { ret = gpio_request(camera_power, "camera power"); if (ret) continue; - gpio_set_value(camera_reset, 1); - gpio_direction_output(camera_power, 0); + gpio_set_value(camera_reset, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + gpio_direction_output(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + + //printk("\n%s....%d %x ******** ddl *********\n",__FUNCTION__,__LINE__,(((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + } if (camera_reset != INVALID_GPIO) { @@ -663,8 +668,11 @@ static int rk28_sensor_io_init(void) continue; } - gpio_set_value(camera_reset, 0); - gpio_direction_output(camera_reset, 0); + gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + gpio_direction_output(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + + //printk("\n%s....%d %x ******** ddl *********\n",__FUNCTION__,__LINE__,((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + } } @@ -676,7 +684,7 @@ static int rk28_sensor_io_deinit(void) unsigned int i; unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; - printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); + //printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); for (i=0; i<2; i++) { camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset; @@ -700,27 +708,35 @@ static int rk28_sensor_io_deinit(void) static int rk28_sensor_power(struct device *dev, int on) { unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; + unsigned int camera_ioflag; if(rk28_camera_platform_data.gpio_res[0].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) { camera_reset = rk28_camera_platform_data.gpio_res[0].gpio_reset; camera_power = rk28_camera_platform_data.gpio_res[0].gpio_power; + camera_ioflag = rk28_camera_platform_data.gpio_res[0].gpio_flag; } else if (rk28_camera_platform_data.gpio_res[1].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[1].dev_name, dev_name(dev)) == 0)) { camera_reset = rk28_camera_platform_data.gpio_res[1].gpio_reset; camera_power = rk28_camera_platform_data.gpio_res[1].gpio_power; + camera_ioflag = rk28_camera_platform_data.gpio_res[1].gpio_flag; } if (camera_reset != INVALID_GPIO) { - gpio_set_value(camera_reset, !on); - //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, on); + gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); } if (camera_power != INVALID_GPIO) { - gpio_set_value(camera_power, !on); - printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, !on); - } + if (on) { + gpio_set_value(camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + } else { + gpio_set_value(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + } + } if (camera_reset != INVALID_GPIO) { msleep(3); /* delay 3 ms */ - gpio_set_value(camera_reset,on); - printk("\n%s..%s..ResetPin= %d..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, on); + gpio_set_value(camera_reset,(((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + //printk("\n%s..%s..ResetPin= %d..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, (((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); } return 0; } diff --git a/arch/arm/mach-rk2818/board-raho.c b/arch/arm/mach-rk2818/board-raho.c old mode 100755 new mode 100644 index e2bbc9e20a4d..718ec875aea3 --- a/arch/arm/mach-rk2818/board-raho.c +++ b/arch/arm/mach-rk2818/board-raho.c @@ -731,8 +731,9 @@ static struct i2c_board_info __initdata board_i2c3_devices[] = { * camera devices * author: ddl@rock-chips.com *****************************************************************************************/ +#ifdef CONFIG_VIDEO_RK2818 #define RK2818_CAM_POWER_PIN FPGA_PIO1_05//SPI_GPIO_P1_05 -#define RK2818_CAM_RESET_PIN FPGA_PIO1_14//SPI_GPIO_P1_14 +#define RK2818_CAM_RESET_PIN FPGA_PIO1_14//SPI_GPIO_P1_14 static int rk28_sensor_io_init(void); static int rk28_sensor_io_deinit(void); @@ -744,6 +745,7 @@ struct rk28camera_platform_data rk28_camera_platform_data = { { .gpio_reset = RK2818_CAM_RESET_PIN, .gpio_power = RK2818_CAM_POWER_PIN, + .gpio_flag = (RK28_CAM_POWERACTIVE_L|RK28_CAM_RESETACTIVE_L), .dev_name = "ov2655" }, { .gpio_reset = INVALID_GPIO, @@ -757,36 +759,42 @@ static int rk28_sensor_io_init(void) { int ret = 0, i; unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; + unsigned int camera_ioflag; - printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); - - for (i=0; i<2; i++) { + //printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); + + for (i=0; i<2; i++) { camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset; - camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; - - if (camera_power != INVALID_GPIO) { + camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; + camera_ioflag = rk28_camera_platform_data.gpio_res[i].gpio_flag; + + if (camera_power != INVALID_GPIO) { ret = gpio_request(camera_power, "camera power"); if (ret) continue; - - gpio_set_value(camera_reset, 1); - gpio_direction_output(camera_power, 0); + + gpio_set_value(camera_reset, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + gpio_direction_output(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + + //printk("\n%s....%d %x ******** ddl *********\n",__FUNCTION__,__LINE__,(((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); } - + if (camera_reset != INVALID_GPIO) { ret = gpio_request(camera_reset, "camera reset"); if (ret) { - if (camera_power != INVALID_GPIO) - gpio_free(camera_power); + if (camera_power != INVALID_GPIO) + gpio_free(camera_power); continue; } - gpio_set_value(camera_reset, 0); - gpio_direction_output(camera_reset, 0); + gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + gpio_direction_output(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + + //printk("\n%s....%d %x ******** ddl *********\n",__FUNCTION__,__LINE__,((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); } } - + return 0; } @@ -795,20 +803,20 @@ static int rk28_sensor_io_deinit(void) unsigned int i; unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; - printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); - - for (i=0; i<2; i++) { + //printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); + + for (i=0; i<2; i++) { camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset; - camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; - + camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; + if (camera_power != INVALID_GPIO){ gpio_direction_input(camera_power); - gpio_free(camera_power); + gpio_free(camera_power); } - + if (camera_reset != INVALID_GPIO) { gpio_direction_input(camera_reset); - gpio_free(camera_reset); + gpio_free(camera_reset); } } @@ -819,28 +827,37 @@ static int rk28_sensor_io_deinit(void) static int rk28_sensor_power(struct device *dev, int on) { unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; - + unsigned int camera_ioflag; + if(rk28_camera_platform_data.gpio_res[0].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) { camera_reset = rk28_camera_platform_data.gpio_res[0].gpio_reset; camera_power = rk28_camera_platform_data.gpio_res[0].gpio_power; + camera_ioflag = rk28_camera_platform_data.gpio_res[0].gpio_flag; } else if (rk28_camera_platform_data.gpio_res[1].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[1].dev_name, dev_name(dev)) == 0)) { camera_reset = rk28_camera_platform_data.gpio_res[1].gpio_reset; camera_power = rk28_camera_platform_data.gpio_res[1].gpio_power; + camera_ioflag = rk28_camera_platform_data.gpio_res[1].gpio_flag; } if (camera_reset != INVALID_GPIO) { - gpio_set_value(camera_reset, !on); - //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, on); + gpio_set_value(camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, ((camera_ioflag&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); } - if (camera_power != INVALID_GPIO) { - gpio_set_value(camera_power, !on); - printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, !on); + if (camera_power != INVALID_GPIO) { + if (on) { + gpio_set_value(camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, ((camera_ioflag&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + } else { + gpio_set_value(camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, (((~camera_ioflag)&RK28_CAM_POWERACTIVE_MASK)>>RK28_CAM_POWERACTIVE_BITPOS)); + } + } if (camera_reset != INVALID_GPIO) { msleep(3); /* delay 3 ms */ - gpio_set_value(camera_reset,on); - printk("\n%s..%s..ResetPin= %d..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, on); - } + gpio_set_value(camera_reset,(((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + //printk("\n%s..%s..ResetPin= %d..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, (((~camera_ioflag)&RK28_CAM_RESETACTIVE_MASK)>>RK28_CAM_RESETACTIVE_BITPOS)); + } return 0; } @@ -863,6 +880,7 @@ struct soc_camera_link rk2818_iclink = { .module_name = "ov2655", #endif }; +#endif /***************************************************************************************** * battery devices diff --git a/arch/arm/mach-rk2818/include/mach/rk2818_camera.h b/arch/arm/mach-rk2818/include/mach/rk2818_camera.h index c9d0d4a262b6..3547f72c41cd 100755 --- a/arch/arm/mach-rk2818/include/mach/rk2818_camera.h +++ b/arch/arm/mach-rk2818/include/mach/rk2818_camera.h @@ -26,6 +26,16 @@ #define RK28_CAM_DRV_NAME "rk2818-camera" #define RK28_CAM_PLATFORM_DEV_ID 33 +#define RK28_CAM_POWERACTIVE_BITPOS 0x00 +#define RK28_CAM_POWERACTIVE_MASK (1<