import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / arm / mach-mt8127 / tcl8127_tb_c_l / camera / camera / kd_camera_hw.c
diff --git a/arch/arm/mach-mt8127/tcl8127_tb_c_l/camera/camera/kd_camera_hw.c b/arch/arm/mach-mt8127/tcl8127_tb_c_l/camera/camera/kd_camera_hw.c
new file mode 100644 (file)
index 0000000..6351255
--- /dev/null
@@ -0,0 +1,335 @@
+#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);
+
+
+//!--
+//
+
+
+
+