Skip to contentSkip to conversation

Bring in new I2C framework

PATCH New Heiko Schocher 5 participants 24 messages Oct 22, 2012 – Oct 31, 2012

Subsystems (11)
Arm (32-bit) x86 PowerPC MIPS +7 more subsystems
lore
Share & tools
lore
#0 lore raw

cover Bring in new I2C framework

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

Cc Simon Glass <[email protected]>
Cc Piotr Wilczek <[email protected]>

Heiko Schocher (3):
i2c: add i2c_core and prepare for new multibus support
i2c: common changes for multibus/multiadapter support i2c, soft-i2c: switch to new multibus/multiadapter support

 README                                    |   89 +++++++-
 arch/arm/include/asm/global_data.h        |    3 +
 arch/arm/lib/board.c                      |   15 +-
 arch/avr32/include/asm/global_data.h      |    3 +
 arch/blackfin/include/asm/global_data.h   |    4 +-
 arch/blackfin/lib/board.c                 |    7 +
 arch/m68k/include/asm/global_data.h       |    3 +
 arch/m68k/lib/board.c                     |   15 +-
 arch/microblaze/include/asm/global_data.h |    3 +
 arch/mips/include/asm/global_data.h       |    3 +
 arch/mips/lib/board.c                     |    7 +
 arch/nds32/include/asm/global_data.h      |    3 +
 arch/nds32/lib/board.c                    |   10 +-
 arch/nios2/include/asm/global_data.h      |    3 +
 arch/powerpc/cpu/mpc8xx/video.c           |    4 +
 arch/powerpc/include/asm/global_data.h    |    3 +
 arch/powerpc/lib/board.c                  |   16 +-
 arch/sh/include/asm/global_data.h         |    3 +
 arch/sparc/include/asm/global_data.h      |    3 +
 arch/x86/include/asm/global_data.h        |    3 +
 board/BuS/eb_cpux9k2/cpux9k2.c            |    2 +-
 board/BuS/vl_ma2sc/vl_ma2sc.c             |    2 +-
 board/atc/atc.c                           |    2 +-
 board/bluewater/snapper9260/snapper9260.c |    2 +-
 board/cm5200/cm5200.c                     |    4 +-
 board/cpu86/cpu86.c                       |    2 +-
 board/cpu87/cpu87.c                       |    2 +-
 board/emk/top9000/top9000.c               |    8 +-
 board/eukrea/cpuat91/cpuat91.c            |    2 +-
 board/freescale/m52277evb/README          |    2 +-
 board/freescale/m53017evb/README          |    2 +-
 board/freescale/m5373evb/README           |    2 +-
 board/freescale/m54455evb/README          |    2 +-
 board/freescale/m547xevb/README           |    2 +-
 board/ids8247/ids8247.c                   |    2 +-
 board/keymile/common/common.c             |    3 +-
 board/keymile/common/ivm.c                |   15 +-
 board/keymile/km82xx/km82xx.c             |    2 +-
 board/keymile/km_arm/km_arm.c             |    8 +-
 board/lwmon/lwmon.c                       |    2 +-
 board/lwmon/pcmcia.c                      |    4 +-
 board/pm826/pm826.c                       |    2 +-
 board/pm828/pm828.c                       |    2 +-
 board/sacsng/ioconfig.h                   |    2 +-
 board/sandburst/karef/karef.c             |    1 -
 board/siemens/SCM/scm.c                   |    2 +-
 board/tqc/tqm8260/tqm8260.c               |    2 +-
 board/tqc/tqm8272/tqm8272.c               |    2 +-
 board/tqc/tqm8272/tqm8272.h               |    2 +-
 common/cmd_date.c                         |    9 +
 common/cmd_dtt.c                          |    9 +
 common/cmd_eeprom.c                       |    3 +-
 common/cmd_i2c.c                          |  118 ++++++---
 common/env_eeprom.c                       |   14 +
 common/stdio.c                            |   14 +-
 drivers/i2c/Makefile                      |    3 +-
 drivers/i2c/i2c_core.c                    |  367 +++++++++++++++++++++++++++++
 drivers/i2c/soft_i2c.c                    |  122 ++++++----
 include/configs/A3000.h                   |    4 +-
 include/configs/BSC9131RDB.h              |    1 -
 include/configs/CANBT.h                   |    4 +
 include/configs/CPU86.h                   |    9 +-
 include/configs/CPU87.h                   |    9 +-
 include/configs/DU440.h                   |    1 -
 include/configs/GEN860T.h                 |   36 ++--
 include/configs/HIDDEN_DRAGON.h           |   10 +-
 include/configs/IAD210.h                  |   12 +-
 include/configs/ICU862.h                  |   14 +-
 include/configs/IDS8247.h                 |   10 +-
 include/configs/IP860.h                   |   10 +-
 include/configs/IPHASE4539.h              |   12 +-
 include/configs/JSE.h                     |    1 -
 include/configs/KAREF.h                   |    1 -
 include/configs/KUP4K.h                   |   12 +-
 include/configs/KUP4X.h                   |   14 +-
 include/configs/M5208EVBE.h               |    1 -
 include/configs/M52277EVB.h               |    1 -
 include/configs/M5235EVB.h                |    1 -
 include/configs/M5271EVB.h                |    1 -
 include/configs/M5275EVB.h                |    1 -
 include/configs/M53017EVB.h               |    1 -
 include/configs/M5329EVB.h                |    1 -
 include/configs/M5373EVB.h                |    1 -
 include/configs/M54451EVB.h               |    1 -
 include/configs/M54455EVB.h               |    1 -
 include/configs/M5475EVB.h                |    1 -
 include/configs/M5485EVB.h                |    1 -
 include/configs/METROBOX.h                |    1 -
 include/configs/MHPC.h                    |    9 +-
 include/configs/MPC8323ERDB.h             |    1 -
 include/configs/MPC832XEMDS.h             |    1 -
 include/configs/MPC8349EMDS.h             |    1 -
 include/configs/MPC8349ITX.h              |    2 -
 include/configs/MPC8360EMDS.h             |    1 -
 include/configs/MPC8360ERDK.h             |    1 -
 include/configs/MPC837XEMDS.h             |    1 -
 include/configs/MPC837XERDB.h             |    1 -
 include/configs/MPC8536DS.h               |    1 -
 include/configs/MPC8540ADS.h              |    1 -
 include/configs/MPC8541CDS.h              |    1 -
 include/configs/MPC8544DS.h               |    1 -
 include/configs/MPC8548CDS.h              |    3 +-
 include/configs/MPC8555CDS.h              |    1 -
 include/configs/MPC8560ADS.h              |    1 -
 include/configs/MPC8568MDS.h              |    1 -
 include/configs/MPC8569MDS.h              |    1 -
 include/configs/MPC8572DS.h               |    1 -
 include/configs/MPC8610HPCD.h             |    1 -
 include/configs/MPC8641HPCN.h             |    1 -
 include/configs/P1010RDB.h                |    1 -
 include/configs/P1023RDS.h                |    1 -
 include/configs/P1_P2_RDB.h               |    1 -
 include/configs/P2020COME.h               |    1 -
 include/configs/PM826.h                   |    9 +-
 include/configs/PM828.h                   |    9 +-
 include/configs/PMC440.h                  |    1 -
 include/configs/R360MPI.h                 |    7 +-
 include/configs/RPXClassic.h              |   16 +-
 include/configs/RPXlite.h                 |   26 ++
 include/configs/RRvision.h                |   13 +-
 include/configs/SBC8540.h                 |    1 -
 include/configs/SCM.h                     |   11 +-
 include/configs/SXNI855T.h                |    8 +-
 include/configs/Sandpoint8240.h           |   10 +-
 include/configs/Sandpoint8245.h           |   14 +-
 include/configs/TASREG.h                  |   27 +-
 include/configs/TK885D.h                  |   13 +-
 include/configs/TOP5200.h                 |   15 +-
 include/configs/TOP860.h                  |   11 +-
 include/configs/TQM8260.h                 |    9 +-
 include/configs/TQM8272.h                 |   13 +-
 include/configs/TQM834x.h                 |    1 -
 include/configs/TQM855M.h                 |   13 +-
 include/configs/TQM866M.h                 |   13 +-
 include/configs/TQM885D.h                 |   13 +-
 include/configs/alpr.h                    |    1 -
 include/configs/aria.h                    |    1 -
 include/configs/astro_mcf5373l.h          |    1 -
 include/configs/bf533-ezkit.h             |   10 +-
 include/configs/bf533-stamp.h             |   47 ++++-
 include/configs/bf561-ezkit.h             |    9 +-
 include/configs/bfin_adi_common.h         |    2 +-
 include/configs/blackstamp.h              |    1 -
 include/configs/cpuat91.h                 |    1 -
 include/configs/debris.h                  |   10 +-
 include/configs/eXalion.h                 |    2 +-
 include/configs/eb_cpux9k2.h              |   14 +-
 include/configs/ep8260.h                  |   14 +-
 include/configs/ethernut5.h               |    9 +-
 include/configs/ibf-dsp561.h              |    5 +-
 include/configs/iocon.h                   |   11 +-
 include/configs/km/keymile-common.h       |    3 -
 include/configs/km/km83xx-common.h        |    3 +
 include/configs/km/km_arm.h               |   26 ++-
 include/configs/km82xx.h                  |   18 +-
 include/configs/km_kirkwood.h             |   14 +-
 include/configs/korat.h                   |    1 -
 include/configs/lwmon.h                   |   13 +-
 include/configs/lwmon5.h                  |    1 -
 include/configs/mecp5123.h                |    1 -
 include/configs/mpc5121ads.h              |    1 -
 include/configs/nhk8815.h                 |    8 +-
 include/configs/otc570.h                  |   18 +-
 include/configs/p1_p2_rdb_pc.h            |    1 -
 include/configs/p3p440.h                  |    1 -
 include/configs/pcs440ep.h                |    1 -
 include/configs/pdnb3.h                   |   11 +-
 include/configs/quad100hd.h               |    1 -
 include/configs/s5p_goni.h                |    7 +-
 include/configs/s5pc210_universal.h       |    7 +-
 include/configs/sacsng.h                  |   12 +-
 include/configs/sbc405.h                  |    1 -
 include/configs/sbc8349.h                 |    1 -
 include/configs/sbc8548.h                 |    1 -
 include/configs/sbc8560.h                 |    1 -
 include/configs/sbc8641d.h                |    1 -
 include/configs/sc3.h                     |    1 -
 include/configs/snapper9260.h             |    9 +-
 include/configs/socrates.h                |    1 -
 include/configs/spc1920.h                 |   13 +-
 include/configs/stxgp3.h                  |    1 -
 include/configs/stxssa.h                  |    1 -
 include/configs/top9000.h                 |   10 +-
 include/configs/trats.h                   |    7 +-
 include/configs/u8500_href.h              |    1 -
 include/configs/uc100.h                   |   13 +-
 include/configs/utx8245.h                 |    3 +-
 include/configs/vct.h                     |   12 +-
 include/configs/vl_ma2sc.h                |    7 +-
 include/configs/vme8349.h                 |    1 -
 include/configs/zeus.h                    |    1 -
 include/i2c.h                             |  196 +++++++++++++++-
 192 files changed, 1443 insertions(+), 533 deletions(-)
 create mode 100644 drivers/i2c/i2c_core.c
Signature · 1 line
1.7.7.6
#1 lore raw

PATCH 1/3 i2c: add i2c_core and prepare for new multibus support

This Patch introduce the new i2c_core file, which holds the I2C core functions, for the rework of the multibus/ multiadapter support.
Also adds changes in i2c.h for the new I2C multibus/multiadapter support. This new support can be activated with the CONFIG_SYS_I2C define.

---
- changes against Simons patches:
- gd->cur_i2c_adap now used as "struct i2c_bus_hose *"
- get rid of "i2c_cur_bus"
add comments from Mike Frysinger:
- renamed cur_adap to cur_i2c_adap
- use uintx_t types

---
 arch/arm/include/asm/global_data.h        |    3 +
 arch/avr32/include/asm/global_data.h      |    3 +
 arch/blackfin/include/asm/global_data.h   |    4 +-
 arch/m68k/include/asm/global_data.h       |    3 +
 arch/microblaze/include/asm/global_data.h |    3 +
 arch/mips/include/asm/global_data.h       |    3 +
 arch/nds32/include/asm/global_data.h      |    3 +
 arch/nios2/include/asm/global_data.h      |    3 +
 arch/powerpc/include/asm/global_data.h    |    3 +
 arch/sh/include/asm/global_data.h         |    3 +
 arch/sparc/include/asm/global_data.h      |    3 +
 arch/x86/include/asm/global_data.h        |    3 +
 drivers/i2c/Makefile                      |    1 +
 drivers/i2c/i2c_core.c                    |  363 +++++++++++++++++++++++++++++
 include/i2c.h                             |  196 +++++++++++++++-
 15 files changed, 588 insertions(+), 9 deletions(-)
 create mode 100644 drivers/i2c/i2c_core.c
arch/arm/include/asm/global_data.h +3 -0
index f8088fe..bc97520 100644
@@ -82,6 +82,9 @@ typedef	struct	global_data {
 	unsigned long	post_log_res; /* success of POST test */
 	unsigned long	post_init_f_time; /* When post_init_f started */
 #endif
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/avr32/include/asm/global_data.h +3 -0
index 7878bb1..e7da6e4 100644
@@ -48,6 +48,9 @@ typedef	struct	global_data {
 #endif
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/blackfin/include/asm/global_data.h +3 -1
index 290a9e7..f08f493 100644
@@ -54,9 +54,11 @@ typedef struct global_data {
 	unsigned long post_log_res; 	/* success of POST test */
 	unsigned long post_init_f_time;	/* When post_init_f started */
 #endif
-
 	void	**jt;			/* jump table */
 	char	env_buf[32];		/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/m68k/include/asm/global_data.h +3 -0
index cd55b83..e976bbf 100644
@@ -66,6 +66,9 @@ typedef	struct	global_data {
 #endif
 	void		**jt;		/* Standalone app jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/microblaze/include/asm/global_data.h +3 -0
index de3b8db..eb5ded5 100644
@@ -46,6 +46,9 @@ typedef	struct	global_data {
 	unsigned long	fb_base;	/* base address of frame buffer */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/mips/include/asm/global_data.h +3 -0
index 6e2cdc7..ad23587 100644
@@ -59,6 +59,9 @@ typedef	struct	global_data {
 	unsigned long	env_valid;	/* Checksum of Environment valid? */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/nds32/include/asm/global_data.h +3 -0
index 94bd4c2..bac218e 100644
@@ -63,6 +63,9 @@ typedef	struct global_data {
 
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/nios2/include/asm/global_data.h +3 -0
index 3b0d9e6..e4c36dc 100644
@@ -42,6 +42,9 @@ typedef	struct	global_data {
 #endif
 	void		**jt;		/* Standalone app jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/powerpc/include/asm/global_data.h +3 -0
index 5a5877f..f063be9 100644
@@ -182,6 +182,9 @@ typedef	struct	global_data {
 #endif
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/sh/include/asm/global_data.h +3 -0
index 6e534ad..1929352 100644
@@ -42,6 +42,9 @@ typedef	struct global_data
 	unsigned long	env_valid;	/* Checksum of Environment valid */
 	void		**jt;		/* Standalone app jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/sparc/include/asm/global_data.h +3 -0
index 93d3cc0..71432aa 100644
@@ -74,6 +74,9 @@ typedef struct global_data {
 #endif
 	void	**jt;			/* jump table */
 	char	env_buf[32];		/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 #include <asm-generic/global_data_flags.h>
arch/x86/include/asm/global_data.h +3 -0
index 6d29c0b..88e9d6c 100644
@@ -57,6 +57,9 @@ typedef	struct global_data {
 	unsigned long	reset_status;	/* reset status register at boot */
 	void		**jt;		/* jump table */
 	char		env_buf[32];	/* buffer for getenv() before reloc. */
+#if defined(CONFIG_SYS_I2C)
+	void		*cur_i2c_bus;	/* current used i2c bus */
+#endif
 } gd_t;
 
 static inline gd_t *get_fs_gd_ptr(void)
drivers/i2c/Makefile +1 -0
index 5dbdbe3..6373306 100644
@@ -46,6 +46,7 @@ COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o
 COBJS-$(CONFIG_U8500_I2C) += u8500_i2c.o
 COBJS-$(CONFIG_SH_I2C) += sh_i2c.o
 COBJS-$(CONFIG_SH_SH7734_I2C) += sh_sh7734_i2c.o
+COBJS-$(CONFIG_SYS_I2C) += i2c_core.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
drivers/i2c/i2c_core.c new file +363 -0

363 lines not on this page · raw message

include/i2c.h +188 -8

226 lines not on this page · raw message

Signature · 1 line
1.7.7.6
#2 lore raw

PATCH 2/3 i2c: common changes for multibus/multiadapter support

In reply to Heiko Schocher
---
 README                          |   82 ++++++++++++++++++++++++++-
 arch/arm/lib/board.c            |   12 ++++-
 arch/blackfin/lib/board.c       |    7 ++
 arch/m68k/lib/board.c           |   18 +++++-
 arch/mips/lib/board.c           |    7 ++
 arch/nds32/lib/board.c          |   10 +++-
 arch/powerpc/cpu/mpc8xx/video.c |    4 +
 arch/powerpc/lib/board.c        |   18 +++++-
 common/cmd_date.c               |    9 +++
 common/cmd_dtt.c                |    9 +++
 common/cmd_i2c.c                |  118 ++++++++++++++++++++++++++-------------
 common/env_eeprom.c             |   14 +++++
 common/stdio.c                  |   13 ++++-
 include/i2c.h                   |    9 ---
 14 files changed, 269 insertions(+), 61 deletions(-)
README +79 -3
index df4aed1..634cff4 100644
@@ -1757,9 +1757,85 @@ The following options need to be configured:
 		on those systems that support this (optional)
 		feature, like the TQM8xxL modules.
 
-- I2C Support:	CONFIG_HARD_I2C | CONFIG_SOFT_I2C
-
-		These enable I2C serial bus commands. Defining either of
+- I2C Support:	CONFIG_SYS_I2C
+
+		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.
+
+		additional defines:
+
+		CONFIG_SYS_NUM_I2C_ADAPTERS
+		define how many i2c adapters you want to use on your
+		hardware. If you need only 1 i2c adapter, you can ommit
+		this define.
+
+		CONFIG_SYS_I2C_ADAPTERS
+		hold a list of adapters you want to use, for example:
+		{&soft_i2c_adap[0], &mpc5xxx_i2c_adap[0]}
+		with this configuration you have one soft_i2c adapter,
+		and one mpc5xxx i2c adapter.
+
+		No I2C adapters current suppor this new interface.
+
+		You need to define for each adapter a speed and a
+		slave address.
+
+		CONFIG_SYS_NUM_I2C_BUSSES
+		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.
+
+		CONFIG_SYS_I2C_BUSSES
+		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_BUSSES = 9:
+
+		 CONFIG_SYS_I2C_BUSSES	{{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
+
+- 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:
+			1. Heiko to fill in
+
+		** 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.
 
arch/arm/lib/board.c +11 -1
index 0b47ab3..b5b53f4 100644
@@ -74,7 +74,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
 
@@ -174,7 +175,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);
 }
@@ -559,6 +564,11 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	dataflash_print_info();
 #endif
 
+#if defined(CONFIG_SYS_I2C) && defined(CONFIG_SYS_I2C_ADAPTERS)
+	/* Adjust I2C subsystem pointers after relocation */
+	i2c_reloc_fixup();
+#endif
+
 	/* initialize environment */
 	env_relocate();
 
arch/blackfin/lib/board.c +7 -0
index e47b606..999857c 100644
@@ -37,6 +37,10 @@
 int post_flag;
 #endif
 
+#if defined(CONFIG_SYS_I2C_ADAPTERS)
+#include <i2c.h>
+#endif
+
 DECLARE_GLOBAL_DATA_PTR;
 
 __attribute__((always_inline))
@@ -364,6 +368,9 @@ void board_init_r(gd_t * id, ulong dest_addr)
 	mmc_initialize(bd);
 #endif
 
+#if defined(CONFIG_SYS_I2C_ADAPTERS)
+	i2c_reloc_fixup();
+#endif
 	/* relocate environment function pointers etc. */
 	env_relocate();
 
arch/m68k/lib/board.c +15 -3
index 67c9a13..ba8c957 100644
@@ -55,7 +55,8 @@
 #include <version.h>
 
 #if defined(CONFIG_HARD_I2C) || \
-    defined(CONFIG_SOFT_I2C)
+	defined(CONFIG_SOFT_I2C) || \
+	defined(CONFIG_SYS_I2C_ADAPTERS)
 #include <i2c.h>
 #endif
 
@@ -140,11 +141,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_ADAPTERS)
 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);
 }
@@ -176,7 +182,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_ADAPTERS)
 	init_func_i2c,
 #endif
 #if defined(CONFIG_HARD_SPI)
@@ -501,6 +508,11 @@ void board_init_r (gd_t *id, ulong dest_addr)
 	spi_init_r ();
 #endif
 
+#if defined(CONFIG_SYS_I2C) && defined(CONFIG_SYS_I2C_ADAPTERS)
+	/* Adjust I2C subsystem pointers after relocation */
+	i2c_reloc_fixup();
+#endif
+
 	/* relocate environment function pointers etc. */
 	env_relocate ();
 
arch/mips/lib/board.c +7 -0
index b14b33e..f274b0e 100644
@@ -35,6 +35,9 @@
 #ifdef CONFIG_BITBANGMII
 #include <miiphy.h>
 #endif
+#if defined(CONFIG_SYS_I2C_ADAPTERS)
+#include <i2c.h>
+#endif
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -309,6 +312,10 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	onenand_init();
 #endif
 
+#if defined(CONFIG_SYS_I2C_ADAPTERS)
+	i2c_reloc_fixup();
+#endif
+
 	/* relocate environment function pointers etc. */
 	env_relocate();
 
arch/nds32/lib/board.c +9 -1
index 89900fe..e5d3870 100644
@@ -39,6 +39,10 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#if defined(CONFIG_SYS_I2C)
+#include <i2c.h>
+#endif
+
 ulong monitor_flash_len;
 
 /*
@@ -172,7 +176,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 */
@@ -358,6 +362,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();
 
arch/powerpc/cpu/mpc8xx/video.c +4 -0
index 1bbf4cc..10e3e88 100644
@@ -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 */
arch/powerpc/lib/board.c +15 -3
index b860141..0cd3408 100644
@@ -99,7 +99,8 @@ extern void sc3_read_eeprom(void);
 void doc_init(void);
 #endif
 #if defined(CONFIG_HARD_I2C) || \
-    defined(CONFIG_SOFT_I2C)
+	defined(CONFIG_SOFT_I2C) || \
+	defined(CONFIG_SYS_I2C_ADAPTERS)
 #include <i2c.h>
 #endif
 #include <spi.h>
@@ -214,11 +215,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_ADAPTERS)
 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;
 }
@@ -317,7 +323,8 @@ 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_ADAPTERS)
 	init_func_i2c,
 #endif
 #if defined(CONFIG_HARD_SPI)
