diff options
| author | Heiko Schocher <hs@denx.de> | 2012-01-16 21:12:24 +0000 | 
|---|---|---|
| committer | Heiko Schocher <hs@denx.de> | 2013-07-23 05:54:28 +0200 | 
| commit | 3f4978c713255c8406875fbdf23ffed1129bc44b (patch) | |
| tree | c27f00ba6219d75f772167b7630bb4ebb383a271 | |
| parent | 385c9ef5a7215b2b0c22836fee6c692dfc8559d7 (diff) | |
| download | olio-uboot-2014.01-3f4978c713255c8406875fbdf23ffed1129bc44b.tar.xz olio-uboot-2014.01-3f4978c713255c8406875fbdf23ffed1129bc44b.zip | |
i2c: common changes for multibus/multiadapter support
Signed-off-by: Heiko Schocher <hs@denx.de>
Signed-off-by: Simon Glass <sjg@chromium.org>
Cc: Henrik Nordström <henrik@henriknordstrom.net>
| -rw-r--r-- | README | 72 | ||||
| -rw-r--r-- | arch/arm/lib/board.c | 7 | ||||
| -rw-r--r-- | arch/blackfin/lib/board.c | 7 | ||||
| -rw-r--r-- | arch/m68k/lib/board.c | 17 | ||||
| -rw-r--r-- | arch/nds32/lib/board.c | 10 | ||||
| -rw-r--r-- | arch/powerpc/cpu/mpc8xx/video.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/lib/board.c | 12 | ||||
| -rw-r--r-- | common/board_f.c | 6 | ||||
| -rw-r--r-- | common/cmd_date.c | 9 | ||||
| -rw-r--r-- | common/cmd_dtt.c | 9 | ||||
| -rw-r--r-- | common/cmd_i2c.c | 121 | ||||
| -rw-r--r-- | common/env_eeprom.c | 14 | ||||
| -rw-r--r-- | common/stdio.c | 13 | ||||
| -rw-r--r-- | include/i2c.h | 9 | 
14 files changed, 248 insertions, 62 deletions
| @@ -1944,9 +1944,77 @@ CBFS (Coreboot Filesystem) support  		on those systems that support this (optional)  		feature, like the TQM8xxL modules. -- I2C Support:	CONFIG_HARD_I2C | CONFIG_SOFT_I2C +- I2C Support:	CONFIG_SYS_I2C -		These enable I2C serial bus commands. Defining either of +		This enable the NEW i2c subsystem, and will allow you to use +		i2c commands at the u-boot command line (as long as you set +		CONFIG_CMD_I2C in CONFIG_COMMANDS) and communicate with i2c +		based realtime clock chips or other i2c devices. See +		common/cmd_i2c.c for a description of the command line +		interface. + +		ported i2c driver to the new framework: + +		additional defines: + +		CONFIG_SYS_NUM_I2C_BUSES +		Hold the number of i2c busses you want to use. If you +		don't use/have i2c muxes on your i2c bus, this +		is equal to CONFIG_SYS_NUM_I2C_ADAPTERS, and you can +		omit this define. + +		CONFIG_SYS_I2C_DIRECT_BUS +		define this, if you don't use i2c muxes on your hardware. +		if CONFIG_SYS_I2C_MAX_HOPS is not defined or == 0 you can +		omit this define. + +		CONFIG_SYS_I2C_MAX_HOPS +		define how many muxes are maximal consecutively connected +		on one i2c bus. If you not use i2c muxes, omit this +		define. + +		CONFIG_SYS_I2C_BUSES +		hold a list of busses you want to use, only used if +		CONFIG_SYS_I2C_DIRECT_BUS is not defined, for example +		a board with CONFIG_SYS_I2C_MAX_HOPS = 1 and +		CONFIG_SYS_NUM_I2C_BUSES = 9: + +		 CONFIG_SYS_I2C_BUSES	{{0, {I2C_NULL_HOP}}, \ +					{0, {{I2C_MUX_PCA9547, 0x70, 1}}}, \ +					{0, {{I2C_MUX_PCA9547, 0x70, 2}}}, \ +					{0, {{I2C_MUX_PCA9547, 0x70, 3}}}, \ +					{0, {{I2C_MUX_PCA9547, 0x70, 4}}}, \ +					{0, {{I2C_MUX_PCA9547, 0x70, 5}}}, \ +					{1, {I2C_NULL_HOP}}, \ +					{1, {{I2C_MUX_PCA9544, 0x72, 1}}}, \ +					{1, {{I2C_MUX_PCA9544, 0x72, 2}}}, \ +					} + +		which defines +			bus 0 on adapter 0 without a mux +			bus 1 on adapter 0 without a PCA9547 on address 0x70 port 1 +			bus 2 on adapter 0 without a PCA9547 on address 0x70 port 2 +			bus 3 on adapter 0 without a PCA9547 on address 0x70 port 3 +			bus 4 on adapter 0 without a PCA9547 on address 0x70 port 4 +			bus 5 on adapter 0 without a PCA9547 on address 0x70 port 5 +			bus 6 on adapter 1 without a mux +			bus 7 on adapter 1 without a PCA9544 on address 0x72 port 1 +			bus 8 on adapter 1 without a PCA9544 on address 0x72 port 2 + +		If you do not have i2c muxes on your board, omit this define. + +- Legacy I2C Support:	CONFIG_HARD_I2C | CONFIG_SOFT_I2C + +		NOTE: It is intended to move drivers to CONFIG_SYS_I2C which +		provides the following compelling advantages: + +		- more than one i2c adapter is usable +		- approved multibus support +		- better i2c mux support + +		** Please consider updating your I2C driver now. ** + +		These enable legacy I2C serial bus commands. Defining either of  		(but not both of) CONFIG_HARD_I2C or CONFIG_SOFT_I2C will  		include the appropriate I2C driver for the selected CPU. diff --git a/arch/arm/lib/board.c b/arch/arm/lib/board.c index 09ab4ad73..5302a1369 100644 --- a/arch/arm/lib/board.c +++ b/arch/arm/lib/board.c @@ -69,7 +69,8 @@ extern void dataflash_print_info(void);  #endif  #if defined(CONFIG_HARD_I2C) || \ -    defined(CONFIG_SOFT_I2C) +	defined(CONFIG_SOFT_I2C) || \ +	defined(CONFIG_SYS_I2C)  #include <i2c.h>  #endif @@ -169,7 +170,11 @@ static int display_dram_config(void)  static int init_func_i2c(void)  {  	puts("I2C:   "); +#ifdef CONFIG_SYS_I2C +	i2c_init_all(); +#else  	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); +#endif  	puts("ready\n");  	return (0);  } diff --git a/arch/blackfin/lib/board.c b/arch/blackfin/lib/board.c index f1d55470e..10223bdb7 100644 --- a/arch/blackfin/lib/board.c +++ b/arch/blackfin/lib/board.c @@ -37,6 +37,10 @@  int post_flag;  #endif +#if defined(CONFIG_SYS_I2C) +#include <i2c.h> +#endif +  DECLARE_GLOBAL_DATA_PTR;  __attribute__((always_inline)) @@ -387,6 +391,9 @@ void board_init_r(gd_t * id, ulong dest_addr)  	mmc_initialize(bd);  #endif +#if defined(CONFIG_SYS_I2C) +	i2c_reloc_fixup(); +#endif  	/* relocate environment function pointers etc. */  	env_relocate(); diff --git a/arch/m68k/lib/board.c b/arch/m68k/lib/board.c index efc9fccc1..582f47b50 100644 --- a/arch/m68k/lib/board.c +++ b/arch/m68k/lib/board.c @@ -56,7 +56,7 @@  #include <version.h>  #if defined(CONFIG_HARD_I2C) || \ -    defined(CONFIG_SOFT_I2C) +	defined(CONFIG_SOFT_I2C)  #include <i2c.h>  #endif @@ -142,11 +142,16 @@ static int init_func_ram (void)  /***********************************************************************/ -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \ +		defined(CONFIG_SYS_I2C)  static int init_func_i2c (void)  {  	puts ("I2C:   "); +#ifdef CONFIG_SYS_I2C +	i2c_init_all(); +#else  	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); +#endif  	puts ("ready\n");  	return (0);  } @@ -178,7 +183,8 @@ init_fnc_t *init_sequence[] = {  	display_options,  	checkcpu,  	checkboard, -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \ +		defined(CONFIG_SYS_I2C)  	init_func_i2c,  #endif  #if defined(CONFIG_HARD_SPI) @@ -501,6 +507,11 @@ void board_init_r (gd_t *id, ulong dest_addr)  	spi_init_r ();  #endif +#if defined(CONFIG_SYS_I2C) +	/* Adjust I2C subsystem pointers after relocation */ +	i2c_reloc_fixup(); +#endif +  	/* relocate environment function pointers etc. */  	env_relocate (); diff --git a/arch/nds32/lib/board.c b/arch/nds32/lib/board.c index 1157d8c50..29fe12014 100644 --- a/arch/nds32/lib/board.c +++ b/arch/nds32/lib/board.c @@ -40,6 +40,10 @@  DECLARE_GLOBAL_DATA_PTR; +#if defined(CONFIG_SYS_I2C) +#include <i2c.h> +#endif +  ulong monitor_flash_len;  /* @@ -173,7 +177,7 @@ init_fnc_t *init_sequence[] = {  #if defined(CONFIG_DISPLAY_BOARDINFO)  	checkboard,		/* display board info */  #endif -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)  	init_func_i2c,  #endif  	dram_init,		/* configure available RAM banks */ @@ -347,6 +351,10 @@ void board_init_r(gd_t *id, ulong dest_addr)  	mmc_initialize(gd->bd);  #endif +#if defined(CONFIG_SYS_I2C_ADAPTERS) +	i2c_reloc_fixup(); +#endif +  	/* initialize environment */  	env_relocate(); diff --git a/arch/powerpc/cpu/mpc8xx/video.c b/arch/powerpc/cpu/mpc8xx/video.c index 1bbf4ccc6..10e3e88b5 100644 --- a/arch/powerpc/cpu/mpc8xx/video.c +++ b/arch/powerpc/cpu/mpc8xx/video.c @@ -809,7 +809,11 @@ static void video_encoder_init (void)  	/* Initialize the I2C */  	debug ("[VIDEO ENCODER] Initializing I2C bus...\n"); +#ifdef CONFIG_SYS_I2C +	i2c_init_all(); +#else  	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); +#endif  #ifdef CONFIG_FADS  	/* Reset ADV7176 chip */ diff --git a/arch/powerpc/lib/board.c b/arch/powerpc/lib/board.c index fc4c1d581..0c2e008e0 100644 --- a/arch/powerpc/lib/board.c +++ b/arch/powerpc/lib/board.c @@ -99,7 +99,7 @@ extern void sc3_read_eeprom(void);  void doc_init(void);  #endif  #if defined(CONFIG_HARD_I2C) || \ -    defined(CONFIG_SOFT_I2C) +	defined(CONFIG_SOFT_I2C)  #include <i2c.h>  #endif  #include <spi.h> @@ -214,11 +214,16 @@ static int init_func_ram(void)  /***********************************************************************/ -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \ +		defined(CONFIG_SYS_I2C)  static int init_func_i2c(void)  {  	puts("I2C:   "); +#ifdef CONFIG_SYS_I2C +	i2c_init_all(); +#else  	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); +#endif  	puts("ready\n");  	return 0;  } @@ -307,7 +312,8 @@ static init_fnc_t *init_sequence[] = {  	misc_init_f,  #endif  	INIT_FUNC_WATCHDOG_RESET -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \ +		defined(CONFIG_SYS_I2C)  	init_func_i2c,  #endif  #if defined(CONFIG_HARD_SPI) diff --git a/common/board_f.c b/common/board_f.c index ab4242a77..ca9a7603e 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -261,7 +261,8 @@ void __dram_init_banksize(void)  void dram_init_banksize(void)  	__attribute__((weak, alias("__dram_init_banksize"))); -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \ +	defined(CONFIG_SYS_I2C)  static int init_func_i2c(void)  {  	puts("I2C:   "); @@ -919,7 +920,8 @@ static init_fnc_t init_sequence_f[] = {  	misc_init_f,  #endif  	INIT_FUNC_WATCHDOG_RESET -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \ +	defined(CONFIG_SYS_I2C)  	init_func_i2c,  #endif  #if defined(CONFIG_HARD_SPI) diff --git a/common/cmd_date.c b/common/cmd_date.c index 0ac032cf3..f7ae1da1e 100644 --- a/common/cmd_date.c +++ b/common/cmd_date.c @@ -50,8 +50,13 @@ static int do_date(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	int old_bus;  	/* switch to correct I2C bus */ +#ifdef CONFIG_SYS_I2C +	old_bus = i2c_get_bus_num(); +	i2c_set_bus_num(CONFIG_SYS_RTC_BUS_NUM); +#else  	old_bus = I2C_GET_BUS();  	I2C_SET_BUS(CONFIG_SYS_RTC_BUS_NUM); +#endif  	switch (argc) {  	case 2:			/* set date & time */ @@ -97,7 +102,11 @@ static int do_date(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  	}  	/* switch back to original I2C bus */ +#ifdef CONFIG_SYS_I2C +	i2c_set_bus_num(old_bus); +#else  	I2C_SET_BUS(old_bus); +#endif  	return rcode;  } diff --git a/common/cmd_dtt.c b/common/cmd_dtt.c index edbd4a83c..c3f8982a7 100644 --- a/common/cmd_dtt.c +++ b/common/cmd_dtt.c @@ -73,8 +73,13 @@ int dtt_i2c(void)  	/* Force a compilation error, if there are more then 32 sensors */  	BUILD_BUG_ON(sizeof(sensors) > 32);  	/* switch to correct I2C bus */ +#ifdef CONFIG_SYS_I2C +	old_bus = i2c_get_bus_num(); +	i2c_set_bus_num(CONFIG_SYS_DTT_BUS_NUM); +#else  	old_bus = I2C_GET_BUS();  	I2C_SET_BUS(CONFIG_SYS_DTT_BUS_NUM); +#endif  	_initialize_dtt(); @@ -86,8 +91,12 @@ int dtt_i2c(void)  		printf("DTT%d: %i C\n", i + 1, dtt_get_temp(sensors[i]));  	/* switch back to original I2C bus */ +#ifdef CONFIG_SYS_I2C +	i2c_set_bus_num(old_bus); +#else  	I2C_SET_BUS(old_bus);  #endif +#endif  	return 0;  } diff --git a/common/cmd_i2c.c b/common/cmd_i2c.c index 438079447..5614a6d06 100644 --- a/common/cmd_i2c.c +++ b/common/cmd_i2c.c @@ -1,4 +1,9 @@  /* + * (C) Copyright 2009 + * Sergey Kubushyn, himself, ksi@koi8.net + * + * Changes for unified multibus/multiadapter I2C support. + *   * (C) Copyright 2001   * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com.   * @@ -85,6 +90,8 @@  #include <asm/byteorder.h>  #include <linux/compiler.h> +DECLARE_GLOBAL_DATA_PTR; +  /* Display values from last command.   * Memory modify remembered values are different from display memory.   */ @@ -103,7 +110,8 @@ static uint	i2c_mm_last_alen;   * pairs.  The following macros take care of this */  #if defined(CONFIG_SYS_I2C_NOPROBES) -#if defined(CONFIG_I2C_MULTI_BUS) +#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MUX) || \ +	defined(CONFIG_I2C_MULTI_BUS)  static struct  {  	uchar	bus; @@ -119,7 +127,7 @@ static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;  #define COMPARE_BUS(b,i)	((b) == 0)	/* Make compiler happy */  #define COMPARE_ADDR(a,i)	(i2c_no_probes[(i)] == (a))  #define NO_PROBE_ADDR(i)	i2c_no_probes[(i)] -#endif	/* CONFIG_MULTI_BUS */ +#endif	/* defined(CONFIG_SYS_I2C) */  #define NUM_ELEMENTS_NOPROBE (sizeof(i2c_no_probes)/sizeof(i2c_no_probes[0]))  #endif @@ -127,9 +135,6 @@ static uchar i2c_no_probes[] = CONFIG_SYS_I2C_NOPROBES;  #if defined(CONFIG_I2C_MUX)  static I2C_MUX_DEVICE	*i2c_mux_devices = NULL;  static	int	i2c_mux_busid = CONFIG_SYS_MAX_I2C_BUS; - -DECLARE_GLOBAL_DATA_PTR; -  #endif  #define DISP_LINE_LEN	16 @@ -144,7 +149,6 @@ DECLARE_GLOBAL_DATA_PTR;  __weak  void i2c_init_board(void)  { -	return;  }  /* TODO: Implement architecture-specific get/set functions */ @@ -161,6 +165,11 @@ void i2c_init_board(void)   *   * Returns I2C bus speed in Hz.   */ +#if !defined(CONFIG_SYS_I2C) +/* + * TODO: Implement architecture-specific get/set functions + * Should go away, if we switched completely to new multibus support + */  __weak  unsigned int i2c_get_bus_speed(void)  { @@ -188,6 +197,7 @@ int i2c_set_bus_speed(unsigned int speed)  	return 0;  } +#endif  /**   * get_alen() - Small parser helper function to get address length @@ -700,7 +710,7 @@ static int do_i2c_probe (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv  	int found = 0;  #if defined(CONFIG_SYS_I2C_NOPROBES)  	int k, skip; -	uchar bus = GET_BUS_NUM; +	unsigned int bus = GET_BUS_NUM;  #endif	/* NOPROBES */  	if (argc == 2) @@ -1373,9 +1383,8 @@ int do_edid(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])  }  #endif /* CONFIG_I2C_EDID */ -#if defined(CONFIG_I2C_MUX)  /** - * do_i2c_add_bus() - Handle the "i2c bus" command-line command + * do_i2c_show_bus() - Handle the "i2c bus" command-line command   * @cmdtp:	Command data struct pointer   * @flag:	Command flag   * @argc:	Command-line argument count @@ -1383,35 +1392,55 @@ int do_edid(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])   *   * Returns zero always.   */ -static int do_i2c_add_bus(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) +#if defined(CONFIG_SYS_I2C) +int do_i2c_show_bus(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  { -	int ret=0; +	int	i; +#ifndef CONFIG_SYS_I2C_DIRECT_BUS +	int	j; +#endif  	if (argc == 1) {  		/* show all busses */ -		I2C_MUX		*mux; -		I2C_MUX_DEVICE	*device = i2c_mux_devices; - -		printf ("Busses reached over muxes:\n"); -		while (device != NULL) { -			printf ("Bus ID: %x\n", device->busid); -			printf ("  reached over Mux(es):\n"); -			mux = device->mux; -			while (mux != NULL) { -				printf ("    %s@%x ch: %x\n", mux->name, mux->chip, mux->channel); -				mux = mux->next; +		for (i = 0; i < CONFIG_SYS_NUM_I2C_BUSES; i++) { +			printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name); +#ifndef CONFIG_SYS_I2C_DIRECT_BUS +			for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) { +				if (i2c_bus[i].next_hop[j].chip == 0) +					break; +				printf("->%s@0x%2x:%d", +				       i2c_bus[i].next_hop[j].mux.name, +				       i2c_bus[i].next_hop[j].chip, +				       i2c_bus[i].next_hop[j].channel);  			} -			device = device->next; +#endif +			printf("\n");  		}  	} else { -		(void)i2c_mux_ident_muxstring ((uchar *)argv[1]); -		ret = 0; +		/* show specific bus */ +		i = simple_strtoul(argv[1], NULL, 10); +		if (i >= CONFIG_SYS_NUM_I2C_BUSES) { +			printf("Invalid bus %d\n", i); +			return -1; +		} +		printf("Bus %d:\t%s", i, I2C_ADAP_NR(i)->name); +#ifndef CONFIG_SYS_I2C_DIRECT_BUS +			for (j = 0; j < CONFIG_SYS_I2C_MAX_HOPS; j++) { +				if (i2c_bus[i].next_hop[j].chip == 0) +					break; +				printf("->%s@0x%2x:%d", +				       i2c_bus[i].next_hop[j].mux.name, +				       i2c_bus[i].next_hop[j].chip, +				       i2c_bus[i].next_hop[j].channel); +			} +#endif +		printf("\n");  	} -	return ret; + +	return 0;  } -#endif  /* CONFIG_I2C_MUX */ +#endif -#if defined(CONFIG_I2C_MULTI_BUS)  /**   * do_i2c_bus_num() - Handle the "i2c dev" command-line command   * @cmdtp:	Command data struct pointer @@ -1422,23 +1451,29 @@ static int do_i2c_add_bus(cmd_tbl_t * cmdtp, int flag, int argc, char * const ar   * Returns zero on success, CMD_RET_USAGE in case of misuse and negative   * on error.   */ -static int do_i2c_bus_num(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) +#if defined(CONFIG_SYS_I2C) || defined(CONFIG_I2C_MULTI_BUS) +int do_i2c_bus_num(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  { -	int bus_idx, ret=0; +	int		ret = 0; +	unsigned int	bus_no;  	if (argc == 1)  		/* querying current setting */  		printf("Current bus is %d\n", i2c_get_bus_num());  	else { -		bus_idx = simple_strtoul(argv[1], NULL, 10); -		printf("Setting bus to %d\n", bus_idx); -		ret = i2c_set_bus_num(bus_idx); +		bus_no = simple_strtoul(argv[1], NULL, 10); +		if (bus_no >= CONFIG_SYS_NUM_I2C_BUSES) { +			printf("Invalid bus %d\n", bus_no); +			return -1; +		} +		printf("Setting bus to %d\n", bus_no); +		ret = i2c_set_bus_num(bus_no);  		if (ret)  			printf("Failure changing bus number (%d)\n", ret);  	}  	return ret;  } -#endif  /* CONFIG_I2C_MULTI_BUS */ +#endif  /* defined(CONFIG_SYS_I2C) */  /**   * do_i2c_bus_speed() - Handle the "i2c speed" command-line command @@ -1508,16 +1543,21 @@ static int do_i2c_nm(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])   */  static int do_i2c_reset(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  { +#if defined(CONFIG_SYS_I2C) +	i2c_init(I2C_ADAP->speed, I2C_ADAP->slaveaddr); +#else  	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); +#endif  	return 0;  }  static cmd_tbl_t cmd_i2c_sub[] = { -#if defined(CONFIG_I2C_MUX) -	U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_add_bus, "", ""), +#if defined(CONFIG_SYS_I2C) +	U_BOOT_CMD_MKENT(bus, 1, 1, do_i2c_show_bus, "", ""),  #endif  /* CONFIG_I2C_MUX */  	U_BOOT_CMD_MKENT(crc32, 3, 1, do_i2c_crc, "", ""), -#if defined(CONFIG_I2C_MULTI_BUS) +#if defined(CONFIG_SYS_I2C) || \ +	defined(CONFIG_I2C_MULTI_BUS)  	U_BOOT_CMD_MKENT(dev, 1, 1, do_i2c_bus_num, "", ""),  #endif  /* CONFIG_I2C_MULTI_BUS */  #if defined(CONFIG_I2C_EDID) @@ -1576,11 +1616,12 @@ static int do_i2c(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  /***************************************************/  #ifdef CONFIG_SYS_LONGHELP  static char i2c_help_text[] = -#if defined(CONFIG_I2C_MUX) -	"bus [muxtype:muxaddr:muxchannel] - add a new bus reached over muxes\ni2c " +#if defined(CONFIG_SYS_I2C) +	"bus [muxtype:muxaddr:muxchannel] - show I2C bus info\n"  #endif  /* CONFIG_I2C_MUX */  	"crc32 chip address[.0, .1, .2] count - compute CRC32 checksum\n" -#if defined(CONFIG_I2C_MULTI_BUS) +#if defined(CONFIG_SYS_I2C) || \ +	defined(CONFIG_I2C_MULTI_BUS)  	"i2c dev [dev] - show or set current I2C bus\n"  #endif  /* CONFIG_I2C_MULTI_BUS */  #if defined(CONFIG_I2C_EDID) diff --git a/common/env_eeprom.c b/common/env_eeprom.c index 45c935b6d..fbd459ac2 100644 --- a/common/env_eeprom.c +++ b/common/env_eeprom.c @@ -49,6 +49,10 @@ static int eeprom_bus_read(unsigned dev_addr, unsigned offset,  #if defined(CONFIG_I2C_ENV_EEPROM_BUS)  	int old_bus = i2c_get_bus_num(); +#if defined(CONFIG_SYS_I2C) +	if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS) +		i2c_set_bus_num(CONFIG_I2C_ENV_EEPROM_BUS); +#else  	if (gd->flags & GD_FLG_RELOC) {  		if (env_eeprom_bus == -1) {  			I2C_MUX_DEVICE *dev = NULL; @@ -68,11 +72,16 @@ static int eeprom_bus_read(unsigned dev_addr, unsigned offset,  				(uchar *)CONFIG_I2C_ENV_EEPROM_BUS);  	}  #endif +#endif  	rcode = eeprom_read(dev_addr, offset, buffer, cnt);  #if defined(CONFIG_I2C_ENV_EEPROM_BUS) +#if defined(CONFIG_SYS_I2C) +	if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS) +#else  	if (old_bus != env_eeprom_bus) +#endif  		i2c_set_bus_num(old_bus);  #endif  	return rcode; @@ -85,8 +94,13 @@ static int eeprom_bus_write(unsigned dev_addr, unsigned offset,  #if defined(CONFIG_I2C_ENV_EEPROM_BUS)  	int old_bus = i2c_get_bus_num(); +#if defined(CONFIG_SYS_I2C) +	if (old_bus != CONFIG_I2C_ENV_EEPROM_BUS) +		i2c_set_bus_num(CONFIG_I2C_ENV_EEPROM_BUS); +#else  	rcode = i2c_mux_ident_muxstring_f((uchar *)CONFIG_I2C_ENV_EEPROM_BUS);  #endif +#endif  	rcode = eeprom_write(dev_addr, offset, buffer, cnt);  #if defined(CONFIG_I2C_ENV_EEPROM_BUS)  	i2c_set_bus_num(old_bus); diff --git a/common/stdio.c b/common/stdio.c index 5d5117c0e..201188054 100644 --- a/common/stdio.c +++ b/common/stdio.c @@ -1,4 +1,8 @@  /* + * Copyright (C) 2009 Sergey Kubushyn <ksi@koi8.net> + * + * Changes for multibus/multiadapter I2C support. + *   * (C) Copyright 2000   * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it   * @@ -30,7 +34,8 @@  #ifdef CONFIG_LOGBUFFER  #include <logbuff.h>  #endif -#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) +#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) || \ +		defined(CONFIG_SYS_I2C_ADAPTERS)  #include <i2c.h>  #endif @@ -210,9 +215,15 @@ int stdio_init (void)  #ifdef CONFIG_ARM_DCC  	drv_arm_dcc_init ();  #endif +#ifdef CONFIG_SYS_I2C +#ifdef CONFIG_SYS_I2C_ADAPTERS +	i2c_init_all(); +#endif +#else  #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)  	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);  #endif +#endif  #ifdef CONFIG_LCD  	drv_lcd_init ();  #endif diff --git a/include/i2c.h b/include/i2c.h index 457fd7d56..3e09af914 100644 --- a/include/i2c.h +++ b/include/i2c.h @@ -220,15 +220,6 @@ int i2c_mux_ident_muxstring_f (uchar *buf);  #ifdef CONFIG_SYS_I2C  /* - * Initialization, must be called once on start up, may be called - * repeatedly to change the speed and slave addresses. - */ -void i2c_init(unsigned int speed, int slaveaddr); -#ifdef CONFIG_SYS_I2C_INIT_BOARD -void i2c_init_board(void); -#endif - -/*   * i2c_get_bus_num:   *   *  Returns index of currently active I2C bus.  Zero-based. |