mxs_i2c.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Freescale i.MX28 I2C Driver
  4. *
  5. * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
  6. * on behalf of DENX Software Engineering GmbH
  7. *
  8. * Partly based on Linux kernel i2c-mxs.c driver:
  9. * Copyright (C) 2011 Wolfram Sang, Pengutronix e.K.
  10. *
  11. * Which was based on a (non-working) driver which was:
  12. * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
  13. */
  14. #include <common.h>
  15. #include <malloc.h>
  16. #include <i2c.h>
  17. #include <linux/errno.h>
  18. #include <asm/io.h>
  19. #include <asm/arch/clock.h>
  20. #include <asm/arch/imx-regs.h>
  21. #include <asm/arch/sys_proto.h>
  22. #define MXS_I2C_MAX_TIMEOUT 1000000
  23. static struct mxs_i2c_regs *mxs_i2c_get_base(struct i2c_adapter *adap)
  24. {
  25. if (adap->hwadapnr == 0)
  26. return (struct mxs_i2c_regs *)MXS_I2C0_BASE;
  27. else
  28. return (struct mxs_i2c_regs *)MXS_I2C1_BASE;
  29. }
  30. static unsigned int mxs_i2c_get_bus_speed(struct i2c_adapter *adap)
  31. {
  32. struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(adap);
  33. uint32_t clk = mxc_get_clock(MXC_XTAL_CLK);
  34. uint32_t timing0;
  35. timing0 = readl(&i2c_regs->hw_i2c_timing0);
  36. /*
  37. * This is a reverse version of the algorithm presented in
  38. * i2c_set_bus_speed(). Please refer there for details.
  39. */
  40. return clk / ((((timing0 >> 16) - 3) * 2) + 38);
  41. }
  42. static uint mxs_i2c_set_bus_speed(struct i2c_adapter *adap, uint speed)
  43. {
  44. struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(adap);
  45. /*
  46. * The timing derivation algorithm. There is no documentation for this
  47. * algorithm available, it was derived by using the scope and fiddling
  48. * with constants until the result observed on the scope was good enough
  49. * for 20kHz, 50kHz, 100kHz, 200kHz, 300kHz and 400kHz. It should be
  50. * possible to assume the algorithm works for other frequencies as well.
  51. *
  52. * Note it was necessary to cap the frequency on both ends as it's not
  53. * possible to configure completely arbitrary frequency for the I2C bus
  54. * clock.
  55. */
  56. uint32_t clk = mxc_get_clock(MXC_XTAL_CLK);
  57. uint32_t base = ((clk / speed) - 38) / 2;
  58. uint16_t high_count = base + 3;
  59. uint16_t low_count = base - 3;
  60. uint16_t rcv_count = (high_count * 3) / 4;
  61. uint16_t xmit_count = low_count / 4;
  62. if (speed > 540000) {
  63. printf("MXS I2C: Speed too high (%d Hz)\n", speed);
  64. return -EINVAL;
  65. }
  66. if (speed < 12000) {
  67. printf("MXS I2C: Speed too low (%d Hz)\n", speed);
  68. return -EINVAL;
  69. }
  70. writel((high_count << 16) | rcv_count, &i2c_regs->hw_i2c_timing0);
  71. writel((low_count << 16) | xmit_count, &i2c_regs->hw_i2c_timing1);
  72. writel((0x0030 << I2C_TIMING2_BUS_FREE_OFFSET) |
  73. (0x0030 << I2C_TIMING2_LEADIN_COUNT_OFFSET),
  74. &i2c_regs->hw_i2c_timing2);
  75. return 0;
  76. }
  77. static void mxs_i2c_reset(struct i2c_adapter *adap)
  78. {
  79. struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(adap);
  80. int ret;
  81. int speed = mxs_i2c_get_bus_speed(adap);
  82. ret = mxs_reset_block(&i2c_regs->hw_i2c_ctrl0_reg);
  83. if (ret) {
  84. debug("MXS I2C: Block reset timeout\n");
  85. return;
  86. }
  87. writel(I2C_CTRL1_DATA_ENGINE_CMPLT_IRQ | I2C_CTRL1_NO_SLAVE_ACK_IRQ |
  88. I2C_CTRL1_EARLY_TERM_IRQ | I2C_CTRL1_MASTER_LOSS_IRQ |
  89. I2C_CTRL1_SLAVE_STOP_IRQ | I2C_CTRL1_SLAVE_IRQ,
  90. &i2c_regs->hw_i2c_ctrl1_clr);
  91. writel(I2C_QUEUECTRL_PIO_QUEUE_MODE, &i2c_regs->hw_i2c_queuectrl_set);
  92. mxs_i2c_set_bus_speed(adap, speed);
  93. }
  94. static void mxs_i2c_setup_read(struct i2c_adapter *adap, uint8_t chip, int len)
  95. {
  96. struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(adap);
  97. writel(I2C_QUEUECMD_RETAIN_CLOCK | I2C_QUEUECMD_PRE_SEND_START |
  98. I2C_QUEUECMD_MASTER_MODE | I2C_QUEUECMD_DIRECTION |
  99. (1 << I2C_QUEUECMD_XFER_COUNT_OFFSET),
  100. &i2c_regs->hw_i2c_queuecmd);
  101. writel((chip << 1) | 1, &i2c_regs->hw_i2c_data);
  102. writel(I2C_QUEUECMD_SEND_NAK_ON_LAST | I2C_QUEUECMD_MASTER_MODE |
  103. (len << I2C_QUEUECMD_XFER_COUNT_OFFSET) |
  104. I2C_QUEUECMD_POST_SEND_STOP, &i2c_regs->hw_i2c_queuecmd);
  105. writel(I2C_QUEUECTRL_QUEUE_RUN, &i2c_regs->hw_i2c_queuectrl_set);
  106. }
  107. static int mxs_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr,
  108. int alen, uchar *buf, int blen, int stop)
  109. {
  110. struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(adap);
  111. uint32_t data, tmp;
  112. int i, remain, off;
  113. int timeout = MXS_I2C_MAX_TIMEOUT;
  114. if ((alen > 4) || (alen == 0)) {
  115. debug("MXS I2C: Invalid address length\n");
  116. return -EINVAL;
  117. }
  118. if (stop)
  119. stop = I2C_QUEUECMD_POST_SEND_STOP;
  120. writel(I2C_QUEUECMD_PRE_SEND_START |
  121. I2C_QUEUECMD_MASTER_MODE | I2C_QUEUECMD_DIRECTION |
  122. ((blen + alen + 1) << I2C_QUEUECMD_XFER_COUNT_OFFSET) | stop,
  123. &i2c_regs->hw_i2c_queuecmd);
  124. data = (chip << 1) << 24;
  125. for (i = 0; i < alen; i++) {
  126. data >>= 8;
  127. data |= ((char *)&addr)[alen - i - 1] << 24;
  128. if ((i & 3) == 2)
  129. writel(data, &i2c_regs->hw_i2c_data);
  130. }
  131. off = i;
  132. for (; i < off + blen; i++) {
  133. data >>= 8;
  134. data |= buf[i - off] << 24;
  135. if ((i & 3) == 2)
  136. writel(data, &i2c_regs->hw_i2c_data);
  137. }
  138. remain = 24 - ((i & 3) * 8);
  139. if (remain)
  140. writel(data >> remain, &i2c_regs->hw_i2c_data);
  141. writel(I2C_QUEUECTRL_QUEUE_RUN, &i2c_regs->hw_i2c_queuectrl_set);
  142. while (--timeout) {
  143. tmp = readl(&i2c_regs->hw_i2c_queuestat);
  144. if (tmp & I2C_QUEUESTAT_WR_QUEUE_EMPTY)
  145. break;
  146. }
  147. if (!timeout) {
  148. debug("MXS I2C: Failed transmitting data!\n");
  149. return -EINVAL;
  150. }
  151. return 0;
  152. }
  153. static int mxs_i2c_wait_for_ack(struct i2c_adapter *adap)
  154. {
  155. struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(adap);
  156. uint32_t tmp;
  157. int timeout = MXS_I2C_MAX_TIMEOUT;
  158. for (;;) {
  159. tmp = readl(&i2c_regs->hw_i2c_ctrl1);
  160. if (tmp & I2C_CTRL1_NO_SLAVE_ACK_IRQ) {
  161. debug("MXS I2C: No slave ACK\n");
  162. goto err;
  163. }
  164. if (tmp & (
  165. I2C_CTRL1_EARLY_TERM_IRQ | I2C_CTRL1_MASTER_LOSS_IRQ |
  166. I2C_CTRL1_SLAVE_STOP_IRQ | I2C_CTRL1_SLAVE_IRQ)) {
  167. debug("MXS I2C: Error (CTRL1 = %08x)\n", tmp);
  168. goto err;
  169. }
  170. if (tmp & I2C_CTRL1_DATA_ENGINE_CMPLT_IRQ)
  171. break;
  172. if (!timeout--) {
  173. debug("MXS I2C: Operation timed out\n");
  174. goto err;
  175. }
  176. udelay(1);
  177. }
  178. return 0;
  179. err:
  180. mxs_i2c_reset(adap);
  181. return 1;
  182. }
  183. static int mxs_i2c_if_read(struct i2c_adapter *adap, uint8_t chip,
  184. uint addr, int alen, uint8_t *buffer,
  185. int len)
  186. {
  187. struct mxs_i2c_regs *i2c_regs = mxs_i2c_get_base(adap);
  188. uint32_t tmp = 0;
  189. int timeout = MXS_I2C_MAX_TIMEOUT;
  190. int ret;
  191. int i;
  192. ret = mxs_i2c_write(adap, chip, addr, alen, NULL, 0, 0);
  193. if (ret) {
  194. debug("MXS I2C: Failed writing address\n");
  195. return ret;
  196. }
  197. ret = mxs_i2c_wait_for_ack(adap);
  198. if (ret) {
  199. debug("MXS I2C: Failed writing address\n");
  200. return ret;
  201. }
  202. mxs_i2c_setup_read(adap, chip, len);
  203. ret = mxs_i2c_wait_for_ack(adap);
  204. if (ret) {
  205. debug("MXS I2C: Failed reading address\n");
  206. return ret;
  207. }
  208. for (i = 0; i < len; i++) {
  209. if (!(i & 3)) {
  210. while (--timeout) {
  211. tmp = readl(&i2c_regs->hw_i2c_queuestat);
  212. if (!(tmp & I2C_QUEUESTAT_RD_QUEUE_EMPTY))
  213. break;
  214. }
  215. if (!timeout) {
  216. debug("MXS I2C: Failed receiving data!\n");
  217. return -ETIMEDOUT;
  218. }
  219. tmp = readl(&i2c_regs->hw_i2c_queuedata);
  220. }
  221. buffer[i] = tmp & 0xff;
  222. tmp >>= 8;
  223. }
  224. return 0;
  225. }
  226. static int mxs_i2c_if_write(struct i2c_adapter *adap, uint8_t chip,
  227. uint addr, int alen, uint8_t *buffer,
  228. int len)
  229. {
  230. int ret;
  231. ret = mxs_i2c_write(adap, chip, addr, alen, buffer, len, 1);
  232. if (ret) {
  233. debug("MXS I2C: Failed writing address\n");
  234. return ret;
  235. }
  236. ret = mxs_i2c_wait_for_ack(adap);
  237. if (ret)
  238. debug("MXS I2C: Failed writing address\n");
  239. return ret;
  240. }
  241. static int mxs_i2c_probe(struct i2c_adapter *adap, uint8_t chip)
  242. {
  243. int ret;
  244. ret = mxs_i2c_write(adap, chip, 0, 1, NULL, 0, 1);
  245. if (!ret)
  246. ret = mxs_i2c_wait_for_ack(adap);
  247. mxs_i2c_reset(adap);
  248. return ret;
  249. }
  250. static void mxs_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)
  251. {
  252. mxs_i2c_reset(adap);
  253. mxs_i2c_set_bus_speed(adap, speed);
  254. return;
  255. }
  256. U_BOOT_I2C_ADAP_COMPLETE(mxs0, mxs_i2c_init, mxs_i2c_probe,
  257. mxs_i2c_if_read, mxs_i2c_if_write,
  258. mxs_i2c_set_bus_speed,
  259. CONFIG_SYS_I2C_SPEED, 0, 0)
  260. U_BOOT_I2C_ADAP_COMPLETE(mxs1, mxs_i2c_init, mxs_i2c_probe,
  261. mxs_i2c_if_read, mxs_i2c_if_write,
  262. mxs_i2c_set_bus_speed,
  263. CONFIG_SYS_I2C_SPEED, 0, 1)