--- /dev/null
+#include <linux/videodev2.h>
+#include <linux/i2c.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/cdev.h>
+#include <linux/uaccess.h>
+#include <linux/fs.h>
+#include <asm/atomic.h>
+#include <linux/xlog.h>
+
+#include "kd_camera_hw.h"
+
+#include "kd_imgsensor.h"
+#include "kd_imgsensor_define.h"
+#include "kd_camera_feature.h"
+
+/******************************************************************************
+ * Debug configuration
+******************************************************************************/
+#define PFX "[kd_camera_hw]"
+#define PK_DBG_NONE(fmt, arg...) do {} while (0)
+#define PK_DBG_FUNC(fmt, arg...) xlog_printk(ANDROID_LOG_INFO, PFX , fmt, ##arg)
+
+#define DEBUG_CAMERA_HW_K
+#ifdef DEBUG_CAMERA_HW_K
+#define PK_DBG PK_DBG_FUNC
+#define PK_ERR(fmt, arg...) xlog_printk(ANDROID_LOG_ERR, PFX , fmt, ##arg)
+#define PK_XLOG_INFO(fmt, args...) \
+ do { \
+ xlog_printk(ANDROID_LOG_INFO, PFX , fmt, ##arg); \
+ } while(0)
+#else
+#define PK_DBG(a,...)
+#define PK_ERR(a,...)
+#define PK_XLOG_INFO(fmt, args...)
+#endif
+
+
+
+int kdCISModulePowerOn(CAMERA_DUAL_CAMERA_SENSOR_ENUM SensorIdx, char *currSensorName, BOOL On, char* mode_name)
+{
+#if !defined (MTK_ALPS_BOX_SUPPORT)
+
+u32 pinSetIdx = 0;//default main sensor
+
+#define IDX_PS_CMRST 0
+#define IDX_PS_CMPDN 4
+
+#define IDX_PS_MODE 1
+#define IDX_PS_ON 2
+#define IDX_PS_OFF 3
+
+
+u32 pinSet[2][8] = {
+ //for main sensor
+ {GPIO_CAMERA_CMRST_PIN,
+ GPIO_CAMERA_CMRST_PIN_M_GPIO, /* mode */
+ GPIO_OUT_ONE, /* ON state */
+ GPIO_OUT_ZERO, /* OFF state */
+ GPIO_CAMERA_CMPDN_PIN,
+ GPIO_CAMERA_CMPDN_PIN_M_GPIO,
+ GPIO_OUT_ONE,
+ GPIO_OUT_ZERO,
+ },
+ //for sub sensor
+ {GPIO_CAMERA_CMRST1_PIN,
+ GPIO_CAMERA_CMRST1_PIN_M_GPIO,
+ GPIO_OUT_ONE,
+ GPIO_OUT_ZERO,
+ GPIO_CAMERA_CMPDN1_PIN,
+ GPIO_CAMERA_CMPDN1_PIN_M_GPIO,
+ GPIO_OUT_ONE,
+ GPIO_OUT_ZERO,
+ },
+ };
+
+
+
+
+
+
+
+ if (DUAL_CAMERA_MAIN_SENSOR == SensorIdx){
+ pinSetIdx = 0;
+ }
+ else if (DUAL_CAMERA_SUB_SENSOR == SensorIdx) {
+ pinSetIdx = 1;
+ }
+
+
+ //power ON
+ if (On) {
+
+ PK_DBG("kdCISModulePowerOn -on:currSensorName=%s;\n",currSensorName);
+ PK_DBG("kdCISModulePowerOn -on:pinSetIdx=%d\n",pinSetIdx);
+
+ if ((pinSetIdx==0) && currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV5647_RAW, currSensorName)))
+ {
+ //enable active sensor
+ if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
+ //RST pin,active low
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}
+ mdelay(5);
+
+ //PDN pin,high
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_ON])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}
+ mdelay(5);
+ }
+
+ //DOVDD
+ PK_DBG("[ON_general 1.8V]sensorIdx:%d \n",SensorIdx);
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable D2 power\n");
+ //return -EIO;
+ //goto _kdCISModulePowerOn_exit_;
+ }
+ mdelay(5);
+
+ //AVDD
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable A power\n");
+ //return -EIO;
+ //goto _kdCISModulePowerOn_exit_;
+ }
+ mdelay(5);
+
+ //DVDD
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1500,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable D power\n");
+ //return -EIO;
+ //goto _kdCISModulePowerOn_exit_;
+ }
+ mdelay(5);
+
+ //AF_VCC
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable A2 power\n");
+ //return -EIO;
+ goto _kdCISModulePowerOn_exit_;
+ }
+ mdelay(5);
+
+ //enable active sensor
+ if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
+ //RST pin
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_ON])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}
+ mdelay(5);
+
+ //PDN pin
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}
+ mdelay(5);
+ }
+#if 0
+ while(1){
+
+ mdelay(2000);
+ PK_DBG("im sleep ...\n");
+ }
+#endif
+#if 1
+ //disable inactive sensor
+ if(pinSetIdx == 0 || pinSetIdx == 2) {//disable sub
+ if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST]) {
+ if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor
+ if(mt_set_gpio_out(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module
+ }
+ }
+ else {
+ if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) {
+ if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor
+ if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module
+ }
+ }
+#endif
+ }
+ else if (currSensorName && (0 == strcmp(SENSOR_DRVNAME_OV2659_YUV, currSensorName)))
+ {
+ //enable active sensor
+ if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
+ //RST pin,active low
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}
+ mdelay(5);
+
+ //PDN pin,high
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_ON])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}
+ mdelay(5);
+ }
+
+ //DOVDD
+ PK_DBG("[ON_general 1.8V]sensorIdx:%d \n",SensorIdx);
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D2, VOL_1800,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");
+ //return -EIO;
+ //goto _kdCISModulePowerOn_exit_;
+ }
+ mdelay(5);
+
+ //AVDD
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A, VOL_2800,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");
+ //return -EIO;
+ //goto _kdCISModulePowerOn_exit_;
+ }
+ mdelay(5);
+
+ //DVDD
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_D, VOL_1500,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n");
+ //return -EIO;
+ //goto _kdCISModulePowerOn_exit_;
+ }
+ mdelay(5);
+
+ #if 0
+ // AF_VCC
+ if(TRUE != hwPowerOn(CAMERA_POWER_VCAM_A2, VOL_2800,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to enable analog power\n");
+ //return -EIO;
+ goto _kdCISModulePowerOn_exit_;
+ }
+ #endif
+
+ //enable active sensor
+ if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
+ //RST pin
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_ON])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");}
+ mdelay(5);
+
+ //PDN pin
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");}
+ mdelay(5);
+ }
+
+
+ //disable inactive sensor
+ if(pinSetIdx == 0 || pinSetIdx == 2) {//disable sub
+ if (GPIO_CAMERA_INVALID != pinSet[1][IDX_PS_CMRST]) {
+ if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_mode(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[1][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[1][IDX_PS_CMRST],pinSet[1][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor
+ if(mt_set_gpio_out(pinSet[1][IDX_PS_CMPDN],pinSet[1][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module
+ }
+ }
+ else {
+ if (GPIO_CAMERA_INVALID != pinSet[0][IDX_PS_CMRST]) {
+ if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_mode(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[0][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[0][IDX_PS_CMRST],pinSet[0][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor
+ if(mt_set_gpio_out(pinSet[0][IDX_PS_CMPDN],pinSet[0][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module
+ }
+ }
+
+
+ }
+ }
+ else {//power OFF
+
+ //PK_DBG("[OFF]sensorIdx:%d \n",SensorIdx);
+ if (GPIO_CAMERA_INVALID != pinSet[pinSetIdx][IDX_PS_CMRST]) {
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_MODE])){PK_DBG("[CAMERA SENSOR] set gpio mode failed!! \n");}
+ if(mt_set_gpio_mode(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_MODE])){PK_DBG("[CAMERA LENS] set gpio mode failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMRST],GPIO_DIR_OUT)){PK_DBG("[CAMERA SENSOR] set gpio dir failed!! \n");}
+ if(mt_set_gpio_dir(pinSet[pinSetIdx][IDX_PS_CMPDN],GPIO_DIR_OUT)){PK_DBG("[CAMERA LENS] set gpio dir failed!! \n");}
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMRST],pinSet[pinSetIdx][IDX_PS_CMRST+IDX_PS_OFF])){PK_DBG("[CAMERA SENSOR] set gpio failed!! \n");} //low == reset sensor
+ if(mt_set_gpio_out(pinSet[pinSetIdx][IDX_PS_CMPDN],pinSet[pinSetIdx][IDX_PS_CMPDN+IDX_PS_OFF])){PK_DBG("[CAMERA LENS] set gpio failed!! \n");} //high == power down lens module
+ }
+
+ if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_A,mode_name)) {
+ PK_DBG("[CAMERA SENSOR] Fail to OFF a power\n");
+ }
+ if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_A2,mode_name)){
+ PK_DBG("[CAMERA SENSOR] Fail to OFF a2 power\n");
+ }
+ if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D, mode_name)) {
+ PK_DBG("[CAMERA SENSOR] Fail to OFF d digital power\n");
+ }
+ if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D2,mode_name))
+ {
+ PK_DBG("[CAMERA SENSOR] Fail to OFF d2 digital power\n");
+ }
+ }//
+
+#endif /* end of defined MTK_ALPS_BOX_SUPPORT */
+
+ return 0;
+
+_kdCISModulePowerOn_exit_:
+ return -EIO;
+}
+
+EXPORT_SYMBOL(kdCISModulePowerOn);
+
+
+//!--
+//
+
+
+
+