[U-Boot] [PATCH v3] i2c: merge all i2c_reg_read() and i2c_reg_write() into inline functions

ksi at koi8.net ksi at koi8.net
Wed Dec 17 02:00:59 CET 2008


On Tue, 16 Dec 2008, Timur Tabi wrote:

> Wolfgang Denk wrote:
>
>> Hm... what exactly is broken with the concept of  having  a  "current
>> device"  or  a  "current  bus"?  We  use it elasewhere, too (like for
>> selection IDE or S-ATA devices and such), and so far I am  not  aware
>> of fundamental issues because of that.
>
> I think it's a kludge because you have to set the current device before
> you 
> can access it.  It seems ridiculous that you have to do this:
>
> 	i2c_set_bus_num(x)
> 	i2c_write(...)
>
> when you could do this:
>
> 	i2c_write(x, ...)

Only if you have more than one I2C bus that 95% of supported boards don't
have (95% is a wild guess; in reality, methinks, it is even closer to 99%.)
That means you should only do this for less than 5% of existing boards.

Adding a parameter would require you to make changes for 100% of boards.

common/cmd_i2c.c is a single file, common for all platforms so it is a
special case.

>>> Sounds to me like you haven't really looked at the U-Boot code.
> There are
>>> plenty of places where one function does I2C operations, then calls 
>>> another
>>> function that does its own.
>> 
>> Really? Where exactly does such a thing happen?
>
> Well, I can't find a real example, but here's something close.  Take a
> look 
> at function pib_init() in mpc8568mds.c.  This function needs to talk to
> the 
> 2nd I2C bus.  It has no idea who called it, so it has no idea what the 
> current I2C bus is.  Therefore, it has to save and restore it.
>
> Now consider the code that calls pib_init().  Technically, this code
> cannot 
> know that pib_init() does I2C operations.  So it doesn't know that
> pib_init() 
> could change the current I2C bus.  So it wouldn't know to save and
> restore 
> what it needs.
>
> This situation could happen anywhere.

No, that is not an issue. That pib_init() does not happen out of a blue, it
is YOU who call it in $(BOARD).c file so you MUST know what you are doing.

>> I tend to call this a bug that needs to be fixed, if there is ssuch
>> code.
>
> It's not a bug.  Function X does I2C operations, and function Y also
> does I2C 
> operations, but on a different device.  If function X calls function Y,
> then 
> Y needs to save and restore the current bus number.  You will never get
> rid 
> of this requirement as long as you have the concept of a current I2C bus
> number.
>
> So you're still going to need i2c_get_bus_num() and i2c_set_bus_num(),
> and 
> you're still going to have code like this:
>
> 	bus = i2c_get_bus_num();
> 	i2c_set_bus_num(x);
> 	i2c_write(...)
> 	i2c_set_bus_num(bus);
>
>> This statement is probably correct: I don't share your point of  view
>> here, either.
>
> In that case, I have no interest in working on this new I2C design.  You
> guys 
> obviously have everything under control, so good luck.
>
> -- 
> Timur Tabi
> Linux Kernel Developer @ Freescale
>

---
******************************************************************
*  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