All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] w1: use match() callback instead of hardwiring dev->driver
@ 2026-08-20 22:54 Danilo Krummrich
  2026-08-20 22:54 ` [PATCH 2/3] w1: move slave uevent into w1_slave_device_type Danilo Krummrich
  2026-08-20 22:54 ` [PATCH 3/3] w1: stop using struct device template for master devices Danilo Krummrich
  0 siblings, 2 replies; 3+ messages in thread
From: Danilo Krummrich @ 2026-08-20 22:54 UTC (permalink / raw)
  To: krzk; +Cc: driver-core, linux-kernel, Danilo Krummrich

w1 hardwires dev->driver before calling device_register(), relying on
the if (dev->driver) special case in __device_attach() to call
device_bind_driver() and skip normal matching. This is a legacy pattern
that should be replaced with proper match() logic.

Add device types for master and slave devices and implement a w1_match()
callback that routes each device type to its corresponding driver. This
lets the driver core bind w1 devices through the normal
__device_attach_driver() path.

Link: https://lore.kernel.org/driver-core/DKU2J83B6IX6.2CG1WOB66WC39@kernel.org/
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
---
Compile-tested only, no hardware available.
---
 drivers/w1/w1.c | 37 +++++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c
index 486f321eadc8..faa1c03f4807 100644
--- a/drivers/w1/w1.c
+++ b/drivers/w1/w1.c
@@ -58,11 +58,6 @@ MODULE_PARM_DESC(slave_ttl,
 DEFINE_MUTEX(w1_mlock);
 LIST_HEAD(w1_masters);
 
-static int w1_master_probe(struct device *dev)
-{
-	return -ENODEV;
-}
-
 static void w1_master_release(struct device *dev)
 {
 	struct w1_master *md = dev_to_w1_master(dev);
@@ -165,24 +160,42 @@ static struct w1_family w1_default_family = {
 	.fops = &w1_default_fops,
 };
 
+static const struct device_type w1_master_device_type = {
+	.name = "w1_master",
+};
+
+static const struct device_type w1_slave_device_type = {
+	.name = "w1_slave",
+};
+
 static int w1_uevent(const struct device *dev, struct kobj_uevent_env *env);
+static struct device_driver w1_slave_driver;
+
+static int w1_match(struct device *dev, const struct device_driver *drv)
+{
+	if (dev->type == &w1_master_device_type)
+		return drv == &w1_master_driver;
+	if (dev->type == &w1_slave_device_type)
+		return drv == &w1_slave_driver;
+	return 0;
+}
 
 static const struct bus_type w1_bus_type = {
 	.name = "w1",
+	.match = w1_match,
 	.uevent = w1_uevent,
 };
 
 struct device_driver w1_master_driver = {
 	.name = "w1_master_driver",
 	.bus = &w1_bus_type,
-	.probe = w1_master_probe,
 };
 
 struct device w1_master_device = {
 	.parent = NULL,
 	.bus = &w1_bus_type,
+	.type = &w1_master_device_type,
 	.init_name = "w1 bus master",
-	.driver = &w1_master_driver,
 	.release = &w1_master_release
 };
 
@@ -195,8 +208,8 @@ static struct device_driver w1_slave_driver = {
 struct device w1_slave_device = {
 	.parent = NULL,
 	.bus = &w1_bus_type,
+	.type = &w1_slave_device_type,
 	.init_name = "w1 bus slave",
-	.driver = &w1_slave_driver,
 	.release = &w1_slave_release
 };
 #endif  /*  0  */
@@ -574,11 +587,11 @@ static int w1_uevent(const struct device *dev, struct kobj_uevent_env *env)
 	const char *event_owner, *name;
 	int err = 0;
 
-	if (dev->driver == &w1_master_driver) {
+	if (dev->type == &w1_master_device_type) {
 		md = container_of(dev, struct w1_master, dev);
 		event_owner = "master";
 		name = md->name;
-	} else if (dev->driver == &w1_slave_driver) {
+	} else if (dev->type == &w1_slave_device_type) {
 		sl = container_of(dev, struct w1_slave, dev);
 		event_owner = "slave";
 		name = sl->name;
@@ -590,7 +603,7 @@ static int w1_uevent(const struct device *dev, struct kobj_uevent_env *env)
 	dev_dbg(dev, "Hotplug event for %s %s, bus_id=%s.\n",
 			event_owner, name, dev_name(dev));
 
-	if (dev->driver != &w1_slave_driver || !sl)
+	if (dev->type != &w1_slave_device_type || !sl)
 		goto end;
 
 	err = add_uevent_var(env, "W1_FID=%02X", sl->reg_num.family);
@@ -666,8 +679,8 @@ static int __w1_attach_slave_device(struct w1_slave *sl)
 	int err;
 
 	sl->dev.parent = &sl->master->dev;
-	sl->dev.driver = &w1_slave_driver;
 	sl->dev.bus = &w1_bus_type;
+	sl->dev.type = &w1_slave_device_type;
 	sl->dev.release = &w1_slave_release;
 	sl->dev.groups = w1_slave_groups;
 	sl->dev.of_node = of_find_matching_node(sl->master->dev.of_node,

base-commit: 073e62fd33fe9cec754cb89e60c0ebbab781a50a
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-08-20 22:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-20 22:54 [PATCH 1/3] w1: use match() callback instead of hardwiring dev->driver Danilo Krummrich
2026-08-20 22:54 ` [PATCH 2/3] w1: move slave uevent into w1_slave_device_type Danilo Krummrich
2026-08-20 22:54 ` [PATCH 3/3] w1: stop using struct device template for master devices Danilo Krummrich

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.