]>
Commit | Line | Data |
---|---|---|
ad5bb451 WD |
1 | /* |
2 | * (C) Copyright 2002 | |
3 | * Wolfgang Denk, DENX Software Engineering, wd@denx.de. | |
4 | * | |
1a459660 | 5 | * SPDX-License-Identifier: GPL-2.0+ |
ad5bb451 WD |
6 | */ |
7 | ||
ad5bb451 WD |
8 | /* |
9 | * I2C test | |
10 | * | |
11 | * For verifying the I2C bus, a full I2C bus scanning is performed. | |
12 | * | |
60aaaa07 | 13 | * #ifdef CONFIG_SYS_POST_I2C_ADDRS |
9d921f19 PT |
14 | * The test is considered as passed if all the devices and only the devices |
15 | * in the list are found. | |
16 | * #ifdef CONFIG_SYS_POST_I2C_IGNORES | |
17 | * Ignore devices listed in CONFIG_SYS_POST_I2C_IGNORES. These devices | |
18 | * are optional or not vital to board functionality. | |
19 | * #endif | |
60aaaa07 | 20 | * #else [ ! CONFIG_SYS_POST_I2C_ADDRS ] |
ad5bb451 WD |
21 | * The test is considered as passed if any I2C device is found. |
22 | * #endif | |
23 | */ | |
24 | ||
b9b1bc85 | 25 | #include <common.h> |
ad5bb451 WD |
26 | #include <post.h> |
27 | #include <i2c.h> | |
28 | ||
6d0f6bcf | 29 | #if CONFIG_POST & CONFIG_SYS_POST_I2C |
ad5bb451 | 30 | |
9d921f19 PT |
31 | static int i2c_ignore_device(unsigned int chip) |
32 | { | |
33 | #ifdef CONFIG_SYS_POST_I2C_IGNORES | |
34 | const unsigned char i2c_ignore_list[] = CONFIG_SYS_POST_I2C_IGNORES; | |
35 | int i; | |
36 | ||
37 | for (i = 0; i < sizeof(i2c_ignore_list); i++) | |
38 | if (i2c_ignore_list[i] == chip) | |
39 | return 1; | |
40 | #endif | |
41 | ||
42 | return 0; | |
43 | } | |
44 | ||
ad5bb451 WD |
45 | int i2c_post_test (int flags) |
46 | { | |
47 | unsigned int i; | |
60aaaa07 | 48 | #ifndef CONFIG_SYS_POST_I2C_ADDRS |
9f949c9a | 49 | /* Start at address 1, address 0 is the general call address */ |
9b107e61 | 50 | for (i = 1; i < 128; i++) { |
9d921f19 PT |
51 | if (i2c_ignore_device(i)) |
52 | continue; | |
b9b1bc85 PT |
53 | if (i2c_probe (i) == 0) |
54 | return 0; | |
9b107e61 | 55 | } |
b9b1bc85 PT |
56 | |
57 | /* No devices found */ | |
58 | return -1; | |
59 | #else | |
7e263cea | 60 | unsigned int ret = 0; |
ad5bb451 | 61 | int j; |
8343f8a7 | 62 | unsigned char i2c_addr_list[] = CONFIG_SYS_POST_I2C_ADDRS; |
ad5bb451 | 63 | |
9f949c9a PT |
64 | /* Start at address 1, address 0 is the general call address */ |
65 | for (i = 1; i < 128; i++) { | |
9d921f19 PT |
66 | if (i2c_ignore_device(i)) |
67 | continue; | |
b9b1bc85 PT |
68 | if (i2c_probe(i) != 0) |
69 | continue; | |
7e263cea | 70 | |
b9b1bc85 PT |
71 | for (j = 0; j < sizeof(i2c_addr_list); ++j) { |
72 | if (i == i2c_addr_list[j]) { | |
7e263cea | 73 | i2c_addr_list[j] = 0xff; |
b9b1bc85 | 74 | break; |
ad5bb451 | 75 | } |
b9b1bc85 PT |
76 | } |
77 | ||
78 | if (j == sizeof(i2c_addr_list)) { | |
7e263cea PT |
79 | ret = -1; |
80 | post_log("I2C: addr %02x not expected\n", i); | |
ad5bb451 WD |
81 | } |
82 | } | |
83 | ||
7e263cea PT |
84 | for (i = 0; i < sizeof(i2c_addr_list); ++i) { |
85 | if (i2c_addr_list[i] == 0xff) | |
86 | continue; | |
c5528501 AG |
87 | if (i2c_ignore_device(i2c_addr_list[i])) |
88 | continue; | |
7e263cea PT |
89 | post_log("I2C: addr %02x did not respond\n", i2c_addr_list[i]); |
90 | ret = -1; | |
ad5bb451 | 91 | } |
7e263cea PT |
92 | |
93 | return ret; | |
ad5bb451 WD |
94 | #endif |
95 | } | |
96 | ||
6d0f6bcf | 97 | #endif /* CONFIG_POST & CONFIG_SYS_POST_I2C */ |