mt_i2c.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. #ifndef __MT_I2C_H__
  2. #define __MT_I2C_H__
  3. #include <platform/mt_typedefs.h>
  4. #include <platform/mt_reg_base.h>
  5. #include <debug.h>
  6. #include <platform/sync_write.h>
  7. #include <sys/types.h>
  8. #define I2C_NR 3 /* Number of I2C controllers */
  9. #define I2CTAG "[I2C-LK] "
  10. #define I2CLOG(fmt, arg...) dprintf(INFO,I2CTAG fmt, ##arg)
  11. #define I2CMSG(fmt, arg...) dprintf(SPEW,I2CTAG fmt, ##arg)
  12. #define I2CERR(fmt, arg...) dprintf(ALWAYS,I2CTAG "%d: "fmt, __LINE__, ##arg)
  13. #define I2CFUC() dprintf(ALWAYS,I2CTAG "%s\n", __FUNCTION__)
  14. #ifdef MACH_FPGA
  15. #define CONFIG_MT_I2C_FPGA_ENABLE
  16. #endif
  17. //#define I2C_DRIVER_IN_KERNEL
  18. #ifdef I2C_DRIVER_IN_KERNEL
  19. #define I2C_MB() mb()
  20. //#define I2C_DEBUG
  21. #ifdef I2C_DEBUG
  22. #define I2C_BUG_ON(a) BUG_ON(a)
  23. #else
  24. #define I2C_BUG_ON(a)
  25. #endif
  26. #else
  27. #ifdef CONFIG_MT_I2C_FPGA_ENABLE
  28. #define FPGA_CLOCK 12000 /* FPGA crystal frequency (KHz) */
  29. #define I2C_CLK_DIV 5 /* frequency divisor */
  30. #define I2C_CLK_RATE (FPGA_CLOCK / I2C_CLK_DIV) /* I2C base clock (KHz) */
  31. #else
  32. #define I2C_CLK_DIV 10 /* frequency divisor */
  33. #define I2C_CLK_RATE 12500 /* TODO: Calculate from bus clock */
  34. #endif
  35. #define I2C_MB()
  36. #define I2C_BUG_ON(a)
  37. #define I2C_M_RD 0x0001
  38. #endif
  39. #ifndef I2C0_BASE
  40. // APB Module i2c
  41. #define I2C0_BASE (0x11009000)
  42. #endif
  43. #ifndef I2C1_BASE
  44. // APB Module i2c
  45. #define I2C1_BASE (0x1100A000)
  46. #endif
  47. #ifndef I2C2_BASE
  48. // APB Module i2c
  49. #define I2C2_BASE (0x1100B000)
  50. #endif
  51. #define SET_CLK_GATING_CTRL1 (TOPCKGEN_BASE + 0x0054)
  52. #define CLR_CLK_GATING_CTRL1 (TOPCKGEN_BASE + 0x0084)
  53. #define I2C_0_SW_CG_BIT (0x1 << 3)
  54. #define I2C_1_SW_CG_BIT (0x1 << 4)
  55. #define I2C_2_SW_CG_BIT (0x1 << 16)
  56. #define ENABLE_CLOCK(channel) \
  57. if (channel == I2C0) \
  58. mt_reg_sync_writel(I2C_0_SW_CG_BIT, CLR_CLK_GATING_CTRL1);\
  59. else if (channel == I2C1)\
  60. mt_reg_sync_writel(I2C_1_SW_CG_BIT, CLR_CLK_GATING_CTRL1);\
  61. else\
  62. mt_reg_sync_writel(I2C_2_SW_CG_BIT, CLR_CLK_GATING_CTRL1);
  63. #define DISABLE_CLOCK(channel) \
  64. if (channel == I2C0) \
  65. mt_reg_sync_writel(I2C_0_SW_CG_BIT, SET_CLK_GATING_CTRL1);\
  66. else if (channel == I2C1)\
  67. mt_reg_sync_writel(I2C_1_SW_CG_BIT, SET_CLK_GATING_CTRL1);\
  68. else\
  69. mt_reg_sync_writel(I2C_2_SW_CG_BIT, SET_CLK_GATING_CTRL1);
  70. #define I2C_OK 0x0000
  71. #define EAGAIN_I2C 11 /* Try again */
  72. #define EINVAL_I2C 22 /* Invalid argument */
  73. #define EOPNOTSUPP_I2C 95 /* Operation not supported on transport endpoint */
  74. #define ETIMEDOUT_I2C 110 /* Connection timed out */
  75. #define EREMOTEIO_I2C 121 /* Remote I/O error */
  76. #define ENOTSUPP_I2C 524 /* Remote I/O error */
  77. #define I2C_WRITE_FAIL_HS_NACKERR 0xA013
  78. #define I2C_WRITE_FAIL_ACKERR 0xA014
  79. #define I2C_WRITE_FAIL_TIMEOUT 0xA015
  80. //#define I2C_CLK_WRAPPER_RATE 36000 /* kHz for wrapper I2C work frequency */
  81. /******************************************register operation***********************************/
  82. enum I2C_REGS_OFFSET {
  83. OFFSET_DATA_PORT = 0x0, //0x0
  84. OFFSET_SLAVE_ADDR = 0x04, //0x04
  85. OFFSET_INTR_MASK = 0x08, //0x08
  86. OFFSET_INTR_STAT = 0x0C, //0x0C
  87. OFFSET_CONTROL = 0x10, //0X10
  88. OFFSET_TRANSFER_LEN = 0x14, //0X14
  89. OFFSET_TRANSAC_LEN = 0x18, //0X18
  90. OFFSET_DELAY_LEN = 0x1C, //0X1C
  91. OFFSET_TIMING = 0x20, //0X20
  92. OFFSET_START = 0x24, //0X24
  93. OFFSET_EXT_CONF = 0x28,
  94. OFFSET_FIFO_STAT = 0x30, //0X30
  95. OFFSET_FIFO_THRESH = 0x34, //0X34
  96. OFFSET_FIFO_ADDR_CLR = 0x38, //0X38
  97. OFFSET_IO_CONFIG = 0x40, //0X40
  98. OFFSET_RSV_DEBUG = 0x44, //0X44
  99. OFFSET_HS = 0x48, //0X48
  100. OFFSET_SOFTRESET = 0x50, //0X50
  101. OFFSET_DCM_EN = 0x54, //0X54
  102. OFFSET_DEBUGSTAT = 0x64, //0X64
  103. OFFSET_DEBUGCTRL = 0x68, //0x68
  104. OFFSET_TRANSFER_LEN_AUX = 0x6C, //0x6C
  105. };
  106. #define I2C_HS_NACKERR (1 << 2)
  107. #define I2C_ACKERR (1 << 1)
  108. #define I2C_TRANSAC_COMP (1 << 0)
  109. #define I2C_FIFO_SIZE 8
  110. #define MAX_ST_MODE_SPEED 100 /* khz */
  111. #define MAX_FS_MODE_SPEED 400 /* khz */
  112. #define MAX_HS_MODE_SPEED 3400 /* khz */
  113. #define MAX_DMA_TRANS_SIZE 65532 /* Max(65535) aligned to 4 bytes = 65532 */
  114. #define MAX_DMA_TRANS_NUM 256
  115. #define MAX_SAMPLE_CNT_DIV 8
  116. #define MAX_STEP_CNT_DIV 64
  117. #define MAX_HS_STEP_CNT_DIV 8
  118. #define DMA_ADDRESS_HIGH (0xC0000000)
  119. enum DMA_REGS_OFFSET {
  120. OFFSET_INT_FLAG = 0x0,
  121. OFFSET_INT_EN = 0x04,
  122. OFFSET_EN = 0x08,
  123. OFFSET_RST = 0x0C,
  124. OFFSET_CON = 0x18,
  125. OFFSET_TX_MEM_ADDR = 0x1C,
  126. OFFSET_RX_MEM_ADDR = 0x20,
  127. OFFSET_TX_LEN = 0x24,
  128. OFFSET_RX_LEN = 0x28,
  129. };
  130. enum i2c_trans_st_rs {
  131. I2C_TRANS_STOP = 0,
  132. I2C_TRANS_REPEATED_START,
  133. };
  134. typedef enum {
  135. ST_MODE,
  136. FS_MODE,
  137. HS_MODE,
  138. }I2C_SPEED_MODE;
  139. enum mt_trans_op {
  140. I2C_MASTER_NONE = 0,
  141. I2C_MASTER_WR = 1,
  142. I2C_MASTER_RD,
  143. I2C_MASTER_WRRD,
  144. };
  145. //CONTROL
  146. #define I2C_CONTROL_RS (0x1 << 1)
  147. #define I2C_CONTROL_DMA_EN (0x1 << 2)
  148. #define I2C_CONTROL_CLK_EXT_EN (0x1 << 3)
  149. #define I2C_CONTROL_DIR_CHANGE (0x1 << 4)
  150. #define I2C_CONTROL_ACKERR_DET_EN (0x1 << 5)
  151. #define I2C_CONTROL_TRANSFER_LEN_CHANGE (0x1 << 6)
  152. #define I2C_CONTROL_WRAPPER (0x1 << 0)
  153. /***********************************end of register operation****************************************/
  154. /***********************************I2C Param********************************************************/
  155. struct mt_trans_data {
  156. U16 trans_num;
  157. U16 data_size;
  158. U16 trans_len;
  159. U16 trans_auxlen;
  160. };
  161. typedef struct mt_i2c_t {
  162. #ifdef I2C_DRIVER_IN_KERNEL
  163. //==========only used in kernel================//
  164. struct i2c_adapter adap; /* i2c host adapter */
  165. struct device *dev; /* the device object of i2c host adapter */
  166. atomic_t trans_err; /* i2c transfer error */
  167. atomic_t trans_comp; /* i2c transfer completion */
  168. atomic_t trans_stop; /* i2c transfer stop */
  169. spinlock_t lock; /* for mt_i2c struct protection */
  170. wait_queue_head_t wait; /* i2c transfer wait queue */
  171. #endif
  172. //==========set in i2c probe============//
  173. U32 base; /* i2c base addr */
  174. U16 id;
  175. U16 irqnr; /* i2c interrupt number */
  176. U16 irq_stat; /* i2c interrupt status */
  177. U32 clk; /* host clock speed in khz */
  178. U32 pdn; /*clock number*/
  179. //==========common data define============//
  180. enum i2c_trans_st_rs st_rs;
  181. enum mt_trans_op op;
  182. U32 pdmabase;
  183. U32 speed; //The speed (khz)
  184. U16 delay_len; //number of half pulse between transfers in a trasaction
  185. U32 msg_len; //number of half pulse between transfers in a trasaction
  186. U8 *msg_buf; /* pointer to msg data */
  187. U8 addr; //The address of the slave device, 7bit,the value include read/write bit.
  188. U8 master_code;/* master code in HS mode */
  189. U8 mode; /* ST/FS/HS mode */
  190. //==========reserved funtion============//
  191. U8 is_push_pull_enable; //IO push-pull or open-drain
  192. U8 is_clk_ext_disable; //clk entend default enable
  193. U8 is_dma_enabled; //Transaction via DMA instead of 8-byte FIFO
  194. U8 read_flag;//read,write,read_write
  195. BOOL dma_en;
  196. BOOL poll_en;
  197. BOOL pushpull;//open drain
  198. BOOL filter_msg;//filter msg error log
  199. BOOL i2c_3dcamera_flag;//flag for 3dcamera
  200. //==========define reg============//
  201. U16 timing_reg;
  202. U16 high_speed_reg;
  203. U16 control_reg;
  204. struct mt_trans_data trans_data;
  205. }mt_i2c;
  206. //===========================i2c old driver===================================================//
  207. enum{
  208. I2C0 = 0,
  209. I2C1 = 1,
  210. I2C2 = 2,
  211. };
  212. //==============================================================================
  213. // I2C Exported Function
  214. //==============================================================================
  215. extern S32 i2c_read(mt_i2c *i2c,U8 *buffer, U32 len);
  216. extern S32 i2c_write(mt_i2c *i2c,U8 *buffer, U32 len);
  217. extern S32 i2c_write_read(mt_i2c *i2c,U8 *buffer, U32 write_len, U32 read_len);
  218. extern S32 i2c_set_speed(mt_i2c *i2c);
  219. extern int i2c_hw_init(void);
  220. //#define I2C_EARLY_PORTING
  221. #ifdef I2C_EARLY_PORTING
  222. int mt_i2c_test(void);
  223. #endif
  224. #endif /* __MT_I2C_H__ */