1ad5bb451SWolfgang Denk /* 2ad5bb451SWolfgang Denk * (C) Copyright 2002 3ad5bb451SWolfgang Denk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4ad5bb451SWolfgang Denk * 5*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6ad5bb451SWolfgang Denk */ 7ad5bb451SWolfgang Denk 8ad5bb451SWolfgang Denk /* 9ad5bb451SWolfgang Denk * I2C test 10ad5bb451SWolfgang Denk * 11ad5bb451SWolfgang Denk * For verifying the I2C bus, a full I2C bus scanning is performed. 12ad5bb451SWolfgang Denk * 1360aaaa07SPeter Tyser * #ifdef CONFIG_SYS_POST_I2C_ADDRS 149d921f19SPeter Tyser * The test is considered as passed if all the devices and only the devices 159d921f19SPeter Tyser * in the list are found. 169d921f19SPeter Tyser * #ifdef CONFIG_SYS_POST_I2C_IGNORES 179d921f19SPeter Tyser * Ignore devices listed in CONFIG_SYS_POST_I2C_IGNORES. These devices 189d921f19SPeter Tyser * are optional or not vital to board functionality. 199d921f19SPeter Tyser * #endif 2060aaaa07SPeter Tyser * #else [ ! CONFIG_SYS_POST_I2C_ADDRS ] 21ad5bb451SWolfgang Denk * The test is considered as passed if any I2C device is found. 22ad5bb451SWolfgang Denk * #endif 23ad5bb451SWolfgang Denk */ 24ad5bb451SWolfgang Denk 25b9b1bc85SPeter Tyser #include <common.h> 26ad5bb451SWolfgang Denk #include <post.h> 27ad5bb451SWolfgang Denk #include <i2c.h> 28ad5bb451SWolfgang Denk 296d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if CONFIG_POST & CONFIG_SYS_POST_I2C 30ad5bb451SWolfgang Denk i2c_ignore_device(unsigned int chip)319d921f19SPeter Tyserstatic int i2c_ignore_device(unsigned int chip) 329d921f19SPeter Tyser { 339d921f19SPeter Tyser #ifdef CONFIG_SYS_POST_I2C_IGNORES 349d921f19SPeter Tyser const unsigned char i2c_ignore_list[] = CONFIG_SYS_POST_I2C_IGNORES; 359d921f19SPeter Tyser int i; 369d921f19SPeter Tyser 379d921f19SPeter Tyser for (i = 0; i < sizeof(i2c_ignore_list); i++) 389d921f19SPeter Tyser if (i2c_ignore_list[i] == chip) 399d921f19SPeter Tyser return 1; 409d921f19SPeter Tyser #endif 419d921f19SPeter Tyser 429d921f19SPeter Tyser return 0; 439d921f19SPeter Tyser } 449d921f19SPeter Tyser i2c_post_test(int flags)45ad5bb451SWolfgang Denkint i2c_post_test (int flags) 46ad5bb451SWolfgang Denk { 47ad5bb451SWolfgang Denk unsigned int i; 4860aaaa07SPeter Tyser #ifndef CONFIG_SYS_POST_I2C_ADDRS 499f949c9aSPeter Tyser /* Start at address 1, address 0 is the general call address */ 509b107e61SHeiko Schocher for (i = 1; i < 128; i++) { 519d921f19SPeter Tyser if (i2c_ignore_device(i)) 529d921f19SPeter Tyser continue; 53b9b1bc85SPeter Tyser if (i2c_probe (i) == 0) 54b9b1bc85SPeter Tyser return 0; 559b107e61SHeiko Schocher } 56b9b1bc85SPeter Tyser 57b9b1bc85SPeter Tyser /* No devices found */ 58b9b1bc85SPeter Tyser return -1; 59b9b1bc85SPeter Tyser #else 607e263ceaSPeter Tyser unsigned int ret = 0; 61ad5bb451SWolfgang Denk int j; 628343f8a7SWolfgang Denk unsigned char i2c_addr_list[] = CONFIG_SYS_POST_I2C_ADDRS; 63ad5bb451SWolfgang Denk 649f949c9aSPeter Tyser /* Start at address 1, address 0 is the general call address */ 659f949c9aSPeter Tyser for (i = 1; i < 128; i++) { 669d921f19SPeter Tyser if (i2c_ignore_device(i)) 679d921f19SPeter Tyser continue; 68b9b1bc85SPeter Tyser if (i2c_probe(i) != 0) 69b9b1bc85SPeter Tyser continue; 707e263ceaSPeter Tyser 71ad5bb451SWolfgang Denk for (j = 0; j < sizeof(i2c_addr_list); ++j) { 72ad5bb451SWolfgang Denk if (i == i2c_addr_list[j]) { 737e263ceaSPeter Tyser i2c_addr_list[j] = 0xff; 74ad5bb451SWolfgang Denk break; 75ad5bb451SWolfgang Denk } 76ad5bb451SWolfgang Denk } 77b9b1bc85SPeter Tyser 78ad5bb451SWolfgang Denk if (j == sizeof(i2c_addr_list)) { 797e263ceaSPeter Tyser ret = -1; 807e263ceaSPeter Tyser post_log("I2C: addr %02x not expected\n", i); 81ad5bb451SWolfgang Denk } 82ad5bb451SWolfgang Denk } 83ad5bb451SWolfgang Denk 847e263ceaSPeter Tyser for (i = 0; i < sizeof(i2c_addr_list); ++i) { 857e263ceaSPeter Tyser if (i2c_addr_list[i] == 0xff) 867e263ceaSPeter Tyser continue; 87c5528501SAnatolij Gustschin if (i2c_ignore_device(i2c_addr_list[i])) 88c5528501SAnatolij Gustschin continue; 897e263ceaSPeter Tyser post_log("I2C: addr %02x did not respond\n", i2c_addr_list[i]); 907e263ceaSPeter Tyser ret = -1; 91ad5bb451SWolfgang Denk } 927e263ceaSPeter Tyser 937e263ceaSPeter Tyser return ret; 94ad5bb451SWolfgang Denk #endif 95ad5bb451SWolfgang Denk } 96ad5bb451SWolfgang Denk 976d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_POST & CONFIG_SYS_POST_I2C */ 98