Blame view

common/cmd_eeprom.c 11.2 KB
3863585bb   wdenk   Initial revision
1
2
3
4
  /*
   * (C) Copyright 2000, 2001
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
3863585bb   wdenk   Initial revision
6
   */
d4f5c7289     FRAM memory acces...
7
8
9
10
  /*
   * Support for read and write access to EEPROM like memory devices. This
   * includes regular EEPROM as well as  FRAM (ferroelectic nonvolaile RAM).
   * FRAM devices read and write data at bus speed. In particular, there is no
e506a0069   Peter Meerwald   cmd_eeprom: typo
11
   * write delay. Also, there is no limit imposed on the number of bytes that can
d4f5c7289     FRAM memory acces...
12
   * be transferred with a single read or write.
6617aae9b   Wolfgang Denk   Add new board spe...
13
   *
d4f5c7289     FRAM memory acces...
14
15
   * Use the following configuration options to ensure no unneeded performance
   * degradation (typical for EEPROM) is incured for FRAM memory:
6617aae9b   Wolfgang Denk   Add new board spe...
16
   *
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
17
18
   * #define CONFIG_SYS_I2C_FRAM
   * #undef CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS
d4f5c7289     FRAM memory acces...
19
20
   *
   */
3863585bb   wdenk   Initial revision
21
22
23
24
  #include <common.h>
  #include <config.h>
  #include <command.h>
  #include <i2c.h>
3863585bb   wdenk   Initial revision
25
26
27
28
29
  extern void eeprom_init  (void);
  extern int  eeprom_read  (unsigned dev_addr, unsigned offset,
  			  uchar *buffer, unsigned cnt);
  extern int  eeprom_write (unsigned dev_addr, unsigned offset,
  			  uchar *buffer, unsigned cnt);
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
30
  #if defined(CONFIG_SYS_EEPROM_WREN)
98f4a3dfc   Stefan Roese   Add SM501 support...
31
32
  extern int eeprom_write_enable (unsigned dev_addr, int state);
  #endif
3863585bb   wdenk   Initial revision
33

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
34
  #if defined(CONFIG_SYS_EEPROM_X40430)
3863585bb   wdenk   Initial revision
35
36
37
38
39
  	/* Maximum number of times to poll for acknowledge after write */
  #define MAX_ACKNOWLEDGE_POLLS	10
  #endif
  
  /* ------------------------------------------------------------------------- */
baa26db41   Jon Loeliger   common/cmd_[af]*:...
40
  #if defined(CONFIG_CMD_EEPROM)
