[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit

Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/boot/common/src/uboot/drivers/i2c/i2c.c b/boot/common/src/uboot/drivers/i2c/i2c.c
new file mode 100644
index 0000000..83ebd5c
--- /dev/null
+++ b/boot/common/src/uboot/drivers/i2c/i2c.c
@@ -0,0 +1,585 @@
+/*  
+ * (C) Copyright 2016, ZIXC Corporation.
+ *
+ */
+
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <asm/io.h> 
+#include <i2c.h> 
+#include <drvs_gpio.h>
+#include <asm/arch/i2c.h> 
+#include <asm/arch/hardware.h>
+#include <asm/arch/uart.h>
+#include <asm/arch/lsp_crpm.h>
+#include <config.h>
+
+
+
+T_I2C_Regs *p_i2c_reg[2] = {NULL};
+static uint retries = 3;            /* ÖØ¸´²Ù×÷´ÎÊý */
+
+#define REG32(x)			    (*(volatile u32*)(x))
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: 1. ÔÚ100KHZƵÂÊÏ£¬Ê¹Óà zDrvI2c_DevRead_ByteStream ¶Á 32 ×Ö½Úʱ£¬(ÔÚU207ÊÖ»úÉÏ)
+                                                           Ô¼ÏûºÄ tempTimeOut = 600
+           2. ÓÉÓÚCPUƵÂʲ»¶¨£¬bsp_udelayº¯ÊýÑÓʱ²»Ì«Çå³þ£¬¹ÊʹÓôó²ÎÊý
+                                                           tempTimeOut = 0x20000;
+ ********************************************************************************/
+ static int i2c_WaitTransferOver( T_I2C_Regs *i2c_reg )
+{
+    uint tempTimeOut = 0x20000;
+    uint tempStatus = 0x0;
+
+    while( tempTimeOut )
+    {
+        tempStatus = i2c_reg->I2C_STATUS;
+        if(tempStatus & 0x1)
+        {
+            break;
+        }
+        else
+        {
+            tempTimeOut--;
+        }
+    }
+    if( 0 == tempTimeOut )
+    {
+        i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+        return DRV_I2C_ERROR_TIMEOUT;       /* ³¬Ê±´íÎó */
+    }
+
+    if (tempStatus & I2C_IRQ_ERR_DEVICE)
+    {
+        i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+        return DRV_I2C_ERROR_DEVICE;        /* Æ÷¼þµØÖ·´«ÊäÆÚ¼äÓдíÎó·¢Éú */
+    }
+    if (tempStatus & I2C_IRQ_ERR_DATA)
+    {
+        i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+        return DRV_I2C_ERROR_DATA;          /* ×ÓµØÖ·´«Êä»òÊý¾Ý´«Êä¹ý³ÌÖÐÓдíÎó·¢Éú */
+    }
+
+    if (tempStatus & I2C_IRQ_TIME_OUT)
+    {
+        i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+        return DRV_I2C_ERROR_TIMEOUTSELF;   /* ³¬Ê±´íÎó */
+    }
+
+    if (tempStatus & I2C_IRQ_TRANS_DONE)
+    {
+        i2c_reg->I2C_STATUS |= I2C_IRQ_ACK;
+        return 0;                 /* Õý³£Íê³É */
+    }
+    return 0;
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: -----------------------------
+ ********************************************************************************/
+ void i2c_Start( T_I2C_Regs *i2c_reg )
+{
+    i2c_reg->CMD |= I2C_CMD_START;     /* ²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä */
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static int i2c_ReadFifoData( T_I2C_Regs *i2c_reg, uchar *read_buf, uint read_len )
+{
+    if( i2c_reg->RXF_STATUS & I2C_RX_FIFO_FULL )
+    {
+        do
+        {
+            *read_buf++ = i2c_reg->DATA;
+        } while( --read_len );
+    }
+    else
+    {
+        return DRV_I2C_RECV_NOT_COMPLETE;
+    }
+    return 0;
+}
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÕâÀïÖ±½ÓÈ϶¨ дµÄ¾ßÌåÊý¾Ý×î´ó¸öÊýΪ 30 £¬ÆäʵÔÚ 8λ¼Ä´æÆ÷ģʽÏÂ×î¶à¿ÉÒÔ 31¸ö
+ ********************************************************************************/
+  void i2c_WriteFifoData( T_I2C_Regs *i2c_reg, uchar *writeBuf, uint writerNum )
+{
+    do
+    {
+        i2c_reg->DATA = *writeBuf++;  /* дÊý¾Ý */
+    }while(--writerNum != 0);
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:   ÔÚÐ´ÕæÕýµÄÊý¾ÝǰдÈë¼Ä´æÆ÷µØÖ·µ½ FIFO
+              1.8λ¼Ä´æÆ÷µØÖ·
+              2.16λ¼Ä´æÆ÷µØÖ·
+ ********************************************************************************/
+ static void i2c_WriteFifoRegAddr( T_I2C_Regs *i2c_reg, ushort reg_addr, uint reg_len )
+{
+    ushort tempRegAddr = 0;
+    if( reg_len == 16 )      // Èç¹ûλ16λ¼Ä´æÆ÷µØÖ·£¬ÏÈд--¸ß8λ--; ºóд -µÍ8λ--
+    {
+            tempRegAddr = reg_addr;
+            i2c_reg->DATA = tempRegAddr >> 8;
+    }
+    i2c_reg->DATA = reg_addr;
+}
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÔÚ¼òµ¥Ð´Ä£Ê½ÏÂ( 8λ¼Ä´æÆ÷ºÍ16λ¼Ä´æÆ÷ )£¬ÉèÖà FifoDepth
+                1.¸´Î» ½ÓÊÕFIFO ºÍ ·¢ËÍFIFO
+                2.ÅжÏÊÇ·ñΪ16λ¼Ä´æÆ÷µØÖ·£¬ÈçÊÇ£¬Ôò writerNum +2;
+                  ²»È»Îª 8 λ¼Ä´æÆ÷µØÖ·£¬            writerNum +1;
+                3.дÈë·¢Ë͸öÊýµ½ÏàÓ¦µÄ¼Ä´æÆ÷¡£
+ ********************************************************************************/
+ static void i2c_SetFifoDepthSimpleWrite( T_I2C_Regs *i2c_reg, uint write_len, uint reg_len )
+{
+    uint tempWriterNum = write_len;
+    //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+    i2c_reg->TXF_CTRL |= I2C_TX_FIFO_RST;
+    i2c_reg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+    if( reg_len == 16 )                 //ʹÓà 16λ¼Ä´æÆ÷µØÖ·
+    {
+        tempWriterNum++;                        //writerNum = writerNum + 2 - 1;                                             //ÕâÀï¼õÈ¥ÁËд¼Ä´æÆ÷ʱÐèÒª½«È¥µÄ 1
+    }
+    i2c_reg->TXF_CTRL = tempWriterNum;
+    i2c_reg->RXF_CTRL = 0;
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static void i2c_SetFifoDepthCombineRead( T_I2C_Regs *i2c_reg, uint read_len, uint reg_len )
+{
+    uint tempWriterNum = 0;
+    //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+    i2c_reg->TXF_CTRL |= I2C_TX_FIFO_RST;
+    i2c_reg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+    if( reg_len == 16 )                   //ʹÓà 16λ¼Ä´æÆ÷µØÖ·
+    {
+        tempWriterNum++;                        //tempWriterNum = tempWriterNum + 2 - 1;
+                                                //ÕâÀï¼õÈ¥ÁËд¼Ä´æÆ÷ʱÐèÒª½«È¥µÄ 1
+    }
+    i2c_reg->TXF_CTRL = tempWriterNum;
+    i2c_reg->RXF_CTRL = --read_len;
+}
+
+/*******************************************************************************
+ * Function:    i2c_SetFifoDepthSimpleRead
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static void i2c_SetFifoDepthSimpleRead( T_I2C_Regs *pi2cReg, uint readNum )
+{
+    //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+    pi2cReg->TXF_CTRL |= I2C_TX_FIFO_RST;
+    pi2cReg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+    pi2cReg->TXF_CTRL = 0;
+    pi2cReg->RXF_CTRL = --readNum;
+}
+
+/*******************************************************************************
+ * Function:    i2c_SetFifoDepthSimpleWriteWithoutReg
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:
+ ********************************************************************************/
+ static void i2c_SetFifoDepthSimpleWriteWithoutReg( T_I2C_Regs *pi2cReg, uint writerNum )
+{
+    //¸´Î»WRITE(read)_FIFO_SOFT_RESET
+    pi2cReg->TXF_CTRL |= I2C_TX_FIFO_RST;
+    pi2cReg->RXF_CTRL |= I2C_RX_FIFO_RST;
+
+    pi2cReg->TXF_CTRL = writerNum - 1;
+    pi2cReg->RXF_CTRL = 0;
+}
+
+
+/*******************************************************************************
+ * Function:    i2c_SetFreq
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:      ÉèÖÃi2c×ÜÏߵįµÂÊ£¬CLK = Fref_clk/( (CLK_DIV_FS+1)*4 )
+                Fref_clk = 26M
+               ²ÎÊý:  I2C_FREQ_ONE_HUNDRED_KILO_HZ   100kHz  CLK_DIV_FS = 64
+               ²ÎÊý:  I2C_FREQ_THREE_HUNDRED_KILO_HZ 300kHz  CLK_DIV_FS = 21
+               ²ÎÊý:  I2C_FREQ_FOUR_HUNDRED_KILO_HZ  400kHz  CLK_DIV_FS = 16
+ ********************************************************************************/
+ static void i2c_SetFreq( T_I2C_Regs *pi2cReg, T_ZDrvI2c_BusFreq devFreq )
+{
+    pi2cReg->CMD &= (~I2C_CMD_SPEED_MODE);  /* ʹÓÿìËÙģʽ */
+
+    switch( devFreq )
+    {
+        case I2C_FREQ_ONE_HUNDRED_KILO_HZ:
+            pi2cReg->CLK_DIV_FS = 64;
+            break;
+        case I2C_FREQ_THREE_HUNDRED_KILO_HZ:
+            pi2cReg->CLK_DIV_FS = 21;
+            break;
+        case I2C_FREQ_FOUR_HUNDRED_KILO_HZ:
+            pi2cReg->CLK_DIV_FS = 16;
+            break;
+        default:
+            pi2cReg->CLK_DIV_FS = 64;
+            break;
+    }
+}
+
+/*******************************************************************************
+ * Function:
+ * Description:
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others: ÉèÖÃI2C×ÜÏߵĶÁд·½Ê½£¬ÕâÀïĬÈÏΪÖ÷»úģʽ£¬²»Ê¹ÓÃÖжÏ
+           ·ÖΪ ¼òµ¥Ð´¡¢¼òµ¥¶Á¡¢ ---×éºÏ¶Á--- ÈýÖÖģʽ
+ ********************************************************************************/
+static void i2c_SetMode( T_I2C_Regs *i2c_reg, T_I2C_Mode mode )
+{
+    uint cmd_reg = 0x0;
+
+    cmd_reg |= I2C_IRQ_ACK;            //Çå³ýÖжϼ°ÆäËû´íÎó¼°×´Ì¬
+                                                    /* ÕâÀï·ÀÖ¹Çå³ýÉϴδ«Êä¿ÉÄܲúÉúµÄ´íÎó״̬ */
+    cmd_reg |= I2C_CMD_MS_SEL;             //Ö÷»úģʽ
+    cmd_reg &= (~I2C_CMD_IRQ_EN);          //ÖжÏÇëÇ󹨱Õ;
+
+    switch( mode )
+    {
+        case I2C_SIMPLE_WRITE:                      //²ÉÓüòµ¥Ð´Ä£Ê½
+            cmd_reg &= (~(I2C_CMD_CMB_RW | I2C_CMD_RW));
+            break;
+        case I2C_COMBINE_READ:
+            cmd_reg |= I2C_CMD_CMB_RW;     //---²ÉÓÃ×éºÏ¶Á---
+            cmd_reg &= (~I2C_CMD_RW);      //0:w 1:r
+            break;
+        default:
+            cmd_reg &= (~I2C_CMD_CMB_RW);  //²ÉÓüòµ¥¶Á
+            cmd_reg |= I2C_CMD_RW;
+            break;
+    }
+
+    i2c_reg->CMD = cmd_reg;
+}
+
+
+/*******************************************************************************
+ * Function:
+ * Description: д´Ó»úµØÖ·
+ * Parameters:
+ *   Input:
+ *
+ *   Output:
+ *
+ * Returns:
+ *
+ *
+ * Others:        дÈë´Ó»úµØÖ·£¬ÕâÀïµÄ´Ó»úµØÖ·Ö§³Ö  --7λ--10λ--- ´Ó»úµØÖ·
+                1.7λ´Ó»úµØÖ·£¬²»Ê¹ÄÜ10λµØÖ·£¬Ö±½ÓдÈë´Ó»úµØÖ·¼Ä´æÆ÷¡£¸üе±Ç°×ÜÏߵĴӻúµØÖ·
+                2.10λ´Ó»úµØÖ·£¬Ê¹ÄÜ10λµØÖ·£¬·Ö±ðдÈëÏàÓ¦¼Ä´æÆ÷¡£ ¸üе±Ç°×ÜÏߵĴӻúµØÖ·
+ ********************************************************************************/
+static void i2c_SetSlaveAddress( T_I2C_Regs *i2c_reg, ushort slaveAddr )
+{
+    if( (slaveAddr & 0xf700) == 0 )                 /* 7λ´Ó»úµØÖ· */
+    {
+        i2c_reg->CMD &= (~I2C_CMD_ADDR_MODE);
+        i2c_reg->DEVICE_L = slaveAddr;
+    }
+    else
+    {
+        i2c_reg->CMD |= I2C_CMD_ADDR_MODE;
+        i2c_reg->DEVICE_L = slaveAddr;
+        i2c_reg->DEVICE_H = slaveAddr >> 7;
+    }
+
+}
+
+
+/* ================================================================================
+ *  i2c_read:
+ */
+int i2c_read(uint i2c_bus, ushort slave_addr, ushort reg_addr, uint reg_len,
+                                                    uchar *read_buf, uint read_len)
+{
+	int ret = 0;
+	T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+	do                                  //¿ªÊ¼´«Êä
+	{
+		i2c_SetFreq(i2c_Reg, I2C_FREQ_ONE_HUNDRED_KILO_HZ);			//ÉèÖÃ×ÜÏ߯µÂÊ
+		i2c_SetSlaveAddress(i2c_Reg, slave_addr);                   //д´Ó»úµØÖ·
+		i2c_SetMode(i2c_Reg, I2C_COMBINE_READ);                     //×éºÏ¶Áģʽ
+		i2c_SetFifoDepthCombineRead(i2c_Reg, read_len, reg_len);    //ÉèÖÃFIFOµÄÉî¶È
+		i2c_WriteFifoRegAddr(i2c_Reg, reg_addr, reg_len);           //ÍùFIFOÖÐдÈë¼Ä´æÆ÷µØÖ·
+		i2c_Start(i2c_Reg);                                         //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+		ret = i2c_WaitTransferOver(i2c_Reg);                        //µÈ´ý´«Êä½áÊø
+		if( ret != 0 )
+		{
+			continue;                   //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ­»·²¢ÖØ´«
+		}
+		ret = i2c_ReadFifoData(i2c_Reg, read_buf, read_len );       //¶ÁÈ¡Êý¾Ý
+		if( ret != 0 )
+		{
+			continue;                   //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ­»·²¢ÖØ´«
+		}
+		break;                          //´«Êä³É¹¦£¬Ìø³öÑ­»·
+	} while( --retries != 0 );
+	retries = 3;
+
+	return ret;
+}
+
+/* ================================================================================
+ *  i2c_write:
+ */
+int i2c_write(uint i2c_bus, ushort slave_addr, ushort reg_addr, uint reg_len,
+                                                uchar *write_buf, uint write_len)
+{
+    int ret = 0;
+    T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+    do                                  //¿ªÊ¼´«Êä
+    {
+		i2c_SetFreq(i2c_Reg, I2C_FREQ_ONE_HUNDRED_KILO_HZ);								//ÉèÖÃ×ÜÏ߯µÂÊ
+        i2c_SetSlaveAddress(i2c_Reg, slave_addr);                   //д´Ó»úµØÖ·
+        i2c_SetMode(i2c_Reg, I2C_SIMPLE_WRITE);                     //×éºÏ¶Áģʽ
+        i2c_SetFifoDepthSimpleWrite(i2c_Reg, write_len, reg_len);   //ÉèÖÃFIFOµÄÉî¶È
+        i2c_WriteFifoRegAddr(i2c_Reg, reg_addr, reg_len);           //ÍùFIFOÖÐдÈë¼Ä´æÆ÷µØÖ·
+        i2c_WriteFifoData(i2c_Reg, write_buf, write_len);           //ÍùFIFOдÈëÊý¾Ý
+        i2c_Start(i2c_Reg);                                         //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+        ret = i2c_WaitTransferOver(i2c_Reg);                        //µÈ´ý´«Êä½áÊø
+        if( ret != 0 )
+        {
+            continue;                   //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ­»·²¢ÖØ´«
+        }
+        break;                          //´«Êä³É¹¦£¬Ìø³öÑ­»·
+    } while( --retries != 0 );
+	retries = 3;
+
+    return ret;
+}
+
+/* ================================================================================
+ *  i2c_simple_read:
+ */
+int i2c_simple_read(uint i2c_bus, ushort slave_addr, uchar *read_buf, uint read_len)
+{
+    int ret = 0;
+    T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+    if ( (i2c_Reg == NULL) || (read_buf == NULL) || (read_len > 33))//×î¶àд 32 ¸ö×Ö½Ú
+    {
+        return -1;
+    }
+
+    do                                  //¿ªÊ¼´«Êä
+    {
+		i2c_SetFreq(i2c_Reg, I2C_FREQ_FOUR_HUNDRED_KILO_HZ);								//ÉèÖÃ×ÜÏ߯µÂÊ
+        i2c_SetSlaveAddress(i2c_Reg, slave_addr);                   //д´Ó»úµØÖ·
+        i2c_SetMode(i2c_Reg, I2C_SIMPLE_READ);                     //×éºÏ¶Áģʽ
+        i2c_SetFifoDepthSimpleRead(i2c_Reg, read_len);    //ÉèÖÃFIFOµÄÉî¶È
+        i2c_Start(i2c_Reg);                                         //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+        ret = i2c_WaitTransferOver(i2c_Reg);                        //µÈ´ý´«Êä½áÊø
+        if( ret != 0 )
+        {
+            continue;                   //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ­»·²¢ÖØ´«
+        }
+        ret = i2c_ReadFifoData(i2c_Reg, read_buf, read_len );       //¶ÁÈ¡Êý¾Ý
+        if( ret != 0 )
+        {
+            continue;                   //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ­»·²¢ÖØ´«
+        }
+        break;                          //´«Êä³É¹¦£¬Ìø³öÑ­»·
+    } while( --retries != 0 );
+	retries = 3;
+
+    return ret;
+}
+
+/* ================================================================================
+ *  i2c_simple_write:
+ */
+int i2c_simple_write(uint i2c_bus, ushort slave_addr,uchar *write_buf, uint write_len)
+{
+    int ret = 0;
+    T_I2C_Regs *i2c_Reg = p_i2c_reg[i2c_bus];
+
+    if ( (i2c_Reg == NULL) || (write_buf == NULL) || (write_len > 33))//×î¶àд 32 ¸ö×Ö½Ú
+    {
+        return -1;
+    }
+
+    do                                  //¿ªÊ¼´«Êä
+    {
+		i2c_SetFreq(i2c_Reg, I2C_FREQ_FOUR_HUNDRED_KILO_HZ);								//ÉèÖÃ×ÜÏ߯µÂÊ
+        i2c_SetSlaveAddress(i2c_Reg, slave_addr);                   //д´Ó»úµØÖ·
+        i2c_SetMode(i2c_Reg, I2C_SIMPLE_WRITE);                     //×éºÏ¶Áģʽ
+        i2c_SetFifoDepthSimpleWriteWithoutReg(i2c_Reg, write_len);   //ÉèÖÃFIFOµÄÉî¶È
+        i2c_WriteFifoData(i2c_Reg, write_buf, write_len);           //ÍùFIFOдÈëÊý¾Ý
+        i2c_Start(i2c_Reg);                                         //²úÉú¿ªÊ¼Ìõ¼þ£¬¿ªÊ¼´«Êä
+        ret = i2c_WaitTransferOver(i2c_Reg);                        //µÈ´ý´«Êä½áÊø
+        if( ret != 0 )
+        {
+            continue;                   //´«Êäʧ°Ü£¬½áÊø±¾´ÎÑ­»·²¢ÖØ´«
+        }
+        break;                          //´«Êä³É¹¦£¬Ìø³öÑ­»·
+    } while( --retries != 0 );
+	retries = 3;
+
+    return ret;
+}
+
+/* ================================================================================
+ *  i2c_init:
+ */
+int i2c_init(void)
+{
+	p_i2c_reg[0] = (T_I2C_Regs *)ARM_I2C0_BASE;
+	p_i2c_reg[1] = (T_I2C_Regs *)ARM_I2C1_BASE;
+	/* p_i2c_reg[2] = (T_I2C_Regs *)ARM_PMICI2C_BASE; */
+
+	/* gpio config */
+	//gpio_set_reuse(GPIO_I2C0_CLK, 0x0);
+	zDrvGpio_SetFunc(GPIO43, GPIO43_SCL0);
+	zDrvGpio_SetDirection(GPIO43, GPIO_OUT);
+	//gpio_set_reuse(GPIO_I2C0_DATA, 0x0);
+	zDrvGpio_SetFunc(GPIO44, GPIO44_SDA0);	
+	zDrvGpio_SetDirection(GPIO44, GPIO_OUT);
+	//gpio_set_reuse(GPIO_I2C1_CLK, 0x0);
+	zDrvGpio_SetFunc(GPIO45, GPIO45_SCL1);
+	zDrvGpio_SetDirection(GPIO45, GPIO_OUT);
+	//gpio_set_reuse(GPIO_I2C1_DATA, 0x0);
+	zDrvGpio_SetFunc(GPIO46, GPIO46_SDA1);	
+	zDrvGpio_SetDirection(GPIO46, GPIO_OUT);
+
+	/* i2c1 new clk config */
+	REG32(0x140002c) &= ~(0x1<<4);//i2c1 select 26M
+	REG32(0x140002c) &= ~(0x1<<8);//reset on  i2c1 apb clk
+	REG32(0x140002c) |= (0x1<<8);//reset off  i2c1 apb clk
+	REG32(0x140002c) &= ~(0x1<<9);//reset on i2c1 work clk
+	REG32(0x140002c) |= (0x1<<9);//reset off i2c1 work clk
+	REG32(0x140002c) |= (0x1<<0);//enable i2c1 apb clk
+	REG32(0x140002c) |= (0x1<<1);//enable i2c1 work clk
+
+	/* pmic i2c clk config */
+	REG32(0x13b03c) &= ~(0x1<<1);//pmici2c select 26M
+	REG32(0x13b074) &= ~(0x1<<8);//reset on  pmici2c apb clk
+	REG32(0x13b074) |= (0x1<<8);//reset off  pmici2c apb clk
+	REG32(0x13b074) &= ~(0x1<<9);//reset on pmici2c work clk
+	REG32(0x13b074) |= (0x1<<9);//reset off pmici2c work clk
+	REG32(0x13b054) |= (0x1<<8);//enable pmici2c apb clk
+	REG32(0x13b054) |= (0x1<<9);//enable pmici2c work clk
+
+	return 0;
+}
+