Hi Heikki,
On 10/23/2025 5:44 PM, Heikki Krogerus wrote:
On Thu, Oct 23, 2025 at 12:04:44PM +0300, Heikki Krogerus wrote:
On Thu, Oct 23, 2025 at 11:10:20AM +0300, Heikki Krogerus wrote:
Hi,
diff --git a/include/linux/usb/typec_notify.h b/include/linux/usb/typec_notify.h
new file mode 100644
index 000000000000..a3f1f3b3ae47
--- /dev/null
+++ b/include/linux/usb/typec_notify.h
@@ -0,0 +1,17 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef __USB_TYPEC_NOTIFY
+#define __USB_TYPEC_NOTIFY
+
+#include <linux/notifier.h>
+
+enum usb_typec_event {
+ TYPEC_ALTMODE_REGISTERED
+};
Don't you need to know when the altmode is removed?
I noticed that you don't because drm_dp_hpd_bridge_register() is
always resource managed. But I think you could still send an event
also when the altmode is removed already now. That way it does not
need to be separately added if and when it is needed.
Hold on! Every bus has already a notifier chain. That's the one that
we should also use. Sorry for not noticing that earlier.
So let's just export the bus type in this patch - you can then use
bus_register_notifier() in your driver:
diff --git a/drivers/usb/typec/bus.c b/drivers/usb/typec/bus.c
index a884cec9ab7e..65ded9e3cdaa 100644
--- a/drivers/usb/typec/bus.c
+++ b/drivers/usb/typec/bus.c
@@ -547,3 +547,4 @@ const struct bus_type typec_bus = {
.probe = typec_probe,
.remove = typec_remove,
};
+EXPORT_SYMBOL_GPL(typec_bus);
diff --git a/drivers/usb/typec/bus.h b/drivers/usb/typec/bus.h
index 643b8c81786d..af9edb3db9d0 100644
--- a/drivers/usb/typec/bus.h
+++ b/drivers/usb/typec/bus.h
@@ -5,7 +5,6 @@
#include <linux/usb/typec_altmode.h>
-struct bus_type;
struct typec_mux;
struct typec_retimer;
@@ -28,7 +27,6 @@ struct altmode {
#define to_altmode(d) container_of(d, struct altmode, adev)
-extern const struct bus_type typec_bus;
extern const struct device_type typec_altmode_dev_type;
#define is_typec_altmode(_dev_) (_dev_->type == &typec_altmode_dev_type)
diff --git a/include/linux/usb/typec.h b/include/linux/usb/typec.h
index 309251572e2e..c6fd46902fce 100644
--- a/include/linux/usb/typec.h
+++ b/include/linux/usb/typec.h
@@ -20,12 +20,15 @@ struct typec_port;
struct typec_altmode_ops;
struct typec_cable_ops;
+struct bus_type;
struct fwnode_handle;
struct device;
struct usb_power_delivery;
struct usb_power_delivery_desc;
+extern const struct bus_type typec_bus;
+
enum typec_port_type {
TYPEC_PORT_SRC,
TYPEC_PORT_SNK,
Thank you for your detailed explanation. I noticed that there is a
device_register() action in typec_register_altmode(), so we can just take
advantage of this.
Another thing is that we need to distinguish between different devices in the notifier callback, as
typec_register_altmode()/typec_register_partner()/typec_register_plug()/typec_register_cable() may all register
devices. Since the data passed in bus_notify() is struct device *dev, I think we can distinguish them through
`dev->type.name`? We may already have such names, "typec_alternate_mode",
"typec_partner", "typec_plug" in class.c . And then extract these names as macros and put
them in the typec header file.
Or do you have any better ideas? Thank you.
thanks,
--
Best,
Chaoyi