cobalt-i2c.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * cobalt I2C functions
  4. *
  5. * Derived from cx18-i2c.c
  6. *
  7. * Copyright 2012-2015 Cisco Systems, Inc. and/or its affiliates.
  8. * All rights reserved.
  9. */
  10. #include "cobalt-driver.h"
  11. #include "cobalt-i2c.h"
  12. struct cobalt_i2c_regs {
  13. /* Clock prescaler register lo-byte */
  14. u8 prerlo;
  15. u8 dummy0[3];
  16. /* Clock prescaler register high-byte */
  17. u8 prerhi;
  18. u8 dummy1[3];
  19. /* Control register */
  20. u8 ctr;
  21. u8 dummy2[3];
  22. /* Transmit/Receive register */
  23. u8 txr_rxr;
  24. u8 dummy3[3];
  25. /* Command and Status register */
  26. u8 cr_sr;
  27. u8 dummy4[3];
  28. };
  29. /* CTR[7:0] - Control register */
  30. /* I2C Core enable bit */
  31. #define M00018_CTR_BITMAP_EN_MSK (1 << 7)
  32. /* I2C Core interrupt enable bit */
  33. #define M00018_CTR_BITMAP_IEN_MSK (1 << 6)
  34. /* CR[7:0] - Command register */
  35. /* I2C start condition */
  36. #define M00018_CR_BITMAP_STA_MSK (1 << 7)
  37. /* I2C stop condition */
  38. #define M00018_CR_BITMAP_STO_MSK (1 << 6)
  39. /* I2C read from slave */
  40. #define M00018_CR_BITMAP_RD_MSK (1 << 5)
  41. /* I2C write to slave */
  42. #define M00018_CR_BITMAP_WR_MSK (1 << 4)
  43. /* I2C ack */
  44. #define M00018_CR_BITMAP_ACK_MSK (1 << 3)
  45. /* I2C Interrupt ack */
  46. #define M00018_CR_BITMAP_IACK_MSK (1 << 0)
  47. /* SR[7:0] - Status register */
  48. /* Receive acknowledge from slave */
  49. #define M00018_SR_BITMAP_RXACK_MSK (1 << 7)
  50. /* Busy, I2C bus busy (as defined by start / stop bits) */
  51. #define M00018_SR_BITMAP_BUSY_MSK (1 << 6)
  52. /* Arbitration lost - core lost arbitration */
  53. #define M00018_SR_BITMAP_AL_MSK (1 << 5)
  54. /* Transfer in progress */
  55. #define M00018_SR_BITMAP_TIP_MSK (1 << 1)
  56. /* Interrupt flag */
  57. #define M00018_SR_BITMAP_IF_MSK (1 << 0)
  58. /* Frequency, in Hz */
  59. #define I2C_FREQUENCY 400000
  60. #define ALT_CPU_FREQ 83333333
  61. static struct cobalt_i2c_regs __iomem *
  62. cobalt_i2c_regs(struct cobalt *cobalt, unsigned idx)
  63. {
  64. switch (idx) {
  65. case 0:
  66. default:
  67. return (struct cobalt_i2c_regs __iomem *)
  68. (cobalt->bar1 + COBALT_I2C_0_BASE);
  69. case 1:
  70. return (struct cobalt_i2c_regs __iomem *)
  71. (cobalt->bar1 + COBALT_I2C_1_BASE);
  72. case 2:
  73. return (struct cobalt_i2c_regs __iomem *)
  74. (cobalt->bar1 + COBALT_I2C_2_BASE);
  75. case 3:
  76. return (struct cobalt_i2c_regs __iomem *)
  77. (cobalt->bar1 + COBALT_I2C_3_BASE);
  78. case 4:
  79. return (struct cobalt_i2c_regs __iomem *)
  80. (cobalt->bar1 + COBALT_I2C_HSMA_BASE);
  81. }
  82. }
  83. /* Do low-level i2c byte transfer.
  84. * Returns -1 in case of an error or 0 otherwise.
  85. */
  86. static int cobalt_tx_bytes(struct cobalt_i2c_regs __iomem *regs,
  87. struct i2c_adapter *adap, bool start, bool stop,
  88. u8 *data, u16 len)
  89. {
  90. unsigned long start_time;
  91. int status;
  92. int cmd;
  93. int i;
  94. for (i = 0; i < len; i++) {
  95. /* Setup data */
  96. iowrite8(data[i], &regs->txr_rxr);
  97. /* Setup command */
  98. if (i == 0 && start != 0) {
  99. /* Write + Start */
  100. cmd = M00018_CR_BITMAP_WR_MSK |
  101. M00018_CR_BITMAP_STA_MSK;
  102. } else if (i == len - 1 && stop != 0) {
  103. /* Write + Stop */
  104. cmd = M00018_CR_BITMAP_WR_MSK |
  105. M00018_CR_BITMAP_STO_MSK;
  106. } else {
  107. /* Write only */
  108. cmd = M00018_CR_BITMAP_WR_MSK;
  109. }
  110. /* Execute command */
  111. iowrite8(cmd, &regs->cr_sr);
  112. /* Wait for transfer to complete (TIP = 0) */
  113. start_time = jiffies;
  114. status = ioread8(&regs->cr_sr);
  115. while (status & M00018_SR_BITMAP_TIP_MSK) {
  116. if (time_after(jiffies, start_time + adap->timeout))
  117. return -ETIMEDOUT;
  118. cond_resched();
  119. status = ioread8(&regs->cr_sr);
  120. }
  121. /* Verify ACK */
  122. if (status & M00018_SR_BITMAP_RXACK_MSK) {
  123. /* NO ACK! */
  124. return -EIO;
  125. }
  126. /* Verify arbitration */
  127. if (status & M00018_SR_BITMAP_AL_MSK) {
  128. /* Arbitration lost! */
  129. return -EIO;
  130. }
  131. }
  132. return 0;
  133. }
  134. /* Do low-level i2c byte read.
  135. * Returns -1 in case of an error or 0 otherwise.
  136. */
  137. static int cobalt_rx_bytes(struct cobalt_i2c_regs __iomem *regs,
  138. struct i2c_adapter *adap, bool start, bool stop,
  139. u8 *data, u16 len)
  140. {
  141. unsigned long start_time;
  142. int status;
  143. int cmd;
  144. int i;
  145. for (i = 0; i < len; i++) {
  146. /* Setup command */
  147. if (i == 0 && start != 0) {
  148. /* Read + Start */
  149. cmd = M00018_CR_BITMAP_RD_MSK |
  150. M00018_CR_BITMAP_STA_MSK;
  151. } else if (i == len - 1 && stop != 0) {
  152. /* Read + Stop */
  153. cmd = M00018_CR_BITMAP_RD_MSK |
  154. M00018_CR_BITMAP_STO_MSK;
  155. } else {
  156. /* Read only */
  157. cmd = M00018_CR_BITMAP_RD_MSK;
  158. }
  159. /* Last byte to read, no ACK */
  160. if (i == len - 1)
  161. cmd |= M00018_CR_BITMAP_ACK_MSK;
  162. /* Execute command */
  163. iowrite8(cmd, &regs->cr_sr);
  164. /* Wait for transfer to complete (TIP = 0) */
  165. start_time = jiffies;
  166. status = ioread8(&regs->cr_sr);
  167. while (status & M00018_SR_BITMAP_TIP_MSK) {
  168. if (time_after(jiffies, start_time + adap->timeout))
  169. return -ETIMEDOUT;
  170. cond_resched();
  171. status = ioread8(&regs->cr_sr);
  172. }
  173. /* Verify arbitration */
  174. if (status & M00018_SR_BITMAP_AL_MSK) {
  175. /* Arbitration lost! */
  176. return -EIO;
  177. }
  178. /* Store data */
  179. data[i] = ioread8(&regs->txr_rxr);
  180. }
  181. return 0;
  182. }
  183. /* Generate stop condition on i2c bus.
  184. * The m00018 stop isn't doing the right thing (wrong timing).
  185. * So instead send a start condition, 8 zeroes and a stop condition.
  186. */
  187. static int cobalt_stop(struct cobalt_i2c_regs __iomem *regs,
  188. struct i2c_adapter *adap)
  189. {
  190. u8 data = 0;
  191. return cobalt_tx_bytes(regs, adap, true, true, &data, 1);
  192. }
  193. static int cobalt_xfer(struct i2c_adapter *adap,
  194. struct i2c_msg msgs[], int num)
  195. {
  196. struct cobalt_i2c_data *data = adap->algo_data;
  197. struct cobalt_i2c_regs __iomem *regs = data->regs;
  198. struct i2c_msg *pmsg;
  199. unsigned short flags;
  200. int ret = 0;
  201. int i, j;
  202. for (i = 0; i < num; i++) {
  203. int stop = (i == num - 1);
  204. pmsg = &msgs[i];
  205. flags = pmsg->flags;
  206. if (!(pmsg->flags & I2C_M_NOSTART)) {
  207. u8 addr = pmsg->addr << 1;
  208. if (flags & I2C_M_RD)
  209. addr |= 1;
  210. if (flags & I2C_M_REV_DIR_ADDR)
  211. addr ^= 1;
  212. for (j = 0; j < adap->retries; j++) {
  213. ret = cobalt_tx_bytes(regs, adap, true, false,
  214. &addr, 1);
  215. if (!ret)
  216. break;
  217. cobalt_stop(regs, adap);
  218. }
  219. if (ret < 0)
  220. return ret;
  221. ret = 0;
  222. }
  223. if (pmsg->flags & I2C_M_RD) {
  224. /* read bytes into buffer */
  225. ret = cobalt_rx_bytes(regs, adap, false, stop,
  226. pmsg->buf, pmsg->len);
  227. if (ret < 0)
  228. goto bailout;
  229. } else {
  230. /* write bytes from buffer */
  231. ret = cobalt_tx_bytes(regs, adap, false, stop,
  232. pmsg->buf, pmsg->len);
  233. if (ret < 0)
  234. goto bailout;
  235. }
  236. }
  237. ret = i;
  238. bailout:
  239. if (ret < 0)
  240. cobalt_stop(regs, adap);
  241. return ret;
  242. }
  243. static u32 cobalt_func(struct i2c_adapter *adap)
  244. {
  245. return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
  246. }
  247. /* template for i2c-bit-algo */
  248. static const struct i2c_adapter cobalt_i2c_adap_template = {
  249. .name = "cobalt i2c driver",
  250. .algo = NULL, /* set by i2c-algo-bit */
  251. .algo_data = NULL, /* filled from template */
  252. .owner = THIS_MODULE,
  253. };
  254. static const struct i2c_algorithm cobalt_algo = {
  255. .master_xfer = cobalt_xfer,
  256. .functionality = cobalt_func,
  257. };
  258. /* init + register i2c algo-bit adapter */
  259. int cobalt_i2c_init(struct cobalt *cobalt)
  260. {
  261. int i, err;
  262. int status;
  263. int prescale;
  264. unsigned long start_time;
  265. cobalt_dbg(1, "i2c init\n");
  266. /* Define I2C clock prescaler */
  267. prescale = ((ALT_CPU_FREQ) / (5 * I2C_FREQUENCY)) - 1;
  268. for (i = 0; i < COBALT_NUM_ADAPTERS; i++) {
  269. struct cobalt_i2c_regs __iomem *regs =
  270. cobalt_i2c_regs(cobalt, i);
  271. struct i2c_adapter *adap = &cobalt->i2c_adap[i];
  272. /* Disable I2C */
  273. iowrite8(M00018_CTR_BITMAP_EN_MSK, &regs->cr_sr);
  274. iowrite8(0, &regs->ctr);
  275. iowrite8(0, &regs->cr_sr);
  276. start_time = jiffies;
  277. do {
  278. if (time_after(jiffies, start_time + HZ)) {
  279. if (cobalt_ignore_err) {
  280. adap->dev.parent = NULL;
  281. return 0;
  282. }
  283. return -ETIMEDOUT;
  284. }
  285. status = ioread8(&regs->cr_sr);
  286. } while (status & M00018_SR_BITMAP_TIP_MSK);
  287. /* Disable I2C */
  288. iowrite8(0, &regs->ctr);
  289. iowrite8(0, &regs->cr_sr);
  290. /* Calculate i2c prescaler */
  291. iowrite8(prescale & 0xff, &regs->prerlo);
  292. iowrite8((prescale >> 8) & 0xff, &regs->prerhi);
  293. /* Enable I2C, interrupts disabled */
  294. iowrite8(M00018_CTR_BITMAP_EN_MSK, &regs->ctr);
  295. /* Setup algorithm for adapter */
  296. cobalt->i2c_data[i].cobalt = cobalt;
  297. cobalt->i2c_data[i].regs = regs;
  298. *adap = cobalt_i2c_adap_template;
  299. adap->algo = &cobalt_algo;
  300. adap->algo_data = &cobalt->i2c_data[i];
  301. adap->retries = 3;
  302. sprintf(adap->name + strlen(adap->name),
  303. " #%d-%d", cobalt->instance, i);
  304. i2c_set_adapdata(adap, &cobalt->v4l2_dev);
  305. adap->dev.parent = &cobalt->pci_dev->dev;
  306. err = i2c_add_adapter(adap);
  307. if (err) {
  308. if (cobalt_ignore_err) {
  309. adap->dev.parent = NULL;
  310. return 0;
  311. }
  312. while (i--)
  313. i2c_del_adapter(&cobalt->i2c_adap[i]);
  314. return err;
  315. }
  316. cobalt_info("registered bus %s\n", adap->name);
  317. }
  318. return 0;
  319. }
  320. void cobalt_i2c_exit(struct cobalt *cobalt)
  321. {
  322. int i;
  323. cobalt_dbg(1, "i2c exit\n");
  324. for (i = 0; i < COBALT_NUM_ADAPTERS; i++) {
  325. cobalt_err("unregistered bus %s\n", cobalt->i2c_adap[i].name);
  326. i2c_del_adapter(&cobalt->i2c_adap[i]);
  327. }
  328. }