Hi, > -----Original Message----- > From: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > Sent: Wednesday, October 25, 2023 9:17 PM > To: linux-samsung-soc@xxxxxxxxxxxxxxx; linux-i2c@xxxxxxxxxxxxxxx > Cc: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx>; Krzysztof Kozlowski > <krzysztof.kozlowski@xxxxxxxxxx>; Alim Akhtar <alim.akhtar@xxxxxxxxxxx>; > Andi Shyti <andi.shyti@xxxxxxxxxx>; Wolfram Sang <wsa@xxxxxxxxxx> > Subject: [PATCH v2 1/3] i2c: s3c24xx: fix read transfers in polling mode > > To properly handle read transfers in polling mode, no waiting for the ACK > state is needed as it will never come. Just wait a bit to ensure start > state is on the bus and continue processing next bytes. > > Fixes: 117053f77a5a ("i2c: s3c2410: Add polling mode support") > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > drivers/i2c/busses/i2c-s3c2410.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c- > s3c2410.c > index 127eb3805fac..f9dcb1112a61 100644 > --- a/drivers/i2c/busses/i2c-s3c2410.c > +++ b/drivers/i2c/busses/i2c-s3c2410.c > @@ -216,8 +216,13 @@ static bool is_ack(struct s3c24xx_i2c *i2c) > int tries; > > for (tries = 50; tries; --tries) { > - if (readl(i2c->regs + S3C2410_IICCON) > - & S3C2410_IICCON_IRQPEND) { > + unsigned long tmp = readl(i2c->regs + S3C2410_IICCON); > + > + if (!(tmp & S3C2410_IICCON_ACKEN)) { > + usleep_range(100, 200); Trivial question, but is there any hardware specification related to sleeping for 100-200 microseconds? If any then it would be nice to use const variable instead and add some description about why sleeping here is needed. Thanks, Inki Dae > + return true; > + } > + if (tmp & S3C2410_IICCON_IRQPEND) { > if (!(readl(i2c->regs + S3C2410_IICSTAT) > & S3C2410_IICSTAT_LASTBIT)) > return true; > -- > 2.34.1