From: Shawn Guo <shawn.guo-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
To: Kaushal Butala
<kaushalkernelmailinglist-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Kaushal Butala
<kaushal.butala-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Wolfram Sang <wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org>
Subject: Re: [RFC PATCH] imx-i2c: Add smbus block read support to imx i2c bus
Date: Wed, 2 Apr 2014 16:30:47 +0800 [thread overview]
Message-ID: <20140402083046.GB8753@dragon> (raw)
In-Reply-To: <1395759982-18559-1-git-send-email-kaushalkernelmailinglist-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
On Tue, Mar 25, 2014 at 04:06:22PM +0100, Kaushal Butala wrote:
> From: Kaushal Butala <kaushal.butala-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
>
> The smbus block read is not currently supported for imx i2c devices.
> This patchset adds the support to imx i2c bus so that blocks of data
> can be read using SMbus block reads.(using i2c_smbus_read_block_data()
> function from the i2c_core.c.). Tested with 3.10.9 kernel.
>
> Signed-off-by: Kaushal Butala <kaushalkernelmailinglist-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
The patch should be sent to I2C subsystem maintainer - Wolfram (copied)
rather than me.
The patch looks good to me except a few unnecessary parentheses.
> ---
> drivers/i2c/busses/i2c-imx.c | 31 ++++++++++++++++++++++++++++---
> 1 file changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c
> index db895fb..b6c2c3c 100644
> --- a/drivers/i2c/busses/i2c-imx.c
> +++ b/drivers/i2c/busses/i2c-imx.c
> @@ -462,6 +462,7 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs)
> {
> int i, result;
> unsigned int temp;
> + int block_data = msgs->flags & I2C_M_RECV_LEN;
>
> dev_dbg(&i2c_imx->adapter.dev,
> "<%s> write slave address: addr=0x%x\n",
> @@ -481,7 +482,12 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs)
> /* setup bus to read data */
> temp = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
> temp &= ~I2CR_MTX;
> - if (msgs->len - 1)
> +
> + /*
> + * Reset the I2CR_TXAK flag initially for SMbus block read since the
> + * length is unknown
> + */
> + if ((msgs->len - 1) || (block_data))
Unnecessary parentheses around block_data.
> temp &= ~I2CR_TXAK;
> imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
> imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR); /* dummy read */
> @@ -490,9 +496,24 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs)
>
> /* read data */
> for (i = 0; i < msgs->len; i++) {
> + u8 len = 0;
> result = i2c_imx_trx_complete(i2c_imx);
> if (result)
> return result;
> + /*
> + * First byte is the length of remaining packet
> + * in the SMBus block data read. Add it to
> + * msgs->len.
> + */
> + if ((!i) && (block_data)) {
if (!i && block_data)
> + len = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
> + if ((len == 0) || (len > I2C_SMBUS_BLOCK_MAX))
> + return -EPROTO;
> + dev_dbg(&i2c_imx->adapter.dev,
> + "<%s> read length: 0x%X\n",
> + __func__, len);
> + msgs->len += len;
> + }
> if (i == (msgs->len - 1)) {
> /* It must generate STOP before read I2DR to prevent
> controller from generating another clock cycle */
> @@ -510,7 +531,10 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs)
> temp |= I2CR_TXAK;
> imx_i2c_write_reg(temp, i2c_imx, IMX_I2C_I2CR);
> }
> - msgs->buf[i] = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
> + if ((!i) && (block_data))
Ditto
Shawn
> + msgs->buf[0] = len;
> + else
> + msgs->buf[i] = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
> dev_dbg(&i2c_imx->adapter.dev,
> "<%s> read byte: B%d=0x%X\n",
> __func__, i, msgs->buf[i]);
> @@ -583,7 +607,8 @@ fail0:
>
> static u32 i2c_imx_func(struct i2c_adapter *adapter)
> {
> - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
> + return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL
> + | I2C_FUNC_SMBUS_READ_BLOCK_DATA;
> }
>
> static struct i2c_algorithm i2c_imx_algo = {
> --
> 1.7.9.5
>
>
>
next prev parent reply other threads:[~2014-04-02 8:30 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-25 15:06 [RFC PATCH] imx-i2c: Add smbus block read support to imx i2c bus Kaushal Butala
[not found] ` <1395759982-18559-1-git-send-email-kaushalkernelmailinglist-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-04-02 8:30 ` Shawn Guo [this message]
2014-04-04 12:56 ` [RFC PATCH-v2] SMBus block read support to imx_i2c Kaushal Butala
[not found] ` <1396616170-6659-1-git-send-email-kaushalkernelmailinglist-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-05-21 8:26 ` 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=20140402083046.GB8753@dragon \
--to=shawn.guo-kzfg59tc24xl57midrcfdg@public.gmane.org \
--cc=kaushal.butala-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=kaushalkernelmailinglist-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=wsa-z923LK4zBo2bacvFa/9K2g@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).