All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marten Lindahl <martenli@axis.com>
To: Krzysztof Kozlowski <krzk@kernel.org>
Cc: <linux-i2c@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-samsung-soc@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>, <kernel@axis.com>
Subject: Re: [PATCH] i2c: exynos5: Preserve high speed master code
Date: Tue, 16 Feb 2021 23:09:33 +0100	[thread overview]
Message-ID: <20210216220933.2wzmft72bhjptzl3@axis.com> (raw)
In-Reply-To: <20210216075141.o4wjnwmmjze2p3cn@kozik-lap>

Hi Krzysztof!

Thank you for your comments! Please see my reply below.
I will send v2 in a moment.

On Tue, Feb 16, 2021 at 08:51:41AM +0100, Krzysztof Kozlowski wrote:
> On Mon, Feb 15, 2021 at 08:03:21PM +0100, Mårten Lindahl wrote:
> > From: Mårten Lindahl <martenli@axis.com>
> > 
> > When the controller starts to send a message with the MASTER_ID field
> > set (high speed), the whole I2C_ADDR register is overwritten including
> > MASTER_ID as the SLV_ADDR_MAS field is set.
> 
> Are you here describing bug in driver or hardware (the controller?)?
> Looking at the code, I think the driver, but description got me
> confused.
> 

Yes, it is the driver. I will change.

> > 
> > This patch preserves already written fields in I2C_ADDR when writing
> > SLV_ADDR_MAS.
> > 
> > Signed-off-by: Mårten Lindahl <martenli@axis.com>
> > ---
> >  drivers/i2c/busses/i2c-exynos5.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c
> > index 20a9881a0d6c..f2d04c241299 100644
> > --- a/drivers/i2c/busses/i2c-exynos5.c
> > +++ b/drivers/i2c/busses/i2c-exynos5.c
> > @@ -606,6 +606,7 @@ static void exynos5_i2c_message_start(struct exynos5_i2c *i2c, int stop)
> >  	u32 i2c_ctl;
> >  	u32 int_en = 0;
> >  	u32 i2c_auto_conf = 0;
> > +	u32 i2c_addr = 0;
> >  	u32 fifo_ctl;
> >  	unsigned long flags;
> >  	unsigned short trig_lvl;
> > @@ -640,7 +641,12 @@ static void exynos5_i2c_message_start(struct exynos5_i2c *i2c, int stop)
> >  		int_en |= HSI2C_INT_TX_ALMOSTEMPTY_EN;
> >  	}
> >  
> > -	writel(HSI2C_SLV_ADDR_MAS(i2c->msg->addr), i2c->regs + HSI2C_ADDR);
> > +	i2c_addr = HSI2C_SLV_ADDR_MAS(i2c->msg->addr);
> > +
> > +	if (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ)
> > +		i2c_addr |= readl(i2c->regs + HSI2C_ADDR);
> 
> Any reason why not "|= MASTER_ID(i2c->adap.nr)" here instead of more
> expensive IO read? It's quite important because your current code will
> bitwise-or old I2C slave address with a new one... This should break
> during tests with multiple I2C slave devices, shouldn't it?
> 

You are correct. It is better to use the macro instead, and yes,
safer too. I only have one device that supports high speed i2c, but
I get your point. It could potentially break.

> On which HW did you test it?

I used an Artpec development board as master and INA230EVM board
as slave.

> 
> Best regards,
> Krzysztof
> 

Best regards
Mårten
> 
> > +
> > +	writel(i2c_addr, i2c->regs + HSI2C_ADDR);

WARNING: multiple messages have this Message-ID (diff)
From: Marten Lindahl <martenli@axis.com>
To: Krzysztof Kozlowski <krzk@kernel.org>
Cc: linux-samsung-soc@vger.kernel.org, kernel@axis.com,
	linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] i2c: exynos5: Preserve high speed master code
Date: Tue, 16 Feb 2021 23:09:33 +0100	[thread overview]
Message-ID: <20210216220933.2wzmft72bhjptzl3@axis.com> (raw)
In-Reply-To: <20210216075141.o4wjnwmmjze2p3cn@kozik-lap>

