fpga driver update
[firefly-linux-kernel-4.4.55.git] / drivers / fpga / spi_fpga_init.c
index b5bea0afb764bfd63ee0af4e9cdac38d747b0199..8195aa2881567067c5426010b5b2d0d7ae5edeed 100644 (file)
 #include <linux/i2c.h>\r
 #include <mach/rk2818_iomap.h>\r
 \r
-#include "spi_fpga.h"\r
+#include <mach/spi_fpga.h>\r
 \r
 #if defined(CONFIG_SPI_FPGA_INIT_DEBUG)\r
 #define DBG(x...)   printk(x)\r
 #else\r
 #define DBG(x...)\r
 #endif\r
+\r
 struct spi_fpga_port *pFpgaPort;\r
 \r
 /*------------------------spi¶ÁдµÄ»ù±¾º¯Êý-----------------------*/\r
 unsigned int spi_in(struct spi_fpga_port *port, int reg, int type)\r
 {\r
        unsigned char index = 0;\r
-       unsigned char tx_buf[1], rx_buf[2], n_rx=2, stat=0;\r
+       unsigned char tx_buf[2], rx_buf[2], n_rx=2, stat=0;\r
        unsigned int result=0;\r
        //printk("index1=%d\n",index);\r
 \r
@@ -68,10 +69,11 @@ unsigned int spi_in(struct spi_fpga_port *port, int reg, int type)
                        index = port->uart.index;\r
                        reg = (((reg) | ICE_SEL_UART) | ICE_SEL_READ | ICE_SEL_UART_CH(index));\r
                        tx_buf[0] = reg & 0xff;\r
+                       tx_buf[1] = 0;\r
                        rx_buf[0] = 0;\r
                        rx_buf[1] = 0;  \r
-                       stat = spi_write_then_read(port->spi, (const u8 *)&tx_buf, sizeof(tx_buf), rx_buf, n_rx);\r
-                       result = rx_buf[1];\r
+                       stat = spi_write_then_read(port->spi, (const u8 *)&tx_buf, sizeof(tx_buf)-1, rx_buf, n_rx);\r
+                       result = (rx_buf[0] << 8) | rx_buf[1];\r
                        DBG("%s,SEL_UART reg=0x%x,result=0x%x\n",__FUNCTION__,reg&0xff,result&0xff);\r
                        break;\r
 #endif\r
@@ -80,6 +82,7 @@ unsigned int spi_in(struct spi_fpga_port *port, int reg, int type)
                case SEL_GPIO:\r
                        reg = (((reg) | ICE_SEL_GPIO) | ICE_SEL_READ );\r
                        tx_buf[0] = reg & 0xff;\r
+                       tx_buf[1] = 0;//give fpga 8 clks for reading data\r
                        rx_buf[0] = 0;\r
                        rx_buf[1] = 0;  \r
                        stat = spi_write_then_read(port->spi, (const u8 *)&tx_buf, sizeof(tx_buf), rx_buf, n_rx);\r
@@ -90,13 +93,14 @@ unsigned int spi_in(struct spi_fpga_port *port, int reg, int type)
 \r
 #if defined(CONFIG_SPI_I2C)\r
                case SEL_I2C:\r
-                       reg = (((reg) | ICE_SEL_I2C) & ICE_SEL_READ );\r
+                       reg = (((reg) | ICE_SEL_I2C) | ICE_SEL_READ );\r
                        tx_buf[0] = reg & 0xff;\r
+                       tx_buf[1] = 0;\r
                        rx_buf[0] = 0;\r
                        rx_buf[1] = 0;                          \r
-                       stat = spi_write_then_read(port->spi, (const u8 *)&tx_buf, sizeof(tx_buf), rx_buf, n_rx);\r
-                       result = (rx_buf[0] << 8) | rx_buf[1];\r
-                       DBG("%s,SEL_I2C reg=0x%x,result=0x%x [0x%x] [0x%x]\n",__FUNCTION__,reg&0xff,result&0xffff,rx_buf[0],rx_buf[1]);                                 \r
+                       stat = spi_write_then_read(port->spi, (const u8 *)&tx_buf, sizeof(tx_buf)-1, rx_buf, n_rx);\r
+                       result =  rx_buf[1];\r
+                       DBG("%s,SEL_I2C reg=0x%x,result=0x%x \n",__FUNCTION__,reg&0xff,result&0xffff);                                  \r
                        break;\r
 #endif\r
 \r
@@ -104,6 +108,7 @@ unsigned int spi_in(struct spi_fpga_port *port, int reg, int type)
                case SEL_DPRAM:\r
                        reg = (((reg) | ICE_SEL_DPRAM) & ICE_SEL_DPRAM_READ );\r
                        tx_buf[0] = reg & 0xff;\r
+                       tx_buf[1] = 0;//give fpga 8 clks for reading data\r
                        rx_buf[0] = 0;\r
                        rx_buf[1] = 0;                          \r
                        stat = spi_write_then_read(port->spi, (const u8 *)&tx_buf, sizeof(tx_buf), rx_buf, n_rx);\r
@@ -111,8 +116,18 @@ unsigned int spi_in(struct spi_fpga_port *port, int reg, int type)
                        DBG("%s,SEL_GPIO reg=0x%x,result=0x%x\n",__FUNCTION__,reg&0xff,result&0xffff);  \r
                        break;\r
 #endif\r
+               case READ_TOP_INT:\r
+                       reg = (((reg) | ICE_SEL_UART) | ICE_SEL_READ);\r
+                       tx_buf[0] = reg & 0xff;\r
+                       tx_buf[1] = 0;\r
+                       rx_buf[0] = 0;\r
+                       rx_buf[1] = 0;  \r
+                       stat = spi_write_then_read(port->spi, (const u8 *)&tx_buf, sizeof(tx_buf)-1, rx_buf, n_rx);\r
+                       result = rx_buf[1];\r
+                       DBG("%s,SEL_INT reg=0x%x,result=0x%x\n",__FUNCTION__,reg&0xff,result&0xff);\r
+                       break;\r
                default:\r
-                       printk("Can not support this type!\n");\r
+                       printk("%s err: Can not support this type!\n",__FUNCTION__);\r
                        break;\r
        }\r
 \r
