From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Matt Johnston <matt@codeconstruct.com.au>
Cc: linux-i3c@lists.infradead.org, netdev@vger.kernel.org,
devicetree@vger.kernel.org, Jeremy Kerr <jk@codeconstruct.com.au>,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>
Subject: Re: [PATCH net-next v2 2/3] i3c: Add support for bus enumeration & notification
Date: Wed, 19 Jul 2023 11:10:26 +0200 [thread overview]
Message-ID: <2023071909102651470012@mail.local> (raw)
In-Reply-To: <20230717040638.1292536-3-matt@codeconstruct.com.au>
On 17/07/2023 12:06:37+0800, Matt Johnston wrote:
> From: Jeremy Kerr <jk@codeconstruct.com.au>
>
> This allows other drivers to be notified when new i3c busses are
> attached, referring to a whole i3c bus as opposed to individual
> devices.
>
> Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
> Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> ---
> drivers/i3c/master.c | 35 +++++++++++++++++++++++++++++++++++
> include/linux/i3c/master.h | 11 +++++++++++
> 2 files changed, 46 insertions(+)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 08aeb69a7800..2276abe38bdc 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -22,6 +22,7 @@
> static DEFINE_IDR(i3c_bus_idr);
> static DEFINE_MUTEX(i3c_core_lock);
> static int __i3c_first_dynamic_bus_num;
> +static BLOCKING_NOTIFIER_HEAD(i3c_bus_notifier);
>
> /**
> * i3c_bus_maintenance_lock - Lock the bus for a maintenance operation
> @@ -453,6 +454,36 @@ static int i3c_bus_init(struct i3c_bus *i3cbus, struct device_node *np)
> return 0;
> }
>
> +void i3c_for_each_bus_locked(int (*fn)(struct i3c_bus *bus, void *data),
> + void *data)
> +{
> + struct i3c_bus *bus;
> + int id;
> +
> + mutex_lock(&i3c_core_lock);
> + idr_for_each_entry(&i3c_bus_idr, bus, id)
> + fn(bus, data);
> + mutex_unlock(&i3c_core_lock);
> +}
> +EXPORT_SYMBOL_GPL(i3c_for_each_bus_locked);
> +
> +int i3c_register_notifier(struct notifier_block *nb)
> +{
> + return blocking_notifier_chain_register(&i3c_bus_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(i3c_register_notifier);
> +
> +int i3c_unregister_notifier(struct notifier_block *nb)
> +{
> + return blocking_notifier_chain_unregister(&i3c_bus_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(i3c_unregister_notifier);
> +
> +static void i3c_bus_notify(struct i3c_bus *bus, unsigned int action)
> +{
> + blocking_notifier_call_chain(&i3c_bus_notifier, action, bus);
> +}
> +
> static const char * const i3c_bus_mode_strings[] = {
> [I3C_BUS_MODE_PURE] = "pure",
> [I3C_BUS_MODE_MIXED_FAST] = "mixed-fast",
> @@ -2678,6 +2709,8 @@ int i3c_master_register(struct i3c_master_controller *master,
> if (ret)
> goto err_del_dev;
>
> + i3c_bus_notify(i3cbus, I3C_NOTIFY_BUS_ADD);
> +
> /*
> * We're done initializing the bus and the controller, we can now
> * register I3C devices discovered during the initial DAA.
> @@ -2710,6 +2743,8 @@ EXPORT_SYMBOL_GPL(i3c_master_register);
> */
> void i3c_master_unregister(struct i3c_master_controller *master)
> {
> + i3c_bus_notify(&master->bus, I3C_NOTIFY_BUS_REMOVE);
> +
> i3c_master_i2c_adapter_cleanup(master);
> i3c_master_unregister_i3c_devs(master);
> i3c_master_bus_cleanup(master);
> diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h
> index 0b52da4f2346..db909ef79be4 100644
> --- a/include/linux/i3c/master.h
> +++ b/include/linux/i3c/master.h
> @@ -24,6 +24,12 @@
>
> struct i2c_client;
>
> +/* notifier actions. notifier call data is the struct i3c_bus */
> +enum {
> + I3C_NOTIFY_BUS_ADD,
> + I3C_NOTIFY_BUS_REMOVE,
> +};
> +
> struct i3c_master_controller;
> struct i3c_bus;
> struct i3c_device;
> @@ -652,4 +658,9 @@ void i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot);
>
> struct i3c_ibi_slot *i3c_master_get_free_ibi_slot(struct i3c_dev_desc *dev);
>
> +void i3c_for_each_bus_locked(int (*fn)(struct i3c_bus *bus, void *data),
> + void *data);
> +int i3c_register_notifier(struct notifier_block *nb);
> +int i3c_unregister_notifier(struct notifier_block *nb);
> +
> #endif /* I3C_MASTER_H */
> --
> 2.37.2
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
--
linux-i3c mailing list
linux-i3c@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-i3c
WARNING: multiple messages have this Message-ID (diff)
From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Matt Johnston <matt@codeconstruct.com.au>
Cc: linux-i3c@lists.infradead.org, netdev@vger.kernel.org,
devicetree@vger.kernel.org, Jeremy Kerr <jk@codeconstruct.com.au>,
"David S. Miller" <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Rob Herring <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>
Subject: Re: [PATCH net-next v2 2/3] i3c: Add support for bus enumeration & notification
Date: Wed, 19 Jul 2023 11:10:26 +0200 [thread overview]
Message-ID: <2023071909102651470012@mail.local> (raw)
In-Reply-To: <20230717040638.1292536-3-matt@codeconstruct.com.au>
On 17/07/2023 12:06:37+0800, Matt Johnston wrote:
> From: Jeremy Kerr <jk@codeconstruct.com.au>
>
> This allows other drivers to be notified when new i3c busses are
> attached, referring to a whole i3c bus as opposed to individual
> devices.
>
> Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
> Signed-off-by: Matt Johnston <matt@codeconstruct.com.au>
Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> ---
> drivers/i3c/master.c | 35 +++++++++++++++++++++++++++++++++++
> include/linux/i3c/master.h | 11 +++++++++++
> 2 files changed, 46 insertions(+)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 08aeb69a7800..2276abe38bdc 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -22,6 +22,7 @@
> static DEFINE_IDR(i3c_bus_idr);
> static DEFINE_MUTEX(i3c_core_lock);
> static int __i3c_first_dynamic_bus_num;
> +static BLOCKING_NOTIFIER_HEAD(i3c_bus_notifier);
>
> /**
> * i3c_bus_maintenance_lock - Lock the bus for a maintenance operation
> @@ -453,6 +454,36 @@ static int i3c_bus_init(struct i3c_bus *i3cbus, struct device_node *np)
> return 0;
> }
>
> +void i3c_for_each_bus_locked(int (*fn)(struct i3c_bus *bus, void *data),
> + void *data)
> +{
> + struct i3c_bus *bus;
> + int id;
> +
> + mutex_lock(&i3c_core_lock);
> + idr_for_each_entry(&i3c_bus_idr, bus, id)
> + fn(bus, data);
> + mutex_unlock(&i3c_core_lock);
> +}
> +EXPORT_SYMBOL_GPL(i3c_for_each_bus_locked);
> +
> +int i3c_register_notifier(struct notifier_block *nb)
> +{
> + return blocking_notifier_chain_register(&i3c_bus_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(i3c_register_notifier);
> +
> +int i3c_unregister_notifier(struct notifier_block *nb)
> +{
> + return blocking_notifier_chain_unregister(&i3c_bus_notifier, nb);
> +}
> +EXPORT_SYMBOL_GPL(i3c_unregister_notifier);
> +
> +static void i3c_bus_notify(struct i3c_bus *bus, unsigned int action)
> +{
> + blocking_notifier_call_chain(&i3c_bus_notifier, action, bus);
> +}
> +
> static const char * const i3c_bus_mode_strings[] = {
> [I3C_BUS_MODE_PURE] = "pure",
> [I3C_BUS_MODE_MIXED_FAST] = "mixed-fast",
> @@ -2678,6 +2709,8 @@ int i3c_master_register(struct i3c_master_controller *master,
> if (ret)
> goto err_del_dev;
>
> + i3c_bus_notify(i3cbus, I3C_NOTIFY_BUS_ADD);
> +
> /*
> * We're done initializing the bus and the controller, we can now
> * register I3C devices discovered during the initial DAA.
> @@ -2710,6 +2743,8 @@ EXPORT_SYMBOL_GPL(i3c_master_register);
> */
> void i3c_master_unregister(struct i3c_master_controller *master)
> {
> + i3c_bus_notify(&master->bus, I3C_NOTIFY_BUS_REMOVE);
> +
> i3c_master_i2c_adapter_cleanup(master);
> i3c_master_unregister_i3c_devs(master);
> i3c_master_bus_cleanup(master);
> diff --git a/include/linux/i3c/master.h b/include/linux/i3c/master.h
> index 0b52da4f2346..db909ef79be4 100644
> --- a/include/linux/i3c/master.h
> +++ b/include/linux/i3c/master.h
> @@ -24,6 +24,12 @@
>
> struct i2c_client;
>
> +/* notifier actions. notifier call data is the struct i3c_bus */
> +enum {
> + I3C_NOTIFY_BUS_ADD,
> + I3C_NOTIFY_BUS_REMOVE,
> +};
> +
> struct i3c_master_controller;
> struct i3c_bus;
> struct i3c_device;
> @@ -652,4 +658,9 @@ void i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot);
>
> struct i3c_ibi_slot *i3c_master_get_free_ibi_slot(struct i3c_dev_desc *dev);
>
> +void i3c_for_each_bus_locked(int (*fn)(struct i3c_bus *bus, void *data),
> + void *data);
> +int i3c_register_notifier(struct notifier_block *nb);
> +int i3c_unregister_notifier(struct notifier_block *nb);
> +
> #endif /* I3C_MASTER_H */
> --
> 2.37.2
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2023-07-19 9:10 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-17 4:06 [PATCH net-next v2 0/3] I3C MCTP net driver Matt Johnston
2023-07-17 4:06 ` Matt Johnston
2023-07-17 4:06 ` [PATCH net-next v2 1/3] dt-bindings: i3c: Add mctp-controller property Matt Johnston
2023-07-17 4:06 ` Matt Johnston
2023-07-17 6:19 ` Krzysztof Kozlowski
2023-07-17 6:19 ` Krzysztof Kozlowski
2023-07-19 9:10 ` Alexandre Belloni
2023-07-19 9:10 ` Alexandre Belloni
2023-07-17 4:06 ` [PATCH net-next v2 2/3] i3c: Add support for bus enumeration & notification Matt Johnston
2023-07-17 4:06 ` Matt Johnston
2023-07-19 1:57 ` Jakub Kicinski
2023-07-19 1:57 ` Jakub Kicinski
2023-07-19 9:11 ` Alexandre Belloni
2023-07-19 9:11 ` Alexandre Belloni
2023-07-19 9:10 ` Alexandre Belloni [this message]
2023-07-19 9:10 ` Alexandre Belloni
2023-07-17 4:06 ` [PATCH net-next v2 3/3] mctp i3c: MCTP I3C driver Matt Johnston
2023-07-17 4:06 ` Matt Johnston
2023-07-19 1:54 ` Jakub Kicinski
2023-07-19 1:54 ` Jakub Kicinski
2023-07-19 2:00 ` Jakub Kicinski
2023-07-19 2:00 ` Jakub Kicinski
2023-07-20 17:35 ` Simon Horman
2023-07-20 17:35 ` Simon Horman
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=2023071909102651470012@mail.local \
--to=alexandre.belloni@bootlin.com \
--cc=conor+dt@kernel.org \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=jk@codeconstruct.com.au \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=kuba@kernel.org \
--cc=linux-i3c@lists.infradead.org \
--cc=matt@codeconstruct.com.au \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.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.