Hi Krzysztof!

Thank you for your comments! Please see my reply below.
I will send v2 in a moment.

On Tue, Feb 16, 2021 at 08:51:41AM +0100, Krzysztof Kozlowski wrote:
> On Mon, Feb 15, 2021 at 08:03:21PM +0100, Mårten Lindahl wrote:
> > From: Mårten Lindahl <martenli@axis.com>
> > 
> > When the controller starts to send a message with the MASTER_ID field
> > set (high speed), the whole I2C_ADDR register is overwritten including
> > MASTER_ID as the SLV_ADDR_MAS field is set.
> 
> Are you here describing bug in driver or hardware (the controller?)?
> Looking at the code, I think the driver, but description got me
> confused.
> 

Yes, it is the driver. I will change.

> > 
> > This patch preserves already written fields in I2C_ADDR when writing
> > SLV_ADDR_MAS.
> > 
> > Signed-off-by: Mårten Lindahl <martenli@axis.com>
> > ---
> >  drivers/i2c/busses/i2c-exynos5.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c
> > index 20a9881a0d6c..f2d04c241299 100644
> > --- a/drivers/i2c/busses/i2c-exynos5.c
> > +++ b/drivers/i2c/busses/i2c-exynos5.c
> > @@ -606,6 +606,7 @@ static void exynos5_i2c_message_start(struct exynos5_i2c *i2c, int stop)
> >  	u32 i2c_ctl;
> >  	u32 int_en = 0;
> >  	u32 i2c_auto_conf = 0;
> > +	u32 i2c_addr = 0;
> >  	u32 fifo_ctl;
> >  	unsigned long flags;
> >  	unsigned short trig_lvl;
> > @@ -640,7 +641,12 @@ static void exynos5_i2c_message_start(struct exynos5_i2c *i2c, int stop)
> >  		int_en |= HSI2C_INT_TX_ALMOSTEMPTY_EN;
> >  	}
> >  
> > -	writel(HSI2C_SLV_ADDR_MAS(i2c->msg->addr), i2c->regs + HSI2C_ADDR);
> > +	i2c_addr = HSI2C_SLV_ADDR_MAS(i2c->msg->addr);
> > +
> > +	if (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ)
> > +		i2c_addr |= readl(i2c->regs + HSI2C_ADDR);
> 
> Any reason why not "|= MASTER_ID(i2c->adap.nr)" here instead of more
> expensive IO read? It's quite important because your current code will
> bitwise-or old I2C slave address with a new one... This should break
> during tests with multiple I2C slave devices, shouldn't it?
> 

You are correct. It is better to use the macro instead, and yes,
safer too. I only have one device that supports high speed i2c, but
I get your point. It could potentially break.

> On which HW did you test it?

I used an Artpec development board as master and INA230EVM board
as slave.

> 
> Best regards,
> Krzysztof
> 

Best regards
Mårten
> 
> > +
> > +	writel(i2c_addr, i2c->regs + HSI2C_ADDR);

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-02-16 22:10 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-15 19:03 [PATCH] i2c: exynos5: Preserve high speed master code Mårten Lindahl
2021-02-15 19:03 ` Mårten Lindahl
2021-02-16  7:51 ` Krzysztof Kozlowski
2021-02-16  7:51   ` Krzysztof Kozlowski
2021-02-16 22:09   ` Marten Lindahl [this message]
2021-02-16 22:09     ` Marten Lindahl
2021-02-17  8:07     ` Krzysztof Kozlowski
2021-02-17  8:07       ` Krzysztof Kozlowski
2021-02-17  8:32       ` Jesper Nilsson
2021-02-17  8:32         ` Jesper Nilsson
2021-02-17  8:43         ` Krzysztof Kozlowski
2021-02-17  8:43           ` Krzysztof Kozlowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210216220933.2wzmft72bhjptzl3@axis.com \
    --to=martenli@axis.com \
    --cc=kernel@axis.com \
    --cc=krzk@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.