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

Heiko Schocher hs at denx.de
Wed Feb 18 08:33:26 CET 2009


Hello Wolfgang,

Wolfgang Denk wrote:
> Dear ksi at koi8.net,
> 
> In message <Pine.LNX.4.64ksi.0902171233390.30435 at home-gw.koi8.net> you wrote:
[...]
>>> What makes you insist that we cannot change a variable if we need to
>>> be able to change one?
>> It is NOT just variable. My approach uses i2c _BUS_, not _ADAPTER_. And
>> number of busses can be bigger than number of adapters (e.g. when some
>> busses a reached via muxes or switches.) When doing i2c_set_current_bus()
>> you are switching _NOT_ adapters, but busses. That involves not only
>> changing that global variable but also reprogramming muxes/switches for
>> i2c_set_current_bus() to be consistent and hardware independent. Otherwise
>> your code should know if that particular bus it is switching to is directly
>> connected or switched and check the bus it is switching from for muxes. If
>> they are switched, your code should disconnect the current bus switches,
>> then do that i2c_set_current_bus() and connect the switches to the new bus
>> after that.
>>
>> That means that code MUST somehow know the topology to take appropriate
>> actions and properly configure those switches. That means you should somehow
>> describe that topology for each and every board in CONFIG_* terms and make
>> each and every place at U-Boot that invokes _ANY_ i2c function to take care
>> of that switching.
> 
> You convinced me. This code must not be used before relocation to RAM,
> then.

But is is possible to use that code when running from flash, if
this current pointer is writeable ...

>> And yes, we DO have some boards with switched I2C busses in U-Boot main tree
>> so this is NOT a hypothetical situation.
> 
> Yes, it is, because none of them needs any such switching before
> relocation. And switching is really simple so far.

They use it before relocation, because the DTTs are read before relocation.
But this is another approach. Actually, the "way" to the DTTs is in
an environment variable. When running from flash, it get directly
parsed, if running from RAM, the var gets analyzed and this "new bus"
is added with the "i2c bus" command resp. by calling the underlying
C function.

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


More information about the U-Boot mailing list