@@ -814,6 +821,11 @@ void board_init_r(gd_t *id, ulong dest_addr)
 	mmc_initialize(bd);
 #endif
 
+#if defined(CONFIG_SYS_I2C) && defined(CONFIG_SYS_I2C_ADAPTERS)
+	/* Adjust I2C subsystem pointers after relocation */
+	i2c_reloc_fixup();
+#endif
+
 	/* relocate environment function pointers etc. */
 	env_relocate();
 
common/cmd_date.c +9 -0
index 335bc05..d454974 100644
@@ -50,8 +50,13 @@ 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 @@ 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;
 }
common/cmd_dtt.c +9 -0
index cd94423..cb73614 100644
@@ -69,8 +69,13 @@ int do_dtt (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 	/* 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();
 
@@ -82,7 +87,11 @@ int do_dtt (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
 		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
 
 	return 0;
 }	/* do_dtt() */
common/cmd_i2c.c +78 -40

216 lines not on this page · raw message

common/env_eeprom.c +14 -0
index b66bba2..9a0b4c3 100644
@@ -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);
common/stdio.c +12 -1
index 605ff3f..9b2e6b2 100644
@@ -1,4 +1,8 @@
 /*
+ * Copyright (C) 2009 Sergey Kubushyn <[email protected]>
+ *
+ * Changes for multibus/multiadapter I2C support.
+ *
  * (C) Copyright 2000
  * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio at 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
 
@@ -211,9 +216,15 @@ int stdio_init (void)
 #ifdef CONFIG_ARM_DCC_MULTI
 	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
include/i2c.h +0 -9
index 44a05cd..afb4409 100644
@@ -202,15 +202,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.
Signature · 1 line
1.7.7.6
#3 lore raw

PATCH 2/3 i2c: common changes for multibus/multiadapter support

m?n 2012-10-22 klockan 19:40 +0200 skrev Heiko Schocher:

README The following options need to be configured: · line 1834

Quoted 5 lines

+- Legacy I2C Support: CONFIG_HARD_I2C | CONFIG_SOFT_I2C

README +4 -0
+
+		NOTE: It is intended to move drivers to CONFIG_SYS_I2C which
+		provides the following compelling advantages:
+			1. Heiko to fill in

Something missing here?

Regards
Henrik

#4 lore raw

PATCH 2/3 i2c: common changes for multibus/multiadapter support

Hello Henrik Nordstr?m,

Quoted 8 lines · Henrik Nordstr?m

m?n 2012-10-22 klockan 19:40 +0200 skrev Heiko Schocher:

README The following options need to be configured: · line 1834

Quoted 5 lines

+- Legacy I2C Support: CONFIG_HARD_I2C | CONFIG_SOFT_I2C

README +4 -0
+
+		NOTE: It is intended to move drivers to CONFIG_SYS_I2C which
+		provides the following compelling advantages:
+			1. Heiko to fill in

Something missing here?

Oh... this is removed in the 3/3 patch. Update this in the next patchversion, thanks!

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#5 lore raw

PATCH 3/3 i2c, soft-i2c: switch to new multibus/multiadapter support

In reply to Heiko Schocher

- added to soft_i2c driver new multibus/multiadpater support
- adapted all config files, which uses this driver

---
 README                                    |   25 ++++---
 arch/arm/lib/board.c                      |    5 +-
 arch/m68k/lib/board.c                     |    9 +--
 arch/powerpc/lib/board.c                  |   10 +--
 board/BuS/eb_cpux9k2/cpux9k2.c            |    2 +-
 board/BuS/vl_ma2sc/vl_ma2sc.c             |    2 +-
 board/atc/atc.c                           |    2 +-
 board/bluewater/snapper9260/snapper9260.c |    2 +-
 board/cm5200/cm5200.c                     |    4 +-
 board/cpu86/cpu86.c                       |    2 +-
 board/cpu87/cpu87.c                       |    2 +-
 board/emk/top9000/top9000.c               |    8 +-
 board/eukrea/cpuat91/cpuat91.c            |    2 +-
 board/freescale/m52277evb/README          |    2 +-
 board/freescale/m53017evb/README          |    2 +-
 board/freescale/m5373evb/README           |    2 +-
 board/freescale/m54455evb/README          |    2 +-
 board/freescale/m547xevb/README           |    2 +-
 board/ids8247/ids8247.c                   |    2 +-
 board/keymile/common/common.c             |    3 +-
 board/keymile/common/ivm.c                |   15 +++-
 board/keymile/km82xx/km82xx.c             |    2 +-
 board/keymile/km_arm/km_arm.c             |    8 +-
 board/lwmon/lwmon.c                       |    2 +-
 board/lwmon/pcmcia.c                      |    4 +-
 board/pm826/pm826.c                       |    2 +-
 board/pm828/pm828.c                       |    2 +-
 board/sacsng/ioconfig.h                   |    2 +-
 board/sandburst/karef/karef.c             |    1 -
 board/siemens/SCM/scm.c                   |    2 +-
 board/tqc/tqm8260/tqm8260.c               |    2 +-
 board/tqc/tqm8272/tqm8272.c               |    2 +-
 board/tqc/tqm8272/tqm8272.h               |    2 +-
 common/cmd_eeprom.c                       |    3 +-
 common/stdio.c                            |    5 +-
 drivers/i2c/Makefile                      |    2 +-
 drivers/i2c/i2c_core.c                    |    4 +
 drivers/i2c/soft_i2c.c                    |  122 +++++++++++++++++++----------
 include/configs/A3000.h                   |    4 +-
 include/configs/BSC9131RDB.h              |    1 -
 include/configs/CANBT.h                   |    4 +
 include/configs/CPU86.h                   |    9 +-
 include/configs/CPU87.h                   |    9 +-
 include/configs/DU440.h                   |    1 -
 include/configs/GEN860T.h                 |   36 +++++----
 include/configs/HIDDEN_DRAGON.h           |   10 ++-
 include/configs/IAD210.h                  |   12 ++-
 include/configs/ICU862.h                  |   14 ++--
 include/configs/IDS8247.h                 |   10 +-
 include/configs/IP860.h                   |   10 +-
 include/configs/IPHASE4539.h              |   12 +--
 include/configs/JSE.h                     |    1 -
 include/configs/KAREF.h                   |    1 -
 include/configs/KUP4K.h                   |   12 +--
 include/configs/KUP4X.h                   |   14 ++--
 include/configs/M5208EVBE.h               |    1 -
 include/configs/M52277EVB.h               |    1 -
 include/configs/M5235EVB.h                |    1 -
 include/configs/M5271EVB.h                |    1 -
 include/configs/M5275EVB.h                |    1 -
 include/configs/M53017EVB.h               |    1 -
 include/configs/M5329EVB.h                |    1 -
 include/configs/M5373EVB.h                |    1 -
 include/configs/M54451EVB.h               |    1 -
 include/configs/M54455EVB.h               |    1 -
 include/configs/M5475EVB.h                |    1 -
 include/configs/M5485EVB.h                |    1 -
 include/configs/METROBOX.h                |    1 -
 include/configs/MHPC.h                    |    9 +-
 include/configs/MPC8323ERDB.h             |    1 -
 include/configs/MPC832XEMDS.h             |    1 -
 include/configs/MPC8349EMDS.h             |    1 -
 include/configs/MPC8349ITX.h              |    2 -
 include/configs/MPC8360EMDS.h             |    1 -
 include/configs/MPC8360ERDK.h             |    1 -
 include/configs/MPC837XEMDS.h             |    1 -
 include/configs/MPC837XERDB.h             |    1 -
 include/configs/MPC8536DS.h               |    1 -
 include/configs/MPC8540ADS.h              |    1 -
 include/configs/MPC8541CDS.h              |    1 -
 include/configs/MPC8544DS.h               |    1 -
 include/configs/MPC8548CDS.h              |    3 +-
 include/configs/MPC8555CDS.h              |    1 -
 include/configs/MPC8560ADS.h              |    1 -
 include/configs/MPC8568MDS.h              |    1 -
 include/configs/MPC8569MDS.h              |    1 -
 include/configs/MPC8572DS.h               |    1 -
 include/configs/MPC8610HPCD.h             |    1 -
 include/configs/MPC8641HPCN.h             |    1 -
 include/configs/P1010RDB.h                |    1 -
 include/configs/P1023RDS.h                |    1 -
 include/configs/P1_P2_RDB.h               |    1 -
 include/configs/P2020COME.h               |    1 -
 include/configs/PM826.h                   |    9 +-
 include/configs/PM828.h                   |    9 +-
 include/configs/PMC440.h                  |    1 -
 include/configs/R360MPI.h                 |    7 ++-
 include/configs/RPXClassic.h              |   16 +++--
 include/configs/RPXlite.h                 |   26 ++++++
 include/configs/RRvision.h                |   13 +--
 include/configs/SBC8540.h                 |    1 -
 include/configs/SCM.h                     |   11 +--
 include/configs/SXNI855T.h                |    8 +-
 include/configs/Sandpoint8240.h           |   10 ++-
 include/configs/Sandpoint8245.h           |   14 ++-
 include/configs/TASREG.h                  |   27 ++++---
 include/configs/TK885D.h                  |   13 +--
 include/configs/TOP5200.h                 |   15 ++--
 include/configs/TOP860.h                  |   11 ++-
 include/configs/TQM8260.h                 |    9 +-
 include/configs/TQM8272.h                 |   13 ++--
 include/configs/TQM834x.h                 |    1 -
 include/configs/TQM855M.h                 |   13 +--
 include/configs/TQM866M.h                 |   13 +--
 include/configs/TQM885D.h                 |   13 +--
 include/configs/alpr.h                    |    1 -
 include/configs/aria.h                    |    1 -
 include/configs/astro_mcf5373l.h          |    1 -
 include/configs/bf533-ezkit.h             |   10 ++-
 include/configs/bf533-stamp.h             |   47 ++++++++++-
 include/configs/bf561-ezkit.h             |    9 ++-
 include/configs/bfin_adi_common.h         |    2 +-
 include/configs/blackstamp.h              |    1 -
 include/configs/cpuat91.h                 |    1 -
 include/configs/debris.h                  |   10 ++-
 include/configs/eXalion.h                 |    2 +-
 include/configs/eb_cpux9k2.h              |   14 ++--
 include/configs/ep8260.h                  |   14 ++-
 include/configs/ethernut5.h               |    9 ++-
 include/configs/ibf-dsp561.h              |    5 +-
 include/configs/iocon.h                   |   11 ++-
 include/configs/km/keymile-common.h       |    3 -
 include/configs/km/km83xx-common.h        |    3 +
 include/configs/km/km_arm.h               |   26 +++++-
 include/configs/km82xx.h                  |   18 +++-
 include/configs/km_kirkwood.h             |   14 ++--
 include/configs/korat.h                   |    1 -
 include/configs/lwmon.h                   |   13 +--
 include/configs/lwmon5.h                  |    1 -
 include/configs/mecp5123.h                |    1 -
 include/configs/mpc5121ads.h              |    1 -
 include/configs/nhk8815.h                 |    8 ++-
 include/configs/otc570.h                  |   18 ++--
 include/configs/p1_p2_rdb_pc.h            |    1 -
 include/configs/p3p440.h                  |    1 -
 include/configs/pcs440ep.h                |    1 -
 include/configs/pdnb3.h                   |   11 +--
 include/configs/quad100hd.h               |    1 -
 include/configs/s5p_goni.h                |    7 +-
 include/configs/s5pc210_universal.h       |    7 +-
 include/configs/sacsng.h                  |   12 +--
 include/configs/sbc405.h                  |    1 -
 include/configs/sbc8349.h                 |    1 -
 include/configs/sbc8548.h                 |    1 -
 include/configs/sbc8560.h                 |    1 -
 include/configs/sbc8641d.h                |    1 -
 include/configs/sc3.h                     |    1 -
 include/configs/snapper9260.h             |    9 +-
 include/configs/socrates.h                |    1 -
 include/configs/spc1920.h                 |   13 +--
 include/configs/stxgp3.h                  |    1 -
 include/configs/stxssa.h                  |    1 -
 include/configs/top9000.h                 |   10 ++-
 include/configs/trats.h                   |    7 +-
 include/configs/u8500_href.h              |    1 -
 include/configs/uc100.h                   |   13 +--
 include/configs/utx8245.h                 |    3 +-
 include/configs/vct.h                     |   12 ++--
 include/configs/vl_ma2sc.h                |    7 +-
 include/configs/vme8349.h                 |    1 -
 include/configs/zeus.h                    |    1 -
 include/i2c.h                             |    9 ++
 172 files changed, 619 insertions(+), 496 deletions(-)
README +15 -10
index 634cff4..ded3d86 100644
@@ -1779,7 +1779,9 @@ The following options need to be configured:
 		with this configuration you have one soft_i2c adapter,
 		and one mpc5xxx i2c adapter.
 
-		No I2C adapters current suppor this new interface.
+		!! Only the soft i2c adapter currently supports this
+		new interface. Other i2c adapters should be converted
+		to it ...
 
 		You need to define for each adapter a speed and a
 		slave address.
@@ -1818,20 +1820,23 @@ The following options need to be configured:
 
 		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 1 on adapter 0 with a PCA9547 on address 0x70 port 1
+			bus 2 on adapter 0 with a PCA9547 on address 0x70 port 2
+			bus 3 on adapter 0 with a PCA9547 on address 0x70 port 3
+			bus 4 on adapter 0 with a PCA9547 on address 0x70 port 4
+			bus 5 on adapter 0 with 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
+			bus 7 on adapter 1 with a PCA9544 on address 0x72 port 1
+			bus 8 on adapter 1 with a PCA9544 on address 0x72 port 2
 
 - 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:
-			1. Heiko to fill in
+
+		- more than one i2c adapter is usable
+		- approved multibus support
+		- better i2c mux support
 
 		** Please consider updating your I2C driver now. **
 
@@ -3222,7 +3227,7 @@ to save the current settings.
 	  I2C muxes, you can define here, how to reach this
 	  EEPROM. For example:
 
-	  #define CONFIG_I2C_ENV_EEPROM_BUS	  "pca9547:70:d\0"
+	  #define CONFIG_I2C_ENV_EEPROM_BUS	  1
 
 	  EEPROM which holds the environment, is reached over
 	  a pca9547 i2c mux with address 0x70, channel 3.
arch/arm/lib/board.c +2 -3
index b5b53f4..96d7337 100644
@@ -74,7 +74,6 @@ extern void dataflash_print_info(void);
 #endif
 
 #if defined(CONFIG_HARD_I2C) || \
-	defined(CONFIG_SOFT_I2C) || \
 	defined(CONFIG_SYS_I2C)
 #include <i2c.h>
 #endif
@@ -171,7 +170,7 @@ static int display_dram_config(void)
 	return (0);
 }
 
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
 static int init_func_i2c(void)
 {
 	puts("I2C:   ");
@@ -263,7 +262,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 */
arch/m68k/lib/board.c +3 -6
index ba8c957..6554f74 100644
@@ -55,8 +55,7 @@
 #include <version.h>
 
 #if defined(CONFIG_HARD_I2C) || \
-	defined(CONFIG_SOFT_I2C) || \
-	defined(CONFIG_SYS_I2C_ADAPTERS)
+	defined(CONFIG_SYS_I2C)
 #include <i2c.h>
 #endif
 
@@ -141,8 +140,7 @@ static int init_func_ram (void)
 
 /***********************************************************************/
 
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) \
-		|| defined(CONFIG_SYS_I2C_ADAPTERS)
+#if defined(CONFIG_HARD_I2C) ||	defined(CONFIG_SYS_I2C)
 static int init_func_i2c (void)
 {
 	puts ("I2C:   ");
@@ -182,8 +180,7 @@ init_fnc_t *init_sequence[] = {
 	display_options,
 	checkcpu,
 	checkboard,
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) \
-		|| defined(CONFIG_SYS_I2C_ADAPTERS)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
 	init_func_i2c,
 #endif
 #if defined(CONFIG_HARD_SPI)
arch/powerpc/lib/board.c +3 -7
index 0cd3408..fa96975 100644
@@ -98,9 +98,7 @@ extern void sc3_read_eeprom(void);
 #if defined(CONFIG_CMD_DOC)
 void doc_init(void);
 #endif
-#if defined(CONFIG_HARD_I2C) || \
-	defined(CONFIG_SOFT_I2C) || \
-	defined(CONFIG_SYS_I2C_ADAPTERS)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
 #include <i2c.h>
 #endif
 #include <spi.h>
@@ -215,8 +213,7 @@ static int init_func_ram(void)
 
 /***********************************************************************/
 
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) \
-		|| defined(CONFIG_SYS_I2C_ADAPTERS)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
 static int init_func_i2c(void)
 {
 	puts("I2C:   ");
@@ -323,8 +320,7 @@ init_fnc_t *init_sequence[] = {
 	misc_init_f,
 #endif
 	INIT_FUNC_WATCHDOG_RESET
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) \
-		|| defined(CONFIG_SYS_I2C_ADAPTERS)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
 	init_func_i2c,
 #endif
 #if defined(CONFIG_HARD_SPI)
board/BuS/eb_cpux9k2/cpux9k2.c +1 -1
index e98244b..01b4382 100644
@@ -288,7 +288,7 @@ int drv_video_init(void)
 }
 #endif
 
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 
 void i2c_init_board(void)
 {
board/BuS/vl_ma2sc/vl_ma2sc.c +1 -1
index 84b2060..7e086ee 100644
@@ -323,7 +323,7 @@ int board_eth_init(bd_t *bis)
 	return rc;
 }
 
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 void i2c_init_board(void)
 {
 	u32 pin;
board/atc/atc.c +1 -1
index 936c031..c2b5a1f 100644
@@ -170,7 +170,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   0,   0,   0,   0,   0,   0   }, /* PD18 */
 	/* PD17 */ {   0,   0,   0,   0,   0,   0   }, /* PD17 */
 	/* PD16 */ {   0,   0,   0,   0,   0,   0   }, /* PD16 */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 #else
board/bluewater/snapper9260/snapper9260.c +1 -1
index 60c55e9..b4378db 100644
@@ -145,7 +145,7 @@ int board_init(void)
 
 	/* Initialise peripherals */
 	at91_seriald_hw_init();
-	i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+	i2c_set_bus_num(0);
 	nand_hw_init();
 	macb_hw_init();
 
board/cm5200/cm5200.c +2 -2
index b25887b..55157d8 100644
@@ -326,7 +326,7 @@ int board_early_init_r(void)
 #ifdef CONFIG_MISC_INIT_R
 int misc_init_r(void)
 {
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C_SOFT)
 	uchar buf[6];
 	char str[18];
 	char hostname[MODULE_NAME_MAXLEN];
@@ -349,7 +349,7 @@ int misc_init_r(void)
 			" device at address %02X:%04X\n", CONFIG_SYS_I2C_EEPROM,
 			CONFIG_MAC_OFFSET);
 	}
-#endif /* defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) */
+#endif /* defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C_SOFT) */
 	if (!getenv("ethaddr"))
 		printf(LOG_PREFIX "MAC address not set, networking is not "
 					"operational\n");
board/cpu86/cpu86.c +1 -1
index bc7ebfe..1d4f90c 100644
@@ -161,7 +161,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   0,   0,   0,   0,   0,   0   }, /* PD18 */
 	/* PD17 */ {   0,   0,   0,   0,   0,   0   }, /* PD17 */
 	/* PD16 */ {   0,   0,   0,   0,   0,   0   }, /* PD16 */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 #else
board/cpu87/cpu87.c +1 -1
index 057a34c..7c591be 100644
@@ -163,7 +163,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   0,   0,   0,   0,   0,   0   }, /* PD18 */
 	/* PD17 */ {   0,   0,   0,   0,   0,   0   }, /* PD17 */
 	/* PD16 */ {   0,   0,   0,   0,   0,   0   }, /* PD16 */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 #else