54841ab50   Wolfgang Denk   Make sure that ar...
41
  int do_eeprom ( cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
3863585bb   wdenk   Initial revision
42
43
44
45
  {
  	const char *const fmt =
  		"
  EEPROM @0x%lX %s: addr %08lx  off %04lx  count %ld ... ";
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
46
  #if defined(CONFIG_SYS_I2C_MULTI_EEPROMS)
3863585bb   wdenk   Initial revision
47
48
49
50
51
52
53
  	if (argc == 6) {
  		ulong dev_addr = simple_strtoul (argv[2], NULL, 16);
  		ulong addr = simple_strtoul (argv[3], NULL, 16);
  		ulong off  = simple_strtoul (argv[4], NULL, 16);
  		ulong cnt  = simple_strtoul (argv[5], NULL, 16);
  #else
  	if (argc == 5) {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
54
  		ulong dev_addr = CONFIG_SYS_DEF_EEPROM_ADDR;
3863585bb   wdenk   Initial revision
55
56
57
  		ulong addr = simple_strtoul (argv[2], NULL, 16);
  		ulong off  = simple_strtoul (argv[3], NULL, 16);
  		ulong cnt  = simple_strtoul (argv[4], NULL, 16);
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
58
  #endif /* CONFIG_SYS_I2C_MULTI_EEPROMS */
3863585bb   wdenk   Initial revision
59

548738b4d   Heiko Schocher   cmd_eeprom: I2C u...
60
  # if !defined(CONFIG_SPI) || defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
3863585bb   wdenk   Initial revision
61
62
63
64
65
66
67
68
69
  		eeprom_init ();
  # endif /* !CONFIG_SPI */
  
  		if (strcmp (argv[1], "read") == 0) {
  			int rcode;
  
  			printf (fmt, dev_addr, argv[1], addr, off, cnt);
  
  			rcode = eeprom_read (dev_addr, off, (uchar *) addr, cnt);
4b9206ed5   wdenk   * Patches by Thom...
70
71
  			puts ("done
  ");
3863585bb   wdenk   Initial revision
72
73
74
75
76
77
78
  			return rcode;
  		} else if (strcmp (argv[1], "write") == 0) {
  			int rcode;
  
  			printf (fmt, dev_addr, argv[1], addr, off, cnt);
  
  			rcode = eeprom_write (dev_addr, off, (uchar *) addr, cnt);
4b9206ed5   wdenk   * Patches by Thom...
79
80
  			puts ("done
  ");
3863585bb   wdenk   Initial revision
81
82
83
  			return rcode;
  		}
  	}
4c12eeb8b   Simon Glass   Convert cmd_usage...
84
  	return CMD_RET_USAGE;
3863585bb   wdenk   Initial revision
85
  }
902531788   Jon Loeliger   common/: Remove l...
86
  #endif
3863585bb   wdenk   Initial revision
87
88
89
  
  /*-----------------------------------------------------------------------
   *
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
90
   * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 2 (16-bit EEPROM address) offset is
3863585bb   wdenk   Initial revision
91
92
   *   0x000nxxxx for EEPROM address selectors at n, offset xxxx in EEPROM.
   *
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
93
   * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 (8-bit EEPROM page address) offset is
3863585bb   wdenk   Initial revision
94
95
   *   0x00000nxx for EEPROM address selectors and page number at n.
   */
548738b4d   Heiko Schocher   cmd_eeprom: I2C u...
96
  #if !defined(CONFIG_SPI) || defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
97
98
  #if !defined(CONFIG_SYS_I2C_EEPROM_ADDR_LEN) || CONFIG_SYS_I2C_EEPROM_ADDR_LEN < 1 || CONFIG_SYS_I2C_EEPROM_ADDR_LEN > 2
  #error CONFIG_SYS_I2C_EEPROM_ADDR_LEN must be 1 or 2
3863585bb   wdenk   Initial revision
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  #endif
  #endif
  
  int eeprom_read (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt)
  {
  	unsigned end = offset + cnt;
  	unsigned blk_off;
  	int rcode = 0;
  
  	/* Read data until done or would cross a page boundary.
  	 * We must write the address again when changing pages
  	 * because the next page may be in a different device.
  	 */
  	while (offset < end) {
d4f5c7289     FRAM memory acces...
113
  		unsigned alen, len;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
114
  #if !defined(CONFIG_SYS_I2C_FRAM)
d4f5c7289     FRAM memory acces...
115
116
  		unsigned maxlen;
  #endif
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
117
  #if CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 && !defined(CONFIG_SPI_X)
3863585bb   wdenk   Initial revision
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
  		uchar addr[2];
  
  		blk_off = offset & 0xFF;	/* block offset */
  
  		addr[0] = offset >> 8;		/* block number */
  		addr[1] = blk_off;		/* block offset */
  		alen	= 2;
  #else
  		uchar addr[3];
  
  		blk_off = offset & 0xFF;	/* block offset */
  
  		addr[0] = offset >> 16;		/* block number */
  		addr[1] = offset >>  8;		/* upper address octet */
  		addr[2] = blk_off;		/* lower address octet */
  		alen	= 3;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
134
  #endif	/* CONFIG_SYS_I2C_EEPROM_ADDR_LEN, CONFIG_SPI_X */
3863585bb   wdenk   Initial revision
135
136
  
  		addr[0] |= dev_addr;		/* insert device address */
d4f5c7289     FRAM memory acces...
137
138
139
140
141
142
143
  		len = end - offset;
  
  		/*
  		 * For a FRAM device there is no limit on the number of the
  		 * bytes that can be ccessed with the single read or write
  		 * operation.
  		 */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
144
  #if !defined(CONFIG_SYS_I2C_FRAM)
3863585bb   wdenk   Initial revision
145
146
147
  		maxlen = 0x100 - blk_off;
  		if (maxlen > I2C_RXTX_LEN)
  			maxlen = I2C_RXTX_LEN;
3863585bb   wdenk   Initial revision
148
149
  		if (len > maxlen)
  			len = maxlen;
d4f5c7289     FRAM memory acces...
150
  #endif
548738b4d   Heiko Schocher   cmd_eeprom: I2C u...
151
  #if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
3863585bb   wdenk   Initial revision
152
153
  		spi_read (addr, alen, buffer, len);
  #else
6ca6d080d   Kuo-Jung Su   cmd_eeprom: bug f...
154
  		if (i2c_read(addr[0], offset, alen - 1, buffer, len))
3863585bb   wdenk   Initial revision
155
156
157
158
159
  			rcode = 1;
  #endif
  		buffer += len;
  		offset += len;
  	}
d4f5c7289     FRAM memory acces...
160

3863585bb   wdenk   Initial revision
161
162
163
164
165
  	return rcode;
  }
  
  /*-----------------------------------------------------------------------
   *
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
166
   * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 2 (16-bit EEPROM address) offset is
3863585bb   wdenk   Initial revision
167
168
   *   0x000nxxxx for EEPROM address selectors at n, offset xxxx in EEPROM.
   *
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
169
   * for CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 (8-bit EEPROM page address) offset is
3863585bb   wdenk   Initial revision
170
171
172
173
174
175
176
177
   *   0x00000nxx for EEPROM address selectors and page number at n.
   */
  
  int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt)
  {
  	unsigned end = offset + cnt;
  	unsigned blk_off;
  	int rcode = 0;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
178
  #if defined(CONFIG_SYS_EEPROM_X40430)
3863585bb   wdenk   Initial revision
179
180
181
182
183
184
  	uchar	contr_r_addr[2];
  	uchar	addr_void[2];
  	uchar	contr_reg[2];
  	uchar	ctrl_reg_v;
  	int	i;
  #endif
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
185
  #if defined(CONFIG_SYS_EEPROM_WREN)
98f4a3dfc   Stefan Roese   Add SM501 support...
186
187
  	eeprom_write_enable (dev_addr,1);
  #endif
3863585bb   wdenk   Initial revision
188
189
190
191
192
193
  	/* Write data until done or would cross a write page boundary.
  	 * We must write the address again when changing pages
  	 * because the address counter only increments within a page.
  	 */
  
  	while (offset < end) {
d4f5c7289     FRAM memory acces...
194
  		unsigned alen, len;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
195
  #if !defined(CONFIG_SYS_I2C_FRAM)
d4f5c7289     FRAM memory acces...
196
197
  		unsigned maxlen;
  #endif
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
198
  #if CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 && !defined(CONFIG_SPI_X)
3863585bb   wdenk   Initial revision
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
  		uchar addr[2];
  
  		blk_off = offset & 0xFF;	/* block offset */
  
  		addr[0] = offset >> 8;		/* block number */
  		addr[1] = blk_off;		/* block offset */
  		alen	= 2;
  #else
  		uchar addr[3];
  
  		blk_off = offset & 0xFF;	/* block offset */
  
  		addr[0] = offset >> 16;		/* block number */
  		addr[1] = offset >>  8;		/* upper address octet */
  		addr[2] = blk_off;		/* lower address octet */
  		alen	= 3;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
215
  #endif	/* CONFIG_SYS_I2C_EEPROM_ADDR_LEN, CONFIG_SPI_X */
3863585bb   wdenk   Initial revision
216
217
  
  		addr[0] |= dev_addr;		/* insert device address */
d4f5c7289     FRAM memory acces...
218
219
220
221
  		len = end - offset;
  
  		/*
  		 * For a FRAM device there is no limit on the number of the
f9a78b8d4   Michael Jones   cosmetic: spell f...
222
  		 * bytes that can be accessed with the single read or write
d4f5c7289     FRAM memory acces...
223
224
  		 * operation.
  		 */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
225
  #if !defined(CONFIG_SYS_I2C_FRAM)
d4f5c7289     FRAM memory acces...
226

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
227
  #if defined(CONFIG_SYS_EEPROM_PAGE_WRITE_BITS)
3863585bb   wdenk   Initial revision
228

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
229
  #define	EEPROM_PAGE_SIZE	(1 << CONFIG_SYS_EEPROM_PAGE_WRITE_BITS)
3863585bb   wdenk   Initial revision
230
231
232
233
234
235
236
237
  #define	EEPROM_PAGE_OFFSET(x)	((x) & (EEPROM_PAGE_SIZE - 1))
  
  		maxlen = EEPROM_PAGE_SIZE - EEPROM_PAGE_OFFSET(blk_off);
  #else
  		maxlen = 0x100 - blk_off;
  #endif
  		if (maxlen > I2C_RXTX_LEN)
  			maxlen = I2C_RXTX_LEN;
3863585bb   wdenk   Initial revision
238
239
  		if (len > maxlen)
  			len = maxlen;
d4f5c7289     FRAM memory acces...
240
  #endif
548738b4d   Heiko Schocher   cmd_eeprom: I2C u...
241
  #if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
3863585bb   wdenk   Initial revision
242
243
  		spi_write (addr, alen, buffer, len);
  #else
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
244
  #if defined(CONFIG_SYS_EEPROM_X40430)
3863585bb   wdenk   Initial revision
245
246
247
248
249
250
251
252
  		/* Get the value of the control register.
  		 * Set current address (internal pointer in the x40430)
  		 * to 0x1ff.
  		 */
  		contr_r_addr[0] = 9;
  		contr_r_addr[1] = 0xff;
  		addr_void[0]    = 0;
  		addr_void[1]    = addr[1];
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
253
254
255
  #ifdef CONFIG_SYS_I2C_EEPROM_ADDR
  		contr_r_addr[0] |= CONFIG_SYS_I2C_EEPROM_ADDR;
  		addr_void[0]    |= CONFIG_SYS_I2C_EEPROM_ADDR;
3863585bb   wdenk   Initial revision
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
  #endif
  		contr_reg[0] = 0xff;
  		if (i2c_read (contr_r_addr[0], contr_r_addr[1], 1, contr_reg, 1) != 0) {
  			rcode = 1;
  		}
  		ctrl_reg_v = contr_reg[0];
  
  		/* Are any of the eeprom blocks write protected?
  		 */
  		if (ctrl_reg_v & 0x18) {
  			ctrl_reg_v &= ~0x18;   /* reset block protect bits  */
  			ctrl_reg_v |=  0x02;   /* set write enable latch    */
  			ctrl_reg_v &= ~0x04;   /* clear RWEL                */
  
  			/* Set write enable latch.
  			 */
  			contr_reg[0] = 0x02;
  			if (i2c_write (contr_r_addr[0], 0xff, 1, contr_reg, 1) != 0) {
  				rcode = 1;
  			}
  
  			/* Set register write enable latch.
  			 */
  			contr_reg[0] = 0x06;
  			if (i2c_write (contr_r_addr[0], 0xFF, 1, contr_reg, 1) != 0) {
  				rcode = 1;
  			}
  
  			/* Modify ctrl register.
  			 */
  			contr_reg[0] = ctrl_reg_v;
  			if (i2c_write (contr_r_addr[0], 0xFF, 1, contr_reg, 1) != 0) {
  				rcode = 1;
  			}
  
  			/* The write (above) is an operation on NV memory.
  			 * These can take some time (~5ms), and the device
  			 * will not respond to further I2C messages till
  			 * it's completed the write.
  			 * So poll device for an I2C acknowledge.
  			 * When we get one we know we can continue with other
  			 * operations.
  			 */
  			contr_reg[0] = 0;
  			for (i = 0; i < MAX_ACKNOWLEDGE_POLLS; i++) {
aacf9a49a   wdenk   * Add dual ethern...
301
  				if (i2c_read (addr_void[0], addr_void[1], 1, contr_reg, 1) == 0)
3863585bb   wdenk   Initial revision
302
  					break;	/* got ack */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
303
304
  #if defined(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS)
  				udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
3863585bb   wdenk   Initial revision
305
306
307
  #endif
  			}
  			if (i == MAX_ACKNOWLEDGE_POLLS) {
4b9206ed5   wdenk   * Patches by Thom...
308
309
  				puts ("EEPROM poll acknowledge failed
  ");
3863585bb   wdenk   Initial revision
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
  				rcode = 1;
  			}
  		}
  
  		/* Is the write enable latch on?.
  		 */
  		else if (!(ctrl_reg_v & 0x02)) {
  			/* Set write enable latch.
  			 */
  			contr_reg[0] = 0x02;
  			if (i2c_write (contr_r_addr[0], 0xFF, 1, contr_reg, 1) != 0) {
  			       rcode = 1;
  			}
  		}
  		/* Write is enabled ... now write eeprom value.
  		 */
  #endif
6ca6d080d   Kuo-Jung Su   cmd_eeprom: bug f...
327
  		if (i2c_write(addr[0], offset, alen - 1, buffer, len))
3863585bb   wdenk   Initial revision
328
329
330
331
332
  			rcode = 1;
  
  #endif
  		buffer += len;
  		offset += len;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
333
334
  #if defined(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS)
  		udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
3863585bb   wdenk   Initial revision
335
336
  #endif
  	}
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
337
  #if defined(CONFIG_SYS_EEPROM_WREN)
98f4a3dfc   Stefan Roese   Add SM501 support...
338
339
  	eeprom_write_enable (dev_addr,0);
  #endif
3863585bb   wdenk   Initial revision
340
341
  	return rcode;
  }
548738b4d   Heiko Schocher   cmd_eeprom: I2C u...
342
  #if !defined(CONFIG_SPI) || defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
6dd652fa4   wdenk   Patches by Murray...
343
344
345
346
347
348
349
  int
  eeprom_probe (unsigned dev_addr, unsigned offset)
  {
  	unsigned char chip;
  
  	/* Probe the chip address
  	 */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
350
  #if CONFIG_SYS_I2C_EEPROM_ADDR_LEN == 1 && !defined(CONFIG_SPI_X)
6dd652fa4   wdenk   Patches by Murray...
351
352
353
  	chip = offset >> 8;		/* block number */
  #else
  	chip = offset >> 16;		/* block number */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
354
  #endif	/* CONFIG_SYS_I2C_EEPROM_ADDR_LEN, CONFIG_SPI_X */
6dd652fa4   wdenk   Patches by Murray...
355
356
357
358
359
360
  
  	chip |= dev_addr;		/* insert device address */
  
  	return (i2c_probe (chip));
  }
  #endif
3863585bb   wdenk   Initial revision
361
362
363
  /*-----------------------------------------------------------------------
   * Set default values
   */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
364
365
  #ifndef	CONFIG_SYS_I2C_SPEED
  #define	CONFIG_SYS_I2C_SPEED	50000
3863585bb   wdenk   Initial revision
366
  #endif
3863585bb   wdenk   Initial revision
367
368
  void eeprom_init  (void)
  {
548738b4d   Heiko Schocher   cmd_eeprom: I2C u...
369
370
  
  #if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
3863585bb   wdenk   Initial revision
371
372
  	spi_init_f ();
  #endif
01a0c6476   Matthias Fuchs   common, env: Fix ...
373
374
375
376
377
378
379
  #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C_SOFT) || \
  	defined(CONFIG_SYS_I2C)
  #ifdef CONFIG_SYS_I2C
  	i2c_init_all();
  #else
  	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
  #endif
3863585bb   wdenk   Initial revision
380
381
  #endif
  }
548738b4d   Heiko Schocher   cmd_eeprom: I2C u...
382

3863585bb   wdenk   Initial revision
383
384
  /*-----------------------------------------------------------------------
   */
902531788   Jon Loeliger   common/: Remove l...
385

8bde7f776   wdenk   * Code cleanup:
386
  /***************************************************/
baa26db41   Jon Loeliger   common/cmd_[af]*:...
387
  #if defined(CONFIG_CMD_EEPROM)
8bde7f776   wdenk   * Code cleanup:
388

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
389
  #ifdef CONFIG_SYS_I2C_MULTI_EEPROMS
0d4983930   wdenk   Patch by Kenneth ...
390
391
  U_BOOT_CMD(
  	eeprom,	6,	1,	do_eeprom,
2fb2604d5   Peter Tyser   Command usage cle...
392
  	"EEPROM sub-system",
8bde7f776   wdenk   * Code cleanup:
393
394
395
396
  	"read  devaddr addr off cnt
  "
  	"eeprom write devaddr addr off cnt
  "
a89c33db9   Wolfgang Denk   General help mess...
397
  	"       - read/write `cnt' bytes from `devaddr` EEPROM at offset `off'"
8bde7f776   wdenk   * Code cleanup:
398
399
  );
  #else /* One EEPROM */
0d4983930   wdenk   Patch by Kenneth ...
400
401
  U_BOOT_CMD(
  	eeprom,	5,	1,	do_eeprom,
2fb2604d5   Peter Tyser   Command usage cle...
402
  	"EEPROM sub-system",
8bde7f776   wdenk   * Code cleanup:
403
404
405
406
  	"read  addr off cnt
  "
  	"eeprom write addr off cnt
  "
a89c33db9   Wolfgang Denk   General help mess...
407
  	"       - read/write `cnt' bytes at EEPROM offset `off'"
8bde7f776   wdenk   * Code cleanup:
408
  );
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
409
  #endif /* CONFIG_SYS_I2C_MULTI_EEPROMS */
8bde7f776   wdenk   * Code cleanup:
410

902531788   Jon Loeliger   common/: Remove l...
411
  #endif