@@ -150,7 +165,6 @@ void spi_out(struct spi_fpga_port *port, int reg, int value, int type)
 #endif\r
 \r
 #if defined(CONFIG_SPI_I2C)\r
-\r
                case SEL_I2C:\r
                        reg = (((reg) | ICE_SEL_I2C) & ICE_SEL_WRITE);\r
                        tx_buf[0] = reg & 0xff;\r
@@ -173,61 +187,87 @@ void spi_out(struct spi_fpga_port *port, int reg, int value, int type)
 #endif\r
 \r
                default:\r
-                       printk("Can not support this type!\n");\r
+                       printk("%s err: Can not support this type!\n",__FUNCTION__);\r
                        break;\r
        }\r
 \r
 }\r
 \r
+#if SPI_FPGA_TEST_DEBUG\r
+int spi_test_wrong_handle(void)\r
+{\r
+       gpio_direction_output(SPI_FPGA_TEST_DEBUG_PIN,0);\r
+       udelay(2);\r
+       gpio_direction_output(SPI_FPGA_TEST_DEBUG_PIN,1);\r
+       printk("%s:give one trailing edge!\n",__FUNCTION__);\r
+       return 0;\r
+}\r
+\r
+static int spi_test_request_gpio(int set)\r
+{\r
+       int ret;\r
+       rk2818_mux_api_set(GPIOE0_VIPDATA0_SEL_NAME,0);\r
+       ret = gpio_request(SPI_FPGA_TEST_DEBUG_PIN, NULL);\r
+       if (ret) {\r
+               printk("%s:failed to request SPI_FPGA_TEST_DEBUG_PIN pin\n",__FUNCTION__);\r
+               return ret;\r
+       }       \r
+       gpio_direction_output(SPI_FPGA_TEST_DEBUG_PIN,set);\r
+\r
+       return 0;\r
+}\r
+\r
+#endif\r
 \r
 static void spi_fpga_irq_work_handler(struct work_struct *work)\r
 {\r
        struct spi_fpga_port *port =\r
                container_of(work, struct spi_fpga_port, fpga_irq_work);\r
        struct spi_device       *spi = port->spi;\r
-       int ret,uart_ch,gpio_ch;\r
+       int ret,uart_ch=0;\r
 \r
        DBG("Enter::%s,LINE=%d\n",__FUNCTION__,__LINE__);\r
        \r
-       ret = spi_in(port, ICE_SEL_READ_INT_TYPE, SEL_UART);\r
+       ret = spi_in(port, ICE_SEL_READ_INT_TYPE, READ_TOP_INT);\r
        if((ret | ICE_INT_TYPE_UART0) == ICE_INT_TYPE_UART0)\r
        {\r
 #if defined(CONFIG_SPI_UART)\r
-               uart_ch = 0;\r
-               printk("Enter::%s,LINE=%d,uart_ch=%d,uart.index=%d\n",__FUNCTION__,__LINE__,uart_ch,port->uart.index);\r
+               DBG("%s:ICE_INT_TYPE_UART0 ret=0x%x\n",__FUNCTION__,ret);\r
                port->uart.index = uart_ch;\r
                spi_uart_handle_irq(spi);\r
 #endif\r
        }\r
        else if((ret | ICE_INT_TYPE_GPIO) == ICE_INT_TYPE_GPIO)\r
        {\r
-               gpio_ch = 0;\r
-               printk("Enter::%s,LINE=%d,gpio_ch=%d\n",__FUNCTION__,__LINE__,gpio_ch);\r
 #if defined(CONFIG_SPI_GPIO)\r
+               printk("%s:ICE_INT_TYPE_GPIO ret=0x%x\n",__FUNCTION__,ret);\r
                spi_gpio_handle_irq(spi);\r
 #endif\r
        }\r
        else if((ret | ICE_INT_TYPE_I2C2) == ICE_INT_TYPE_I2C2)\r
        {\r
 #if defined(CONFIG_SPI_I2C)\r
-               spi_i2c_handle_irq(port,0);\r
+               DBG("%s:ICE_INT_TYPE_I2C2 ret=0x%x\n",__FUNCTION__,ret);\r
+               spi_i2c_handle_irq(port,I2C_CH2);\r
 #endif\r
        }\r
        else if((ret | ICE_INT_TYPE_I2C3) == ICE_INT_TYPE_I2C3)\r
        {\r
 #if defined(CONFIG_SPI_I2C)\r
-               spi_i2c_handle_irq(port,1);\r
+               DBG("%s:ICE_INT_TYPE_I2C3 ret=0x%x\n",__FUNCTION__,ret);\r
+               spi_i2c_handle_irq(port,I2C_CH3);\r
 #endif\r
        }\r
        else if((ret | ICE_INT_TYPE_DPRAM) == ICE_INT_TYPE_DPRAM)\r
        {\r
 #if defined(CONFIG_SPI_DPRAM)\r
+               DBG("%s:ICE_INT_TYPE_DPRAM ret=0x%x\n",__FUNCTION__,ret);\r
                spi_dpram_handle_irq(spi);\r
 #endif\r
        }\r
        else\r
        {\r
-               printk("%s:NO such INT TYPE\n",__FUNCTION__);\r
+               printk("%s:NO such INT TYPE,ret=0x%x\n",__FUNCTION__,ret);\r
        }\r
 \r
        DBG("Enter::%s,LINE=%d\n",__FUNCTION__,__LINE__);\r
@@ -267,12 +307,13 @@ static int spi_open_sysclk(int set)
        return 0;\r
 }\r
 \r
