pca9564_i2c.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. /*
  2. * File: drivers/i2c/pca9564.c
  3. * Based on: drivers/i2c/s3c44b0_i2c.c
  4. * Author:
  5. *
  6. * Created: 2009-06-23
  7. * Description: PCA9564 i2c bridge driver
  8. *
  9. * Modified:
  10. * Copyright 2009 CJSC "NII STT", http://www.niistt.ru/
  11. *
  12. * Bugs:
  13. *
  14. * SPDX-License-Identifier: GPL-2.0+
  15. */
  16. #include <common.h>
  17. #include <i2c.h>
  18. #include <pca9564.h>
  19. #include <asm/io.h>
  20. #define PCA_STA (CONFIG_PCA9564_BASE + 0)
  21. #define PCA_TO (CONFIG_PCA9564_BASE + 0)
  22. #define PCA_DAT (CONFIG_PCA9564_BASE + (1 << 2))
  23. #define PCA_ADR (CONFIG_PCA9564_BASE + (2 << 2))
  24. #define PCA_CON (CONFIG_PCA9564_BASE + (3 << 2))
  25. static unsigned char pca_read_reg(unsigned int reg)
  26. {
  27. return readb((void *)reg);
  28. }
  29. static void pca_write_reg(unsigned int reg, unsigned char value)
  30. {
  31. writeb(value, (void *)reg);
  32. }
  33. static int pca_wait_busy(void)
  34. {
  35. unsigned int timeout = 10000;
  36. while (!(pca_read_reg(PCA_CON) & PCA_CON_SI) && --timeout)
  37. udelay(1);
  38. if (timeout == 0)
  39. debug("I2C timeout!\n");
  40. debug("CON = 0x%02x, STA = 0x%02x\n", pca_read_reg(PCA_CON),
  41. pca_read_reg(PCA_STA));
  42. return timeout ? 0 : 1;
  43. }
  44. /*=====================================================================*/
  45. /* Public Functions */
  46. /*=====================================================================*/
  47. /*-----------------------------------------------------------------------
  48. * Initialization
  49. */
  50. void i2c_init(int speed, int slaveaddr)
  51. {
  52. pca_write_reg(PCA_CON, PCA_CON_ENSIO | speed);
  53. }
  54. /*
  55. * Probe the given I2C chip address. Returns 0 if a chip responded,
  56. * not 0 on failure.
  57. */
  58. int i2c_probe(uchar chip)
  59. {
  60. unsigned char res;
  61. pca_write_reg(PCA_CON, PCA_CON_STA | PCA_CON_ENSIO);
  62. pca_wait_busy();
  63. pca_write_reg(PCA_CON, PCA_CON_STA | PCA_CON_ENSIO);
  64. pca_write_reg(PCA_DAT, (chip << 1) | 1);
  65. res = pca_wait_busy();
  66. if ((res == 0) && (pca_read_reg(PCA_STA) == 0x48))
  67. res = 1;
  68. pca_write_reg(PCA_CON, PCA_CON_STO | PCA_CON_ENSIO);
  69. return res;
  70. }
  71. /*
  72. * Read/Write interface:
  73. * chip: I2C chip address, range 0..127
  74. * addr: Memory (register) address within the chip
  75. * alen: Number of bytes to use for addr (typically 1, 2 for larger
  76. * memories, 0 for register type devices with only one
  77. * register)
  78. * buffer: Where to read/write the data
  79. * len: How many bytes to read/write
  80. *
  81. * Returns: 0 on success, not 0 on failure
  82. */
  83. int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
  84. {
  85. int i;
  86. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
  87. pca_wait_busy();
  88. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  89. pca_write_reg(PCA_DAT, (chip << 1));
  90. pca_wait_busy();
  91. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  92. if (alen > 0) {
  93. pca_write_reg(PCA_DAT, addr);
  94. pca_wait_busy();
  95. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  96. }
  97. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STO);
  98. udelay(500);
  99. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
  100. pca_wait_busy();
  101. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  102. pca_write_reg(PCA_DAT, (chip << 1) | 1);
  103. pca_wait_busy();
  104. for (i = 0; i < len; ++i) {
  105. if (i == len - 1)
  106. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  107. else
  108. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_AA);
  109. pca_wait_busy();
  110. buffer[i] = pca_read_reg(PCA_DAT);
  111. }
  112. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STO);
  113. return 0;
  114. }
  115. int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
  116. {
  117. int i;
  118. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
  119. pca_wait_busy();
  120. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  121. pca_write_reg(PCA_DAT, chip << 1);
  122. pca_wait_busy();
  123. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  124. if (alen > 0) {
  125. pca_write_reg(PCA_DAT, addr);
  126. pca_wait_busy();
  127. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  128. }
  129. for (i = 0; i < len; ++i) {
  130. pca_write_reg(PCA_DAT, buffer[i]);
  131. pca_wait_busy();
  132. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  133. }
  134. pca_write_reg(PCA_CON, PCA_CON_STO | PCA_CON_ENSIO);
  135. return 0;
  136. }