i2c: imx: fix missing stop condition in single-master mode
PATCH 1/1 i2c: imx: fix missing stop condition in single-master mode
From: Stefan Eichenberger <[email protected]>
A regression was introduced with the implementation of single-master mode, preventing proper stop conditions from being generated. Devices that require a valid stop condition, such as EEPROMs, fail to function correctly as a result.
The issue only affects devices with the single-master property enabled.
This commit resolves the issue by re-enabling I2C bus busy bit (IBB) polling for single-master mode when generating a stop condition. The fix further ensures that the i2c_imx->stopped flag is cleared at the start of each transfer, allowing the stop condition to be correctly generated in i2c_imx_stop().
According to the reference manual (IMX8MMRM, Rev. 2, 09/2019, page 5270), polling the IBB bit to determine if the bus is free is only necessary in multi-master mode. Consequently, the IBB bit is not polled for the start condition in single-master mode.
--- drivers/i2c/busses/i2c-imx.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/i2c/busses/i2c-imx.c +3 -5
@@ -534,20 +534,18 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a {unsigned long orig_jiffies = jiffies;unsigned int temp; - -if (!i2c_imx->multi_master) -return 0 ; +bool multi_master = i2c_imx->multi_master;while (1 ) { temp =imx_i2c_read_reg (i2c_imx,IMX_I2C_I2SR );/* check for arbitration lost */ -if (temp &I2SR_IAL ) { +if (multi_master && (temp &I2SR_IAL )) {i2c_imx_clear_irq (i2c_imx,I2SR_IAL );return -EAGAIN ; } -if (for_busy && (temp &I2SR_IBB )) { +if (for_busy && (!multi_master || (temp &I2SR_IBB ))) { i2c_imx->stopped =0 ;break ; }
Signature · 1 line
2.45.2
Quoted 31 lines · Stefan Eichenberger
From: Stefan Eichenberger <[email protected]>
A regression was introduced with the implementation of single-master mode, preventing proper stop conditions from being generated. Devices that require a valid stop condition, such as EEPROMs, fail to function correctly as a result.
The issue only affects devices with the single-master property enabled.
This commit resolves the issue by re-enabling I2C bus busy bit (IBB) polling for single-master mode when generating a stop condition. The fix further ensures that the
i2c_imx->stoppedflag is cleared at the start of each transfer, allowing the stop condition to be correctly generated ini2c_imx_stop().According to the reference manual (IMX8MMRM, Rev. 2, 09/2019, page 5270), polling the IBB bit to determine if the bus is free is only necessary in multi-master mode. Consequently, the IBB bit is not polled for the start condition in single-master mode.
Fixes 6692694aca86 ("i2c: imx: do not poll for bus busy in single master mode")Signed-off-by Stefan Eichenberger <[email protected]>--- drivers/i2c/busses/i2c-imx.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)drivers/i2c/busses/i2c-imx.c +0
-0
drivers/i2c/busses/i2c-imx.c static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a · line 537
Quoted 7 lines
drivers/i2c/busses/i2c-imx.c +1
-3@@ -534,20 +534,18 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a {unsigned long orig_jiffies = jiffies;unsigned int temp; - -if (!i2c_imx->multi_master) -return 0 ; +bool multi_master = i2c_imx->multi_master;
Move "bool multi_master = i2c_imx->multi_master;" before "unsigned long orig_jiffies = jiffies;" to keep reverse christmas tree order.
Quoted 19 lines
drivers/i2c/busses/i2c-imx.c +2
-3while (1 ) { temp =imx_i2c_read_reg (i2c_imx,IMX_I2C_I2SR );/* check for arbitration lost */ -if (temp &I2SR_IAL ) { +if (multi_master && (temp &I2SR_IAL )) {i2c_imx_clear_irq (i2c_imx,I2SR_IAL );return -EAGAIN ; } -if (for_busy && (temp &I2SR_IBB )) { +if (for_busy && (!multi_master || (temp &I2SR_IBB ))) { i2c_imx->stopped =0 ;break ; } --2.45.2
Andi Shyti
maintainerHi,
...
Quoted 8 lines
Quoted 8 lines
drivers/i2c/busses/i2c-imx.c +0
-0@@ -534,20 +534,18 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a {unsigned long orig_jiffies = jiffies;unsigned int temp;
Quoted 8 lines
drivers/i2c/busses/i2c-imx.c static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a · line 537
Quoted 4 lines
drivers/i2c/busses/i2c-imx.c +1
-3- -if (!i2c_imx->multi_master) -return 0 ; +bool multi_master = i2c_imx->multi_master;Move "bool
multi_master=i2c_imx->multi_master;" before "unsigned longorig_jiffies= jiffies;" to keep reverse christmas tree order.
I will take care of it.
Thanks, Stefan.
Andi
Quoted 15 lines · Stefan Eichenberger
From: Stefan Eichenberger <[email protected]>
A regression was introduced with the implementation of single-master mode, preventing proper stop conditions from being generated. Devices that require a valid stop condition, such as EEPROMs, fail to function correctly as a result.
The issue only affects devices with the single-master property enabled.
This commit resolves the issue by re-enabling I2C bus busy bit (IBB) polling for single-master mode when generating a stop condition. The fix further ensures that the
i2c_imx->stoppedflag is cleared at the start of each transfer, allowing the stop condition to be correctly generated ini2c_imx_stop().
Quoted 7 lines
According to the reference manual (IMX8MMRM, Rev. 2, 09/2019, page 5270), polling the IBB bit to determine if the bus is free is only necessary in multi-master mode. Consequently, the IBB bit is not polled for the start condition in single-master mode.
Fixes 6692694aca86 ("i2c: imx: do not poll for bus busy in single master mode")Signed-off-by Stefan Eichenberger <[email protected]>
Andi Shyti
maintainerHi Stefan,
Quoted 31 lines · Stefan Eichenberger
From: Stefan Eichenberger <[email protected]>
A regression was introduced with the implementation of single-master mode, preventing proper stop conditions from being generated. Devices that require a valid stop condition, such as EEPROMs, fail to function correctly as a result.
The issue only affects devices with the single-master property enabled.
This commit resolves the issue by re-enabling I2C bus busy bit (IBB) polling for single-master mode when generating a stop condition. The fix further ensures that the
i2c_imx->stoppedflag is cleared at the start of each transfer, allowing the stop condition to be correctly generated ini2c_imx_stop().According to the reference manual (IMX8MMRM, Rev. 2, 09/2019, page 5270), polling the IBB bit to determine if the bus is free is only necessary in multi-master mode. Consequently, the IBB bit is not polled for the start condition in single-master mode.
Fixes 6692694aca86 ("i2c: imx: do not poll for bus busy in single master mode")Signed-off-by Stefan Eichenberger <[email protected]>--- drivers/i2c/busses/i2c-imx.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)drivers/i2c/busses/i2c-imx.c +0
-0
drivers/i2c/busses/i2c-imx.c static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a · line 537
Quoted 7 lines
drivers/i2c/busses/i2c-imx.c +1
-3@@ -534,20 +534,18 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a {unsigned long orig_jiffies = jiffies;unsigned int temp; - -if (!i2c_imx->multi_master) -return 0 ; +bool multi_master = i2c_imx->multi_master;
with this small adjustment, I have applied your patch to i2c/i2c-host-fixes.
The idea behind the change is that variables are sorted by length, forming a kind of reversed Christmas tree shape. It's not a strict rule—some communities enforce it, others don't, and some follow entirely different conventions.
Since it feels somewhat arbitrary to me, I don't enforce it strictly. However, I personally try to adhere to the reversed Christmas tree rule whenever possible.
Andi
Quoted 19 lines
drivers/i2c/busses/i2c-imx.c +2
-2while (1 ) { temp =imx_i2c_read_reg (i2c_imx,IMX_I2C_I2SR );/* check for arbitration lost */ -if (temp &I2SR_IAL ) { +if (multi_master && (temp &I2SR_IAL )) {i2c_imx_clear_irq (i2c_imx,I2SR_IAL );return -EAGAIN ; } -if (for_busy && (temp &I2SR_IBB )) { +if (for_busy && (!multi_master || (temp &I2SR_IBB ))) { i2c_imx->stopped =0 ;break ; }Signature · 1 line
2.45.2
Hi Andi,
Quoted 45 lines · Andi Shyti
Hi Stefan,
Quoted 31 lines · Stefan Eichenberger
From: Stefan Eichenberger <[email protected]>
A regression was introduced with the implementation of single-master mode, preventing proper stop conditions from being generated. Devices that require a valid stop condition, such as EEPROMs, fail to function correctly as a result.
The issue only affects devices with the single-master property enabled.
This commit resolves the issue by re-enabling I2C bus busy bit (IBB) polling for single-master mode when generating a stop condition. The fix further ensures that the
i2c_imx->stoppedflag is cleared at the start of each transfer, allowing the stop condition to be correctly generated ini2c_imx_stop().According to the reference manual (IMX8MMRM, Rev. 2, 09/2019, page 5270), polling the IBB bit to determine if the bus is free is only necessary in multi-master mode. Consequently, the IBB bit is not polled for the start condition in single-master mode.
Fixes 6692694aca86 ("i2c: imx: do not poll for bus busy in single master mode")Signed-off-by Stefan Eichenberger <[email protected]>--- drivers/i2c/busses/i2c-imx.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)drivers/i2c/busses/i2c-imx.c +0
-0drivers/i2c/busses/i2c-imx.c static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a · line 537
Quoted 7 lines
drivers/i2c/busses/i2c-imx.c +1
-3@@ -534,20 +534,18 @@ static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy, bool a {unsigned long orig_jiffies = jiffies;unsigned int temp; - -if (!i2c_imx->multi_master) -return 0 ; +bool multi_master = i2c_imx->multi_master;with this small adjustment, I have applied your patch to i2c/i2c-host-fixes.
Quoted 8 lines
The idea behind the change is that variables are sorted by length, forming a kind of reversed Christmas tree shape. It's not a strict rule—some communities enforce it, others don't, and some follow entirely different conventions.
Since it feels somewhat arbitrary to me, I don't enforce it strictly. However, I personally try to adhere to the reversed Christmas tree rule whenever possible.
Thanks a lot for doing the change and for the explanation. I will keep it in mind for future patches.
Best regards,
Stefan