-\r
+extern int spi_i2c_set_bt_power(void);\r
 static int __devinit spi_fpga_probe(struct spi_device * spi)\r
 {\r
        struct spi_fpga_port *port;\r
        int ret;\r
        char b[12];\r
+       int num;\r
        DBG("Enter::%s,LINE=%d************************\n",__FUNCTION__,__LINE__);\r
        /*\r
         * bits_per_word cannot be configured in platform data\r
@@ -318,18 +359,23 @@ static int __devinit spi_fpga_probe(struct spi_device * spi)
                return ret;\r
        }\r
 #endif\r
-#if 0 //defined(CONFIG_SPI_I2C)\r
+#if defined(CONFIG_SPI_I2C)\r
 \r
        printk("%s:line=%d,port=0x%x\n",__FUNCTION__,__LINE__,(int)port);\r
-       ret = spi_i2c_register(port);\r
-       printk("%s:line=%d,port=0x%x\n",__FUNCTION__,__LINE__,(int)port);\r
-       if(ret)\r
+       spin_lock_init(&port->i2c.i2c_lock);\r
+       for (num= 2;num<4;num++)\r
        {\r
-               spi_i2c_unregister(port);\r
-               printk("%s:ret=%d,fail to spi_i2c_register\n",__FUNCTION__,ret);\r
-               return ret;\r
+               ret = spi_i2c_register(port,num);\r
+               printk("%s:line=%d,port=0x%x\n",__FUNCTION__,__LINE__,(int)port);\r
+               if(ret)\r
+               {\r
+                       spi_i2c_unregister(port);\r
+                       printk("%s:ret=%d,fail to spi_i2c_register\n",__FUNCTION__,ret);\r
+                       return ret;\r
+               }\r
        }\r
 #endif\r
+\r
 #if defined(CONFIG_SPI_DPRAM)\r
        ret = spi_dpram_register(port);\r
        if(ret)\r
@@ -362,6 +408,10 @@ static int __devinit spi_fpga_probe(struct spi_device * spi)
        spi_gpio_init();\r
 #endif\r
 \r
+#if    SPI_FPGA_TEST_DEBUG\r
+       spi_test_request_gpio(GPIO_HIGH);\r
+#endif\r
+\r
        return 0;\r
 \r
 err2:\r