Bring in new I2C framework
Subsystems (11)
cover Bring in new I2C framework
This series provides Heiko's upgraded I2C framework from a few years ago. I hope that we can bring this in and move boards over to it as time permits, rather than switching everything in one fell swoop which never happens.
To show it working I have enabled it for Tegra in a very rough way. It seems fine with my limited testing.
In terms of changes, I have just fixed some checkpatch errors and fiddled with a couple of function signatures.
I will start a thread on the list with a few thoughts on this series at some point.
Heiko Schocher (2):
i2c: add i2c_core and prepare for new multibus support
i2c: common changes for multibus/multiadapter support
Simon Glass (1):
WIP: tegra: i2c: Enable new I2C framework
README | 82 +++++++- arch/arm/include/asm/global_data.h | 3 + arch/arm/lib/board.c | 3 +- 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 | 18 ++- arch/microblaze/include/asm/global_data.h | 3 + arch/mips/include/asm/global_data.h | 3 + arch/mips/lib/board.c | 7 + 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 | 18 ++- arch/sh/include/asm/global_data.h | 3 + arch/sparc/include/asm/global_data.h | 3 + arch/x86/include/asm/global_data.h | 3 + common/cmd_date.c | 9 + common/cmd_dtt.c | 9 + common/cmd_i2c.c | 127 +++++++---- common/stdio.c | 13 +- drivers/i2c/Makefile | 1 + drivers/i2c/i2c_core.c | 360 +++++++++++++++++++++++++++++ drivers/i2c/tegra2_i2c.c | 53 ++--- include/configs/seaboard.h | 2 + include/i2c.h | 190 +++++++++++++++- 27 files changed, 842 insertions(+), 95 deletions(-) create mode 100644 drivers/i2c/i2c_core.c
Signature · 1 line
1.7.7.3
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
From: Heiko Schocher <[email protected]>
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.
--- 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/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 | 360 +++++++++++++++++++++++++++++ include/i2c.h | 199 +++++++++++++++- 14 files changed, 584 insertions(+), 10 deletions(-) create mode 100644 drivers/i2c/i2c_core.c
arch/arm/include/asm/global_data.h +3 -0
@@ -87,6 +87,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/avr32/include/asm/global_data.h +3 -0
@@ -50,6 +50,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/blackfin/include/asm/global_data.h +3 -1
@@ -56,9 +56,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/m68k/include/asm/global_data.h +3 -0
@@ -68,6 +68,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/microblaze/include/asm/global_data.h +3 -0
@@ -47,6 +47,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/mips/include/asm/global_data.h +3 -0
@@ -61,6 +61,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/nios2/include/asm/global_data.h +3 -0
@@ -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_adap;/* current used i2c adapter */ +#endif } gd_t;/* flags */
arch/powerpc/include/asm/global_data.h +3 -0
@@ -184,6 +184,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/sh/include/asm/global_data.h +3 -0
@@ -42,6 +42,9 @@ typedef struct global_dataunsigned 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_adap;/* current used i2c adapter */ +#endif } gd_t;#define GD_FLG_RELOC 0x00001/* Code was relocated to RAM */
arch/sparc/include/asm/global_data.h +3 -0
@@ -76,6 +76,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_adap;/* current used i2c adapter */ +#endif } gd_t;/*
arch/x86/include/asm/global_data.h +3 -0
@@ -55,6 +55,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_adap;/* current used i2c adapter */ +#endif } gd_t;extern gd_t *gd;
drivers/i2c/Makefile +1 -0
@@ -45,6 +45,7 @@ COBJS-$(CONFIG_TEGRA2_I2C) += tegra2_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_SYS_I2C) += i2c_core.o COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c)
drivers/i2c/i2c_core.c new file +360 -0
360 lines not on this page · raw message
include/i2c.h +190 -9
235 lines not on this page · raw message
Signature · 1 line
1.7.7.3
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
arch/arm/include/asm/global_data.h typedef struct global_data { · line 92
Quoted 3 lines · On Tuesday 17 January 2012 02:12:23 Simon Glass wrote:
arch/arm/include/asm/global_data.h +3
-0+#if defined(CONFIG_SYS_I2C ) +void *cur_adap;/* current used i2c adapter */ +#endif
let's have "i2c" in the variable name somewhere. "curr_i2c" ?
drivers/i2c/i2c_core.c line 11
Quoted 6 lines
drivers/i2c/i2c_core.c new file +3
-0+#ifdef CONFIG_TEGRA2_I2C +extern struct i2c_adapter tegra_i2c_adap[]; +#endif
i feel like if your initial run includes i2c bus specific defines, the end result is a failure
drivers/i2c/i2c_core.c line 17
Quoted 5 lines
drivers/i2c/i2c_core.c new file +5
-0+struct i2c_adapter *i2c_adap[CONFIG_SYS_NUM_I2C_ADAPTERS ] = +CONFIG_SYS_I2C_ADAPTERS ; +#ifndef CONFIG_SYS_I2C_DIRECT_BUS +struct i2c_bus i2c_bus[CONFIG_SYS_NUM_I2C_BUSSES ] =CONFIG_SYS_I2C_BUSSES ; +#endif
the nand layer is moving away from this style ...
Quoted 3 lines
+ *
mux_idis the multiplexer chip type from defined ini2c.h. So far only
+ * NXP (Philips) PCA954x multiplexers are supported. Switches are NOT
+ * supported (anybody uses them?)
does part-specific stuff belong in the core ? seems like it should be in a part-specific driver ...
Quoted 1 line
+int
i2c_probe(u_int8_t chip)
use uintx_t types. the u_intx_t types are deprecated.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120117/35443437/attachment.pgp>
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
In reply to Simon GlassQuoted 37 lines · Simon Glass
From: Heiko Schocher <[email protected]>
This Patch introduce the new
i2c_corefile, which holds the I2C core functions, for the rework of the multibus/ multiadapter support.
Also adds changes ini2c.hfor the new I2C multibus/multiadapter support. This new support can be activated with theCONFIG_SYS_I2Cdefine.Signed-off-by Heiko Schocher <[email protected]>Signed-off-by Simon Glass <[email protected]>---
?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/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 ? ? ? ? ? ? ? ? ? ?| ?360 +++++++++++++++++++++++++++++ ?include/i2c.h ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ?199 +++++++++++++++-?14 files changed, 584 insertions(+), 10 deletions(-) ?create mode 100644
drivers/i2c/i2c_core.carch/arm/include/asm/global_data.h +0
-0@@ -87,6 +87,9 @@ typedef ? ? ? struct ?global_data {? ? ? ?unsigned long ?
post_log_res; /* success of POST test */ ? ? ? ?unsigned long ?post_init_f_time; /* Whenpost_init_fstarted */ ?#endif
arch/arm/include/asm/global_data.h typedef struct global_data { · line 92
Quoted 3 lines
arch/arm/include/asm/global_data.h +3
-0+#if defined(CONFIG_SYS_I2C ) + ? ? ? void ? ? ? ? ? ?*cur_adap; ? ? ?/* current used i2c adapter */ +#endif
I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. That's how Linux operates, and it will prevent stuff like this:
void *old;
void *new;
old = get_current_i2c_adapter();set_i2c_adapter(new);
// do I2C stuffset_i2c_adapter(old);
Signature · 2 lines
Timur Tabi Linux kernel developer at Freescale
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Quoted 16 lines · On Wednesday 18 January 2012 15:11:56 Tabi Timur-B04825 wrote:
arch/arm/include/asm/global_data.h typedef struct global_data { · line 92
Quoted 9 lines · Simon Glass
arch/arm/include/asm/global_data.h +3
-0@@ -87,6 +87,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_adap;/* current used i2c adapter */ +#endif I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. That's how Linux operates, and it will prevent stuff like this:
Quoted 7 lines
void *old;
void *new;old =
get_current_i2c_adapter();set_i2c_adapter(new);
// do I2C stuffset_i2c_adapter(old);
that's only needed if you expect the pointer to stay valid across calls. i don't think it does for most (all?) drivers.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120118/75ccaa78/attachment.pgp>
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Quoted 2 lines · Mike Frysinger
that's only needed if you expect the pointer to stay valid across calls. i don't think it does for most (all?) drivers.
True, but it's hard to know sometimes when it's needed. I do it in my code just to be sure.
Regardless, I still think the idea of a "current" i2c bus is flawed.
Signature · 2 lines
Timur Tabi Linux kernel developer at Freescale
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
In reply to Tabi Timur-B04825Hi Tabi,
Quoted 30 lines · On Wed, Jan 18, 2012 at 12:11 PM, Tabi Timur-B04825 <[email protected]>…
Quoted 29 lines · Simon Glass
From: Heiko Schocher <[email protected]>
This Patch introduce the new
i2c_corefile, which holds the I2C core functions, for the rework of the multibus/ multiadapter support.
Also adds changes ini2c.hfor the new I2C multibus/multiadapter support. This new support can be activated with theCONFIG_SYS_I2Cdefine.Signed-off-by Heiko Schocher <[email protected]>Signed-off-by Simon Glass <[email protected]>---
?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/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 ? ? ? ? ? ? ? ? ? ?| ?360 +++++++++++++++++++++++++++++ ?include/i2c.h ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ?199 +++++++++++++++-?14 files changed, 584 insertions(+), 10 deletions(-) ?create mode 100644
drivers/i2c/i2c_core.c
Quoted 16 lines
arch/arm/include/asm/global_data.h typedef struct global_data { · line 92
Quoted 11 lines
arch/arm/include/asm/global_data.h +0
-0@@ -87,6 +87,9 @@ typedef ? ? ? struct ?global_data {? ? ? ?unsigned long ?
post_log_res; /* success of POST test */ ? ? ? ?unsigned long ?post_init_f_time; /* Whenpost_init_fstarted */ ?#endifarch/arm/include/asm/global_data.h +3
-0+#if defined(CONFIG_SYS_I2C ) + ? ? ? void ? ? ? ? ? ?*cur_adap; ? ? ?/* current used i2c adapter */ +#endif I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. ?That's how Linux operates, and it will prevent stuff like this:
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
Quoted 5 lines
void *old;
void *new;
Quoted 8 lines
old =
get_current_i2c_adapter();set_i2c_adapter(new);
// do I2C stuffset_i2c_adapter(old);--
Timur Tabi
Linux kernel developer at Freescale
Regards,
Simon
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Quoted 2 lines · Simon Glass
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
I would be in favor of a patch that replaces all of the I2C calls. It would be a massive patch, but it solve a lot of problems in one shot.
Signature · 2 lines
Timur Tabi Linux kernel developer at Freescale
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Hi Timur,
Quoted 6 lines · Timur Tabi
Quoted 2 lines · Simon Glass
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
I would be in favor of a patch that replaces all of the I2C calls. ?It would be a massive patch, but it solve a lot of problems in one shot.
I agree. Do you know of such a patch? :-)
Regards,
Simon
Quoted 5 lines
--
Timur Tabi
Linux kernel developer at Freescale
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Quoted 1 line · Simon Glass
I agree. Do you know of such a patch? :-)
No, but it wouldn't be heard to create -- mostly a global search-and-replace. I wouldn't even attempt it without getting pre-approved by Wolfgang first, though.
Signature · 2 lines
Timur Tabi Linux kernel developer at Freescale
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
In reply to Simon GlassDear Simon Glass,
Quoted 8 lines · In message <CAPnjgZ2kLPfMzzwgHkDJ4eL+wixqLv89+CvdVP7PCcy+XFaqNQ@mail.gmail.com>…
Quoted 5 lines
I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. =A0That's how Linux operates, and it will prevent stuff like this:
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
Let's do one step at a time. Now we go for multi-bus support. Implementing a new, better device interface is one of the next steps, then.
Best regards,
Wolfgang Denk
Signature · 4 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "Free markets select for winning solutions." - Eric S. Raymond
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Hello Wolfgang, Timur, Simon,
Quoted 11 lines · Wolfgang Denk
Dear Simon Glass,
Quoted 6 lines · In message <CAPnjgZ2kLPfMzzwgHkDJ4eL+wixqLv89+CvdVP7PCcy+XFaqNQ@mail.gmail.com>…
Quoted 4 lines
I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. =A0That's how Linux operates, and it will prevent stuff like this:
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
Let's do one step at a time. Now we go for multi-bus support.
Ok.
Quoted 2 lines
Implementing a new, better device interface is one of the next steps, then.
Some thoughts to the subject "get rid of concept of a current i2c"
- First, it would be great to get rid of that ;-)
- 2 reasons why we currently need the info, what is the current i2c adapter/i2c bus:
- U-Boot principle says, don't init a device, if you don't use it. So, if we switch to another i2c adapter or i2c bus (A i2c bus is a combination if one i2c adpater and n i2c muxes), we must deinit the current adapter/bus. Ok, current code didn't this too, but this should a goal to keep in mind ... or we define, that this is not needed.
- If we have i2c muxes, and you don't know your current i2c bus, you must on every i2c access also setup the i2c muxes on this i2c bus ... would we do this really?
if we have the current i2c bus info, we just have to check, if we are on this bus, and do the i2c access ... if we are not on this i2c bus, we can deinit it complete (the new i2c_core disconnects for example all i2c muxes on the i2c bus) and init the new bus. All this work is done in a central function i2c_set_bus_numer()
- Looking in the new multibus i2c_core.c file, we should get rid of
static unsigned int i2c_cur_bus __attribute__((section(".data"))) =
CONFIG_SYS_SPD_BUS_NUM;
and "cur_adap" renamed to "cur_i2c_bus" and should be a "struct i2c_bus_hose" pointer.
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Hi Heiko,
Quoted 34 lines · Heiko Schocher
Hello Wolfgang, Timur, Simon,
Quoted 11 lines · Wolfgang Denk
Dear Simon Glass,
Quoted 6 lines · In message <CAPnjgZ2kLPfMzzwgHkDJ4eL+wixqLv89+CvdVP7PCcy+XFaqNQ@mail.gmail.com>…
Quoted 4 lines
I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. =A0That's how Linux operates, and it will prevent stuff like this:
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
Let's do one step at a time. ?Now we go for multi-bus support.
Ok.
Quoted 2 lines
Implementing a new, better device interface is one of the next steps, then.
Some thoughts to the subject "get rid of concept of a current i2c"
- First, it would be great to get rid of that ;-)
- 2 reasons why we currently need the info, what is the current ?i2c adapter/i2c bus:
- U-Boot principle says, don't init a device, if you don't use it. ?So, if we switch to another i2c adapter or i2c bus (A i2c bus is a ?combination if one i2c adpater and n i2c muxes), we must deinit ?the current adapter/bus. Ok, current code didn't this too, but ?this should a goal to keep in mind ... or we define, that this ?is not needed.
Quoted 3 lines
- If we have i2c muxes, and you don't know your current i2c bus, ?you must on every i2c access also setup the i2c muxes on this ?i2c bus ... would we do this really?
Ignoring muxes, we can have more than one i2c adaptor inited at a time (i.e. de-initing is optional).
Perhaps reword this slightly. U-Boot can have knowledge of a current adaptor, mux settings and so on, and use this internally within the i2c layer to optimise performance and redundant i2c traffic. But the pain is when the concept of a 'current adaptor' is exposed outside the i2c layer.
Quoted 5 lines
?if we have the current i2c bus info, we just have to check, if ?we are on this bus, and do the i2c access ... if we are not on ?this i2c bus, we can deinit it complete (the new
i2c_coredisconnects ?for example all i2c muxes on the i2c bus) and init the new bus. ?All this work is done in a central functioni2c_set_bus_numer()
Yes but this function could become internal perhaps.
Quoted 8 lines
- Looking in the new multibus
i2c_core.cfile, we should get rid of?static unsigned int
i2c_cur_bus__attribute__((section(".data"))) = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CONFIG_SYS_SPD_BUS_NUM;?and "
cur_adap" renamed to "cur_i2c_bus" and should be a ?"structi2c_bus_hose" pointer.
Sounds good. Heiko do you have time to take over your two patches I sent and tidy them up, or should I continue?
Regards,
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
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Hello Simon,
Quoted 34 lines · Simon Glass
Hi Heiko,
Quoted 31 lines · Heiko Schocher
Hello Wolfgang, Timur, Simon,
Quoted 10 lines · Wolfgang Denk
Dear Simon Glass,
Quoted 6 lines · In message <CAPnjgZ2kLPfMzzwgHkDJ4eL+wixqLv89+CvdVP7PCcy+XFaqNQ@mail.gmail.com>…
Quoted 4 lines
I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. =A0That's how Linux operates, and it will prevent stuff like this:
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
Let's do one step at a time. Now we go for multi-bus support.
Ok.
Quoted 2 lines
Implementing a new, better device interface is one of the next steps, then.
Some thoughts to the subject "get rid of concept of a current i2c"
- First, it would be great to get rid of that ;-)
- 2 reasons why we currently need the info, what is the current i2c adapter/i2c bus:
- U-Boot principle says, don't init a device, if you don't use it. So, if we switch to another i2c adapter or i2c bus (A i2c bus is a combination if one i2c adpater and n i2c muxes), we must deinit the current adapter/bus. Ok, current code didn't this too, but this should a goal to keep in mind ... or we define, that this is not needed.
Quoted 6 lines
Quoted 3 lines
- If we have i2c muxes, and you don't know your current i2c bus, you must on every i2c access also setup the i2c muxes on this i2c bus ... would we do this really?
Ignoring muxes, we can have more than one i2c adaptor inited at a time (i.e. de-initing is optional).
Ok for the point "more adapters inited at one time".
But we have to setup the muxes every time! We cannot ignore this.
Quoted 3 lines
Perhaps reword this slightly. U-Boot can have knowledge of a current adaptor, mux settings and so on, and use this internally within the i2c layer to optimise performance and redundant i2c traffic. But the
Ok, thats what I mean. The "cur_i2c_bus" pointer should only be used in the i2c subsystem! This pointer is in gd_t because it must be writeable, also when running from flash ...
Quoted 2 lines
pain is when the concept of a 'current adaptor' is exposed outside the i2c layer.
The "cur_i2c_bus" pointer is only used inside the i2c subsystem.
Quoted 7 lines
Quoted 5 lines
if we have the current i2c bus info, we just have to check, if we are on this bus, and do the i2c access ... if we are not on this i2c bus, we can deinit it complete (the new
i2c_coredisconnects for example all i2c muxes on the i2c bus) and init the new bus. All this work is done in a central functioni2c_set_bus_numer()Yes but this function could become internal perhaps.
Yes, if we make the change, Timur suggested ... but that can be done easy in a second step, as Wolfgang mentioned.
Quoted 10 lines
Quoted 7 lines
- Looking in the new multibus
i2c_core.cfile, we should get rid ofstatic unsigned int
i2c_cur_bus__attribute__((section(".data"))) =CONFIG_SYS_SPD_BUS_NUM;and "
cur_adap" renamed to "cur_i2c_bus" and should be a "structi2c_bus_hose" pointer.Sounds good. Heiko do you have time to take over your two patches I sent and tidy them up, or should I continue?
I did some work on this 2 patches, to get it working with soft_i2c.c driver ... I try to rework this suggestions in, and send it to the ML as a v2 ... if I do not find time, I speak up ;-)
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Hi Heiko,
Quoted 48 lines · Heiko Schocher
Hello Simon,
Quoted 34 lines · Simon Glass
Hi Heiko,
Quoted 31 lines · Heiko Schocher
Hello Wolfgang, Timur, Simon,
Quoted 10 lines · Wolfgang Denk
Dear Simon Glass,
Quoted 6 lines · In message <CAPnjgZ2kLPfMzzwgHkDJ4eL+wixqLv89+CvdVP7PCcy+XFaqNQ@mail.gmail.com>…
Quoted 4 lines
I was really hoping we could get rid of the concept of a "current" i2c adapter, and just force all drivers to specify the I2C adapter they want to use for a given I2C operation. =A0That's how Linux operates, and it will prevent stuff like this:
I agree completely, it was one of the things I was going to ask for. We should add a new parameter to calls instead IMO.
Let's do one step at a time. ?Now we go for multi-bus support.
Ok.
Quoted 2 lines
Implementing a new, better device interface is one of the next steps, then.
Some thoughts to the subject "get rid of concept of a current i2c"
- First, it would be great to get rid of that ;-)
- 2 reasons why we currently need the info, what is the current ?i2c adapter/i2c bus:
- U-Boot principle says, don't init a device, if you don't use it. ?So, if we switch to another i2c adapter or i2c bus (A i2c bus is a ?combination if one i2c adpater and n i2c muxes), we must deinit ?the current adapter/bus. Ok, current code didn't this too, but ?this should a goal to keep in mind ... or we define, that this ?is not needed.
Quoted 6 lines
Quoted 3 lines
- If we have i2c muxes, and you don't know your current i2c bus, ?you must on every i2c access also setup the i2c muxes on this ?i2c bus ... would we do this really?
Ignoring muxes, we can have more than one i2c adaptor inited at a time (i.e. de-initing is optional).
Ok for the point "more adapters inited at one time".
But we have to setup the muxes every time! We cannot ignore this.
Quoted 7 lines
Quoted 3 lines
Perhaps reword this slightly. U-Boot can have knowledge of a current adaptor, mux settings and so on, and use this internally within the i2c layer to optimise performance and redundant i2c traffic. But the
Ok, thats what I mean. The "
cur_i2c_bus" pointer should only be used in the i2c subsystem! This pointer is ingd_tbecause it must be writeable, also when running from flash ...
Yes that's fine.
Quoted 5 lines
Quoted 3 lines
pain is when the concept of a 'current adaptor' is exposed outside the i2c layer.
The "
cur_i2c_bus" pointer is only used inside the i2c subsystem.
OK good.
Quoted 11 lines
Quoted 8 lines
Quoted 6 lines
?if we have the current i2c bus info, we just have to check, if ?we are on this bus, and do the i2c access ... if we are not on ?this i2c bus, we can deinit it complete (the new
i2c_coredisconnects ?for example all i2c muxes on the i2c bus) and init the new bus. ?All this work is done in a central functioni2c_set_bus_numer()Yes but this function could become internal perhaps.
Yes, if we make the change, Timur suggested ... but that can be done easy in a second step, as Wolfgang mentioned.
Yes indeed, and quite a major one by the sound of it.
Quoted 9 lines
Quoted 9 lines
Quoted 8 lines
- Looking in the new multibus
i2c_core.cfile, we should get rid of?static unsigned int
i2c_cur_bus__attribute__((section(".data"))) = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CONFIG_SYS_SPD_BUS_NUM;?and "
cur_adap" renamed to "cur_i2c_bus" and should be a ?"structi2c_bus_hose" pointer.
Quoted 6 lines
Quoted 2 lines
Sounds good. Heiko do you have time to take over your two patches I sent and tidy them up, or should I continue?
I did some work on this 2 patches, to get it working with
soft_i2c.cdriver ... I try to rework this suggestions in, and send it to the ML as a v2 ... if I do not find time, I speak up ;-)
Sounds good.
Regards,
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
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
In reply to Simon GlassDear Simon Glass,
Quoted 6 lines · In message <CAPnjgZ1RoyguaAScOQiw8PoQkzVp5rim7KJ6zzHLNPwuBYK48Q@mail.gmail.com>…
Perhaps reword this slightly. U-Boot can have knowledge of a current adaptor, mux settings and so on, and use this internally within the i2c layer to optimise performance and redundant i2c traffic. But the pain is when the concept of a 'current adaptor' is exposed outside the i2c layer.
As mentioned before, this is what we currently have as "device model" in U-Boot - not only I2C: we have the same "current device" concept with IDE, USB, ...
It makes no sense trying to change it here; it would only cause even more incompatibilities. If you want to fix that, then help working on the new driver model. Marek is planning for this.
Best regards,
Wolfgang Denk
Signature · 6 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Good morning. This is the telephone company. Due to repairs, we're giving you advance notice that your service will be cut off indefi- nitely at ten o'clock. That's two minutes from now.
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Hi Wolfgang,
Quoted 10 lines · Wolfgang Denk
Dear Simon Glass,
Quoted 6 lines · In message <CAPnjgZ1RoyguaAScOQiw8PoQkzVp5rim7KJ6zzHLNPwuBYK48Q@mail.gmail.com>…
Perhaps reword this slightly. U-Boot can have knowledge of a current adaptor, mux settings and so on, and use this internally within the i2c layer to optimise performance and redundant i2c traffic. But the pain is when the concept of a 'current adaptor' is exposed outside the i2c layer.
Quoted 7 lines
As mentioned before, this is what we currently have as "device model" in U-Boot - not only I2C: we have the same "current device" concept with IDE, USB, ...
It makes no sense trying to change it here; it would only cause even more incompatibilities. ?If you want to fix that, then help working on the new driver model. ?Marek is planning for this.
Yes of course, sorry for not replying earlier, but I completely agree. Heiko's patch here fits with the "current device" model. I was talking about the way I hope it will be in the future. I can help with new driver model also but I would like to get the rationalisation of code duplication (relocation, board init) to bed first.
Regards,
Simon
Quoted 12 lines
Best regards,
Wolfgang Denk
--
DENX Software Engineering GmbH, ? ? MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de Good morning. This is the telephone company. Due ?to ?repairs, ?we're giving ?you ?advance notice that your service will be cut off indefi- nitely at ten o'clock. That's two minutes from now.
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
In reply to Wolfgang DenkQuoted 3 lines · Wolfgang Denk
As mentioned before, this is what we currently have as "device model" in U-Boot - not only I2C: we have the same "current device" concept with IDE, USB, ...
The difference is that I2C operations are typically done internally by other code, whereas IDE, USB, etc are done by the user on the command line. It's not unusual for boot code to access multiple I2C devices on different buses, so we're switching I2C buses a lot. People generally don't try to access two networks or two USB devices back-to-back, but that's exactly what we do with I2C.
The other problem is that I2C operations are necessary prior to relocation, but IDE, USB, etc generally are not. That's why we have this:
static unsigned int i2c_bus_num __attribute__ ((section (".data"))) = CONFIG_SYS_SPD_BUS_NUM;
We need to initialize i2c_bus_num to the I2C bus that SPD is on, because i2c_bus_num is not writable until after relocation, and DDR initialization requires I2C.
A board that has SPD on two different I2C buses could not be supported by U-Boot today.
Signature · 2 lines
Timur Tabi Linux kernel developer at Freescale
PATCH 1/3 i2c: add i2c_core and prepare for new multibus support
Hello Timur,
Quoted 12 lines · Timur Tabi
Quoted 3 lines · Wolfgang Denk
As mentioned before, this is what we currently have as "device model" in U-Boot - not only I2C: we have the same "current device" concept with IDE, USB, ...
The difference is that I2C operations are typically done internally by other code, whereas IDE, USB, etc are done by the user on the command line. It's not unusual for boot code to access multiple I2C devices on different buses, so we're switching I2C buses a lot. People generally don't try to access two networks or two USB devices back-to-back, but that's exactly what we do with I2C.
Quoted 5 lines
The other problem is that I2C operations are necessary prior to relocation, but IDE, USB, etc generally are not. That's why we have this:
static unsigned int
i2c_bus_num__attribute__((section (".data"))) =CONFIG_SYS_SPD_BUS_NUM;
Yep, correct. For that case, I need the "trickery" with the "cur_i2c_adap" pointer in gd_t in the "new" framework, as gd_t is writeable before relocation ...
Quoted 6 lines
We need to initialize
i2c_bus_numto the I2C bus that SPD is on, becausei2c_bus_numis not writable until after relocation, and DDR initialization requires I2C.A board that has SPD on two different I2C buses could not be supported by U-Boot today.
... and so with the "new" framework, it should be possible to switch to other i2c busses (incl. i2c muxes on that), before relocation.
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
PATCH 2/3 i2c: common changes for multibus/multiadapter support
In reply to Simon GlassFrom: Heiko Schocher <[email protected]>
--- README | 82 ++++++++++++++++++++++++- arch/arm/lib/board.c | 3 +- arch/blackfin/lib/board.c | 7 ++ arch/m68k/lib/board.c | 18 +++++- arch/mips/lib/board.c | 7 ++ 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 | 127 +++++++++++++++++++++++++------------- common/stdio.c | 13 ++++- include/i2c.h | 9 --- 12 files changed, 242 insertions(+), 64 deletions(-)
README +79 -3
@@ -1669,9 +1669,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 +2 -1
@@ -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
arch/blackfin/lib/board.c +7 -0
@@ -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))
@@ -353,6 +357,9 @@ void board_init_r(gd_t * id, ulong dest_addr)/* Initialize stdio devices */ stdio_init (); +#if defined(CONFIG_SYS_I2C_ADAPTERS ) +i2c_reloc_fixup (); +#endif jumptable_init ();/* Initialize the console (after the relocation and devices init) */
arch/m68k/lib/board.c +15 -3
@@ -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 )
@@ -507,6 +514,11 @@ void board_init_r (gd_t *id, ulong dest_addr)/* relocate environment function pointers etc. */ env_relocate (); +#if defined(CONFIG_SYS_I2C ) && defined(CONFIG_SYS_I2C_ADAPTERS ) +/* Adjust I2C subsystem pointers after relocation */ +i2c_reloc_fixup (); +#endif +/* * Fill in missing fields of bd_info. * We do this here, where we have "normal" access to the
arch/mips/lib/board.c +7 -0
@@ -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 ;
@@ -316,6 +319,10 @@ void board_init_r(gd_t *id, ulong dest_addr)/* relocate environment function pointers etc. */ env_relocate (); +#if defined(CONFIG_SYS_I2C_ADAPTERS ) +i2c_reloc_fixup (); +#endif +/* IP Address */ bd->bi_ip_addr =getenv_IPaddr ("ipaddr" );
arch/powerpc/cpu/mpc8xx/video.c +4 -0
@@ -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
@@ -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 )
@@ -823,6 +830,11 @@ void board_init_r(gd_t *id, ulong dest_addr)* the environment is in EEPROM. */ +#if defined(CONFIG_SYS_I2C ) && defined(CONFIG_SYS_I2C_ADAPTERS ) +/* Adjust I2C subsystem pointers after relocation */ +i2c_reloc_fixup (); +#endif +#if defined(CONFIG_SYS_EXTBDINFO )#if defined(CONFIG_405GP ) || defined(CONFIG_405EP )#if defined(CONFIG_I2CFAST )
common/cmd_date.c +9 -0
@@ -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 */
@@ -98,7 +103,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
@@ -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 +83 -44
222 lines not on this page · raw message
common/stdio.c +12 -1
@@ -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
@@ -203,15 +203,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.3
PATCH 3/3 WIP: tegra: i2c: Enable new I2C framework
In reply to Simon GlassThis is just a rough patch to show how this might be done.
Not to be applied, please.
--- drivers/i2c/tegra2_i2c.c | 53 +++++++++++++++++++------------------------ include/configs/seaboard.h | 2 + 2 files changed, 25 insertions(+), 30 deletions(-)
drivers/i2c/tegra2_i2c.c +23 -30
@@ -30,7 +30,9 @@#include <asm/arch/gpio.h> #include <asm/arch/pinmux.h> #include <asm/arch/tegra2_i2c.h> +#include <fdtdec.h> +#include <i2c.h> DECLARE_GLOBAL_DATA_PTR ;
@@ -296,12 +298,7 @@ static int tegra2_i2c_read_data(u32 addr, u8 *data, u32 len)#error "Please enable device tree support to use this driver"#endif -unsigned int i2c_get_bus_speed (void ) -{ -return i2c_controllers[i2c_bus_num].speed; -} - -int i2c_set_bus_speed (unsigned int speed) +uint tegra_i2c_set_bus_speed (unsigned int speed) {struct i2c_bus *i2c_bus;
@@ -309,7 +306,7 @@ int i2c_set_bus_speed(unsigned int speed) i2c_bus->speed = speed;i2c_init_controller (i2c_bus); -return 0 ; +return 0 ;/* TODO: return actual speed */ }static int i2c_get_config (const void *blob,int node,struct i2c_bus *i2c_bus)
@@ -404,7 +401,7 @@ int i2c_init_board(void)return 0 ; } -void i2c_init (int speed,int slaveaddr) +void tegra_i2c_init (int speed,int slaveaddr) {debug ("i2c_init(speed=%u, slaveaddr=0x%x)\n" , speed, slaveaddr); }
@@ -450,7 +447,7 @@ int i2c_read_data(uchar chip, uchar *buffer, int len) }/* Probe to see if a chip is present. */ -int i2c_probe (uchar chip) +int tegra_i2c_probe (uchar chip) {int rc;uchar reg;
@@ -472,7 +469,7 @@ static int i2c_addr_ok(const uint addr, const int alen) }/* Read bytes */ -int i2c_read (uchar chip,uint addr,int alen,uchar *buffer,int len) +int tegra_i2c_read (uchar chip,uint addr,int alen,uchar *buffer,int len) {uint offset;int i;
@@ -506,7 +503,7 @@ int i2c_read(uchar chip, uint addr, int alen, uchar *buffer, int len) }/* Write bytes */ -int i2c_write (uchar chip,uint addr,int alen,uchar *buffer,int len) +int tegra_i2c_write (uchar chip,uint addr,int alen,uchar *buffer,int len) {uint offset;int i;
@@ -531,25 +528,6 @@ int i2c_write(uchar chip, uint addr, int alen, uchar *buffer, int len)return 0 ; } -#if defined(CONFIG_I2C_MULTI_BUS ) -/* -* Functions for multiple I2C bus handling -*/ -unsigned int i2c_get_bus_num (void ) -{ -return i2c_bus_num; -} - -int i2c_set_bus_num (unsigned int bus) -{ -if (bus >=CONFIG_SYS_MAX_I2C_BUS || !i2c_controllers[bus].inited) -return -1 ; - i2c_bus_num = bus; - -return 0 ; -} -#endif -int tegra_i2c_get_dvc_bus_num (void ) {int i;
@@ -563,3 +541,18 @@ int tegra_i2c_get_dvc_bus_num(void)return -1 ; } + +struct i2c_adapter tegra_i2c_adap[] = { + { + .init = tegra_i2c_init, + .probe = tegra_i2c_probe, + .read = tegra_i2c_read, + .write = tegra_i2c_write, + .set_bus_speed = tegra_i2c_set_bus_speed, + .speed =100000 , + .slaveaddr =0 , + .name ="tegra-i2c" , + .init_done =0 , + .hwadapnr =0 , + } +};
include/configs/seaboard.h +2 -0
@@ -79,6 +79,8 @@#define CONFIG_SYS_MAX_I2C_BUS 4#define CONFIG_SYS_I2C_SPEED 100000#define CONFIG_CMD_I2C +#define CONFIG_SYS_I2C +#define CONFIG_SYS_I2C_ADAPTERS {&tegra_i2c_adap}/* SD/MMC */ #define CONFIG_MMC
Signature · 1 line
1.7.7.3
PATCH 3/3 WIP: tegra: i2c: Enable new I2C framework
Hello Simon,
Quoted 25 lines · Simon Glass
This is just a rough patch to show how this might be done.
Not to be applied, please.
Signed-off-by Simon Glass <[email protected]>--- drivers/i2c/tegra2_i2c.c | 53 +++++++++++++++++++------------------------ include/configs/seaboard.h | 2 + 2 files changed, 25 insertions(+), 30 deletions(-)drivers/i2c/tegra2_i2c.c +2
-0@@ -30,7 +30,9 @@#include <asm/arch/gpio.h> #include <asm/arch/pinmux.h> #include <asm/arch/tegra2_i2c.h> +#include <fdtdec.h> +#include <i2c.h> DECLARE_GLOBAL_DATA_PTR ;
drivers/i2c/tegra2_i2c.c static int tegra2_i2c_read_data(u32 addr, u8 *data, u32 len) · line 301
Quoted 10 lines
drivers/i2c/tegra2_i2c.c +1
-6@@ -296,12 +298,7 @@ static int tegra2_i2c_read_data(u32 addr, u8 *data, u32 len)#error "Please enable device tree support to use this driver"#endif -unsigned int i2c_get_bus_speed (void ) -{ -return i2c_controllers[i2c_bus_num].speed; -} - -int i2c_set_bus_speed (unsigned int speed) +uint tegra_i2c_set_bus_speed (unsigned int speed)
static
Quoted 13 lines
drivers/i2c/tegra2_i2c.c +1
-1{struct i2c_bus *i2c_bus;@@ -309,7 +306,7 @@ int i2c_set_bus_speed(unsigned int speed) i2c_bus->speed = speed;i2c_init_controller (i2c_bus); -return 0 ; +return 0 ;/* TODO: return actual speed */ }static int i2c_get_config (const void *blob,int node,struct i2c_bus *i2c_bus)
drivers/i2c/tegra2_i2c.c int i2c_init_board(void) · line 404
Quoted 5 lines
drivers/i2c/tegra2_i2c.c +1
-1@@ -404,7 +401,7 @@ int i2c_init_board(void)return 0 ; } -void i2c_init (int speed,int slaveaddr) +void tegra_i2c_init (int speed,int slaveaddr)
static, add this for all functions
[...]
include/configs/seaboard.h line 79
Quoted 6 lines
include/configs/seaboard.h +0
-0@@ -79,6 +79,8 @@#define CONFIG_SYS_MAX_I2C_BUS 4
This define is no longer valid if using the new framework. Do you have really 4 busses with only one i2c adapter?
This works only, if you have i2c muxes! In this case you have to define
/*
* how many muxes are maximal consecutively connected on
* one i2c bus
*/
#define CONFIG_SYS_I2C_MAX_HOPS 1
and for example using a PCA9547 mux:
#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}}},
}or you use other i2c adapters like soft_i2c, but I could not see this in your patch ... and in this case you must define CONFIG_SYS_NUM_I2C_ADAPTERS ...
include/configs/seaboard.h line 80
Quoted 1 line
include/configs/seaboard.h +0
-0#define CONFIG_SYS_I2C_SPEED 100000
should not longer be defined, instead you should make a option to define a i2c speed for your i2c driver ... for example
#define CONFIG_SYS_I2C_TEGRA2_SPEED 100000
include/configs/seaboard.h line 83
Quoted 3 lines
include/configs/seaboard.h +2
-0#define CONFIG_CMD_I2C +#define CONFIG_SYS_I2C +#define CONFIG_SYS_I2C_ADAPTERS {&tegra_i2c_adap}
You must have a define in drivers/i2c/Makefile which "activates" your drivers/i2c/tegra2_i2c.c ... this must defined in your board config file too (maybe a CONFIG_SYS_I2C_TEGRA2 ?)!
Also you must have a change in drivers/i2c/i2c_core.c
#ifdef CONFIG_SYS_I2C_TEGRA2
extern struct i2c_adap tegra_i2c_adap[];
#endif
or?
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
cover Bring in new I2C framework
In reply to Simon GlassHello Simon,
Quoted 4 lines · Simon Glass
This series provides Heiko's upgraded I2C framework from a few years ago. I hope that we can bring this in and move boards over to it as time permits, rather than switching everything in one fell swoop which never happens.
Ok, lets try it!
Quoted 2 lines
To show it working I have enabled it for Tegra in a very rough way. It seems fine with my limited testing.
Great! Thanks! Patches for other i2c drivers can be found here:
http://git.denx.de/?p=u-boot/u-boot-i2c.git;a=shortlog;h=refs/heads/multibus_v2_20111112
They just need a rebase and an update to your changes (and of course some tests)
Quoted 5 lines
In terms of changes, I have just fixed some checkpatch errors and fiddled with a couple of function signatures.
I will start a thread on the list with a few thoughts on this series at some point.
Ok, thanks. Here some thoughts comming in my mind:
- Why a "cur_adap" added in gd_t:
- This points allways to the current used i2c adapter.
- because gd_t is writeable when running in flash, complete multiadapter/multibus functionality is usable, when running in flash, which is needed for some SoCs.
- using a pointer brings faster accesses to the i2c_adapter_t struct and saves some bytes here and there.
- init from a i2c controller:
In current code all i2c controllers, as a precaution, getting initialized. In the new code, a i2c controller gets only initialized if it is used. This is done in i2c_set_bus_num().
Also, with this approach, we can easy add in a second step, a i2c_deinit() function, called from i2c_set_bus_num(), so we can easy deactivate a no longer used controller.
- added "hw_adapnr" in i2c_adapter_t struct:
when for example a CPU has more then one i2c controller we can use this variable to differentiate which controller the actual i2c adapter uses.
- Maybe we should add a base_addr field in struct i2c_adapter? This would help for SoCs, who have more then one identical controller, just differ in their base_addr... (Currently I made a function, or an array which returns the base_addr, dependend on "hw_adapnr"). We should drop this, and introduce a "base_addr" field.
[...]
bye,
Heiko
Signature · 2 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany