#define SPI_FPGA_STANDBY_PIN RK2818_PIN_PH7\r
#define SPI_FPGA_RST_PIN RK2818_PIN_PF4\r
\r
-#define SPI_FPGA_POLL_WAIT 1\r
+#define SPI_FPGA_I2C_EVENT 1\r
+#define SPI_FPGA_POLL_WAIT 0\r
#define SPI_FPGA_TRANS_WORK 0\r
#define SPI_FPGA_TEST_DEBUG 0\r
#if SPI_FPGA_TEST_DEBUG\r
unsigned char interrupt;\r
unsigned char i2c_data_width[2];\r
unsigned int speed[2];\r
+ #if SPI_FPGA_I2C_EVENT\r
+ wait_queue_head_t wait_w,wait_r;\r
+ #endif\r
};\r
\r
struct spi_dpram\r
#define I2C_COUNT 20\r
#define DRV_NAME "spi_i2c"\r
#define SPI_I2C_TEST 0\r
+\r
#if SPI_I2C_TEST\r
struct i2c_adapter *adap;\r
#endif\r
ret = spi_in(port,reg,SEL_I2C);\r
DBG("Enter::%s,LINE=%d ret = [%d]\n",__FUNCTION__,__LINE__,ret);\r
if(INT_I2C_READ_ACK == (ret & 0x07))\r
- port->i2c.interrupt = INT_I2C_READ_ACK; \r
+ {\r
+\r
+ port->i2c.interrupt = INT_I2C_READ_ACK; \r
+ #if SPI_FPGA_I2C_EVENT\r
+ wake_up(&port->i2c.wait_r);\r
+ #endif\r
+ }\r
else if(INT_I2C_READ_NACK ==(ret & 0x07))\r
{\r
printk("Error::read no ack!!check the I2C slave device ret=%d \n",ret);\r
}\r
else if(INT_I2C_WRITE_ACK == (ret & 0x07))\r
+ {\r
port->i2c.interrupt = INT_I2C_WRITE_ACK;\r
+ #if SPI_FPGA_I2C_EVENT\r
+ wake_up(&port->i2c.wait_w);\r
+ #endif\r
+ }\r
else if(INT_I2C_WRITE_NACK == (ret & 0x07))\r
{\r
printk("Error::write no ack!!check the I2C slave device ret=%d \n",ret);\r
//len;\r
reg = channel |ICE_SEL_I2C_FIFO |ICE_SEL_I2C_STOP;\r
spi_out(port,reg,len,SEL_I2C);\r
- \r
+\r
+#if SPI_FPGA_I2C_EVENT\r
+ wait_event_timeout(port->i2c.wait_r, port->i2c.interrupt == INT_I2C_READ_ACK, msecs_to_jiffies(30)); \r
+ for(i = 0;i<len;i++)\r
+ {\r
+ result = spi_in(port,channel,SEL_I2C);\r
+ pmsg->buf[i] = 0;\r
+ pmsg->buf[i] = result & 0xff ;\r
+ }\r
+ spin_lock(&port->i2c.i2c_lock);\r
+ port->i2c.interrupt &= INT_I2C_READ_MASK;\r
+ spin_unlock(&port->i2c.i2c_lock);\r
+ ret = pmsg->len;\r
+#else\r
j = I2C_COUNT;\r
while(j--)\r
\r
else\r
msleep(2);\r
}\r
+ \r
+#endif\r
//for(i = 0;i<len;i++)\r
//printk("pmsg->buf[%d] = 0x%x \n",i,pmsg->buf[i]); \r
return ret>0 ? ret:-1;\r
{\r
reg = channel|ICE_SEL_I2C_STOP;\r
spi_out(port,reg,pmsg->buf[i],SEL_I2C);\r
- \r
+ #if SPI_FPGA_I2C_EVENT\r
+ wait_event_timeout(port->i2c.wait_w, port->i2c.interrupt == INT_I2C_WRITE_ACK, msecs_to_jiffies(30));\r
+ spin_lock(&port->i2c.i2c_lock);\r
+ port->i2c.interrupt &= INT_I2C_WRITE_MASK;\r
+ spin_unlock(&port->i2c.i2c_lock);\r
+ ret = pmsg->len;\r
+ #else\r
j = I2C_COUNT; \r
while(j--)\r
{ \r
else\r
msleep(2);\r
}\r
- \r
+ #endif\r
}\r
else if(i==len-1 && pmsg->read_type == I2C_NO_STOP)\r
{ \r
\r
#endif\r
\r
+#if SPI_FPGA_I2C_EVENT\r
+ init_waitqueue_head(&port->i2c.wait_w);\r
+ init_waitqueue_head(&port->i2c.wait_r);\r
+#endif\r
+\r
return 0; \r
\r
}\r