[U-Boot] ColdFire I2C implementing I2C idle [PATCH] -- resent in git format

Heiko Schocher hs at denx.de
Mon Jan 25 09:17:28 CET 2010


Hello Michael,

Michael Durrant wrote:
> Heiko Schocher wrote:
>> Hello Wolfgang,
>>
>> Wolfgang Wegner wrote:
>>   
>>> On Thu, Jan 21, 2010 at 09:04:29AM +0100, Heiko Schocher wrote:
>>>     
>>>> Hello Joakim,
>>>>
>>>> Joakim Tjernlund wrote:
>>>>       
>>>>>> Hello Michael,
>>>>>>
>>>>>> Thanks for posting your patches in plain text.
>>>>>>
>>>>>> Michael Durrant wrote:
>>>>>>           
>>>>>>> drivers_i2c_fsl_i2c.patch
>>>>>>>    - need to set I2C to be idle according to the MCF5282 user's manual
[...]
>>>>>>>             
>>>>>> Hmm.. I can;t find this for example in the MPC8360ERM.pdf, which
>>>>>> uses also this driver ... So I vote for activating this only,
>>>>>> if this driver is used for  __M68K__ ...
>>>>>>
>>>>>> Also, you write, that this sequence is necessary before normal
>>>>>> initialization code, but i2c_wait4bus() is called from i2c_read()
>>>>>> and i2c_write(), so the I2C bus is long ago initialized ...
>>>>>> or what do you mean with "normal initialization code" ?
>>>>>>
>>>>>> Also, whats with multimaster systems? Your code maybe cuts a running
>>>>>> data transmission. The MPC8360ERM.pdf manual says "check the MBB bit,
>>>>>> if the bus is free, before switching to master mode", thats what
>>>>>> actual code did ... so, I want this only activated, if __M68K__
>>>>>> is defined ...
>>>>>>           
>>>>> All true. This cannot go in as is. What you need is a I2C reset sequence
>>>>> as the above isn't enough in the general case. Michael, have a look at the
>>>>> kernel driver, it has some fixup code you could borrow.
>>>>>         
>>>> Michael: Maybe you take a look in u-boot:board/keymile/common/common.c
>>>> i2c_init_board(), there is a I2C reset sequence for 83xx based boards
>>>> from keymile, which use this i2c driver.
>>>>
>>>> Maybe its time to move this code in the i2c driver?
>>>>       
> 
> Will do ... David Wu emailed me a few comments as well that I include at
> the end.
> For now I agree that we should protect non ColdFire V2/V3 users with the
> __M68K__ definition
> 
>>> this code looks good except I do not see how the special case of
>>> multi-master systems you mentioned is handled.
>>>     
>> I have no experience with multimaster systems, and I think, this
>> special case is not yet factored in code.
>>
>>   
>>> I think for multi-master a timeout would have to be implemented to
>>> wait for a possible other master transfer to finish before initiating
>>> the abort sequence, or is this too much time spent during init?
>>>     
>> Or, it could be detected? If BB Bit is set and the SCL pin doesn;t
>> alter, the I2C bus must be blocked ... just an idea.
>>
>> bye
>> Heiko
>>   
> 
>   David Wu's thoughts follow:
> 
>   1. agree to add a protection using #if defined(__M68K__)
>       at some point this i2c_set_idle() has to be called when this I2C
> master
>       is enabled. In one master environment it can be in
>      - i2c_set_bus_speed() where the I2C is enabled for that bus, or
>      - i2c_init() or,
>      - board specific routine
>      - please suggest the right location.

You can use the CONFIG_SYS_I2C_INIT_BOARD define, and then define
i2c_init_board() in board specific code. i2c_init_board() is called
from i2c_init(), so there is no __M68K__ specific code necessary
in this driver.

>   2. since only the master can do a read and write call,
>       when the bus is busy there is no need to wait until it is free
>       which may never be free if we don't force a STOP.

Ok.

>   3. In a multi-master environment, there should be an additional
>       condition as to when one master can read/write,
>       still i2c_wait4bus() may timeout.

Ok.

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