linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: York Sun <yorksun-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
To: guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org
Cc: Tabi Timur-B04825
	<B04825-KZfg59tc24xl57MIdRCFDg@public.gmane.org>,
	linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	B29983-KZfg59tc24xl57MIdRCFDg@public.gmane.org
Subject: Re: [PATCH] i2c/busses: (mpc) Add support for SMBUS_READ_BLOCK_DATA
Date: Wed, 16 Nov 2011 09:28:29 -0800	[thread overview]
Message-ID: <1321464509.7847.41.camel@oslab-l1> (raw)
In-Reply-To: <ECEE0D23-8F53-402C-A97F-4DB0F0E9C79B-KZfg59tc24xl57MIdRCFDg@public.gmane.org>

I am not sure if this mail will reach the list as I am not subscribed.

In the v2 patch (actually both version), you wrote

> +		byte = readb(i2c->base + MPC_I2C_DR);
> +
> +		/* Adjust length if first received byte is length */
> +		if (i == 0 && recv_len) {
> +			if (byte == 0 || byte > I2C_SMBUS_BLOCK_MAX)
> +				return -EPROTO;
> +			length += byte;
> +			/*
> +			 * For block reads, generate txack here if data length
> +			 * is 1 byte (total length is 2 bytes).
> +			 */
> +			if (length == 2)
> +				writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA
> +					 | CCR_TXAK);
> +		}
> +		data[i] = byte;

I am wondering if the first byte should be left out for data[] if the
recv_len is non-zero. If I understand correctly, this patch is to
support of SMBus with multiple byte read. The SMBus is different from
I2C bus on multiple byte. The first data is byte count vs slave data for
I2C. So you will receive all data preceded by the byte count, which is
one more than your loop.

York



