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