[linux-yocto] [kernel v5.2/standard/xlnx-soc][PATCH 1/2] i2c: cadence: do not clear bus_hold_flag in mrecv
Quanyang Wang
quanyang.wang at windriver.com
Wed Oct 23 02:50:30 PDT 2019
Hi Shubhrajyoti,
On 10/23/19 5:17 PM, Shubhrajyoti Datta wrote:
> Hi ,
>
>> -----Original Message-----
>> From: Quanyang Wang <quanyang.wang at windriver.com>
>> Sent: Wednesday, October 23, 2019 2:24 PM
>> To: Michal Simek <michals at xilinx.com>; Bruce <bruce.ashfield at gmail.com>;
>> Shubhrajyoti Datta <shubhraj at xilinx.com>
>> Cc: linux-yocto at yoctoproject.org; git <git at xilinx.com>
>> Subject: Re: [linux-yocto][kernel v5.2/standard/xlnx-soc][PATCH 1/2] i2c:
>> cadence: do not clear bus_hold_flag in mrecv
>>
>> Hi,
>>
>> On 10/14/19 2:07 PM, Michal Simek wrote:
>>> On 13. 10. 19 15:33, quanyang.wang at windriver.com wrote:
>>>> From: Quanyang Wang <quanyang.wang at windriver.com>
>>>>
>>>> When using i2c_smbus_read_byte_data to read one byte from a slave
>>>> device, because of the commit d358def70688
>>>> ("i2c: cadence: Fix the hold bit setting"), the transaction becomes:
>>>>
>>>> S Addr Wr [A] Comm [A] P S Addr Rd [A] [Data] NA P
>>>> ^
>>>> CR_HOLD bit as 0
>>>>
>>>> This will result that the read operation fails and will read "0xff"
>>>> from the slave device. In the SMBus protocol stipulates that it must
>>>> follow that command with a repeated START condition as below:
>>>>
>>>> S Addr Wr [A] Comm [A] Sr Addr Rd [A] [Data] NA P
>>>>
>>>> So keep CR_HOLD bit to be 1 to make sure that the read operation
>>>> begins with a Sr (repeated START) but not a STOP followed by START.
>>>>
>>>> Signed-off-by: Quanyang Wang <quanyang.wang at windriver.com>
>>>> ---
>>>> drivers/i2c/busses/i2c-cadence.c | 2 --
>>>> 1 file changed, 2 deletions(-)
>>>>
>>>> diff --git a/drivers/i2c/busses/i2c-cadence.c
>>>> b/drivers/i2c/busses/i2c-cadence.c
>>>> index 6b011931e090..d9493914be15 100644
>>>> --- a/drivers/i2c/busses/i2c-cadence.c
>>>> +++ b/drivers/i2c/busses/i2c-cadence.c
>>>> @@ -626,8 +626,6 @@ static void cdns_i2c_mrecv(struct cdns_i2c *id)
>>>> */
>>>> if ((id->recv_count > CDNS_I2C_FIFO_DEPTH) || id->bus_hold_flag)
>>>> ctrl_reg |= CDNS_I2C_CR_HOLD;
>>>> - else
>>>> - ctrl_reg = ctrl_reg & ~CDNS_I2C_CR_HOLD;
>>>>
>>>> cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET);
>>>>
>>>>
>>> Shubhrajyoti: Can you please comment?
>> Any comment?
> I am not finding code segment in the tree
> I am checking
>
> https://gitenterprise.xilinx.com/Linux/linux-xlnx/blob/master/drivers/i2c/busses/i2c-cadence.c
>
> maybe you can try moving to the latest code.
And when SDK kernel applies with this patch "i2c: cadence: Fix the hold
bit setting",
using i2c_smbus_read_byte_data to access ucd90120
(drivers/hwmon/pmbus/ucd9000.c) in the board zc706 can reproduce this error.
Thanks,
Quanyang
>>> M
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.yoctoproject.org/pipermail/linux-yocto/attachments/20191023/b9f12895/attachment-0001.html>
More information about the linux-yocto
mailing list