linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH repost] i2c: rcar: Fix order of restart and clear status
@ 2015-08-18 15:20 Yoshihiro Kaneko
       [not found] ` <1439911206-8736-1-git-send-email-ykaneko0929-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 3+ messages in thread
From: Yoshihiro Kaneko @ 2015-08-18 15:20 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA
  Cc: Wolfram Sang, Simon Horman, Magnus Damm,
	linux-sh-u79uwXL29TY76Z2rM5mHXA

From: Ryo Kataoka <ryo.kataoka.wt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>

In case of repeated START condition, the restart has to be kicked
before clear status (MSR register). If it is kicked after clear status,
R-Car I2C may transfer data (TXD register) or receive data (RXD register)
instead of transferring slave address (MAR register).

Signed-off-by: Ryo Kataoka <ryo.kataoka.wt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
Signed-off-by: Yoshihiro Kaneko <ykaneko0929-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---

This patch is based on i2c/for-next branch of Wolfram Sang's linux tree.

 drivers/i2c/busses/i2c-rcar.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
index d8361da..8cc7bd7 100644
--- a/drivers/i2c/busses/i2c-rcar.c
+++ b/drivers/i2c/busses/i2c-rcar.c
@@ -2,6 +2,7 @@
  * Driver for the Renesas RCar I2C unit
  *
  * Copyright (C) 2014 Wolfram Sang <wsa-jBu1N2QxHDJrcw3mvpCnnVaTQe2KTcn/@public.gmane.org>
+ * Copyright (C) 2013-2014 Renesas Electronics Corporation
  *
  * Copyright (C) 2012-14 Renesas Solutions Corp.
  * Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
@@ -99,6 +100,7 @@
 #define ID_DONE		(1 << 2)
 #define ID_ARBLOST	(1 << 3)
 #define ID_NACK		(1 << 4)
+#define ID_FIRST_MSG	(1 << 5)
 
 enum rcar_i2c_type {
 	I2C_RCAR_GEN1,
@@ -125,6 +127,7 @@ struct rcar_i2c_priv {
 #define rcar_i2c_is_recv(p)		((p)->msg->flags & I2C_M_RD)
 
 #define rcar_i2c_flags_set(p, f)	((p)->flags |= (f))
+#define rcar_i2c_flags_clr(p, f)	((p)->flags &= ~(f))
 #define rcar_i2c_flags_has(p, f)	((p)->flags & (f))
 
 #define LOOP_TIMEOUT	1024
@@ -257,8 +260,14 @@ static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv)
 	int read = !!rcar_i2c_is_recv(priv);
 
 	rcar_i2c_write(priv, ICMAR, (priv->msg->addr << 1) | read);
-	rcar_i2c_write(priv, ICMSR, 0);
-	rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
+	if (rcar_i2c_flags_has(priv, ID_FIRST_MSG)) {	/* start */
+		rcar_i2c_write(priv, ICMSR, 0);
+		rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
+		rcar_i2c_flags_clr(priv, ID_FIRST_MSG);
+	} else {	/* restart */
+		rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
+		rcar_i2c_write(priv, ICMSR, 0);
+	}
 	rcar_i2c_write(priv, ICMIER, read ? RCAR_IRQ_RECV : RCAR_IRQ_SEND);
 }
 
@@ -523,6 +532,8 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
 		priv->msg	= &msgs[i];
 		priv->pos	= 0;
 		priv->flags	= 0;
+		if (i == 0)
+			rcar_i2c_flags_set(priv, ID_FIRST_MSG);
 		if (i == num - 1)
 			rcar_i2c_flags_set(priv, ID_LAST_MSG);
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH repost] i2c: rcar: Fix order of restart and clear status
       [not found] ` <1439911206-8736-1-git-send-email-ykaneko0929-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-09-03 20:34   ` Wolfram Sang
  2015-09-06 15:58     ` Yoshihiro Kaneko
  0 siblings, 1 reply; 3+ messages in thread
From: Wolfram Sang @ 2015-09-03 20:34 UTC (permalink / raw)
  To: Yoshihiro Kaneko
  Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA, Simon Horman, Magnus Damm,
	linux-sh-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 882 bytes --]

On Wed, Aug 19, 2015 at 12:20:06AM +0900, Yoshihiro Kaneko wrote:
> From: Ryo Kataoka <ryo.kataoka.wt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
> 
> In case of repeated START condition, the restart has to be kicked
> before clear status (MSR register). If it is kicked after clear status,
> R-Car I2C may transfer data (TXD register) or receive data (RXD register)
> instead of transferring slave address (MAR register).
> 
> Signed-off-by: Ryo Kataoka <ryo.kataoka.wt-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
> Signed-off-by: Yoshihiro Kaneko <ykaneko0929-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

I think I could reproduce the issue but changing the order of clearing
and kicking did not change anything for me. I have CCed you in my new
series regarding the i2c-rcar driver. That made the issue for me go
away. Can you kindly check, too?

Thanks,

   Wolfram


[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH repost] i2c: rcar: Fix order of restart and clear status
  2015-09-03 20:34   ` Wolfram Sang
@ 2015-09-06 15:58     ` Yoshihiro Kaneko
  0 siblings, 0 replies; 3+ messages in thread
From: Yoshihiro Kaneko @ 2015-09-06 15:58 UTC (permalink / raw)
  To: Wolfram Sang; +Cc: linux-i2c, Simon Horman, Magnus Damm, Linux-sh list

Hello Wolfram,

2015-09-04 5:34 GMT+09:00 Wolfram Sang <wsa@the-dreams.de>:
> On Wed, Aug 19, 2015 at 12:20:06AM +0900, Yoshihiro Kaneko wrote:
>> From: Ryo Kataoka <ryo.kataoka.wt@renesas.com>
>>
>> In case of repeated START condition, the restart has to be kicked
>> before clear status (MSR register). If it is kicked after clear status,
>> R-Car I2C may transfer data (TXD register) or receive data (RXD register)
>> instead of transferring slave address (MAR register).
>>
>> Signed-off-by: Ryo Kataoka <ryo.kataoka.wt@renesas.com>
>> Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
>
> I think I could reproduce the issue but changing the order of clearing
> and kicking did not change anything for me. I have CCed you in my new
> series regarding the i2c-rcar driver. That made the issue for me go
> away. Can you kindly check, too?

Sure, but I'm not sure about the behavior of the H/W.
I would like to learn from your patch series.

Best Regards,
Kaneko

>
> Thanks,
>
>    Wolfram
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-09-06 15:58 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-18 15:20 [PATCH repost] i2c: rcar: Fix order of restart and clear status Yoshihiro Kaneko
     [not found] ` <1439911206-8736-1-git-send-email-ykaneko0929-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-09-03 20:34   ` Wolfram Sang
2015-09-06 15:58     ` Yoshihiro Kaneko

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).