]> git.ipfire.org Git - people/ms/u-boot.git/blob - board/sandburst/common/ppc440gx_i2c.c
Command usage cleanup
[people/ms/u-boot.git] / board / sandburst / common / ppc440gx_i2c.c
1 /*
2 * Copyright (C) 2005 Sandburst Corporation
3 *
4 * See file CREDITS for list of people who contributed to this
5 * project.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20 * MA 02111-1307 USA
21 */
22
23 /*
24 * Ported from cpu/ppc4xx/i2c.c by AS HARNOIS by
25 * Travis B. Sawyer
26 * Sandburst Corporation.
27 */
28 #include <common.h>
29 #include <ppc4xx.h>
30 #include <4xx_i2c.h>
31 #include <i2c.h>
32 #include <command.h>
33 #include "ppc440gx_i2c.h"
34
35 #ifdef CONFIG_I2C_BUS1
36
37 #define IIC_OK 0
38 #define IIC_NOK 1
39 #define IIC_NOK_LA 2 /* Lost arbitration */
40 #define IIC_NOK_ICT 3 /* Incomplete transfer */
41 #define IIC_NOK_XFRA 4 /* Transfer aborted */
42 #define IIC_NOK_DATA 5 /* No data in buffer */
43 #define IIC_NOK_TOUT 6 /* Transfer timeout */
44
45 #define IIC_TIMEOUT 1 /* 1 second */
46 #if defined(CONFIG_SYS_I2C_NOPROBES)
47 static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
48 #endif
49
50 static void _i2c_bus1_reset (void)
51 {
52 int i, status;
53
54 /* Reset status register */
55 /* write 1 in SCMP and IRQA to clear these fields */
56 out8 (IIC_STS1, 0x0A);
57
58 /* write 1 in IRQP IRQD LA ICT XFRA to clear these fields */
59 out8 (IIC_EXTSTS1, 0x8F);
60 __asm__ volatile ("eieio");
61
62 /*
63 * Get current state, reset bus
64 * only if no transfers are pending.
65 */
66 i = 10;
67 do {
68 /* Get status */
69 status = in8 (IIC_STS1);
70 udelay (500); /* 500us */
71 i--;
72 } while ((status & IIC_STS_PT) && (i > 0));
73 /* Soft reset controller */
74 status = in8 (IIC_XTCNTLSS1);
75 out8 (IIC_XTCNTLSS1, (status | IIC_XTCNTLSS_SRST));
76 __asm__ volatile ("eieio");
77
78 /* make sure where in initial state, data hi, clock hi */
79 out8 (IIC_DIRECTCNTL1, 0xC);
80 for (i = 0; i < 10; i++) {
81 if ((in8 (IIC_DIRECTCNTL1) & 0x3) != 0x3) {
82 /* clock until we get to known state */
83 out8 (IIC_DIRECTCNTL1, 0x8); /* clock lo */
84 udelay (100); /* 100us */
85 out8 (IIC_DIRECTCNTL1, 0xC); /* clock hi */
86 udelay (100); /* 100us */
87 } else {
88 break;
89 }
90 }
91 /* send start condition */
92 out8 (IIC_DIRECTCNTL1, 0x4);
93 udelay (1000); /* 1ms */
94 /* send stop condition */
95 out8 (IIC_DIRECTCNTL1, 0xC);
96 udelay (1000); /* 1ms */
97 /* Unreset controller */
98 out8 (IIC_XTCNTLSS1, (status & ~IIC_XTCNTLSS_SRST));
99 udelay (1000); /* 1ms */
100 }
101
102 void i2c1_init (int speed, int slaveadd)
103 {
104 sys_info_t sysInfo;
105 unsigned long freqOPB;
106 int val, divisor;
107
108 #ifdef CONFIG_SYS_I2C_INIT_BOARD
109 /* call board specific i2c bus reset routine before accessing the */
110 /* environment, which might be in a chip on that bus. For details */
111 /* about this problem see doc/I2C_Edge_Conditions. */
112 i2c_init_board();
113 #endif
114
115 /* Handle possible failed I2C state */
116 /* FIXME: put this into i2c_init_board()? */
117 _i2c_bus1_reset ();
118
119 /* clear lo master address */
120 out8 (IIC_LMADR1, 0);
121
122 /* clear hi master address */
123 out8 (IIC_HMADR1, 0);
124
125 /* clear lo slave address */
126 out8 (IIC_LSADR1, 0);
127
128 /* clear hi slave address */
129 out8 (IIC_HSADR1, 0);
130
131 /* Clock divide Register */
132 /* get OPB frequency */
133 get_sys_info (&sysInfo);
134 freqOPB = sysInfo.freqPLB / sysInfo.pllOpbDiv;
135 /* set divisor according to freqOPB */
136 divisor = (freqOPB - 1) / 10000000;
137 if (divisor == 0)
138 divisor = 1;
139 out8 (IIC_CLKDIV1, divisor);
140
141 /* no interrupts */
142 out8 (IIC_INTRMSK1, 0);
143
144 /* clear transfer count */
145 out8 (IIC_XFRCNT1, 0);
146
147 /* clear extended control & stat */
148 /* write 1 in SRC SRS SWC SWS to clear these fields */
149 out8 (IIC_XTCNTLSS1, 0xF0);
150
151 /* Mode Control Register
152 Flush Slave/Master data buffer */
153 out8 (IIC_MDCNTL1, IIC_MDCNTL_FSDB | IIC_MDCNTL_FMDB);
154 __asm__ volatile ("eieio");
155
156
157 val = in8(IIC_MDCNTL1);
158 __asm__ volatile ("eieio");
159
160 /* Ignore General Call, slave transfers are ignored,
161 disable interrupts, exit unknown bus state, enable hold
162 SCL
163 100kHz normaly or FastMode for 400kHz and above
164 */
165
166 val |= IIC_MDCNTL_EUBS|IIC_MDCNTL_HSCL;
167 if( speed >= 400000 ){
168 val |= IIC_MDCNTL_FSM;
169 }
170 out8 (IIC_MDCNTL1, val);
171
172 /* clear control reg */
173 out8 (IIC_CNTL1, 0x00);
174 __asm__ volatile ("eieio");
175
176 }
177
178 /*
179 This code tries to use the features of the 405GP i2c
180 controller. It will transfer up to 4 bytes in one pass
181 on the loop. It only does out8(lbz) to the buffer when it
182 is possible to do out16(lhz) transfers.
183
184 cmd_type is 0 for write 1 for read.
185
186 addr_len can take any value from 0-255, it is only limited
187 by the char, we could make it larger if needed. If it is
188 0 we skip the address write cycle.
189
190 Typical case is a Write of an addr followd by a Read. The
191 IBM FAQ does not cover this. On the last byte of the write
192 we don't set the creg CHT bit, and on the first bytes of the
193 read we set the RPST bit.
194
195 It does not support address only transfers, there must be
196 a data part. If you want to write the address yourself, put
197 it in the data pointer.
198
199 It does not support transfer to/from address 0.
200
201 It does not check XFRCNT.
202 */
203 static
204 int i2c_transfer1(unsigned char cmd_type,
205 unsigned char chip,
206 unsigned char addr[],
207 unsigned char addr_len,
208 unsigned char data[],
209 unsigned short data_len )
210 {
211 unsigned char* ptr;
212 int reading;
213 int tran,cnt;
214 int result;
215 int status;
216 int i;
217 uchar creg;
218
219 if( data == 0 || data_len == 0 ){
220 /*Don't support data transfer of no length or to address 0*/
221 printf( "i2c_transfer: bad call\n" );
222 return IIC_NOK;
223 }
224 if( addr && addr_len ){
225 ptr = addr;
226 cnt = addr_len;
227 reading = 0;
228 }else{
229 ptr = data;
230 cnt = data_len;
231 reading = cmd_type;
232 }
233
234 /*Clear Stop Complete Bit*/
235 out8(IIC_STS1,IIC_STS_SCMP);
236 /* Check init */
237 i=10;
238 do {
239 /* Get status */
240 status = in8(IIC_STS1);
241 __asm__ volatile("eieio");
242 i--;
243 } while ((status & IIC_STS_PT) && (i>0));
244
245 if (status & IIC_STS_PT) {
246 result = IIC_NOK_TOUT;
247 return(result);
248 }
249 /*flush the Master/Slave Databuffers*/
250 out8(IIC_MDCNTL1, ((in8(IIC_MDCNTL1))|IIC_MDCNTL_FMDB|IIC_MDCNTL_FSDB));
251 /*need to wait 4 OPB clocks? code below should take that long*/
252
253 /* 7-bit adressing */
254 out8(IIC_HMADR1,0);
255 out8(IIC_LMADR1, chip);
256 __asm__ volatile("eieio");
257
258 tran = 0;
259 result = IIC_OK;
260 creg = 0;
261
262 while ( tran != cnt && (result == IIC_OK)) {
263 int bc,j;
264
265 /* Control register =
266 Normal transfer, 7-bits adressing, Transfer up to bc bytes, Normal start,
267 Transfer is a sequence of transfers
268 */
269 creg |= IIC_CNTL_PT;
270
271 bc = (cnt - tran) > 4 ? 4 :
272 cnt - tran;
273 creg |= (bc-1)<<4;
274 /* if the real cmd type is write continue trans*/
275 if ( (!cmd_type && (ptr == addr)) || ((tran+bc) != cnt) )
276 creg |= IIC_CNTL_CHT;
277
278 if (reading)
279 creg |= IIC_CNTL_READ;
280 else {
281 for(j=0; j<bc; j++) {
282 /* Set buffer */
283 out8(IIC_MDBUF1,ptr[tran+j]);
284 __asm__ volatile("eieio");
285 }
286 }
287 out8(IIC_CNTL1, creg );
288 __asm__ volatile("eieio");
289
290 /* Transfer is in progress
291 we have to wait for upto 5 bytes of data
292 1 byte chip address+r/w bit then bc bytes
293 of data.
294 udelay(10) is 1 bit time at 100khz
295 Doubled for slop. 20 is too small.
296 */
297 i=2*5*8;
298 do {
299 /* Get status */
300 status = in8(IIC_STS1);
301 __asm__ volatile("eieio");
302 udelay (10);
303 i--;
304 } while ((status & IIC_STS_PT) && !(status & IIC_STS_ERR)
305 && (i>0));
306
307 if (status & IIC_STS_ERR) {
308 result = IIC_NOK;
309 status = in8 (IIC_EXTSTS1);
310 /* Lost arbitration? */
311 if (status & IIC_EXTSTS_LA)
312 result = IIC_NOK_LA;
313 /* Incomplete transfer? */
314 if (status & IIC_EXTSTS_ICT)
315 result = IIC_NOK_ICT;
316 /* Transfer aborted? */
317 if (status & IIC_EXTSTS_XFRA)
318 result = IIC_NOK_XFRA;
319 } else if ( status & IIC_STS_PT) {
320 result = IIC_NOK_TOUT;
321 }
322 /* Command is reading => get buffer */
323 if ((reading) && (result == IIC_OK)) {
324 /* Are there data in buffer */
325 if (status & IIC_STS_MDBS) {
326 /*
327 even if we have data we have to wait 4OPB clocks
328 for it to hit the front of the FIFO, after that
329 we can just read. We should check XFCNT here and
330 if the FIFO is full there is no need to wait.
331 */
332 udelay (1);
333 for(j=0;j<bc;j++) {
334 ptr[tran+j] = in8(IIC_MDBUF1);
335 __asm__ volatile("eieio");
336 }
337 } else
338 result = IIC_NOK_DATA;
339 }
340 creg = 0;
341 tran+=bc;
342 if( ptr == addr && tran == cnt ) {
343 ptr = data;
344 cnt = data_len;
345 tran = 0;
346 reading = cmd_type;
347 if( reading )
348 creg = IIC_CNTL_RPST;
349 }
350 }
351 return (result);
352 }
353
354 int i2c_probe1 (uchar chip)
355 {
356 uchar buf[1];
357
358 buf[0] = 0;
359
360 /*
361 * What is needed is to send the chip address and verify that the
362 * address was <ACK>ed (i.e. there was a chip at that address which
363 * drove the data line low).
364 */
365 return(i2c_transfer1 (1, chip << 1, 0,0, buf, 1) != 0);
366 }
367
368
369 int i2c_read1 (uchar chip, uint addr, int alen, uchar * buffer, int len)
370 {
371 uchar xaddr[4];
372 int ret;
373
374 if ( alen > 4 ) {
375 printf ("I2C read: addr len %d not supported\n", alen);
376 return 1;
377 }
378
379 if ( alen > 0 ) {
380 xaddr[0] = (addr >> 24) & 0xFF;
381 xaddr[1] = (addr >> 16) & 0xFF;
382 xaddr[2] = (addr >> 8) & 0xFF;
383 xaddr[3] = addr & 0xFF;
384 }
385
386
387 #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
388 /*
389 * EEPROM chips that implement "address overflow" are ones
390 * like Catalyst 24WC04/08/16 which has 9/10/11 bits of
391 * address and the extra bits end up in the "chip address"
392 * bit slots. This makes a 24WC08 (1Kbyte) chip look like
393 * four 256 byte chips.
394 *
395 * Note that we consider the length of the address field to
396 * still be one byte because the extra address bits are
397 * hidden in the chip address.
398 */
399 if( alen > 0 )
400 chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW);
401 #endif
402 if( (ret = i2c_transfer1( 1, chip<<1, &xaddr[4-alen], alen, buffer, len )) != 0) {
403 printf( "I2c read: failed %d\n", ret);
404 return 1;
405 }
406 return 0;
407 }
408
409 int i2c_write1 (uchar chip, uint addr, int alen, uchar * buffer, int len)
410 {
411 uchar xaddr[4];
412
413 if ( alen > 4 ) {
414 printf ("I2C write: addr len %d not supported\n", alen);
415 return 1;
416
417 }
418 if ( alen > 0 ) {
419 xaddr[0] = (addr >> 24) & 0xFF;
420 xaddr[1] = (addr >> 16) & 0xFF;
421 xaddr[2] = (addr >> 8) & 0xFF;
422 xaddr[3] = addr & 0xFF;
423 }
424
425 #ifdef CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW
426 /*
427 * EEPROM chips that implement "address overflow" are ones
428 * like Catalyst 24WC04/08/16 which has 9/10/11 bits of
429 * address and the extra bits end up in the "chip address"
430 * bit slots. This makes a 24WC08 (1Kbyte) chip look like
431 * four 256 byte chips.
432 *
433 * Note that we consider the length of the address field to
434 * still be one byte because the extra address bits are
435 * hidden in the chip address.
436 */
437 if( alen > 0 )
438 chip |= ((addr >> (alen * 8)) & CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW);
439 #endif
440
441 return (i2c_transfer1( 0, chip<<1, &xaddr[4-alen], alen, buffer, len ) != 0);
442 }
443
444 /*-----------------------------------------------------------------------
445 * Read a register
446 */
447 uchar i2c_reg_read1(uchar i2c_addr, uchar reg)
448 {
449 uchar buf;
450
451 i2c_read1(i2c_addr, reg, 1, &buf, (uchar)1);
452
453 return(buf);
454 }
455
456 /*-----------------------------------------------------------------------
457 * Write a register
458 */
459 void i2c_reg_write1(uchar i2c_addr, uchar reg, uchar val)
460 {
461 i2c_write1(i2c_addr, reg, 1, &val, 1);
462 }
463
464
465 int do_i2c1_probe(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
466 {
467 int j;
468 #if defined(CONFIG_SYS_I2C_NOPROBES)
469 int k, skip;
470 #endif
471
472 puts ("Valid chip addresses:");
473 for(j = 0; j < 128; j++) {
474 #if defined(CONFIG_SYS_I2C_NOPROBES)
475 skip = 0;
476 for (k = 0; k < sizeof(i2c_no_probes); k++){
477 if (j == i2c_no_probes[k]){
478 skip = 1;
479 break;
480 }
481 }
482 if (skip)
483 continue;
484 #endif
485 if(i2c_probe1(j) == 0) {
486 printf(" %02X", j);
487 }
488 }
489 putc ('\n');
490
491 #if defined(CONFIG_SYS_I2C_NOPROBES)
492 puts ("Excluded chip addresses:");
493 for( k = 0; k < sizeof(i2c_no_probes); k++ )
494 printf(" %02X", i2c_no_probes[k] );
495 putc ('\n');
496 #endif
497
498 return 0;
499 }
500
501 U_BOOT_CMD(
502 iprobe1, 1, 1, do_i2c1_probe,
503 "probe to discover valid I2C chip addresses",
504 "\n -discover valid I2C chip addresses\n"
505 );
506
507 #endif /* CONFIG_I2C_BUS1 */