diff options
| author | Wolfgang Denk <wd@denx.de> | 2010-11-12 22:24:06 +0100 | 
|---|---|---|
| committer | Wolfgang Denk <wd@denx.de> | 2010-11-12 22:24:06 +0100 | 
| commit | d963e84c92a63b4e6c4f2f80482a5ecbe9b24fe0 (patch) | |
| tree | 07dd5889d73f4b66ad608815adcf6f2f953d9501 /post/drivers/i2c.c | |
| parent | 66fca016057b1c6b697552cc7220ebada9d4f82d (diff) | |
| parent | 0c0892be0d93a5a892b93739c5eb3bf692fed4ff (diff) | |
| download | olio-uboot-2014.01-d963e84c92a63b4e6c4f2f80482a5ecbe9b24fe0.tar.xz olio-uboot-2014.01-d963e84c92a63b4e6c4f2f80482a5ecbe9b24fe0.zip | |
Merge branch 'master' of /home/wd/git/u-boot/master
Diffstat (limited to 'post/drivers/i2c.c')
| -rw-r--r-- | post/drivers/i2c.c | 99 | 
1 files changed, 59 insertions, 40 deletions
| diff --git a/post/drivers/i2c.c b/post/drivers/i2c.c index b152deaf6..4a1b1a49d 100644 --- a/post/drivers/i2c.c +++ b/post/drivers/i2c.c @@ -21,70 +21,89 @@   * MA 02111-1307 USA   */ -#include <common.h> -  /*   * I2C test   *   * For verifying the I2C bus, a full I2C bus scanning is performed.   * - * #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 ] + * #ifdef CONFIG_SYS_POST_I2C_ADDRS + *   The test is considered as passed if all the devices and only the devices + *   in the list are found. + *   #ifdef CONFIG_SYS_POST_I2C_IGNORES + *     Ignore devices listed in CONFIG_SYS_POST_I2C_IGNORES.  These devices + *     are optional or not vital to board functionality. + *   #endif + * #else [ ! CONFIG_SYS_POST_I2C_ADDRS ]   *   The test is considered as passed if any I2C device is found.   * #endif   */ +#include <common.h>  #include <post.h>  #include <i2c.h>  #if CONFIG_POST & CONFIG_SYS_POST_I2C +static int i2c_ignore_device(unsigned int chip) +{ +#ifdef CONFIG_SYS_POST_I2C_IGNORES +	const unsigned char i2c_ignore_list[] = CONFIG_SYS_POST_I2C_IGNORES; +	int i; + +	for (i = 0; i < sizeof(i2c_ignore_list); i++) +		if (i2c_ignore_list[i] == chip) +			return 1; +#endif + +	return 0; +} +  int i2c_post_test (int flags)  {  	unsigned int i; -	unsigned int good = 0; -#ifdef I2C_ADDR_LIST -	unsigned int bad  = 0; +#ifndef CONFIG_SYS_POST_I2C_ADDRS +	/* Start at address 1, address 0 is the general call address */ +	for (i = 1; i < 128; i++) +		if (i2c_ignore_device(i)) +			continue; +		if (i2c_probe (i) == 0) +			return 0; + +	/* No devices found */ +	return -1; +#else +	unsigned int ret  = 0;  	int j; -	unsigned char i2c_addr_list[] = I2C_ADDR_LIST; -	unsigned char i2c_miss_list[] = I2C_ADDR_LIST; -#endif +	unsigned char i2c_addr_list[] = CONFIG_SYS_POST_I2C_ADDRS; -	for (i = 0; i < 128; i++) { -		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); +	/* Start at address 1, address 0 is the general call address */ +	for (i = 1; i < 128; i++) { +		if (i2c_ignore_device(i)) +			continue; +		if (i2c_probe(i) != 0) +			continue; + +		for (j = 0; j < sizeof(i2c_addr_list); ++j) { +			if (i == i2c_addr_list[j]) { +				i2c_addr_list[j] = 0xff; +				break;  			} -#endif	/* I2C_ADDR_LIST */  		} -	} -#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]); -			} +		if (j == sizeof(i2c_addr_list)) { +			ret = -1; +			post_log("I2C: addr %02x not expected\n", i);  		}  	} -	return ((good == sizeof(i2c_addr_list)) && (bad == 0)) ? 0 : -1; + +	for (i = 0; i < sizeof(i2c_addr_list); ++i) { +		if (i2c_addr_list[i] == 0xff) +			continue; +		post_log("I2C: addr %02x did not respond\n", i2c_addr_list[i]); +		ret = -1; +	} + +	return ret;  #endif  } |