From: "Sricharan" <sricharan@codeaurora.org>
To: 'Naveen Kaje' <nkaje@codeaurora.org>,
wsa@the-dreams.de, linux-i2c@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: rruigrok@codeaurora.org, timur@codeaurora.org,
cov@codeaurora.org, 'Andy Gross' <andy.gross@linaro.org>,
linux-arm-kernel@lists.infradead.org,
linux-arm-msm@vger.kernel.org
Subject: RE: [PATCH 2/2] i2c: qup: support SMBus block read
Date: Tue, 10 May 2016 12:43:21 +0530 [thread overview]
Message-ID: <000b01d1aa8b$7317a300$5946e900$@codeaurora.org> (raw)
In-Reply-To: <1462317959-11632-2-git-send-email-nkaje@codeaurora.org>
+additional lists
> I2C QUP driver relies on SMBus emulation support from the framework.
> To handle SMBus block reads, the driver should check I2C_M_RECV_LEN flag
> and should read the first byte received as the message length.
>
> The driver configures the QUP hardware to read one byte. Once the message
> length is known from this byte, the QUP hardware is configured to read the
> rest.
>
> Signed-off-by: Naveen Kaje <nkaje@codeaurora.org>
> ---
> drivers/i2c/busses/i2c-qup.c | 95 ++++++++++++++++++++++++++++++-------
> -------
> 1 file changed, 66 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c
index
> ef31b26..2658b67 100644
> --- a/drivers/i2c/busses/i2c-qup.c
> +++ b/drivers/i2c/busses/i2c-qup.c
> @@ -526,38 +526,49 @@ static int qup_i2c_set_tags(u8 *tags, struct
> qup_i2c_dev *qup,
>
> int last = (qup->blk.pos == (qup->blk.count - 1)) && (qup->is_last);
>
> - if (qup->blk.pos == 0) {
> - tags[len++] = QUP_TAG_V2_START;
> - tags[len++] = addr & 0xff;
> + /* Handle SMBus block data read */
> + if ((msg->flags & I2C_M_RD) && (msg->flags & I2C_M_RECV_LEN)
> &&
> + (msg->len > 1)) {
> + tags[len++] = QUP_TAG_V2_DATARD_STOP;
> + data_len = qup_i2c_get_data_len(qup);
> + tags[len++] = data_len - 1;
> + } else {
> + if (qup->blk.pos == 0) {
> + tags[len++] = QUP_TAG_V2_START;
> + tags[len++] = addr & 0xff;
>
> - if (msg->flags & I2C_M_TEN)
> - tags[len++] = addr >> 8;
> - }
> + if (msg->flags & I2C_M_TEN)
> + tags[len++] = addr >> 8;
> + }
>
> - /* Send _STOP commands for the last block */
> - if (last) {
> - if (msg->flags & I2C_M_RD)
> - tags[len++] = QUP_TAG_V2_DATARD_STOP;
> - else
> - tags[len++] = QUP_TAG_V2_DATAWR_STOP;
> - } else {
> - if (msg->flags & I2C_M_RD)
> + /* Send _STOP commands for the last block */
> + if ((msg->flags & I2C_M_RD)
> + && (msg->flags & I2C_M_RECV_LEN)) {
> tags[len++] = QUP_TAG_V2_DATARD;
> - else
> - tags[len++] = QUP_TAG_V2_DATAWR;
> - }
> + } else if (last) {
> + if (msg->flags & I2C_M_RD)
> + tags[len++] = QUP_TAG_V2_DATARD_STOP;
> + else
> + tags[len++] = QUP_TAG_V2_DATAWR_STOP;
> + } else {
> + if (msg->flags & I2C_M_RD)
> + tags[len++] = QUP_TAG_V2_DATARD;
> + else
> + tags[len++] = QUP_TAG_V2_DATAWR;
> + }
>
> - data_len = qup_i2c_get_data_len(qup);
> + data_len = qup_i2c_get_data_len(qup);
>
> - /* 0 implies 256 bytes */
> - if (data_len == QUP_READ_LIMIT)
> - tags[len++] = 0;
> - else
> - tags[len++] = data_len;
> + /* 0 implies 256 bytes */
> + if (data_len == QUP_READ_LIMIT)
> + tags[len++] = 0;
> + else
> + tags[len++] = data_len;
>
> - if ((msg->flags & I2C_M_RD) && last && is_dma) {
> - tags[len++] = QUP_BAM_INPUT_EOT;
> - tags[len++] = QUP_BAM_FLUSH_STOP;
> + if ((msg->flags & I2C_M_RD) && last && is_dma) {
> + tags[len++] = QUP_BAM_INPUT_EOT;
> + tags[len++] = QUP_BAM_FLUSH_STOP;
> + }
> }
>
Will it look simpler if we add a qup_i2c_set_tags_smb instead and add an
Comment ? Here it is not clear how this is different from a normal read.
<snip..>
> +
> + /* Handle SMBus block read length */
> + if ((msg->flags & I2C_M_RECV_LEN) && (msg->len == 1)) {
> + if (msg->buf[0] > I2C_SMBUS_BLOCK_MAX) {
> + ret = -EPROTO;
> + goto err;
> + }
> + msg->len += msg->buf[0];
> + qup->pos = 0;
> + qup_i2c_set_read_mode_v2(qup, msg->len);
> + qup_i2c_issue_xfer_v2(qup, msg);
> + ret = qup_i2c_wait_for_complete(qup, msg);
> + if (ret)
> + goto err;
> + qup_i2c_set_blk_data(qup, msg);
> + }
> } while (qup->blk.pos < qup->blk.count);
When v2 mode is not supported this should return an error,
in qup_i2c_xfer for msg->flags & I2C_M_RECV_LEN
Regards,
Sricharan
WARNING: multiple messages have this Message-ID (diff)
From: sricharan@codeaurora.org (Sricharan)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] i2c: qup: support SMBus block read
Date: Tue, 10 May 2016 12:43:21 +0530 [thread overview]
Message-ID: <000b01d1aa8b$7317a300$5946e900$@codeaurora.org> (raw)
In-Reply-To: <1462317959-11632-2-git-send-email-nkaje@codeaurora.org>
+additional lists
> I2C QUP driver relies on SMBus emulation support from the framework.
> To handle SMBus block reads, the driver should check I2C_M_RECV_LEN flag
> and should read the first byte received as the message length.
>
> The driver configures the QUP hardware to read one byte. Once the message
> length is known from this byte, the QUP hardware is configured to read the
> rest.
>
> Signed-off-by: Naveen Kaje <nkaje@codeaurora.org>
> ---
> drivers/i2c/busses/i2c-qup.c | 95 ++++++++++++++++++++++++++++++-------
> -------
> 1 file changed, 66 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c
index
> ef31b26..2658b67 100644
> --- a/drivers/i2c/busses/i2c-qup.c
> +++ b/drivers/i2c/busses/i2c-qup.c
> @@ -526,38 +526,49 @@ static int qup_i2c_set_tags(u8 *tags, struct
> qup_i2c_dev *qup,
>
> int last = (qup->blk.pos == (qup->blk.count - 1)) && (qup->is_last);
>
> - if (qup->blk.pos == 0) {
> - tags[len++] = QUP_TAG_V2_START;
> - tags[len++] = addr & 0xff;
> + /* Handle SMBus block data read */
> + if ((msg->flags & I2C_M_RD) && (msg->flags & I2C_M_RECV_LEN)
> &&
> + (msg->len > 1)) {
> + tags[len++] = QUP_TAG_V2_DATARD_STOP;
> + data_len = qup_i2c_get_data_len(qup);
> + tags[len++] = data_len - 1;
> + } else {
> + if (qup->blk.pos == 0) {
> + tags[len++] = QUP_TAG_V2_START;
> + tags[len++] = addr & 0xff;
>
> - if (msg->flags & I2C_M_TEN)
> - tags[len++] = addr >> 8;
> - }
> + if (msg->flags & I2C_M_TEN)
> + tags[len++] = addr >> 8;
> + }
>
> - /* Send _STOP commands for the last block */
> - if (last) {
> - if (msg->flags & I2C_M_RD)
> - tags[len++] = QUP_TAG_V2_DATARD_STOP;
> - else
> - tags[len++] = QUP_TAG_V2_DATAWR_STOP;
> - } else {
> - if (msg->flags & I2C_M_RD)
> + /* Send _STOP commands for the last block */
> + if ((msg->flags & I2C_M_RD)
> + && (msg->flags & I2C_M_RECV_LEN)) {
> tags[len++] = QUP_TAG_V2_DATARD;
> - else
> - tags[len++] = QUP_TAG_V2_DATAWR;
> - }
> + } else if (last) {
> + if (msg->flags & I2C_M_RD)
> + tags[len++] = QUP_TAG_V2_DATARD_STOP;
> + else
> + tags[len++] = QUP_TAG_V2_DATAWR_STOP;
> + } else {
> + if (msg->flags & I2C_M_RD)
> + tags[len++] = QUP_TAG_V2_DATARD;
> + else
> + tags[len++] = QUP_TAG_V2_DATAWR;
> + }
>
> - data_len = qup_i2c_get_data_len(qup);
> + data_len = qup_i2c_get_data_len(qup);
>
> - /* 0 implies 256 bytes */
> - if (data_len == QUP_READ_LIMIT)
> - tags[len++] = 0;
> - else
> - tags[len++] = data_len;
> + /* 0 implies 256 bytes */
> + if (data_len == QUP_READ_LIMIT)
> + tags[len++] = 0;
> + else
> + tags[len++] = data_len;
>
> - if ((msg->flags & I2C_M_RD) && last && is_dma) {
> - tags[len++] = QUP_BAM_INPUT_EOT;
> - tags[len++] = QUP_BAM_FLUSH_STOP;
> + if ((msg->flags & I2C_M_RD) && last && is_dma) {
> + tags[len++] = QUP_BAM_INPUT_EOT;
> + tags[len++] = QUP_BAM_FLUSH_STOP;
> + }
> }
>
Will it look simpler if we add a qup_i2c_set_tags_smb instead and add an
Comment ? Here it is not clear how this is different from a normal read.
<snip..>
> +
> + /* Handle SMBus block read length */
> + if ((msg->flags & I2C_M_RECV_LEN) && (msg->len == 1)) {
> + if (msg->buf[0] > I2C_SMBUS_BLOCK_MAX) {
> + ret = -EPROTO;
> + goto err;
> + }
> + msg->len += msg->buf[0];
> + qup->pos = 0;
> + qup_i2c_set_read_mode_v2(qup, msg->len);
> + qup_i2c_issue_xfer_v2(qup, msg);
> + ret = qup_i2c_wait_for_complete(qup, msg);
> + if (ret)
> + goto err;
> + qup_i2c_set_blk_data(qup, msg);
> + }
> } while (qup->blk.pos < qup->blk.count);
When v2 mode is not supported this should return an error,
in qup_i2c_xfer for msg->flags & I2C_M_RECV_LEN
Regards,
Sricharan
WARNING: multiple messages have this Message-ID (diff)
From: "Sricharan" <sricharan@codeaurora.org>
To: "'Naveen Kaje'" <nkaje@codeaurora.org>, <wsa@the-dreams.de>,
<linux-i2c@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <rruigrok@codeaurora.org>, <timur@codeaurora.org>,
<cov@codeaurora.org>, "'Andy Gross'" <andy.gross@linaro.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-arm-msm@vger.kernel.org>
Subject: RE: [PATCH 2/2] i2c: qup: support SMBus block read
Date: Tue, 10 May 2016 12:43:21 +0530 [thread overview]
Message-ID: <000b01d1aa8b$7317a300$5946e900$@codeaurora.org> (raw)
In-Reply-To: <1462317959-11632-2-git-send-email-nkaje@codeaurora.org>
+additional lists
> I2C QUP driver relies on SMBus emulation support from the framework.
> To handle SMBus block reads, the driver should check I2C_M_RECV_LEN flag
> and should read the first byte received as the message length.
>
> The driver configures the QUP hardware to read one byte. Once the message
> length is known from this byte, the QUP hardware is configured to read the
> rest.
>
> Signed-off-by: Naveen Kaje <nkaje@codeaurora.org>
> ---
> drivers/i2c/busses/i2c-qup.c | 95 ++++++++++++++++++++++++++++++-------
> -------
> 1 file changed, 66 insertions(+), 29 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c
index
> ef31b26..2658b67 100644
> --- a/drivers/i2c/busses/i2c-qup.c
> +++ b/drivers/i2c/busses/i2c-qup.c
> @@ -526,38 +526,49 @@ static int qup_i2c_set_tags(u8 *tags, struct
> qup_i2c_dev *qup,
>
> int last = (qup->blk.pos == (qup->blk.count - 1)) && (qup->is_last);
>
> - if (qup->blk.pos == 0) {
> - tags[len++] = QUP_TAG_V2_START;
> - tags[len++] = addr & 0xff;
> + /* Handle SMBus block data read */
> + if ((msg->flags & I2C_M_RD) && (msg->flags & I2C_M_RECV_LEN)
> &&
> + (msg->len > 1)) {
> + tags[len++] = QUP_TAG_V2_DATARD_STOP;
> + data_len = qup_i2c_get_data_len(qup);
> + tags[len++] = data_len - 1;
> + } else {
> + if (qup->blk.pos == 0) {
> + tags[len++] = QUP_TAG_V2_START;
> + tags[len++] = addr & 0xff;
>
> - if (msg->flags & I2C_M_TEN)
> - tags[len++] = addr >> 8;
> - }
> + if (msg->flags & I2C_M_TEN)
> + tags[len++] = addr >> 8;
> + }
>
> - /* Send _STOP commands for the last block */
> - if (last) {
> - if (msg->flags & I2C_M_RD)
> - tags[len++] = QUP_TAG_V2_DATARD_STOP;
> - else
> - tags[len++] = QUP_TAG_V2_DATAWR_STOP;
> - } else {
> - if (msg->flags & I2C_M_RD)
> + /* Send _STOP commands for the last block */
> + if ((msg->flags & I2C_M_RD)
> + && (msg->flags & I2C_M_RECV_LEN)) {
> tags[len++] = QUP_TAG_V2_DATARD;
> - else
> - tags[len++] = QUP_TAG_V2_DATAWR;
> - }
> + } else if (last) {
> + if (msg->flags & I2C_M_RD)
> + tags[len++] = QUP_TAG_V2_DATARD_STOP;
> + else
> + tags[len++] = QUP_TAG_V2_DATAWR_STOP;
> + } else {
> + if (msg->flags & I2C_M_RD)
> + tags[len++] = QUP_TAG_V2_DATARD;
> + else
> + tags[len++] = QUP_TAG_V2_DATAWR;
> + }
>
> - data_len = qup_i2c_get_data_len(qup);
> + data_len = qup_i2c_get_data_len(qup);
>
> - /* 0 implies 256 bytes */
> - if (data_len == QUP_READ_LIMIT)
> - tags[len++] = 0;
> - else
> - tags[len++] = data_len;
> + /* 0 implies 256 bytes */
> + if (data_len == QUP_READ_LIMIT)
> + tags[len++] = 0;
> + else
> + tags[len++] = data_len;
>
> - if ((msg->flags & I2C_M_RD) && last && is_dma) {
> - tags[len++] = QUP_BAM_INPUT_EOT;
> - tags[len++] = QUP_BAM_FLUSH_STOP;
> + if ((msg->flags & I2C_M_RD) && last && is_dma) {
> + tags[len++] = QUP_BAM_INPUT_EOT;
> + tags[len++] = QUP_BAM_FLUSH_STOP;
> + }
> }
>
Will it look simpler if we add a qup_i2c_set_tags_smb instead and add an
Comment ? Here it is not clear how this is different from a normal read.
<snip..>
> +
> + /* Handle SMBus block read length */
> + if ((msg->flags & I2C_M_RECV_LEN) && (msg->len == 1)) {
> + if (msg->buf[0] > I2C_SMBUS_BLOCK_MAX) {
> + ret = -EPROTO;
> + goto err;
> + }
> + msg->len += msg->buf[0];
> + qup->pos = 0;
> + qup_i2c_set_read_mode_v2(qup, msg->len);
> + qup_i2c_issue_xfer_v2(qup, msg);
> + ret = qup_i2c_wait_for_complete(qup, msg);
> + if (ret)
> + goto err;
> + qup_i2c_set_blk_data(qup, msg);
> + }
> } while (qup->blk.pos < qup->blk.count);
When v2 mode is not supported this should return an error,
in qup_i2c_xfer for msg->flags & I2C_M_RECV_LEN
Regards,
Sricharan
next prev parent reply other threads:[~2016-05-10 7:13 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-03 23:25 [PATCH 1/2] i2c: qup: add ACPI support Naveen Kaje
2016-05-03 23:25 ` [PATCH 2/2] i2c: qup: support SMBus block read Naveen Kaje
2016-05-10 7:13 ` Sricharan [this message]
2016-05-10 7:13 ` Sricharan
2016-05-10 7:13 ` Sricharan
2016-05-11 22:11 ` Naveen Kaje
2016-05-11 22:11 ` Naveen Kaje
2016-05-10 6:05 ` [PATCH 1/2] i2c: qup: add ACPI support Sricharan
2016-05-10 6:05 ` Sricharan
2016-05-10 6:05 ` Sricharan
2016-05-11 22:09 ` Naveen Kaje
2016-05-11 22:09 ` Naveen Kaje
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='000b01d1aa8b$7317a300$5946e900$@codeaurora.org' \
--to=sricharan@codeaurora.org \
--cc=andy.gross@linaro.org \
--cc=cov@codeaurora.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nkaje@codeaurora.org \
--cc=rruigrok@codeaurora.org \
--cc=timur@codeaurora.org \
--cc=wsa@the-dreams.de \
/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.