From: Jean Delvare <jdelvare@suse.de>
To: Wolfram Sang <wsa+renesas@sang-engineering.com>
Cc: linux-i2c@vger.kernel.org, linux-renesas-soc@vger.kernel.org
Subject: Re: [PATCH] i2c: algo-bit: add support for I2C_M_STOP
Date: Mon, 19 Jun 2017 10:30:02 +0200 [thread overview]
Message-ID: <20170619103002.5d502c92@endymion> (raw)
In-Reply-To: <20170617171238.19638-1-wsa+renesas@sang-engineering.com>
Hi Wolfram,
On Sat, 17 Jun 2017 19:12:38 +0200, Wolfram Sang wrote:
> Support for enforced STOPs will allow us to use SCCB compatible devices.
>
> Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
> ---
>
> Notes: I don't actually have any SCCB compatible sensor but verified with a
> logic analyzer that repeated starts got replaced with a stop + start sequence.
> However, we have members in our team who might need this feature soon. I'll
> likely wait for their Tested-by unless something unforseen happens.
>
> drivers/i2c/algos/i2c-algo-bit.c | 17 ++++++++++++++---
> 1 file changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
> index a8e89df665b904..4758058352959d 100644
> --- a/drivers/i2c/algos/i2c-algo-bit.c
> +++ b/drivers/i2c/algos/i2c-algo-bit.c
> @@ -549,12 +549,17 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
> bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
> i2c_start(adap);
> for (i = 0; i < num; i++) {
> + bool did_stop = false;
I'm pretty certain you want to declare and initialize this variable
outside the loop.
> +
> pmsg = &msgs[i];
> nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
> if (!(pmsg->flags & I2C_M_NOSTART)) {
> - if (i) {
> - bit_dbg(3, &i2c_adap->dev, "emitting "
> - "repeated start condition\n");
> + if (did_stop) {
> + bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
> + i2c_start(adap);
> + did_stop = false;
> + } else if (i) {
> + bit_dbg(3, &i2c_adap->dev, "emitting repeated start condition\n");
> i2c_repstart(adap);
> }
> ret = bit_doAddress(i2c_adap, pmsg);
> @@ -588,6 +593,12 @@ static int bit_xfer(struct i2c_adapter *i2c_adap,
> goto bailout;
> }
> }
> +
> + if (pmsg->flags & I2C_M_STOP && i != num - 1) {
I recommend adding parentheses around the bit matching when combined
with &&. I know it is not strictly needed and the compiler doesn't
care, but I find it easier to read, and there seems to be a consensus
(90 %) on that in the kernel tree.
> + bit_dbg(3, &i2c_adap->dev, "emitting enforced stop condition\n");
> + i2c_stop(adap);
> + did_stop = true;
> + }
> }
> ret = i;
>
I have 2 questions:
1* Repeated start happens between messages of a same transaction, and
you handle that case above. However in the case of 10-bit address
clients, there is also a repeated start happening during the address
phase of the transaction, if the first message is a read. Did you check
what the SCCB protocol expects in that case?
2* I'm not sure why you add the enforced stop at the end of one
iteration and the start at the beginning of the next iteration. It
would be more simple and efficient to do both at the beginning of the
next iteration. The only case where it would make a difference is if
both I2C_M_NOSTART and I2C_M_STOP are specified. In this case you
currently emit a stop condition but no start, which I don't think can
work at all.
What about something like that instead? Or I am missing something?
--- linux-4.11.orig/drivers/i2c/algos/i2c-algo-bit.c 2017-06-19 09:57:17.949074198 +0200
+++ linux-4.11/drivers/i2c/algos/i2c-algo-bit.c 2017-06-19 10:23:26.711088536 +0200
@@ -553,8 +553,17 @@ static int bit_xfer(struct i2c_adapter *
nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
if (!(pmsg->flags & I2C_M_NOSTART)) {
if (i) {
- bit_dbg(3, &i2c_adap->dev, "emitting "
- "repeated start condition\n");
+ if (msgs[i - 1].flags & I2C_M_STOP) {
+ bit_dbg(3, &i2c_adap->dev,
+ "emitting enforced stop condition\n");
+ i2c_stop(adap);
+ bit_dbg(3, &i2c_adap->dev,
+ "emitting start condition\n");
+ i2c_start(adap);
+ }
+
+ bit_dbg(3, &i2c_adap->dev,
+ "emitting repeated start condition\n");
i2c_repstart(adap);
}
ret = bit_doAddress(i2c_adap, pmsg);
--
Jean Delvare
SUSE L3 Support
next prev parent reply other threads:[~2017-06-19 8:30 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-17 17:12 [PATCH] i2c: algo-bit: add support for I2C_M_STOP Wolfram Sang
2017-06-19 8:30 ` Jean Delvare [this message]
2017-06-20 17:28 ` Wolfram Sang
2017-06-21 7:18 ` Jean Delvare
2017-06-21 14:30 ` Wolfram Sang
2017-06-22 9:06 ` Jean Delvare
2017-06-22 10:15 ` Wolfram Sang
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=20170619103002.5d502c92@endymion \
--to=jdelvare@suse.de \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=wsa+renesas@sang-engineering.com \
/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 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).