linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] i2c: i2c-imx: Use correct function to write to register
@ 2017-06-09 13:28 Michail Georgios Etairidis
  2017-06-19 14:46 ` Wolfram Sang
  2017-06-19 18:54 ` Uwe Kleine-König
  0 siblings, 2 replies; 10+ messages in thread
From: Michail Georgios Etairidis @ 2017-06-09 13:28 UTC (permalink / raw)
  To: l.stach@pengutronix.de; +Cc: linux-i2c@vger.kernel.org, kernel@pengutronix.de

The i2c-imx driver incorrectly uses readb()/writeb() to read and write to the appropriate registers when performing a repeated start. The appropriate imx_i2c_read_reg()/imx_i2c_write_reg() functions should be used instead. Performing a repeated start results in a kernel panic.

I am resubmitting this patch as the previous one was erroneous. This patch is based on the current upstream kernel code.

diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
index 95ed171..54a47b4 100644
--- a/drivers/i2c/busses/i2c-imx.c
+++ b/drivers/i2c/busses/i2c-imx.c
@@ -734,9 +734,9 @@ static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx,
 		 * the first read operation, otherwise the first read cost
 		 * one extra clock cycle.
 		 */
-		temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+		temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
 		temp |= I2CR_MTX;
-		writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+		imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
 	}
 	msgs->buf[msgs->len-1] = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
 
@@ -857,9 +857,9 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs, bo
 				 * the first read operation, otherwise the first read cost
 				 * one extra clock cycle.
 				 */
-				temp = readb(i2c_imx->base + IMX_I2C_I2CR);
+				temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
 				temp |= I2CR_MTX;
-				writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
+				imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
 			}
 		} else if (i == (msgs->len - 2)) {
 			dev_dbg(&i2c_imx->adapter.dev,

^ permalink raw reply related	[flat|nested] 10+ messages in thread
* Re: [PATCH] i2c: i2c-imx: Use correct function to write to register
@ 2017-06-08 17:07 Michail Georgios Etairidis
  0 siblings, 0 replies; 10+ messages in thread
From: Michail Georgios Etairidis @ 2017-06-08 17:07 UTC (permalink / raw)
  To: Lucas Stach
  Cc: linux-i2c@vger.kernel.org, kernel@pengutronix.de,
	shawnguo@kernel.org, darius.augulis@teltonika.lt

Hello Lucas,

I am sorry about the HTML.

The patch is based on version 4.11.4.

As far as I can see, the prototype fits:

static inline void imx_i2c_write_reg(unsigned int val,
		                        struct imx_i2c_struct *i2c_imx, unsigned int reg)

...and...

static inline unsigned char imx_i2c_read_reg(struct imx_i2c_struct *i2c_imx,
		                                 unsigned int reg)

Those two functions are also used everywhere else in the driver in the same manner to access the registers.

Regards,

Michail

> Hi Michail,
> 
> which kernel is this based on? The change doesn't seem to match the
> prototype of imx_i2c_read_reg() and imx_i2c_write_reg() of the upstream
> kernel.
> 
> Also please fix your mailer to send patches in plain text instead of
> HTML.
> 
> Regards,
> Lucas
> 
> Am Donnerstag, den 08.06.2017, 18:34 +0200 schrieb Michail Georgios
> Etairidis:
> > The i2c-imx driver incorrectly uses readb()/writeb() to read and write
> > to the appropriate registers when performing a repeated start. The
> > appropriate imx_i2c_read_reg()/imx_i2c_write_reg() functions should be
> > used instead. Performing a repeated start results to a kernel panic.
> > 
> >  
> > 
> > diff --git a/drivers/i2c/busses/i2c-imx.c
> > b/drivers/i2c/busses/i2c-imx.c
> > 
> > index 95ed1718..988bb620 100644
> > 
> > --- a/drivers/i2c/busses/i2c-imx.c
> > 
> > +++ b/drivers/i2c/busses/i2c-imx.c
> > 
> > @@ -734,9 +734,9 @@ static int i2c_imx_dma_read(struct imx_i2c_struct
> > *i2c_imx,
> > 
> >                                 * the first read operation, otherwise
> > the first read cost
> > 
> >                                 * one extra clock cycle.
> > 
> >                                 */
> > 
> > -                              temp = readb(i2c_imx->base +
> > IMX_I2C_I2CR);
> > 
> > +                             temp = imx_i2c_read_reg(i2c_imx->base +
> > IMX_I2C_I2CR);
> > 
> >                                temp |= I2CR_MTX;
> > 
> > -                              writeb(temp, i2c_imx->base +
> > IMX_I2C_I2CR);
> > 
> > +                             imx_i2c_write_reg(temp, i2c_imx->base +
> > IMX_I2C_I2CR);
> > 
> >                }
> > 
> >                msgs->buf[msgs->len-1] = imx_i2c_read_reg(i2c_imx,
> > IMX_I2C_I2DR);
> > 
> > @@ -857,9 +857,9 @@ static int i2c_imx_read(struct imx_i2c_struct
> > *i2c_imx, struct i2c_msg *msgs, bo
> > 
> >                                                                 * the
> > first read operation, otherwise the first read cost
> > 
> >                                                                 * one
> > extra clock cycle.
> > 
> >                                                                 */
> > 
> > -                                                              temp =
> > readb(i2c_imx->base + IMX_I2C_I2CR);
> > 
> > +                                                             temp =
> > imx_i2c_read_reg(i2c_imx->base + IMX_I2C_I2CR);
> > 
> >                                                                temp |=
> > I2CR_MTX;
> > 
> > -
> > writeb(temp, i2c_imx->base + IMX_I2C_I2CR);
> > 
> > +
> > imx_i2c_write_reg(temp, i2c_imx->base + IMX_I2C_I2CR);
> > 
> >                                                }
> > 
> >                                } else if (i == (msgs->len - 2)) {
> > 
> > 
> > dev_dbg(&i2c_imx->adapter.dev,
> > 
> >

^ permalink raw reply	[flat|nested] 10+ messages in thread
[parent not found: <681500CE65202E47A192754B01DAB4671B16747DB9@SDE12.beckipc.net>]

end of thread, other threads:[~2017-06-22  8:54 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-06-09 13:28 [PATCH] i2c: i2c-imx: Use correct function to write to register Michail Georgios Etairidis
2017-06-19 14:46 ` Wolfram Sang
2017-06-20  8:20   ` AW: " Michail Georgios Etairidis
2017-06-20  8:28     ` Uwe Kleine-König
2017-06-20  9:23       ` Wolfram Sang
2017-06-22  8:54     ` Wolfram Sang
2017-06-19 18:54 ` Uwe Kleine-König
2017-06-20  1:50   ` Andy Duan
  -- strict thread matches above, loose matches on Subject: below --
2017-06-08 17:07 Michail Georgios Etairidis
     [not found] <681500CE65202E47A192754B01DAB4671B16747DB9@SDE12.beckipc.net>
2017-06-08 16:43 ` Lucas Stach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).