Blame view

cmd/i2c.c 48.5 KB
81a8824f2   wdenk   Initial revision
1
  /*
3f4978c71   Heiko Schocher   i2c: common chang...
2
3
4
5
6
   * (C) Copyright 2009
   * Sergey Kubushyn, himself, ksi@koi8.net
   *
   * Changes for unified multibus/multiadapter I2C support.
   *
81a8824f2   wdenk   Initial revision
7
8
9
   * (C) Copyright 2001
   * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
10
   * SPDX-License-Identifier:	GPL-2.0+
81a8824f2   wdenk   Initial revision
11
12
13
14
15
16
17
18
   */
  
  /*
   * I2C Functions similar to the standard memory functions.
   *
   * There are several parameters in many of the commands that bear further
   * explanations:
   *
81a8824f2   wdenk   Initial revision
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
   * {i2c_chip} is the I2C chip address (the first byte sent on the bus).
   *   Each I2C chip on the bus has a unique address.  On the I2C data bus,
   *   the address is the upper seven bits and the LSB is the "read/write"
   *   bit.  Note that the {i2c_chip} address specified on the command
   *   line is not shifted up: e.g. a typical EEPROM memory chip may have
   *   an I2C address of 0x50, but the data put on the bus will be 0xA0
   *   for write and 0xA1 for read.  This "non shifted" address notation
   *   matches at least half of the data sheets :-/.
   *
   * {addr} is the address (or offset) within the chip.  Small memory
   *   chips have 8 bit addresses.  Large memory chips have 16 bit
   *   addresses.  Other memory chips have 9, 10, or 11 bit addresses.
   *   Many non-memory chips have multiple registers and {addr} is used
   *   as the register index.  Some non-memory chips have only one register
   *   and therefore don't need any {addr} parameter.
   *
   *   The default {addr} parameter is one byte (.1) which works well for
   *   memories and registers with 8 bits of address space.
   *
   *   You can specify the length of the {addr} field with the optional .0,
   *   .1, or .2 modifier (similar to the .b, .w, .l modifier).  If you are
   *   manipulating a single register device which doesn't use an address
   *   field, use "0.0" for the address and the ".0" length field will
   *   suppress the address in the I2C data stream.  This also works for
   *   successive reads using the I2C auto-incrementing memory pointer.
   *
   *   If you are manipulating a large memory with 2-byte addresses, use
   *   the .2 address modifier, e.g. 210.2 addresses location 528 (decimal).
   *
   *   Then there are the unfortunate memory chips that spill the most
   *   significant 1, 2, or 3 bits of address into the chip address byte.
   *   This effectively makes one chip (logically) look like 2, 4, or
   *   8 chips.  This is handled (awkwardly) by #defining
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
52
   *   CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW and using the .1 modifier on the
81a8824f2   wdenk   Initial revision
53
54
55
   *   {addr} field (since .1 is the default, it doesn't actually have to
   *   be specified).  Examples: given a memory chip at I2C chip address
   *   0x50, the following would happen...
0f89c54be   Peter Tyser   i2c: Update refer...
56
   *     i2c md 50 0 10   display 16 bytes starting at 0x000
81a8824f2   wdenk   Initial revision
57
   *                      On the bus: <S> A0 00 <E> <S> A1 <rd> ... <rd>
0f89c54be   Peter Tyser   i2c: Update refer...
58
   *     i2c md 50 100 10 display 16 bytes starting at 0x100
81a8824f2   wdenk   Initial revision
59
   *                      On the bus: <S> A2 00 <E> <S> A3 <rd> ... <rd>
0f89c54be   Peter Tyser   i2c: Update refer...
60
   *     i2c md 50 210 10 display 16 bytes starting at 0x210
81a8824f2   wdenk   Initial revision
61
62
63
64
65
66
67
68
   *                      On the bus: <S> A4 10 <E> <S> A5 <rd> ... <rd>
   *   This is awfully ugly.  It would be nice if someone would think up
   *   a better way of handling this.
   *
   * Adapted from cmd_mem.c which is copyright Wolfgang Denk (wd@denx.de).
   */
  
  #include <common.h>
0098e179e   Simon Glass   Move bootretry co...
69
  #include <bootretry.h>
18d66533a   Simon Glass   move CLI prototyp...
70
  #include <cli.h>
81a8824f2   wdenk   Initial revision
71
  #include <command.h>
24b852a7a   Simon Glass   Move console defi...
72
  #include <console.h>
63656b762   Simon Glass   dm: i2c: Implemen...
73
  #include <dm.h>
735987c5a   Tom Wai-Hong Tam   edid: Add I2C com...
74
  #include <edid.h>
67b23a322   Heiko Schocher   I2C: adding new "...
75
  #include <environment.h>
63656b762   Simon Glass   dm: i2c: Implemen...
76
  #include <errno.h>
81a8824f2   wdenk   Initial revision
77
  #include <i2c.h>
67b23a322   Heiko Schocher   I2C: adding new "...
78
  #include <malloc.h>
81a8824f2   wdenk   Initial revision
79
  #include <asm/byteorder.h>
2515d8437   Marek Vasut   i2c: Use __weak i...
80
  #include <linux/compiler.h>
81a8824f2   wdenk   Initial revision
81

3f4978c71   Heiko Schocher   i2c: common chang...
82
  DECLARE_GLOBAL_DATA_PTR;
81a8824f2   wdenk   Initial revision
83
84
85
  /* Display values from last command.
   * Memory modify remembered values are different from display memory.
   */
5468461d1   Masahiro Yamada   cmd_i2c: change v...
86
  static uint	i2c_dp_last_chip;
81a8824f2   wdenk   Initial revision
87
88
89
  static uint	i2c_dp_last_addr;
  static uint	i2c_dp_last_alen;
  static uint	i2c_dp_last_length = 0x10;
5468461d1   Masahiro Yamada   cmd_i2c: change v...
90
  static uint	i2c_mm_last_chip;
81a8824f2   wdenk   Initial revision
91
92
  static uint	i2c_mm_last_addr;
  static uint	i2c_mm_last_alen;
bb99ad6d8   Ben Warren   Add support for m...
93
94
95
96
  /* If only one I2C bus is present, the list of devices to ignore when
   * the probe command is issued is represented by a 1D array of addresses.
   * When multiple buses are present, the list is an array of bus-address
   * pairs.  The following macros take care of this */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
97
  #if defined(CONFIG_SYS_I2C_NOPROBES)
9a2accb44   Heiko Schocher   i2c, multibus: ge...
98
  #if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MULTI_BUS)
bb99ad6d8   Ben Warren   Add support for m...
99
100
101
102
  static struct
  {
  	uchar	bus;
  	uchar	addr;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
103
  } i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
bb99ad6d8   Ben Warren   Add support for m...
104
105
106
107
108
  #define GET_BUS_NUM	i2c_get_bus_num()
  #define COMPARE_BUS(b,i)	(i2c_no_probes[(i)].bus == (b))
  #define COMPARE_ADDR(a,i)	(i2c_no_probes[(i)].addr == (a))
  #define NO_PROBE_ADDR(i)	i2c_no_probes[(i)].addr
  #else		/* single bus */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
109
  static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
bb99ad6d8   Ben Warren   Add support for m...
110
111
112
113
  #define GET_BUS_NUM	0
  #define COMPARE_BUS(b,i)	((b) == 0)	/* Make compiler happy */
  #define COMPARE_ADDR(a,i)	(i2c_no_probes[(i)] == (a))
  #define NO_PROBE_ADDR(i)	i2c_no_probes[(i)]
3f4978c71   Heiko Schocher   i2c: common chang...
114
  #endif	/* defined(CONFIG_SYS_I2C) */
67b23a322   Heiko Schocher   I2C: adding new "...
115
  #endif
a266fe955   Frans Meulenbroeks   cmd_i2c: moved a ...
116
  #define DISP_LINE_LEN	16
63656b762   Simon Glass   dm: i2c: Implemen...
117
118
119
120
121
122
123
124
125
126
127
128
129
  /*
   * Default for driver model is to use the chip's existing address length.
   * For legacy code, this is not stored, so we need to use a suitable
   * default.
   */
  #ifdef CONFIG_DM_I2C
  #define DEFAULT_ADDR_LEN	(-1)
  #else
  #define DEFAULT_ADDR_LEN	1
  #endif
  
  #ifdef CONFIG_DM_I2C
  static struct udevice *i2c_cur_bus;
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
130
  static int cmd_i2c_set_bus_num(unsigned int busnum)
