xref: /rk3399_rockchip-uboot/drivers/i2c/davinci_i2c.c (revision 356d15ebb2b0bb2adde2ca4fe4cccb87f75531a0)
1 /*
2  * TI DaVinci (TMS320DM644x) I2C driver.
3  *
4  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
5  *
6  * --------------------------------------------------------
7  *
8  * SPDX-License-Identifier:	GPL-2.0+
9  */
10 
11 #include <common.h>
12 #include <i2c.h>
13 #include <asm/arch/hardware.h>
14 #include <asm/arch/i2c_defs.h>
15 #include "davinci_i2c.h"
16 
17 #define CHECK_NACK() \
18 	do {\
19 		if (tmp & (I2C_TIMEOUT | I2C_STAT_NACK)) {\
20 			REG(I2C_CON) = 0;\
21 			return(1);\
22 		}\
23 	} while (0)
24 
25 
26 static int wait_for_bus(void)
27 {
28 	int	stat, timeout;
29 
30 	REG(I2C_STAT) = 0xffff;
31 
32 	for (timeout = 0; timeout < 10; timeout++) {
33 		if (!((stat = REG(I2C_STAT)) & I2C_STAT_BB)) {
34 			REG(I2C_STAT) = 0xffff;
35 			return(0);
36 		}
37 
38 		REG(I2C_STAT) = stat;
39 		udelay(50000);
40 	}
41 
42 	REG(I2C_STAT) = 0xffff;
43 	return(1);
44 }
45 
46 
47 static int poll_i2c_irq(int mask)
48 {
49 	int	stat, timeout;
50 
51 	for (timeout = 0; timeout < 10; timeout++) {
52 		udelay(1000);
53 		stat = REG(I2C_STAT);
54 		if (stat & mask) {
55 			return(stat);
56 		}
57 	}
58 
59 	REG(I2C_STAT) = 0xffff;
60 	return(stat | I2C_TIMEOUT);
61 }
62 
63 
64 void flush_rx(void)
65 {
66 	while (1) {
67 		if (!(REG(I2C_STAT) & I2C_STAT_RRDY))
68 			break;
69 
70 		REG(I2C_DRR);
71 		REG(I2C_STAT) = I2C_STAT_RRDY;
72 		udelay(1000);
73 	}
74 }
75 
76 
77 void i2c_init(int speed, int slaveadd)
78 {
79 	u_int32_t	div, psc;
80 
81 	if (REG(I2C_CON) & I2C_CON_EN) {
82 		REG(I2C_CON) = 0;
83 		udelay (50000);
84 	}
85 
86 	psc = 2;
87 	div = (CONFIG_SYS_HZ_CLOCK / ((psc + 1) * speed)) - 10;	/* SCLL + SCLH */
88 	REG(I2C_PSC) = psc;			/* 27MHz / (2 + 1) = 9MHz */
89 	REG(I2C_SCLL) = (div * 50) / 100;	/* 50% Duty */
90 	REG(I2C_SCLH) = div - REG(I2C_SCLL);
91 
92 	REG(I2C_OA) = slaveadd;
93 	REG(I2C_CNT) = 0;
94 
95 	/* Interrupts must be enabled or I2C module won't work */
96 	REG(I2C_IE) = I2C_IE_SCD_IE | I2C_IE_XRDY_IE |
97 		I2C_IE_RRDY_IE | I2C_IE_ARDY_IE | I2C_IE_NACK_IE;
98 
99 	/* Now enable I2C controller (get it out of reset) */
100 	REG(I2C_CON) = I2C_CON_EN;
101 
102 	udelay(1000);
103 }
104 
105 int i2c_set_bus_speed(unsigned int speed)
106 {
107 	i2c_init(speed, CONFIG_SYS_I2C_SLAVE);
108 	return 0;
109 }
110 
111 int i2c_probe(u_int8_t chip)
112 {
113 	int	rc = 1;
114 
115 	if (chip == REG(I2C_OA)) {
116 		return(rc);
117 	}
118 
119 	REG(I2C_CON) = 0;
120 	if (wait_for_bus()) {return(1);}
121 
122 	/* try to read one byte from current (or only) address */
123 	REG(I2C_CNT) = 1;
124 	REG(I2C_SA) = chip;
125 	REG(I2C_CON) = (I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP);
126 	udelay (50000);
127 
128 	if (!(REG(I2C_STAT) & I2C_STAT_NACK)) {
129 		rc = 0;
130 		flush_rx();
131 		REG(I2C_STAT) = 0xffff;
132 	} else {
133 		REG(I2C_STAT) = 0xffff;
134 		REG(I2C_CON) |= I2C_CON_STP;
135 		udelay(20000);
136 		if (wait_for_bus()) {return(1);}
137 	}
138 
139 	flush_rx();
140 	REG(I2C_STAT) = 0xffff;
141 	REG(I2C_CNT) = 0;
142 	return(rc);
143 }
144 
145 
146 int i2c_read(u_int8_t chip, u_int32_t addr, int alen, u_int8_t *buf, int len)
147 {
148 	u_int32_t	tmp;
149 	int		i;
150 
151 	if ((alen < 0) || (alen > 2)) {
152 		printf("%s(): bogus address length %x\n", __FUNCTION__, alen);
153 		return(1);
154 	}
155 
156 	if (wait_for_bus()) {return(1);}
157 
158 	if (alen != 0) {
159 		/* Start address phase */
160 		tmp = I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX;
161 		REG(I2C_CNT) = alen;
162 		REG(I2C_SA) = chip;
163 		REG(I2C_CON) = tmp;
164 
165 		tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);
166 
167 		CHECK_NACK();
168 
169 		switch (alen) {
170 			case 2:
171 				/* Send address MSByte */
172 				if (tmp & I2C_STAT_XRDY) {
173 					REG(I2C_DXR) = (addr >> 8) & 0xff;
174 				} else {
175 					REG(I2C_CON) = 0;
176 					return(1);
177 				}
178 
179 				tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);
180 
181 				CHECK_NACK();
182 				/* No break, fall through */
183 			case 1:
184 				/* Send address LSByte */
185 				if (tmp & I2C_STAT_XRDY) {
186 					REG(I2C_DXR) = addr & 0xff;
187 				} else {
188 					REG(I2C_CON) = 0;
189 					return(1);
190 				}
191 
192 				tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK | I2C_STAT_ARDY);
193 
194 				CHECK_NACK();
195 
196 				if (!(tmp & I2C_STAT_ARDY)) {
197 					REG(I2C_CON) = 0;
198 					return(1);
199 				}
200 		}
201 	}
202 
203 	/* Address phase is over, now read 'len' bytes and stop */
204 	tmp = I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_STP;
205 	REG(I2C_CNT) = len & 0xffff;
206 	REG(I2C_SA) = chip;
207 	REG(I2C_CON) = tmp;
208 
209 	for (i = 0; i < len; i++) {
210 		tmp = poll_i2c_irq(I2C_STAT_RRDY | I2C_STAT_NACK | I2C_STAT_ROVR);
211 
212 		CHECK_NACK();
213 
214 		if (tmp & I2C_STAT_RRDY) {
215 			buf[i] = REG(I2C_DRR);
216 		} else {
217 			REG(I2C_CON) = 0;
218 			return(1);
219 		}
220 	}
221 
222 	tmp = poll_i2c_irq(I2C_STAT_SCD | I2C_STAT_NACK);
223 
224 	CHECK_NACK();
225 
226 	if (!(tmp & I2C_STAT_SCD)) {
227 		REG(I2C_CON) = 0;
228 		return(1);
229 	}
230 
231 	flush_rx();
232 	REG(I2C_STAT) = 0xffff;
233 	REG(I2C_CNT) = 0;
234 	REG(I2C_CON) = 0;
235 
236 	return(0);
237 }
238 
239 
240 int i2c_write(u_int8_t chip, u_int32_t addr, int alen, u_int8_t *buf, int len)
241 {
242 	u_int32_t	tmp;
243 	int		i;
244 
245 	if ((alen < 0) || (alen > 2)) {
246 		printf("%s(): bogus address length %x\n", __FUNCTION__, alen);
247 		return(1);
248 	}
249 	if (len < 0) {
250 		printf("%s(): bogus length %x\n", __FUNCTION__, len);
251 		return(1);
252 	}
253 
254 	if (wait_for_bus()) {return(1);}
255 
256 	/* Start address phase */
257 	tmp = I2C_CON_EN | I2C_CON_MST | I2C_CON_STT | I2C_CON_TRX | I2C_CON_STP;
258 	REG(I2C_CNT) = (alen == 0) ? len & 0xffff : (len & 0xffff) + alen;
259 	REG(I2C_SA) = chip;
260 	REG(I2C_CON) = tmp;
261 
262 	switch (alen) {
263 		case 2:
264 			/* Send address MSByte */
265 			tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);
266 
267 			CHECK_NACK();
268 
269 			if (tmp & I2C_STAT_XRDY) {
270 				REG(I2C_DXR) = (addr >> 8) & 0xff;
271 			} else {
272 				REG(I2C_CON) = 0;
273 				return(1);
274 			}
275 			/* No break, fall through */
276 		case 1:
277 			/* Send address LSByte */
278 			tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);
279 
280 			CHECK_NACK();
281 
282 			if (tmp & I2C_STAT_XRDY) {
283 				REG(I2C_DXR) = addr & 0xff;
284 			} else {
285 				REG(I2C_CON) = 0;
286 				return(1);
287 			}
288 	}
289 
290 	for (i = 0; i < len; i++) {
291 		tmp = poll_i2c_irq(I2C_STAT_XRDY | I2C_STAT_NACK);
292 
293 		CHECK_NACK();
294 
295 		if (tmp & I2C_STAT_XRDY) {
296 			REG(I2C_DXR) = buf[i];
297 		} else {
298 			return(1);
299 		}
300 	}
301 
302 	tmp = poll_i2c_irq(I2C_STAT_SCD | I2C_STAT_NACK);
303 
304 	CHECK_NACK();
305 
306 	if (!(tmp & I2C_STAT_SCD)) {
307 		REG(I2C_CON) = 0;
308 		return(1);
309 	}
310 
311 	flush_rx();
312 	REG(I2C_STAT) = 0xffff;
313 	REG(I2C_CNT) = 0;
314 	REG(I2C_CON) = 0;
315 
316 	return(0);
317 }
318