board/emk/top9000/top9000.c +4 -4
index 86a8d0b..c0609f0 100644
@@ -245,7 +245,7 @@ int board_eth_init(bd_t *bis)
  * However i2c_get_bus_num() cannot be called before
  * relocation.
  */
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 void iic_init(void)
 {
 	/* ports are now initialized in board_early_init_f() */
@@ -253,7 +253,7 @@ void iic_init(void)
 
 int iic_read(void)
 {
-	switch ((gd->flags & GD_FLG_RELOC) ? i2c_get_bus_num() : 0) {
+	switch (I2C_ADAP_HWNR) {
 	case 0:
 		return at91_get_pio_value(I2C0_PORT, SDA0_PIN);
 	case 1:
@@ -264,7 +264,7 @@ int iic_read(void)
 
 void iic_sda(int bit)
 {
-	switch ((gd->flags & GD_FLG_RELOC) ? i2c_get_bus_num() : 0) {
+	switch (I2C_ADAP_HWNR) {
 	case 0:
 		at91_set_pio_value(I2C0_PORT, SDA0_PIN, bit);
 		break;
@@ -276,7 +276,7 @@ void iic_sda(int bit)
 
 void iic_scl(int bit)
 {
-	switch ((gd->flags & GD_FLG_RELOC) ? i2c_get_bus_num() : 0) {
+	switch (I2C_ADAP_HWNR) {
 	case 0:
 		at91_set_pio_value(I2C0_PORT, SCL0_PIN, bit);
 		break;
board/eukrea/cpuat91/cpuat91.c +1 -1
index c74c3fc..5dde274 100644
@@ -73,7 +73,7 @@ int board_eth_init(bd_t *bis)
 }
 #endif
 
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 void i2c_init_board(void)
 {
 	u32 pin;
board/freescale/m52277evb/README +1 -1
index b6e955b..d5e7b05 100644
@@ -84,7 +84,7 @@ CONFIG_MCFPIT		-- define to use PIT timer
 
 CONFIG_FSL_I2C		-- define to use FSL common I2C driver
 CONFIG_HARD_I2C		-- define for I2C hardware support
-CONFIG_SOFT_I2C		-- define for I2C bit-banged
+CONFIG_SYS_I2C_SOFT	-- define for I2C bit-banged
 CONFIG_SYS_I2C_SPEED		-- define for I2C speed
 CONFIG_SYS_I2C_SLAVE		-- define for I2C slave address
 CONFIG_SYS_I2C_OFFSET		-- define for I2C base address offset
board/freescale/m53017evb/README +1 -1
index 64a3d42..855bbd1 100644
@@ -92,7 +92,7 @@ CONFIG_MCFPIT			-- define to use PIT timer
 
 CONFIG_FSL_I2C			-- define to use FSL common I2C driver
 CONFIG_HARD_I2C			-- define for I2C hardware support
-CONFIG_SOFT_I2C			-- define for I2C bit-banged
+CONFIG_SYS_I2C_SOFT		-- define for I2C bit-banged
 CONFIG_SYS_I2C_SPEED		-- define for I2C speed
 CONFIG_SYS_I2C_SLAVE		-- define for I2C slave address
 CONFIG_SYS_I2C_OFFSET		-- define for I2C base address offset
board/freescale/m5373evb/README +1 -1
index 419d4d6..61e6d97 100644
@@ -91,7 +91,7 @@ CONFIG_MCFPIT		-- define to use PIT timer
 
 CONFIG_FSL_I2C		-- define to use FSL common I2C driver
 CONFIG_HARD_I2C		-- define for I2C hardware support
-CONFIG_SOFT_I2C		-- define for I2C bit-banged
+CONFIG_SYS_I2C_SOFT	-- define for I2C bit-banged
 CONFIG_SYS_I2C_SPEED		-- define for I2C speed
 CONFIG_SYS_I2C_SLAVE		-- define for I2C slave address
 CONFIG_SYS_I2C_OFFSET		-- define for I2C base address offset
board/freescale/m54455evb/README +1 -1
index 2bc6ce4..2b25952 100644
@@ -114,7 +114,7 @@ CONFIG_MCFPIT		-- define to use PIT timer
 
 CONFIG_FSL_I2C		-- define to use FSL common I2C driver
 CONFIG_HARD_I2C		-- define for I2C hardware support
-CONFIG_SOFT_I2C		-- define for I2C bit-banged
+CONFIG_SYS_I2C_SOFT	-- define for I2C bit-banged
 CONFIG_SYS_I2C_SPEED		-- define for I2C speed
 CONFIG_SYS_I2C_SLAVE		-- define for I2C slave address
 CONFIG_SYS_I2C_OFFSET		-- define for I2C base address offset
board/freescale/m547xevb/README +1 -1
index d3aec20..1a8cbce 100644
@@ -99,7 +99,7 @@ CONFIG_SLTTMR		-- define to use SLT timer
 
 CONFIG_FSL_I2C		-- define to use FSL common I2C driver
 CONFIG_HARD_I2C		-- define for I2C hardware support
-CONFIG_SOFT_I2C		-- define for I2C bit-banged
+CONFIG_SYS_I2C_SOFT	-- define for I2C bit-banged
 CONFIG_SYS_I2C_SPEED		-- define for I2C speed
 CONFIG_SYS_I2C_SLAVE		-- define for I2C slave address
 CONFIG_SYS_I2C_OFFSET		-- define for I2C base address offset
board/ids8247/ids8247.c +1 -1
index 02db07f..541d7d6 100644
@@ -51,7 +51,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PA27 */ {   1,   1,	 1,   0,   0,	0   }, /* FCC1 RXDV */
 	/* PA26 */ {   1,   1,	 1,   0,   0,	0   }, /* FCC1 RXER */
 	/* PA25 */ {   0,   0,	 0,   0,   1,	0   }, /* 8247_P0 */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PA24 */ {   1,   0,	 0,   0,   1,	1   }, /* I2C_SDA2 */
 	/* PA23 */ {   1,   0,	 0,   1,   1,	1   }, /* I2C_SCL2 */
 #else /* normal I/O port pins */
board/keymile/common/common.c +2 -1
index a90f112..4de2519 100644
@@ -38,7 +38,8 @@
 #include "post.h"
 #endif
 #include "common.h"
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_ADAPTERS) || defined(CONFIG_HARD_I2C) || \
+	defined(CONFIG_SYS_I2C_SOFT)
 #include <i2c.h>
 #endif
 
board/keymile/common/ivm.c +10 -5
index eaa924f..e6187a5 100644
@@ -306,18 +306,22 @@ int ivm_read_eeprom(void)
 	I2C_MUX_DEVICE *dev = NULL;
 #endif
 	uchar i2c_buffer[CONFIG_SYS_IVM_EEPROM_MAX_LEN];
-	uchar	*buf;
+	char	*buf;
 	unsigned long dev_addr = CONFIG_SYS_IVM_EEPROM_ADR;
 	int ret;
 
+#if defined(CONFIG_SYS_I2C)
+	buf = getenv("EEprom_ivm");
+	i2c_set_bus_num(buf ? (int)simple_strtol(buf, NULL, 10) : 0);
+#else
 #if defined(CONFIG_I2C_MUX)
 	/* First init the Bus, select the Bus */
 #if defined(CONFIG_SYS_I2C_IVM_BUS)
 	dev = i2c_mux_ident_muxstring((uchar *)CONFIG_SYS_I2C_IVM_BUS);
 #else
-	buf = (unsigned char *) getenv("EEprom_ivm");
+	buf = getenv("EEprom_ivm");
 	if (buf != NULL)
-		dev = i2c_mux_ident_muxstring(buf);
+		dev = i2c_mux_ident_muxstring((unsigned char *)buf);
 #endif
 	if (dev == NULL) {
 		printf("Error couldnt add Bus for IVM\n");
@@ -325,10 +329,11 @@ int ivm_read_eeprom(void)
 	}
 	i2c_set_bus_num(dev->busid);
 #endif
+#endif /* defined(CONFIG_SYS_I2C) */
 
-	buf = (unsigned char *) getenv("EEprom_ivm_addr");
+	buf = getenv("EEprom_ivm_addr");
 	if (buf != NULL) {
-		ret = strict_strtoul((char *)buf, 16, &dev_addr);
+		ret = strict_strtoul(buf, 16, &dev_addr);
 		if (ret != 0)
 			return -3;
 	}
board/keymile/km82xx/km82xx.c +1 -1
index 67b69f6..744d7fc 100644
@@ -31,7 +31,7 @@
 #include <libfdt.h>
 #endif
 
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C_SOFT)
 #include <i2c.h>
 #endif
 
board/keymile/km_arm/km_arm.c +4 -4
index 0c4dddc..9c820be 100644
@@ -63,7 +63,7 @@ u32 kwmpp_config[] = {
 	MPP5_NF_IO7,
 	MPP6_SYSRST_OUTn,
 	MPP7_PEX_RST_OUTn,
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	MPP8_GPIO,		/* SDA */
 	MPP9_GPIO,		/* SCL */
 #endif
@@ -243,7 +243,7 @@ int misc_init_r(void)
 
 int board_early_init_f(void)
 {
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	u32 tmp;
 
 	/* set the 2 bitbang i2c pins as output gpios */
@@ -274,7 +274,7 @@ int board_init(void)
 	kw_gpio_set_valid(KM_FLASH_GPIO_PIN, 1);
 	kw_gpio_direction_output(KM_FLASH_GPIO_PIN, 1);
 
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/*
 	 * Reinit the GPIO for I2C Bitbang driver so that the now
 	 * available gpio framework is consistent. The calls to
@@ -454,7 +454,7 @@ int hush_init_var(void)
 }
 #endif
 
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 void set_sda(int state)
 {
 	I2C_ACTIVE;
board/lwmon/lwmon.c +1 -1
index b5e524b..3a27637 100644
@@ -480,7 +480,7 @@ static void kbd_init (void)
 	uchar val, errcd;
 	int i;
 
-	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+	i2c_set_bus_num(0);
 
 	gd->kbd_status = 0;
 
board/lwmon/pcmcia.c +2 -2
index acbb9d5..b9894cf 100644
@@ -104,7 +104,7 @@ int pcmcia_hardware_enable(int slot)
 
 	/*  switch VCC on */
 	val |= MAX1604_OP_SUS | MAX1604_VCCBON;
-	i2c_init  (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+	i2c_set_bus_num(0);
 	i2c_write (CONFIG_SYS_I2C_POWER_A_ADDR, 0, 0, &val, 1);
 
 	udelay(500000);
@@ -193,7 +193,7 @@ int pcmcia_voltage_set(int slot, int vcc, int vpp)
 	 */
 	debug ("PCMCIA power OFF\n");
 	val  = MAX1604_VCCBHIZ | MAX1604_VPPBHIZ;
-	i2c_init  (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
+	i2c_set_bus_num(0);
 	i2c_write (CONFIG_SYS_I2C_POWER_A_ADDR, 0, 0, &val, 1);
 
 	val = 0;
board/pm826/pm826.c +1 -1
index 19e7a00..17b4ac9 100644
@@ -169,7 +169,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD18 */
 	/* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* PD17 */
 	/* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* PD16 */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 #else
board/pm828/pm828.c +1 -1
index 4a3b2fd..5e68d4d 100644
@@ -169,7 +169,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD18 */
 	/* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* PD17 */
 	/* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* PD16 */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 #else
board/sacsng/ioconfig.h +1 -1
index be1ce7c..ac8f152 100644
@@ -187,7 +187,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD17 */ { CONF, SPEC,   1,  DOUT, ACTV,   0   }, /* SPI_MOSI       */
 	/* PD16 */ { CONF, SPEC,   1,  DIN,  ACTV,   0   }, /* SPI_MISO       */
 #endif
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ { CONF, GPIO,   0,  DOUT, OPEN,   1   }, /* I2C_SDA        */
 	/* PD14 */ { CONF, GPIO,   0,  DOUT, ACTV,   1   }, /* I2C_SCL        */
 #else
board/sandburst/karef/karef.c +0 -1
index 6457f9b..186998d 100644
@@ -32,7 +32,6 @@
 #include <spd_sdram.h>
 #include <i2c.h>
 #include "../common/sb_common.h"
-#include "../common/ppc440gx_i2c.h"
 #if defined(CONFIG_HAS_ETH0) || defined(CONFIG_HAS_ETH1) || \
     defined(CONFIG_HAS_ETH2) || defined(CONFIG_HAS_ETH3)
 #include <net.h>
board/siemens/SCM/scm.c +1 -1
index 461b56e..3319d60 100644
@@ -174,7 +174,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   1,   1,   1,   0,   0,   0   }, /* SPI SPICLK */
 	/* PD17 */ {   1,   1,   1,   0,   0,   0   }, /* SPI SPIMOSI */
 	/* PD16 */ {   1,   1,   1,   0,   0,   0   }, /* SPI SPIMOSO */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 #else
board/tqc/tqm8260/tqm8260.c +1 -1
index 65a3174..867b969 100644
@@ -160,7 +160,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */
 	/* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXPRTY */
 	/* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXPRTY */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,   0,   1,   1,   1   }, /* I2C SCL */
 #else
board/tqc/tqm8272/tqm8272.c +1 -1
index 5aca227..c874a7d 100644
@@ -180,7 +180,7 @@ const iop_conf_t iop_conf_tab[4][32] = {
 	/* PD18 */ {   0,   0,	 0,   1,   0,	0   }, /* PD19 */
 	/* PD17 */ {   0,   1,	 0,   0,   0,	0   }, /* FCC1 ATMRXPRTY */
 	/* PD16 */ {   0,   1,	 0,   1,   0,	0   }, /* FCC1 ATMTXPRTY */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
 	/* PD15 */ {   1,   0,	 0,   1,   1,	1   }, /* I2C SDA */
 	/* PD14 */ {   1,   0,	 0,   1,   1,	1   }, /* I2C SCL */
 #else
board/tqc/tqm8272/tqm8272.h +1 -1
index 6d558ec..91b86c9 100644
@@ -50,4 +50,4 @@ typedef struct{
 
 static HWIB_INFO	hwinf = {0, 0, 1, 0, 1, 0, 0, 0, 0, 8272, 0 ,0,
 			 0, 0, 0, 0, 0, 0};
-#endif
+#endif	/* __CONFIG_H */
common/cmd_eeprom.c +1 -2
index 4a43116..511d8b6 100644
@@ -406,8 +406,7 @@ void eeprom_init  (void)
 #if defined(CONFIG_SPI) && !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
 	spi_init_f ();
 #endif
-#if defined(CONFIG_HARD_I2C) || \
-    defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C_SOFT)
 	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
 #endif
 }
common/stdio.c +2 -3
index 9b2e6b2..b083376 100644
@@ -34,8 +34,7 @@
 #ifdef CONFIG_LOGBUFFER
 #include <logbuff.h>
 #endif
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) \
-		|| defined(CONFIG_SYS_I2C_ADAPTERS)
+#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
 #include <i2c.h>
 #endif
 
@@ -221,7 +220,7 @@ int stdio_init (void)
 	i2c_init_all();
 #endif
 #else
-#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_HARD_I2C)
 	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
 #endif
 #endif
drivers/i2c/Makefile +1 -1
index 6373306..3e69270 100644
@@ -40,13 +40,13 @@ COBJS-$(CONFIG_PCA9564_I2C) += pca9564_i2c.o
 COBJS-$(CONFIG_PPC4XX_I2C) += ppc4xx_i2c.o
 COBJS-$(CONFIG_DRIVER_S3C24X0_I2C) += s3c24x0_i2c.o
 COBJS-$(CONFIG_S3C44B0_I2C) += s3c44b0_i2c.o
-COBJS-$(CONFIG_SOFT_I2C) += soft_i2c.o
 COBJS-$(CONFIG_TEGRA_I2C) += tegra_i2c.o
 COBJS-$(CONFIG_TSI108_I2C) += tsi108_i2c.o
 COBJS-$(CONFIG_U8500_I2C) += u8500_i2c.o
 COBJS-$(CONFIG_SH_I2C) += sh_i2c.o
 COBJS-$(CONFIG_SH_SH7734_I2C) += sh_sh7734_i2c.o
 COBJS-$(CONFIG_SYS_I2C) += i2c_core.o
+COBJS-$(CONFIG_SYS_I2C_SOFT) += soft_i2c.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
drivers/i2c/i2c_core.c +4 -0
index cdb6a06..5a738d5 100644
@@ -6,6 +6,10 @@
 #include <common.h>
 #include <i2c.h>
 
+#ifdef CONFIG_SYS_I2C_SOFT
+extern struct i2c_adapter soft_i2c_adap[];
+#endif
+
 struct i2c_adapter *i2c_adap[CONFIG_SYS_NUM_I2C_ADAPTERS] =
 			CONFIG_SYS_I2C_ADAPTERS;
 
drivers/i2c/soft_i2c.c +79 -43

177 lines not on this page · raw message

include/configs/A3000.h +2 -2
index b85244a..848a93d 100644
@@ -86,8 +86,8 @@
  * PCI stuff
  *-----------------------------------------------------------------------
  */
-#define CONFIG_HARD_I2C		1		/* To enable I2C support	*/
-#undef	CONFIG_SOFT_I2C				/* I2C bit-banged		*/
+#define CONFIG_HARD_I2C		1		/* To enable I2C support */
+#undef	CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 
include/configs/BSC9131RDB.h +0 -1
index fd076e0..134cd7b 100644
@@ -241,7 +241,6 @@ extern unsigned long get_sdram_size(void);
 
 #define CONFIG_FSL_I2C			/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_I2C_CMD_TREE
 #define CONFIG_SYS_I2C_SPEED		400000 /* I2C speed and slave address*/
include/configs/CANBT.h +4 -0
index be9238e..d36cc89 100644
@@ -180,6 +180,10 @@
 /*-----------------------------------------------------------------------
  * I2C EEPROM (CAT24WC08) for environment
  */
+#if 0 /* Does not appear to be used?!  If it is used, needs to be fixed */
+#define CONFIG_SYS_I2C_SOFT		/* Software I2C support enabled */
+#endif
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1	/* Bytes of address		*/
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
include/configs/CPU86.h +5 -4
index 7ac182f..0a32523 100644
@@ -129,10 +129,11 @@
 /*-----------------------------------------------------------------------
  * I2C/EEPROM/RTC configuration
  */
-#define	CONFIG_SOFT_I2C			/* Software I2C support enabled	*/
-
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xFE
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
include/configs/CPU87.h +5 -4
index aa5ce29..516529b 100644
@@ -133,10 +133,11 @@
 /*-----------------------------------------------------------------------
  * I2C/EEPROM/RTC configuration
  */
-#define CONFIG_SOFT_I2C			/* Software I2C support enabled */
-
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xFE
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
include/configs/DU440.h +0 -1
index bbe2713..09876f5 100644
@@ -171,7 +171,6 @@
  * I2C
  */
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support    */
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged	        */
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		100000	/* I2C speed and slave address  */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/GEN860T.h +20 -16
index b98cacc..d281bad 100644
@@ -163,26 +163,30 @@
 /*
  * Enable I2C and select the hardware/software driver
  */
-#define CONFIG_HARD_I2C		1				/* CPM based I2C			*/
-#undef	CONFIG_SOFT_I2C						/* Bit-banged I2C			*/
+#define CONFIG_HARD_I2C		1		/* CPM based I2C */
+#undef	CONFIG_SYS_I2C_SOFT			/* Bit-banged I2C */
 
 #ifdef CONFIG_HARD_I2C
-#define	CONFIG_SYS_I2C_SPEED		100000			/* clock speed in Hz		*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE			/* I2C slave address		*/
+#define	CONFIG_SYS_I2C_SPEED		100000	/* clock speed in Hz */
+#define CONFIG_SYS_I2C_SLAVE		0xFE	/* I2C slave address */
 #endif
 
-#ifdef CONFIG_SOFT_I2C
-#define PB_SCL				0x00000020		/* PB 26					*/
-#define PB_SDA				0x00000010		/* PB 27					*/
-#define I2C_INIT			(immr->im_cpm.cp_pbdir |=  PB_SCL)
-#define I2C_ACTIVE			(immr->im_cpm.cp_pbdir |=  PB_SDA)
-#define I2C_TRISTATE		(immr->im_cpm.cp_pbdir &= ~PB_SDA)
-#define I2C_READ			((immr->im_cpm.cp_pbdat & PB_SDA) != 0)
-#define I2C_SDA(bit)		if(bit) immr->im_cpm.cp_pbdat |=  PB_SDA; \
-								else    immr->im_cpm.cp_pbdat &= ~PB_SDA
-#define I2C_SCL(bit)		if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
-								else    immr->im_cpm.cp_pbdat &= ~PB_SCL
-#define I2C_DELAY			udelay(5)		/* 1/4 I2C clock duration	*/
+#ifdef CONFIG_SYS_I2C_SOFT
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+#define PB_SCL		0x00000020		/* PB 26 */
+#define PB_SDA		0x00000010		/* PB 27 */
+#define I2C_INIT	(immr->im_cpm.cp_pbdir |=  PB_SCL)
+#define I2C_ACTIVE	(immr->im_cpm.cp_pbdir |=  PB_SDA)
+#define I2C_TRISTATE	(immr->im_cpm.cp_pbdir &= ~PB_SDA)
+#define I2C_READ	((immr->im_cpm.cp_pbdat & PB_SDA) != 0)
+#define I2C_SDA(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SDA; \
+				else    immr->im_cpm.cp_pbdat &= ~PB_SDA
+#define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
+				else    immr->im_cpm.cp_pbdat &= ~PB_SCL
+#define I2C_DELAY	udelay(5) /* 1/4 I2C clock duration */
 #endif
 
 /*
include/configs/HIDDEN_DRAGON.h +7 -3
index a62ef63..3e13dce 100644
@@ -168,12 +168,16 @@
  * configuration items that the driver uses to drive the port pins.
  */
 #define CONFIG_HARD_I2C		1		/* To enable I2C support	*/
-#undef	CONFIG_SOFT_I2C				/* I2C bit-banged		*/
+#undef	CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 #error "Soft I2C is not configured properly.  Please review!"
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define I2C_PORT		3		/* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE		(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE		(iop->pdir &= ~0x00010000)
@@ -183,7 +187,7 @@
 #define I2C_SCL(bit)		if(bit) iop->pdat |=  0x00020000; \
 				else	iop->pdat &= ~0x00020000
 #define I2C_DELAY		udelay(5)	/* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
+#endif /* CONFIG_SYS_I2C_SOFT */
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x57		/* EEPROM IS24C02		*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1		/* Bytes of address		*/
include/configs/IAD210.h +7 -5
index 94b05dc..7e15c1c 100644
@@ -111,11 +111,11 @@
 #define CONFIG_DOS_PARTITION
 
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support    */
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged               */
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xDD
-# define CONFIG_SYS_I2C_EEPROM_ADDR	0x50
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xDD
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -134,6 +134,8 @@
 
 #define	CONFIG_RTC_MPC8xx		/* use internal RTC of MPC8xx	*/
 
+#define CONFIG_SYS_I2C_EEPROM_ADDR	0x50
+
 
 /*
  * Command line configuration.
include/configs/ICU862.h +8 -6
index 81f219c..2bbe559 100644
@@ -106,12 +106,11 @@
 #define CONFIG_DOS_PARTITION
 
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xFE
-# define CONFIG_SYS_I2C_EEPROM_ADDR	0x50
-# define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1	/* Bytes of address		*/
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -133,6 +132,9 @@
 
 #define	CONFIG_RTC_MPC8xx		/* use internal RTC of MPC8xx	*/
 
+#define CONFIG_SYS_I2C_EEPROM_ADDR	0x50
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1	/* Bytes of address */
+
 
 /*
  * Command line configuration.
include/configs/IDS8247.h +5 -5
index 6d0937f..71ee069 100644
@@ -73,11 +73,11 @@
 #define CONFIG_MISC_INIT_R	1
 
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
include/configs/IP860.h +5 -5
index 2379718..9bd9fbf 100644
@@ -62,8 +62,11 @@
 
 
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -80,9 +83,6 @@
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(5)	/* 1/4 I2C clock duration */
 
-
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xFE
 # define CONFIG_SYS_I2C_EEPROM_ADDR	0x50	/* EEPROM X24C16		*/
 # define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1	/* bytes of address		*/
 /* mask of address bits that overflow into the "EEPROM chip address"    */
include/configs/IPHASE4539.h +5 -7
index 6dd9812..0f8c4d6 100644
@@ -110,15 +110,14 @@
  * If the software driver is chosen, there are some additional
  * configuration items that the driver uses to drive the port pins.
  */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
-#ifdef CONFIG_SOFT_I2C
 #define I2C_PORT	3		/* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE	(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE	(iop->pdir &= ~0x00010000)
@@ -128,7 +127,6 @@
 #define I2C_SCL(bit)	if(bit) iop->pdat |=  0x00020000; \
 			else    iop->pdat &= ~0x00020000
 #define I2C_DELAY	udelay(5)	/* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
 
 
 /*
include/configs/JSE.h +0 -1
index e0a0d8e..713dcca 100644
@@ -211,7 +211,6 @@
 #define CONFIG_SYS_HZ		1000		/* decrementer freq: 1 ms ticks */
 
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/KAREF.h +0 -1
index 546e28b..f8da14d 100644
@@ -134,7 +134,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C	      1		     /* I2C hardware support	*/
-#undef	CONFIG_SOFT_I2C			     /* I2C !bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED	      400000	     /* I2C speed 400kHz	*/
 #define CONFIG_SYS_I2C_SLAVE	      0x7F	     /* I2C slave address	*/
include/configs/KUP4K.h +5 -7
index c0035e6..0ac2789 100644
@@ -106,13 +106,12 @@
 /*
  * enable I2C and select the hardware/software driver
  */
-#undef	CONFIG_HARD_I2C		/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C		/* I2C bit-banged		*/
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 
-#define CONFIG_SYS_I2C_SPEED	93000	/* 93 kHz is supposed to work */
-#define CONFIG_SYS_I2C_SLAVE	0xFE
-
-#ifdef CONFIG_SOFT_I2C
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -128,7 +127,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 /*-----------------------------------------------------------------------
  * I2C Configuration
include/configs/KUP4X.h +7 -7
index 5084ccc..a0adf04 100644
@@ -114,13 +114,13 @@
 /*
  * enable I2C and select the hardware/software driver
  */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C         1	/* I2C bit-banged		*/
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
 
-#define CONFIG_SYS_I2C_SPEED		93000	/* 93 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -136,7 +136,7 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
+#endif	/* CONFIG_SYS_I2C_SOFT */
 
 
 /*-----------------------------------------------------------------------
include/configs/M5208EVBE.h +0 -1
index a1eaeff..209c122 100644
@@ -84,7 +84,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C			/* I2C with hw support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/M52277EVB.h +0 -1
index e4dea05..b1bdac2 100644
@@ -147,7 +147,6 @@
 /* I2c */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged               */
 #define CONFIG_SYS_I2C_SPEED		80000	/* I2C speed and slave address  */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/M5235EVB.h +0 -1
index 733aece..dfc2ddf 100644
@@ -101,7 +101,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hw support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x00000300
include/configs/M5271EVB.h +0 -1
index a5913df..e8a8998 100644
@@ -111,7 +111,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hw support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x00000300
include/configs/M5275EVB.h +0 -1
index 9c2a3bb..fbf0c9d 100644
@@ -111,7 +111,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hw support */
-#undef CONFIG_SOFT_I2C
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x00000300
include/configs/M53017EVB.h +0 -1
index 896d0d8..bedba2b 100644
@@ -103,7 +103,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C			/* I2C with hw support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/M5329EVB.h +0 -1
index 64f8302..06fa57c 100644
@@ -97,7 +97,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C			/* I2C with hw support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/M5373EVB.h +0 -1
index 4437bba..faa4f86 100644
@@ -97,7 +97,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hw support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/M54451EVB.h +0 -1
index 6552f69..5dbe0b4 100644
@@ -158,7 +158,6 @@
 /* I2c */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged               */
 #define CONFIG_SYS_I2C_SPEED		80000	/* I2C speed and slave address  */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/M54455EVB.h +0 -1
index 1bc2c5a..8eeda74 100644
@@ -191,7 +191,6 @@
 /* I2c */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged               */
 #define CONFIG_SYS_I2C_SPEED		80000	/* I2C speed and slave address  */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/M5475EVB.h +0 -1
index 3bdb867..6e9cba0 100644
@@ -122,7 +122,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hw support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x00008F00
include/configs/M5485EVB.h +0 -1
index 3487e49..24f28e0 100644
@@ -119,7 +119,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C		/* I2C with hw support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x00008F00
include/configs/METROBOX.h +0 -1
index 286f869..7556ad5 100644
@@ -196,7 +196,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C	      1		     /* I2C hardware support	*/
-#undef	CONFIG_SOFT_I2C			     /* I2C !bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED	      400000	     /* I2C speed 400kHz	*/
 #define CONFIG_SYS_I2C_SLAVE	      0x7F	     /* I2C slave address	*/
include/configs/MHPC.h +5 -4
index 3ff36ad..d252b77 100644
@@ -73,8 +73,11 @@
 #undef	CONFIG_UCODE_PATCH
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -91,8 +94,6 @@
 			else	immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(5)	/* 1/4 I2C clock duration */
 
-#define CONFIG_SYS_I2C_SPEED			50000
-#define CONFIG_SYS_I2C_SLAVE			0xFE
 #define CONFIG_SYS_I2C_EEPROM_ADDR		0x50	/* EEPROM X24C04		*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN		1	/* bytes of address		*/
 /* mask of address bits that overflow into the "EEPROM chip address"	*/
include/configs/MPC8323ERDB.h +0 -1
index 8d5ed0f..0e7e5ad 100644
@@ -234,7 +234,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
include/configs/MPC832XEMDS.h +0 -1
index f592d3a..0b72a26 100644
@@ -327,7 +327,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
include/configs/MPC8349EMDS.h +0 -1
index e5529c7..5e0f54f 100644
@@ -355,7 +355,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
include/configs/MPC8349ITX.h +0 -2
index 2c3f1f6..9a46fb0 100644
@@ -131,8 +131,6 @@
 #define I2C_8574_PCI66		0x20	/* 0=33MHz PCI, 1=66MHz PCI */
 #define I2C_8574_FLASHSIDE	0x40	/* 0=Reset vector from U4, 1=from U7*/
 
-#undef CONFIG_SOFT_I2C
-
 #endif
 
 /* Compact Flash */
include/configs/MPC8360EMDS.h +0 -1
index a1fbd5e..e2ae65a 100644
@@ -424,7 +424,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
include/configs/MPC8360ERDK.h +0 -1
index fc00952..971a3e0 100644
@@ -288,7 +288,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
include/configs/MPC837XEMDS.h +0 -1
index 8243661..95ea116 100644
@@ -342,7 +342,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_SYS_I2C_SPEED	400000 /* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
include/configs/MPC837XERDB.h +0 -1
index 9ad7e3a..b9f437d 100644
@@ -368,7 +368,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_SYS_I2C_SPEED	400000 /* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
include/configs/MPC8536DS.h +0 -1
index bcd77b6..c47281f 100644
@@ -435,7 +435,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/MPC8540ADS.h +0 -1
index a0fe15e..aca41e6 100644
@@ -261,7 +261,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES        {0x69}	/* Don't probe these addrs */
include/configs/MPC8541CDS.h +0 -1
index a6bea15..d2a4f78 100644
@@ -284,7 +284,6 @@ extern unsigned long get_clock_freq(void);
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES        {0x69}	/* Don't probe these addrs */
include/configs/MPC8544DS.h +0 -1
index 83b8668..57fefb3 100644
@@ -233,7 +233,6 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 /* I2C */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x57
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/MPC8548CDS.h +1 -2
index 0e22cc7..aa5c0c9 100644
@@ -359,8 +359,7 @@ extern unsigned long get_clock_freq(void);
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
-#define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
+#define CONFIG_SYS_I2C_SPEED		400000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES	{0x69}	/* Don't probe these addrs */
 #define CONFIG_SYS_I2C_OFFSET		0x3000
include/configs/MPC8555CDS.h +0 -1
index 266cb54..32a375f 100644
@@ -282,7 +282,6 @@ extern unsigned long get_clock_freq(void);
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES        {0x69}	/* Don't probe these addrs */
include/configs/MPC8560ADS.h +0 -1
index 35d15f4..b8c657c 100644
@@ -255,7 +255,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES        {0x69}	/* Don't probe these addrs */
include/configs/MPC8568MDS.h +0 -1
index 5d69fb6..31d83d3 100644
@@ -267,7 +267,6 @@ extern unsigned long get_clock_freq(void);
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x52
include/configs/MPC8569MDS.h +0 -1
index acd3276..40c8dd9 100644
@@ -303,7 +303,6 @@ extern unsigned long get_clock_freq(void);
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
include/configs/MPC8572DS.h +0 -1
index a62b7d5..fdf9f4b 100644
@@ -432,7 +432,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x57
include/configs/MPC8610HPCD.h +0 -1
index c619827..27f825f 100644
@@ -253,7 +253,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES	{0x69}	/* Don't probe these addrs */
include/configs/MPC8641HPCN.h +0 -1
index 2643097..3323c8d 100644
@@ -300,7 +300,6 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES	{0x69}	/* Don't probe these addrs */
include/configs/P1010RDB.h +0 -1
index 57aef21..ad2738b 100644
@@ -477,7 +477,6 @@ extern unsigned long get_sdram_size(void);
 
 #define CONFIG_FSL_I2C			/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_I2C_CMD_TREE
 #define CONFIG_SYS_I2C_SPEED		400000 /* I2C speed and slave address*/
include/configs/P1023RDS.h +0 -1
index 800d666..b0348d1 100644
@@ -314,7 +314,6 @@ extern unsigned long get_clock_freq(void);
 /* I2C */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x51
include/configs/P1_P2_RDB.h +0 -1
index a57d9dd..6e92735 100644
@@ -368,7 +368,6 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 /* I2C */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_I2C_CMD_TREE
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address*/
include/configs/P2020COME.h +0 -1
index c75f86c..fc3f236 100644
@@ -226,7 +226,6 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 /* I2C */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support */
-#undef  CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_I2C_CMD_TREE
 #define CONFIG_SYS_I2C_SPEED		400000  /* I2C speed and slave address*/
include/configs/PM826.h +5 -4
index fbcf8e5..90f4047 100644
@@ -57,10 +57,11 @@
 	"bootm"
 
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xFE
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
include/configs/PM828.h +5 -4
index c37aafd..a1184d2 100644
@@ -57,10 +57,11 @@
 	"bootm"
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xFE
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
include/configs/PMC440.h +0 -1
index 3837b8f..2265d96 100644
@@ -226,7 +226,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support    */
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged               */
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address  */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/R360MPI.h +6 -1
index 9befacb..fe7cf32 100644
@@ -96,10 +96,14 @@
 #define	CONFIG_RTC_MPC8xx		/* use internal RTC of MPC8xx	*/
 
 #define CONFIG_HARD_I2C		1	/* To I2C with hardware support */
-#undef CONFIG_SORT_I2C			/* To I2C with software support */
+#undef CONFIG_SYS_I2C_SOFT		/* To I2C with software support */
 #define CONFIG_SYS_I2C_SPEED		4700	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 
+#if defined(CONFIG_SYS_I2C_SOFT)
+#define CONFIG_SYS_SYS_I2C_SOFT_SPEED	4700 /* I2C speed and slave address */
+#define CONFIG_SYS_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -115,6 +119,7 @@
 #define I2C_SCL(bit)		if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 				else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY		udelay(50)
+#endif /* #define(CONFIG_SYS_I2C_SOFT) */
 
 #define CONFIG_SYS_I2C_LCD_ADDR	0x8	/* LCD Control */
 #define CONFIG_SYS_I2C_KEY_ADDR	0x9	/* Keyboard coprocessor */
include/configs/RPXClassic.h +10 -6
index b215c2d..30d3d16 100644
@@ -148,14 +148,16 @@
  * I2C Configuration
  *-----------------------------------------------------------------------------
  */
-#define CONFIG_I2C              1
-#define CONFIG_SYS_I2C_SPEED           50000
-#define CONFIG_SYS_I2C_SLAVE           0x34
+#define CONFIG_SYS_I2C_SPEED		50000
+#define CONFIG_SYS_I2C_SLAVE		0x34
 
 
 /* enable I2C and select the hardware/software driver */
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support	*/
-#undef  CONFIG_SOFT_I2C			/* I2C bit-banged		*/
+#undef  CONFIG_SYS_I2C_SOFT		/* I2C bit-banged		*/
+
+#if defined(CONFIG_SYS_I2C_SOFT)
+#define CONFIG_SYS_I2C			1
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -170,8 +172,10 @@
 #define I2C_DELAY	udelay(5)	/* 1/4 I2C clock duration */
 
 
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0x34
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x34
+#endif
+
 # define CONFIG_SYS_I2C_EEPROM_ADDR	0x50	/* EEPROM X24C16		*/
 # define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1	/* bytes of address		*/
 /* mask of address bits that overflow into the "EEPROM chip address"    */
include/configs/RPXlite.h +26 -0
index 8ffb014..4fda185 100644
@@ -62,6 +62,32 @@
 #undef	CONFIG_SYS_LOADS_BAUD_CHANGE		/* don't allow baudrate change	*/
 
 #define CONFIG_BZIP2		/* Include support for bzip2 compressed images  */
+
+/* enable I2C and select the hardware/software driver */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	40000	/* 40 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+/* Software (bit-bang) I2C driver configuration */
+#define PB_SCL		0x00000020	/* PB 26 */
+#define PB_SDA		0x00000010	/* PB 27 */
+
+#define I2C_INIT	(immr->im_cpm.cp_pbdir |=  PB_SCL)
+#define I2C_ACTIVE	(immr->im_cpm.cp_pbdir |=  PB_SDA)
+#define I2C_TRISTATE	(immr->im_cpm.cp_pbdir &= ~PB_SDA)
+#define I2C_READ	((immr->im_cpm.cp_pbdat & PB_SDA) != 0)
+#define I2C_SDA(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SDA; \
+			else    immr->im_cpm.cp_pbdat &= ~PB_SDA
+#define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
+			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
+#define I2C_DELAY	udelay(5)	/* 1/4 I2C clock duration */
+
+/* M41T11 Serial Access Timekeeper(R) SRAM */
+#define CONFIG_RTC_M41T11 1
+#define CONFIG_SYS_I2C_RTC_ADDR 0x68
+#define CONFIG_SYS_M41T11_BASE_YEAR 1900	/* play along with the linux driver */
+
 #undef	CONFIG_WATCHDOG			/* watchdog disabled		*/
 
 /*
include/configs/RRvision.h +5 -8
index 671d521..26de1a8 100644
@@ -120,13 +120,11 @@
 #endif
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
-
-# define CONFIG_SYS_I2C_SPEED		50000	/* 50 kHz is supposed to work	*/
-# define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -142,7 +140,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(1)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 
 /*
include/configs/SBC8540.h +0 -1
index d448bf6..a7bdeeb 100644
@@ -223,7 +223,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES	{0x69}	/* Don't probe these addrs */
include/configs/SCM.h +5 -6
index 87d52ba..ea96696 100644
@@ -75,15 +75,14 @@
 	"bootm"
 
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
-
 #define I2C_PORT	3		/* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE	(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE	(iop->pdir &= ~0x00010000)
include/configs/SXNI855T.h +5 -3
index b7fbe5e..7bdcd62 100644
@@ -121,7 +121,11 @@
 
 #define	CONFIG_RTC_DS1306		/* Dallas 1306 real time clock	*/
 
-#define	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -138,8 +142,6 @@
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(5)	/* 1/4 I2C clock duration */
 
-# define CONFIG_SYS_I2C_SPEED		50000
-# define CONFIG_SYS_I2C_SLAVE		0xFE
 # define CONFIG_SYS_I2C_EEPROM_ADDR	0x50	/* Atmel 24C64			*/
 # define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2	/* two byte address		*/
 
include/configs/Sandpoint8240.h +7 -3
index f54fcb3..6b0c56f 100644
@@ -202,12 +202,16 @@
  * configuration items that the driver uses to drive the port pins.
  */
 #define CONFIG_HARD_I2C		1		/* To enable I2C support	*/
-#undef  CONFIG_SOFT_I2C				/* I2C bit-banged		*/
+#undef  CONFIG_SYS_I2C_SOFT			/* I2C bit-banged		*/
 #define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 #error "Soft I2C is not configured properly.  Please review!"
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define I2C_PORT		3               /* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE		(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE		(iop->pdir &= ~0x00010000)
@@ -217,7 +221,7 @@
 #define I2C_SCL(bit)		if(bit) iop->pdat |=  0x00020000; \
 				else    iop->pdat &= ~0x00020000
 #define I2C_DELAY		udelay(5)	/* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
+#endif /* CONFIG_SYS_I2C_SOFT */
 
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x57		/* EEPROM IS24C02		*/
include/configs/Sandpoint8245.h +9 -5
index 84e4891..ad214f4 100644
@@ -172,12 +172,16 @@
  * configuration items that the driver uses to drive the port pins.
  */
 #define CONFIG_HARD_I2C		1		/* To enable I2C support	*/
-#undef  CONFIG_SOFT_I2C				/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
+#undef  CONFIG_SYS_I2C_SOFT			/* I2C bit-banged		*/
+#define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address	*/
+#define CONFIG_SYS_I2C_SLAVE	0x7F
 
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 #error "Soft I2C is not configured properly.  Please review!"
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define I2C_PORT		3               /* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE		(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE		(iop->pdir &= ~0x00010000)
@@ -187,7 +191,7 @@
 #define I2C_SCL(bit)		if(bit) iop->pdat |=  0x00020000; \
 				else    iop->pdat &= ~0x00020000
 #define I2C_DELAY		udelay(5)	/* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
+#endif /* CONFIG_SYS_I2C_SOFT */
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x57		/* EEPROM IS24C02		*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1		/* Bytes of address		*/
include/configs/TASREG.h +14 -13
index d95a226..1991f2f 100644
@@ -136,19 +136,12 @@
 /*-----------------------------------------------------------------------
  * I2C
  */
-#define	CONFIG_SOFT_I2C
-#define CONFIG_SYS_I2C_SPEED		100000	/* I2C speed and slave address */
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-#define CONFIG_SYS_I2C_EEPROM_ADDR	0x50	/* EEPROM CAT28WC32		*/
-#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2	/* Bytes of address		*/
-/* mask of address bits that overflow into the "EEPROM chip address"	*/
-#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW	0x01
-#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 5	/* The Catalyst CAT24WC32 has	*/
-					/* 32 byte page write mode using*/
-					/* last 5 bits of the address	*/
-#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	10   /* and takes up to 10 msec */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	100000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 
-#if defined (CONFIG_SOFT_I2C)
 #if 0 /* push-pull */
 #define	SDA	        0x00800000
 #define	SCL	        0x00000008
@@ -182,7 +175,15 @@
 #define	I2C_ACTIVE	{DIR1|=SDA;}
 #define	I2C_TRISTATE    {DIR1&=~SDA;}
 #endif
-#endif
+
+#define CONFIG_SYS_I2C_EEPROM_ADDR	0x50	/* EEPROM CAT28WC32		*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2	/* Bytes of address		*/
+/* mask of address bits that overflow into the "EEPROM chip address"	*/
+#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW	0x01
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 5	/* The Catalyst CAT24WC32 has	*/
+					/* 32 byte page write mode using*/
+					/* last 5 bits of the address	*/
+#define CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS	10   /* and takes up to 10 msec */
 
 /*-----------------------------------------------------------------------
  * Definitions for initial stack pointer and data area (in DPRAM)
include/configs/TK885D.h +5 -8
index 4176c7f..d723e25 100644
@@ -104,13 +104,11 @@
 #undef	CONFIG_CAN_DRIVER		/* CAN Driver support disabled	*/
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		93000	/* 93 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -126,7 +124,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else	immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x50		/* EEPROM AT24C??	*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2		/* two byte address	*/
include/configs/TOP5200.h +9 -6
index 2267d59..9ff6c6e 100644
@@ -200,10 +200,14 @@
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_MISC_INIT_R
 
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support */
-#define	CONFIG_SOFT_I2C		1	/* I2C with softwate support */
-
-#if defined (CONFIG_SOFT_I2C)
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+
+#if defined(CONFIG_SYS_I2C_SOFT)
+#  define CONFIG_SYS_I2C
+#  define CONFIG_SYS_I2C_SOFT_SPEED	100000
+#  define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#  define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+/**/
 #  define SDA0			0x40
 #  define SCL0			0x80
 #  define GPIOE0		*((volatile uchar*)(CONFIG_SYS_MBAR+0x0c00))
@@ -218,8 +222,7 @@
 #  define I2C_DELAY		{udelay(5);}
 #  define I2C_ACTIVE	{DDR0|=SDA0;}
 #  define I2C_TRISTATE	{DDR0&=~SDA0;}
-#  define CONFIG_SYS_I2C_SPEED		100000
-#  define CONFIG_SYS_I2C_SLAVE		0x7F
+
 #define CONFIG_SYS_I2C_EEPROM_ADDR 0x57
 #define CONFIG_SYS_I2C_FACT_ADDR	0x57
 #endif
include/configs/TOP860.h +6 -5
index 36921ca..b29071b 100644
@@ -159,7 +159,6 @@
  * Environment handler
  * only the first 6k in EEPROM are available for user. Of that we use 256b
  */
-#define	CONFIG_SOFT_I2C
 #define CONFIG_ENV_IS_IN_EEPROM	1	/* turn on EEPROM env feature */
 #define CONFIG_ENV_OFFSET		0x1000
 #define CONFIG_ENV_SIZE		0x0700
@@ -170,13 +169,16 @@
 #define CONFIG_SYS_EEPROM_PAGE_WRITE_BITS 3
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
 #define CONFIG_SYS_EEPROM_SIZE 0x2000
-#define	CONFIG_SYS_I2C_SPEED	100000
-#define	CONFIG_SYS_I2C_SLAVE	0xFE
 #define	CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS 12
 #define CONFIG_ENV_OVERWRITE
 #define CONFIG_MISC_INIT_R
 
-#if defined (CONFIG_SOFT_I2C)
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	100000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+/**/
 #define	SDA	0x00010
 #define	SCL	0x00020
 #define __I2C_DIR	immr->im_cpm.cp_pbdir
@@ -193,7 +195,6 @@
 #define	I2C_DELAY	{ udelay(5); }
 #define	I2C_ACTIVE	{ __I2C_DIR |= SDA; }
 #define	I2C_TRISTATE	{ __I2C_DIR &= ~SDA; }
-#endif
 
 #define CONFIG_SYS_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200, 230400 }
 
include/configs/TQM8260.h +5 -4
index 7e24131..2367394 100644
@@ -89,10 +89,11 @@
 #define CONFIG_BOOTCOMMAND	"run flash_self"
 
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 
 /*
  * Software (bit-bang) I2C driver configuration
include/configs/TQM8272.h +7 -6
index be977f1..68d7c46 100644
@@ -97,11 +97,11 @@
 
 #if CONFIG_I2C
 /* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -135,8 +135,9 @@
 #define CONFIG_SYS_DTT_HYSTERESIS	3
 
 #else
+#undef CONFIG_SYS_I2C
 #undef CONFIG_HARD_I2C
-#undef CONFIG_SOFT_I2C
+#undef CONFIG_SYS_I2C_SOFT
 #endif
 
 /*
include/configs/TQM834x.h +0 -1
index 0738423..133d7df 100644
@@ -188,7 +188,6 @@
  * I2C
  */
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed: 400KHz */
 #define CONFIG_SYS_I2C_SLAVE		0x7F	/* slave address */
include/configs/TQM855M.h +5 -8
index 95bc4d9..558fd82 100644
@@ -93,13 +93,11 @@
 #undef	CONFIG_CAN_DRIVER		/* CAN Driver support disabled	*/
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C         1	/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		93000	/* 93 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -115,7 +113,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x50		/* EEPROM AT24C64	*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	2		/* two byte address	*/
include/configs/TQM866M.h +5 -8
index a13c16a..cc84fa4 100644
@@ -107,13 +107,11 @@
 #undef	CONFIG_CAN_DRIVER		/* CAN Driver support disabled	*/
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		93000	/* 93 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -129,7 +127,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else	immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x50		/* EEPROM AT24C256	*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2		/* two byte address	*/
include/configs/TQM885D.h +5 -8
index 7df76fb..122577e 100644
@@ -101,13 +101,11 @@
 #undef	CONFIG_CAN_DRIVER		/* CAN Driver support disabled	*/
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		93000	/* 93 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -123,7 +121,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else	immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x50		/* EEPROM AT24C??	*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2		/* two byte address	*/
include/configs/alpr.h +0 -1
index 0d53e51..a6add6b 100644
@@ -122,7 +122,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		100000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/aria.h +0 -1
index 0b31c50..fd98fb2 100644
@@ -366,7 +366,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C			/* so disable bit-banged I2C */
 #define CONFIG_I2C_MULTI_BUS
 
 /* I2C speed and slave address */
include/configs/astro_mcf5373l.h +0 -1
index a0ed8f1..6dabe57 100644
@@ -118,7 +118,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C
 #define CONFIG_HARD_I2C			/* I2C with hw support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		80000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x58000
include/configs/bf533-ezkit.h +8 -2
index c1a5ecd..1598eb4 100644
@@ -94,10 +94,16 @@
 /*
  * I2C Settings
  */
-#define CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C_SOFT
+#ifdef CONFIG_SYS_I2C_SOFT
+#define CONFIG_SYS_I2C
 #define CONFIG_SOFT_I2C_GPIO_SCL GPIO_PF0
 #define CONFIG_SOFT_I2C_GPIO_SDA GPIO_PF1
-
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0
+#define I2C_DELAY              udelay(5)       /* 1/4 I2C clock duration */
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+#endif
 
 /*
  * Misc Settings
include/configs/bf533-stamp.h +42 -5

79 lines not on this page · raw message

include/configs/bf561-ezkit.h +7 -2
index 1a9d27e..2cb93e5 100644
@@ -88,10 +88,15 @@
 /*
  * I2C Settings
  */
-#define CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C_SOFT
+#ifdef CONFIG_SYS_I2C_SOFT
 #define CONFIG_SOFT_I2C_GPIO_SCL GPIO_PF0
 #define CONFIG_SOFT_I2C_GPIO_SDA GPIO_PF1
-
+#define I2C_DELAY		udelay(5)	/* 1/4 I2C clock duration */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+#endif
 
 /*
  * Misc Settings
include/configs/bfin_adi_common.h +1 -1
index ccdec0d..aa4de38 100644
@@ -71,7 +71,7 @@
 # ifdef CONFIG_SPI_FLASH
 #  define CONFIG_CMD_SF
 # endif
-# if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
+# if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C_SOFT)
 #  define CONFIG_CMD_I2C
 #  define CONFIG_SOFT_I2C_READ_REPEATED_START
 # endif
include/configs/blackstamp.h +0 -1
index 83ad659..59daf5a 100644
@@ -40,7 +40,6 @@
 #define SHARED_RESOURCES	1
 
 /* Is I2C bit-banged? */
-#undef CONFIG_SOFT_I2
 
 /*
  * Clock Settings
include/configs/cpuat91.h +0 -1
index 15d56c3..3f8e4a2 100644
@@ -92,7 +92,6 @@
 #define CONFIG_USART_ID		0/* ignored in arm */
 
 #undef CONFIG_HARD_I2C
-#undef CONFIG_SOFT_I2C
 #define AT91_PIN_SDA			(1<<25)
 #define AT91_PIN_SCL			(1<<26)
 
include/configs/debris.h +7 -3
index 32aa4e5..a0c3e5a 100644
@@ -272,12 +272,16 @@
  * configuration items that the driver uses to drive the port pins.
  */
 #define CONFIG_HARD_I2C		1		/* To enable I2C support	*/
-#undef  CONFIG_SOFT_I2C				/* I2C bit-banged		*/
+#undef  CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
 #error "Soft I2C is not configured properly.  Please review!"
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define I2C_PORT		3               /* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE		(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE		(iop->pdir &= ~0x00010000)
@@ -287,7 +291,7 @@
 #define I2C_SCL(bit)		if(bit) iop->pdat |=  0x00020000; \
 				else    iop->pdat &= ~0x00020000
 #define I2C_DELAY		udelay(5)	/* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
+#endif /* CONFIG_SYS_I2C_SOFT */
 
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x57		/* EEPROM IS24C02		*/
 #define CONFIG_SYS_I2C_EEPROM_ADDR_LEN	1		/* Bytes of address		*/
include/configs/eXalion.h +1 -1
index 3238ac7..122e0b3 100644
@@ -223,7 +223,7 @@
  * configuration items that the driver uses to drive the port pins.
  */
 #define CONFIG_HARD_I2C		1	/* To enable I2C support	*/
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged		*/
+#undef	CONFIG_SYS_I2C_SOFT		/* I2C bit-banged		*/
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 
include/configs/eb_cpux9k2.h +6 -8
index 9371ec3..4d2d50f 100644
@@ -220,11 +220,11 @@
  * I2C-Bus
  */
 
-#define CONFIG_SYS_I2C_SPEED		50000
-#define CONFIG_SYS_I2C_SLAVE		0 		/* not used */
-
-#ifndef CONFIG_HARD_I2C
-#define CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 
 /* Software  I2C driver configuration */
 
@@ -248,9 +248,7 @@
 	else							\
 		writel(ATMEL_PMX_AA_TWCK, &pio->pioa.codr);
 
-#define I2C_DELAY	udelay(2500000/CONFIG_SYS_I2C_SPEED)
-
-#endif	/* CONFIG_HARD_I2C */
+#define I2C_DELAY	udelay(2500000/CONFIG_SYS_I2C_SOFT_SPEED)
 
 /* I2C-RTC */
 
include/configs/ep8260.h +9 -5
index ccfe032..73ab177 100644
@@ -227,15 +227,19 @@
  * If the software driver is chosen, there are some additional
  * configuration items that the driver uses to drive the port pins.
  */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
+#define CONFIG_SYS_I2C_SLAVE		0x7F	/* This is for HARD, must go */
 
 /*
  * Software (bit-bang) I2C driver configuration
  */
-#ifdef CONFIG_SOFT_I2C
+#ifdef CONFIG_SYS_I2C_SOFT
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define I2C_PORT	3		/* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE	(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE	(iop->pdir &= ~0x00010000)
@@ -245,7 +249,7 @@
 #define I2C_SCL(bit)	if(bit) iop->pdat |=  0x00020000; \
 			else    iop->pdat &= ~0x00020000
 #define I2C_DELAY	udelay(5)	/* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
+#endif /* CONFIG_SYS_I2C_SOFT */
 
 /* #define CONFIG_RTC_DS174x */
 
include/configs/ethernut5.h +6 -3
index 14a0f02..47942b9 100644
@@ -210,10 +210,13 @@
 
 /* I2C */
 #define CONFIG_SYS_MAX_I2C_BUS	1
-#define CONFIG_SYS_I2C_SLAVE	0
-#define CONFIG_SYS_I2C_SPEED	100000
 
-#define CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	100000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+
 #define I2C_SOFT_DECLARATIONS
 
 #define GPIO_I2C_SCL		AT91_PIO_PORTA, 24
include/configs/ibf-dsp561.h +3 -2
index 294af73..ce8c385 100644
@@ -105,11 +105,12 @@
 /*
  * I2C Settings
  */
-#define CONFIG_SOFT_I2C		1
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define CONFIG_SOFT_I2C_GPIO_SCL GPIO_PF0
 #define CONFIG_SOFT_I2C_GPIO_SDA GPIO_PF1
 
-
 /*
  * Misc Settings
  */
include/configs/iocon.h +6 -5
index 7f8825b..ed8afc2 100644
@@ -110,11 +110,12 @@
 /*
  * I2C stuff
  */
-#define CONFIG_SYS_I2C_SPEED		400000
-
-/* enable I2C and select the hardware/software driver */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
+#undef CONFIG_HARD_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 
 /*
  * Software (bit-bang) I2C driver configuration
include/configs/km/keymile-common.h +0 -3
index 05480d4..728c79e 100644
@@ -82,10 +82,7 @@
 #define CONFIG_LOADS_ECHO
 #define CONFIG_SYS_LOADS_BAUD_CHANGE
 
-#define CONFIG_I2C_MULTI_BUS
-#define CONFIG_SYS_MAX_I2C_BUS		1
 #define CONFIG_SYS_I2C_INIT_BOARD
-#define CONFIG_I2C_MUX
 
 /* Support the IVM EEprom */
 #define	CONFIG_SYS_IVM_EEPROM_ADR	0x50
include/configs/km/km83xx-common.h +3 -0
index 877d841..d9e935e 100644
@@ -207,6 +207,9 @@
 #define CONFIG_SYS_I2C_SPEED	200000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
 #define CONFIG_SYS_I2C_OFFSET	0x3000
+#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_SYS_MAX_I2C_BUS		1
+#define CONFIG_I2C_MUX
 
 /* I2C SYSMON (LM75, AD7414 is almost compatible) */
 #define CONFIG_DTT_LM75		/* ON Semi's LM75 */
include/configs/km/km_arm.h +22 -4
index 549278d..9d4534b 100644
@@ -55,7 +55,6 @@
 
 #define CONFIG_CMD_NAND
 #define CONFIG_CMD_SF
-#define CONFIG_SOFT_I2C		/* I2C bit-banged	*/
 
 /* SPI NOR Flash default params, used by sf commands */
 #define CONFIG_SF_DEFAULT_SPEED		8100000
@@ -184,8 +183,25 @@
 /*
  * I2C related stuff
  */
+#undef CONFIG_I2C_MVTWSI
+#define CONFIG_SYS_I2C
+#define	CONFIG_SYS_I2C_SOFT	/* I2C bit-banged	*/
+
 #define	CONFIG_KIRKWOOD_GPIO		/* Enable GPIO Support */
-#if defined(CONFIG_SOFT_I2C)
+#if defined(CONFIG_SYS_I2C_SOFT)
+
+#define CONFIG_SYS_NUM_I2C_ADAPTERS	1
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+#define CONFIG_SYS_NUM_I2C_BUSSES	6
+#define CONFIG_SYS_I2C_MAX_HOPS		1
+#define CONFIG_SYS_I2C_BUSSES	{	{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} } }, \
+				}
+
 #ifndef __ASSEMBLY__
 #include <asm/arch-kirkwood/gpio.h>
 extern void __set_direction(unsigned pin, int high);
@@ -208,6 +224,8 @@ int get_scl(void);
 #define I2C_DELAY	udelay(1)
 #define I2C_SOFT_DECLARATIONS
 
+#define	CONFIG_SYS_I2C_SOFT_SLAVE	0x0
+#define	CONFIG_SYS_I2C_SOFT_SPEED	100000
 #endif
 
 /* EEprom support 24C128, 24C256 valid for environment eeprom */
@@ -237,7 +255,7 @@ int get_scl(void);
 #define CONFIG_SYS_EEPROM_WREN
 #define CONFIG_ENV_OFFSET		0x0 /* no bracets! */
 #define CONFIG_ENV_SIZE			(0x2000 - CONFIG_ENV_OFFSET)
-#define CONFIG_I2C_ENV_EEPROM_BUS	KM_ENV_BUS "\0"
+#define CONFIG_I2C_ENV_EEPROM_BUS	KM_ENV_BUS
 #define CONFIG_ENV_OFFSET_REDUND	0x2000 /* no bracets! */
 #define CONFIG_ENV_SIZE_REDUND		(CONFIG_ENV_SIZE)
 #endif
@@ -290,7 +308,7 @@ int get_scl(void);
 	CONFIG_KM_DEF_ENV						\
 	CONFIG_KM_NEW_ENV						\
 	"arch=arm\0"							\
-	"EEprom_ivm=" KM_IVM_BUS "\0"					\
+	"EEprom_ivm=" __stringify(KM_IVM_BUS) "\0"			\
 	""
 
 #if defined(CONFIG_SYS_NO_FLASH)
include/configs/km82xx.h +13 -5
index 3c2117f..6800071 100644
@@ -212,7 +212,7 @@
 #define	CONFIG_EXTRA_ENV_SETTINGS					\
 	CONFIG_KM_BOARD_EXTRA_ENV					\
 	CONFIG_KM_DEF_ENV						\
-	"EEprom_ivm=pca9544a:70:4 \0"					\
+	"EEprom_ivm=0\0"						\
 	"unlock=yes\0"							\
 	"newenv="							\
 		"prot off 0xFE0C0000 +0x40000 && "			\
@@ -242,10 +242,18 @@
 #endif /* CONFIG_ENV_IS_IN_FLASH */
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		50000	/* I2C speed */
-#define CONFIG_SYS_I2C_SLAVE		0x7F	/* I2C slave address */
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_NUM_I2C_ADAPTERS	1
+#define CONFIG_SYS_NUM_I2C_BUSSES	3
+#define CONFIG_SYS_I2C_MAX_HOPS		1
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SPEED		CONFIG_SYS_I2C_SOFT_SPEED
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+#define CONFIG_SYS_I2C_BUSSES	{{0, {I2C_NULL_HOP} }, \
+			{0, {{I2C_MUX_PCA9542, 0x70, 0} } }, \
+			{0, {{I2C_MUX_PCA9542, 0x70, 1} } } }
 
 /*
  * Software (bit-bang) I2C driver configuration
include/configs/km_kirkwood.h +7 -7
index 762cc10..0d1eb58 100644
@@ -42,18 +42,18 @@
 #define CONFIG_IDENT_STRING		"\nKeymile Kirkwood"
 #define CONFIG_HOSTNAME			km_kirkwood
 #define CONFIG_KM_DISABLE_PCIE
-#define KM_IVM_BUS			"pca9544a:70:9"	/* I2C2 (Mux-Port 1)*/
+#define KM_IVM_BUS			1	/* I2C2 (Mux-Port 1)*/
 
 /* KM_KIRKWOOD_PCI */
 #elif defined(CONFIG_KM_KIRKWOOD_PCI)
 #define CONFIG_IDENT_STRING		"\nKeymile Kirkwood PCI"
 #define CONFIG_HOSTNAME			km_kirkwood_pci
-#define KM_IVM_BUS			"pca9544a:70:9"	/* I2C2 (Mux-Port 1)*/
+#define KM_IVM_BUS			1	/* I2C2 (Mux-Port 1)*/
 #define CONFIG_KM_FPGA_CONFIG
 
 /* KM_NUSA */
 #elif defined(CONFIG_KM_NUSA)
-#define KM_IVM_BUS			"pca9547:70:9"	/* I2C2 (Mux-Port 1)*/
+#define KM_IVM_BUS			1	/* I2C2 (Mux-Port 1)*/
 #define CONFIG_IDENT_STRING		"\nKeymile NUSA"
 #define CONFIG_HOSTNAME			kmnusa
 #undef CONFIG_SYS_KWD_CONFIG
@@ -69,7 +69,7 @@
 #elif defined(CONFIG_KM_MGCOGE3UN)
 #define CONFIG_IDENT_STRING		"\nKeymile COGE3UN"
 #define CONFIG_HOSTNAME			mgcoge3un
-#define KM_IVM_BUS			"pca9547:70:9" /* I2C2 (Mux-Port 1)*/
+#define KM_IVM_BUS			1	/* I2C2 (Mux-Port 1)*/
 #undef CONFIG_SYS_KWD_CONFIG
 #define CONFIG_SYS_KWD_CONFIG \
 		$(SRCTREE)/$(CONFIG_BOARDDIR)/kwbimage-memphis.cfg
@@ -81,7 +81,7 @@
 /* KMCOGE5UN */
 #elif defined(CONFIG_KM_COGE5UN)
 #define CONFIG_IDENT_STRING		"\nKeymile COGE5UN"
-#define KM_IVM_BUS			"pca9547:70:9"	/* I2C2 (Mux-Port 1)*/
+#define KM_IVM_BUS			1	/* I2C2 (Mux-Port 1)*/
 #undef	CONFIG_SYS_KWD_CONFIG
 #define CONFIG_SYS_KWD_CONFIG \
 		$(SRCTREE)/$(CONFIG_BOARDDIR)/kwbimage_256M8_1.cfg
@@ -95,7 +95,7 @@
 #elif defined(CONFIG_KM_PORTL2)
 #define CONFIG_IDENT_STRING		"\nKeymile Port-L2"
 #define CONFIG_HOSTNAME			portl2
-#define KM_IVM_BUS			"pca9544a:70:9" /* I2C2 (Mux-Port 1)*/
+#define KM_IVM_BUS			1	/* I2C2 (Mux-Port 1)*/
 #define CONFIG_KM_PIGGY4_88E6061
 
 #else
@@ -106,7 +106,7 @@
 #include "km/km_arm.h"
 
 #ifndef CONFIG_KM_ENV_IS_IN_SPI_NOR
-#define KM_ENV_BUS	"pca9544a:70:d"	/* I2C2 (Mux-Port 5)*/
+#define KM_ENV_BUS	5	/* I2C2 (Mux-Port 5)*/
 #endif
 
 #if defined(CONFIG_KM_PIGGY4_88E6352)
include/configs/korat.h +0 -1
index b919aec..7d5fb15 100644
@@ -156,7 +156,6 @@
  * I2C
  */
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/lwmon.h +5 -8
index ab86053..a8aa013 100644
@@ -145,13 +145,11 @@
 #undef	CONFIG_STATUS_LED		/* Status LED disabled		*/
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C         1	/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		93000	/* 93 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -167,7 +165,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 
 #define CONFIG_RTC_PCF8563		/* use Philips PCF8563 RTC	*/
include/configs/lwmon5.h +0 -1
index 2d33ebc..d0c05f5 100644
@@ -281,7 +281,6 @@
  * I2C
  */
 #define CONFIG_HARD_I2C				/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C				/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		100000		/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/mecp5123.h +0 -1
index cafc273..46c0422 100644
@@ -243,7 +243,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C			/* so disable bit-banged I2C */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed */
 #define CONFIG_SYS_I2C_SLAVE		0x7F	/* slave address */
include/configs/mpc5121ads.h +0 -1
index 3f55d35..b2057f2 100644
@@ -336,7 +336,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C			/* so disable bit-banged I2C */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED		100000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/nhk8815.h +6 -2
index d438efd..2759433 100644
@@ -109,8 +109,12 @@
 #ifndef __ASSEMBLY__
 #include <asm/arch/gpio.h>
 #define CONFIG_CMD_I2C
-#define CONFIG_SOFT_I2C
-#define CONFIG_SYS_I2C_SPEED	400000
+#define CONFIG_SYS_I2C
+#define	CONFIG_SYS_I2C_SOFT	1	/* I2C bit-banged	*/
+#define I2C_SOFT_DEFS
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define __SDA			63
 #define __SCL			62
 #define I2C_SDA(x)		nmk_gpio_set(__SDA, x)
include/configs/otc570.h +9 -9
index fe4f3c0..7ffbde8 100644
@@ -115,14 +115,14 @@
 /* RTC and I2C stuff */
 #define CONFIG_RTC_DS1338
 #define CONFIG_SYS_I2C_RTC_ADDR		0x68
-#undef CONFIG_HARD_I2C
-#define CONFIG_SOFT_I2C
-#define CONFIG_SYS_I2C_SPEED		100000
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-
-#ifdef CONFIG_SOFT_I2C
-# define CONFIG_I2C_CMD_TREE
-# define CONFIG_I2C_MULTI_BUS
+
+#define CONFIG_SYS_I2C
+#define	CONFIG_SYS_I2C_SOFT	/* I2C bit-banged	*/
+#ifdef CONFIG_SYS_I2C_SOFT
+#define CONFIG_SYS_I2C_SOFT_SPEED	100000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+
 /* Configure data and clock pins for pio */
 # define I2C_INIT { \
 	at91_set_pio_output(AT91_PIO_PORTB, 4, 0); \
@@ -140,7 +140,7 @@
 /* Set clock pin */
 # define I2C_SCL(bit)		at91_set_pio_value(AT91_PIO_PORTB, 5, bit)
 # define I2C_DELAY		udelay(2) /* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
+#endif /* CONFIG_SYS_I2C_SOFT */
 
 /*
  * BOOTP options
include/configs/p1_p2_rdb_pc.h +0 -1
index 350150b..823239b 100644
@@ -538,7 +538,6 @@
 /* I2C */
 #define CONFIG_FSL_I2C			/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_I2C_CMD_TREE
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C spd and slave address */
include/configs/p3p440.h +0 -1
index d7b1ca2..ba10e88 100644
@@ -98,7 +98,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		100000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/pcs440ep.h +0 -1
index 351ff5a..8d46607 100644
@@ -140,7 +140,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C		1	    /* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C			    /* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		100000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/pdnb3.h +5 -6
index 1e07317..dcd2237 100644
@@ -281,12 +281,11 @@
  */
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		83000	/* 83 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	83000	/* 83 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
include/configs/quad100hd.h +0 -1
index 5f1bb58..30a8c55 100644
@@ -153,7 +153,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C		1		/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C				/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/s5p_goni.h +5 -2
index 7e0b302..ba30c29 100644
@@ -226,8 +226,11 @@
 #define CONFIG_SOFT_I2C_GPIO_SCL s5pc110_gpio_get_nr(j4, 3)
 #define CONFIG_SOFT_I2C_GPIO_SDA s5pc110_gpio_get_nr(j4, 0)
 
-#define CONFIG_SOFT_I2C	1
-#define CONFIG_SYS_I2C_SPEED	50000
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_MAX_I2C_BUS	7
 #define CONFIG_USB_GADGET
include/configs/s5pc210_universal.h +5 -2
index 5fc6136..3c68141 100644
@@ -247,9 +247,12 @@
 #define CONFIG_SOFT_I2C_GPIO_SCL exynos4_gpio_part1_get_nr(b, 7)
 #define CONFIG_SOFT_I2C_GPIO_SDA exynos4_gpio_part1_get_nr(b, 6)
 
-#define CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define CONFIG_SOFT_I2C_READ_REPEATED_START
-#define CONFIG_SYS_I2C_SPEED	50000
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_MAX_I2C_BUS	7
 
include/configs/sacsng.h +5 -7
index 54d55a0..10ad52a 100644
@@ -296,15 +296,14 @@
  * If the software driver is chosen, there are some additional
  * configuration items that the driver uses to drive the port pins.
  */
-#undef  CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define CONFIG_SOFT_I2C		1	/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
-#ifdef CONFIG_SOFT_I2C
 #define I2C_PORT	3		/* Port A=0, B=1, C=2, D=3 */
 #define I2C_ACTIVE	(iop->pdir |=  0x00010000)
 #define I2C_TRISTATE	(iop->pdir &= ~0x00010000)
@@ -314,7 +313,6 @@
 #define I2C_SCL(bit)	if(bit) iop->pdat |=  0x00020000; \
 			else    iop->pdat &= ~0x00020000
 #define I2C_DELAY	udelay(20)	/* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
 
 /* Define this to reserve an entire FLASH sector for
  * environment variables. Otherwise, the environment will be
include/configs/sbc405.h +0 -1
index 5abcda3..9918638 100644
@@ -169,7 +169,6 @@
 #define CONFIG_SYS_RX_ETH_BUFFER	16	/* use 16 rx buffer on 405 emac */
 
 #define CONFIG_HARD_I2C		1	/* I2C with hardware support	*/
-#undef  CONFIG_SOFT_I2C			/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/sbc8349.h +0 -1
index 478d0d8..6d115c5 100644
@@ -305,7 +305,6 @@
 
 /* I2C */
 #define CONFIG_HARD_I2C			/* I2C with hardware support*/
-#undef CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE	0x7F
include/configs/sbc8548.h +0 -1
index 2209ddf..33197b4 100644
@@ -445,7 +445,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_EEPROM_ADDR	0x50
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/configs/sbc8560.h +0 -1
index 46d6098..0e47f6c 100644
@@ -215,7 +215,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES	{0x69}	/* Don't probe these addrs */
include/configs/sbc8641d.h +0 -1
index 9040ec6..8142205 100644
@@ -290,7 +290,6 @@
  */
 #define	CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define	CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address */
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_NOPROBES        {0x69}	/* Don't probe these addrs */
include/configs/sc3.h +0 -1
index fb74608..abca9e0 100644
@@ -247,7 +247,6 @@
  *-----------------------------------------------------------------------
  */
 #define  CONFIG_HARD_I2C		/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 
 #define I2C_INIT
include/configs/snapper9260.h +5 -4
index 218ca54..634db9a 100644
@@ -106,11 +106,12 @@
 #define CONFIG_SYS_PROMPT		"Snapper> "
 
 /* I2C - Bit-bashed */
-#define CONFIG_SOFT_I2C
-#define CONFIG_SYS_I2C_SPEED		100000
-#define CONFIG_SYS_I2C_SLAVE		0x7F
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	100000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define CONFIG_SOFT_I2C_READ_REPEATED_START
-#define CONFIG_I2C_MULTI_BUS
 #define I2C_INIT do {							\
 		at91_set_gpio_output(AT91_PIN_PA23, 1);			\
 		at91_set_gpio_output(AT91_PIN_PA24, 1);			\
include/configs/socrates.h +0 -1
index 25f15f2..e42c8aa 100644
@@ -236,7 +236,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
 #define CONFIG_SYS_I2C_SPEED		102124	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #define CONFIG_SYS_I2C_OFFSET		0x3000
include/configs/spc1920.h +5 -8
index 87878d5..3df551d 100644
@@ -207,13 +207,11 @@
  */
 #if defined(CONFIG_CMD_I2C)
 /* enable I2C and select the hardware/software driver */
-#undef CONFIG_HARD_I2C                 /* I2C with hardware support    */
-#define CONFIG_SOFT_I2C                1       /* I2C bit-banged               */
-
-#define CONFIG_SYS_I2C_SPEED          93000   /* 93 kHz is supposed to work   */
-#define CONFIG_SYS_I2C_SLAVE          0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000	/* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -229,7 +227,6 @@
 #define I2C_SCL(bit)   if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 		       else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY      udelay(2)       /* 1/4 I2C clock duration */
-#endif /* CONFIG_SOFT_I2C */
 #endif
 
 /*-----------------------------------------------------------------------
include/configs/stxgp3.h +0 -1
index 939a964..b688b45 100644
@@ -180,7 +180,6 @@
  */
 #define CONFIG_FSL_I2C		/* Use FSL common I2C driver */
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #if 0
include/configs/stxssa.h +0 -1
index c1a90a7..5d8ff79 100644
@@ -199,7 +199,6 @@
  */
 #define CONFIG_FSL_I2C			/* Use FSL common I2C driver */
 #define  CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_SYS_I2C_SPEED		400000	/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #undef CONFIG_SYS_I2C_NOPROBES
include/configs/top9000.h +6 -4
index 7cc6577..54edaae 100644
@@ -201,11 +201,13 @@
 #define CONFIG_CMD_USB
 
 /* I2C support must always be enabled */
-#define CONFIG_SOFT_I2C
 #define CONFIG_CMD_I2C
-#define CONFIG_SYS_I2C_SPEED		400000
-#define CONFIG_SYS_I2C_SLAVE		0x7F
-#define CONFIG_I2C_MULTI_BUS
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	400000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7F
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
+
 #define I2C0_PORT			AT91_PIO_PORTA
 #define SDA0_PIN			23
 #define SCL0_PIN			24
include/configs/trats.h +5 -2
index d7808aa..106fd37 100644
@@ -212,10 +212,13 @@
 #define CONFIG_SYS_CACHELINE_SIZE       32
 
 
-#define CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	50000
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 #define CONFIG_SOFT_I2C_READ_REPEATED_START
 #define CONFIG_SYS_I2C_INIT_BOARD
-#define CONFIG_SYS_I2C_SPEED	50000
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SOFT_I2C_MULTI_BUS
 #define CONFIG_SYS_MAX_I2C_BUS	15
include/configs/u8500_href.h +0 -1
index 1bb6128..218feeb 100644
@@ -166,7 +166,6 @@
  */
 #define CONFIG_U8500_I2C
 #undef	CONFIG_HARD_I2C			/* I2C with hardware support */
-#undef	CONFIG_SOFT_I2C			/* I2C bit-banged */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_SYS_I2C_SPEED		100000
 #define CONFIG_SYS_I2C_SLAVE		0	/* slave addr of controller */
include/configs/uc100.h +5 -8
index 8c8fb5a..d68c917 100644
@@ -463,13 +463,11 @@
  */
 
 /* enable I2C and select the hardware/software driver */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C         1	/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		93000	/* 93 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0xFE
-
-#ifdef CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	93000 /* 93 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0xFE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 /*
  * Software (bit-bang) I2C driver configuration
  */
@@ -485,7 +483,6 @@
 #define I2C_SCL(bit)	if(bit) immr->im_cpm.cp_pbdat |=  PB_SCL; \
 			else    immr->im_cpm.cp_pbdat &= ~PB_SCL
 #define I2C_DELAY	udelay(2)	/* 1/4 I2C clock duration */
-#endif	/* CONFIG_SOFT_I2C */
 
 /*-----------------------------------------------------------------------
  * I2C EEPROM (24C164)
include/configs/utx8245.h +1 -2
index d203bb4..1df9ec7 100644
@@ -235,8 +235,7 @@ protect on ${u-boot_startaddr} ${u-boot_endaddr}"
  *------------------------------------------------------------------*/
 #if 1
 #define CONFIG_HARD_I2C		1		/* To enable I2C support	*/
-#undef  CONFIG_SOFT_I2C				/* I2C bit-banged		*/
-#define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
+#define CONFIG_SYS_I2C_SPEED		400000
 #define CONFIG_SYS_I2C_SLAVE		0x7F
 #endif
 
include/configs/vct.h +6 -6
index b4b0949..c59a02e 100644
@@ -246,11 +246,11 @@
 /*
  * I2C/EEPROM
  */
-#undef	CONFIG_HARD_I2C			/* I2C with hardware support	*/
-#define	CONFIG_SOFT_I2C			/* I2C bit-banged		*/
-
-#define CONFIG_SYS_I2C_SPEED		83000	/* 83 kHz is supposed to work	*/
-#define CONFIG_SYS_I2C_SLAVE		0x7f
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT		/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	83000	/* 83 kHz is supposed to work */
+#define CONFIG_SYS_I2C_SOFT_SLAVE	0x7f
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 
 /*
  * Software (bit-bang) I2C driver configuration
@@ -338,7 +338,7 @@ int vct_gpio_get(int pin);
 #undef CONFIG_CMD_USB
 
 #undef CONFIG_SMC911X
-#undef CONFIG_SOFT_I2C
+#undef CONFIG_SYS_I2C_SOFT
 #undef CONFIG_SOURCE
 #undef CONFIG_SYS_LONGHELP
 #undef CONFIG_TIMESTAMP
include/configs/vl_ma2sc.h +5 -2
index e2cf4f0..9c1d1c1 100644
@@ -147,10 +147,13 @@
 #define CONFIG_SYS_I2C_SLAVE			0		/* not used */
 
 #ifndef CONFIG_HARD_I2C
-#define CONFIG_SOFT_I2C
+#define CONFIG_SYS_I2C
+#define CONFIG_SYS_I2C_SOFT			/* I2C bit-banged */
+#define CONFIG_SYS_I2C_SOFT_SPEED	CONFIG_SYS_I2C_SPEED
+#define CONFIG_SYS_I2C_SOFT_SLAVE	CONFIG_SYS_I2C_SLAVE
+#define CONFIG_SYS_I2C_ADAPTERS		{&soft_i2c_adap[0]}
 
 /* Software  I2C driver configuration */
-
 #define I2C_DELAY	udelay(2500000/CONFIG_SYS_I2C_SPEED)
 
 #define AT91_PIN_SDA	(1<<4)		/* AT91C_PIO_PB4 */
include/configs/vme8349.h +0 -1
index 61e02e6..eec7ee2 100644
@@ -239,7 +239,6 @@
 /* I2C */
 #define CONFIG_I2C_MULTI_BUS
 #define CONFIG_HARD_I2C		/* I2C with hardware support*/
-#undef CONFIG_SOFT_I2C		/* I2C bit-banged */
 #define CONFIG_FSL_I2C
 #define CONFIG_I2C_CMD_TREE
 #define CONFIG_SYS_I2C_SPEED	400000	/* I2C speed and slave address */
include/configs/zeus.h +0 -1
index b0c3bd5..75195bc 100644
@@ -169,7 +169,6 @@
  * I2C
  *----------------------------------------------------------------------*/
 #define CONFIG_HARD_I2C		1		/* I2C with hardware support	*/
-#undef	CONFIG_SOFT_I2C				/* I2C bit-banged		*/
 #define CONFIG_PPC4XX_I2C		/* use PPC4xx driver		*/
 #define CONFIG_SYS_I2C_SPEED		400000		/* I2C speed and slave address	*/
 #define CONFIG_SYS_I2C_SLAVE		0x7F
include/i2c.h +9 -0
index afb4409..8aca0b8 100644
@@ -287,6 +287,15 @@ unsigned int i2c_get_bus_speed(void);
  * Adjusts I2C pointers after U-Boot is relocated to DRAM
  */
 void i2c_reloc_fixup(void);
+#if defined(CONFIG_SYS_I2C_SOFT)
+void i2c_soft_init(void);
+void i2c_soft_active(void);
+void i2c_soft_tristate(void);
+int i2c_soft_read(void);
+void i2c_soft_sda(int bit);
+void i2c_soft_scl(int bit);
+void i2c_soft_delay(void);
+#endif
 #else
 
 /*
Signature · 1 line
1.7.7.6
#6 lore raw

cover Bring in new I2C framework

In reply to Heiko Schocher

Hi Heiko,

Quoted 10 lines · Heiko Schocher

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

I am very happy to see this, thank you.

I have brought this in and tried to get it running for Tegra. A few points:

1. The methods in struct i2c_adapter should IMO be passed a struct i2c_adapter *, so they can determine which adapter is being accessed. Otherwise I can't see how they would know.

2. The init is a bit odd, in that we can call init() repeatedly. Perhaps that function should be renamed to reset, and the init should be used for calling just once at the start?

3. Rather than each device having to call i2c_get_bus_num() to find out what bus is referred to, why not just pass this information in? In fact the adapter pointer can serve for this.

4. So perhaps the i2c read/write functions should change from:

int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)

to:

int i2c_read((struct i2c_adapter *adapter, uint addr, int alen, uchar *buffer, int len)

Later, I wonder whether the concept of a 'current' i2c bus should be maintained by the command line interpreter, rather than the i2c system. Because to be honest, most of the drivers I see have to save the current bus number, set the current bus, do the operation, then set the bus back how they found it (to preserve whatever the user things is the current bus).

Granted there is overhead with i2c muxes, but the i2c core can remember the state of these muxes and doesn't have to switch things until there has been a change since the last transaction.

This last suggestion can be dealt with later, but I thought I would bring it up.

Regards,
Simon

Quoted 207 lines
Cc Simon Glass <[email protected]>
Cc Piotr Wilczek <[email protected]>

Heiko Schocher (3):
i2c: add i2c_core and prepare for new multibus support
i2c: common changes for multibus/multiadapter support i2c, soft-i2c: switch to new multibus/multiadapter support

 README                                    |   89 +++++++-
 arch/arm/include/asm/global_data.h        |    3 +
 arch/arm/lib/board.c                      |   15 +-
 arch/avr32/include/asm/global_data.h      |    3 +
 arch/blackfin/include/asm/global_data.h   |    4 +-
 arch/blackfin/lib/board.c                 |    7 +
 arch/m68k/include/asm/global_data.h       |    3 +
 arch/m68k/lib/board.c                     |   15 +-
 arch/microblaze/include/asm/global_data.h |    3 +
 arch/mips/include/asm/global_data.h       |    3 +
 arch/mips/lib/board.c                     |    7 +
 arch/nds32/include/asm/global_data.h      |    3 +
 arch/nds32/lib/board.c                    |   10 +-
 arch/nios2/include/asm/global_data.h      |    3 +
 arch/powerpc/cpu/mpc8xx/video.c           |    4 +
 arch/powerpc/include/asm/global_data.h    |    3 +
 arch/powerpc/lib/board.c                  |   16 +-
 arch/sh/include/asm/global_data.h         |    3 +
 arch/sparc/include/asm/global_data.h      |    3 +
 arch/x86/include/asm/global_data.h        |    3 +
 board/BuS/eb_cpux9k2/cpux9k2.c            |    2 +-
 board/BuS/vl_ma2sc/vl_ma2sc.c             |    2 +-
 board/atc/atc.c                           |    2 +-
 board/bluewater/snapper9260/snapper9260.c |    2 +-
 board/cm5200/cm5200.c                     |    4 +-
 board/cpu86/cpu86.c                       |    2 +-
 board/cpu87/cpu87.c                       |    2 +-
 board/emk/top9000/top9000.c               |    8 +-
 board/eukrea/cpuat91/cpuat91.c            |    2 +-
 board/freescale/m52277evb/README          |    2 +-
 board/freescale/m53017evb/README          |    2 +-
 board/freescale/m5373evb/README           |    2 +-
 board/freescale/m54455evb/README          |    2 +-
 board/freescale/m547xevb/README           |    2 +-
 board/ids8247/ids8247.c                   |    2 +-
 board/keymile/common/common.c             |    3 +-
 board/keymile/common/ivm.c                |   15 +-
 board/keymile/km82xx/km82xx.c             |    2 +-
 board/keymile/km_arm/km_arm.c             |    8 +-
 board/lwmon/lwmon.c                       |    2 +-
 board/lwmon/pcmcia.c                      |    4 +-
 board/pm826/pm826.c                       |    2 +-
 board/pm828/pm828.c                       |    2 +-
 board/sacsng/ioconfig.h                   |    2 +-
 board/sandburst/karef/karef.c             |    1 -
 board/siemens/SCM/scm.c                   |    2 +-
 board/tqc/tqm8260/tqm8260.c               |    2 +-
 board/tqc/tqm8272/tqm8272.c               |    2 +-
 board/tqc/tqm8272/tqm8272.h               |    2 +-
 common/cmd_date.c                         |    9 +
 common/cmd_dtt.c                          |    9 +
 common/cmd_eeprom.c                       |    3 +-
 common/cmd_i2c.c                          |  118 ++++++---
 common/env_eeprom.c                       |   14 +
 common/stdio.c                            |   14 +-
 drivers/i2c/Makefile                      |    3 +-
 drivers/i2c/i2c_core.c                    |  367 +++++++++++++++++++++++++++++
 drivers/i2c/soft_i2c.c                    |  122 ++++++----
 include/configs/A3000.h                   |    4 +-
 include/configs/BSC9131RDB.h              |    1 -
 include/configs/CANBT.h                   |    4 +
 include/configs/CPU86.h                   |    9 +-
 include/configs/CPU87.h                   |    9 +-
 include/configs/DU440.h                   |    1 -
 include/configs/GEN860T.h                 |   36 ++--
 include/configs/HIDDEN_DRAGON.h           |   10 +-
 include/configs/IAD210.h                  |   12 +-
 include/configs/ICU862.h                  |   14 +-
 include/configs/IDS8247.h                 |   10 +-
 include/configs/IP860.h                   |   10 +-
 include/configs/IPHASE4539.h              |   12 +-
 include/configs/JSE.h                     |    1 -
 include/configs/KAREF.h                   |    1 -
 include/configs/KUP4K.h                   |   12 +-
 include/configs/KUP4X.h                   |   14 +-
 include/configs/M5208EVBE.h               |    1 -
 include/configs/M52277EVB.h               |    1 -
 include/configs/M5235EVB.h                |    1 -
 include/configs/M5271EVB.h                |    1 -
 include/configs/M5275EVB.h                |    1 -
 include/configs/M53017EVB.h               |    1 -
 include/configs/M5329EVB.h                |    1 -
 include/configs/M5373EVB.h                |    1 -
 include/configs/M54451EVB.h               |    1 -
 include/configs/M54455EVB.h               |    1 -
 include/configs/M5475EVB.h                |    1 -
 include/configs/M5485EVB.h                |    1 -
 include/configs/METROBOX.h                |    1 -
 include/configs/MHPC.h                    |    9 +-
 include/configs/MPC8323ERDB.h             |    1 -
 include/configs/MPC832XEMDS.h             |    1 -
 include/configs/MPC8349EMDS.h             |    1 -
 include/configs/MPC8349ITX.h              |    2 -
 include/configs/MPC8360EMDS.h             |    1 -
 include/configs/MPC8360ERDK.h             |    1 -
 include/configs/MPC837XEMDS.h             |    1 -
 include/configs/MPC837XERDB.h             |    1 -
 include/configs/MPC8536DS.h               |    1 -
 include/configs/MPC8540ADS.h              |    1 -
 include/configs/MPC8541CDS.h              |    1 -
 include/configs/MPC8544DS.h               |    1 -
 include/configs/MPC8548CDS.h              |    3 +-
 include/configs/MPC8555CDS.h              |    1 -
 include/configs/MPC8560ADS.h              |    1 -
 include/configs/MPC8568MDS.h              |    1 -
 include/configs/MPC8569MDS.h              |    1 -
 include/configs/MPC8572DS.h               |    1 -
 include/configs/MPC8610HPCD.h             |    1 -
 include/configs/MPC8641HPCN.h             |    1 -
 include/configs/P1010RDB.h                |    1 -
 include/configs/P1023RDS.h                |    1 -
 include/configs/P1_P2_RDB.h               |    1 -
 include/configs/P2020COME.h               |    1 -
 include/configs/PM826.h                   |    9 +-
 include/configs/PM828.h                   |    9 +-
 include/configs/PMC440.h                  |    1 -
 include/configs/R360MPI.h                 |    7 +-
 include/configs/RPXClassic.h              |   16 +-
 include/configs/RPXlite.h                 |   26 ++
 include/configs/RRvision.h                |   13 +-
 include/configs/SBC8540.h                 |    1 -
 include/configs/SCM.h                     |   11 +-
 include/configs/SXNI855T.h                |    8 +-
 include/configs/Sandpoint8240.h           |   10 +-
 include/configs/Sandpoint8245.h           |   14 +-
 include/configs/TASREG.h                  |   27 +-
 include/configs/TK885D.h                  |   13 +-
 include/configs/TOP5200.h                 |   15 +-
 include/configs/TOP860.h                  |   11 +-
 include/configs/TQM8260.h                 |    9 +-
 include/configs/TQM8272.h                 |   13 +-
 include/configs/TQM834x.h                 |    1 -
 include/configs/TQM855M.h                 |   13 +-
 include/configs/TQM866M.h                 |   13 +-
 include/configs/TQM885D.h                 |   13 +-
 include/configs/alpr.h                    |    1 -
 include/configs/aria.h                    |    1 -
 include/configs/astro_mcf5373l.h          |    1 -
 include/configs/bf533-ezkit.h             |   10 +-
 include/configs/bf533-stamp.h             |   47 ++++-
 include/configs/bf561-ezkit.h             |    9 +-
 include/configs/bfin_adi_common.h         |    2 +-
 include/configs/blackstamp.h              |    1 -
 include/configs/cpuat91.h                 |    1 -
 include/configs/debris.h                  |   10 +-
 include/configs/eXalion.h                 |    2 +-
 include/configs/eb_cpux9k2.h              |   14 +-
 include/configs/ep8260.h                  |   14 +-
 include/configs/ethernut5.h               |    9 +-
 include/configs/ibf-dsp561.h              |    5 +-
 include/configs/iocon.h                   |   11 +-
 include/configs/km/keymile-common.h       |    3 -
 include/configs/km/km83xx-common.h        |    3 +
 include/configs/km/km_arm.h               |   26 ++-
 include/configs/km82xx.h                  |   18 +-
 include/configs/km_kirkwood.h             |   14 +-
 include/configs/korat.h                   |    1 -
 include/configs/lwmon.h                   |   13 +-
 include/configs/lwmon5.h                  |    1 -
 include/configs/mecp5123.h                |    1 -
 include/configs/mpc5121ads.h              |    1 -
 include/configs/nhk8815.h                 |    8 +-
 include/configs/otc570.h                  |   18 +-
 include/configs/p1_p2_rdb_pc.h            |    1 -
 include/configs/p3p440.h                  |    1 -
 include/configs/pcs440ep.h                |    1 -
 include/configs/pdnb3.h                   |   11 +-
 include/configs/quad100hd.h               |    1 -
 include/configs/s5p_goni.h                |    7 +-
 include/configs/s5pc210_universal.h       |    7 +-
 include/configs/sacsng.h                  |   12 +-
 include/configs/sbc405.h                  |    1 -
 include/configs/sbc8349.h                 |    1 -
 include/configs/sbc8548.h                 |    1 -
 include/configs/sbc8560.h                 |    1 -
 include/configs/sbc8641d.h                |    1 -
 include/configs/sc3.h                     |    1 -
 include/configs/snapper9260.h             |    9 +-
 include/configs/socrates.h                |    1 -
 include/configs/spc1920.h                 |   13 +-
 include/configs/stxgp3.h                  |    1 -
 include/configs/stxssa.h                  |    1 -
 include/configs/top9000.h                 |   10 +-
 include/configs/trats.h                   |    7 +-
 include/configs/u8500_href.h              |    1 -
 include/configs/uc100.h                   |   13 +-
 include/configs/utx8245.h                 |    3 +-
 include/configs/vct.h                     |   12 +-
 include/configs/vl_ma2sc.h                |    7 +-
 include/configs/vme8349.h                 |    1 -
 include/configs/zeus.h                    |    1 -
 include/i2c.h                             |  196 +++++++++++++++-
 192 files changed, 1443 insertions(+), 533 deletions(-)
 create mode 100644 drivers/i2c/i2c_core.c

--
1.7.7.6

#7 lore raw

cover Bring in new I2C framework

Hello Simon,

Quoted 6 lines · Simon Glass
Quoted 5 lines · Heiko Schocher

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

Quoted 7 lines
Quoted 5 lines

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

I am very happy to see this, thank you.

I am too ;-) and Sorry that I am only now ready ...

Quoted 5 lines

I have brought this in and tried to get it running for Tegra. A few points:

1. The methods in struct i2c_adapter should IMO be passed a struct i2c_adapter *, so they can determine which adapter is being accessed. Otherwise I can't see how they would know.

They can get the current used adapter through the defines in include/i2c.h:
[...]

#define I2C_ADAP_NR(bus)        i2c_adap[i2c_bus[bus].adapter]
#define I2C_BUS                 ((struct i2c_bus_hose *)gd->cur_i2c_bus)
#define I2C_ADAP                i2c_adap[I2C_BUS->adapter]
#define I2C_ADAP_HWNR           (I2C_ADAP->hwadapnr)

preparing just the fsl i2c driver and there I do for example:
drivers/i2c/fsl_i2c.c
[...]
static const struct fsl_i2c *i2c_dev[2] = {
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C_OFFSET),
#ifdef CONFIG_SYS_FSL_I2C2_OFFSET
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C2_OFFSET)
#endif
};
[...]
static int fsl_i2c_probe(uchar chip)

{
         struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[I2C_ADAP_HWNR];

[...]

but of course, we still can change the "struct i2c_adapter" if needed ... but we have one more parameter ... Ok, not really a bad problem.

Quoted 3 lines

2. The init is a bit odd, in that we can call init() repeatedly. Perhaps that function should be renamed to reset, and the init should be used for calling just once at the start?

What do you mean here exactly? I couldn?t parse this ...

Quoted 3 lines

3. Rather than each device having to call i2c_get_bus_num() to find out what bus is referred to, why not just pass this information in? In fact the adapter pointer can serve for this.

Not the "struct i2c_adapter" must passed, but the "struct i2c_bus"!

And each device should know, which i2c bus it uses, or? So at the end we should have something like i2c_read(struct i2c_bus *bus, ...) calls ... and the i2c core can detect, if this bus is the current, if so go on, if not switch to this bus. So at the end i2c_set_bus_num would be go static ...

Quoted 8 lines

4. So perhaps the i2c read/write functions should change from:

int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)

to:

int i2c_read((struct i2c_adapter *adapter, uint addr, int alen, uchar *buffer, int len)

Yep, exactly, see comments to point 3 ...

That would be the best (and I think in previous discussions I defined this as one goal ...), but this would be (another) big change, because this is an *API* change, with maybe a lot of config file changes ...

Let us bring in the new i2c framework with all i2c drivers converted, and then do the next step ... maybe one step more, if mareks device model is ready, we can switch easy to DM ... and maybe get this API change for free ...

Quoted 6 lines

Later, I wonder whether the concept of a 'current' i2c bus should be maintained by the command line interpreter, rather than the i2c system. Because to be honest, most of the drivers I see have to save the current bus number, set the current bus, do the operation, then set the bus back how they found it (to preserve whatever the user things is the current bus).

Yes, suboptimal ... but this is independent from the new i2c framework patches!

It is possible (with old/new i2c bus framework) to introduce a "current commandline i2c bus", and then, before calling i2c_read/write from the commandline, call a i2c_set_bus_num() ... then we can get rid of this store/restore current i2c bus ... waiting for patches ;-)

Quoted 3 lines

Granted there is overhead with i2c muxes, but the i2c core can remember the state of these muxes and doesn't have to switch things until there has been a change since the last transaction.

This exactly do the i2c_set_bus_num() now!

Quoted 1 line

This last suggestion can be dealt with later, but I thought I would bring it up.

I am happy about every comment! :-)

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#8 lore raw

cover Bring in new I2C framework

Quoted 45 lines · Heiko Schocher

Hello Simon,

Quoted 6 lines · Simon Glass
Quoted 5 lines · Heiko Schocher

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

Quoted 7 lines
Quoted 5 lines

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

I am very happy to see this, thank you.

I am too ;-) and Sorry that I am only now ready ...

Quoted 6 lines

I have brought this in and tried to get it running for Tegra. A few points:

1. The methods in struct i2c_adapter should IMO be passed a struct i2c_adapter *, so they can determine which adapter is being accessed. Otherwise I can't see how they would know.

They can get the current used adapter through the defines in include/i2c.h:
[...]

#define I2C_ADAP_NR(bus)        i2c_adap[i2c_bus[bus].adapter]
#define I2C_BUS                 ((struct i2c_bus_hose *)gd->cur_i2c_bus)
#define I2C_ADAP                i2c_adap[I2C_BUS->adapter]
#define I2C_ADAP_HWNR           (I2C_ADAP->hwadapnr)

preparing just the fsl i2c driver and there I do for example:
drivers/i2c/fsl_i2c.c
[...]
static const struct fsl_i2c *i2c_dev[2] = {
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C_OFFSET),
#ifdef CONFIG_SYS_FSL_I2C2_OFFSET
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C2_OFFSET)
#endif
};
[...]
static int fsl_i2c_probe(uchar chip)

Quoted 7 lines
{
        struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[I2C_ADAP_HWNR];

[...]

but of course, we still can change the "struct i2c_adapter" if needed ... but we have one more parameter ... Ok, not really a bad problem.

That rather relies on their being a concept of a "current" I2C adapter. It seems a little limiting to require that. What if the "current" adapter is the user-selected adapter for commands to operate on, but e.g. some power-management driver wants to use I2C to communicate with a PMIC during the internals of some other command. Sure, you could save and later restore the I2C core's idea of "current" adapter, but it'd surely be cleaner to just pass around the I2C adapter ID or struct pointer everywhere to avoid the need for save/restore.

#9 lore raw

cover Bring in new I2C framework

Hello Stephen,

Quoted 54 lines · Stephen Warren
Quoted 45 lines · Heiko Schocher

Hello Simon,

Quoted 6 lines · Simon Glass
Quoted 5 lines · Heiko Schocher

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

Quoted 7 lines
Quoted 5 lines

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

I am very happy to see this, thank you.

I am too ;-) and Sorry that I am only now ready ...

Quoted 6 lines

I have brought this in and tried to get it running for Tegra. A few points:

1. The methods in struct i2c_adapter should IMO be passed a struct i2c_adapter *, so they can determine which adapter is being accessed. Otherwise I can't see how they would know.

They can get the current used adapter through the defines in include/i2c.h:
[...]

#define I2C_ADAP_NR(bus)        i2c_adap[i2c_bus[bus].adapter]
#define I2C_BUS                 ((struct i2c_bus_hose *)gd->cur_i2c_bus)
#define I2C_ADAP                i2c_adap[I2C_BUS->adapter]
#define I2C_ADAP_HWNR           (I2C_ADAP->hwadapnr)

preparing just the fsl i2c driver and there I do for example:
drivers/i2c/fsl_i2c.c
[...]
static const struct fsl_i2c *i2c_dev[2] = {
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C_OFFSET),
#ifdef CONFIG_SYS_FSL_I2C2_OFFSET
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C2_OFFSET)
#endif
};
[...]
static int fsl_i2c_probe(uchar chip)

Quoted 7 lines
{
         struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[I2C_ADAP_HWNR];

[...]

but of course, we still can change the "struct i2c_adapter" if needed ... but we have one more parameter ... Ok, not really a bad problem.

Quoted 8 lines

That rather relies on their being a concept of a "current" I2C adapter. It seems a little limiting to require that. What if the "current" adapter is the user-selected adapter for commands to operate on, but e.g. some power-management driver wants to use I2C to communicate with a PMIC during the internals of some other command. Sure, you could save and later restore the I2C core's idea of "current" adapter, but it'd surely be cleaner to just pass around the I2C adapter ID or struct pointer everywhere to avoid the need for save/restore.

Yes, you are right, but just the same problem with current code! You mixed here two things!

The idea behind the current i2c adapter was/is, that the i2c core need to know, which bus is "current" because there is the possibility that on one adapter are more i2c busses, because of using i2c muxes ... and we must know, on which bus we are currently, because if we want to switch to another bus, we must first disable the old way (and maybe disable the i2c adapter too). -> If we want this feature, we need a current adapter. If we say,
Ok, we do not want this disabling... we can get rid of it, yes!

But I think it is safer to disable the i2c muxes, before switching to another bus ... so this "current i2c adapter" is an i2c core internal! We should of course change the i2c API that we pass the bus to the i2c API, but, as I said this to simon, this is another big change, and I want to have this step after getting in the new i2c framework (and maybe hope, that when we convert to mareks DM, we get this for free), because we must also adapt for example all dtt, RTC, because they need to know on which bus they resist, and we have to config this ...

The problem from storing/restoring the "current cmdline i2c bus", is another problem, which is an independent patch! You can make with current code a patch, which holds the current i2c cmdline bus in a variable, and then get rid of this store/ restore calls as for example found in cmd_date.c ...

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#10 lore raw

cover Bring in new I2C framework

Quoted 68 lines · Heiko Schocher

Hello Stephen,

Quoted 56 lines · Stephen Warren
Quoted 47 lines · Heiko Schocher

Hello Simon,

Quoted 6 lines · Simon Glass
Quoted 5 lines · Heiko Schocher

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

Quoted 7 lines
Quoted 5 lines

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

I am very happy to see this, thank you.

I am too ;-) and Sorry that I am only now ready ...

Quoted 6 lines

I have brought this in and tried to get it running for Tegra. A few points:

1. The methods in struct i2c_adapter should IMO be passed a struct i2c_adapter *, so they can determine which adapter is being accessed. Otherwise I can't see how they would know.

They can get the current used adapter through the defines in include/i2c.h:
[...]

#define I2C_ADAP_NR(bus)        i2c_adap[i2c_bus[bus].adapter]
#define I2C_BUS                 ((struct i2c_bus_hose *)gd->cur_i2c_bus)
#define I2C_ADAP                i2c_adap[I2C_BUS->adapter]
#define I2C_ADAP_HWNR           (I2C_ADAP->hwadapnr)

preparing just the fsl i2c driver and there I do for example:
drivers/i2c/fsl_i2c.c
[...]
static const struct fsl_i2c *i2c_dev[2] = {
(struct fsl_i2c *) (CONFIG_SYS_IMMR +
CONFIG_SYS_FSL_I2C_OFFSET),
#ifdef CONFIG_SYS_FSL_I2C2_OFFSET
(struct fsl_i2c *) (CONFIG_SYS_IMMR +
CONFIG_SYS_FSL_I2C2_OFFSET)
#endif
};
[...]
static int fsl_i2c_probe(uchar chip)

Quoted 7 lines
{
         struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[I2C_ADAP_HWNR];

[...]

but of course, we still can change the "struct i2c_adapter" if needed ... but we have one more parameter ... Ok, not really a bad problem.

Quoted 8 lines

That rather relies on their being a concept of a "current" I2C adapter. It seems a little limiting to require that. What if the "current" adapter is the user-selected adapter for commands to operate on, but e.g. some power-management driver wants to use I2C to communicate with a PMIC during the internals of some other command. Sure, you could save and later restore the I2C core's idea of "current" adapter, but it'd surely be cleaner to just pass around the I2C adapter ID or struct pointer everywhere to avoid the need for save/restore.

Quoted 2 lines

Yes, you are right, but just the same problem with current code! You mixed here two things!

I think you're reading more into what I was saying than what I actually said.

If there are e.g. 4 I2C controllers in an SoC, the driver needs to know which one is in use. Passing that information directly to the driver functions is much simple than requiring the SoC I2C driver to go grovel in some I2C core global variables to find out the same information.

This is all unrelated to I2C bus muxes; they shouldn't be implemented as part of an SoC I2C driver anyway, so the driver shouldn't know about bus muxes before or after this patch - the I2C core should manage that.

#11 lore raw

cover Bring in new I2C framework

Hi Stephen,

Quoted 72 lines · Stephen Warren
Quoted 68 lines · Heiko Schocher

Hello Stephen,

Quoted 56 lines · Stephen Warren
Quoted 47 lines · Heiko Schocher

Hello Simon,

Quoted 6 lines · Simon Glass
Quoted 5 lines · Heiko Schocher

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

Quoted 7 lines
Quoted 5 lines

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

I am very happy to see this, thank you.

I am too ;-) and Sorry that I am only now ready ...

Quoted 6 lines

I have brought this in and tried to get it running for Tegra. A few points:

1. The methods in struct i2c_adapter should IMO be passed a struct i2c_adapter *, so they can determine which adapter is being accessed. Otherwise I can't see how they would know.

They can get the current used adapter through the defines in include/i2c.h:
[...]

#define I2C_ADAP_NR(bus)        i2c_adap[i2c_bus[bus].adapter]
#define I2C_BUS                 ((struct i2c_bus_hose *)gd->cur_i2c_bus)
#define I2C_ADAP                i2c_adap[I2C_BUS->adapter]
#define I2C_ADAP_HWNR           (I2C_ADAP->hwadapnr)

preparing just the fsl i2c driver and there I do for example:
drivers/i2c/fsl_i2c.c
[...]
static const struct fsl_i2c *i2c_dev[2] = {
(struct fsl_i2c *) (CONFIG_SYS_IMMR +
CONFIG_SYS_FSL_I2C_OFFSET),
#ifdef CONFIG_SYS_FSL_I2C2_OFFSET
(struct fsl_i2c *) (CONFIG_SYS_IMMR +
CONFIG_SYS_FSL_I2C2_OFFSET)
#endif
};
[...]
static int fsl_i2c_probe(uchar chip)

Quoted 7 lines
{
         struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[I2C_ADAP_HWNR];

[...]

but of course, we still can change the "struct i2c_adapter" if needed ... but we have one more parameter ... Ok, not really a bad problem.

Quoted 8 lines

That rather relies on their being a concept of a "current" I2C adapter. It seems a little limiting to require that. What if the "current" adapter is the user-selected adapter for commands to operate on, but e.g. some power-management driver wants to use I2C to communicate with a PMIC during the internals of some other command. Sure, you could save and later restore the I2C core's idea of "current" adapter, but it'd surely be cleaner to just pass around the I2C adapter ID or struct pointer everywhere to avoid the need for save/restore.

Quoted 2 lines

Yes, you are right, but just the same problem with current code! You mixed here two things!

Quoted 7 lines

I think you're reading more into what I was saying than what I actually said.

If there are e.g. 4 I2C controllers in an SoC, the driver needs to know which one is in use. Passing that information directly to the driver functions is much simple than requiring the SoC I2C driver to go grovel in some I2C core global variables to find out the same information.

I think Heiko agreed with this, just that he wants to take things a step at a time.

Quoted 4 lines

This is all unrelated to I2C bus muxes; they shouldn't be implemented as part of an SoC I2C driver anyway, so the driver shouldn't know about bus muxes before or after this patch - the I2C core should manage that.

Regards,
Simon

#12 lore raw

cover Bring in new I2C framework

In reply to Stephen Warren

Hello Stephen,

Quoted 9 lines · Stephen Warren
Quoted 8 lines · Heiko Schocher

Hello Stephen,

Quoted 5 lines · Stephen Warren
Quoted 4 lines · Heiko Schocher

Hello Simon,

Quoted 1 line · Simon Glass

On Mon, Oct 22, 2012 at 10:40 AM, Heiko Schocher<[email protected]> wrote:

[...]

Quoted 9 lines
Quoted 9 lines
Quoted 8 lines

That rather relies on their being a concept of a "current" I2C adapter. It seems a little limiting to require that. What if the "current" adapter is the user-selected adapter for commands to operate on, but e.g. some power-management driver wants to use I2C to communicate with a PMIC during the internals of some other command. Sure, you could save and later restore the I2C core's idea of "current" adapter, but it'd surely be cleaner to just pass around the I2C adapter ID or struct pointer everywhere to avoid the need for save/restore.

Quoted 5 lines
Quoted 2 lines

Yes, you are right, but just the same problem with current code! You mixed here two things!

I think you're reading more into what I was saying than what I actually said.

Sorry, maybe I misunderstood you ...

Quoted 4 lines

If there are e.g. 4 I2C controllers in an SoC, the driver needs to know which one is in use. Passing that information directly to the driver functions is much simple than requiring the SoC I2C driver to go grovel in some I2C core global variables to find out the same information.

Ah, do you mean we should change the i2c adapter struct from:

struct i2c_adapter {
        void            (*init)(int speed, int slaveaddr);
        int             (*probe)(uint8_t chip);
        int             (*read)(uint8_t chip, uint addr, int alen,
                                uint8_t *buffer, int len);
        int             (*write)(uint8_t chip, uint addr, int alen,
                                uint8_t *buffer, int len);
        uint            (*set_bus_speed)(uint speed);

[...]

to

struct i2c_adapter {
        void            (*init)(struct i2c_adapter *adap, int speed, int slaveaddr);
        int             (*probe)(struct i2c_adapter *adap, uint8_t chip);
        int             (*read)(struct i2c_adapter *adap, uint8_t chip, uint addr, int alen,
                                uint8_t *buffer, int len);
        int             (*write)(struct i2c_adapter *adap, uint8_t chip, uint addr, int alen,
                                uint8_t *buffer, int len);
        uint            (*set_bus_speed)(struct i2c_adapter *adap, uint speed);

[...]
?

We can do this. Simon suggested this too ...

@Simon: Is this Ok with you?

Nevertheless, we need a "cur_i2c_bus" pointer, as the i2c core, needs to know the current i2c bus for detecting if the bus, which whould be accessed is the current or not and a switching to another bus is needed.

Quoted 3 lines

This is all unrelated to I2C bus muxes; they shouldn't be implemented as part of an SoC I2C driver anyway, so the driver shouldn't know about bus muxes before or after this patch - the I2C core should manage that.

Exactly! And that do the new i2c framework in i2c_core.c!

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#13 lore raw

cover Bring in new I2C framework

Quoted 3 lines · Heiko Schocher

Hello Stephen,

On 29.10.2012 16:34, Stephen Warren wrote:

...

Quoted 34 lines
Quoted 4 lines

If there are e.g. 4 I2C controllers in an SoC, the driver needs to know which one is in use. Passing that information directly to the driver functions is much simple than requiring the SoC I2C driver to go grovel in some I2C core global variables to find out the same information.

Ah, do you mean we should change the i2c adapter struct from:

struct i2c_adapter {
       void            (*init)(int speed, int slaveaddr);
       int             (*probe)(uint8_t chip);
       int             (*read)(uint8_t chip, uint addr, int alen,
                               uint8_t *buffer, int len);
       int             (*write)(uint8_t chip, uint addr, int alen,
                               uint8_t *buffer, int len);
       uint            (*set_bus_speed)(uint speed);

[...]

to

struct i2c_adapter {
void (*init)(struct i2c_adapter *adap, int speed, int
slaveaddr);
int (*probe)(struct i2c_adapter *adap, uint8_t chip);
int (*read)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
int (*write)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
uint (*set_bus_speed)(struct i2c_adapter *adap, uint
speed);
[...]
?

Quoted 1 line

We can do this. Simon suggested this too ...

Yes, exactly. (the functions will need some way to get information out of the struct i2c_adapter; I assume there's some kind of driver_private field in there too).

#14 lore raw

cover Bring in new I2C framework

Hi,

Quoted 39 lines · Stephen Warren
Quoted 3 lines · Heiko Schocher

Hello Stephen,

On 29.10.2012 16:34, Stephen Warren wrote:

...

Quoted 34 lines
Quoted 4 lines

If there are e.g. 4 I2C controllers in an SoC, the driver needs to know which one is in use. Passing that information directly to the driver functions is much simple than requiring the SoC I2C driver to go grovel in some I2C core global variables to find out the same information.

Ah, do you mean we should change the i2c adapter struct from:

struct i2c_adapter {
       void            (*init)(int speed, int slaveaddr);
       int             (*probe)(uint8_t chip);
       int             (*read)(uint8_t chip, uint addr, int alen,
                               uint8_t *buffer, int len);
       int             (*write)(uint8_t chip, uint addr, int alen,
                               uint8_t *buffer, int len);
       uint            (*set_bus_speed)(uint speed);

[...]

to

struct i2c_adapter {
void (*init)(struct i2c_adapter *adap, int speed, int
slaveaddr);
int (*probe)(struct i2c_adapter *adap, uint8_t chip);
int (*read)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
int (*write)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
uint (*set_bus_speed)(struct i2c_adapter *adap, uint
speed);
[...]
?

Quoted 5 lines
Quoted 1 line

We can do this. Simon suggested this too ...

Yes, exactly. (the functions will need some way to get information out of the struct i2c_adapter; I assume there's some kind of driver_private field in there too).

Yes.

I will post a few patches to move Tegra over to the new framework as it is, so that people can see the impact. Given that every driver has to change, it would be my preference to set the i2c API once. But I suppose within a short while everything will move to the device model, so perhaps the job of this series is just to move things in the right direction?

Regards,
Simon

#15 lore raw

cover Bring in new I2C framework

Hello Simon,

Quoted 48 lines · Simon Glass

Hi,

Quoted 39 lines · Stephen Warren
Quoted 3 lines · Heiko Schocher

Hello Stephen,

On 29.10.2012 16:34, Stephen Warren wrote:

...

Quoted 34 lines
Quoted 4 lines

If there are e.g. 4 I2C controllers in an SoC, the driver needs to know which one is in use. Passing that information directly to the driver functions is much simple than requiring the SoC I2C driver to go grovel in some I2C core global variables to find out the same information.

Ah, do you mean we should change the i2c adapter struct from:

struct i2c_adapter {
        void            (*init)(int speed, int slaveaddr);
        int             (*probe)(uint8_t chip);
        int             (*read)(uint8_t chip, uint addr, int alen,
                                uint8_t *buffer, int len);
        int             (*write)(uint8_t chip, uint addr, int alen,
                                uint8_t *buffer, int len);
        uint            (*set_bus_speed)(uint speed);

[...]

to

struct i2c_adapter {
void (*init)(struct i2c_adapter *adap, int speed, int
slaveaddr);
int (*probe)(struct i2c_adapter *adap, uint8_t chip);
int (*read)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
int (*write)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
uint (*set_bus_speed)(struct i2c_adapter *adap, uint
speed);
[...]
?

Quoted 5 lines
Quoted 1 line

We can do this. Simon suggested this too ...

Yes, exactly. (the functions will need some way to get information out of the struct i2c_adapter; I assume there's some kind of driver_private field in there too).

Quoted 8 lines

Yes.

I will post a few patches to move Tegra over to the new framework as it is, so that people can see the impact. Given that every driver has to change, it would be my preference to set the i2c API once. But I suppose within a short while everything will move to the device model, so perhaps the job of this series is just to move things in the right direction?

Yes, but not only, I think the i2c framework needs an update.

bye,
heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#16 lore raw

cover Bring in new I2C framework

In reply to Simon Glass
Quoted 48 lines · Simon Glass

Hi,

Quoted 39 lines · Stephen Warren
Quoted 3 lines · Heiko Schocher

Hello Stephen,

On 29.10.2012 16:34, Stephen Warren wrote:

...

Quoted 34 lines
Quoted 4 lines

If there are e.g. 4 I2C controllers in an SoC, the driver needs to know which one is in use. Passing that information directly to the driver functions is much simple than requiring the SoC I2C driver to go grovel in some I2C core global variables to find out the same information.

Ah, do you mean we should change the i2c adapter struct from:

struct i2c_adapter {
       void            (*init)(int speed, int slaveaddr);
       int             (*probe)(uint8_t chip);
       int             (*read)(uint8_t chip, uint addr, int alen,
                               uint8_t *buffer, int len);
       int             (*write)(uint8_t chip, uint addr, int alen,
                               uint8_t *buffer, int len);
       uint            (*set_bus_speed)(uint speed);

[...]

to

struct i2c_adapter {
void (*init)(struct i2c_adapter *adap, int speed, int
slaveaddr);
int (*probe)(struct i2c_adapter *adap, uint8_t chip);
int (*read)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
int (*write)(struct i2c_adapter *adap, uint8_t chip,
uint addr, int alen,
uint8_t *buffer, int len);
uint (*set_bus_speed)(struct i2c_adapter *adap, uint
speed);
[...]
?

Quoted 5 lines
Quoted 1 line

We can do this. Simon suggested this too ...

Yes, exactly. (the functions will need some way to get information out of the struct i2c_adapter; I assume there's some kind of driver_private field in there too).

Quoted 8 lines

Yes.

I will post a few patches to move Tegra over to the new framework as it is, so that people can see the impact. Given that every driver has to change, it would be my preference to set the i2c API once. But I suppose within a short while everything will move to the device model, so perhaps the job of this series is just to move things in the right direction?

Funny enough I don't see a UDM-i2c.txt file, so I guess the community gets to think about that one :)

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121030/48d42ea8/attachment.pgp>
#17 lore raw

cover Bring in new I2C framework

In reply to Heiko Schocher

Hi Heiko,

Quoted 61 lines · Heiko Schocher

Hello Simon,

Quoted 8 lines · Simon Glass
Quoted 6 lines · Heiko Schocher

rebased/reworked the I2C multibus patches from Simon Glass found here:

http://www.mail-archive.com/u-boot at lists.denx.de/msg75530.html

Quoted 8 lines
Quoted 5 lines

It seems the timing is coming, to bring this in mainline and move boards over to the new i2c framework. As an example I converted the soft-i2c driver (and all boards using it) to the new framework, so this patchseries has to be tested intensively, as I can check compile only ...

I am very happy to see this, thank you.

I am too ;-) and Sorry that I am only now ready ...

Quoted 6 lines

I have brought this in and tried to get it running for Tegra. A few points:

1. The methods in struct i2c_adapter should IMO be passed a struct i2c_adapter *, so they can determine which adapter is being accessed. Otherwise I can't see how they would know.

They can get the current used adapter through the defines in include/i2c.h:
[...]

#define I2C_ADAP_NR(bus)        i2c_adap[i2c_bus[bus].adapter]
#define I2C_BUS                 ((struct i2c_bus_hose *)gd->cur_i2c_bus)
#define I2C_ADAP                i2c_adap[I2C_BUS->adapter]
#define I2C_ADAP_HWNR           (I2C_ADAP->hwadapnr)

preparing just the fsl i2c driver and there I do for example:
drivers/i2c/fsl_i2c.c
[...]
static const struct fsl_i2c *i2c_dev[2] = {
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C_OFFSET),
#ifdef CONFIG_SYS_FSL_I2C2_OFFSET
(struct fsl_i2c *) (CONFIG_SYS_IMMR + CONFIG_SYS_FSL_I2C2_OFFSET)
#endif
};
[...]
static int fsl_i2c_probe(uchar chip)

{
        struct fsl_i2c *dev = (struct fsl_i2c *)i2c_dev[I2C_ADAP_HWNR];

[...]

but of course, we still can change the "struct i2c_adapter" if needed ... but we have one more parameter ... Ok, not really a bad problem.

Quoted 6 lines
Quoted 3 lines

2. The init is a bit odd, in that we can call init() repeatedly. Perhaps that function should be renamed to reset, and the init should be used for calling just once at the start?

What do you mean here exactly? I couldn?t parse this ...

Well there is start-of-day setup, which I think should be called init. This is done once on boot for each i2c adapter.

And then there is the i2c_init() which seems to be called whenever we feel like it - e.g. to change speed. I suggest that we use init() to mean start-of-day init and reset(), or similar, to mean any post-init. I am not suggest that for this series, just as a future effort.

Quoted 34 lines
Quoted 5 lines

3. Rather than each device having to call i2c_get_bus_num() to find out what bus is referred to, why not just pass this information in? In fact the adapter pointer can serve for this.

Not the "struct i2c_adapter" must passed, but the "struct i2c_bus"!

And each device should know, which i2c bus it uses, or? So at the end we should have something like i2c_read(struct i2c_bus *bus, ...) calls ... and the i2c core can detect, if this bus is the current, if so go on, if not switch to this bus. So at the end i2c_set_bus_num would be go static ...

Quoted 8 lines

4. So perhaps the i2c read/write functions should change from:

int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)

to:

int i2c_read((struct i2c_adapter *adapter, uint addr, int alen, uchar *buffer, int len)

Yep, exactly, see comments to point 3 ...

That would be the best (and I think in previous discussions I defined this as one goal ...), but this would be (another) big change, because this is an *API* change, with maybe a lot of config file changes ...

Quoted 4 lines

Let us bring in the new i2c framework with all i2c drivers converted, and then do the next step ... maybe one step more, if mareks device model is ready, we can switch easy to DM ... and maybe get this API change for free ...

Yes. I certainly understand the need to fit in with what is already there, and avoid a massive API change, which can be performed as a follow-on patch anyway. With your info above I will adjust the tegra driver to work with this and test it.

Quoted 10 lines
Quoted 8 lines

Later, I wonder whether the concept of a 'current' i2c bus should be maintained by the command line interpreter, rather than the i2c system. Because to be honest, most of the drivers I see have to save the current bus number, set the current bus, do the operation, then set the bus back how they found it (to preserve whatever the user things is the current bus).

Quoted 7 lines

Yes, suboptimal ... but this is independent from the new i2c framework patches!

It is possible (with old/new i2c bus framework) to introduce a "current commandline i2c bus", and then, before calling i2c_read/write from the commandline, call a i2c_set_bus_num() ... then we can get rid of this store/restore current i2c bus ... waiting for patches ;-)

OK.

Quoted 8 lines
Quoted 5 lines

Granted there is overhead with i2c muxes, but the i2c core can remember the state of these muxes and doesn't have to switch things until there has been a change since the last transaction.

This exactly do the i2c_set_bus_num() now!

Great.

Quoted 7 lines
Quoted 4 lines

This last suggestion can be dealt with later, but I thought I would bring it up.

I am happy about every comment! :-)

Thanks,
Simon

Quoted 6 lines

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

#18 lore raw

cover Bring in new I2C framework

Hello Simon,

Quoted 7 lines · Simon Glass
Quoted 6 lines · Heiko Schocher

Hello Simon,

Quoted 2 lines · Simon Glass

On Mon, Oct 22, 2012 at 10:40 AM, Heiko Schocher<[email protected]> wrote:

[...]

Quoted 9 lines
Quoted 6 lines
Quoted 3 lines

2. The init is a bit odd, in that we can call init() repeatedly. Perhaps that function should be renamed to reset, and the init should be used for calling just once at the start?

What do you mean here exactly? I couldn?t parse this ...

Well there is start-of-day setup, which I think should be called init. This is done once on boot for each i2c adapter.

Hmm... I am not sure if this is only done on boot, because we should "close" or "deinit" an adapter if not used any more in U-Boot as the U-Boot principle says:

http://www.denx.de/wiki/view/U-Boot/DesignPrinciples#2_Keep_it_Fast

So I want to add in future some "deinit" to every adapter, and call it from i2c_set_bus() when switching to another i2c adapter ...

Quoted 4 lines

And then there is the i2c_init() which seems to be called whenever we feel like it - e.g. to change speed. I suggest that we use init() to mean start-of-day init and reset(), or similar, to mean any post-init. I am not suggest that for this series, just as a future effort.

Yes, that should be changed. We do not need an init() in the i2c API, as i2c_set_bus_num() do this for us (and later also the deinit())

We just need a set/get_speed() and a deblock()/reset() ?

Maybe a step in the API cleanup?

Quoted 37 lines
Quoted 32 lines
Quoted 3 lines

3. Rather than each device having to call i2c_get_bus_num() to find out what bus is referred to, why not just pass this information in? In fact the adapter pointer can serve for this.

Not the "struct i2c_adapter" must passed, but the "struct i2c_bus"!

And each device should know, which i2c bus it uses, or? So at the end we should have something like i2c_read(struct i2c_bus *bus, ...) calls ... and the i2c core can detect, if this bus is the current, if so go on, if not switch to this bus. So at the end i2c_set_bus_num would be go static ...

Quoted 8 lines

4. So perhaps the i2c read/write functions should change from:

int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)

to:

int i2c_read((struct i2c_adapter *adapter, uint addr, int alen, uchar *buffer, int len)

Yep, exactly, see comments to point 3 ...

That would be the best (and I think in previous discussions I defined this as one goal ...), but this would be (another) big change, because this is an *API* change, with maybe a lot of config file changes ...

Quoted 4 lines

Let us bring in the new i2c framework with all i2c drivers converted, and then do the next step ... maybe one step more, if mareks device model is ready, we can switch easy to DM ... and maybe get this API change for free ...

Quoted 4 lines

Yes. I certainly understand the need to fit in with what is already there, and avoid a massive API change, which can be performed as a follow-on patch anyway. With your info above I will adjust the tegra driver to work with this and test it.

Ok, great! So I post v2 patches after you tested ...

And Yes, we should do this API change, but I tend to do this step after the new i2c framework is stable and all i2c drivers are converted to it ...

Quoted 31 lines
Quoted 8 lines
Quoted 6 lines

Later, I wonder whether the concept of a 'current' i2c bus should be maintained by the command line interpreter, rather than the i2c system. Because to be honest, most of the drivers I see have to save the current bus number, set the current bus, do the operation, then set the bus back how they found it (to preserve whatever the user things is the current bus).

Quoted 7 lines

Yes, suboptimal ... but this is independent from the new i2c framework patches!

It is possible (with old/new i2c bus framework) to introduce a "current commandline i2c bus", and then, before calling i2c_read/write from the commandline, call a i2c_set_bus_num() ... then we can get rid of this store/restore current i2c bus ... waiting for patches ;-)

OK.

Quoted 8 lines
Quoted 5 lines

Granted there is overhead with i2c muxes, but the i2c core can remember the state of these muxes and doesn't have to switch things until there has been a change since the last transaction.

This exactly do the i2c_set_bus_num() now!

Great.

Quoted 2 lines
Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

This last suggestion can be dealt with later, but I thought I would bring it up.

I am happy about every comment! :-)

Thanks,
Simon

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#19 lore raw

cover Bring in new I2C framework

Hi Heiko,

Quoted 30 lines · Heiko Schocher

Hello Simon,

Quoted 10 lines · Simon Glass
Quoted 8 lines · Heiko Schocher

Hello Simon,

Quoted 3 lines · Simon Glass

On Mon, Oct 22, 2012 at 10:40 AM, Heiko Schocher<[email protected]> wrote:

[...]

Quoted 11 lines
Quoted 7 lines
Quoted 3 lines

2. The init is a bit odd, in that we can call init() repeatedly. Perhaps that function should be renamed to reset, and the init should be used for calling just once at the start?

What do you mean here exactly? I couldn?t parse this ...

Well there is start-of-day setup, which I think should be called init. This is done once on boot for each i2c adapter.

Quoted 8 lines

Hmm... I am not sure if this is only done on boot, because we should "close" or "deinit" an adapter if not used any more in U-Boot as the U-Boot principle says:

http://www.denx.de/wiki/view/U-Boot/DesignPrinciples#2_Keep_it_Fast

So I want to add in future some "deinit" to every adapter, and call it from i2c_set_bus() when switching to another i2c adapter ...

Well deinit() should be probably be done before finishing U-Boot, not after every transaction, since you don't know that the current transaction will be the last.

When using FDT, you need to look up the available i2c ports in the driver, and this should be done once at the start. If the i2c core can call a suitable init function then this is easier, rather than us having to keep track of whether the init is done or not.

Quoted 8 lines
Quoted 6 lines

And then there is the i2c_init() which seems to be called whenever we feel like it - e.g. to change speed. I suggest that we use init() to mean start-of-day init and reset(), or similar, to mean any post-init. I am not suggest that for this series, just as a future effort.

Quoted 6 lines

Yes, that should be changed. We do not need an init() in the i2c API, as i2c_set_bus_num() do this for us (and later also the deinit())

We just need a set/get_speed() and a deblock()/reset() ?

Maybe a step in the API cleanup?

Yes, a future step I think. I feel that i2c is one of the darker corners of U-Boot and so am keen to get this tidied up.

Quoted 48 lines
Quoted 42 lines
Quoted 36 lines
Quoted 5 lines

3. Rather than each device having to call i2c_get_bus_num() to find out what bus is referred to, why not just pass this information in? In fact the adapter pointer can serve for this.

Not the "struct i2c_adapter" must passed, but the "struct i2c_bus"!

And each device should know, which i2c bus it uses, or? So at the end we should have something like i2c_read(struct i2c_bus *bus, ...) calls ... and the i2c core can detect, if this bus is the current, if so go on, if not switch to this bus. So at the end i2c_set_bus_num would be go static ...

Quoted 8 lines

4. So perhaps the i2c read/write functions should change from:

int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len)

to:

int i2c_read((struct i2c_adapter *adapter, uint addr, int alen, uchar *buffer, int len)

Yep, exactly, see comments to point 3 ...

That would be the best (and I think in previous discussions I defined this as one goal ...), but this would be (another) big change, because this is an *API* change, with maybe a lot of config file changes ...

Quoted 4 lines

Let us bring in the new i2c framework with all i2c drivers converted, and then do the next step ... maybe one step more, if mareks device model is ready, we can switch easy to DM ... and maybe get this API change for free ...

Quoted 4 lines

Yes. I certainly understand the need to fit in with what is already there, and avoid a massive API change, which can be performed as a follow-on patch anyway. With your info above I will adjust the tegra driver to work with this and test it.

Quoted 4 lines

Ok, great! So I post v2 patches after you tested ...

And Yes, we should do this API change, but I tend to do this step after the new i2c framework is stable and all i2c drivers are converted to it ...

[snip]

Regards,
Simon

Quoted 5 lines

bye,
Heiko
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany

#20 lore raw

cover Bring in new I2C framework

Hello Simon,

Quoted 37 lines · Simon Glass

Hi Heiko,

Quoted 34 lines · Heiko Schocher

Hello Simon,

Quoted 10 lines · Simon Glass
Quoted 8 lines · Heiko Schocher

Hello Simon,

Quoted 3 lines · Simon Glass

On Mon, Oct 22, 2012 at 10:40 AM, Heiko Schocher<[email protected]> wrote:

[...]

Quoted 11 lines
Quoted 7 lines
Quoted 3 lines

2. The init is a bit odd, in that we can call init() repeatedly. Perhaps that function should be renamed to reset, and the init should be used for calling just once at the start?

What do you mean here exactly? I couldn?t parse this ...

Well there is start-of-day setup, which I think should be called init. This is done once on boot for each i2c adapter.

Hmm... I am not sure if this is only done on boot, because we should "close" or "deinit" an adapter if not used any more in U-Boot as the U-Boot principle says:

Quoted 8 lines
Quoted 4 lines

http://www.denx.de/wiki/view/U-Boot/DesignPrinciples#2_Keep_it_Fast

So I want to add in future some "deinit" to every adapter, and call it from i2c_set_bus() when switching to another i2c adapter ...

Well deinit() should be probably be done before finishing U-Boot, not after every transaction, since you don't know that the current transaction will be the last.

Not after every transaction, only when switching to another adapter, or before booting linux ...

Quoted 4 lines

When using FDT, you need to look up the available i2c ports in the driver, and this should be done once at the start. If the i2c core can call a suitable init function then this is easier, rather than us having to keep track of whether the init is done or not.

Dummy question, why is this needed when using FDT?

Quoted 9 lines
Quoted 9 lines
Quoted 4 lines

And then there is the i2c_init() which seems to be called whenever we feel like it - e.g. to change speed. I suggest that we use init() to mean start-of-day init and reset(), or similar, to mean any post-init. I am not suggest that for this series, just as a future effort.

Yes, that should be changed. We do not need an init() in the i2c API, as i2c_set_bus_num() do this for us (and later also the deinit())

Quoted 6 lines
Quoted 3 lines

We just need a set/get_speed() and a deblock()/reset() ?

Maybe a step in the API cleanup?

Yes, a future step I think. I feel that i2c is one of the darker corners of U-Boot and so am keen to get this tidied up.

Patches are welcome! Let us bring in the new framework, clean up the i2c API / maybe DM integration, then we are on a good way I think ...

[...]

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#21 lore raw

cover Bring in new I2C framework

In reply to Simon Glass

On Thu, Oct 25, 2012 at 02:37:08PM -0700, Simon Glass wrote:

[snip]

Quoted 6 lines

Later, I wonder whether the concept of a 'current' i2c bus should be maintained by the command line interpreter, rather than the i2c system. Because to be honest, most of the drivers I see have to save the current bus number, set the current bus, do the operation, then set the bus back how they found it (to preserve whatever the user things is the current bus).

I agree. Lets move the notion of "current" to cmd_i2c and make everything internally pass around the bus to operate on. Or try going down this path and find a fatal problem :)

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121026/f80ee320/attachment.pgp>
#22 lore raw

cover Bring in new I2C framework

Hello Tom,

Quoted 10 lines · Tom Rini

On Thu, Oct 25, 2012 at 02:37:08PM -0700, Simon Glass wrote:

[snip]

Quoted 6 lines

Later, I wonder whether the concept of a 'current' i2c bus should be maintained by the command line interpreter, rather than the i2c system. Because to be honest, most of the drivers I see have to save the current bus number, set the current bus, do the operation, then set the bus back how they found it (to preserve whatever the user things is the current bus).

Quoted 3 lines

I agree. Lets move the notion of "current" to cmd_i2c and make everything internally pass around the bus to operate on. Or try going down this path and find a fatal problem :)

As I wrote to simon, stephen, this is an independent problem from the new framework patches!

- There are two steps to do:
- save the curent cmdline bus in a variable, and call i2c_set_bus_num() before you call i2c_* from the commandline, get rid of the store/restore calls ...

- change the i2c API to pass the i2c bus in the i2c_* functions

     -> in the new i2c framework, i2c_set_bus() gets static and the
        gd->current_i2c_bus is used only in i2c_core.c

This two steps can be done in one step, but the second step is complicated enough, so it is better to do it in two steps (I think)!

Waiting for patches ;-)

The i2c framework change is independent from this! The current_i2c_bus is used i2c_core internally for storing the current active i2c bus, based on the idea of having only one i2c bus active in U-Boot, see therefore the U-Boot principle:

http://www.denx.de/wiki/view/U-Boot/DesignPrinciples#2_Keep_it_Fast
"Initialize devices only when they are needed within U-Boot, i.e. don't initialize the Ethernet interface(s) unless U-Boot performs" [...]", etc. (and don't forget to shut down these devices after using them - otherwise nasty things may happen when you try to boot your OS). "

therefore the "current i2c bus" is needed! If we want to drop this "U-Boot principle", we can get rid of current_i2c_bus ... (Ok, currently U-Boot do not deactivate not used i2c adapters ...)

bye,
Heiko

Signature · 2 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
#23 lore raw

cover Bring in new I2C framework

Quoted 13 lines · Heiko Schocher

Hello Tom,

Quoted 10 lines · Tom Rini

On Thu, Oct 25, 2012 at 02:37:08PM -0700, Simon Glass wrote:

[snip]

Quoted 6 lines

Later, I wonder whether the concept of a 'current' i2c bus should be maintained by the command line interpreter, rather than the i2c system. Because to be honest, most of the drivers I see have to save the current bus number, set the current bus, do the operation, then set the bus back how they found it (to preserve whatever the user things is the current bus).

Quoted 6 lines
Quoted 3 lines

I agree. Lets move the notion of "current" to cmd_i2c and make everything internally pass around the bus to operate on. Or try going down this path and find a fatal problem :)

As I wrote to simon, stephen, this is an independent problem from the new framework patches!

OK. I was hoping we could just:
- Change init_func_i2c (for ARM/m68k/ppc/nds32, equiv elsewhere) to init all configured busses.
- Change the CLI part to track what bus it is operating on.

It sounds like it's more work than just this, really. Since there is agreement to push things further after this update, yes, OK, we can go one step at a time here. Thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121030/30eda42a/attachment.pgp>