pca9564_i2c.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License as published by
  16. * the Free Software Foundation; either version 2 of the License, or
  17. * (at your option) any later version.
  18. *
  19. * This program is distributed in the hope that it will be useful,
  20. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  22. * GNU General Public License for more details.
  23. *
  24. * You should have received a copy of the GNU General Public License
  25. * along with this program; if not, see the file COPYING, or write
  26. * to the Free Software Foundation, Inc.,
  27. * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  28. */
  29. #include <common.h>
  30. #include <i2c.h>
  31. #include <pca9564.h>
  32. #include <asm/io.h>
  33. #define PCA_STA (CONFIG_PCA9564_BASE + 0)
  34. #define PCA_TO (CONFIG_PCA9564_BASE + 0)
  35. #define PCA_DAT (CONFIG_PCA9564_BASE + (1 << 2))
  36. #define PCA_ADR (CONFIG_PCA9564_BASE + (2 << 2))
  37. #define PCA_CON (CONFIG_PCA9564_BASE + (3 << 2))
  38. static unsigned char pca_read_reg(unsigned int reg)
  39. {
  40. return readb((void *)reg);
  41. }
  42. static void pca_write_reg(unsigned int reg, unsigned char value)
  43. {
  44. writeb(value, (void *)reg);
  45. }
  46. static int pca_wait_busy(void)
  47. {
  48. unsigned int timeout = 10000;
  49. while (!(pca_read_reg(PCA_CON) & PCA_CON_SI) && --timeout)
  50. udelay(1);
  51. if (timeout == 0)
  52. debug("I2C timeout!\n");
  53. debug("CON = 0x%02x, STA = 0x%02x\n", pca_read_reg(PCA_CON),
  54. pca_read_reg(PCA_STA));
  55. return timeout ? 0 : 1;
  56. }
  57. /*=====================================================================*/
  58. /* Public Functions */
  59. /*=====================================================================*/
  60. /*-----------------------------------------------------------------------
  61. * Initialization
  62. */
  63. void i2c_init(int speed, int slaveaddr)
  64. {
  65. pca_write_reg(PCA_CON, PCA_CON_ENSIO | speed);
  66. }
  67. /*
  68. * Probe the given I2C chip address. Returns 0 if a chip responded,
  69. * not 0 on failure.
  70. */
  71. int i2c_probe(uchar chip)
  72. {
  73. unsigned char res;
  74. pca_write_reg(PCA_CON, PCA_CON_STA | PCA_CON_ENSIO);
  75. pca_wait_busy();
  76. pca_write_reg(PCA_CON, PCA_CON_STA | PCA_CON_ENSIO);
  77. pca_write_reg(PCA_DAT, (chip << 1) | 1);
  78. res = pca_wait_busy();
  79. if ((res == 0) && (pca_read_reg(PCA_STA) == 0x48))
  80. res = 1;
  81. pca_write_reg(PCA_CON, PCA_CON_STO | PCA_CON_ENSIO);
  82. return res;
  83. }
  84. /*
  85. * Read/Write interface:
  86. * chip: I2C chip address, range 0..127
  87. * addr: Memory (register) address within the chip
  88. * alen: Number of bytes to use for addr (typically 1, 2 for larger
  89. * memories, 0 for register type devices with only one
  90. * register)
  91. * buffer: Where to read/write the data
  92. * len: How many bytes to read/write
  93. *
  94. * Returns: 0 on success, not 0 on failure
  95. */
  96. int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
  97. {
  98. int i;
  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));
  103. pca_wait_busy();
  104. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  105. if (alen > 0) {
  106. pca_write_reg(PCA_DAT, addr);
  107. pca_wait_busy();
  108. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  109. }
  110. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STO);
  111. udelay(500);
  112. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
  113. pca_wait_busy();
  114. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  115. pca_write_reg(PCA_DAT, (chip << 1) | 1);
  116. pca_wait_busy();
  117. for (i = 0; i < len; ++i) {
  118. if (i == len - 1)
  119. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  120. else
  121. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_AA);
  122. pca_wait_busy();
  123. buffer[i] = pca_read_reg(PCA_DAT);
  124. }
  125. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STO);
  126. return 0;
  127. }
  128. int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
  129. {
  130. int i;
  131. pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
  132. pca_wait_busy();
  133. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  134. pca_write_reg(PCA_DAT, chip << 1);
  135. pca_wait_busy();
  136. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  137. if (alen > 0) {
  138. pca_write_reg(PCA_DAT, addr);
  139. pca_wait_busy();
  140. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  141. }
  142. for (i = 0; i < len; ++i) {
  143. pca_write_reg(PCA_DAT, buffer[i]);
  144. pca_wait_busy();
  145. pca_write_reg(PCA_CON, PCA_CON_ENSIO);
  146. }
  147. pca_write_reg(PCA_CON, PCA_CON_STO | PCA_CON_ENSIO);
  148. return 0;
  149. }