[U-Boot] [PATCH] 7/12 Multiadapter/multibus I2C, drivers part 4

ksi at koi8.net ksi at koi8.net
Wed Feb 18 23:32:00 CET 2009


On Wed, 18 Feb 2009, Wolfgang Denk wrote:

> Dear ksi at koi8.net,
> 
> In message <Pine.LNX.4.64ksi.0902181054310.5002 at home-gw.koi8.net> you wrote:
> > 
> > You are multiplying entities. i2c_init() is invoked as a part of system
> > bootup process in libXXX/board.c anyways. There is no need for any global
> > variables, even non-writable for proposed code to initialize adapters.
> 
> Please keep in mind that (even if  it  should  be  different  at  the
> moment),  I2C  should  only  be  initialized  when needed, i. e. when
> U-Boot is running any code that needs to access the I2C bus, but  not
> always after each reset on all systems that have I2C enabled.
> 
> This is a mandatory requirement for a rewrite.

How would you know what to initialize and what not to? We were initializing
_ALL_ I2C adapters up to today with a single i2c_init() function. It just
happened that in most cases the total number of adapters was 1 but not
always (fsl_i2c.c is a notable example.) There was no mechanism for
selective initialization in current U-Boot.

It is easy to initialize just a selected set of adapters in the new code but
how do we decide what to initialize and what not to?

Should we add a config option like CONFIG_I2C_INIT_ADAPTERS {1,3,5,9} ? But
that is simply ridiculous and adds _ABSOLUTELY_ unnecessary code.

Or should we remove i2c_init() from _ALL_ common places and let board
developers to call i2c_adap[X]->init() as they see fit? But that is a big
rewrite... And there is another place, cmd_i2c.c that must be taken care
of...

We can easily add such an initialization to i2c_set_current_bus() (or
however it is called) so it will be initializing adapters as bus is changed
but that does _NOT_ solve all the problems and requires messing with the
entire U-Boot source -- that set_bus call should be added everywhere where
I2C is used and it is not a simple grep-and-replace because there is
absolutely no reason to add set_bus to each of e.g. 3 i2c_write() calls
executed in a row...

Please remember, that even with the new code we don't have to modify
anything but config file (trivial one-time changes) for 99% of supported
boards that only use one I2C bus -- no set_bus needed at all.

There is also no way of DE-initilizing those interfaces so that init is like
a gun trigger -- once it is pulled, there is no way to bring the bullet
back.

And the final question -- what is wrong with initializing all I2C adapters
for a handful of boards that have more than one? What is the problem? I can
make that init_all function a weak alias so if there's some problem with
performing total init it can be replaced with board-specific function. But
frankly I can not see any problems with initializing all 2-3 adapters for
a few multiadapter boards...

---
******************************************************************
*  KSI at home    KOI8 Net  < >  The impossible we do immediately.  *
*  Las Vegas   NV, USA   < >  Miracles require 24-hour notice.   *
******************************************************************


More information about the U-Boot mailing list