[RFC PATCH 10/15] dm: core: Add uclass-ID-keyed accessors for priv and plat

Simon Glass sjg at chromium.org
Thu Mar 19 22:35:40 CET 2026


Add device_get_uclass_priv_by_id() and device_get_uclass_plat_by_id()
which search both primary and adjunct memberships for the matching
uclass ID. This allows subsystem code to retrieve the correct
per-device uclass data regardless of whether the device was found
via its primary uclass or an adjunct.

When DM_UC_ADJUNCT is disabled, these map to dev_get_uclass_priv()
and dev_get_uclass_plat() respectively, with no overhead.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 drivers/core/adjunct.c | 23 +++++++++++++++++++++++
 drivers/core/device.c  | 16 ++++------------
 include/dm/device.h    | 34 ++++++++++++++++++++++++++++++++++
 3 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/drivers/core/adjunct.c b/drivers/core/adjunct.c
index 07fd0917050..802d2761e6b 100644
--- a/drivers/core/adjunct.c
+++ b/drivers/core/adjunct.c
@@ -76,6 +76,19 @@ int device_add_uclass_adj(struct udevice *dev, enum uclass_id id,
 	return ret;
 }
 
+const void *device_get_uclass_ops(struct udevice *dev, enum uclass_id id)
+{
+	struct uclass_member *ucm;
+
+	/* Walk primary + adjunct memberships for matching uclass */
+	list_for_each_entry(ucm, &dev->adj_head, adj_node) {
+		if (ucm->uc->uc_drv->id == id)
+			return ucm->ops;
+	}
+
+	return NULL;
+}
+
 void *device_get_adj_uclass_priv(struct udevice *dev, enum uclass_id id)
 {
 	struct uclass_member *ucm;
@@ -127,6 +140,16 @@ int ucm_alloc_priv(struct uclass_member *ucm)
 	return 0;
 }
 
+void *device_get_uclass_priv(struct udevice *dev, enum uclass_id id)
+{
+	return device_get_adj_uclass_priv(dev, id);
+}
+
+void *device_get_uclass_plat(struct udevice *dev, enum uclass_id id)
+{
+	return device_get_adj_uclass_plat(dev, id);
+}
+
 int device_probe_adjs_(struct udevice *dev)
 {
 	struct uclass_driver *uc_drv;
diff --git a/drivers/core/device.c b/drivers/core/device.c
index ba3c5b9a28e..2b7b3528e4c 100644
--- a/drivers/core/device.c
+++ b/drivers/core/device.c
@@ -1193,23 +1193,15 @@ void dev_int_set_seq(struct udevice *dev, int seq)
 	dev->ucm.seq = seq;
 }
 
+#if !CONFIG_IS_ENABLED(DM_UC_ADJUNCT)
 const void *device_get_uclass_ops(struct udevice *dev, enum uclass_id id)
 {
-	if (CONFIG_IS_ENABLED(DM_UC_ADJUNCT)) {
-		struct uclass_member *ucm;
-
-		/* Walk primary + adjunct memberships for matching uclass */
-		list_for_each_entry(ucm, &dev->adj_head, adj_node) {
-			if (ucm->uc->uc_drv->id == id)
-				return ucm->ops;
-		}
-	} else {
-		if (dev->ucm.uc->uc_drv->id == id)
-			return dev->driver->ops;
-	}
+	if (dev->ucm.uc->uc_drv->id == id)
+		return dev->driver->ops;
 
 	return NULL;
 }
+#endif
 
 #if CONFIG_IS_ENABLED(OF_REAL)
 bool device_is_compatible(const struct udevice *dev, const char *compat)
diff --git a/include/dm/device.h b/include/dm/device.h
index 2a78911b942..d93690d7a8b 100644
--- a/include/dm/device.h
+++ b/include/dm/device.h
@@ -462,6 +462,40 @@ static inline int device_add_uclass_adj(struct udevice *dev,
 }
 #endif
 
+/**
+ * device_get_uclass_priv() - Get uclass private data by uclass ID
+ *
+ * Return the per-device uclass private data for the given uclass ID,
+ * searching both primary and adjunct memberships. When DM_UC_ADJUNCT is
+ * not enabled, this simply returns the primary uclass private data.
+ *
+ * @dev: Device to query
+ * @id: Uclass ID to look up private data for
+ * Return: private data pointer, or NULL if not found
+ */
+#if CONFIG_IS_ENABLED(DM_UC_ADJUNCT)
+void *device_get_uclass_priv(struct udevice *dev, enum uclass_id id);
+#else
+#define device_get_uclass_priv(dev, id)	dev_get_uclass_priv(dev)
+#endif
+
+/**
+ * device_get_uclass_plat() - Get uclass platform data by uclass ID
+ *
+ * Return the per-device uclass platform data for the given uclass ID,
+ * searching both primary and adjunct memberships. When DM_UC_ADJUNCT is
+ * not enabled, this simply returns the primary uclass platform data.
+ *
+ * @dev: Device to query
+ * @id: Uclass ID to look up platform data for
+ * Return: platform data pointer, or NULL if not found
+ */
+#if CONFIG_IS_ENABLED(DM_UC_ADJUNCT)
+void *device_get_uclass_plat(struct udevice *dev, enum uclass_id id);
+#else
+#define device_get_uclass_plat(dev, id)	dev_get_uclass_plat(dev)
+#endif
+
 /**
  * U_BOOT_DRIVER() - Declare a new U-Boot driver
  * @__name: name of the driver
-- 
2.43.0



More information about the U-Boot mailing list