From: Wolfram Sang <wsa@kernel.org>
To: Alain Volmat <alain.volmat@st.com>
Cc: robh+dt@kernel.org, mark.rutland@arm.com,
pierre-yves.mordret@st.com, mcoquelin.stm32@gmail.com,
alexandre.torgue@st.com, linux-i2c@vger.kernel.org,
devicetree@vger.kernel.org,
linux-stm32@st-md-mailman.stormreply.com,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, fabrice.gasnier@st.com
Subject: Re: [PATCH v2 1/4] i2c: smbus: add core function handling SMBus host-notify
Date: Wed, 1 Jul 2020 12:49:46 +0200 [thread overview]
Message-ID: <20200701104946.GH2261@ninjato> (raw)
In-Reply-To: <1593070769-9106-2-git-send-email-alain.volmat@st.com>
[-- Attachment #1: Type: text/plain, Size: 4192 bytes --]
On Thu, Jun 25, 2020 at 09:39:26AM +0200, Alain Volmat wrote:
> SMBus Host-Notify protocol, from the adapter point of view
> consist of receiving a message from a client, including the
> client address and some other data.
>
> It can be simply handled by creating a new slave device
> and registering a callback performing the parsing of the
> message received from the client.
>
> This commit introduces two new core functions
> * i2c_new_smbus_host_notify_device
> * i2c_free_smbus_host_notify_device
> that take care of registration of the new slave device and
> callback and will call i2c_handle_smbus_host_notify once a
> Host-Notify event is received.
>
> Signed-off-by: Alain Volmat <alain.volmat@st.com>
> ---
> v2: remove useless dev_err message in case of hnotify handling error
> prevent handling hnotify in case of a incomplete write
Okay, now I got it to work, I also noted a few more issues.
First, I'd suggest s/i2c_smbus_host_notify/i2c_slave_host_notify/g for
all occurences in this patch. This makes a stronger distinction between
the generic HostNotify support and the slave specific one.
Also, I wonder if this shouldn't go to i2c-smbus.c instead but I haven't
checked if we end up in dependency hell then. Second best thought: at
least move to i2c-core-slave.c, then we could save the #ifdeffery in the
c-file?
>
> drivers/i2c/i2c-core-smbus.c | 110 +++++++++++++++++++++++++++++++++++++++++++
> include/linux/i2c-smbus.h | 2 +
> 2 files changed, 112 insertions(+)
>
> diff --git a/drivers/i2c/i2c-core-smbus.c b/drivers/i2c/i2c-core-smbus.c
> index 56bb840142e3..3a37664fb5f6 100644
> --- a/drivers/i2c/i2c-core-smbus.c
> +++ b/drivers/i2c/i2c-core-smbus.c
> @@ -708,3 +708,113 @@ int of_i2c_setup_smbus_alert(struct i2c_adapter *adapter)
> }
> EXPORT_SYMBOL_GPL(of_i2c_setup_smbus_alert);
> #endif
> +
> +#if IS_ENABLED(CONFIG_I2C_SLAVE)
> +struct i2c_smbus_host_notify_status {
> + bool notify_start;
> + u8 addr;
> +};
> +
> +static int i2c_smbus_host_notify_cb(struct i2c_client *client,
> + enum i2c_slave_event event, u8 *val)
> +{
> + struct i2c_smbus_host_notify_status *status = client->dev.platform_data;
> + int ret;
> +
> + switch (event) {
> + case I2C_SLAVE_WRITE_REQUESTED:
> + status->notify_start = true;
> + break;
> + case I2C_SLAVE_WRITE_RECEIVED:
> + /* We only retrieve the first byte received (addr)
> + * since there is currently no support to retrieve the data
> + * parameter from the client.
> + */
> + if (!status->notify_start)
> + break;
> + status->addr = *val;
> + status->notify_start = false;
So, we are safe if the message is too short. Otherwise, we capture the
first byte (== address) only, right. Further bytes until STOP are
discarded. So, we don't check if the message is too long and contains
more than the status word. Maybe we should add that?
> + break;
> + case I2C_SLAVE_STOP:
> + /* In case of incomplete write, don't handle host-notify */
> + if (status->notify_start) {
> + status->notify_start = false;
> + break;
> + }
> +
> + ret = i2c_handle_smbus_host_notify(client->adapter,
> + status->addr);
> + if (ret < 0)
> + return ret;
> + break;
> + default:
The missing cases are mandatory. From my testunit driver:
case I2C_SLAVE_READ_REQUESTED:
case I2C_SLAVE_READ_PROCESSED:
*val = 0xff;
break;
> + /* Only handle necessary events */
> + break;
> + }
> +
> + return 0;
> +}
> +
...
> --- a/include/linux/i2c-smbus.h
> +++ b/include/linux/i2c-smbus.h
> @@ -38,6 +38,8 @@ static inline int of_i2c_setup_smbus_alert(struct i2c_adapter *adap)
> return 0;
> }
> #endif
> +struct i2c_client *i2c_new_smbus_host_notify_device(struct i2c_adapter *adapter);
> +void i2c_free_smbus_host_notify_device(struct i2c_client *client);
Those need to be guarded with I2C_SLAVE as well. And an #else branch
with empty/successful placeholders.
>
> #if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_DMI)
> void i2c_register_spd(struct i2c_adapter *adap);
> --
> 2.7.4
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Wolfram Sang <wsa@kernel.org>
To: Alain Volmat <alain.volmat@st.com>
Cc: mark.rutland@arm.com, devicetree@vger.kernel.org,
alexandre.torgue@st.com, linux-kernel@vger.kernel.org,
pierre-yves.mordret@st.com, robh+dt@kernel.org,
linux-i2c@vger.kernel.org, mcoquelin.stm32@gmail.com,
fabrice.gasnier@st.com, linux-stm32@st-md-mailman.stormreply.com,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2 1/4] i2c: smbus: add core function handling SMBus host-notify
Date: Wed, 1 Jul 2020 12:49:46 +0200 [thread overview]
Message-ID: <20200701104946.GH2261@ninjato> (raw)
In-Reply-To: <1593070769-9106-2-git-send-email-alain.volmat@st.com>
[-- Attachment #1.1: Type: text/plain, Size: 4192 bytes --]
On Thu, Jun 25, 2020 at 09:39:26AM +0200, Alain Volmat wrote:
> SMBus Host-Notify protocol, from the adapter point of view
> consist of receiving a message from a client, including the
> client address and some other data.
>
> It can be simply handled by creating a new slave device
> and registering a callback performing the parsing of the
> message received from the client.
>
> This commit introduces two new core functions
> * i2c_new_smbus_host_notify_device
> * i2c_free_smbus_host_notify_device
> that take care of registration of the new slave device and
> callback and will call i2c_handle_smbus_host_notify once a
> Host-Notify event is received.
>
> Signed-off-by: Alain Volmat <alain.volmat@st.com>
> ---
> v2: remove useless dev_err message in case of hnotify handling error
> prevent handling hnotify in case of a incomplete write
Okay, now I got it to work, I also noted a few more issues.
First, I'd suggest s/i2c_smbus_host_notify/i2c_slave_host_notify/g for
all occurences in this patch. This makes a stronger distinction between
the generic HostNotify support and the slave specific one.
Also, I wonder if this shouldn't go to i2c-smbus.c instead but I haven't
checked if we end up in dependency hell then. Second best thought: at
least move to i2c-core-slave.c, then we could save the #ifdeffery in the
c-file?
>
> drivers/i2c/i2c-core-smbus.c | 110 +++++++++++++++++++++++++++++++++++++++++++
> include/linux/i2c-smbus.h | 2 +
> 2 files changed, 112 insertions(+)
>
> diff --git a/drivers/i2c/i2c-core-smbus.c b/drivers/i2c/i2c-core-smbus.c
> index 56bb840142e3..3a37664fb5f6 100644
> --- a/drivers/i2c/i2c-core-smbus.c
> +++ b/drivers/i2c/i2c-core-smbus.c
> @@ -708,3 +708,113 @@ int of_i2c_setup_smbus_alert(struct i2c_adapter *adapter)
> }
> EXPORT_SYMBOL_GPL(of_i2c_setup_smbus_alert);
> #endif
> +
> +#if IS_ENABLED(CONFIG_I2C_SLAVE)
> +struct i2c_smbus_host_notify_status {
> + bool notify_start;
> + u8 addr;
> +};
> +
> +static int i2c_smbus_host_notify_cb(struct i2c_client *client,
> + enum i2c_slave_event event, u8 *val)
> +{
> + struct i2c_smbus_host_notify_status *status = client->dev.platform_data;
> + int ret;
> +
> + switch (event) {
> + case I2C_SLAVE_WRITE_REQUESTED:
> + status->notify_start = true;
> + break;
> + case I2C_SLAVE_WRITE_RECEIVED:
> + /* We only retrieve the first byte received (addr)
> + * since there is currently no support to retrieve the data
> + * parameter from the client.
> + */
> + if (!status->notify_start)
> + break;
> + status->addr = *val;
> + status->notify_start = false;
So, we are safe if the message is too short. Otherwise, we capture the
first byte (== address) only, right. Further bytes until STOP are
discarded. So, we don't check if the message is too long and contains
more than the status word. Maybe we should add that?
> + break;
> + case I2C_SLAVE_STOP:
> + /* In case of incomplete write, don't handle host-notify */
> + if (status->notify_start) {
> + status->notify_start = false;
> + break;
> + }
> +
> + ret = i2c_handle_smbus_host_notify(client->adapter,
> + status->addr);
> + if (ret < 0)
> + return ret;
> + break;
> + default:
The missing cases are mandatory. From my testunit driver:
case I2C_SLAVE_READ_REQUESTED:
case I2C_SLAVE_READ_PROCESSED:
*val = 0xff;
break;
> + /* Only handle necessary events */
> + break;
> + }
> +
> + return 0;
> +}
> +
...
> --- a/include/linux/i2c-smbus.h
> +++ b/include/linux/i2c-smbus.h
> @@ -38,6 +38,8 @@ static inline int of_i2c_setup_smbus_alert(struct i2c_adapter *adap)
> return 0;
> }
> #endif
> +struct i2c_client *i2c_new_smbus_host_notify_device(struct i2c_adapter *adapter);
> +void i2c_free_smbus_host_notify_device(struct i2c_client *client);
Those need to be guarded with I2C_SLAVE as well. And an #else branch
with empty/successful placeholders.
>
> #if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_DMI)
> void i2c_register_spd(struct i2c_adapter *adap);
> --
> 2.7.4
>
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
[-- Attachment #2: Type: text/plain, Size: 176 bytes --]
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2020-07-01 10:49 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-25 7:39 [PATCH v2 0/4] stm32-f7: Addition of SMBus Alert / Host-notify features Alain Volmat
2020-06-25 7:39 ` Alain Volmat
2020-06-25 7:39 ` [PATCH v2 1/4] i2c: smbus: add core function handling SMBus host-notify Alain Volmat
2020-06-25 7:39 ` Alain Volmat
2020-07-01 10:49 ` Wolfram Sang [this message]
2020-07-01 10:49 ` Wolfram Sang
2020-07-02 11:23 ` Alain Volmat
2020-07-02 11:23 ` Alain Volmat
2020-06-25 7:39 ` [PATCH v2 2/4] i2c: addition of client hnotify reg/unreg callbacks Alain Volmat
2020-06-25 7:39 ` Alain Volmat
2020-06-25 7:39 ` [PATCH v2 3/4] dt-bindings: i2c-stm32: add SMBus Alert bindings Alain Volmat
2020-06-25 7:39 ` Alain Volmat
2020-06-30 19:41 ` Wolfram Sang
2020-06-30 19:41 ` Wolfram Sang
2020-07-14 2:30 ` Rob Herring
2020-07-14 2:30 ` Rob Herring
2020-07-21 6:22 ` Wolfram Sang
2020-07-21 6:22 ` Wolfram Sang
2020-06-25 7:39 ` [PATCH v2 4/4] i2c: stm32f7: Add SMBus-specific protocols support Alain Volmat
2020-06-25 7:39 ` Alain Volmat
2020-06-30 16:05 ` [PATCH v2 0/4] stm32-f7: Addition of SMBus Alert / Host-notify features Wolfram Sang
2020-06-30 16:05 ` Wolfram Sang
2020-07-01 9:21 ` Alain Volmat
2020-07-01 9:21 ` Alain Volmat
2020-07-01 9:28 ` Wolfram Sang
2020-07-01 9:28 ` 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=20200701104946.GH2261@ninjato \
--to=wsa@kernel.org \
--cc=alain.volmat@st.com \
--cc=alexandre.torgue@st.com \
--cc=devicetree@vger.kernel.org \
--cc=fabrice.gasnier@st.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-stm32@st-md-mailman.stormreply.com \
--cc=mark.rutland@arm.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=pierre-yves.mordret@st.com \
--cc=robh+dt@kernel.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 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.