rcar_iic.c 5.8 KB

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