On Wed, 2011-11-16 at 08:56 -0600, Timur Tabi wrote:
> 
> On Nov 16, 2011, at 12:01 AM, sun york-R58495 <R58495-KZfg59tc24xl57MIdRCFDg@public.gmane.org> wrote:
> 
> > Timur,
> > 
> > Which silicon has the i2c-mpc? Without the user's manual, I can only guess from the code. It looks like the code is going to deal with a block transaction with the first byte is the length. If that's true, there might be a problem with 
> > 
> > data[i]=byte
> > 
> > if the block is true. Since the first byte is the length, it shouldn't be the data at the same time, right?
> 
> Can you check thr mailing list thread?  It should explain everything.
> 
> 
> > 
> > York
> > 
> > ________________________________________
> > From: Tabi Timur-B04825
> > Sent: Tuesday, November 15, 2011 11:04 AM
> > To: sun york-R58495
> > Subject: Fwd: [PATCH] i2c/busses: (mpc) Add support for SMBUS_READ_BLOCK_DATA
> > 
> > York,
> > 
> > If you have a moment, can you take a look at this patch?  I don't know
> > enough about I2C to really understand it.
> > 
> > ---------- Forwarded message ----------
> > From: Guenter Roeck <guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>
> > Date: Tue, Nov 15, 2011 at 12:27 AM
> > Subject: [PATCH] i2c/busses: (mpc) Add support for SMBUS_READ_BLOCK_DATA
> > To: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>, Ben Dooks <ben-linux-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>
> > Cc: Grant Likely <grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org>,
> > linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Guenter Roeck
> > <guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>, Tang Yuantian <B29983-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> > 
> > 
> > Add support for SMBUS_READ_BLOCK_DATA to the i2c-mpc bus driver.
> > Required to support the PMBus zl6100 driver with i2c-mpc.
> > 
> > Reported-by: Tang Yuantian <B29983-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> > Cc: Tang Yuantian <B29983-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> > Signed-off-by: Guenter Roeck <guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>
> > ---
> > drivers/i2c/busses/i2c-mpc.c |   33 +++++++++++++++++++++++++--------
> > 1 files changed, 25 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
> > index 107397a..77aade7 100644
> > --- a/drivers/i2c/busses/i2c-mpc.c
> > +++ b/drivers/i2c/busses/i2c-mpc.c
> > @@ -454,7 +454,7 @@ static int mpc_write(struct mpc_i2c *i2c, int target,
> > }
> > 
> > static int mpc_read(struct mpc_i2c *i2c, int target,
> > -                   u8 *data, int length, int restart)
> > +                   u8 *data, int length, int restart, bool block)
> > {
> >       unsigned timeout = i2c->adap.timeout;
> >       int i, result;
> > @@ -470,7 +470,7 @@ static int mpc_read(struct mpc_i2c *i2c, int target,
> >               return result;
> > 
> >       if (length) {
> > -               if (length == 1)
> > +               if (length == 1 && !block)
> >                       writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK);
> >               else
> >                       writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA);
> > @@ -479,17 +479,28 @@ static int mpc_read(struct mpc_i2c *i2c, int target,
> >       }
> > 
> >       for (i = 0; i < length; i++) {
> > +               u8 byte;
> > +
> >               result = i2c_wait(i2c, timeout, 0);
> >               if (result < 0)
> >                       return result;
> > 
> > +               byte = readb(i2c->base + MPC_I2C_DR);
> > +               /*
> > +                * Adjust length if first received byte is length
> > +                */
> > +               if (i == 0 && block) {
> > +                       if (byte == 0 || byte > I2C_SMBUS_BLOCK_MAX)
> > +                               return -EPROTO;
> > +                       length += byte;
> > +               }
> > +               data[i] = byte;
> >               /* Generate txack on next to last byte */
> >               if (i == length - 2)
> >                       writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK);
> >               /* Do not generate stop on last byte */
> >               if (i == length - 1)
> >                       writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX);
> > -               data[i] = readb(i2c->base + MPC_I2C_DR);
> >       }
> > 
> >       return length;
> > @@ -532,12 +543,17 @@ static int mpc_xfer(struct i2c_adapter *adap,
> > struct i2c_msg *msgs, int num)
> >                       "Doing %s %d bytes to 0x%02x - %d of %d messages\n",
> >                       pmsg->flags & I2C_M_RD ? "read" : "write",
> >                       pmsg->len, pmsg->addr, i + 1, num);
> > -               if (pmsg->flags & I2C_M_RD)
> > -                       ret =
> > -                           mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i);
> > -               else
> > +               if (pmsg->flags & I2C_M_RD) {
> > +                       bool block = pmsg->flags & I2C_M_RECV_LEN;
> > +
> > +                       ret = mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i,
> > +                                      block);
> > +                       if (block && ret > 0)
> > +                               pmsg->len = ret;
> > +               } else {
> >                       ret =
> >                           mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i);
> > +               }
> >       }
> >       mpc_i2c_stop(i2c);
> >       return (ret < 0) ? ret : num;
> > @@ -545,7 +561,8 @@ static int mpc_xfer(struct i2c_adapter *adap,
> > struct i2c_msg *msgs, int num)
> > 
> > static u32 mpc_functionality(struct i2c_adapter *adap)
> > {
> > -       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
> > +       return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL
> > +         | I2C_FUNC_SMBUS_READ_BLOCK_DATA;
> > }
> > 
> > static const struct i2c_algorithm mpc_algo = {
> > --
> > 1.7.3.1
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
> > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > 
> > 
> > 
> > --
> > Timur Tabi
> > Linux kernel developer at Freescale

  parent reply	other threads:[~2011-11-16 17:28 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-15  6:27 [PATCH] i2c/busses: (mpc) Add support for SMBUS_READ_BLOCK_DATA Guenter Roeck
     [not found] ` <1321338462-6138-1-git-send-email-guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>
2011-11-15  8:54   ` Jean Delvare
     [not found]     ` <20111115095445.3d34e99e-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2011-11-15 16:29       ` Guenter Roeck
2011-11-15 19:02       ` Tabi Timur-B04825
     [not found]         ` <CAOZdJXVq=0pbrPM_-+Kjf3NhON8oN3Me64R6c9qBiAEFuRsDOw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2011-11-15 19:14           ` Guenter Roeck
2011-11-15 20:05             ` Jean Delvare
     [not found]               ` <20111115210528.0f9a0948-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2011-11-15 21:14                 ` Guenter Roeck
     [not found] ` <CAOZdJXUPO5PyMkAw-2EPvy_qSUuqsgUA7Gr8mKUX7HyShoXk3g@mail.gmail.com>
     [not found]   ` <E6AF40B3BFC8A9428EACB47497F0F4B62DC687@039-SN1MPN1-002.039d.mgd.msft.net>
     [not found]     ` <ECEE0D23-8F53-402C-A97F-4DB0F0E9C79B@freescale.com>
     [not found]       ` <ECEE0D23-8F53-402C-A97F-4DB0F0E9C79B-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2011-11-16 17:28         ` York Sun [this message]
2011-11-16 17:36           ` Guenter Roeck
2011-11-16 17:55             ` York Sun
2011-11-16 18:09               ` Guenter Roeck
2011-11-16 18:09               ` Jean Delvare
2011-11-16 18:20                 ` York Sun
2011-11-16 18:51                   ` Guenter Roeck
2011-11-16 18:56                     ` Timur Tabi
2011-11-16 18:58                     ` sun york-R58495
2011-11-16 19:10                   ` Jean Delvare
     [not found]                     ` <20111116201048.4b7877dd-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2011-11-16 19:15                       ` York Sun
2011-11-16 19:18                         ` Jean Delvare
2011-11-16 19:24                           ` York Sun
2011-11-17 18:18                             ` Guenter Roeck
2011-11-17 19:23                               ` York Sun
2011-11-18  3:15                               ` Tang Yuantian-B29983
     [not found]                           ` <20111116201847.6b11dc7f-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2011-12-01  7:06                             ` Tang Yuantian-B29983
2011-12-07  2:52                             ` Tang Yuantian-B29983
     [not found]                               ` <3C06C26914DACA4BB3A368F78CA0B3A7134583-TcFNo7jSaXM0vywKSws3iq4g8xLGJsHaLnY5E4hWTkheoWH0uzbU5w@public.gmane.org>
2011-12-07  3:20                                 ` Guenter Roeck
2011-12-07  5:25                                   ` Tang Yuantian-B29983
     [not found]                                     ` <3C06C26914DACA4BB3A368F78CA0B3A71345F2-TcFNo7jSaXM0vywKSws3iq4g8xLGJsHaLnY5E4hWTkheoWH0uzbU5w@public.gmane.org>
2011-12-07  7:29                                       ` Jean Delvare
     [not found]                                         ` <20111207082924.2f88bd5d-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2012-02-23  6:57                                           ` Huang Changming-R66093
2011-11-16 17:38           ` Jean Delvare
  -- strict thread matches above, loose matches on Subject: below --
2011-12-12  4:10 Yuantian.tang-KZfg59tc24xl57MIdRCFDg
     [not found] ` <1323663010-32223-1-git-send-email-Yuantian.tang-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
2011-12-12  9:28   ` Guenter Roeck

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=1321464509.7847.41.camel@oslab-l1 \
    --to=yorksun-kzfg59tc24xl57midrcfdg@public.gmane.org \
    --cc=B04825-KZfg59tc24xl57MIdRCFDg@public.gmane.org \
    --cc=B29983-KZfg59tc24xl57MIdRCFDg@public.gmane.org \
    --cc=guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org \
    --cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.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 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).