1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <common.h>
20#ifdef CONFIG_MPC8260
21#include <ioports.h>
22#include <asm/io.h>
23#endif
24#if defined(CONFIG_AVR32)
25#include <asm/arch/portmux.h>
26#endif
27#if defined(CONFIG_AT91FAMILY)
28#include <asm/io.h>
29#include <asm/arch/hardware.h>
30#include <asm/arch/at91_pio.h>
31#ifdef CONFIG_ATMEL_LEGACY
32#include <asm/arch/gpio.h>
33#endif
34#endif
35#if defined(CONFIG_MPC852T) || defined(CONFIG_MPC866)
36#include <asm/io.h>
37#endif
38#include <i2c.h>
39
40#if defined(CONFIG_SOFT_I2C_GPIO_SCL)
41# include <asm/gpio.h>
42
43# ifndef I2C_GPIO_SYNC
44# define I2C_GPIO_SYNC
45# endif
46
47# ifndef I2C_INIT
48# define I2C_INIT \
49 do { \
50 gpio_request(CONFIG_SOFT_I2C_GPIO_SCL, "soft_i2c"); \
51 gpio_request(CONFIG_SOFT_I2C_GPIO_SDA, "soft_i2c"); \
52 } while (0)
53# endif
54
55# ifndef I2C_ACTIVE
56# define I2C_ACTIVE do { } while (0)
57# endif
58
59# ifndef I2C_TRISTATE
60# define I2C_TRISTATE do { } while (0)
61# endif
62
63# ifndef I2C_READ
64# define I2C_READ gpio_get_value(CONFIG_SOFT_I2C_GPIO_SDA)
65# endif
66
67# ifndef I2C_SDA
68# define I2C_SDA(bit) \
69 do { \
70 if (bit) \
71 gpio_direction_input(CONFIG_SOFT_I2C_GPIO_SDA); \
72 else \
73 gpio_direction_output(CONFIG_SOFT_I2C_GPIO_SDA, 0); \
74 I2C_GPIO_SYNC; \
75 } while (0)
76# endif
77
78# ifndef I2C_SCL
79# define I2C_SCL(bit) \
80 do { \
81 gpio_direction_output(CONFIG_SOFT_I2C_GPIO_SCL, bit); \
82 I2C_GPIO_SYNC; \
83 } while (0)
84# endif
85
86# ifndef I2C_DELAY
87# define I2C_DELAY udelay(5)
88# endif
89
90#endif
91
92
93
94DECLARE_GLOBAL_DATA_PTR;
95
96#ifndef I2C_SOFT_DECLARATIONS
97# if defined(CONFIG_MPC8260)
98# define I2C_SOFT_DECLARATIONS volatile ioport_t *iop = \
99 ioport_addr((immap_t *)CONFIG_SYS_IMMR, I2C_PORT);
100# elif defined(CONFIG_8xx)
101# define I2C_SOFT_DECLARATIONS volatile immap_t *immr = \
102 (immap_t *)CONFIG_SYS_IMMR;
103# else
104# define I2C_SOFT_DECLARATIONS
105# endif
106#endif
107
108#if !defined(CONFIG_SYS_I2C_SOFT_SPEED)
109#define CONFIG_SYS_I2C_SOFT_SPEED CONFIG_SYS_I2C_SPEED
110#endif
111#if !defined(CONFIG_SYS_I2C_SOFT_SLAVE)
112#define CONFIG_SYS_I2C_SOFT_SLAVE CONFIG_SYS_I2C_SLAVE
113#endif
114
115
116
117
118#define RETRIES 0
119
120#define I2C_ACK 0
121#define I2C_NOACK 1
122
123
124#ifdef DEBUG_I2C
125#define PRINTD(fmt,args...) do { \
126 printf (fmt ,##args); \
127 } while (0)
128#else
129#define PRINTD(fmt,args...)
130#endif
131
132
133
134
135#if !defined(CONFIG_SYS_I2C_INIT_BOARD)
136static void send_reset (void);
137#endif
138static void send_start (void);
139static void send_stop (void);
140static void send_ack (int);
141static int write_byte (uchar byte);
142static uchar read_byte (int);
143
144#if !defined(CONFIG_SYS_I2C_INIT_BOARD)
145
146
147
148
149
150static void send_reset(void)
151{
152 I2C_SOFT_DECLARATIONS
153 int j;
154
155 I2C_SCL(1);
156 I2C_SDA(1);
157#ifdef I2C_INIT
158 I2C_INIT;
159#endif
160 I2C_TRISTATE;
161 for(j = 0; j < 9; j++) {
162 I2C_SCL(0);
163 I2C_DELAY;
164 I2C_DELAY;
165 I2C_SCL(1);
166 I2C_DELAY;
167 I2C_DELAY;
168 }
169 send_stop();
170 I2C_TRISTATE;
171}
172#endif
173
174
175
176
177static void send_start(void)
178{
179 I2C_SOFT_DECLARATIONS
180
181 I2C_DELAY;
182 I2C_SDA(1);
183 I2C_ACTIVE;
184 I2C_DELAY;
185 I2C_SCL(1);
186 I2C_DELAY;
187 I2C_SDA(0);
188 I2C_DELAY;
189}
190
191
192
193
194static void send_stop(void)
195{
196 I2C_SOFT_DECLARATIONS
197
198 I2C_SCL(0);
199 I2C_DELAY;
200 I2C_SDA(0);
201 I2C_ACTIVE;
202 I2C_DELAY;
203 I2C_SCL(1);
204 I2C_DELAY;
205 I2C_SDA(1);
206 I2C_DELAY;
207 I2C_TRISTATE;
208}
209
210
211
212
213static void send_ack(int ack)
214{
215 I2C_SOFT_DECLARATIONS
216
217 I2C_SCL(0);
218 I2C_DELAY;
219 I2C_ACTIVE;
220 I2C_SDA(ack);
221 I2C_DELAY;
222 I2C_SCL(1);
223 I2C_DELAY;
224 I2C_DELAY;
225 I2C_SCL(0);
226 I2C_DELAY;
227}
228
229
230
231
232static int write_byte(uchar data)
233{
234 I2C_SOFT_DECLARATIONS
235 int j;
236 int nack;
237
238 I2C_ACTIVE;
239 for(j = 0; j < 8; j++) {
240 I2C_SCL(0);
241 I2C_DELAY;
242 I2C_SDA(data & 0x80);
243 I2C_DELAY;
244 I2C_SCL(1);
245 I2C_DELAY;
246 I2C_DELAY;
247
248 data <<= 1;
249 }
250
251
252
253
254 I2C_SCL(0);
255 I2C_DELAY;
256 I2C_SDA(1);
257 I2C_TRISTATE;
258 I2C_DELAY;
259 I2C_SCL(1);
260 I2C_DELAY;
261 I2C_DELAY;
262 nack = I2C_READ;
263 I2C_SCL(0);
264 I2C_DELAY;
265 I2C_ACTIVE;
266
267 return(nack);
268}
269
270
271
272
273
274static uchar read_byte(int ack)
275{
276 I2C_SOFT_DECLARATIONS
277 int data;
278 int j;
279
280
281
282
283 I2C_TRISTATE;
284 I2C_SDA(1);
285 data = 0;
286 for(j = 0; j < 8; j++) {
287 I2C_SCL(0);
288 I2C_DELAY;
289 I2C_SCL(1);
290 I2C_DELAY;
291 data <<= 1;
292 data |= I2C_READ;
293 I2C_DELAY;
294 }
295 send_ack(ack);
296
297 return(data);
298}
299
300
301
302
303static void soft_i2c_init(struct i2c_adapter *adap, int speed, int slaveaddr)
304{
305#if defined(CONFIG_SYS_I2C_INIT_BOARD)
306
307
308
309 i2c_init_board();
310#else
311
312
313
314
315
316
317 send_reset ();
318#endif
319}
320
321
322
323
324
325
326static int soft_i2c_probe(struct i2c_adapter *adap, uint8_t addr)
327{
328 int rc;
329
330
331
332
333
334 send_start();
335 rc = write_byte ((addr << 1) | 0);
336 send_stop();
337
338 return (rc ? 1 : 0);
339}
340
341
342
343
344static int soft_i2c_read(struct i2c_adapter *adap, uchar chip, uint addr,
345 int alen, uchar *buffer, int len)
346{
347 int shift;
348 PRINTD("i2c_read: chip %02X addr %02X alen %d buffer %p len %d\n",
349 chip, addr, alen, buffer, len);
350
351#ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
352
353
354
355
356
357
358
359
360
361
362
363 chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW);
364
365 PRINTD("i2c_read: fix addr_overflow: chip %02X addr %02X\n",
366 chip, addr);
367#endif
368
369
370
371
372
373
374
375 send_start();
376 if(alen > 0) {
377 if(write_byte(chip << 1)) {
378 send_stop();
379 PRINTD("i2c_read, no chip responded %02X\n", chip);
380 return(1);
381 }
382 shift = (alen-1) * 8;
383 while(alen-- > 0) {
384 if(write_byte(addr >> shift)) {
385 PRINTD("i2c_read, address not <ACK>ed\n");
386 return(1);
387 }
388 shift -= 8;
389 }
390
391
392
393
394
395
396#ifdef CONFIG_SOFT_I2C_READ_REPEATED_START
397 send_start();
398#else
399 send_stop();
400 send_start();
401#endif
402 }
403
404
405
406
407
408 write_byte((chip << 1) | 1);
409 while(len-- > 0) {
410 *buffer++ = read_byte(len == 0);
411 }
412 send_stop();
413 return(0);
414}
415
416
417
418
419static int soft_i2c_write(struct i2c_adapter *adap, uchar chip, uint addr,
420 int alen, uchar *buffer, int len)
421{
422 int shift, failures = 0;
423
424 PRINTD("i2c_write: chip %02X addr %02X alen %d buffer %p len %d\n",
425 chip, addr, alen, buffer, len);
426
427 send_start();
428 if(write_byte(chip << 1)) {
429 send_stop();
430 PRINTD("i2c_write, no chip responded %02X\n", chip);
431 return(1);
432 }
433 shift = (alen-1) * 8;
434 while(alen-- > 0) {
435 if(write_byte(addr >> shift)) {
436 PRINTD("i2c_write, address not <ACK>ed\n");
437 return(1);
438 }
439 shift -= 8;
440 }
441
442 while(len-- > 0) {
443 if(write_byte(*buffer++)) {
444 failures++;
445 }
446 }
447 send_stop();
448 return(failures);
449}
450
451
452
453
454U_BOOT_I2C_ADAP_COMPLETE(soft00, soft_i2c_init, soft_i2c_probe,
455 soft_i2c_read, soft_i2c_write, NULL,
456 CONFIG_SYS_I2C_SOFT_SPEED, CONFIG_SYS_I2C_SOFT_SLAVE,
457 0)
458#if defined(I2C_SOFT_DECLARATIONS2)
459U_BOOT_I2C_ADAP_COMPLETE(soft01, soft_i2c_init, soft_i2c_probe,
460 soft_i2c_read, soft_i2c_write, NULL,
461 CONFIG_SYS_I2C_SOFT_SPEED_2,
462 CONFIG_SYS_I2C_SOFT_SLAVE_2,
463 1)
464#endif
465#if defined(I2C_SOFT_DECLARATIONS3)
466U_BOOT_I2C_ADAP_COMPLETE(soft02, soft_i2c_init, soft_i2c_probe,
467 soft_i2c_read, soft_i2c_write, NULL,
468 CONFIG_SYS_I2C_SOFT_SPEED_3,
469 CONFIG_SYS_I2C_SOFT_SLAVE_3,
470 2)
471#endif
472#if defined(I2C_SOFT_DECLARATIONS4)
473U_BOOT_I2C_ADAP_COMPLETE(soft03, soft_i2c_init, soft_i2c_probe,
474 soft_i2c_read, soft_i2c_write, NULL,
475 CONFIG_SYS_I2C_SOFT_SPEED_4,
476 CONFIG_SYS_I2C_SOFT_SLAVE_4,
477 3)
478#endif
479#if defined(I2C_SOFT_DECLARATIONS5)
480U_BOOT_I2C_ADAP_COMPLETE(soft04, soft_i2c_init, soft_i2c_probe,
481 soft_i2c_read, soft_i2c_write, NULL,
482 CONFIG_SYS_I2C_SOFT_SPEED_5,
483 CONFIG_SYS_I2C_SOFT_SLAVE_5,
484 4)
485#endif
486#if defined(I2C_SOFT_DECLARATIONS6)
487U_BOOT_I2C_ADAP_COMPLETE(soft05, soft_i2c_init, soft_i2c_probe,
488 soft_i2c_read, soft_i2c_write, NULL,
489 CONFIG_SYS_I2C_SOFT_SPEED_6,
490 CONFIG_SYS_I2C_SOFT_SLAVE_6,
491 5)
492#endif
493#if defined(I2C_SOFT_DECLARATIONS7)
494U_BOOT_I2C_ADAP_COMPLETE(soft06, soft_i2c_init, soft_i2c_probe,
495 soft_i2c_read, soft_i2c_write, NULL,
496 CONFIG_SYS_I2C_SOFT_SPEED_7,
497 CONFIG_SYS_I2C_SOFT_SLAVE_7,
498 6)
499#endif
500#if defined(I2C_SOFT_DECLARATIONS8)
501U_BOOT_I2C_ADAP_COMPLETE(soft07, soft_i2c_init, soft_i2c_probe,
502 soft_i2c_read, soft_i2c_write, NULL,
503 CONFIG_SYS_I2C_SOFT_SPEED_8,
504 CONFIG_SYS_I2C_SOFT_SLAVE_8,
505 7)
506#endif
507#if defined(I2C_SOFT_DECLARATIONS9)
508U_BOOT_I2C_ADAP_COMPLETE(soft08, soft_i2c_init, soft_i2c_probe,
509 soft_i2c_read, soft_i2c_write, NULL,
510 CONFIG_SYS_I2C_SOFT_SPEED_9,
511 CONFIG_SYS_I2C_SOFT_SLAVE_9,
512 8)
513#endif
514#if defined(I2C_SOFT_DECLARATIONS10)
515U_BOOT_I2C_ADAP_COMPLETE(soft09, soft_i2c_init, soft_i2c_probe,
516 soft_i2c_read, soft_i2c_write, NULL,
517 CONFIG_SYS_I2C_SOFT_SPEED_10,
518 CONFIG_SYS_I2C_SOFT_SLAVE_10,
519 9)
520#endif
521#if defined(I2C_SOFT_DECLARATIONS11)
522U_BOOT_I2C_ADAP_COMPLETE(soft10, soft_i2c_init, soft_i2c_probe,
523 soft_i2c_read, soft_i2c_write, NULL,
524 CONFIG_SYS_I2C_SOFT_SPEED_11,
525 CONFIG_SYS_I2C_SOFT_SLAVE_11,
526 10)
527#endif
528#if defined(I2C_SOFT_DECLARATIONS12)
529U_BOOT_I2C_ADAP_COMPLETE(soft11, soft_i2c_init, soft_i2c_probe,
530 soft_i2c_read, soft_i2c_write, NULL,
531 CONFIG_SYS_I2C_SOFT_SPEED_12,
532 CONFIG_SYS_I2C_SOFT_SLAVE_12,
533 11)
534#endif
535