]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - post/i2c.c
* Use 1-byte-read instead of -write for iprobe() function
[people/ms/u-boot.git] / post / i2c.c
index 2e38986662d920b465afd42a0dbac16f22319aa4..1b2e64471b30145607aed0594b8f5c1fd30f7e7e 100644 (file)
  * I2C test
  *
  * For verifying the I2C bus, a full I2C bus scanning is performed.
- * If any I2C device is found, the test is considered as passed,
- * otherwise failed.
+ *
+ * #ifdef I2C_ADDR_LIST
+ *   The test is considered as passed if all the devices and
+ *   only the devices in the list are found.
+ * #else [ ! I2C_ADDR_LIST ]
+ *   The test is considered as passed if any I2C device is found.
+ * #endif
  */
 
 #include <post.h>
 int i2c_post_test (int flags)
 {
        unsigned int i;
-       unsigned int chips = 0;
+       unsigned int good = 0;
+#ifdef I2C_ADDR_LIST
+       unsigned int bad  = 0;
+       int j;
+       unsigned char i2c_addr_list[] = I2C_ADDR_LIST;
+       unsigned char i2c_miss_list[] = I2C_ADDR_LIST;
+#endif
 
        for (i = 0; i < 128; i++) {
-               if (i2c_probe (i) == 0)
-                       chips++;
+               if (i2c_probe (i) == 0) {
+#ifndef        I2C_ADDR_LIST
+                       good++;
+#else  /* I2C_ADDR_LIST */
+                       for (j=0; j<sizeof(i2c_addr_list); ++j) {
+                               if (i == i2c_addr_list[j]) {
+                                       good++;
+                                       i2c_miss_list[j] = 0xFF;
+                                       break;
+                               }
+                       }
+                       if (j == sizeof(i2c_addr_list)) {
+                               bad++;
+                               post_log ("I2C: addr %02X not expected\n",
+                                               i);
+                       }
+#endif /* I2C_ADDR_LIST */
+               }
        }
 
-       return chips > 0 ? 0 : -1;
+#ifndef        I2C_ADDR_LIST
+       return good > 0 ? 0 : -1;
+#else  /* I2C_ADDR_LIST */
+       if (good != sizeof(i2c_addr_list)) {
+               for (j=0; j<sizeof(i2c_miss_list); ++j) {
+                       if (i2c_miss_list[j] != 0xFF) {
+                               post_log ("I2C: addr %02X did not respond\n",
+                                               i2c_miss_list[j]);
+                       }
+               }
+       }
+       return ((good == sizeof(i2c_addr_list)) && (bad == 0)) ? 0 : -1;
+#endif
 }
 
 #endif /* CONFIG_POST & CFG_POST_I2C */