core: add ofnode_get_by_phandle() api
[people/ms/u-boot.git] / post / drivers / i2c.c
1 /*
2  * (C) Copyright 2002
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 /*
9  * I2C test
10  *
11  * For verifying the I2C bus, a full I2C bus scanning is performed.
12  *
13  * #ifdef CONFIG_SYS_POST_I2C_ADDRS
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
20  * #else [ ! CONFIG_SYS_POST_I2C_ADDRS ]
21  *   The test is considered as passed if any I2C device is found.
22  * #endif
23  */
24
25 #include <common.h>
26 #include <post.h>
27 #include <i2c.h>
28
29 #if CONFIG_POST & CONFIG_SYS_POST_I2C
30
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
45 int i2c_post_test (int flags)
46 {
47         unsigned int i;
48 #ifndef CONFIG_SYS_POST_I2C_ADDRS
49         /* Start at address 1, address 0 is the general call address */
50         for (i = 1; i < 128; i++) {
51                 if (i2c_ignore_device(i))
52                         continue;
53                 if (i2c_probe (i) == 0)
54                         return 0;
55         }
56
57         /* No devices found */
58         return -1;
59 #else
60         unsigned int ret  = 0;
61         int j;
62         unsigned char i2c_addr_list[] = CONFIG_SYS_POST_I2C_ADDRS;
63
64         /* Start at address 1, address 0 is the general call address */
65         for (i = 1; i < 128; i++) {
66                 if (i2c_ignore_device(i))
67                         continue;
68                 if (i2c_probe(i) != 0)
69                         continue;
70
71                 for (j = 0; j < sizeof(i2c_addr_list); ++j) {
72                         if (i == i2c_addr_list[j]) {
73                                 i2c_addr_list[j] = 0xff;
74                                 break;
75                         }
76                 }
77
78                 if (j == sizeof(i2c_addr_list)) {
79                         ret = -1;
80                         post_log("I2C: addr %02x not expected\n", i);
81                 }
82         }
83
84         for (i = 0; i < sizeof(i2c_addr_list); ++i) {
85                 if (i2c_addr_list[i] == 0xff)
86                         continue;
87                 if (i2c_ignore_device(i2c_addr_list[i]))
88                         continue;
89                 post_log("I2C: addr %02x did not respond\n", i2c_addr_list[i]);
90                 ret = -1;
91         }
92
93         return ret;
94 #endif
95 }
96
97 #endif /* CONFIG_POST & CONFIG_SYS_POST_I2C */