[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