[PATCH] i2c: imx_lpi2c: Fix MSR status check issue in STOP
Heiko Schocher
hs at nabladev.com
Wed Apr 29 08:06:18 CEST 2026
Hello Ye li,
On 28.04.26 17:20, Ye Li wrote:
> Hi Heiko,
>
> On 4/28/2026 5:55 PM, Heiko Schocher wrote:
>> Hello Ye Li,
>>
>> On 28.04.26 10:53, Ye Li wrote:
>>> In bus_i2c_stop, the MSR SDF is checked in a loop after stop command
>>> is sent. Meanwhile, some error status in MSR is also checked by
>>> imx_lpci2c_check_clear_error. But the imx_lpci2c_check_clear_error
>>> will clear the MSR.
>>>
>>> It causes problem in below situation:
>>> In current loop, SDF does not set, but error status is found by
>>> imx_lpci2c_check_clear_error (for example, NDF), then NDF will be cleared
>>> and result has NDF error. However, because SDF does not set in this loop,
>>> it goes not next loop. When SDF is set in next loop,
>>> imx_lpci2c_check_clear_error is re-executed, but as the MSR is cleared,
>>> the result is 0. Then the stop return 0. But it should return NDF error.
>>>
>>> Signed-off-by: Ye Li <ye.li at nxp.com>
>>> ---
>>> drivers/i2c/imx_lpi2c.c | 4 +++-
>>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/i2c/imx_lpi2c.c b/drivers/i2c/imx_lpi2c.c
>>> index a309fd6f07c..e2b4fd334ec 100644
>>> --- a/drivers/i2c/imx_lpi2c.c
>>> +++ b/drivers/i2c/imx_lpi2c.c
>>> @@ -239,7 +239,6 @@ static int bus_i2c_stop(struct udevice *bus)
>>> start_time = get_timer(0);
>>> while (1) {
>>> status = readl(®s->msr);
>>> - result = imx_lpci2c_check_clear_error(regs);
>>
>> Wouldn;t it be better to evaluate bits in result too, and return
>> if error bits found?
>
> I find below commit in history, please take a look. If evaluate bits and return, it moves back to
> previous clock issue.
>
> commit a32effd2838a62a5d1dcc01f613508f1d90b5667
> Author: Gao Pan <pandy.gao at nxp.com>
> Date: Sun Jul 8 11:46:41 2018 +0800
>
> imx: lpi2c: fix clock issue when NACK detected
>
> For LPI2C IP, NACK is detected by the rising edge of the ninth clock.
> In current uboot driver, once NACK is detected, it will reset and then
> disable LPI2C master. As a result, we can never see the falling edge
> of the ninth clock.
>
> Signed-off-by: Gao Pan <pandy.gao at nxp.com>
> Signed-off-by: Peng Fan <peng.fan at nxp.com>
> Reviewed-by: Heiko Schocher <hs at denx.de>
Ah, okay. May Peng or Gao (added to this thread) can
than review your patch.
Thanks for the hint!
bye,
Heiko
>
>
> Best regards,
> Ye Li
>
>>
>>> /* stop detect flag */
>>> if (status & LPI2C_MSR_SDF_MASK) {
>>> /* clear stop flag */
>>> @@ -250,10 +249,13 @@ static int bus_i2c_stop(struct udevice *bus)
>>> if (get_timer(start_time) > LPI2C_NACK_TOUT_MS) {
>>> debug("stop timeout\n");
>>> + result = imx_lpci2c_check_clear_error(regs);
>>> return -ETIMEDOUT;
>>> }
>>> }
>>> + result = imx_lpci2c_check_clear_error(regs);
>>> +
>>> return result;
>>> }
>>>
>>
>> bye,
>> Heiko
>
--
Nabla Software Engineering
HRB 40522 Augsburg
Phone: +49 821 45592596
E-Mail: office at nabladev.com
Geschäftsführer : Stefano Babic
More information about the U-Boot
mailing list