1ad5bb451SWolfgang Denk /* 2ad5bb451SWolfgang Denk * (C) Copyright 2002 3ad5bb451SWolfgang Denk * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4ad5bb451SWolfgang Denk * 5ad5bb451SWolfgang Denk * See file CREDITS for list of people who contributed to this 6ad5bb451SWolfgang Denk * project. 7ad5bb451SWolfgang Denk * 8ad5bb451SWolfgang Denk * This program is free software; you can redistribute it and/or 9ad5bb451SWolfgang Denk * modify it under the terms of the GNU General Public License as 10ad5bb451SWolfgang Denk * published by the Free Software Foundation; either version 2 of 11ad5bb451SWolfgang Denk * the License, or (at your option) any later version. 12ad5bb451SWolfgang Denk * 13ad5bb451SWolfgang Denk * This program is distributed in the hope that it will be useful, 14ad5bb451SWolfgang Denk * but WITHOUT ANY WARRANTY; without even the implied warranty of 15ad5bb451SWolfgang Denk * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16ad5bb451SWolfgang Denk * GNU General Public License for more details. 17ad5bb451SWolfgang Denk * 18ad5bb451SWolfgang Denk * You should have received a copy of the GNU General Public License 19ad5bb451SWolfgang Denk * along with this program; if not, write to the Free Software 20ad5bb451SWolfgang Denk * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21ad5bb451SWolfgang Denk * MA 02111-1307 USA 22ad5bb451SWolfgang Denk */ 23ad5bb451SWolfgang Denk 24ad5bb451SWolfgang Denk /* 25ad5bb451SWolfgang Denk * I2C test 26ad5bb451SWolfgang Denk * 27ad5bb451SWolfgang Denk * For verifying the I2C bus, a full I2C bus scanning is performed. 28ad5bb451SWolfgang Denk * 2960aaaa07SPeter Tyser * #ifdef CONFIG_SYS_POST_I2C_ADDRS 30*9d921f19SPeter Tyser * The test is considered as passed if all the devices and only the devices 31*9d921f19SPeter Tyser * in the list are found. 32*9d921f19SPeter Tyser * #ifdef CONFIG_SYS_POST_I2C_IGNORES 33*9d921f19SPeter Tyser * Ignore devices listed in CONFIG_SYS_POST_I2C_IGNORES. These devices 34*9d921f19SPeter Tyser * are optional or not vital to board functionality. 35*9d921f19SPeter Tyser * #endif 3660aaaa07SPeter Tyser * #else [ ! CONFIG_SYS_POST_I2C_ADDRS ] 37ad5bb451SWolfgang Denk * The test is considered as passed if any I2C device is found. 38ad5bb451SWolfgang Denk * #endif 39ad5bb451SWolfgang Denk */ 40ad5bb451SWolfgang Denk 41b9b1bc85SPeter Tyser #include <common.h> 42ad5bb451SWolfgang Denk #include <post.h> 43ad5bb451SWolfgang Denk #include <i2c.h> 44ad5bb451SWolfgang Denk 456d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if CONFIG_POST & CONFIG_SYS_POST_I2C 46ad5bb451SWolfgang Denk 47*9d921f19SPeter Tyser static int i2c_ignore_device(unsigned int chip) 48*9d921f19SPeter Tyser { 49*9d921f19SPeter Tyser #ifdef CONFIG_SYS_POST_I2C_IGNORES 50*9d921f19SPeter Tyser const unsigned char i2c_ignore_list[] = CONFIG_SYS_POST_I2C_IGNORES; 51*9d921f19SPeter Tyser int i; 52*9d921f19SPeter Tyser 53*9d921f19SPeter Tyser for (i = 0; i < sizeof(i2c_ignore_list); i++) 54*9d921f19SPeter Tyser if (i2c_ignore_list[i] == chip) 55*9d921f19SPeter Tyser return 1; 56*9d921f19SPeter Tyser #endif 57*9d921f19SPeter Tyser 58*9d921f19SPeter Tyser return 0; 59*9d921f19SPeter Tyser } 60*9d921f19SPeter Tyser 61ad5bb451SWolfgang Denk int i2c_post_test (int flags) 62ad5bb451SWolfgang Denk { 63ad5bb451SWolfgang Denk unsigned int i; 6460aaaa07SPeter Tyser #ifndef CONFIG_SYS_POST_I2C_ADDRS 659f949c9aSPeter Tyser /* Start at address 1, address 0 is the general call address */ 669f949c9aSPeter Tyser for (i = 1; i < 128; i++) 67*9d921f19SPeter Tyser if (i2c_ignore_device(i)) 68*9d921f19SPeter Tyser continue; 69b9b1bc85SPeter Tyser if (i2c_probe (i) == 0) 70b9b1bc85SPeter Tyser return 0; 71b9b1bc85SPeter Tyser 72b9b1bc85SPeter Tyser /* No devices found */ 73b9b1bc85SPeter Tyser return -1; 74b9b1bc85SPeter Tyser #else 757e263ceaSPeter Tyser unsigned int ret = 0; 76ad5bb451SWolfgang Denk int j; 7760aaaa07SPeter Tyser const unsigned char i2c_addr_list[] = CONFIG_SYS_POST_I2C_ADDRS; 78ad5bb451SWolfgang Denk 799f949c9aSPeter Tyser /* Start at address 1, address 0 is the general call address */ 809f949c9aSPeter Tyser for (i = 1; i < 128; i++) { 81*9d921f19SPeter Tyser if (i2c_ignore_device(i)) 82*9d921f19SPeter Tyser continue; 83b9b1bc85SPeter Tyser if (i2c_probe(i) != 0) 84b9b1bc85SPeter Tyser continue; 857e263ceaSPeter Tyser 86ad5bb451SWolfgang Denk for (j = 0; j < sizeof(i2c_addr_list); ++j) { 87ad5bb451SWolfgang Denk if (i == i2c_addr_list[j]) { 887e263ceaSPeter Tyser i2c_addr_list[j] = 0xff; 89ad5bb451SWolfgang Denk break; 90ad5bb451SWolfgang Denk } 91ad5bb451SWolfgang Denk } 92b9b1bc85SPeter Tyser 93ad5bb451SWolfgang Denk if (j == sizeof(i2c_addr_list)) { 947e263ceaSPeter Tyser ret = -1; 957e263ceaSPeter Tyser post_log("I2C: addr %02x not expected\n", i); 96ad5bb451SWolfgang Denk } 97ad5bb451SWolfgang Denk } 98ad5bb451SWolfgang Denk 997e263ceaSPeter Tyser for (i = 0; i < sizeof(i2c_addr_list); ++i) { 1007e263ceaSPeter Tyser if (i2c_addr_list[i] == 0xff) 1017e263ceaSPeter Tyser continue; 1027e263ceaSPeter Tyser post_log("I2C: addr %02x did not respond\n", i2c_addr_list[i]); 1037e263ceaSPeter Tyser ret = -1; 104ad5bb451SWolfgang Denk } 1057e263ceaSPeter Tyser 1067e263ceaSPeter Tyser return ret; 107ad5bb451SWolfgang Denk #endif 108ad5bb451SWolfgang Denk } 109ad5bb451SWolfgang Denk 1106d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_POST & CONFIG_SYS_POST_I2C */ 111