pca9564_i2c.c 4.0 KB

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