63656b762   Simon Glass   dm: i2c: Implemen...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  {
  	struct udevice *bus;
  	int ret;
  
  	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus);
  	if (ret) {
  		debug("%s: No bus %d
  ", __func__, busnum);
  		return ret;
  	}
  	i2c_cur_bus = bus;
  
  	return 0;
  }
  
  static int i2c_get_cur_bus(struct udevice **busp)
  {
e46f8a330   Lukasz Majewski   i2c: Set default ...
148
149
150
151
152
153
154
155
156
157
  #ifdef CONFIG_I2C_SET_DEFAULT_BUS_NUM
  	if (!i2c_cur_bus) {
  		if (cmd_i2c_set_bus_num(CONFIG_I2C_DEFAULT_BUS_NUMBER)) {
  			printf("Default I2C bus %d not found
  ",
  			       CONFIG_I2C_DEFAULT_BUS_NUMBER);
  			return -ENODEV;
  		}
  	}
  #endif
63656b762   Simon Glass   dm: i2c: Implemen...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
  	if (!i2c_cur_bus) {
  		puts("No I2C bus selected
  ");
  		return -ENODEV;
  	}
  	*busp = i2c_cur_bus;
  
  	return 0;
  }
  
  static int i2c_get_cur_bus_chip(uint chip_addr, struct udevice **devp)
  {
  	struct udevice *bus;
  	int ret;
  
  	ret = i2c_get_cur_bus(&bus);
  	if (ret)
  		return ret;
25ab4b030   Simon Glass   dm: i2c: Provide ...
176
  	return i2c_get_chip(bus, chip_addr, 1, devp);
63656b762   Simon Glass   dm: i2c: Implemen...
177
178
179
  }
  
  #endif
06afa388b   Marek Vasut   i2c: kerneldoc: A...
180
181
182
183
  /**
   * i2c_init_board() - Board-specific I2C bus init
   *
   * This function is the default no-op implementation of I2C bus
62a3b7dd0   Robert P. J. Day   Various, unrelate...
184
   * initialization. This function can be overridden by board-specific
06afa388b   Marek Vasut   i2c: kerneldoc: A...
185
186
   * implementation if needed.
   */
2515d8437   Marek Vasut   i2c: Use __weak i...
187
188
  __weak
  void i2c_init_board(void)
c649dda53   Stefan Bigler   i2c: add i2c debl...
189
  {
c649dda53   Stefan Bigler   i2c: add i2c debl...
190
  }
c649dda53   Stefan Bigler   i2c: add i2c debl...
191

655b34a78   Peter Tyser   i2c: Create commo...
192
  /* TODO: Implement architecture-specific get/set functions */
06afa388b   Marek Vasut   i2c: kerneldoc: A...
193
194
195
196
197
198
199
200
201
202
203
204
205
  
  /**
   * i2c_get_bus_speed() - Return I2C bus speed
   *
   * This function is the default implementation of function for retrieveing
   * the current I2C bus speed in Hz.
   *
   * A driver implementing runtime switching of I2C bus speed must override
   * this function to report the speed correctly. Simple or legacy drivers
   * can use this fallback.
   *
   * Returns I2C bus speed in Hz.
   */
63656b762   Simon Glass   dm: i2c: Implemen...
206
  #if !defined(CONFIG_SYS_I2C) && !defined(CONFIG_DM_I2C)
3f4978c71   Heiko Schocher   i2c: common chang...
207
208
209
210
  /*
   * TODO: Implement architecture-specific get/set functions
   * Should go away, if we switched completely to new multibus support
   */
2515d8437   Marek Vasut   i2c: Use __weak i...
211
212
  __weak
  unsigned int i2c_get_bus_speed(void)
655b34a78   Peter Tyser   i2c: Create commo...
213
214
215
  {
  	return CONFIG_SYS_I2C_SPEED;
  }
655b34a78   Peter Tyser   i2c: Create commo...
216

06afa388b   Marek Vasut   i2c: kerneldoc: A...
217
218
219
220
221
222
223
224
225
226
227
228
229
  /**
   * i2c_set_bus_speed() - Configure I2C bus speed
   * @speed:	Newly set speed of the I2C bus in Hz
   *
   * This function is the default implementation of function for setting
   * the I2C bus speed in Hz.
   *
   * A driver implementing runtime switching of I2C bus speed must override
   * this function to report the speed correctly. Simple or legacy drivers
   * can use this fallback.
   *
   * Returns zero on success, negative value on error.
   */
2515d8437   Marek Vasut   i2c: Use __weak i...
230
231
  __weak
  int i2c_set_bus_speed(unsigned int speed)
655b34a78   Peter Tyser   i2c: Create commo...
232
233
234
235
236
237
  {
  	if (speed != CONFIG_SYS_I2C_SPEED)
  		return -1;
  
  	return 0;
  }
3f4978c71   Heiko Schocher   i2c: common chang...
238
  #endif
655b34a78   Peter Tyser   i2c: Create commo...
239

06afa388b   Marek Vasut   i2c: kerneldoc: A...
240
241
242
243
  /**
   * get_alen() - Small parser helper function to get address length
   *
   * Returns the address length.
2c0dc9902   Frans Meulenbroeks   cmd_i2c: introduc...
244
   */
63656b762   Simon Glass   dm: i2c: Implemen...
245
  static uint get_alen(char *arg, int default_len)
2c0dc9902   Frans Meulenbroeks   cmd_i2c: introduc...
246
247
248
  {
  	int	j;
  	int	alen;
63656b762   Simon Glass   dm: i2c: Implemen...
249
  	alen = default_len;
2c0dc9902   Frans Meulenbroeks   cmd_i2c: introduc...
250
251
252
  	for (j = 0; j < 8; j++) {
  		if (arg[j] == '.') {
  			alen = arg[j+1] - '0';
2c0dc9902   Frans Meulenbroeks   cmd_i2c: introduc...
253
254
255
256
257
258
  			break;
  		} else if (arg[j] == '\0')
  			break;
  	}
  	return alen;
  }
c1a6f371a   Simon Glass   dm: i2c: Move err...
259
260
261
262
263
264
265
266
267
268
269
270
271
  enum i2c_err_op {
  	I2C_ERR_READ,
  	I2C_ERR_WRITE,
  };
  
  static int i2c_report_err(int ret, enum i2c_err_op op)
  {
  	printf("Error %s the chip: %d
  ",
  	       op == I2C_ERR_READ ? "reading" : "writing", ret);
  
  	return CMD_RET_FAILURE;
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
272
273
274
275
276
277
278
279
280
281
  /**
   * do_i2c_read() - Handle the "i2c read" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   *
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
282
283
284
   * Syntax:
   *	i2c read {i2c_chip} {devaddr}{.0, .1, .2} {len} {memaddr}
   */
54841ab50   Wolfgang Denk   Make sure that ar...
285
  static int do_i2c_read ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
286
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
287
  	uint	chip;
63656b762   Simon Glass   dm: i2c: Implemen...
288
289
  	uint	devaddr, length;
  	int alen;
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
290
  	u_char  *memaddr;
63656b762   Simon Glass   dm: i2c: Implemen...
291
292
293
294
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
295

47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
296
  	if (argc != 5)
4c12eeb8b   Simon Glass   Convert cmd_usage...
297
  		return CMD_RET_USAGE;
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
298
299
300
301
302
303
304
305
306
307
308
  
  	/*
  	 * I2C chip address
  	 */
  	chip = simple_strtoul(argv[1], NULL, 16);
  
  	/*
  	 * I2C data address within the chip.  This can be 1 or
  	 * 2 bytes long.  Some day it might be 3 bytes long :-).
  	 */
  	devaddr = simple_strtoul(argv[2], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
309
  	alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53cd   Reinhard Meyer   CMD_I2C: make ale...
310
  	if (alen > 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
311
  		return CMD_RET_USAGE;
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
312
313
314
315
316
317
318
319
320
321
  
  	/*
  	 * Length is the number of objects, not number of bytes.
  	 */
  	length = simple_strtoul(argv[3], NULL, 16);
  
  	/*
  	 * memaddr is the address where to store things in memory
  	 */
  	memaddr = (u_char *)simple_strtoul(argv[4], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
322
323
324
325
326
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret && alen != -1)
  		ret = i2c_set_chip_offset_len(dev, alen);
  	if (!ret)
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
327
  		ret = dm_i2c_read(dev, devaddr, memaddr, length);
63656b762   Simon Glass   dm: i2c: Implemen...
328
329
330
331
332
  #else
  	ret = i2c_read(chip, devaddr, alen, memaddr, length);
  #endif
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
333
334
  	return 0;
  }
ff5d2dce1   York Sun   common/i2c: Add i...
335
336
  static int do_i2c_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
337
  	uint	chip;
63656b762   Simon Glass   dm: i2c: Implemen...
338
339
  	uint	devaddr, length;
  	int alen;
ff5d2dce1   York Sun   common/i2c: Add i...
340
  	u_char  *memaddr;
63656b762   Simon Glass   dm: i2c: Implemen...
341
342
343
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
344
  	struct dm_i2c_chip *i2c_chip;
63656b762   Simon Glass   dm: i2c: Implemen...
345
  #endif
ff5d2dce1   York Sun   common/i2c: Add i...
346

ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
347
  	if ((argc < 5) || (argc > 6))
ff5d2dce1   York Sun   common/i2c: Add i...
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
  		return cmd_usage(cmdtp);
  
  	/*
  	 * memaddr is the address where to store things in memory
  	 */
  	memaddr = (u_char *)simple_strtoul(argv[1], NULL, 16);
  
  	/*
  	 * I2C chip address
  	 */
  	chip = simple_strtoul(argv[2], NULL, 16);
  
  	/*
  	 * I2C data address within the chip.  This can be 1 or
  	 * 2 bytes long.  Some day it might be 3 bytes long :-).
  	 */
  	devaddr = simple_strtoul(argv[3], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
365
  	alen = get_alen(argv[3], DEFAULT_ADDR_LEN);
ff5d2dce1   York Sun   common/i2c: Add i...
366
367
368
369
  	if (alen > 3)
  		return cmd_usage(cmdtp);
  
  	/*
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
370
  	 * Length is the number of bytes.
ff5d2dce1   York Sun   common/i2c: Add i...
371
372
  	 */
  	length = simple_strtoul(argv[4], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
373
374
375
376
377
378
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret && alen != -1)
  		ret = i2c_set_chip_offset_len(dev, alen);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_WRITE);
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
379
380
381
  	i2c_chip = dev_get_parent_platdata(dev);
  	if (!i2c_chip)
  		return i2c_report_err(ret, I2C_ERR_WRITE);
63656b762   Simon Glass   dm: i2c: Implemen...
382
  #endif
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
383
384
385
386
387
388
389
  	if (argc == 6 && !strcmp(argv[5], "-s")) {
  		/*
  		 * Write all bytes in a single I2C transaction. If the target
  		 * device is an EEPROM, it is your responsibility to not cross
  		 * a page boundary. No write delay upon completion, take this
  		 * into account if linking commands.
  		 */
63656b762   Simon Glass   dm: i2c: Implemen...
390
  #ifdef CONFIG_DM_I2C
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
391
392
  		i2c_chip->flags &= ~DM_I2C_CHIP_WR_ADDRESS;
  		ret = dm_i2c_write(dev, devaddr, memaddr, length);
63656b762   Simon Glass   dm: i2c: Implemen...
393
  #else
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
394
  		ret = i2c_write(chip, devaddr, alen, memaddr, length);
63656b762   Simon Glass   dm: i2c: Implemen...
395
396
397
  #endif
  		if (ret)
  			return i2c_report_err(ret, I2C_ERR_WRITE);
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
398
399
400
401
402
403
404
405
406
407
408
409
410
411
  	} else {
  		/*
  		 * Repeated addressing - perform <length> separate
  		 * write transactions of one byte each
  		 */
  		while (length-- > 0) {
  #ifdef CONFIG_DM_I2C
  			i2c_chip->flags |= DM_I2C_CHIP_WR_ADDRESS;
  			ret = dm_i2c_write(dev, devaddr++, memaddr++, 1);
  #else
  			ret = i2c_write(chip, devaddr++, alen, memaddr++, 1);
  #endif
  			if (ret)
  				return i2c_report_err(ret, I2C_ERR_WRITE);
ff5d2dce1   York Sun   common/i2c: Add i...
412
413
414
415
  /*
   * No write delay with FRAM devices.
   */
  #if !defined(CONFIG_SYS_I2C_FRAM)
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
416
  			udelay(11000);
ff5d2dce1   York Sun   common/i2c: Add i...
417
  #endif
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
418
  		}
ff5d2dce1   York Sun   common/i2c: Add i...
419
420
421
  	}
  	return 0;
  }
63656b762   Simon Glass   dm: i2c: Implemen...
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
  #ifdef CONFIG_DM_I2C
  static int do_i2c_flags(cmd_tbl_t *cmdtp, int flag, int argc,
  			char *const argv[])
  {
  	struct udevice *dev;
  	uint flags;
  	int chip;
  	int ret;
  
  	if (argc < 2)
  		return CMD_RET_USAGE;
  
  	chip = simple_strtoul(argv[1], NULL, 16);
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
  
  	if (argc > 2) {
  		flags = simple_strtoul(argv[2], NULL, 16);
  		ret = i2c_set_chip_flags(dev, flags);
  	} else  {
  		ret = i2c_get_chip_flags(dev, &flags);
  		if (!ret)
  			printf("%x
  ", flags);
  	}
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
  
  	return 0;
  }
c10c8e313   Simon Glass   dm: i2c: Add a co...
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
  
  static int do_i2c_olen(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  {
  	struct udevice *dev;
  	uint olen;
  	int chip;
  	int ret;
  
  	if (argc < 2)
  		return CMD_RET_USAGE;
  
  	chip = simple_strtoul(argv[1], NULL, 16);
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
  
  	if (argc > 2) {
  		olen = simple_strtoul(argv[2], NULL, 16);
  		ret = i2c_set_chip_offset_len(dev, olen);
  	} else  {
  		ret = i2c_get_chip_offset_len(dev);
  		if (ret >= 0) {
  			printf("%x
  ", ret);
  			ret = 0;
  		}
  	}
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
  
  	return 0;
  }
63656b762   Simon Glass   dm: i2c: Implemen...
485
  #endif
06afa388b   Marek Vasut   i2c: kerneldoc: A...
486
487
488
489
490
491
492
493
494
495
  /**
   * do_i2c_md() - Handle the "i2c md" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   *
4a8cf3382   Frans Meulenbroeks   cmd_i2c: moved mi...
496
497
498
   * Syntax:
   *	i2c md {i2c_chip} {addr}{.0, .1, .2} {len}
   */
54841ab50   Wolfgang Denk   Make sure that ar...
499
  static int do_i2c_md ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
81a8824f2   wdenk   Initial revision
500
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
501
  	uint	chip;
63656b762   Simon Glass   dm: i2c: Implemen...
502
503
  	uint	addr, length;
  	int alen;
81a8824f2   wdenk   Initial revision
504
  	int	j, nbytes, linebytes;
63656b762   Simon Glass   dm: i2c: Implemen...
505
506
507
508
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
81a8824f2   wdenk   Initial revision
509
510
511
512
513
514
515
516
  
  	/* We use the last specified parameters, unless new ones are
  	 * entered.
  	 */
  	chip   = i2c_dp_last_chip;
  	addr   = i2c_dp_last_addr;
  	alen   = i2c_dp_last_alen;
  	length = i2c_dp_last_length;
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
517
  	if (argc < 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
518
  		return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
519
520
521
522
523
  
  	if ((flag & CMD_FLAG_REPEAT) == 0) {
  		/*
  		 * New command specified.
  		 */
81a8824f2   wdenk   Initial revision
524
525
526
527
528
529
530
531
532
533
534
  
  		/*
  		 * I2C chip address
  		 */
  		chip = simple_strtoul(argv[1], NULL, 16);
  
  		/*
  		 * I2C data address within the chip.  This can be 1 or
  		 * 2 bytes long.  Some day it might be 3 bytes long :-).
  		 */
  		addr = simple_strtoul(argv[2], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
535
  		alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53cd   Reinhard Meyer   CMD_I2C: make ale...
536
  		if (alen > 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
537
  			return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
538
539
540
541
542
543
544
545
  
  		/*
  		 * If another parameter, it is the length to display.
  		 * Length is the number of objects, not number of bytes.
  		 */
  		if (argc > 3)
  			length = simple_strtoul(argv[3], NULL, 16);
  	}
63656b762   Simon Glass   dm: i2c: Implemen...
546
547
548
549
550
551
552
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret && alen != -1)
  		ret = i2c_set_chip_offset_len(dev, alen);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
  #endif
81a8824f2   wdenk   Initial revision
553
554
555
556
557
558
559
560
561
562
563
564
  	/*
  	 * Print the lines.
  	 *
  	 * We buffer all read data, so we can make sure data is read only
  	 * once.
  	 */
  	nbytes = length;
  	do {
  		unsigned char	linebuf[DISP_LINE_LEN];
  		unsigned char	*cp;
  
  		linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
63656b762   Simon Glass   dm: i2c: Implemen...
565
  #ifdef CONFIG_DM_I2C
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
566
  		ret = dm_i2c_read(dev, addr, linebuf, linebytes);
63656b762   Simon Glass   dm: i2c: Implemen...
567
568
569
570
  #else
  		ret = i2c_read(chip, addr, alen, linebuf, linebytes);
  #endif
  		if (ret)
9e533cb04   Masahiro Yamada   cmd_i2c: quit I2C...
571
  			return i2c_report_err(ret, I2C_ERR_READ);
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
572
  		else {
81a8824f2   wdenk   Initial revision
573
574
575
576
577
578
  			printf("%04x:", addr);
  			cp = linebuf;
  			for (j=0; j<linebytes; j++) {
  				printf(" %02x", *cp++);
  				addr++;
  			}
4b9206ed5   wdenk   * Patches by Thom...
579
  			puts ("    ");
81a8824f2   wdenk   Initial revision
580
581
582
  			cp = linebuf;
  			for (j=0; j<linebytes; j++) {
  				if ((*cp < 0x20) || (*cp > 0x7e))
4b9206ed5   wdenk   * Patches by Thom...
583
  					puts (".");
81a8824f2   wdenk   Initial revision
584
585
586
587
  				else
  					printf("%c", *cp);
  				cp++;
  			}
4b9206ed5   wdenk   * Patches by Thom...
588
589
  			putc ('
  ');
81a8824f2   wdenk   Initial revision
590
591
592
593
594
595
596
597
598
599
600
  		}
  		nbytes -= linebytes;
  	} while (nbytes > 0);
  
  	i2c_dp_last_chip   = chip;
  	i2c_dp_last_addr   = addr;
  	i2c_dp_last_alen   = alen;
  	i2c_dp_last_length = length;
  
  	return 0;
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
601
602
603
604
605
606
607
608
609
  /**
   * do_i2c_mw() - Handle the "i2c mw" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
81a8824f2   wdenk   Initial revision
610
611
   *
   * Syntax:
0f89c54be   Peter Tyser   i2c: Update refer...
612
   *	i2c mw {i2c_chip} {addr}{.0, .1, .2} {data} [{count}]
81a8824f2   wdenk   Initial revision
613
   */
54841ab50   Wolfgang Denk   Make sure that ar...
614
  static int do_i2c_mw ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
81a8824f2   wdenk   Initial revision
615
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
616
  	uint	chip;
81a8824f2   wdenk   Initial revision
617
  	ulong	addr;
63656b762   Simon Glass   dm: i2c: Implemen...
618
  	int	alen;
81a8824f2   wdenk   Initial revision
619
620
  	uchar	byte;
  	int	count;
63656b762   Simon Glass   dm: i2c: Implemen...
621
622
623
624
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
81a8824f2   wdenk   Initial revision
625

47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
626
  	if ((argc < 4) || (argc > 5))
4c12eeb8b   Simon Glass   Convert cmd_usage...
627
  		return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
628
629
  
  	/*
53677ef18   Wolfgang Denk   Big white-space c...
630
631
  	 * Chip is always specified.
  	 */
81a8824f2   wdenk   Initial revision
632
633
634
635
636
637
  	chip = simple_strtoul(argv[1], NULL, 16);
  
  	/*
  	 * Address is always specified.
  	 */
  	addr = simple_strtoul(argv[2], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
638
  	alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53cd   Reinhard Meyer   CMD_I2C: make ale...
639
  	if (alen > 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
640
  		return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
641

63656b762   Simon Glass   dm: i2c: Implemen...
642
643
644
645
646
647
648
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret && alen != -1)
  		ret = i2c_set_chip_offset_len(dev, alen);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_WRITE);
  #endif
81a8824f2   wdenk   Initial revision
649
650
651
652
653
654
655
656
  	/*
  	 * Value to write is always specified.
  	 */
  	byte = simple_strtoul(argv[3], NULL, 16);
  
  	/*
  	 * Optional count
  	 */
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
657
  	if (argc == 5)
81a8824f2   wdenk   Initial revision
658
  		count = simple_strtoul(argv[4], NULL, 16);
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
659
  	else
81a8824f2   wdenk   Initial revision
660
  		count = 1;
81a8824f2   wdenk   Initial revision
661
662
  
  	while (count-- > 0) {
63656b762   Simon Glass   dm: i2c: Implemen...
663
  #ifdef CONFIG_DM_I2C
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
664
  		ret = dm_i2c_write(dev, addr++, &byte, 1);
63656b762   Simon Glass   dm: i2c: Implemen...
665
666
667
668
  #else
  		ret = i2c_write(chip, addr++, alen, &byte, 1);
  #endif
  		if (ret)
9e533cb04   Masahiro Yamada   cmd_i2c: quit I2C...
669
  			return i2c_report_err(ret, I2C_ERR_WRITE);
81a8824f2   wdenk   Initial revision
670
671
672
  		/*
  		 * Wait for the write to complete.  The write can take
  		 * up to 10mSec (we allow a little more time).
81a8824f2   wdenk   Initial revision
673
  		 */
d4f5c7289     FRAM memory acces...
674
675
676
  /*
   * No write delay with FRAM devices.
   */
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
677
  #if !defined(CONFIG_SYS_I2C_FRAM)
81a8824f2   wdenk   Initial revision
678
  		udelay(11000);
d4f5c7289     FRAM memory acces...
679
  #endif
81a8824f2   wdenk   Initial revision
680
  	}
06afa388b   Marek Vasut   i2c: kerneldoc: A...
681
  	return 0;
81a8824f2   wdenk   Initial revision
682
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
683
684
685
686
687
688
689
690
691
692
693
  /**
   * do_i2c_crc() - Handle the "i2c crc32" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Calculate a CRC on memory
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
81a8824f2   wdenk   Initial revision
694
695
   *
   * Syntax:
0f89c54be   Peter Tyser   i2c: Update refer...
696
   *	i2c crc32 {i2c_chip} {addr}{.0, .1, .2} {count}
81a8824f2   wdenk   Initial revision
697
   */
54841ab50   Wolfgang Denk   Make sure that ar...
698
  static int do_i2c_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
81a8824f2   wdenk   Initial revision
699
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
700
  	uint	chip;
81a8824f2   wdenk   Initial revision
701
  	ulong	addr;
63656b762   Simon Glass   dm: i2c: Implemen...
702
  	int	alen;
81a8824f2   wdenk   Initial revision
703
704
705
706
  	int	count;
  	uchar	byte;
  	ulong	crc;
  	ulong	err;
63656b762   Simon Glass   dm: i2c: Implemen...
707
708
709
710
  	int ret = 0;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
81a8824f2   wdenk   Initial revision
711

47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
712
  	if (argc < 4)
4c12eeb8b   Simon Glass   Convert cmd_usage...
713
  		return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
714
715
  
  	/*
53677ef18   Wolfgang Denk   Big white-space c...
716
717
  	 * Chip is always specified.
  	 */
81a8824f2   wdenk   Initial revision
718
719
720
721
722
723
  	chip = simple_strtoul(argv[1], NULL, 16);
  
  	/*
  	 * Address is always specified.
  	 */
  	addr = simple_strtoul(argv[2], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
724
  	alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53cd   Reinhard Meyer   CMD_I2C: make ale...
725
  	if (alen > 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
726
  		return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
727

63656b762   Simon Glass   dm: i2c: Implemen...
728
729
730
731
732
733
734
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret && alen != -1)
  		ret = i2c_set_chip_offset_len(dev, alen);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
  #endif
81a8824f2   wdenk   Initial revision
735
736
737
738
739
740
741
742
743
744
745
746
  	/*
  	 * Count is always specified
  	 */
  	count = simple_strtoul(argv[3], NULL, 16);
  
  	printf ("CRC32 for %08lx ... %08lx ==> ", addr, addr + count - 1);
  	/*
  	 * CRC a byte at a time.  This is going to be slooow, but hey, the
  	 * memories are small and slow too so hopefully nobody notices.
  	 */
  	crc = 0;
  	err = 0;
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
747
  	while (count-- > 0) {
63656b762   Simon Glass   dm: i2c: Implemen...
748
  #ifdef CONFIG_DM_I2C
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
749
  		ret = dm_i2c_read(dev, addr, &byte, 1);
63656b762   Simon Glass   dm: i2c: Implemen...
750
751
752
753
  #else
  		ret = i2c_read(chip, addr, alen, &byte, 1);
  #endif
  		if (ret)
81a8824f2   wdenk   Initial revision
754
  			err++;
81a8824f2   wdenk   Initial revision
755
756
757
  		crc = crc32 (crc, &byte, 1);
  		addr++;
  	}
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
758
  	if (err > 0)
63656b762   Simon Glass   dm: i2c: Implemen...
759
  		i2c_report_err(ret, I2C_ERR_READ);
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
760
  	else
81a8824f2   wdenk   Initial revision
761
762
  		printf ("%08lx
  ", crc);
81a8824f2   wdenk   Initial revision
763
764
765
  
  	return 0;
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
766
767
768
769
770
771
772
773
774
775
776
  /**
   * mod_i2c_mem() - Handle the "i2c mm" and "i2c nm" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Modify memory.
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
81a8824f2   wdenk   Initial revision
777
778
   *
   * Syntax:
0f89c54be   Peter Tyser   i2c: Update refer...
779
780
   *	i2c mm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
   *	i2c nm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
81a8824f2   wdenk   Initial revision
781
   */
81a8824f2   wdenk   Initial revision
782
  static int
54841ab50   Wolfgang Denk   Make sure that ar...
783
  mod_i2c_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
81a8824f2   wdenk   Initial revision
784
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
785
  	uint	chip;
81a8824f2   wdenk   Initial revision
786
  	ulong	addr;
63656b762   Simon Glass   dm: i2c: Implemen...
787
  	int	alen;
81a8824f2   wdenk   Initial revision
788
789
790
  	ulong	data;
  	int	size = 1;
  	int	nbytes;
63656b762   Simon Glass   dm: i2c: Implemen...
791
792
793
794
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
81a8824f2   wdenk   Initial revision
795

47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
796
  	if (argc != 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
797
  		return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
798

b26440f1f   Simon Glass   Rename bootretry ...
799
  	bootretry_reset_cmd_timeout();	/* got a good command to get here */
81a8824f2   wdenk   Initial revision
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
  	/*
  	 * We use the last specified parameters, unless new ones are
  	 * entered.
  	 */
  	chip = i2c_mm_last_chip;
  	addr = i2c_mm_last_addr;
  	alen = i2c_mm_last_alen;
  
  	if ((flag & CMD_FLAG_REPEAT) == 0) {
  		/*
  		 * New command specified.  Check for a size specification.
  		 * Defaults to byte if no or incorrect specification.
  		 */
  		size = cmd_get_data_size(argv[0], 1);
  
  		/*
53677ef18   Wolfgang Denk   Big white-space c...
816
817
  		 * Chip is always specified.
  		 */
81a8824f2   wdenk   Initial revision
818
819
820
821
822
823
  		chip = simple_strtoul(argv[1], NULL, 16);
  
  		/*
  		 * Address is always specified.
  		 */
  		addr = simple_strtoul(argv[2], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
824
  		alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53cd   Reinhard Meyer   CMD_I2C: make ale...
825
  		if (alen > 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
826
  			return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
827
  	}
63656b762   Simon Glass   dm: i2c: Implemen...
828
829
830
831
832
833
834
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret && alen != -1)
  		ret = i2c_set_chip_offset_len(dev, alen);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_WRITE);
  #endif
81a8824f2   wdenk   Initial revision
835
836
837
838
839
840
  	/*
  	 * Print the address, followed by value.  Then accept input for
  	 * the next value.  A non-converted value exits.
  	 */
  	do {
  		printf("%08lx:", addr);
63656b762   Simon Glass   dm: i2c: Implemen...
841
  #ifdef CONFIG_DM_I2C
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
842
  		ret = dm_i2c_read(dev, addr, (uchar *)&data, size);
63656b762   Simon Glass   dm: i2c: Implemen...
843
844
845
846
  #else
  		ret = i2c_read(chip, addr, alen, (uchar *)&data, size);
  #endif
  		if (ret)
9e533cb04   Masahiro Yamada   cmd_i2c: quit I2C...
847
848
849
850
851
852
853
854
855
  			return i2c_report_err(ret, I2C_ERR_READ);
  
  		data = cpu_to_be32(data);
  		if (size == 1)
  			printf(" %02lx", (data >> 24) & 0x000000FF);
  		else if (size == 2)
  			printf(" %04lx", (data >> 16) & 0x0000FFFF);
  		else
  			printf(" %08lx", data);
81a8824f2   wdenk   Initial revision
856

e1bf824df   Simon Glass   Add cli_ prefix t...
857
  		nbytes = cli_readline(" ? ");
81a8824f2   wdenk   Initial revision
858
859
860
861
862
863
864
865
  		if (nbytes == 0) {
  			/*
  			 * <CR> pressed as only input, don't modify current
  			 * location and move to next.
  			 */
  			if (incrflag)
  				addr += size;
  			nbytes = size;
b26440f1f   Simon Glass   Rename bootretry ...
866
867
  			/* good enough to not time out */
  			bootretry_reset_cmd_timeout();
81a8824f2   wdenk   Initial revision
868
869
  		}
  #ifdef CONFIG_BOOT_RETRY_TIME
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
870
  		else if (nbytes == -2)
81a8824f2   wdenk   Initial revision
871
  			break;	/* timed out, exit the command	*/
81a8824f2   wdenk   Initial revision
872
873
874
875
876
  #endif
  		else {
  			char *endp;
  
  			data = simple_strtoul(console_buffer, &endp, 16);
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
877
  			if (size == 1)
81a8824f2   wdenk   Initial revision
878
  				data = data << 24;
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
879
  			else if (size == 2)
81a8824f2   wdenk   Initial revision
880
  				data = data << 16;
81a8824f2   wdenk   Initial revision
881
882
883
  			data = be32_to_cpu(data);
  			nbytes = endp - console_buffer;
  			if (nbytes) {
81a8824f2   wdenk   Initial revision
884
885
886
  				/*
  				 * good enough to not time out
  				 */
b26440f1f   Simon Glass   Rename bootretry ...
887
  				bootretry_reset_cmd_timeout();
63656b762   Simon Glass   dm: i2c: Implemen...
888
  #ifdef CONFIG_DM_I2C
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
889
890
  				ret = dm_i2c_write(dev, addr, (uchar *)&data,
  						   size);
63656b762   Simon Glass   dm: i2c: Implemen...
891
892
893
894
895
  #else
  				ret = i2c_write(chip, addr, alen,
  						(uchar *)&data, size);
  #endif
  				if (ret)
9e533cb04   Masahiro Yamada   cmd_i2c: quit I2C...
896
897
  					return i2c_report_err(ret,
  							      I2C_ERR_WRITE);
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
898
899
  #ifdef CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS
  				udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
2535d6027   wdenk   * Patch by Martin...
900
  #endif
81a8824f2   wdenk   Initial revision
901
902
903
904
905
  				if (incrflag)
  					addr += size;
  			}
  		}
  	} while (nbytes);
0800707b6   Peter Tyser   mod_i2c_mem() bugfix
906
907
908
  	i2c_mm_last_chip = chip;
  	i2c_mm_last_addr = addr;
  	i2c_mm_last_alen = alen;
81a8824f2   wdenk   Initial revision
909
910
911
  
  	return 0;
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
912
913
914
915
916
917
918
919
920
921
  /**
   * do_i2c_probe() - Handle the "i2c probe" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   *
81a8824f2   wdenk   Initial revision
922
   * Syntax:
54b99e51a   Eric Nelson   i2c_probe: update...
923
924
925
   *	i2c probe {addr}
   *
   * Returns zero (success) if one or more I2C devices was found
81a8824f2   wdenk   Initial revision
926
   */
54841ab50   Wolfgang Denk   Make sure that ar...
927
  static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
81a8824f2   wdenk   Initial revision
928
929
  {
  	int j;
54b99e51a   Eric Nelson   i2c_probe: update...
930
931
  	int addr = -1;
  	int found = 0;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
932
  #if defined(CONFIG_SYS_I2C_NOPROBES)
81a8824f2   wdenk   Initial revision
933
  	int k, skip;
3f4978c71   Heiko Schocher   i2c: common chang...
934
  	unsigned int bus = GET_BUS_NUM;
bb99ad6d8   Ben Warren   Add support for m...
935
  #endif	/* NOPROBES */
63656b762   Simon Glass   dm: i2c: Implemen...
936
937
938
939
940
941
942
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *bus, *dev;
  
  	if (i2c_get_cur_bus(&bus))
  		return CMD_RET_FAILURE;
  #endif
81a8824f2   wdenk   Initial revision
943

54b99e51a   Eric Nelson   i2c_probe: update...
944
945
  	if (argc == 2)
  		addr = simple_strtol(argv[1], 0, 16);
4b9206ed5   wdenk   * Patches by Thom...
946
  	puts ("Valid chip addresses:");
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
947
  	for (j = 0; j < 128; j++) {
54b99e51a   Eric Nelson   i2c_probe: update...
948
949
  		if ((0 <= addr) && (j != addr))
  			continue;
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
950
  #if defined(CONFIG_SYS_I2C_NOPROBES)
81a8824f2   wdenk   Initial revision
951
  		skip = 0;
cfb25cc40   Axel Lin   cmd_i2c: Use ARRA...
952
  		for (k = 0; k < ARRAY_SIZE(i2c_no_probes); k++) {
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
953
  			if (COMPARE_BUS(bus, k) && COMPARE_ADDR(j, k)) {
81a8824f2   wdenk   Initial revision
954
955
956
957
958
959
960
  				skip = 1;
  				break;
  			}
  		}
  		if (skip)
  			continue;
  #endif
63656b762   Simon Glass   dm: i2c: Implemen...
961
  #ifdef CONFIG_DM_I2C
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
962
  		ret = dm_i2c_probe(bus, j, 0, &dev);
63656b762   Simon Glass   dm: i2c: Implemen...
963
964
965
966
  #else
  		ret = i2c_probe(j);
  #endif
  		if (ret == 0) {
81a8824f2   wdenk   Initial revision
967
  			printf(" %02X", j);
54b99e51a   Eric Nelson   i2c_probe: update...
968
969
  			found++;
  		}
81a8824f2   wdenk   Initial revision
970
  	}
4b9206ed5   wdenk   * Patches by Thom...
971
972
  	putc ('
  ');
81a8824f2   wdenk   Initial revision
973

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
974
  #if defined(CONFIG_SYS_I2C_NOPROBES)
81a8824f2   wdenk   Initial revision
975
  	puts ("Excluded chip addresses:");
cfb25cc40   Axel Lin   cmd_i2c: Use ARRA...
976
  	for (k = 0; k < ARRAY_SIZE(i2c_no_probes); k++) {
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
977
  		if (COMPARE_BUS(bus,k))
bb99ad6d8   Ben Warren   Add support for m...
978
979
  			printf(" %02X", NO_PROBE_ADDR(k));
  	}
4b9206ed5   wdenk   * Patches by Thom...
980
981
  	putc ('
  ');
81a8824f2   wdenk   Initial revision
982
  #endif
54b99e51a   Eric Nelson   i2c_probe: update...
983
  	return (0 == found);
81a8824f2   wdenk   Initial revision
984
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
985
986
987
988
989
990
991
992
993
994
  /**
   * do_i2c_loop() - Handle the "i2c loop" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   *
81a8824f2   wdenk   Initial revision
995
   * Syntax:
0f89c54be   Peter Tyser   i2c: Update refer...
996
   *	i2c loop {i2c_chip} {addr}{.0, .1, .2} [{length}] [{delay}]
81a8824f2   wdenk   Initial revision
997
998
999
   *	{length} - Number of bytes to read
   *	{delay}  - A DECIMAL number and defaults to 1000 uSec
   */
54841ab50   Wolfgang Denk   Make sure that ar...
1000
  static int do_i2c_loop(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
81a8824f2   wdenk   Initial revision
1001
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
1002
  	uint	chip;
63656b762   Simon Glass   dm: i2c: Implemen...
1003
  	int alen;
81a8824f2   wdenk   Initial revision
1004
1005
1006
1007
  	uint	addr;
  	uint	length;
  	u_char	bytes[16];
  	int	delay;
63656b762   Simon Glass   dm: i2c: Implemen...
1008
1009
1010
1011
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
81a8824f2   wdenk   Initial revision
1012

47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
1013
  	if (argc < 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
1014
  		return CMD_RET_USAGE;
81a8824f2   wdenk   Initial revision
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
  
  	/*
  	 * Chip is always specified.
  	 */
  	chip = simple_strtoul(argv[1], NULL, 16);
  
  	/*
  	 * Address is always specified.
  	 */
  	addr = simple_strtoul(argv[2], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
1025
  	alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53cd   Reinhard Meyer   CMD_I2C: make ale...
1026
  	if (alen > 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
1027
  		return CMD_RET_USAGE;
63656b762   Simon Glass   dm: i2c: Implemen...
1028
1029
1030
1031
1032
1033
1034
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret && alen != -1)
  		ret = i2c_set_chip_offset_len(dev, alen);
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_WRITE);
  #endif
81a8824f2   wdenk   Initial revision
1035
1036
1037
1038
1039
1040
  
  	/*
  	 * Length is the number of objects, not number of bytes.
  	 */
  	length = 1;
  	length = simple_strtoul(argv[3], NULL, 16);
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1041
  	if (length > sizeof(bytes))
81a8824f2   wdenk   Initial revision
1042
  		length = sizeof(bytes);
81a8824f2   wdenk   Initial revision
1043
1044
1045
1046
1047
  
  	/*
  	 * The delay time (uSec) is optional.
  	 */
  	delay = 1000;
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1048
  	if (argc > 3)
81a8824f2   wdenk   Initial revision
1049
  		delay = simple_strtoul(argv[4], NULL, 10);
81a8824f2   wdenk   Initial revision
1050
1051
1052
  	/*
  	 * Run the loop...
  	 */
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1053
  	while (1) {
63656b762   Simon Glass   dm: i2c: Implemen...
1054
  #ifdef CONFIG_DM_I2C
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
1055
  		ret = dm_i2c_read(dev, addr, bytes, length);
63656b762   Simon Glass   dm: i2c: Implemen...
1056
1057
1058
1059
1060
  #else
  		ret = i2c_read(chip, addr, alen, bytes, length);
  #endif
  		if (ret)
  			i2c_report_err(ret, I2C_ERR_READ);
81a8824f2   wdenk   Initial revision
1061
1062
1063
1064
1065
1066
  		udelay(delay);
  	}
  
  	/* NOTREACHED */
  	return 0;
  }
81a8824f2   wdenk   Initial revision
1067
1068
1069
  /*
   * The SDRAM command is separately configured because many
   * (most?) embedded boards don't use SDRAM DIMMs.
06afa388b   Marek Vasut   i2c: kerneldoc: A...
1070
1071
   *
   * FIXME: Document and probably move elsewhere!
81a8824f2   wdenk   Initial revision
1072
   */
c76fe4742   Jon Loeliger   common/cmd_[i-n]*...
1073
  #if defined(CONFIG_CMD_SDRAM)
632de0672   Larry Johnson   Refactor code for...
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
  static void print_ddr2_tcyc (u_char const b)
  {
  	printf ("%d.", (b >> 4) & 0x0F);
  	switch (b & 0x0F) {
  	case 0x0:
  	case 0x1:
  	case 0x2:
  	case 0x3:
  	case 0x4:
  	case 0x5:
  	case 0x6:
  	case 0x7:
  	case 0x8:
  	case 0x9:
  		printf ("%d ns
  ", b & 0x0F);
  		break;
  	case 0xA:
  		puts ("25 ns
  ");
  		break;
  	case 0xB:
  		puts ("33 ns
  ");
  		break;
  	case 0xC:
  		puts ("66 ns
  ");
  		break;
  	case 0xD:
  		puts ("75 ns
  ");
  		break;
  	default:
  		puts ("?? ns
  ");
  		break;
  	}
  }
  
  static void decode_bits (u_char const b, char const *str[], int const do_once)
  {
  	u_char mask;
  
  	for (mask = 0x80; mask != 0x00; mask >>= 1, ++str) {
  		if (b & mask) {
  			puts (*str);
  			if (do_once)
  				return;
  		}
  	}
  }
81a8824f2   wdenk   Initial revision
1126
1127
1128
  
  /*
   * Syntax:
0f89c54be   Peter Tyser   i2c: Update refer...
1129
   *	i2c sdram {i2c_chip}
81a8824f2   wdenk   Initial revision
1130
   */
54841ab50   Wolfgang Denk   Make sure that ar...
1131
  static int do_sdram (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
81a8824f2   wdenk   Initial revision
1132
  {
18c4e7f71   Michal Simek   i2c: spd: Extend ...
1133
  	enum { unknown, EDO, SDRAM, DDR, DDR2, DDR3, DDR4 } type;
632de0672   Larry Johnson   Refactor code for...
1134

5468461d1   Masahiro Yamada   cmd_i2c: change v...
1135
  	uint	chip;
81a8824f2   wdenk   Initial revision
1136
1137
  	u_char	data[128];
  	u_char	cksum;
28df8ed07   Nobuhiro Iwamatsu   cmd: i2c: Fix use...
1138
1139
1140
1141
  	int	j, ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
81a8824f2   wdenk   Initial revision
1142

632de0672   Larry Johnson   Refactor code for...
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
  	static const char *decode_CAS_DDR2[] = {
  		" TBD", " 6", " 5", " 4", " 3", " 2", " TBD", " TBD"
  	};
  
  	static const char *decode_CAS_default[] = {
  		" TBD", " 7", " 6", " 5", " 4", " 3", " 2", " 1"
  	};
  
  	static const char *decode_CS_WE_default[] = {
  		" TBD", " 6", " 5", " 4", " 3", " 2", " 1", " 0"
  	};
  
  	static const char *decode_byte21_default[] = {
  		"  TBD (bit 7)
  ",
  		"  Redundant row address
  ",
  		"  Differential clock input
  ",
  		"  Registerd DQMB inputs
  ",
  		"  Buffered DQMB inputs
  ",
  		"  On-card PLL
  ",
  		"  Registered address/control lines
  ",
  		"  Buffered address/control lines
  "
  	};
  
  	static const char *decode_byte22_DDR2[] = {
  		"  TBD (bit 7)
  ",
  		"  TBD (bit 6)
  ",
  		"  TBD (bit 5)
  ",
  		"  TBD (bit 4)
  ",
  		"  TBD (bit 3)
  ",
  		"  Supports partial array self refresh
  ",
  		"  Supports 50 ohm ODT
  ",
  		"  Supports weak driver
  "
  	};
  
  	static const char *decode_row_density_DDR2[] = {
  		"512 MiB", "256 MiB", "128 MiB", "16 GiB",
  		"8 GiB", "4 GiB", "2 GiB", "1 GiB"
  	};
  
  	static const char *decode_row_density_default[] = {
  		"512 MiB", "256 MiB", "128 MiB", "64 MiB",
  		"32 MiB", "16 MiB", "8 MiB", "4 MiB"
  	};
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
1202
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
1203
  		return CMD_RET_USAGE;
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
1204

81a8824f2   wdenk   Initial revision
1205
1206
  	/*
  	 * Chip is always specified.
632de0672   Larry Johnson   Refactor code for...
1207
1208
  	 */
  	chip = simple_strtoul (argv[1], NULL, 16);
81a8824f2   wdenk   Initial revision
1209

28df8ed07   Nobuhiro Iwamatsu   cmd: i2c: Fix use...
1210
1211
1212
1213
1214
1215
1216
1217
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret)
  		ret = dm_i2c_read(dev, 0, data, sizeof(data));
  #else
  	ret = i2c_read(chip, 0, 1, data, sizeof(data));
  #endif
  	if (ret) {
4b9206ed5   wdenk   * Patches by Thom...
1218
1219
  		puts ("No SDRAM Serial Presence Detect found.
  ");
81a8824f2   wdenk   Initial revision
1220
1221
1222
1223
1224
1225
1226
  		return 1;
  	}
  
  	cksum = 0;
  	for (j = 0; j < 63; j++) {
  		cksum += data[j];
  	}
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1227
  	if (cksum != data[63]) {
81a8824f2   wdenk   Initial revision
1228
1229
  		printf ("WARNING: Configuration data checksum failure:
  "
632de0672   Larry Johnson   Refactor code for...
1230
1231
  			"  is 0x%02x, calculated 0x%02x
  ", data[63], cksum);
81a8824f2   wdenk   Initial revision
1232
  	}
632de0672   Larry Johnson   Refactor code for...
1233
1234
  	printf ("SPD data revision            %d.%d
  ",
81a8824f2   wdenk   Initial revision
1235
  		(data[62] >> 4) & 0x0F, data[62] & 0x0F);
632de0672   Larry Johnson   Refactor code for...
1236
1237
1238
1239
  	printf ("Bytes used                   0x%02X
  ", data[0]);
  	printf ("Serial memory size           0x%02X
  ", 1 << data[1]);
4b9206ed5   wdenk   * Patches by Thom...
1240
  	puts ("Memory type                  ");
632de0672   Larry Johnson   Refactor code for...
1241
  	switch (data[2]) {
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
  	case 2:
  		type = EDO;
  		puts ("EDO
  ");
  		break;
  	case 4:
  		type = SDRAM;
  		puts ("SDRAM
  ");
  		break;
18c4e7f71   Michal Simek   i2c: spd: Extend ...
1252
1253
1254
1255
1256
  	case 7:
  		type = DDR;
  		puts("DDR
  ");
  		break;
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1257
1258
1259
1260
1261
  	case 8:
  		type = DDR2;
  		puts ("DDR2
  ");
  		break;
18c4e7f71   Michal Simek   i2c: spd: Extend ...
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
  	case 11:
  		type = DDR3;
  		puts("DDR3
  ");
  		break;
  	case 12:
  		type = DDR4;
  		puts("DDR4
  ");
  		break;
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1272
1273
1274
1275
1276
  	default:
  		type = unknown;
  		puts ("unknown
  ");
  		break;
81a8824f2   wdenk   Initial revision
1277
  	}
632de0672   Larry Johnson   Refactor code for...
1278

4b9206ed5   wdenk   * Patches by Thom...
1279
  	puts ("Row address bits             ");
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1280
  	if ((data[3] & 0x00F0) == 0)
632de0672   Larry Johnson   Refactor code for...
1281
1282
  		printf ("%d
  ", data[3] & 0x0F);
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1283
  	else
632de0672   Larry Johnson   Refactor code for...
1284
1285
  		printf ("%d/%d
  ", data[3] & 0x0F, (data[3] >> 4) & 0x0F);
4b9206ed5   wdenk   * Patches by Thom...
1286
  	puts ("Column address bits          ");
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1287
  	if ((data[4] & 0x00F0) == 0)
632de0672   Larry Johnson   Refactor code for...
1288
1289
  		printf ("%d
  ", data[4] & 0x0F);
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1290
  	else
632de0672   Larry Johnson   Refactor code for...
1291
1292
  		printf ("%d/%d
  ", data[4] & 0x0F, (data[4] >> 4) & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1293
1294
1295
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1296
1297
1298
  		printf ("Number of ranks              %d
  ",
  			(data[5] & 0x07) + 1);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1299
1300
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1301
1302
  		printf ("Module rows                  %d
  ", data[5]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1303
1304
1305
1306
1307
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1308
1309
  		printf ("Module data width            %d bits
  ", data[6]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1310
1311
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1312
1313
1314
  		printf ("Module data width            %d bits
  ",
  			(data[7] << 8) | data[6]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1315
1316
  		break;
  	}
4b9206ed5   wdenk   * Patches by Thom...
1317
  	puts ("Interface signal levels      ");
81a8824f2   wdenk   Initial revision
1318
  	switch(data[8]) {
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1319
1320
  		case 0:  puts ("TTL 5.0 V
  ");	break;
4b9206ed5   wdenk   * Patches by Thom...
1321
1322
  		case 1:  puts ("LVTTL
  ");	break;
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1323
1324
1325
1326
1327
1328
1329
1330
  		case 2:  puts ("HSTL 1.5 V
  ");	break;
  		case 3:  puts ("SSTL 3.3 V
  ");	break;
  		case 4:  puts ("SSTL 2.5 V
  ");	break;
  		case 5:  puts ("SSTL 1.8 V
  ");	break;
4b9206ed5   wdenk   * Patches by Thom...
1331
1332
  		default: puts ("unknown
  ");	break;
81a8824f2   wdenk   Initial revision
1333
  	}
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1334
1335
1336
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1337
1338
  		printf ("SDRAM cycle time             ");
  		print_ddr2_tcyc (data[9]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1339
1340
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1341
1342
1343
  		printf ("SDRAM cycle time             %d.%d ns
  ",
  			(data[9] >> 4) & 0x0F, data[9] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1344
1345
1346
1347
1348
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1349
1350
1351
  		printf ("SDRAM access time            0.%d%d ns
  ",
  			(data[10] >> 4) & 0x0F, data[10] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1352
1353
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1354
1355
1356
  		printf ("SDRAM access time            %d.%d ns
  ",
  			(data[10] >> 4) & 0x0F, data[10] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1357
1358
  		break;
  	}
4b9206ed5   wdenk   * Patches by Thom...
1359
  	puts ("EDC configuration            ");
632de0672   Larry Johnson   Refactor code for...
1360
  	switch (data[11]) {
4b9206ed5   wdenk   * Patches by Thom...
1361
1362
1363
1364
1365
1366
1367
1368
  		case 0:  puts ("None
  ");	break;
  		case 1:  puts ("Parity
  ");	break;
  		case 2:  puts ("ECC
  ");	break;
  		default: puts ("unknown
  ");	break;
81a8824f2   wdenk   Initial revision
1369
  	}
632de0672   Larry Johnson   Refactor code for...
1370

e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1371
  	if ((data[12] & 0x80) == 0)
4b9206ed5   wdenk   * Patches by Thom...
1372
  		puts ("No self refresh, rate        ");
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1373
  	else
4b9206ed5   wdenk   * Patches by Thom...
1374
  		puts ("Self refresh, rate           ");
632de0672   Larry Johnson   Refactor code for...
1375

81a8824f2   wdenk   Initial revision
1376
  	switch(data[12] & 0x7F) {
632de0672   Larry Johnson   Refactor code for...
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
  		case 0:  puts ("15.625 us
  ");	break;
  		case 1:  puts ("3.9 us
  ");	break;
  		case 2:  puts ("7.8 us
  ");	break;
  		case 3:  puts ("31.3 us
  ");	break;
  		case 4:  puts ("62.5 us
  ");	break;
  		case 5:  puts ("125 us
  ");	break;
4b9206ed5   wdenk   * Patches by Thom...
1389
1390
  		default: puts ("unknown
  ");	break;
81a8824f2   wdenk   Initial revision
1391
  	}
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1392
1393
1394
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1395
1396
  		printf ("SDRAM width (primary)        %d
  ", data[13]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1397
1398
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1399
1400
  		printf ("SDRAM width (primary)        %d
  ", data[13] & 0x7F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1401
  		if ((data[13] & 0x80) != 0) {
632de0672   Larry Johnson   Refactor code for...
1402
1403
1404
  			printf ("  (second bank)              %d
  ",
  				2 * (data[13] & 0x7F));
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1405
1406
1407
1408
1409
1410
1411
  		}
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
  		if (data[14] != 0)
632de0672   Larry Johnson   Refactor code for...
1412
1413
  			printf ("EDC width                    %d
  ", data[14]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1414
1415
1416
  		break;
  	default:
  		if (data[14] != 0) {
632de0672   Larry Johnson   Refactor code for...
1417
1418
1419
  			printf ("EDC width                    %d
  ",
  				data[14] & 0x7F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1420
1421
  
  			if ((data[14] & 0x80) != 0) {
632de0672   Larry Johnson   Refactor code for...
1422
1423
1424
  				printf ("  (second bank)              %d
  ",
  					2 * (data[14] & 0x7F));
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1425
1426
1427
  			}
  		}
  		break;
81a8824f2   wdenk   Initial revision
1428
  	}
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1429

632de0672   Larry Johnson   Refactor code for...
1430
1431
1432
1433
  	if (DDR2 != type) {
  		printf ("Min clock delay, back-to-back random column addresses "
  			"%d
  ", data[15]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1434
  	}
4b9206ed5   wdenk   * Patches by Thom...
1435
1436
1437
1438
1439
1440
1441
1442
  	puts ("Burst length(s)             ");
  	if (data[16] & 0x80) puts (" Page");
  	if (data[16] & 0x08) puts (" 8");
  	if (data[16] & 0x04) puts (" 4");
  	if (data[16] & 0x02) puts (" 2");
  	if (data[16] & 0x01) puts (" 1");
  	putc ('
  ');
632de0672   Larry Johnson   Refactor code for...
1443
1444
  	printf ("Number of banks              %d
  ", data[17]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1445
1446
1447
1448
  
  	switch (type) {
  	case DDR2:
  		puts ("CAS latency(s)              ");
632de0672   Larry Johnson   Refactor code for...
1449
  		decode_bits (data[18], decode_CAS_DDR2, 0);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1450
1451
1452
1453
1454
  		putc ('
  ');
  		break;
  	default:
  		puts ("CAS latency(s)              ");
632de0672   Larry Johnson   Refactor code for...
1455
  		decode_bits (data[18], decode_CAS_default, 0);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1456
1457
1458
1459
1460
1461
1462
  		putc ('
  ');
  		break;
  	}
  
  	if (DDR2 != type) {
  		puts ("CS latency(s)               ");
632de0672   Larry Johnson   Refactor code for...
1463
  		decode_bits (data[19], decode_CS_WE_default, 0);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1464
1465
1466
1467
1468
1469
  		putc ('
  ');
  	}
  
  	if (DDR2 != type) {
  		puts ("WE latency(s)               ");
632de0672   Larry Johnson   Refactor code for...
1470
  		decode_bits (data[20], decode_CS_WE_default, 0);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
  		putc ('
  ');
  	}
  
  	switch (type) {
  	case DDR2:
  		puts ("Module attributes:
  ");
  		if (data[21] & 0x80)
  			puts ("  TBD (bit 7)
  ");
  		if (data[21] & 0x40)
  			puts ("  Analysis probe installed
  ");
  		if (data[21] & 0x20)
  			puts ("  TBD (bit 5)
  ");
  		if (data[21] & 0x10)
  			puts ("  FET switch external enable
  ");
632de0672   Larry Johnson   Refactor code for...
1491
1492
  		printf ("  %d PLLs on DIMM
  ", (data[21] >> 2) & 0x03);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1493
  		if (data[20] & 0x11) {
632de0672   Larry Johnson   Refactor code for...
1494
1495
1496
  			printf ("  %d active registers on DIMM
  ",
  				(data[21] & 0x03) + 1);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1497
1498
1499
1500
1501
1502
1503
1504
  		}
  		break;
  	default:
  		puts ("Module attributes:
  ");
  		if (!data[21])
  			puts ("  (none)
  ");
632de0672   Larry Johnson   Refactor code for...
1505
1506
  		else
  			decode_bits (data[21], decode_byte21_default, 0);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1507
1508
1509
1510
1511
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1512
  		decode_bits (data[22], decode_byte22_DDR2, 0);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
  		break;
  	default:
  		puts ("Device attributes:
  ");
  		if (data[22] & 0x80) puts ("  TBD (bit 7)
  ");
  		if (data[22] & 0x40) puts ("  TBD (bit 6)
  ");
  		if (data[22] & 0x20) puts ("  Upper Vcc tolerance 5%
  ");
  		else                 puts ("  Upper Vcc tolerance 10%
  ");
  		if (data[22] & 0x10) puts ("  Lower Vcc tolerance 5%
  ");
  		else                 puts ("  Lower Vcc tolerance 10%
  ");
  		if (data[22] & 0x08) puts ("  Supports write1/read burst
  ");
  		if (data[22] & 0x04) puts ("  Supports precharge all
  ");
  		if (data[22] & 0x02) puts ("  Supports auto precharge
  ");
  		if (data[22] & 0x01) puts ("  Supports early RAS# precharge
  ");
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1542
1543
  		printf ("SDRAM cycle time (2nd highest CAS latency)        ");
  		print_ddr2_tcyc (data[23]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1544
1545
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1546
1547
1548
  		printf ("SDRAM cycle time (2nd highest CAS latency)        %d."
  			"%d ns
  ", (data[23] >> 4) & 0x0F, data[23] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1549
1550
1551
1552
1553
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1554
1555
1556
  		printf ("SDRAM access from clock (2nd highest CAS latency) 0."
  			"%d%d ns
  ", (data[24] >> 4) & 0x0F, data[24] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1557
1558
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1559
1560
1561
  		printf ("SDRAM access from clock (2nd highest CAS latency) %d."
  			"%d ns
  ", (data[24] >> 4) & 0x0F, data[24] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1562
1563
1564
1565
1566
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1567
1568
  		printf ("SDRAM cycle time (3rd highest CAS latency)        ");
  		print_ddr2_tcyc (data[25]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1569
1570
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1571
1572
1573
  		printf ("SDRAM cycle time (3rd highest CAS latency)        %d."
  			"%d ns
  ", (data[25] >> 4) & 0x0F, data[25] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1574
1575
1576
1577
1578
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1579
1580
1581
  		printf ("SDRAM access from clock (3rd highest CAS latency) 0."
  			"%d%d ns
  ", (data[26] >> 4) & 0x0F, data[26] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1582
1583
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1584
1585
1586
  		printf ("SDRAM access from clock (3rd highest CAS latency) %d."
  			"%d ns
  ", (data[26] >> 4) & 0x0F, data[26] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1587
1588
1589
1590
1591
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1592
1593
1594
  		printf ("Minimum row precharge        %d.%02d ns
  ",
  			(data[27] >> 2) & 0x3F, 25 * (data[27] & 0x03));
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1595
1596
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1597
1598
  		printf ("Minimum row precharge        %d ns
  ", data[27]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1599
1600
1601
1602
1603
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1604
1605
1606
  		printf ("Row active to row active min %d.%02d ns
  ",
  			(data[28] >> 2) & 0x3F, 25 * (data[28] & 0x03));
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1607
1608
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1609
1610
  		printf ("Row active to row active min %d ns
  ", data[28]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1611
1612
1613
1614
1615
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1616
1617
1618
  		printf ("RAS to CAS delay min         %d.%02d ns
  ",
  			(data[29] >> 2) & 0x3F, 25 * (data[29] & 0x03));
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1619
1620
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1621
1622
  		printf ("RAS to CAS delay min         %d ns
  ", data[29]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1623
1624
  		break;
  	}
632de0672   Larry Johnson   Refactor code for...
1625
1626
  	printf ("Minimum RAS pulse width      %d ns
  ", data[30]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1627
1628
1629
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1630
1631
1632
1633
  		puts ("Density of each row          ");
  		decode_bits (data[31], decode_row_density_DDR2, 1);
  		putc ('
  ');
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1634
1635
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1636
1637
1638
1639
  		puts ("Density of each row          ");
  		decode_bits (data[31], decode_row_density_default, 1);
  		putc ('
  ');
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1640
1641
1642
1643
1644
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1645
  		puts ("Command and Address setup    ");
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1646
  		if (data[32] >= 0xA0) {
632de0672   Larry Johnson   Refactor code for...
1647
1648
1649
  			printf ("1.%d%d ns
  ",
  				((data[32] >> 4) & 0x0F) - 10, data[32] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1650
  		} else {
632de0672   Larry Johnson   Refactor code for...
1651
1652
1653
  			printf ("0.%d%d ns
  ",
  				((data[32] >> 4) & 0x0F), data[32] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1654
1655
1656
  		}
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1657
1658
1659
1660
  		printf ("Command and Address setup    %c%d.%d ns
  ",
  			(data[32] & 0x80) ? '-' : '+',
  			(data[32] >> 4) & 0x07, data[32] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1661
1662
1663
1664
1665
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1666
  		puts ("Command and Address hold     ");
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1667
  		if (data[33] >= 0xA0) {
632de0672   Larry Johnson   Refactor code for...
1668
1669
1670
  			printf ("1.%d%d ns
  ",
  				((data[33] >> 4) & 0x0F) - 10, data[33] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1671
  		} else {
632de0672   Larry Johnson   Refactor code for...
1672
1673
1674
  			printf ("0.%d%d ns
  ",
  				((data[33] >> 4) & 0x0F), data[33] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1675
1676
1677
  		}
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1678
1679
1680
1681
  		printf ("Command and Address hold     %c%d.%d ns
  ",
  			(data[33] & 0x80) ? '-' : '+',
  			(data[33] >> 4) & 0x07, data[33] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1682
1683
1684
1685
1686
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1687
1688
1689
  		printf ("Data signal input setup      0.%d%d ns
  ",
  			(data[34] >> 4) & 0x0F, data[34] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1690
1691
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1692
1693
1694
1695
  		printf ("Data signal input setup      %c%d.%d ns
  ",
  			(data[34] & 0x80) ? '-' : '+',
  			(data[34] >> 4) & 0x07, data[34] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1696
1697
1698
1699
1700
  		break;
  	}
  
  	switch (type) {
  	case DDR2:
632de0672   Larry Johnson   Refactor code for...
1701
1702
1703
  		printf ("Data signal input hold       0.%d%d ns
  ",
  			(data[35] >> 4) & 0x0F, data[35] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1704
1705
  		break;
  	default:
632de0672   Larry Johnson   Refactor code for...
1706
1707
1708
1709
  		printf ("Data signal input hold       %c%d.%d ns
  ",
  			(data[35] & 0x80) ? '-' : '+',
  			(data[35] >> 4) & 0x07, data[35] & 0x0F);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1710
1711
  		break;
  	}
4b9206ed5   wdenk   * Patches by Thom...
1712
  	puts ("Manufacturer's JEDEC ID      ");
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1713
  	for (j = 64; j <= 71; j++)
632de0672   Larry Johnson   Refactor code for...
1714
  		printf ("%02X ", data[j]);
4b9206ed5   wdenk   * Patches by Thom...
1715
1716
  	putc ('
  ');
632de0672   Larry Johnson   Refactor code for...
1717
1718
  	printf ("Manufacturing Location       %02X
  ", data[72]);
4b9206ed5   wdenk   * Patches by Thom...
1719
  	puts ("Manufacturer's Part Number   ");
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1720
  	for (j = 73; j <= 90; j++)
632de0672   Larry Johnson   Refactor code for...
1721
  		printf ("%02X ", data[j]);
4b9206ed5   wdenk   * Patches by Thom...
1722
1723
  	putc ('
  ');
632de0672   Larry Johnson   Refactor code for...
1724
1725
1726
1727
  	printf ("Revision Code                %02X %02X
  ", data[91], data[92]);
  	printf ("Manufacturing Date           %02X %02X
  ", data[93], data[94]);
4b9206ed5   wdenk   * Patches by Thom...
1728
  	puts ("Assembly Serial Number       ");
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1729
  	for (j = 95; j <= 98; j++)
632de0672   Larry Johnson   Refactor code for...
1730
  		printf ("%02X ", data[j]);
4b9206ed5   wdenk   * Patches by Thom...
1731
1732
  	putc ('
  ');
81a8824f2   wdenk   Initial revision
1733

0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1734
  	if (DDR2 != type) {
632de0672   Larry Johnson   Refactor code for...
1735
1736
1737
  		printf ("Speed rating                 PC%d
  ",
  			data[126] == 0x66 ? 66 : data[126]);
0df6b8446   Larry Johnson   Fix "i2c sdram" c...
1738
  	}
81a8824f2   wdenk   Initial revision
1739
1740
  	return 0;
  }
902531788   Jon Loeliger   common/: Remove l...
1741
  #endif
81a8824f2   wdenk   Initial revision
1742

735987c5a   Tom Wai-Hong Tam   edid: Add I2C com...
1743
1744
1745
1746
1747
1748
1749
  /*
   * Syntax:
   *	i2c edid {i2c_chip}
   */
  #if defined(CONFIG_I2C_EDID)
  int do_edid(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  {
5468461d1   Masahiro Yamada   cmd_i2c: change v...
1750
  	uint chip;
735987c5a   Tom Wai-Hong Tam   edid: Add I2C com...
1751
  	struct edid1_info edid;
63656b762   Simon Glass   dm: i2c: Implemen...
1752
1753
1754
1755
  	int ret;
  #ifdef CONFIG_DM_I2C
  	struct udevice *dev;
  #endif
735987c5a   Tom Wai-Hong Tam   edid: Add I2C com...
1756
1757
1758
1759
1760
1761
1762
  
  	if (argc < 2) {
  		cmd_usage(cmdtp);
  		return 1;
  	}
  
  	chip = simple_strtoul(argv[1], NULL, 16);
63656b762   Simon Glass   dm: i2c: Implemen...
1763
1764
1765
  #ifdef CONFIG_DM_I2C
  	ret = i2c_get_cur_bus_chip(chip, &dev);
  	if (!ret)
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
1766
  		ret = dm_i2c_read(dev, 0, (uchar *)&edid, sizeof(edid));
63656b762   Simon Glass   dm: i2c: Implemen...
1767
1768
1769
1770
1771
  #else
  	ret = i2c_read(chip, 0, 1, (uchar *)&edid, sizeof(edid));
  #endif
  	if (ret)
  		return i2c_report_err(ret, I2C_ERR_READ);
735987c5a   Tom Wai-Hong Tam   edid: Add I2C com...
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
  
  	if (edid_check_info(&edid)) {
  		puts("Content isn't valid EDID.
  ");
  		return 1;
  	}
  
  	edid_print_info(&edid);
  	return 0;
  
  }
  #endif /* CONFIG_I2C_EDID */
59aa9df38   Simon Glass   dm: i2c: Implemen...
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
  #ifdef CONFIG_DM_I2C
  static void show_bus(struct udevice *bus)
  {
  	struct udevice *dev;
  
  	printf("Bus %d:\t%s", bus->req_seq, bus->name);
  	if (device_active(bus))
  		printf("  (active %d)", bus->seq);
  	printf("
  ");
  	for (device_find_first_child(bus, &dev);
  	     dev;
  	     device_find_next_child(&dev)) {
  		struct dm_i2c_chip *chip = dev_get_parent_platdata(dev);
  
  		printf("   %02x: %s, offset len %x, flags %x
  ",
  		       chip->chip_addr, dev->name, chip->offset_len,
  		       chip->flags);
  	}
  }
  #endif
06afa388b   Marek Vasut   i2c: kerneldoc: A...
1806
  /**
3f4978c71   Heiko Schocher   i2c: common chang...
1807
   * do_i2c_show_bus() - Handle the "i2c bus" command-line command
06afa388b   Marek Vasut   i2c: kerneldoc: A...
1808
1809
1810
1811
1812
1813
1814
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero always.
   */
59aa9df38   Simon Glass   dm: i2c: Implemen...
1815
  #if defined(CONFIG_SYS_I2C) || defined(CONFIG_DM_I2C)
0e350f81e   Jeroen Hofstee   common: commands:...
1816
1817
  static int do_i2c_show_bus(cmd_tbl_t *cmdtp, int flag, int argc,
  				char * const argv[])
67b23a322   Heiko Schocher   I2C: adding new "...
1818
  {
67b23a322   Heiko Schocher   I2C: adding new "...
1819
1820
  	if (argc == 1) {
  		/* show all busses */
59aa9df38   Simon Glass   dm: i2c: Implemen...
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
  #ifdef CONFIG_DM_I2C
  		struct udevice *bus;
  		struct uclass *uc;
  		int ret;
  
  		ret = uclass_get(UCLASS_I2C, &uc);
  		if (ret)
  			return CMD_RET_FAILURE;
  		uclass_foreach_dev(bus, uc)
  			show_bus(bus);
  #else
  		int i;
3f4978c71   Heiko Schocher   i2c: common chang...
1833
1834
1835
  		for (i = 0; i < CONFIG_SYS_NUM_I2C_BUSES; i++) {
  			printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name);
  #ifndef CONFIG_SYS_I2C_DIRECT_BUS
59aa9df38   Simon Glass   dm: i2c: Implemen...
1836
  			int j;
3f4978c71   Heiko Schocher   i2c: common chang...
1837
1838
1839
1840
1841
1842
1843
  			for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) {
  				if (i2c_bus[i].next_hop[j].chip == 0)
  					break;
  				printf("->%s@0x%2x:%d",
  				       i2c_bus[i].next_hop[j].mux.name,
  				       i2c_bus[i].next_hop[j].chip,
  				       i2c_bus[i].next_hop[j].channel);
67b23a322   Heiko Schocher   I2C: adding new "...
1844
  			}
3f4978c71   Heiko Schocher   i2c: common chang...
1845
1846
1847
  #endif
  			printf("
  ");
67b23a322   Heiko Schocher   I2C: adding new "...
1848
  		}
59aa9df38   Simon Glass   dm: i2c: Implemen...
1849
  #endif
67b23a322   Heiko Schocher   I2C: adding new "...
1850
  	} else {
59aa9df38   Simon Glass   dm: i2c: Implemen...
1851
  		int i;
3f4978c71   Heiko Schocher   i2c: common chang...
1852
1853
  		/* show specific bus */
  		i = simple_strtoul(argv[1], NULL, 10);
59aa9df38   Simon Glass   dm: i2c: Implemen...
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
  #ifdef CONFIG_DM_I2C
  		struct udevice *bus;
  		int ret;
  
  		ret = uclass_get_device_by_seq(UCLASS_I2C, i, &bus);
  		if (ret) {
  			printf("Invalid bus %d: err=%d
  ", i, ret);
  			return CMD_RET_FAILURE;
  		}
  		show_bus(bus);
  #else
3f4978c71   Heiko Schocher   i2c: common chang...
1866
1867
1868
1869
1870
1871
1872
  		if (i >= CONFIG_SYS_NUM_I2C_BUSES) {
  			printf("Invalid bus %d
  ", i);
  			return -1;
  		}
  		printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name);
  #ifndef CONFIG_SYS_I2C_DIRECT_BUS
59aa9df38   Simon Glass   dm: i2c: Implemen...
1873
  			int j;
3f4978c71   Heiko Schocher   i2c: common chang...
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
  			for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) {
  				if (i2c_bus[i].next_hop[j].chip == 0)
  					break;
  				printf("->%s@0x%2x:%d",
  				       i2c_bus[i].next_hop[j].mux.name,
  				       i2c_bus[i].next_hop[j].chip,
  				       i2c_bus[i].next_hop[j].channel);
  			}
  #endif
  		printf("
  ");
59aa9df38   Simon Glass   dm: i2c: Implemen...
1885
  #endif
67b23a322   Heiko Schocher   I2C: adding new "...
1886
  	}
3f4978c71   Heiko Schocher   i2c: common chang...
1887
1888
  
  	return 0;
67b23a322   Heiko Schocher   I2C: adding new "...
1889
  }
3f4978c71   Heiko Schocher   i2c: common chang...
1890
  #endif
67b23a322   Heiko Schocher   I2C: adding new "...
1891

06afa388b   Marek Vasut   i2c: kerneldoc: A...
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
  /**
   * do_i2c_bus_num() - Handle the "i2c dev" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   */
63656b762   Simon Glass   dm: i2c: Implemen...
1902
1903
  #if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MULTI_BUS) || \
  		defined(CONFIG_DM_I2C)
0e350f81e   Jeroen Hofstee   common: commands:...
1904
1905
  static int do_i2c_bus_num(cmd_tbl_t *cmdtp, int flag, int argc,
  				char * const argv[])
bb99ad6d8   Ben Warren   Add support for m...
1906
  {
3f4978c71   Heiko Schocher   i2c: common chang...
1907
  	int		ret = 0;
63656b762   Simon Glass   dm: i2c: Implemen...
1908
  	int	bus_no;
bb99ad6d8   Ben Warren   Add support for m...
1909

63656b762   Simon Glass   dm: i2c: Implemen...
1910
  	if (argc == 1) {
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1911
  		/* querying current setting */
63656b762   Simon Glass   dm: i2c: Implemen...
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
  #ifdef CONFIG_DM_I2C
  		struct udevice *bus;
  
  		if (!i2c_get_cur_bus(&bus))
  			bus_no = bus->seq;
  		else
  			bus_no = -1;
  #else
  		bus_no = i2c_get_bus_num();
  #endif
  		printf("Current bus is %d
  ", bus_no);
  	} else {
3f4978c71   Heiko Schocher   i2c: common chang...
1925
  		bus_no = simple_strtoul(argv[1], NULL, 10);
880a41273   Heiko Schocher   i2c: fix i2c dev ...
1926
  #if defined(CONFIG_SYS_I2C)
3f4978c71   Heiko Schocher   i2c: common chang...
1927
1928
1929
1930
1931
  		if (bus_no >= CONFIG_SYS_NUM_I2C_BUSES) {
  			printf("Invalid bus %d
  ", bus_no);
  			return -1;
  		}
880a41273   Heiko Schocher   i2c: fix i2c dev ...
1932
  #endif
3f4978c71   Heiko Schocher   i2c: common chang...
1933
1934
  		printf("Setting bus to %d
  ", bus_no);
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
1935
1936
1937
  #ifdef CONFIG_DM_I2C
  		ret = cmd_i2c_set_bus_num(bus_no);
  #else
3f4978c71   Heiko Schocher   i2c: common chang...
1938
  		ret = i2c_set_bus_num(bus_no);
f9a4c2da7   Simon Glass   dm: i2c: Rename d...
1939
  #endif
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1940
  		if (ret)
bb99ad6d8   Ben Warren   Add support for m...
1941
1942
  			printf("Failure changing bus number (%d)
  ", ret);
bb99ad6d8   Ben Warren   Add support for m...
1943
  	}
4fbd258e6   Simon Glass   i2c: Correct comm...
1944
1945
  
  	return ret ? CMD_RET_FAILURE : 0;
bb99ad6d8   Ben Warren   Add support for m...
1946
  }
3f4978c71   Heiko Schocher   i2c: common chang...
1947
  #endif  /* defined(CONFIG_SYS_I2C) */
bb99ad6d8   Ben Warren   Add support for m...
1948

06afa388b   Marek Vasut   i2c: kerneldoc: A...
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
  /**
   * do_i2c_bus_speed() - Handle the "i2c speed" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   */
54841ab50   Wolfgang Denk   Make sure that ar...
1959
  static int do_i2c_bus_speed(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
bb99ad6d8   Ben Warren   Add support for m...
1960
1961
  {
  	int speed, ret=0;
63656b762   Simon Glass   dm: i2c: Implemen...
1962
1963
1964
1965
1966
1967
1968
1969
  #ifdef CONFIG_DM_I2C
  	struct udevice *bus;
  
  	if (i2c_get_cur_bus(&bus))
  		return 1;
  #endif
  	if (argc == 1) {
  #ifdef CONFIG_DM_I2C
ca88b9b93   Simon Glass   dm: i2c: Add a dm...
1970
  		speed = dm_i2c_get_bus_speed(bus);
63656b762   Simon Glass   dm: i2c: Implemen...
1971
1972
1973
  #else
  		speed = i2c_get_bus_speed();
  #endif
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1974
  		/* querying current speed */
63656b762   Simon Glass   dm: i2c: Implemen...
1975
1976
1977
  		printf("Current bus speed=%d
  ", speed);
  	} else {
bb99ad6d8   Ben Warren   Add support for m...
1978
1979
1980
  		speed = simple_strtoul(argv[1], NULL, 10);
  		printf("Setting bus speed to %d Hz
  ", speed);
63656b762   Simon Glass   dm: i2c: Implemen...
1981
  #ifdef CONFIG_DM_I2C
ca88b9b93   Simon Glass   dm: i2c: Add a dm...
1982
  		ret = dm_i2c_set_bus_speed(bus, speed);
63656b762   Simon Glass   dm: i2c: Implemen...
1983
  #else
bb99ad6d8   Ben Warren   Add support for m...
1984
  		ret = i2c_set_bus_speed(speed);
63656b762   Simon Glass   dm: i2c: Implemen...
1985
  #endif
e857a5bdb   Timur Tabi   mpc83xx: Miscella...
1986
  		if (ret)
bb99ad6d8   Ben Warren   Add support for m...
1987
1988
  			printf("Failure changing bus speed (%d)
  ", ret);
bb99ad6d8   Ben Warren   Add support for m...
1989
  	}
4fbd258e6   Simon Glass   i2c: Correct comm...
1990
1991
  
  	return ret ? CMD_RET_FAILURE : 0;
bb99ad6d8   Ben Warren   Add support for m...
1992
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
  /**
   * do_i2c_mm() - Handle the "i2c mm" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   */
54841ab50   Wolfgang Denk   Make sure that ar...
2003
  static int do_i2c_mm(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
bb99ad6d8   Ben Warren   Add support for m...
2004
  {
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2005
2006
  	return mod_i2c_mem (cmdtp, 1, flag, argc, argv);
  }
06afa388b   Marek Vasut   i2c: kerneldoc: A...
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
  /**
   * do_i2c_nm() - Handle the "i2c nm" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   */
54841ab50   Wolfgang Denk   Make sure that ar...
2017
  static int do_i2c_nm(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2018
2019
2020
  {
  	return mod_i2c_mem (cmdtp, 0, flag, argc, argv);
  }
e96ad5d3a   Peter Tyser   cmd_i2c: Clean up...
2021

06afa388b   Marek Vasut   i2c: kerneldoc: A...
2022
2023
2024
2025
2026
2027
2028
2029
2030
  /**
   * do_i2c_reset() - Handle the "i2c reset" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero always.
   */
54841ab50   Wolfgang Denk   Make sure that ar...
2031
  static int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2032
  {
63656b762   Simon Glass   dm: i2c: Implemen...
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
  #if defined(CONFIG_DM_I2C)
  	struct udevice *bus;
  
  	if (i2c_get_cur_bus(&bus))
  		return CMD_RET_FAILURE;
  	if (i2c_deblock(bus)) {
  		printf("Error: Not supported by the driver
  ");
  		return CMD_RET_FAILURE;
  	}
  #elif defined(CONFIG_SYS_I2C)
3f4978c71   Heiko Schocher   i2c: common chang...
2044
2045
  	i2c_init(I2C_ADAP->speed, I2C_ADAP->slaveaddr);
  #else
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2046
  	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
3f4978c71   Heiko Schocher   i2c: common chang...
2047
  #endif
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2048
2049
2050
2051
  	return 0;
  }
  
  static cmd_tbl_t cmd_i2c_sub[] = {
59aa9df38   Simon Glass   dm: i2c: Implemen...
2052
  #if defined(CONFIG_SYS_I2C) || defined(CONFIG_DM_I2C)
3f4978c71   Heiko Schocher   i2c: common chang...
2053
  	U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_show_bus, "", ""),
9a2accb44   Heiko Schocher   i2c, multibus: ge...
2054
  #endif
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2055
  	U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""),
3f4978c71   Heiko Schocher   i2c: common chang...
2056
  #if defined(CONFIG_SYS_I2C) || \
63656b762   Simon Glass   dm: i2c: Implemen...
2057
  	defined(CONFIG_I2C_MULTI_BUS) || defined(CONFIG_DM_I2C)
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2058
  	U_BOOT_CMD_MKENT(dev, 1, 1, do_i2c_bus_num, "", ""),
bb99ad6d8   Ben Warren   Add support for m...
2059
  #endif  /* CONFIG_I2C_MULTI_BUS */
735987c5a   Tom Wai-Hong Tam   edid: Add I2C com...
2060
2061
2062
  #if defined(CONFIG_I2C_EDID)
  	U_BOOT_CMD_MKENT(edid, 1, 1, do_edid, "", ""),
  #endif  /* CONFIG_I2C_EDID */
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2063
2064
2065
2066
2067
2068
  	U_BOOT_CMD_MKENT(loop, 3, 1, do_i2c_loop, "", ""),
  	U_BOOT_CMD_MKENT(md, 3, 1, do_i2c_md, "", ""),
  	U_BOOT_CMD_MKENT(mm, 2, 1, do_i2c_mm, "", ""),
  	U_BOOT_CMD_MKENT(mw, 3, 1, do_i2c_mw, "", ""),
  	U_BOOT_CMD_MKENT(nm, 2, 1, do_i2c_nm, "", ""),
  	U_BOOT_CMD_MKENT(probe, 0, 1, do_i2c_probe, "", ""),
652e53546   Frans Meulenbroeks   cmd_i2c.c: added ...
2069
  	U_BOOT_CMD_MKENT(read, 5, 1, do_i2c_read, "", ""),
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
2070
  	U_BOOT_CMD_MKENT(write, 6, 0, do_i2c_write, "", ""),
63656b762   Simon Glass   dm: i2c: Implemen...
2071
2072
  #ifdef CONFIG_DM_I2C
  	U_BOOT_CMD_MKENT(flags, 2, 1, do_i2c_flags, "", ""),
c10c8e313   Simon Glass   dm: i2c: Add a co...
2073
  	U_BOOT_CMD_MKENT(olen, 2, 1, do_i2c_olen, "", ""),
63656b762   Simon Glass   dm: i2c: Implemen...
2074
  #endif
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2075
  	U_BOOT_CMD_MKENT(reset, 0, 1, do_i2c_reset, "", ""),
c76fe4742   Jon Loeliger   common/cmd_[i-n]*...
2076
  #if defined(CONFIG_CMD_SDRAM)
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2077
  	U_BOOT_CMD_MKENT(sdram, 1, 1, do_sdram, "", ""),
902531788   Jon Loeliger   common/: Remove l...
2078
  #endif
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2079
2080
  	U_BOOT_CMD_MKENT(speed, 1, 1, do_i2c_bus_speed, "", ""),
  };
e4099c8b8   Michal Simek   i2c: cmd: Relocat...
2081
2082
2083
2084
2085
2086
2087
2088
  static __maybe_unused void i2c_reloc(void)
  {
  	static int relocated;
  
  	if (!relocated) {
  		fixup_cmdtable(cmd_i2c_sub, ARRAY_SIZE(cmd_i2c_sub));
  		relocated = 1;
  	};
f1d2b313c   Heiko Schocher   ARM: add relocati...
2089
  }
f1d2b313c   Heiko Schocher   ARM: add relocati...
2090

06afa388b   Marek Vasut   i2c: kerneldoc: A...
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
  /**
   * do_i2c() - Handle the "i2c" command-line command
   * @cmdtp:	Command data struct pointer
   * @flag:	Command flag
   * @argc:	Command-line argument count
   * @argv:	Array of command-line arguments
   *
   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
   * on error.
   */
54841ab50   Wolfgang Denk   Make sure that ar...
2101
  static int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2102
2103
  {
  	cmd_tbl_t *c;
e4099c8b8   Michal Simek   i2c: cmd: Relocat...
2104
2105
2106
  #ifdef CONFIG_NEEDS_MANUAL_RELOC
  	i2c_reloc();
  #endif
4444b221f   Heiko Schocher   i2c: fix command ...
2107
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
2108
  		return CMD_RET_USAGE;
4444b221f   Heiko Schocher   i2c: fix command ...
2109

bfc3b77eb   Frans Meulenbroeks   cmd_i2c.c: rework...
2110
2111
2112
2113
2114
  	/* Strip off leading 'i2c' command argument */
  	argc--;
  	argv++;
  
  	c = find_cmd_tbl(argv[0], &cmd_i2c_sub[0], ARRAY_SIZE(cmd_i2c_sub));
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
2115
  	if (c)
4c12eeb8b   Simon Glass   Convert cmd_usage...
2116
  		return c->cmd(cmdtp, flag, argc, argv);
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
2117
  	else
4c12eeb8b   Simon Glass   Convert cmd_usage...
2118
  		return CMD_RET_USAGE;
bb99ad6d8   Ben Warren   Add support for m...
2119
  }
8bde7f776   wdenk   * Code cleanup:
2120
2121
  
  /***************************************************/
088f1b199   Kim Phillips   common/cmd_*.c: s...
2122
2123
  #ifdef CONFIG_SYS_LONGHELP
  static char i2c_help_text[] =
59aa9df38   Simon Glass   dm: i2c: Implemen...
2124
  #if defined(CONFIG_SYS_I2C) || defined(CONFIG_DM_I2C)
3f4978c71   Heiko Schocher   i2c: common chang...
2125
2126
  	"bus [muxtype:muxaddr:muxchannel] - show I2C bus info
  "
9a2accb44   Heiko Schocher   i2c, multibus: ge...
2127
  #endif
fb0070e91   Frans Meulenbroeks   cmd_i2c.c: sorted...
2128
2129
  	"crc32 chip address[.0, .1, .2] count - compute CRC32 checksum
  "
3f4978c71   Heiko Schocher   i2c: common chang...
2130
  #if defined(CONFIG_SYS_I2C) || \
63656b762   Simon Glass   dm: i2c: Implemen...
2131
  	defined(CONFIG_I2C_MULTI_BUS) || defined(CONFIG_DM_I2C)
9bc2e4eee   Peter Tyser   cmd_i2c: Fix help...
2132
2133
  	"i2c dev [dev] - show or set current I2C bus
  "
d9fc70324   Matthias Fuchs   [PATCH] I2C: disa...
2134
  #endif  /* CONFIG_I2C_MULTI_BUS */
735987c5a   Tom Wai-Hong Tam   edid: Add I2C com...
2135
2136
2137
2138
  #if defined(CONFIG_I2C_EDID)
  	"i2c edid chip - print EDID configuration information
  "
  #endif  /* CONFIG_I2C_EDID */
fb0070e91   Frans Meulenbroeks   cmd_i2c.c: sorted...
2139
2140
  	"i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device
  "
d9fc70324   Matthias Fuchs   [PATCH] I2C: disa...
2141
2142
2143
2144
2145
2146
2147
2148
  	"i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device
  "
  	"i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)
  "
  	"i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)
  "
  	"i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)
  "
54b99e51a   Eric Nelson   i2c_probe: update...
2149
2150
  	"i2c probe [address] - test for and show device(s) on the I2C bus
  "
63656b762   Simon Glass   dm: i2c: Implemen...
2151
2152
  	"i2c read chip address[.0, .1, .2] length memaddress - read to memory
  "
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
2153
2154
2155
2156
  	"i2c write memaddress chip address[.0, .1, .2] length [-s] - write memory
  "
  	"          to I2C; the -s option selects bulk write in a single transaction
  "
63656b762   Simon Glass   dm: i2c: Implemen...
2157
2158
2159
  #ifdef CONFIG_DM_I2C
  	"i2c flags chip [flags] - set or get chip flags
  "
c10c8e313   Simon Glass   dm: i2c: Add a co...
2160
2161
  	"i2c olen chip [offset_length] - set or get chip offset length
  "
63656b762   Simon Glass   dm: i2c: Implemen...
2162
  #endif
e43a27c49   Heiko Schocher   I2C: add new comm...
2163
2164
  	"i2c reset - re-init the I2C Controller
  "
c76fe4742   Jon Loeliger   common/cmd_[i-n]*...
2165
  #if defined(CONFIG_CMD_SDRAM)
fb0070e91   Frans Meulenbroeks   cmd_i2c.c: sorted...
2166
2167
  	"i2c sdram chip - print SDRAM configuration information
  "
902531788   Jon Loeliger   common/: Remove l...
2168
  #endif
088f1b199   Kim Phillips   common/cmd_*.c: s...
2169
2170
2171
2172
  	"i2c speed [speed] - show or set I2C bus speed";
  #endif
  
  U_BOOT_CMD(
ed16f1468   Lubomir Popov   cmd_i2c: Provide ...
2173
  	i2c, 7, 1, do_i2c,
088f1b199   Kim Phillips   common/cmd_*.c: s...
2174
2175
  	"I2C sub-system",
  	i2c_help_text
d9fc70324   Matthias Fuchs   [PATCH] I2C: disa...
2176
  );