rcar_iic.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Renesas RCar IIC driver
  4. *
  5. * Copyright (C) 2017 Marek Vasut <marek.vasut@gmail.com>
  6. *
  7. * Based on
  8. * Copyright (C) 2011, 2013 Renesas Solutions Corp.
  9. * Copyright (C) 2011, 2013 Nobuhiro Iwamatsu <nobuhiro.iwamatsu.yj@renesas.com>
  10. */
  11. #include <common.h>
  12. #include <clk.h>
  13. #include <dm.h>
  14. #include <i2c.h>
  15. #include <asm/io.h>
  16. struct rcar_iic_priv {
  17. void __iomem *base;
  18. struct clk clk;
  19. u8 iccl;
  20. u8 icch;
  21. };
  22. #define RCAR_IIC_ICDR 0x00
  23. #define RCAR_IIC_ICCR 0x04
  24. #define RCAR_IIC_ICSR 0x08
  25. #define RCAR_IIC_ICIC 0x0c
  26. #define RCAR_IIC_ICCL 0x10
  27. #define RCAR_IIC_ICCH 0x14
  28. /* ICCR */
  29. #define RCAR_IIC_ICCR_ICE BIT(7)
  30. #define RCAR_IIC_ICCR_RACK BIT(6)
  31. #define RCAR_IIC_ICCR_RTS BIT(4)
  32. #define RCAR_IIC_ICCR_BUSY BIT(2)
  33. #define RCAR_IIC_ICCR_SCP BIT(0)
  34. /* ICSR / ICIC */
  35. #define RCAR_IC_BUSY BIT(4)
  36. #define RCAR_IC_TACK BIT(2)
  37. #define RCAR_IC_DTE BIT(0)
  38. #define IRQ_WAIT 1000
  39. static void sh_irq_dte(struct udevice *dev)
  40. {
  41. struct rcar_iic_priv *priv = dev_get_priv(dev);
  42. int i;
  43. for (i = 0; i < IRQ_WAIT; i++) {
  44. if (RCAR_IC_DTE & readb(priv->base + RCAR_IIC_ICSR))
  45. break;
  46. udelay(10);
  47. }
  48. }
  49. static int sh_irq_dte_with_tack(struct udevice *dev)
  50. {
  51. struct rcar_iic_priv *priv = dev_get_priv(dev);
  52. int i;
  53. for (i = 0; i < IRQ_WAIT; i++) {
  54. if (RCAR_IC_DTE & readb(priv->base + RCAR_IIC_ICSR))
  55. break;
  56. if (RCAR_IC_TACK & readb(priv->base + RCAR_IIC_ICSR))
  57. return -ETIMEDOUT;
  58. udelay(10);
  59. }
  60. return 0;
  61. }
  62. static void sh_irq_busy(struct udevice *dev)
  63. {
  64. struct rcar_iic_priv *priv = dev_get_priv(dev);
  65. int i;
  66. for (i = 0; i < IRQ_WAIT; i++) {
  67. if (!(RCAR_IC_BUSY & readb(priv->base + RCAR_IIC_ICSR)))
  68. break;
  69. udelay(10);
  70. }
  71. }
  72. static int rcar_iic_set_addr(struct udevice *dev, u8 chip, u8 read)
  73. {
  74. struct rcar_iic_priv *priv = dev_get_priv(dev);
  75. clrbits_8(priv->base + RCAR_IIC_ICCR, RCAR_IIC_ICCR_ICE);
  76. setbits_8(priv->base + RCAR_IIC_ICCR, RCAR_IIC_ICCR_ICE);
  77. writeb(priv->iccl, priv->base + RCAR_IIC_ICCL);
  78. writeb(priv->icch, priv->base + RCAR_IIC_ICCH);
  79. writeb(RCAR_IC_TACK, priv->base + RCAR_IIC_ICIC);
  80. writeb(RCAR_IIC_ICCR_ICE | RCAR_IIC_ICCR_RTS | RCAR_IIC_ICCR_BUSY,
  81. priv->base + RCAR_IIC_ICCR);
  82. sh_irq_dte(dev);
  83. clrbits_8(priv->base + RCAR_IIC_ICSR, RCAR_IC_TACK);
  84. writeb(chip << 1 | read, priv->base + RCAR_IIC_ICDR);
  85. return sh_irq_dte_with_tack(dev);
  86. }
  87. static void rcar_iic_finish(struct udevice *dev)
  88. {
  89. struct rcar_iic_priv *priv = dev_get_priv(dev);
  90. writeb(0, priv->base + RCAR_IIC_ICSR);
  91. clrbits_8(priv->base + RCAR_IIC_ICCR, RCAR_IIC_ICCR_ICE);
  92. }
  93. static int rcar_iic_read_common(struct udevice *dev, struct i2c_msg *msg)
  94. {
  95. struct rcar_iic_priv *priv = dev_get_priv(dev);
  96. int i, ret = -EREMOTEIO;
  97. if (rcar_iic_set_addr(dev, msg->addr, 1) != 0)
  98. goto err;
  99. udelay(10);
  100. writeb(RCAR_IIC_ICCR_ICE | RCAR_IIC_ICCR_SCP,
  101. priv->base + RCAR_IIC_ICCR);
  102. for (i = 0; i < msg->len; i++) {
  103. if (sh_irq_dte_with_tack(dev) != 0)
  104. goto err;
  105. msg->buf[i] = readb(priv->base + RCAR_IIC_ICDR) & 0xff;
  106. if (msg->len - 1 == i) {
  107. writeb(RCAR_IIC_ICCR_ICE | RCAR_IIC_ICCR_RACK,
  108. priv->base + RCAR_IIC_ICCR);
  109. }
  110. }
  111. sh_irq_busy(dev);
  112. ret = 0;
  113. err:
  114. rcar_iic_finish(dev);
  115. return ret;
  116. }
  117. static int rcar_iic_write_common(struct udevice *dev, struct i2c_msg *msg)
  118. {
  119. struct rcar_iic_priv *priv = dev_get_priv(dev);
  120. int i, ret = -EREMOTEIO;
  121. if (rcar_iic_set_addr(dev, msg->addr, 0) != 0)
  122. goto err;
  123. udelay(10);
  124. for (i = 0; i < msg->len; i++) {
  125. writeb(msg->buf[i], priv->base + RCAR_IIC_ICDR);
  126. if (sh_irq_dte_with_tack(dev) != 0)
  127. goto err;
  128. }
  129. if (msg->flags & I2C_M_STOP) {
  130. writeb(RCAR_IIC_ICCR_ICE | RCAR_IIC_ICCR_RTS,
  131. priv->base + RCAR_IIC_ICCR);
  132. if (sh_irq_dte_with_tack(dev) != 0)
  133. goto err;
  134. }
  135. sh_irq_busy(dev);
  136. ret = 0;
  137. err:
  138. rcar_iic_finish(dev);
  139. return ret;
  140. }
  141. static int rcar_iic_xfer(struct udevice *dev, struct i2c_msg *msg, int nmsgs)
  142. {
  143. int ret;
  144. for (; nmsgs > 0; nmsgs--, msg++) {
  145. if (msg->flags & I2C_M_RD)
  146. ret = rcar_iic_read_common(dev, msg);
  147. else
  148. ret = rcar_iic_write_common(dev, msg);
  149. if (ret)
  150. return -EREMOTEIO;
  151. }
  152. return ret;
  153. }
  154. static int rcar_iic_set_speed(struct udevice *dev, uint speed)
  155. {
  156. struct rcar_iic_priv *priv = dev_get_priv(dev);
  157. const unsigned int ratio_high = 4;
  158. const unsigned int ratio_low = 5;
  159. int clkrate, denom;
  160. clkrate = clk_get_rate(&priv->clk);
  161. if (clkrate < 0)
  162. return clkrate;
  163. /*
  164. * Calculate the value for ICCL and ICCH. From the data sheet:
  165. * iccl = (p-clock / transfer-rate) * (L / (L + H))
  166. * icch = (p clock / transfer rate) * (H / (L + H))
  167. * where L and H are the SCL low and high ratio.
  168. */
  169. denom = speed * (ratio_high + ratio_low);
  170. priv->iccl = DIV_ROUND_CLOSEST(clkrate * ratio_low, denom);
  171. priv->icch = DIV_ROUND_CLOSEST(clkrate * ratio_high, denom);
  172. return 0;
  173. }
  174. static int rcar_iic_probe_chip(struct udevice *dev, uint addr, uint flags)
  175. {
  176. struct rcar_iic_priv *priv = dev_get_priv(dev);
  177. int ret;
  178. rcar_iic_set_addr(dev, addr, 1);
  179. writeb(RCAR_IIC_ICCR_ICE | RCAR_IIC_ICCR_SCP,
  180. priv->base + RCAR_IIC_ICCR);
  181. ret = sh_irq_dte_with_tack(dev);
  182. rcar_iic_finish(dev);
  183. return ret;
  184. }
  185. static int rcar_iic_probe(struct udevice *dev)
  186. {
  187. struct rcar_iic_priv *priv = dev_get_priv(dev);
  188. int ret;
  189. priv->base = dev_read_addr_ptr(dev);
  190. ret = clk_get_by_index(dev, 0, &priv->clk);
  191. if (ret)
  192. return ret;
  193. ret = clk_enable(&priv->clk);
  194. if (ret)
  195. return ret;
  196. rcar_iic_finish(dev);
  197. return rcar_iic_set_speed(dev, 100000);
  198. }
  199. static const struct dm_i2c_ops rcar_iic_ops = {
  200. .xfer = rcar_iic_xfer,
  201. .probe_chip = rcar_iic_probe_chip,
  202. .set_bus_speed = rcar_iic_set_speed,
  203. };
  204. static const struct udevice_id rcar_iic_ids[] = {
  205. { .compatible = "renesas,rmobile-iic" },
  206. { }
  207. };
  208. U_BOOT_DRIVER(iic_rcar) = {
  209. .name = "iic_rcar",
  210. .id = UCLASS_I2C,
  211. .of_match = rcar_iic_ids,
  212. .probe = rcar_iic_probe,
  213. .priv_auto_alloc_size = sizeof(struct rcar_iic_priv),
  214. .ops = &rcar_iic_ops,
  215. };