From: "Zbigniew, Lukwinski" <zbigniew.lukwinski@linux.intel.com>
To: Frank Li <Frank.Li@nxp.com>, miquel.raynal@bootlin.com
Cc: alexandre.belloni@bootlin.com, conor.culhane@silvaco.com,
imx@lists.linux.dev, joe@perches.com,
linux-i3c@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 1/6] i3c: master: add enable(disable) hot join in sys entry
Date: Fri, 20 Oct 2023 10:55:27 +0200 [thread overview]
Message-ID: <57efe6de-cf65-32ed-fd1e-a388e1676c70@linux.intel.com> (raw)
In-Reply-To: <20231018205929.3435110-2-Frank.Li@nxp.com>
On 10/18/2023 10:59 PM, Frank Li wrote:
> Add hotjoin entry in sys file system allow user enable/disable hotjoin
> feature.
>
> Add (*enable(disable)_hotjoin)() to i3c_master_controller_ops.
> Add api i3c_master_enable(disable)_hotjoin();
What is the use case for having HJ enable knob in sysfs available for
user space other than for debug stuff? In other words, does user space
really need to enable/disable HJ in runtime for other reason but debug?
If it is only for debug maybe it could be move to debugFS?
I think that maybe HJ enable knob shall be available in DT so you could
control the default state for this feature also at compilation phase?
> Signed-off-by: Frank Li <Frank.Li@nxp.com>
> ---
> drivers/i3c/master.c | 84 ++++++++++++++++++++++++++++++++++++++
> include/linux/i3c/master.h | 5 +++
> 2 files changed, 89 insertions(+)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 08aeb69a78003..ed5e27cd20811 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -526,6 +526,89 @@ static ssize_t i2c_scl_frequency_show(struct device *dev,
> }
> static DEVICE_ATTR_RO(i2c_scl_frequency);
>
> +static int i3c_set_hotjoin(struct i3c_master_controller *master, bool enable)
> +{
> + int ret;
> +
> + if (!master ||
> + !master->ops ||
> + !master->ops->enable_hotjoin ||
> + !master->ops->disable_hotjoin
> + )
> + return -EINVAL;
> +
> + i3c_bus_normaluse_lock(&master->bus);
> +
> + if (enable)
> + ret = master->ops->enable_hotjoin(master);
> + else
> + ret = master->ops->disable_hotjoin(master);
> +
> + master->hotjoin = enable;
> +
> + i3c_bus_normaluse_unlock(&master->bus);
> +
> + return ret;
> +}
> +
> +static ssize_t hotjoin_store(struct device *dev, struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + struct i3c_bus *i3cbus = dev_to_i3cbus(dev);
> + int ret;
> + long res;
> +
> + if (!i3cbus->cur_master)
> + return -EINVAL;
> +
> + if (kstrtol(buf, 10, &res))
> + return -EINVAL;
> +
> + ret = i3c_set_hotjoin(i3cbus->cur_master->common.master, !!res);
> + if (ret)
> + return ret;
> +
> + return count;
> +}
> +
> +/*
> + * i3c_master_enable_hotjoin - Enable hotjoin
> + * @master: I3C master object
> + *
> + * Return: a 0 in case of success, an negative error code otherwise.
> + */
> +int i3c_master_enable_hotjoin(struct i3c_master_controller *master)
> +{
> + return i3c_set_hotjoin(master, true);
> +}
> +EXPORT_SYMBOL_GPL(i3c_master_enable_hotjoin);
> +
> +/*
> + * i3c_master_disable_hotjoin - Disable hotjoin
> + * @master: I3C master object
> + *
> + * Return: a 0 in case of success, an negative error code otherwise.
> + */
> +int i3c_master_disable_hotjoin(struct i3c_master_controller *master)
> +{
> + return i3c_set_hotjoin(master, false);
> +}
> +EXPORT_SYMBOL_GPL(i3c_master_disable_hotjoin);
> +
> +static ssize_t hotjoin_show(struct device *dev, struct device_attribute *da, char *buf)
> +{
> + struct i3c_bus *i3cbus = dev_to_i3cbus(dev);
> + ssize_t ret;
> +
> + i3c_bus_normaluse_lock(i3cbus);
> + ret = sysfs_emit(buf, "%d\n", i3cbus->cur_master->common.master->hotjoin);
> + i3c_bus_normaluse_unlock(i3cbus);
> +
> + return ret;
> +}
> +
> +static DEVICE_ATTR_RW(hotjoin);
> +
> static struct attribute *i3c_masterdev_attrs[] = {
> &dev_attr_mode.attr,
> &dev_attr_current_master.attr,
> @@ -536,6 +619,7 @@ static struct attribute *i3c_masterdev_attrs[] = {
> &dev_attr_pid.attr,
> &dev_attr_dynamic_address.attr,
> &dev_attr_hdrcap.attr,
> + &dev_attr_hotjoin.attr,
> NULL,
> };
> ATTRIBUTE_GROUPS(i3c_masterdev);
> diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h
> index 0b52da4f23467..65b8965968af2 100644
> --- a/include/linux/i3c/master.h
> +++ b/include/linux/i3c/master.h
> @@ -452,6 +452,8 @@ struct i3c_master_controller_ops {
> int (*disable_ibi)(struct i3c_dev_desc *dev);
> void (*recycle_ibi_slot)(struct i3c_dev_desc *dev,
> struct i3c_ibi_slot *slot);
> + int (*enable_hotjoin)(struct i3c_master_controller *master);
> + int (*disable_hotjoin)(struct i3c_master_controller *master);
> };
>
> /**
> @@ -487,6 +489,7 @@ struct i3c_master_controller {
> const struct i3c_master_controller_ops *ops;
> unsigned int secondary : 1;
> unsigned int init_done : 1;
> + unsigned int hotjoin: 1;
> struct {
> struct list_head i3c;
> struct list_head i2c;
> @@ -543,6 +546,8 @@ int i3c_master_register(struct i3c_master_controller *master,
> const struct i3c_master_controller_ops *ops,
> bool secondary);
> void i3c_master_unregister(struct i3c_master_controller *master);
> +int i3c_master_enable_hotjoin(struct i3c_master_controller *master);
> +int i3c_master_disable_hotjoin(struct i3c_master_controller *master);
>
> /**
> * i3c_dev_get_master_data() - get master private data attached to an I3C
next prev parent reply other threads:[~2023-10-20 8:55 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-18 20:59 [PATCH v2 0/6] i3c: master: some improvment for i3c master Frank Li
2023-10-18 20:59 ` [PATCH v2 1/6] i3c: master: add enable(disable) hot join in sys entry Frank Li
2023-10-20 8:55 ` Zbigniew, Lukwinski [this message]
2023-10-20 13:45 ` Miquel Raynal
2023-10-20 14:20 ` Frank Li
2023-10-20 14:33 ` Miquel Raynal
2023-10-20 16:24 ` Frank Li
[not found] ` <8a7ac52e-f102-6f5e-35ab-217e6ecc6ba5@linux.intel.com>
2023-10-20 20:25 ` Alexandre Belloni
2023-10-20 20:36 ` Frank Li
2023-10-20 20:42 ` Zbigniew, Lukwinski
2023-11-05 15:36 ` Frank Li
2023-10-18 20:59 ` [PATCH v2 2/6] i3c: master: svc: add hot join support Frank Li
2023-10-19 1:23 ` kernel test robot
2023-10-18 20:59 ` [PATCH v2 3/6] i3c: add actual_len in i3c_priv_xfer Frank Li
2023-10-18 20:59 ` [PATCH v2 4/6] i3c: svc: rename read_len as actual_len Frank Li
2023-10-18 20:59 ` [PATCH v2 5/6] i3c: master: svc return actual transfer data len Frank Li
2023-10-18 20:59 ` [PATCH v2 6/6] i3c: add API i3c_dev_gettstatus_format1() to get target device status Frank Li
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=57efe6de-cf65-32ed-fd1e-a388e1676c70@linux.intel.com \
--to=zbigniew.lukwinski@linux.intel.com \
--cc=Frank.Li@nxp.com \
--cc=alexandre.belloni@bootlin.com \
--cc=conor.culhane@silvaco.com \
--cc=imx@lists.linux.dev \
--cc=joe@perches.com \
--cc=linux-i3c@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miquel.raynal@bootlin.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