2 * File: drivers/i2c/pca9564.c
3 * Based on: drivers/i2c/s3c44b0_i2c.c
7 * Description: PCA9564 i2c bridge driver
10 * Copyright 2009 CJSC "NII STT", http://www.niistt.ru/
14 * SPDX-License-Identifier: GPL-2.0+
16 * NOTE: This driver should be converted to driver model before June 2017.
17 * Please see doc/driver-model/i2c-howto.txt for instructions.
25 #define PCA_STA (CONFIG_PCA9564_BASE + 0)
26 #define PCA_TO (CONFIG_PCA9564_BASE + 0)
27 #define PCA_DAT (CONFIG_PCA9564_BASE + (1 << 2))
28 #define PCA_ADR (CONFIG_PCA9564_BASE + (2 << 2))
29 #define PCA_CON (CONFIG_PCA9564_BASE + (3 << 2))
31 static unsigned char pca_read_reg(unsigned int reg)
33 return readb((void *)reg);
36 static void pca_write_reg(unsigned int reg, unsigned char value)
38 writeb(value, (void *)reg);
41 static int pca_wait_busy(void)
43 unsigned int timeout = 10000;
45 while (!(pca_read_reg(PCA_CON) & PCA_CON_SI) && --timeout)
49 debug("I2C timeout!\n");
51 debug("CON = 0x%02x, STA = 0x%02x\n", pca_read_reg(PCA_CON),
52 pca_read_reg(PCA_STA));
54 return timeout ? 0 : 1;
57 /*=====================================================================*/
58 /* Public Functions */
59 /*=====================================================================*/
61 /*-----------------------------------------------------------------------
64 void i2c_init(int speed, int slaveaddr)
66 pca_write_reg(PCA_CON, PCA_CON_ENSIO | speed);
70 * Probe the given I2C chip address. Returns 0 if a chip responded,
74 int i2c_probe(uchar chip)
78 pca_write_reg(PCA_CON, PCA_CON_STA | PCA_CON_ENSIO);
81 pca_write_reg(PCA_CON, PCA_CON_STA | PCA_CON_ENSIO);
83 pca_write_reg(PCA_DAT, (chip << 1) | 1);
84 res = pca_wait_busy();
86 if ((res == 0) && (pca_read_reg(PCA_STA) == 0x48))
89 pca_write_reg(PCA_CON, PCA_CON_STO | PCA_CON_ENSIO);
95 * Read/Write interface:
96 * chip: I2C chip address, range 0..127
97 * addr: Memory (register) address within the chip
98 * alen: Number of bytes to use for addr (typically 1, 2 for larger
99 * memories, 0 for register type devices with only one
101 * buffer: Where to read/write the data
102 * len: How many bytes to read/write
104 * Returns: 0 on success, not 0 on failure
106 int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)
110 pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
113 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
115 pca_write_reg(PCA_DAT, (chip << 1));
117 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
120 pca_write_reg(PCA_DAT, addr);
122 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
125 pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STO);
129 pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
131 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
133 pca_write_reg(PCA_DAT, (chip << 1) | 1);
136 for (i = 0; i < len; ++i) {
138 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
140 pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_AA);
143 buffer[i] = pca_read_reg(PCA_DAT);
147 pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STO);
152 int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)
156 pca_write_reg(PCA_CON, PCA_CON_ENSIO | PCA_CON_STA);
158 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
160 pca_write_reg(PCA_DAT, chip << 1);
162 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
165 pca_write_reg(PCA_DAT, addr);
167 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
170 for (i = 0; i < len; ++i) {
171 pca_write_reg(PCA_DAT, buffer[i]);
173 pca_write_reg(PCA_CON, PCA_CON_ENSIO);
176 pca_write_reg(PCA_CON, PCA_CON_STO | PCA_CON_ENSIO);