]> Git Repo - J-u-boot.git/blame - cmd/i2c.c
global: Move remaining CONFIG_SYS_NS16550_* to CFG_SYS_NS16550_*
[J-u-boot.git] / cmd / i2c.c
CommitLineData
83d290c5 1// SPDX-License-Identifier: GPL-2.0+
81a8824f 2/*
3f4978c7
HS
3 * (C) Copyright 2009
4 * Sergey Kubushyn, himself, [email protected]
5 *
6 * Changes for unified multibus/multiadapter I2C support.
7 *
81a8824f
WD
8 * (C) Copyright 2001
9 * Gerald Van Baren, Custom IDEAS, [email protected].
81a8824f
WD
10 */
11
12/*
13 * I2C Functions similar to the standard memory functions.
14 *
15 * There are several parameters in many of the commands that bear further
16 * explanations:
17 *
81a8824f
WD
18 * {i2c_chip} is the I2C chip address (the first byte sent on the bus).
19 * Each I2C chip on the bus has a unique address. On the I2C data bus,
20 * the address is the upper seven bits and the LSB is the "read/write"
21 * bit. Note that the {i2c_chip} address specified on the command
22 * line is not shifted up: e.g. a typical EEPROM memory chip may have
23 * an I2C address of 0x50, but the data put on the bus will be 0xA0
24 * for write and 0xA1 for read. This "non shifted" address notation
25 * matches at least half of the data sheets :-/.
26 *
27 * {addr} is the address (or offset) within the chip. Small memory
28 * chips have 8 bit addresses. Large memory chips have 16 bit
29 * addresses. Other memory chips have 9, 10, or 11 bit addresses.
30 * Many non-memory chips have multiple registers and {addr} is used
31 * as the register index. Some non-memory chips have only one register
32 * and therefore don't need any {addr} parameter.
33 *
34 * The default {addr} parameter is one byte (.1) which works well for
35 * memories and registers with 8 bits of address space.
36 *
37 * You can specify the length of the {addr} field with the optional .0,
38 * .1, or .2 modifier (similar to the .b, .w, .l modifier). If you are
39 * manipulating a single register device which doesn't use an address
40 * field, use "0.0" for the address and the ".0" length field will
41 * suppress the address in the I2C data stream. This also works for
42 * successive reads using the I2C auto-incrementing memory pointer.
43 *
44 * If you are manipulating a large memory with 2-byte addresses, use
45 * the .2 address modifier, e.g. 210.2 addresses location 528 (decimal).
46 *
47 * Then there are the unfortunate memory chips that spill the most
48 * significant 1, 2, or 3 bits of address into the chip address byte.
49 * This effectively makes one chip (logically) look like 2, 4, or
50 * 8 chips. This is handled (awkwardly) by #defining
6d0f6bcf 51 * CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW and using the .1 modifier on the
81a8824f
WD
52 * {addr} field (since .1 is the default, it doesn't actually have to
53 * be specified). Examples: given a memory chip at I2C chip address
54 * 0x50, the following would happen...
0f89c54b 55 * i2c md 50 0 10 display 16 bytes starting at 0x000
81a8824f 56 * On the bus: <S> A0 00 <E> <S> A1 <rd> ... <rd>
0f89c54b 57 * i2c md 50 100 10 display 16 bytes starting at 0x100
81a8824f 58 * On the bus: <S> A2 00 <E> <S> A3 <rd> ... <rd>
0f89c54b 59 * i2c md 50 210 10 display 16 bytes starting at 0x210
81a8824f
WD
60 * On the bus: <S> A4 10 <E> <S> A5 <rd> ... <rd>
61 * This is awfully ugly. It would be nice if someone would think up
62 * a better way of handling this.
63 *
64 * Adapted from cmd_mem.c which is copyright Wolfgang Denk ([email protected]).
65 */
66
67#include <common.h>
0098e179 68#include <bootretry.h>
18d66533 69#include <cli.h>
81a8824f 70#include <command.h>
24b852a7 71#include <console.h>
63656b76 72#include <dm.h>
735987c5 73#include <edid.h>
63656b76 74#include <errno.h>
81a8824f 75#include <i2c.h>
f7ae49fc 76#include <log.h>
67b23a32 77#include <malloc.h>
81a8824f 78#include <asm/byteorder.h>
2515d843 79#include <linux/compiler.h>
c05ed00a 80#include <linux/delay.h>
3db71108 81#include <u-boot/crc.h>
81a8824f 82
81a8824f
WD
83/* Display values from last command.
84 * Memory modify remembered values are different from display memory.
85 */
5468461d 86static uint i2c_dp_last_chip;
81a8824f
WD
87static uint i2c_dp_last_addr;
88static uint i2c_dp_last_alen;
89static uint i2c_dp_last_length = 0x10;
90
5468461d 91static uint i2c_mm_last_chip;
81a8824f
WD
92static uint i2c_mm_last_addr;
93static uint i2c_mm_last_alen;
94
bb99ad6d
BW
95/* If only one I2C bus is present, the list of devices to ignore when
96 * the probe command is issued is represented by a 1D array of addresses.
97 * When multiple buses are present, the list is an array of bus-address
98 * pairs. The following macros take care of this */
99
6d0f6bcf 100#if defined(CONFIG_SYS_I2C_NOPROBES)
55dabcc8 101#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) || defined(CONFIG_I2C_MULTI_BUS)
bb99ad6d
BW
102static struct
103{
104 uchar bus;
105 uchar addr;
6d0f6bcf 106} i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
bb99ad6d
BW
107#define GET_BUS_NUM i2c_get_bus_num()
108#define COMPARE_BUS(b,i) (i2c_no_probes[(i)].bus == (b))
109#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)].addr == (a))
110#define NO_PROBE_ADDR(i) i2c_no_probes[(i)].addr
111#else /* single bus */
6d0f6bcf 112static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;
bb99ad6d
BW
113#define GET_BUS_NUM 0
114#define COMPARE_BUS(b,i) ((b) == 0) /* Make compiler happy */
115#define COMPARE_ADDR(a,i) (i2c_no_probes[(i)] == (a))
116#define NO_PROBE_ADDR(i) i2c_no_probes[(i)]
55dabcc8 117#endif /* CONFIG_IS_ENABLED(SYS_I2C_LEGACY) */
67b23a32
HS
118#endif
119
a266fe95
FM
120#define DISP_LINE_LEN 16
121
63656b76
SG
122/*
123 * Default for driver model is to use the chip's existing address length.
124 * For legacy code, this is not stored, so we need to use a suitable
125 * default.
126 */
2147a169 127#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
128#define DEFAULT_ADDR_LEN (-1)
129#else
130#define DEFAULT_ADDR_LEN 1
131#endif
132
2147a169 133#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
134static struct udevice *i2c_cur_bus;
135
f9a4c2da 136static int cmd_i2c_set_bus_num(unsigned int busnum)
63656b76
SG
137{
138 struct udevice *bus;
139 int ret;
140
141 ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &bus);
142 if (ret) {
143 debug("%s: No bus %d\n", __func__, busnum);
144 return ret;
145 }
146 i2c_cur_bus = bus;
147
148 return 0;
149}
150
151static int i2c_get_cur_bus(struct udevice **busp)
152{
e46f8a33
LM
153#ifdef CONFIG_I2C_SET_DEFAULT_BUS_NUM
154 if (!i2c_cur_bus) {
155 if (cmd_i2c_set_bus_num(CONFIG_I2C_DEFAULT_BUS_NUMBER)) {
156 printf("Default I2C bus %d not found\n",
157 CONFIG_I2C_DEFAULT_BUS_NUMBER);
158 return -ENODEV;
159 }
160 }
161#endif
162
63656b76
SG
163 if (!i2c_cur_bus) {
164 puts("No I2C bus selected\n");
165 return -ENODEV;
166 }
167 *busp = i2c_cur_bus;
168
169 return 0;
170}
171
172static int i2c_get_cur_bus_chip(uint chip_addr, struct udevice **devp)
173{
174 struct udevice *bus;
175 int ret;
176
177 ret = i2c_get_cur_bus(&bus);
178 if (ret)
179 return ret;
180
25ab4b03 181 return i2c_get_chip(bus, chip_addr, 1, devp);
63656b76
SG
182}
183
184#endif
185
06afa388
MV
186/**
187 * i2c_init_board() - Board-specific I2C bus init
188 *
189 * This function is the default no-op implementation of I2C bus
62a3b7dd 190 * initialization. This function can be overridden by board-specific
06afa388
MV
191 * implementation if needed.
192 */
2515d843
MV
193__weak
194void i2c_init_board(void)
c649dda5 195{
c649dda5 196}
c649dda5 197
06afa388
MV
198/**
199 * get_alen() - Small parser helper function to get address length
200 *
201 * Returns the address length.
2c0dc990 202 */
1aa9a04f 203static uint get_alen(char *arg, int default_len)
2c0dc990 204{
1aa9a04f
MV
205 int j;
206 int alen;
2c0dc990 207
63656b76 208 alen = default_len;
2c0dc990
FM
209 for (j = 0; j < 8; j++) {
210 if (arg[j] == '.') {
211 alen = arg[j+1] - '0';
2c0dc990
FM
212 break;
213 } else if (arg[j] == '\0')
214 break;
215 }
216 return alen;
217}
218
c1a6f371
SG
219enum i2c_err_op {
220 I2C_ERR_READ,
221 I2C_ERR_WRITE,
222};
223
224static int i2c_report_err(int ret, enum i2c_err_op op)
225{
226 printf("Error %s the chip: %d\n",
227 op == I2C_ERR_READ ? "reading" : "writing", ret);
228
229 return CMD_RET_FAILURE;
230}
231
06afa388
MV
232/**
233 * do_i2c_read() - Handle the "i2c read" command-line command
234 * @cmdtp: Command data struct pointer
235 * @flag: Command flag
236 * @argc: Command-line argument count
237 * @argv: Array of command-line arguments
238 *
239 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
240 * on error.
241 *
652e5354
FM
242 * Syntax:
243 * i2c read {i2c_chip} {devaddr}{.0, .1, .2} {len} {memaddr}
244 */
09140113
SG
245static int do_i2c_read(struct cmd_tbl *cmdtp, int flag, int argc,
246 char *const argv[])
652e5354 247{
5468461d 248 uint chip;
63656b76 249 uint devaddr, length;
1aa9a04f 250 int alen;
652e5354 251 u_char *memaddr;
63656b76 252 int ret;
2147a169 253#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
254 struct udevice *dev;
255#endif
652e5354 256
47e26b1b 257 if (argc != 5)
4c12eeb8 258 return CMD_RET_USAGE;
652e5354
FM
259
260 /*
261 * I2C chip address
262 */
7e5f460e 263 chip = hextoul(argv[1], NULL);
652e5354
FM
264
265 /*
266 * I2C data address within the chip. This can be 1 or
267 * 2 bytes long. Some day it might be 3 bytes long :-).
268 */
7e5f460e 269 devaddr = hextoul(argv[2], NULL);
63656b76 270 alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53c 271 if (alen > 3)
4c12eeb8 272 return CMD_RET_USAGE;
652e5354
FM
273
274 /*
275 * Length is the number of objects, not number of bytes.
276 */
7e5f460e 277 length = hextoul(argv[3], NULL);
652e5354
FM
278
279 /*
280 * memaddr is the address where to store things in memory
281 */
7e5f460e 282 memaddr = (u_char *)hextoul(argv[4], NULL);
652e5354 283
2147a169 284#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
285 ret = i2c_get_cur_bus_chip(chip, &dev);
286 if (!ret && alen != -1)
287 ret = i2c_set_chip_offset_len(dev, alen);
288 if (!ret)
f9a4c2da 289 ret = dm_i2c_read(dev, devaddr, memaddr, length);
63656b76
SG
290#else
291 ret = i2c_read(chip, devaddr, alen, memaddr, length);
292#endif
293 if (ret)
294 return i2c_report_err(ret, I2C_ERR_READ);
295
652e5354
FM
296 return 0;
297}
298
09140113
SG
299static int do_i2c_write(struct cmd_tbl *cmdtp, int flag, int argc,
300 char *const argv[])
ff5d2dce 301{
5468461d 302 uint chip;
63656b76 303 uint devaddr, length;
1aa9a04f 304 int alen;
ff5d2dce 305 u_char *memaddr;
63656b76 306 int ret;
2147a169 307#if CONFIG_IS_ENABLED(DM_I2C)
63656b76 308 struct udevice *dev;
ed16f146 309 struct dm_i2c_chip *i2c_chip;
63656b76 310#endif
ff5d2dce 311
ed16f146 312 if ((argc < 5) || (argc > 6))
ff5d2dce
YS
313 return cmd_usage(cmdtp);
314
315 /*
316 * memaddr is the address where to store things in memory
317 */
7e5f460e 318 memaddr = (u_char *)hextoul(argv[1], NULL);
ff5d2dce
YS
319
320 /*
321 * I2C chip address
322 */
7e5f460e 323 chip = hextoul(argv[2], NULL);
ff5d2dce
YS
324
325 /*
326 * I2C data address within the chip. This can be 1 or
327 * 2 bytes long. Some day it might be 3 bytes long :-).
328 */
7e5f460e 329 devaddr = hextoul(argv[3], NULL);
63656b76 330 alen = get_alen(argv[3], DEFAULT_ADDR_LEN);
ff5d2dce
YS
331 if (alen > 3)
332 return cmd_usage(cmdtp);
333
334 /*
ed16f146 335 * Length is the number of bytes.
ff5d2dce 336 */
7e5f460e 337 length = hextoul(argv[4], NULL);
ff5d2dce 338
2147a169 339#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
340 ret = i2c_get_cur_bus_chip(chip, &dev);
341 if (!ret && alen != -1)
342 ret = i2c_set_chip_offset_len(dev, alen);
343 if (ret)
344 return i2c_report_err(ret, I2C_ERR_WRITE);
caa4daa2 345 i2c_chip = dev_get_parent_plat(dev);
ed16f146
LP
346 if (!i2c_chip)
347 return i2c_report_err(ret, I2C_ERR_WRITE);
63656b76
SG
348#endif
349
ed16f146
LP
350 if (argc == 6 && !strcmp(argv[5], "-s")) {
351 /*
352 * Write all bytes in a single I2C transaction. If the target
353 * device is an EEPROM, it is your responsibility to not cross
354 * a page boundary. No write delay upon completion, take this
355 * into account if linking commands.
356 */
2147a169 357#if CONFIG_IS_ENABLED(DM_I2C)
ed16f146
LP
358 i2c_chip->flags &= ~DM_I2C_CHIP_WR_ADDRESS;
359 ret = dm_i2c_write(dev, devaddr, memaddr, length);
63656b76 360#else
ed16f146 361 ret = i2c_write(chip, devaddr, alen, memaddr, length);
63656b76
SG
362#endif
363 if (ret)
364 return i2c_report_err(ret, I2C_ERR_WRITE);
ed16f146
LP
365 } else {
366 /*
367 * Repeated addressing - perform <length> separate
368 * write transactions of one byte each
369 */
370 while (length-- > 0) {
2147a169 371#if CONFIG_IS_ENABLED(DM_I2C)
ed16f146
LP
372 i2c_chip->flags |= DM_I2C_CHIP_WR_ADDRESS;
373 ret = dm_i2c_write(dev, devaddr++, memaddr++, 1);
374#else
375 ret = i2c_write(chip, devaddr++, alen, memaddr++, 1);
376#endif
377 if (ret)
378 return i2c_report_err(ret, I2C_ERR_WRITE);
ff5d2dce
YS
379/*
380 * No write delay with FRAM devices.
381 */
382#if !defined(CONFIG_SYS_I2C_FRAM)
ed16f146 383 udelay(11000);
ff5d2dce 384#endif
ed16f146 385 }
ff5d2dce
YS
386 }
387 return 0;
388}
389
2147a169 390#if CONFIG_IS_ENABLED(DM_I2C)
09140113 391static int do_i2c_flags(struct cmd_tbl *cmdtp, int flag, int argc,
63656b76
SG
392 char *const argv[])
393{
394 struct udevice *dev;
395 uint flags;
396 int chip;
397 int ret;
398
399 if (argc < 2)
400 return CMD_RET_USAGE;
401
7e5f460e 402 chip = hextoul(argv[1], NULL);
63656b76
SG
403 ret = i2c_get_cur_bus_chip(chip, &dev);
404 if (ret)
405 return i2c_report_err(ret, I2C_ERR_READ);
406
407 if (argc > 2) {
7e5f460e 408 flags = hextoul(argv[2], NULL);
63656b76
SG
409 ret = i2c_set_chip_flags(dev, flags);
410 } else {
411 ret = i2c_get_chip_flags(dev, &flags);
412 if (!ret)
413 printf("%x\n", flags);
414 }
415 if (ret)
416 return i2c_report_err(ret, I2C_ERR_READ);
417
418 return 0;
419}
c10c8e31 420
09140113
SG
421static int do_i2c_olen(struct cmd_tbl *cmdtp, int flag, int argc,
422 char *const argv[])
c10c8e31
SG
423{
424 struct udevice *dev;
425 uint olen;
426 int chip;
427 int ret;
428
429 if (argc < 2)
430 return CMD_RET_USAGE;
431
7e5f460e 432 chip = hextoul(argv[1], NULL);
c10c8e31
SG
433 ret = i2c_get_cur_bus_chip(chip, &dev);
434 if (ret)
435 return i2c_report_err(ret, I2C_ERR_READ);
436
437 if (argc > 2) {
7e5f460e 438 olen = hextoul(argv[2], NULL);
c10c8e31
SG
439 ret = i2c_set_chip_offset_len(dev, olen);
440 } else {
441 ret = i2c_get_chip_offset_len(dev);
442 if (ret >= 0) {
443 printf("%x\n", ret);
444 ret = 0;
445 }
446 }
447 if (ret)
448 return i2c_report_err(ret, I2C_ERR_READ);
449
450 return 0;
451}
63656b76
SG
452#endif
453
06afa388
MV
454/**
455 * do_i2c_md() - Handle the "i2c md" command-line command
456 * @cmdtp: Command data struct pointer
457 * @flag: Command flag
458 * @argc: Command-line argument count
459 * @argv: Array of command-line arguments
460 *
461 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
462 * on error.
463 *
4a8cf338
FM
464 * Syntax:
465 * i2c md {i2c_chip} {addr}{.0, .1, .2} {len}
466 */
09140113
SG
467static int do_i2c_md(struct cmd_tbl *cmdtp, int flag, int argc,
468 char *const argv[])
81a8824f 469{
5468461d 470 uint chip;
63656b76 471 uint addr, length;
1aa9a04f 472 int alen;
e4573fef
MV
473 int j;
474 uint nbytes, linebytes;
63656b76 475 int ret;
2147a169 476#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
477 struct udevice *dev;
478#endif
81a8824f
WD
479
480 /* We use the last specified parameters, unless new ones are
481 * entered.
482 */
483 chip = i2c_dp_last_chip;
484 addr = i2c_dp_last_addr;
485 alen = i2c_dp_last_alen;
486 length = i2c_dp_last_length;
487
47e26b1b 488 if (argc < 3)
4c12eeb8 489 return CMD_RET_USAGE;
81a8824f
WD
490
491 if ((flag & CMD_FLAG_REPEAT) == 0) {
492 /*
493 * New command specified.
494 */
81a8824f
WD
495
496 /*
497 * I2C chip address
498 */
7e5f460e 499 chip = hextoul(argv[1], NULL);
81a8824f
WD
500
501 /*
502 * I2C data address within the chip. This can be 1 or
503 * 2 bytes long. Some day it might be 3 bytes long :-).
504 */
7e5f460e 505 addr = hextoul(argv[2], NULL);
63656b76 506 alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53c 507 if (alen > 3)
4c12eeb8 508 return CMD_RET_USAGE;
81a8824f
WD
509
510 /*
511 * If another parameter, it is the length to display.
512 * Length is the number of objects, not number of bytes.
513 */
514 if (argc > 3)
7e5f460e 515 length = hextoul(argv[3], NULL);
81a8824f
WD
516 }
517
2147a169 518#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
519 ret = i2c_get_cur_bus_chip(chip, &dev);
520 if (!ret && alen != -1)
521 ret = i2c_set_chip_offset_len(dev, alen);
522 if (ret)
523 return i2c_report_err(ret, I2C_ERR_READ);
524#endif
525
81a8824f
WD
526 /*
527 * Print the lines.
528 *
529 * We buffer all read data, so we can make sure data is read only
530 * once.
531 */
532 nbytes = length;
533 do {
534 unsigned char linebuf[DISP_LINE_LEN];
535 unsigned char *cp;
536
537 linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
538
2147a169 539#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da 540 ret = dm_i2c_read(dev, addr, linebuf, linebytes);
63656b76
SG
541#else
542 ret = i2c_read(chip, addr, alen, linebuf, linebytes);
543#endif
544 if (ret)
9e533cb0 545 return i2c_report_err(ret, I2C_ERR_READ);
e857a5bd 546 else {
81a8824f
WD
547 printf("%04x:", addr);
548 cp = linebuf;
549 for (j=0; j<linebytes; j++) {
550 printf(" %02x", *cp++);
551 addr++;
552 }
4b9206ed 553 puts (" ");
81a8824f
WD
554 cp = linebuf;
555 for (j=0; j<linebytes; j++) {
556 if ((*cp < 0x20) || (*cp > 0x7e))
4b9206ed 557 puts (".");
81a8824f
WD
558 else
559 printf("%c", *cp);
560 cp++;
561 }
4b9206ed 562 putc ('\n');
81a8824f
WD
563 }
564 nbytes -= linebytes;
565 } while (nbytes > 0);
566
567 i2c_dp_last_chip = chip;
568 i2c_dp_last_addr = addr;
569 i2c_dp_last_alen = alen;
570 i2c_dp_last_length = length;
571
572 return 0;
573}
574
06afa388
MV
575/**
576 * do_i2c_mw() - Handle the "i2c mw" command-line command
577 * @cmdtp: Command data struct pointer
578 * @flag: Command flag
579 * @argc: Command-line argument count
580 * @argv: Array of command-line arguments
581 *
582 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
583 * on error.
81a8824f
WD
584 *
585 * Syntax:
0f89c54b 586 * i2c mw {i2c_chip} {addr}{.0, .1, .2} {data} [{count}]
81a8824f 587 */
09140113
SG
588static int do_i2c_mw(struct cmd_tbl *cmdtp, int flag, int argc,
589 char *const argv[])
81a8824f 590{
5468461d 591 uint chip;
81a8824f 592 ulong addr;
1aa9a04f 593 int alen;
81a8824f 594 uchar byte;
1aa9a04f 595 int count;
63656b76 596 int ret;
2147a169 597#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
598 struct udevice *dev;
599#endif
81a8824f 600
47e26b1b 601 if ((argc < 4) || (argc > 5))
4c12eeb8 602 return CMD_RET_USAGE;
81a8824f
WD
603
604 /*
53677ef1
WD
605 * Chip is always specified.
606 */
7e5f460e 607 chip = hextoul(argv[1], NULL);
81a8824f
WD
608
609 /*
610 * Address is always specified.
611 */
7e5f460e 612 addr = hextoul(argv[2], NULL);
63656b76 613 alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53c 614 if (alen > 3)
4c12eeb8 615 return CMD_RET_USAGE;
81a8824f 616
2147a169 617#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
618 ret = i2c_get_cur_bus_chip(chip, &dev);
619 if (!ret && alen != -1)
620 ret = i2c_set_chip_offset_len(dev, alen);
621 if (ret)
622 return i2c_report_err(ret, I2C_ERR_WRITE);
623#endif
81a8824f
WD
624 /*
625 * Value to write is always specified.
626 */
7e5f460e 627 byte = hextoul(argv[3], NULL);
81a8824f
WD
628
629 /*
630 * Optional count
631 */
e857a5bd 632 if (argc == 5)
7e5f460e 633 count = hextoul(argv[4], NULL);
e857a5bd 634 else
81a8824f 635 count = 1;
81a8824f
WD
636
637 while (count-- > 0) {
2147a169 638#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da 639 ret = dm_i2c_write(dev, addr++, &byte, 1);
63656b76
SG
640#else
641 ret = i2c_write(chip, addr++, alen, &byte, 1);
642#endif
643 if (ret)
9e533cb0 644 return i2c_report_err(ret, I2C_ERR_WRITE);
81a8824f
WD
645 /*
646 * Wait for the write to complete. The write can take
647 * up to 10mSec (we allow a little more time).
81a8824f 648 */
d4f5c728 649/*
650 * No write delay with FRAM devices.
651 */
6d0f6bcf 652#if !defined(CONFIG_SYS_I2C_FRAM)
81a8824f 653 udelay(11000);
d4f5c728 654#endif
81a8824f
WD
655 }
656
06afa388 657 return 0;
81a8824f
WD
658}
659
06afa388
MV
660/**
661 * do_i2c_crc() - Handle the "i2c crc32" command-line command
662 * @cmdtp: Command data struct pointer
663 * @flag: Command flag
664 * @argc: Command-line argument count
665 * @argv: Array of command-line arguments
666 *
667 * Calculate a CRC on memory
668 *
669 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
670 * on error.
81a8824f
WD
671 *
672 * Syntax:
0f89c54b 673 * i2c crc32 {i2c_chip} {addr}{.0, .1, .2} {count}
81a8824f 674 */
09140113
SG
675static int do_i2c_crc(struct cmd_tbl *cmdtp, int flag, int argc,
676 char *const argv[])
81a8824f 677{
5468461d 678 uint chip;
81a8824f 679 ulong addr;
1aa9a04f
MV
680 int alen;
681 int count;
81a8824f
WD
682 uchar byte;
683 ulong crc;
684 ulong err;
63656b76 685 int ret = 0;
2147a169 686#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
687 struct udevice *dev;
688#endif
81a8824f 689
47e26b1b 690 if (argc < 4)
4c12eeb8 691 return CMD_RET_USAGE;
81a8824f
WD
692
693 /*
53677ef1
WD
694 * Chip is always specified.
695 */
7e5f460e 696 chip = hextoul(argv[1], NULL);
81a8824f
WD
697
698 /*
699 * Address is always specified.
700 */
7e5f460e 701 addr = hextoul(argv[2], NULL);
63656b76 702 alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53c 703 if (alen > 3)
4c12eeb8 704 return CMD_RET_USAGE;
81a8824f 705
2147a169 706#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
707 ret = i2c_get_cur_bus_chip(chip, &dev);
708 if (!ret && alen != -1)
709 ret = i2c_set_chip_offset_len(dev, alen);
710 if (ret)
711 return i2c_report_err(ret, I2C_ERR_READ);
712#endif
81a8824f
WD
713 /*
714 * Count is always specified
715 */
7e5f460e 716 count = hextoul(argv[3], NULL);
81a8824f
WD
717
718 printf ("CRC32 for %08lx ... %08lx ==> ", addr, addr + count - 1);
719 /*
720 * CRC a byte at a time. This is going to be slooow, but hey, the
721 * memories are small and slow too so hopefully nobody notices.
722 */
723 crc = 0;
724 err = 0;
e857a5bd 725 while (count-- > 0) {
2147a169 726#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da 727 ret = dm_i2c_read(dev, addr, &byte, 1);
63656b76
SG
728#else
729 ret = i2c_read(chip, addr, alen, &byte, 1);
730#endif
731 if (ret)
81a8824f 732 err++;
b2ea91ba 733 crc = crc32(crc, &byte, 1);
81a8824f
WD
734 addr++;
735 }
e857a5bd 736 if (err > 0)
63656b76 737 i2c_report_err(ret, I2C_ERR_READ);
e857a5bd 738 else
81a8824f 739 printf ("%08lx\n", crc);
81a8824f
WD
740
741 return 0;
742}
743
06afa388
MV
744/**
745 * mod_i2c_mem() - Handle the "i2c mm" and "i2c nm" command-line command
746 * @cmdtp: Command data struct pointer
747 * @flag: Command flag
748 * @argc: Command-line argument count
749 * @argv: Array of command-line arguments
750 *
751 * Modify memory.
752 *
753 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
754 * on error.
81a8824f
WD
755 *
756 * Syntax:
0f89c54b
PT
757 * i2c mm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
758 * i2c nm{.b, .w, .l} {i2c_chip} {addr}{.0, .1, .2}
81a8824f 759 */
09140113
SG
760static int mod_i2c_mem(struct cmd_tbl *cmdtp, int incrflag, int flag, int argc,
761 char *const argv[])
81a8824f 762{
5468461d 763 uint chip;
81a8824f 764 ulong addr;
63656b76 765 int alen;
81a8824f
WD
766 ulong data;
767 int size = 1;
768 int nbytes;
63656b76 769 int ret;
2147a169 770#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
771 struct udevice *dev;
772#endif
81a8824f 773
47e26b1b 774 if (argc != 3)
4c12eeb8 775 return CMD_RET_USAGE;
81a8824f 776
b26440f1 777 bootretry_reset_cmd_timeout(); /* got a good command to get here */
81a8824f
WD
778 /*
779 * We use the last specified parameters, unless new ones are
780 * entered.
781 */
782 chip = i2c_mm_last_chip;
783 addr = i2c_mm_last_addr;
784 alen = i2c_mm_last_alen;
785
786 if ((flag & CMD_FLAG_REPEAT) == 0) {
787 /*
788 * New command specified. Check for a size specification.
789 * Defaults to byte if no or incorrect specification.
790 */
791 size = cmd_get_data_size(argv[0], 1);
792
793 /*
53677ef1
WD
794 * Chip is always specified.
795 */
7e5f460e 796 chip = hextoul(argv[1], NULL);
81a8824f
WD
797
798 /*
799 * Address is always specified.
800 */
7e5f460e 801 addr = hextoul(argv[2], NULL);
63656b76 802 alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53c 803 if (alen > 3)
4c12eeb8 804 return CMD_RET_USAGE;
81a8824f
WD
805 }
806
2147a169 807#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
808 ret = i2c_get_cur_bus_chip(chip, &dev);
809 if (!ret && alen != -1)
810 ret = i2c_set_chip_offset_len(dev, alen);
811 if (ret)
812 return i2c_report_err(ret, I2C_ERR_WRITE);
813#endif
814
81a8824f
WD
815 /*
816 * Print the address, followed by value. Then accept input for
817 * the next value. A non-converted value exits.
818 */
819 do {
820 printf("%08lx:", addr);
2147a169 821#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da 822 ret = dm_i2c_read(dev, addr, (uchar *)&data, size);
63656b76
SG
823#else
824 ret = i2c_read(chip, addr, alen, (uchar *)&data, size);
825#endif
826 if (ret)
9e533cb0
MY
827 return i2c_report_err(ret, I2C_ERR_READ);
828
829 data = cpu_to_be32(data);
830 if (size == 1)
831 printf(" %02lx", (data >> 24) & 0x000000FF);
832 else if (size == 2)
833 printf(" %04lx", (data >> 16) & 0x0000FFFF);
834 else
835 printf(" %08lx", data);
81a8824f 836
e1bf824d 837 nbytes = cli_readline(" ? ");
81a8824f
WD
838 if (nbytes == 0) {
839 /*
840 * <CR> pressed as only input, don't modify current
841 * location and move to next.
842 */
843 if (incrflag)
844 addr += size;
845 nbytes = size;
b26440f1
SG
846 /* good enough to not time out */
847 bootretry_reset_cmd_timeout();
81a8824f
WD
848 }
849#ifdef CONFIG_BOOT_RETRY_TIME
e857a5bd 850 else if (nbytes == -2)
81a8824f 851 break; /* timed out, exit the command */
81a8824f
WD
852#endif
853 else {
854 char *endp;
855
7e5f460e 856 data = hextoul(console_buffer, &endp);
e857a5bd 857 if (size == 1)
81a8824f 858 data = data << 24;
e857a5bd 859 else if (size == 2)
81a8824f 860 data = data << 16;
81a8824f
WD
861 data = be32_to_cpu(data);
862 nbytes = endp - console_buffer;
863 if (nbytes) {
81a8824f
WD
864 /*
865 * good enough to not time out
866 */
b26440f1 867 bootretry_reset_cmd_timeout();
2147a169 868#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da
SG
869 ret = dm_i2c_write(dev, addr, (uchar *)&data,
870 size);
63656b76
SG
871#else
872 ret = i2c_write(chip, addr, alen,
873 (uchar *)&data, size);
874#endif
875 if (ret)
9e533cb0
MY
876 return i2c_report_err(ret,
877 I2C_ERR_WRITE);
88cd7d0e 878#if CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS > 0
6d0f6bcf 879 udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
2535d602 880#endif
81a8824f
WD
881 if (incrflag)
882 addr += size;
883 }
884 }
885 } while (nbytes);
886
0800707b
PT
887 i2c_mm_last_chip = chip;
888 i2c_mm_last_addr = addr;
889 i2c_mm_last_alen = alen;
81a8824f
WD
890
891 return 0;
892}
893
06afa388
MV
894/**
895 * do_i2c_probe() - Handle the "i2c probe" command-line command
896 * @cmdtp: Command data struct pointer
897 * @flag: Command flag
898 * @argc: Command-line argument count
899 * @argv: Array of command-line arguments
900 *
901 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
902 * on error.
903 *
81a8824f 904 * Syntax:
54b99e51
EN
905 * i2c probe {addr}
906 *
907 * Returns zero (success) if one or more I2C devices was found
81a8824f 908 */
09140113
SG
909static int do_i2c_probe(struct cmd_tbl *cmdtp, int flag, int argc,
910 char *const argv[])
81a8824f
WD
911{
912 int j;
54b99e51
EN
913 int addr = -1;
914 int found = 0;
6d0f6bcf 915#if defined(CONFIG_SYS_I2C_NOPROBES)
81a8824f 916 int k, skip;
3f4978c7 917 unsigned int bus = GET_BUS_NUM;
bb99ad6d 918#endif /* NOPROBES */
63656b76 919 int ret;
2147a169 920#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
921 struct udevice *bus, *dev;
922
923 if (i2c_get_cur_bus(&bus))
924 return CMD_RET_FAILURE;
925#endif
81a8824f 926
54b99e51
EN
927 if (argc == 2)
928 addr = simple_strtol(argv[1], 0, 16);
929
4b9206ed 930 puts ("Valid chip addresses:");
e857a5bd 931 for (j = 0; j < 128; j++) {
54b99e51
EN
932 if ((0 <= addr) && (j != addr))
933 continue;
934
6d0f6bcf 935#if defined(CONFIG_SYS_I2C_NOPROBES)
81a8824f 936 skip = 0;
cfb25cc4 937 for (k = 0; k < ARRAY_SIZE(i2c_no_probes); k++) {
e857a5bd 938 if (COMPARE_BUS(bus, k) && COMPARE_ADDR(j, k)) {
81a8824f
WD
939 skip = 1;
940 break;
941 }
942 }
943 if (skip)
944 continue;
945#endif
2147a169 946#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da 947 ret = dm_i2c_probe(bus, j, 0, &dev);
63656b76
SG
948#else
949 ret = i2c_probe(j);
950#endif
951 if (ret == 0) {
81a8824f 952 printf(" %02X", j);
54b99e51
EN
953 found++;
954 }
81a8824f 955 }
4b9206ed 956 putc ('\n');
81a8824f 957
6d0f6bcf 958#if defined(CONFIG_SYS_I2C_NOPROBES)
81a8824f 959 puts ("Excluded chip addresses:");
cfb25cc4 960 for (k = 0; k < ARRAY_SIZE(i2c_no_probes); k++) {
e857a5bd 961 if (COMPARE_BUS(bus,k))
bb99ad6d
BW
962 printf(" %02X", NO_PROBE_ADDR(k));
963 }
4b9206ed 964 putc ('\n');
81a8824f
WD
965#endif
966
54b99e51 967 return (0 == found);
81a8824f
WD
968}
969
06afa388
MV
970/**
971 * do_i2c_loop() - Handle the "i2c loop" command-line command
972 * @cmdtp: Command data struct pointer
973 * @flag: Command flag
974 * @argc: Command-line argument count
975 * @argv: Array of command-line arguments
976 *
977 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
978 * on error.
979 *
81a8824f 980 * Syntax:
0f89c54b 981 * i2c loop {i2c_chip} {addr}{.0, .1, .2} [{length}] [{delay}]
81a8824f
WD
982 * {length} - Number of bytes to read
983 * {delay} - A DECIMAL number and defaults to 1000 uSec
984 */
09140113
SG
985static int do_i2c_loop(struct cmd_tbl *cmdtp, int flag, int argc,
986 char *const argv[])
81a8824f 987{
5468461d 988 uint chip;
1aa9a04f 989 int alen;
81a8824f
WD
990 uint addr;
991 uint length;
992 u_char bytes[16];
993 int delay;
63656b76 994 int ret;
2147a169 995#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
996 struct udevice *dev;
997#endif
81a8824f 998
47e26b1b 999 if (argc < 3)
4c12eeb8 1000 return CMD_RET_USAGE;
81a8824f
WD
1001
1002 /*
1003 * Chip is always specified.
1004 */
7e5f460e 1005 chip = hextoul(argv[1], NULL);
81a8824f
WD
1006
1007 /*
1008 * Address is always specified.
1009 */
7e5f460e 1010 addr = hextoul(argv[2], NULL);
63656b76 1011 alen = get_alen(argv[2], DEFAULT_ADDR_LEN);
7a92e53c 1012 if (alen > 3)
4c12eeb8 1013 return CMD_RET_USAGE;
2147a169 1014#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
1015 ret = i2c_get_cur_bus_chip(chip, &dev);
1016 if (!ret && alen != -1)
1017 ret = i2c_set_chip_offset_len(dev, alen);
1018 if (ret)
1019 return i2c_report_err(ret, I2C_ERR_WRITE);
1020#endif
81a8824f
WD
1021
1022 /*
1023 * Length is the number of objects, not number of bytes.
1024 */
1025 length = 1;
7e5f460e 1026 length = hextoul(argv[3], NULL);
e857a5bd 1027 if (length > sizeof(bytes))
81a8824f 1028 length = sizeof(bytes);
81a8824f
WD
1029
1030 /*
1031 * The delay time (uSec) is optional.
1032 */
1033 delay = 1000;
e857a5bd 1034 if (argc > 3)
0b1284eb 1035 delay = dectoul(argv[4], NULL);
81a8824f
WD
1036 /*
1037 * Run the loop...
1038 */
e857a5bd 1039 while (1) {
2147a169 1040#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da 1041 ret = dm_i2c_read(dev, addr, bytes, length);
63656b76
SG
1042#else
1043 ret = i2c_read(chip, addr, alen, bytes, length);
1044#endif
1045 if (ret)
1046 i2c_report_err(ret, I2C_ERR_READ);
81a8824f
WD
1047 udelay(delay);
1048 }
1049
1050 /* NOTREACHED */
1051 return 0;
1052}
1053
81a8824f
WD
1054/*
1055 * The SDRAM command is separately configured because many
1056 * (most?) embedded boards don't use SDRAM DIMMs.
06afa388
MV
1057 *
1058 * FIXME: Document and probably move elsewhere!
81a8824f 1059 */
c76fe474 1060#if defined(CONFIG_CMD_SDRAM)
632de067
LJ
1061static void print_ddr2_tcyc (u_char const b)
1062{
1063 printf ("%d.", (b >> 4) & 0x0F);
1064 switch (b & 0x0F) {
1065 case 0x0:
1066 case 0x1:
1067 case 0x2:
1068 case 0x3:
1069 case 0x4:
1070 case 0x5:
1071 case 0x6:
1072 case 0x7:
1073 case 0x8:
1074 case 0x9:
1075 printf ("%d ns\n", b & 0x0F);
1076 break;
1077 case 0xA:
1078 puts ("25 ns\n");
1079 break;
1080 case 0xB:
1081 puts ("33 ns\n");
1082 break;
1083 case 0xC:
1084 puts ("66 ns\n");
1085 break;
1086 case 0xD:
1087 puts ("75 ns\n");
1088 break;
1089 default:
1090 puts ("?? ns\n");
1091 break;
1092 }
1093}
1094
1095static void decode_bits (u_char const b, char const *str[], int const do_once)
1096{
1097 u_char mask;
1098
1099 for (mask = 0x80; mask != 0x00; mask >>= 1, ++str) {
1100 if (b & mask) {
1101 puts (*str);
1102 if (do_once)
1103 return;
1104 }
1105 }
1106}
81a8824f
WD
1107
1108/*
1109 * Syntax:
0f89c54b 1110 * i2c sdram {i2c_chip}
81a8824f 1111 */
09140113
SG
1112static int do_sdram(struct cmd_tbl *cmdtp, int flag, int argc,
1113 char *const argv[])
81a8824f 1114{
18c4e7f7 1115 enum { unknown, EDO, SDRAM, DDR, DDR2, DDR3, DDR4 } type;
632de067 1116
5468461d 1117 uint chip;
81a8824f
WD
1118 u_char data[128];
1119 u_char cksum;
28df8ed0 1120 int j, ret;
2147a169 1121#if CONFIG_IS_ENABLED(DM_I2C)
28df8ed0
NI
1122 struct udevice *dev;
1123#endif
81a8824f 1124
632de067
LJ
1125 static const char *decode_CAS_DDR2[] = {
1126 " TBD", " 6", " 5", " 4", " 3", " 2", " TBD", " TBD"
1127 };
1128
1129 static const char *decode_CAS_default[] = {
1130 " TBD", " 7", " 6", " 5", " 4", " 3", " 2", " 1"
1131 };
1132
1133 static const char *decode_CS_WE_default[] = {
1134 " TBD", " 6", " 5", " 4", " 3", " 2", " 1", " 0"
1135 };
1136
1137 static const char *decode_byte21_default[] = {
1138 " TBD (bit 7)\n",
1139 " Redundant row address\n",
1140 " Differential clock input\n",
1141 " Registerd DQMB inputs\n",
1142 " Buffered DQMB inputs\n",
1143 " On-card PLL\n",
1144 " Registered address/control lines\n",
1145 " Buffered address/control lines\n"
1146 };
1147
1148 static const char *decode_byte22_DDR2[] = {
1149 " TBD (bit 7)\n",
1150 " TBD (bit 6)\n",
1151 " TBD (bit 5)\n",
1152 " TBD (bit 4)\n",
1153 " TBD (bit 3)\n",
1154 " Supports partial array self refresh\n",
1155 " Supports 50 ohm ODT\n",
1156 " Supports weak driver\n"
1157 };
1158
1159 static const char *decode_row_density_DDR2[] = {
1160 "512 MiB", "256 MiB", "128 MiB", "16 GiB",
1161 "8 GiB", "4 GiB", "2 GiB", "1 GiB"
1162 };
1163
1164 static const char *decode_row_density_default[] = {
1165 "512 MiB", "256 MiB", "128 MiB", "64 MiB",
1166 "32 MiB", "16 MiB", "8 MiB", "4 MiB"
1167 };
1168
47e26b1b 1169 if (argc < 2)
4c12eeb8 1170 return CMD_RET_USAGE;
47e26b1b 1171
81a8824f
WD
1172 /*
1173 * Chip is always specified.
632de067 1174 */
7e5f460e 1175 chip = hextoul(argv[1], NULL);
81a8824f 1176
2147a169 1177#if CONFIG_IS_ENABLED(DM_I2C)
28df8ed0
NI
1178 ret = i2c_get_cur_bus_chip(chip, &dev);
1179 if (!ret)
1180 ret = dm_i2c_read(dev, 0, data, sizeof(data));
1181#else
1182 ret = i2c_read(chip, 0, 1, data, sizeof(data));
1183#endif
1184 if (ret) {
4b9206ed 1185 puts ("No SDRAM Serial Presence Detect found.\n");
81a8824f
WD
1186 return 1;
1187 }
1188
1189 cksum = 0;
1190 for (j = 0; j < 63; j++) {
1191 cksum += data[j];
1192 }
e857a5bd 1193 if (cksum != data[63]) {
81a8824f 1194 printf ("WARNING: Configuration data checksum failure:\n"
632de067 1195 " is 0x%02x, calculated 0x%02x\n", data[63], cksum);
81a8824f 1196 }
632de067 1197 printf ("SPD data revision %d.%d\n",
81a8824f 1198 (data[62] >> 4) & 0x0F, data[62] & 0x0F);
632de067
LJ
1199 printf ("Bytes used 0x%02X\n", data[0]);
1200 printf ("Serial memory size 0x%02X\n", 1 << data[1]);
1201
4b9206ed 1202 puts ("Memory type ");
632de067 1203 switch (data[2]) {
0df6b844
LJ
1204 case 2:
1205 type = EDO;
1206 puts ("EDO\n");
1207 break;
1208 case 4:
1209 type = SDRAM;
1210 puts ("SDRAM\n");
1211 break;
18c4e7f7
MS
1212 case 7:
1213 type = DDR;
1214 puts("DDR\n");
1215 break;
0df6b844
LJ
1216 case 8:
1217 type = DDR2;
1218 puts ("DDR2\n");
1219 break;
18c4e7f7
MS
1220 case 11:
1221 type = DDR3;
1222 puts("DDR3\n");
1223 break;
1224 case 12:
1225 type = DDR4;
1226 puts("DDR4\n");
1227 break;
0df6b844
LJ
1228 default:
1229 type = unknown;
1230 puts ("unknown\n");
1231 break;
81a8824f 1232 }
632de067 1233
4b9206ed 1234 puts ("Row address bits ");
e857a5bd 1235 if ((data[3] & 0x00F0) == 0)
632de067 1236 printf ("%d\n", data[3] & 0x0F);
e857a5bd 1237 else
632de067
LJ
1238 printf ("%d/%d\n", data[3] & 0x0F, (data[3] >> 4) & 0x0F);
1239
4b9206ed 1240 puts ("Column address bits ");
e857a5bd 1241 if ((data[4] & 0x00F0) == 0)
632de067 1242 printf ("%d\n", data[4] & 0x0F);
e857a5bd 1243 else
632de067 1244 printf ("%d/%d\n", data[4] & 0x0F, (data[4] >> 4) & 0x0F);
0df6b844
LJ
1245
1246 switch (type) {
1247 case DDR2:
632de067
LJ
1248 printf ("Number of ranks %d\n",
1249 (data[5] & 0x07) + 1);
0df6b844
LJ
1250 break;
1251 default:
632de067 1252 printf ("Module rows %d\n", data[5]);
0df6b844
LJ
1253 break;
1254 }
1255
1256 switch (type) {
1257 case DDR2:
632de067 1258 printf ("Module data width %d bits\n", data[6]);
0df6b844
LJ
1259 break;
1260 default:
632de067
LJ
1261 printf ("Module data width %d bits\n",
1262 (data[7] << 8) | data[6]);
0df6b844
LJ
1263 break;
1264 }
1265
4b9206ed 1266 puts ("Interface signal levels ");
81a8824f 1267 switch(data[8]) {
0df6b844 1268 case 0: puts ("TTL 5.0 V\n"); break;
4b9206ed 1269 case 1: puts ("LVTTL\n"); break;
0df6b844
LJ
1270 case 2: puts ("HSTL 1.5 V\n"); break;
1271 case 3: puts ("SSTL 3.3 V\n"); break;
1272 case 4: puts ("SSTL 2.5 V\n"); break;
1273 case 5: puts ("SSTL 1.8 V\n"); break;
4b9206ed 1274 default: puts ("unknown\n"); break;
81a8824f 1275 }
0df6b844
LJ
1276
1277 switch (type) {
1278 case DDR2:
632de067
LJ
1279 printf ("SDRAM cycle time ");
1280 print_ddr2_tcyc (data[9]);
0df6b844
LJ
1281 break;
1282 default:
632de067
LJ
1283 printf ("SDRAM cycle time %d.%d ns\n",
1284 (data[9] >> 4) & 0x0F, data[9] & 0x0F);
0df6b844
LJ
1285 break;
1286 }
1287
1288 switch (type) {
1289 case DDR2:
632de067
LJ
1290 printf ("SDRAM access time 0.%d%d ns\n",
1291 (data[10] >> 4) & 0x0F, data[10] & 0x0F);
0df6b844
LJ
1292 break;
1293 default:
632de067
LJ
1294 printf ("SDRAM access time %d.%d ns\n",
1295 (data[10] >> 4) & 0x0F, data[10] & 0x0F);
0df6b844
LJ
1296 break;
1297 }
1298
4b9206ed 1299 puts ("EDC configuration ");
632de067 1300 switch (data[11]) {
4b9206ed
WD
1301 case 0: puts ("None\n"); break;
1302 case 1: puts ("Parity\n"); break;
1303 case 2: puts ("ECC\n"); break;
1304 default: puts ("unknown\n"); break;
81a8824f 1305 }
632de067 1306
e857a5bd 1307 if ((data[12] & 0x80) == 0)
4b9206ed 1308 puts ("No self refresh, rate ");
e857a5bd 1309 else
4b9206ed 1310 puts ("Self refresh, rate ");
632de067 1311
81a8824f 1312 switch(data[12] & 0x7F) {
632de067
LJ
1313 case 0: puts ("15.625 us\n"); break;
1314 case 1: puts ("3.9 us\n"); break;
1315 case 2: puts ("7.8 us\n"); break;
1316 case 3: puts ("31.3 us\n"); break;
1317 case 4: puts ("62.5 us\n"); break;
1318 case 5: puts ("125 us\n"); break;
4b9206ed 1319 default: puts ("unknown\n"); break;
81a8824f 1320 }
0df6b844
LJ
1321
1322 switch (type) {
1323 case DDR2:
632de067 1324 printf ("SDRAM width (primary) %d\n", data[13]);
0df6b844
LJ
1325 break;
1326 default:
632de067 1327 printf ("SDRAM width (primary) %d\n", data[13] & 0x7F);
0df6b844 1328 if ((data[13] & 0x80) != 0) {
632de067
LJ
1329 printf (" (second bank) %d\n",
1330 2 * (data[13] & 0x7F));
0df6b844
LJ
1331 }
1332 break;
1333 }
1334
1335 switch (type) {
1336 case DDR2:
1337 if (data[14] != 0)
632de067 1338 printf ("EDC width %d\n", data[14]);
0df6b844
LJ
1339 break;
1340 default:
1341 if (data[14] != 0) {
632de067
LJ
1342 printf ("EDC width %d\n",
1343 data[14] & 0x7F);
0df6b844
LJ
1344
1345 if ((data[14] & 0x80) != 0) {
632de067
LJ
1346 printf (" (second bank) %d\n",
1347 2 * (data[14] & 0x7F));
0df6b844
LJ
1348 }
1349 }
1350 break;
81a8824f 1351 }
0df6b844 1352
632de067
LJ
1353 if (DDR2 != type) {
1354 printf ("Min clock delay, back-to-back random column addresses "
1355 "%d\n", data[15]);
0df6b844
LJ
1356 }
1357
4b9206ed
WD
1358 puts ("Burst length(s) ");
1359 if (data[16] & 0x80) puts (" Page");
1360 if (data[16] & 0x08) puts (" 8");
1361 if (data[16] & 0x04) puts (" 4");
1362 if (data[16] & 0x02) puts (" 2");
1363 if (data[16] & 0x01) puts (" 1");
1364 putc ('\n');
632de067 1365 printf ("Number of banks %d\n", data[17]);
0df6b844
LJ
1366
1367 switch (type) {
1368 case DDR2:
1369 puts ("CAS latency(s) ");
632de067 1370 decode_bits (data[18], decode_CAS_DDR2, 0);
0df6b844
LJ
1371 putc ('\n');
1372 break;
1373 default:
1374 puts ("CAS latency(s) ");
632de067 1375 decode_bits (data[18], decode_CAS_default, 0);
0df6b844
LJ
1376 putc ('\n');
1377 break;
1378 }
1379
1380 if (DDR2 != type) {
1381 puts ("CS latency(s) ");
632de067 1382 decode_bits (data[19], decode_CS_WE_default, 0);
0df6b844
LJ
1383 putc ('\n');
1384 }
1385
1386 if (DDR2 != type) {
1387 puts ("WE latency(s) ");
632de067 1388 decode_bits (data[20], decode_CS_WE_default, 0);
0df6b844
LJ
1389 putc ('\n');
1390 }
1391
1392 switch (type) {
1393 case DDR2:
1394 puts ("Module attributes:\n");
1395 if (data[21] & 0x80)
1396 puts (" TBD (bit 7)\n");
1397 if (data[21] & 0x40)
1398 puts (" Analysis probe installed\n");
1399 if (data[21] & 0x20)
1400 puts (" TBD (bit 5)\n");
1401 if (data[21] & 0x10)
1402 puts (" FET switch external enable\n");
632de067 1403 printf (" %d PLLs on DIMM\n", (data[21] >> 2) & 0x03);
0df6b844 1404 if (data[20] & 0x11) {
632de067
LJ
1405 printf (" %d active registers on DIMM\n",
1406 (data[21] & 0x03) + 1);
0df6b844
LJ
1407 }
1408 break;
1409 default:
1410 puts ("Module attributes:\n");
1411 if (!data[21])
1412 puts (" (none)\n");
632de067
LJ
1413 else
1414 decode_bits (data[21], decode_byte21_default, 0);
0df6b844
LJ
1415 break;
1416 }
1417
1418 switch (type) {
1419 case DDR2:
632de067 1420 decode_bits (data[22], decode_byte22_DDR2, 0);
0df6b844
LJ
1421 break;
1422 default:
1423 puts ("Device attributes:\n");
1424 if (data[22] & 0x80) puts (" TBD (bit 7)\n");
1425 if (data[22] & 0x40) puts (" TBD (bit 6)\n");
1426 if (data[22] & 0x20) puts (" Upper Vcc tolerance 5%\n");
1427 else puts (" Upper Vcc tolerance 10%\n");
1428 if (data[22] & 0x10) puts (" Lower Vcc tolerance 5%\n");
1429 else puts (" Lower Vcc tolerance 10%\n");
1430 if (data[22] & 0x08) puts (" Supports write1/read burst\n");
1431 if (data[22] & 0x04) puts (" Supports precharge all\n");
1432 if (data[22] & 0x02) puts (" Supports auto precharge\n");
1433 if (data[22] & 0x01) puts (" Supports early RAS# precharge\n");
1434 break;
1435 }
1436
1437 switch (type) {
1438 case DDR2:
632de067
LJ
1439 printf ("SDRAM cycle time (2nd highest CAS latency) ");
1440 print_ddr2_tcyc (data[23]);
0df6b844
LJ
1441 break;
1442 default:
632de067
LJ
1443 printf ("SDRAM cycle time (2nd highest CAS latency) %d."
1444 "%d ns\n", (data[23] >> 4) & 0x0F, data[23] & 0x0F);
0df6b844
LJ
1445 break;
1446 }
1447
1448 switch (type) {
1449 case DDR2:
632de067
LJ
1450 printf ("SDRAM access from clock (2nd highest CAS latency) 0."
1451 "%d%d ns\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F);
0df6b844
LJ
1452 break;
1453 default:
632de067
LJ
1454 printf ("SDRAM access from clock (2nd highest CAS latency) %d."
1455 "%d ns\n", (data[24] >> 4) & 0x0F, data[24] & 0x0F);
0df6b844
LJ
1456 break;
1457 }
1458
1459 switch (type) {
1460 case DDR2:
632de067
LJ
1461 printf ("SDRAM cycle time (3rd highest CAS latency) ");
1462 print_ddr2_tcyc (data[25]);
0df6b844
LJ
1463 break;
1464 default:
632de067
LJ
1465 printf ("SDRAM cycle time (3rd highest CAS latency) %d."
1466 "%d ns\n", (data[25] >> 4) & 0x0F, data[25] & 0x0F);
0df6b844
LJ
1467 break;
1468 }
1469
1470 switch (type) {
1471 case DDR2:
632de067
LJ
1472 printf ("SDRAM access from clock (3rd highest CAS latency) 0."
1473 "%d%d ns\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F);
0df6b844
LJ
1474 break;
1475 default:
632de067
LJ
1476 printf ("SDRAM access from clock (3rd highest CAS latency) %d."
1477 "%d ns\n", (data[26] >> 4) & 0x0F, data[26] & 0x0F);
0df6b844
LJ
1478 break;
1479 }
1480
1481 switch (type) {
1482 case DDR2:
632de067
LJ
1483 printf ("Minimum row precharge %d.%02d ns\n",
1484 (data[27] >> 2) & 0x3F, 25 * (data[27] & 0x03));
0df6b844
LJ
1485 break;
1486 default:
632de067 1487 printf ("Minimum row precharge %d ns\n", data[27]);
0df6b844
LJ
1488 break;
1489 }
1490
1491 switch (type) {
1492 case DDR2:
632de067
LJ
1493 printf ("Row active to row active min %d.%02d ns\n",
1494 (data[28] >> 2) & 0x3F, 25 * (data[28] & 0x03));
0df6b844
LJ
1495 break;
1496 default:
632de067 1497 printf ("Row active to row active min %d ns\n", data[28]);
0df6b844
LJ
1498 break;
1499 }
1500
1501 switch (type) {
1502 case DDR2:
632de067
LJ
1503 printf ("RAS to CAS delay min %d.%02d ns\n",
1504 (data[29] >> 2) & 0x3F, 25 * (data[29] & 0x03));
0df6b844
LJ
1505 break;
1506 default:
632de067 1507 printf ("RAS to CAS delay min %d ns\n", data[29]);
0df6b844
LJ
1508 break;
1509 }
1510
632de067 1511 printf ("Minimum RAS pulse width %d ns\n", data[30]);
0df6b844
LJ
1512
1513 switch (type) {
1514 case DDR2:
632de067
LJ
1515 puts ("Density of each row ");
1516 decode_bits (data[31], decode_row_density_DDR2, 1);
1517 putc ('\n');
0df6b844
LJ
1518 break;
1519 default:
632de067
LJ
1520 puts ("Density of each row ");
1521 decode_bits (data[31], decode_row_density_default, 1);
1522 putc ('\n');
0df6b844
LJ
1523 break;
1524 }
1525
1526 switch (type) {
1527 case DDR2:
632de067 1528 puts ("Command and Address setup ");
0df6b844 1529 if (data[32] >= 0xA0) {
632de067
LJ
1530 printf ("1.%d%d ns\n",
1531 ((data[32] >> 4) & 0x0F) - 10, data[32] & 0x0F);
0df6b844 1532 } else {
632de067
LJ
1533 printf ("0.%d%d ns\n",
1534 ((data[32] >> 4) & 0x0F), data[32] & 0x0F);
0df6b844
LJ
1535 }
1536 break;
1537 default:
632de067
LJ
1538 printf ("Command and Address setup %c%d.%d ns\n",
1539 (data[32] & 0x80) ? '-' : '+',
1540 (data[32] >> 4) & 0x07, data[32] & 0x0F);
0df6b844
LJ
1541 break;
1542 }
1543
1544 switch (type) {
1545 case DDR2:
632de067 1546 puts ("Command and Address hold ");
0df6b844 1547 if (data[33] >= 0xA0) {
632de067
LJ
1548 printf ("1.%d%d ns\n",
1549 ((data[33] >> 4) & 0x0F) - 10, data[33] & 0x0F);
0df6b844 1550 } else {
632de067
LJ
1551 printf ("0.%d%d ns\n",
1552 ((data[33] >> 4) & 0x0F), data[33] & 0x0F);
0df6b844
LJ
1553 }
1554 break;
1555 default:
632de067
LJ
1556 printf ("Command and Address hold %c%d.%d ns\n",
1557 (data[33] & 0x80) ? '-' : '+',
1558 (data[33] >> 4) & 0x07, data[33] & 0x0F);
0df6b844
LJ
1559 break;
1560 }
1561
1562 switch (type) {
1563 case DDR2:
632de067
LJ
1564 printf ("Data signal input setup 0.%d%d ns\n",
1565 (data[34] >> 4) & 0x0F, data[34] & 0x0F);
0df6b844
LJ
1566 break;
1567 default:
632de067
LJ
1568 printf ("Data signal input setup %c%d.%d ns\n",
1569 (data[34] & 0x80) ? '-' : '+',
1570 (data[34] >> 4) & 0x07, data[34] & 0x0F);
0df6b844
LJ
1571 break;
1572 }
1573
1574 switch (type) {
1575 case DDR2:
632de067
LJ
1576 printf ("Data signal input hold 0.%d%d ns\n",
1577 (data[35] >> 4) & 0x0F, data[35] & 0x0F);
0df6b844
LJ
1578 break;
1579 default:
632de067
LJ
1580 printf ("Data signal input hold %c%d.%d ns\n",
1581 (data[35] & 0x80) ? '-' : '+',
1582 (data[35] >> 4) & 0x07, data[35] & 0x0F);
0df6b844
LJ
1583 break;
1584 }
1585
4b9206ed 1586 puts ("Manufacturer's JEDEC ID ");
e857a5bd 1587 for (j = 64; j <= 71; j++)
632de067 1588 printf ("%02X ", data[j]);
4b9206ed 1589 putc ('\n');
632de067 1590 printf ("Manufacturing Location %02X\n", data[72]);
4b9206ed 1591 puts ("Manufacturer's Part Number ");
e857a5bd 1592 for (j = 73; j <= 90; j++)
632de067 1593 printf ("%02X ", data[j]);
4b9206ed 1594 putc ('\n');
632de067
LJ
1595 printf ("Revision Code %02X %02X\n", data[91], data[92]);
1596 printf ("Manufacturing Date %02X %02X\n", data[93], data[94]);
4b9206ed 1597 puts ("Assembly Serial Number ");
e857a5bd 1598 for (j = 95; j <= 98; j++)
632de067 1599 printf ("%02X ", data[j]);
4b9206ed 1600 putc ('\n');
81a8824f 1601
0df6b844 1602 if (DDR2 != type) {
632de067
LJ
1603 printf ("Speed rating PC%d\n",
1604 data[126] == 0x66 ? 66 : data[126]);
0df6b844 1605 }
81a8824f
WD
1606 return 0;
1607}
90253178 1608#endif
81a8824f 1609
735987c5
TWHT
1610/*
1611 * Syntax:
1612 * i2c edid {i2c_chip}
1613 */
1614#if defined(CONFIG_I2C_EDID)
09140113 1615int do_edid(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
735987c5 1616{
5468461d 1617 uint chip;
735987c5 1618 struct edid1_info edid;
63656b76 1619 int ret;
2147a169 1620#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
1621 struct udevice *dev;
1622#endif
735987c5
TWHT
1623
1624 if (argc < 2) {
1625 cmd_usage(cmdtp);
1626 return 1;
1627 }
1628
7e5f460e 1629 chip = hextoul(argv[1], NULL);
2147a169 1630#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
1631 ret = i2c_get_cur_bus_chip(chip, &dev);
1632 if (!ret)
f9a4c2da 1633 ret = dm_i2c_read(dev, 0, (uchar *)&edid, sizeof(edid));
63656b76
SG
1634#else
1635 ret = i2c_read(chip, 0, 1, (uchar *)&edid, sizeof(edid));
1636#endif
1637 if (ret)
1638 return i2c_report_err(ret, I2C_ERR_READ);
735987c5
TWHT
1639
1640 if (edid_check_info(&edid)) {
1641 puts("Content isn't valid EDID.\n");
1642 return 1;
1643 }
1644
1645 edid_print_info(&edid);
1646 return 0;
1647
1648}
1649#endif /* CONFIG_I2C_EDID */
1650
2147a169 1651#if CONFIG_IS_ENABLED(DM_I2C)
59aa9df3
SG
1652static void show_bus(struct udevice *bus)
1653{
1654 struct udevice *dev;
1655
36c03d18 1656 printf("Bus %d:\t%s", dev_seq(bus), bus->name);
59aa9df3 1657 if (device_active(bus))
8b85dfc6 1658 printf(" (active %d)", dev_seq(bus));
59aa9df3
SG
1659 printf("\n");
1660 for (device_find_first_child(bus, &dev);
1661 dev;
1662 device_find_next_child(&dev)) {
caa4daa2 1663 struct dm_i2c_chip *chip = dev_get_parent_plat(dev);
59aa9df3
SG
1664
1665 printf(" %02x: %s, offset len %x, flags %x\n",
1666 chip->chip_addr, dev->name, chip->offset_len,
1667 chip->flags);
1668 }
1669}
1670#endif
1671
06afa388 1672/**
3f4978c7 1673 * do_i2c_show_bus() - Handle the "i2c bus" command-line command
06afa388
MV
1674 * @cmdtp: Command data struct pointer
1675 * @flag: Command flag
1676 * @argc: Command-line argument count
1677 * @argv: Array of command-line arguments
1678 *
1679 * Returns zero always.
1680 */
55dabcc8 1681#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) || CONFIG_IS_ENABLED(DM_I2C)
09140113
SG
1682static int do_i2c_show_bus(struct cmd_tbl *cmdtp, int flag, int argc,
1683 char *const argv[])
67b23a32 1684{
67b23a32
HS
1685 if (argc == 1) {
1686 /* show all busses */
2147a169 1687#if CONFIG_IS_ENABLED(DM_I2C)
59aa9df3
SG
1688 struct udevice *bus;
1689 struct uclass *uc;
1690 int ret;
1691
1692 ret = uclass_get(UCLASS_I2C, &uc);
1693 if (ret)
1694 return CMD_RET_FAILURE;
1695 uclass_foreach_dev(bus, uc)
1696 show_bus(bus);
1697#else
1698 int i;
1699
3f4978c7
HS
1700 for (i = 0; i < CONFIG_SYS_NUM_I2C_BUSES; i++) {
1701 printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name);
1702#ifndef CONFIG_SYS_I2C_DIRECT_BUS
59aa9df3
SG
1703 int j;
1704
3f4978c7
HS
1705 for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) {
1706 if (i2c_bus[i].next_hop[j].chip == 0)
1707 break;
1708 printf("->%s@0x%2x:%d",
1709 i2c_bus[i].next_hop[j].mux.name,
1710 i2c_bus[i].next_hop[j].chip,
1711 i2c_bus[i].next_hop[j].channel);
67b23a32 1712 }
3f4978c7
HS
1713#endif
1714 printf("\n");
67b23a32 1715 }
59aa9df3 1716#endif
67b23a32 1717 } else {
59aa9df3
SG
1718 int i;
1719
3f4978c7 1720 /* show specific bus */
0b1284eb 1721 i = dectoul(argv[1], NULL);
2147a169 1722#if CONFIG_IS_ENABLED(DM_I2C)
59aa9df3
SG
1723 struct udevice *bus;
1724 int ret;
1725
1726 ret = uclass_get_device_by_seq(UCLASS_I2C, i, &bus);
1727 if (ret) {
1728 printf("Invalid bus %d: err=%d\n", i, ret);
1729 return CMD_RET_FAILURE;
1730 }
1731 show_bus(bus);
1732#else
3f4978c7
HS
1733 if (i >= CONFIG_SYS_NUM_I2C_BUSES) {
1734 printf("Invalid bus %d\n", i);
1735 return -1;
1736 }
1737 printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name);
1738#ifndef CONFIG_SYS_I2C_DIRECT_BUS
59aa9df3 1739 int j;
3f4978c7
HS
1740 for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) {
1741 if (i2c_bus[i].next_hop[j].chip == 0)
1742 break;
1743 printf("->%s@0x%2x:%d",
1744 i2c_bus[i].next_hop[j].mux.name,
1745 i2c_bus[i].next_hop[j].chip,
1746 i2c_bus[i].next_hop[j].channel);
1747 }
1748#endif
1749 printf("\n");
59aa9df3 1750#endif
67b23a32 1751 }
3f4978c7
HS
1752
1753 return 0;
67b23a32 1754}
3f4978c7 1755#endif
67b23a32 1756
06afa388
MV
1757/**
1758 * do_i2c_bus_num() - Handle the "i2c dev" command-line command
1759 * @cmdtp: Command data struct pointer
1760 * @flag: Command flag
1761 * @argc: Command-line argument count
1762 * @argv: Array of command-line arguments
1763 *
1764 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
1765 * on error.
1766 */
55dabcc8 1767#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) || defined(CONFIG_I2C_MULTI_BUS) || \
2147a169 1768 CONFIG_IS_ENABLED(DM_I2C)
09140113
SG
1769static int do_i2c_bus_num(struct cmd_tbl *cmdtp, int flag, int argc,
1770 char *const argv[])
bb99ad6d 1771{
3f4978c7 1772 int ret = 0;
63656b76 1773 int bus_no;
bb99ad6d 1774
63656b76 1775 if (argc == 1) {
e857a5bd 1776 /* querying current setting */
2147a169 1777#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
1778 struct udevice *bus;
1779
1780 if (!i2c_get_cur_bus(&bus))
8b85dfc6 1781 bus_no = dev_seq(bus);
63656b76
SG
1782 else
1783 bus_no = -1;
1784#else
1785 bus_no = i2c_get_bus_num();
1786#endif
1787 printf("Current bus is %d\n", bus_no);
1788 } else {
0b1284eb 1789 bus_no = dectoul(argv[1], NULL);
55dabcc8 1790#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY)
3f4978c7
HS
1791 if (bus_no >= CONFIG_SYS_NUM_I2C_BUSES) {
1792 printf("Invalid bus %d\n", bus_no);
1793 return -1;
1794 }
880a4127 1795#endif
3f4978c7 1796 printf("Setting bus to %d\n", bus_no);
2147a169 1797#if CONFIG_IS_ENABLED(DM_I2C)
f9a4c2da
SG
1798 ret = cmd_i2c_set_bus_num(bus_no);
1799#else
3f4978c7 1800 ret = i2c_set_bus_num(bus_no);
f9a4c2da 1801#endif
e857a5bd 1802 if (ret)
bb99ad6d 1803 printf("Failure changing bus number (%d)\n", ret);
bb99ad6d 1804 }
4fbd258e
SG
1805
1806 return ret ? CMD_RET_FAILURE : 0;
bb99ad6d 1807}
55dabcc8 1808#endif /* CONFIG_IS_ENABLED(SYS_I2C_LEGACY) */
bb99ad6d 1809
06afa388
MV
1810/**
1811 * do_i2c_bus_speed() - Handle the "i2c speed" command-line command
1812 * @cmdtp: Command data struct pointer
1813 * @flag: Command flag
1814 * @argc: Command-line argument count
1815 * @argv: Array of command-line arguments
1816 *
1817 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
1818 * on error.
1819 */
09140113
SG
1820static int do_i2c_bus_speed(struct cmd_tbl *cmdtp, int flag, int argc,
1821 char *const argv[])
bb99ad6d
BW
1822{
1823 int speed, ret=0;
1824
2147a169 1825#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
1826 struct udevice *bus;
1827
1828 if (i2c_get_cur_bus(&bus))
1829 return 1;
1830#endif
1831 if (argc == 1) {
2147a169 1832#if CONFIG_IS_ENABLED(DM_I2C)
ca88b9b9 1833 speed = dm_i2c_get_bus_speed(bus);
63656b76
SG
1834#else
1835 speed = i2c_get_bus_speed();
1836#endif
e857a5bd 1837 /* querying current speed */
63656b76
SG
1838 printf("Current bus speed=%d\n", speed);
1839 } else {
0b1284eb 1840 speed = dectoul(argv[1], NULL);
bb99ad6d 1841 printf("Setting bus speed to %d Hz\n", speed);
2147a169 1842#if CONFIG_IS_ENABLED(DM_I2C)
ca88b9b9 1843 ret = dm_i2c_set_bus_speed(bus, speed);
63656b76 1844#else
bb99ad6d 1845 ret = i2c_set_bus_speed(speed);
63656b76 1846#endif
e857a5bd 1847 if (ret)
bb99ad6d 1848 printf("Failure changing bus speed (%d)\n", ret);
bb99ad6d 1849 }
4fbd258e
SG
1850
1851 return ret ? CMD_RET_FAILURE : 0;
bb99ad6d
BW
1852}
1853
06afa388
MV
1854/**
1855 * do_i2c_mm() - Handle the "i2c mm" command-line command
1856 * @cmdtp: Command data struct pointer
1857 * @flag: Command flag
1858 * @argc: Command-line argument count
1859 * @argv: Array of command-line arguments
1860 *
1861 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
1862 * on error.
1863 */
09140113
SG
1864static int do_i2c_mm(struct cmd_tbl *cmdtp, int flag, int argc,
1865 char *const argv[])
bb99ad6d 1866{
bfc3b77e
FM
1867 return mod_i2c_mem (cmdtp, 1, flag, argc, argv);
1868}
1869
06afa388
MV
1870/**
1871 * do_i2c_nm() - Handle the "i2c nm" command-line command
1872 * @cmdtp: Command data struct pointer
1873 * @flag: Command flag
1874 * @argc: Command-line argument count
1875 * @argv: Array of command-line arguments
1876 *
1877 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
1878 * on error.
1879 */
09140113
SG
1880static int do_i2c_nm(struct cmd_tbl *cmdtp, int flag, int argc,
1881 char *const argv[])
bfc3b77e
FM
1882{
1883 return mod_i2c_mem (cmdtp, 0, flag, argc, argv);
1884}
e96ad5d3 1885
06afa388
MV
1886/**
1887 * do_i2c_reset() - Handle the "i2c reset" command-line command
1888 * @cmdtp: Command data struct pointer
1889 * @flag: Command flag
1890 * @argc: Command-line argument count
1891 * @argv: Array of command-line arguments
1892 *
1893 * Returns zero always.
1894 */
09140113
SG
1895static int do_i2c_reset(struct cmd_tbl *cmdtp, int flag, int argc,
1896 char *const argv[])
bfc3b77e 1897{
2147a169 1898#if CONFIG_IS_ENABLED(DM_I2C)
63656b76
SG
1899 struct udevice *bus;
1900
1901 if (i2c_get_cur_bus(&bus))
1902 return CMD_RET_FAILURE;
1903 if (i2c_deblock(bus)) {
1904 printf("Error: Not supported by the driver\n");
1905 return CMD_RET_FAILURE;
1906 }
55dabcc8 1907#elif CONFIG_IS_ENABLED(SYS_I2C_LEGACY)
3f4978c7 1908 i2c_init(I2C_ADAP->speed, I2C_ADAP->slaveaddr);
3f4978c7 1909#endif
bfc3b77e
FM
1910 return 0;
1911}
1912
09140113 1913static struct cmd_tbl cmd_i2c_sub[] = {
55dabcc8 1914#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) || CONFIG_IS_ENABLED(DM_I2C)
3f4978c7 1915 U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_show_bus, "", ""),
9a2accb4 1916#endif
bfc3b77e 1917 U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""),
55dabcc8 1918#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) || \
2147a169 1919 defined(CONFIG_I2C_MULTI_BUS) || CONFIG_IS_ENABLED(DM_I2C)
bfc3b77e 1920 U_BOOT_CMD_MKENT(dev, 1, 1, do_i2c_bus_num, "", ""),
bb99ad6d 1921#endif /* CONFIG_I2C_MULTI_BUS */
735987c5
TWHT
1922#if defined(CONFIG_I2C_EDID)
1923 U_BOOT_CMD_MKENT(edid, 1, 1, do_edid, "", ""),
1924#endif /* CONFIG_I2C_EDID */
bfc3b77e
FM
1925 U_BOOT_CMD_MKENT(loop, 3, 1, do_i2c_loop, "", ""),
1926 U_BOOT_CMD_MKENT(md, 3, 1, do_i2c_md, "", ""),
1927 U_BOOT_CMD_MKENT(mm, 2, 1, do_i2c_mm, "", ""),
1928 U_BOOT_CMD_MKENT(mw, 3, 1, do_i2c_mw, "", ""),
1929 U_BOOT_CMD_MKENT(nm, 2, 1, do_i2c_nm, "", ""),
1930 U_BOOT_CMD_MKENT(probe, 0, 1, do_i2c_probe, "", ""),
652e5354 1931 U_BOOT_CMD_MKENT(read, 5, 1, do_i2c_read, "", ""),
ed16f146 1932 U_BOOT_CMD_MKENT(write, 6, 0, do_i2c_write, "", ""),
2147a169 1933#if CONFIG_IS_ENABLED(DM_I2C)
63656b76 1934 U_BOOT_CMD_MKENT(flags, 2, 1, do_i2c_flags, "", ""),
c10c8e31 1935 U_BOOT_CMD_MKENT(olen, 2, 1, do_i2c_olen, "", ""),
63656b76 1936#endif
bfc3b77e 1937 U_BOOT_CMD_MKENT(reset, 0, 1, do_i2c_reset, "", ""),
c76fe474 1938#if defined(CONFIG_CMD_SDRAM)
bfc3b77e 1939 U_BOOT_CMD_MKENT(sdram, 1, 1, do_sdram, "", ""),
90253178 1940#endif
bfc3b77e
FM
1941 U_BOOT_CMD_MKENT(speed, 1, 1, do_i2c_bus_speed, "", ""),
1942};
1943
e4099c8b
MS
1944static __maybe_unused void i2c_reloc(void)
1945{
1946 static int relocated;
1947
1948 if (!relocated) {
1949 fixup_cmdtable(cmd_i2c_sub, ARRAY_SIZE(cmd_i2c_sub));
1950 relocated = 1;
1951 };
f1d2b313 1952}
f1d2b313 1953
06afa388
MV
1954/**
1955 * do_i2c() - Handle the "i2c" command-line command
1956 * @cmdtp: Command data struct pointer
1957 * @flag: Command flag
1958 * @argc: Command-line argument count
1959 * @argv: Array of command-line arguments
1960 *
1961 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
1962 * on error.
1963 */
09140113 1964static int do_i2c(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
bfc3b77e 1965{
09140113 1966 struct cmd_tbl *c;
bfc3b77e 1967
e4099c8b
MS
1968#ifdef CONFIG_NEEDS_MANUAL_RELOC
1969 i2c_reloc();
1970#endif
1971
4444b221 1972 if (argc < 2)
4c12eeb8 1973 return CMD_RET_USAGE;
4444b221 1974
bfc3b77e
FM
1975 /* Strip off leading 'i2c' command argument */
1976 argc--;
1977 argv++;
1978
1979 c = find_cmd_tbl(argv[0], &cmd_i2c_sub[0], ARRAY_SIZE(cmd_i2c_sub));
1980
47e26b1b 1981 if (c)
4c12eeb8 1982 return c->cmd(cmdtp, flag, argc, argv);
47e26b1b 1983 else
4c12eeb8 1984 return CMD_RET_USAGE;
bb99ad6d 1985}
8bde7f77
WD
1986
1987/***************************************************/
088f1b19
KP
1988#ifdef CONFIG_SYS_LONGHELP
1989static char i2c_help_text[] =
55dabcc8 1990#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) || CONFIG_IS_ENABLED(DM_I2C)
3f4978c7 1991 "bus [muxtype:muxaddr:muxchannel] - show I2C bus info\n"
19f8c4df 1992 "i2c " /* That's the prefix for the crc32 command below. */
9a2accb4 1993#endif
fb0070e9 1994 "crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n"
55dabcc8 1995#if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) || \
2147a169 1996 defined(CONFIG_I2C_MULTI_BUS) || CONFIG_IS_ENABLED(DM_I2C)
9bc2e4ee 1997 "i2c dev [dev] - show or set current I2C bus\n"
d9fc7032 1998#endif /* CONFIG_I2C_MULTI_BUS */
735987c5
TWHT
1999#if defined(CONFIG_I2C_EDID)
2000 "i2c edid chip - print EDID configuration information\n"
2001#endif /* CONFIG_I2C_EDID */
fb0070e9 2002 "i2c loop chip address[.0, .1, .2] [# of objects] - looping read of device\n"
d9fc7032
MF
2003 "i2c md chip address[.0, .1, .2] [# of objects] - read from I2C device\n"
2004 "i2c mm chip address[.0, .1, .2] - write to I2C device (auto-incrementing)\n"
2005 "i2c mw chip address[.0, .1, .2] value [count] - write to I2C device (fill)\n"
2006 "i2c nm chip address[.0, .1, .2] - write to I2C device (constant address)\n"
54b99e51 2007 "i2c probe [address] - test for and show device(s) on the I2C bus\n"
63656b76 2008 "i2c read chip address[.0, .1, .2] length memaddress - read to memory\n"
ed16f146
LP
2009 "i2c write memaddress chip address[.0, .1, .2] length [-s] - write memory\n"
2010 " to I2C; the -s option selects bulk write in a single transaction\n"
2147a169 2011#if CONFIG_IS_ENABLED(DM_I2C)
63656b76 2012 "i2c flags chip [flags] - set or get chip flags\n"
c10c8e31 2013 "i2c olen chip [offset_length] - set or get chip offset length\n"
63656b76 2014#endif
e43a27c4 2015 "i2c reset - re-init the I2C Controller\n"
c76fe474 2016#if defined(CONFIG_CMD_SDRAM)
fb0070e9 2017 "i2c sdram chip - print SDRAM configuration information\n"
90253178 2018#endif
088f1b19
KP
2019 "i2c speed [speed] - show or set I2C bus speed";
2020#endif
2021
2022U_BOOT_CMD(
ed16f146 2023 i2c, 7, 1, do_i2c,
088f1b19
KP
2024 "I2C sub-system",
2025 i2c_help_text
d9fc7032 2026);
This page took 0.848261 seconds and 4 git commands to generate.