rcar_i2c.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. * drivers/i2c/rcar_i2c.c
  3. *
  4. * Copyright (C) 2013 Renesas Electronics Corporation
  5. * Copyright (C) 2013 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0
  8. *
  9. * NOTE: This driver should be converted to driver model before June 2017.
  10. * Please see doc/driver-model/i2c-howto.txt for instructions.
  11. */
  12. #include <common.h>
  13. #include <i2c.h>
  14. #include <asm/io.h>
  15. DECLARE_GLOBAL_DATA_PTR;
  16. struct rcar_i2c {
  17. u32 icscr;
  18. u32 icmcr;
  19. u32 icssr;
  20. u32 icmsr;
  21. u32 icsier;
  22. u32 icmier;
  23. u32 icccr;
  24. u32 icsar;
  25. u32 icmar;
  26. u32 icrxdtxd;
  27. u32 icccr2;
  28. u32 icmpr;
  29. u32 ichpr;
  30. u32 iclpr;
  31. };
  32. #define MCR_MDBS 0x80 /* non-fifo mode switch */
  33. #define MCR_FSCL 0x40 /* override SCL pin */
  34. #define MCR_FSDA 0x20 /* override SDA pin */
  35. #define MCR_OBPC 0x10 /* override pins */
  36. #define MCR_MIE 0x08 /* master if enable */
  37. #define MCR_TSBE 0x04
  38. #define MCR_FSB 0x02 /* force stop bit */
  39. #define MCR_ESG 0x01 /* en startbit gen. */
  40. #define MSR_MASK 0x7f
  41. #define MSR_MNR 0x40 /* nack received */
  42. #define MSR_MAL 0x20 /* arbitration lost */
  43. #define MSR_MST 0x10 /* sent a stop */
  44. #define MSR_MDE 0x08
  45. #define MSR_MDT 0x04
  46. #define MSR_MDR 0x02
  47. #define MSR_MAT 0x01 /* slave addr xfer done */
  48. static const struct rcar_i2c *i2c_dev[CONFIF_SYS_RCAR_I2C_NUM_CONTROLLERS] = {
  49. (struct rcar_i2c *)CONFIG_SYS_RCAR_I2C0_BASE,
  50. (struct rcar_i2c *)CONFIG_SYS_RCAR_I2C1_BASE,
  51. (struct rcar_i2c *)CONFIG_SYS_RCAR_I2C2_BASE,
  52. (struct rcar_i2c *)CONFIG_SYS_RCAR_I2C3_BASE,
  53. };
  54. static void rcar_i2c_raw_rw_common(struct rcar_i2c *dev, u8 chip, uint addr)
  55. {
  56. /* set slave address */
  57. writel(chip << 1, &dev->icmar);
  58. /* set register address */
  59. writel(addr, &dev->icrxdtxd);
  60. /* clear status */
  61. writel(0, &dev->icmsr);
  62. /* start master send */
  63. writel(MCR_MDBS | MCR_MIE | MCR_ESG, &dev->icmcr);
  64. while ((readl(&dev->icmsr) & (MSR_MAT | MSR_MDE))
  65. != (MSR_MAT | MSR_MDE))
  66. udelay(10);
  67. /* clear ESG */
  68. writel(MCR_MDBS | MCR_MIE, &dev->icmcr);
  69. /* start SCLclk */
  70. writel(~(MSR_MAT | MSR_MDE), &dev->icmsr);
  71. while (!(readl(&dev->icmsr) & MSR_MDE))
  72. udelay(10);
  73. }
  74. static void rcar_i2c_raw_rw_finish(struct rcar_i2c *dev)
  75. {
  76. while (!(readl(&dev->icmsr) & MSR_MST))
  77. udelay(10);
  78. writel(0, &dev->icmcr);
  79. }
  80. static int
  81. rcar_i2c_raw_write(struct rcar_i2c *dev, u8 chip, uint addr, u8 *val, int size)
  82. {
  83. rcar_i2c_raw_rw_common(dev, chip, addr);
  84. /* set send date */
  85. writel(*val, &dev->icrxdtxd);
  86. /* start SCLclk */
  87. writel(~MSR_MDE, &dev->icmsr);
  88. while (!(readl(&dev->icmsr) & MSR_MDE))
  89. udelay(10);
  90. /* set stop condition */
  91. writel(MCR_MDBS | MCR_MIE | MCR_FSB, &dev->icmcr);
  92. /* start SCLclk */
  93. writel(~MSR_MDE, &dev->icmsr);
  94. rcar_i2c_raw_rw_finish(dev);
  95. return 0;
  96. }
  97. static u8
  98. rcar_i2c_raw_read(struct rcar_i2c *dev, u8 chip, uint addr)
  99. {
  100. u8 ret;
  101. rcar_i2c_raw_rw_common(dev, chip, addr);
  102. /* set slave address, receive */
  103. writel((chip << 1) | 1, &dev->icmar);
  104. /* start master receive */
  105. writel(MCR_MDBS | MCR_MIE | MCR_ESG, &dev->icmcr);
  106. /* clear status */
  107. writel(0, &dev->icmsr);
  108. while ((readl(&dev->icmsr) & (MSR_MAT | MSR_MDR))
  109. != (MSR_MAT | MSR_MDR))
  110. udelay(10);
  111. /* clear ESG */
  112. writel(MCR_MDBS | MCR_MIE, &dev->icmcr);
  113. /* prepare stop condition */
  114. writel(MCR_MDBS | MCR_MIE | MCR_FSB, &dev->icmcr);
  115. /* start SCLclk */
  116. writel(~(MSR_MAT | MSR_MDR), &dev->icmsr);
  117. while (!(readl(&dev->icmsr) & MSR_MDR))
  118. udelay(10);
  119. /* get receive data */
  120. ret = (u8)readl(&dev->icrxdtxd);
  121. /* start SCLclk */
  122. writel(~MSR_MDR, &dev->icmsr);
  123. rcar_i2c_raw_rw_finish(dev);
  124. return ret;
  125. }
  126. /*
  127. * SCL = iicck / (20 + SCGD * 8 + F[(ticf + tr + intd) * iicck])
  128. * iicck : I2C internal clock < 20 MHz
  129. * ticf : I2C SCL falling time: 35 ns
  130. * tr : I2C SCL rising time: 200 ns
  131. * intd : LSI internal delay: I2C0: 50 ns I2C1-3: 5
  132. * F[n] : n rounded up to an integer
  133. */
  134. static u32 rcar_clock_gen(int i2c_no, u32 bus_speed)
  135. {
  136. u32 iicck, f, scl, scgd;
  137. u32 intd = 5;
  138. int bit = 0, cdf_width = 3;
  139. for (bit = 0; bit < (1 << cdf_width); bit++) {
  140. iicck = CONFIG_HP_CLK_FREQ / (1 + bit);
  141. if (iicck < 20000000)
  142. break;
  143. }
  144. if (bit > (1 << cdf_width)) {
  145. puts("rcar-i2c: Can not get CDF\n");
  146. return 0;
  147. }
  148. if (i2c_no == 0)
  149. intd = 50;
  150. f = (35 + 200 + intd) * (iicck / 1000000000);
  151. for (scgd = 0; scgd < 0x40; scgd++) {
  152. scl = iicck / (20 + (scgd * 8) + f);
  153. if (scl <= bus_speed)
  154. break;
  155. }
  156. if (scgd > 0x40) {
  157. puts("rcar-i2c: Can not get SDGB\n");
  158. return 0;
  159. }
  160. debug("%s: scl: %d\n", __func__, scl);
  161. debug("%s: bit %x\n", __func__, bit);
  162. debug("%s: scgd %x\n", __func__, scgd);
  163. debug("%s: iccr %x\n", __func__, (scgd << (cdf_width) | bit));
  164. return scgd << (cdf_width) | bit;
  165. }
  166. static void
  167. rcar_i2c_init(struct i2c_adapter *adap, int speed, int slaveadd)
  168. {
  169. struct rcar_i2c *dev = (struct rcar_i2c *)i2c_dev[adap->hwadapnr];
  170. u32 icccr = 0;
  171. /* No i2c support prior to relocation */
  172. if (!(gd->flags & GD_FLG_RELOC))
  173. return;
  174. /*
  175. * reset slave mode.
  176. * slave mode is not used on this driver
  177. */
  178. writel(0, &dev->icsier);
  179. writel(0, &dev->icsar);
  180. writel(0, &dev->icscr);
  181. writel(0, &dev->icssr);
  182. /* reset master mode */
  183. writel(0, &dev->icmier);
  184. writel(0, &dev->icmcr);
  185. writel(0, &dev->icmsr);
  186. writel(0, &dev->icmar);
  187. icccr = rcar_clock_gen(adap->hwadapnr, adap->speed);
  188. if (icccr == 0)
  189. puts("I2C: Init failed\n");
  190. else
  191. writel(icccr, &dev->icccr);
  192. }
  193. static int rcar_i2c_read(struct i2c_adapter *adap, uint8_t chip,
  194. uint addr, int alen, u8 *data, int len)
  195. {
  196. struct rcar_i2c *dev = (struct rcar_i2c *)i2c_dev[adap->hwadapnr];
  197. int i;
  198. for (i = 0; i < len; i++)
  199. data[i] = rcar_i2c_raw_read(dev, chip, addr + i);
  200. return 0;
  201. }
  202. static int rcar_i2c_write(struct i2c_adapter *adap, uint8_t chip, uint addr,
  203. int alen, u8 *data, int len)
  204. {
  205. struct rcar_i2c *dev = (struct rcar_i2c *)i2c_dev[adap->hwadapnr];
  206. return rcar_i2c_raw_write(dev, chip, addr, data, len);
  207. }
  208. static int
  209. rcar_i2c_probe(struct i2c_adapter *adap, u8 dev)
  210. {
  211. return rcar_i2c_read(adap, dev, 0, 0, NULL, 0);
  212. }
  213. static unsigned int rcar_i2c_set_bus_speed(struct i2c_adapter *adap,
  214. unsigned int speed)
  215. {
  216. struct rcar_i2c *dev = (struct rcar_i2c *)i2c_dev[adap->hwadapnr];
  217. u32 icccr;
  218. int ret = 0;
  219. rcar_i2c_raw_rw_finish(dev);
  220. icccr = rcar_clock_gen(adap->hwadapnr, speed);
  221. if (icccr == 0) {
  222. puts("I2C: Init failed\n");
  223. ret = -1;
  224. } else {
  225. writel(icccr, &dev->icccr);
  226. }
  227. return ret;
  228. }
  229. /*
  230. * Register RCAR i2c adapters
  231. */
  232. U_BOOT_I2C_ADAP_COMPLETE(rcar_0, rcar_i2c_init, rcar_i2c_probe, rcar_i2c_read,
  233. rcar_i2c_write, rcar_i2c_set_bus_speed,
  234. CONFIG_SYS_RCAR_I2C0_SPEED, 0, 0)
  235. U_BOOT_I2C_ADAP_COMPLETE(rcar_1, rcar_i2c_init, rcar_i2c_probe, rcar_i2c_read,
  236. rcar_i2c_write, rcar_i2c_set_bus_speed,
  237. CONFIG_SYS_RCAR_I2C1_SPEED, 0, 1)
  238. U_BOOT_I2C_ADAP_COMPLETE(rcar_2, rcar_i2c_init, rcar_i2c_probe, rcar_i2c_read,
  239. rcar_i2c_write, rcar_i2c_set_bus_speed,
  240. CONFIG_SYS_RCAR_I2C2_SPEED, 0, 2)
  241. U_BOOT_I2C_ADAP_COMPLETE(rcar_3, rcar_i2c_init, rcar_i2c_probe, rcar_i2c_read,
  242. rcar_i2c_write, rcar_i2c_set_bus_speed,
  243. CONFIG_SYS_RCAR_I2C3_SPEED, 0, 3)