[PATCH v8 2/9] rust: device: Enable accessing the FwNode of a Device

From: Remo Senekowitsch
Date: Wed Jun 11 2025 - 06:30:12 EST


Subsequent patches will add methods for reading properties to FwNode.
The first step to accessing these methods will be to access the "root"
FwNode of a Device.

Add the method `fwnode` to `Device`.

Tested-by: Dirk Behme <dirk.behme@xxxxxxxxxxxx>
Signed-off-by: Remo Senekowitsch <remo@xxxxxxxxxxx>
---
rust/kernel/device.rs | 15 +++++++++++++++
1 file changed, 15 insertions(+)

diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs
index d6237827a9369..b69f03a7f8d30 100644
--- a/rust/kernel/device.rs
+++ b/rust/kernel/device.rs
@@ -205,6 +205,21 @@ unsafe fn printk(&self, klevel: &[u8], msg: fmt::Arguments<'_>) {
};
}

+ /// Obtain the [`FwNode`](property::FwNode) corresponding to the device.
+ pub fn fwnode(&self) -> Option<&property::FwNode> {
+ // SAFETY: `self` is valid.
+ let fwnode_handle = unsafe { bindings::__dev_fwnode(self.as_raw()) };
+ if fwnode_handle.is_null() {
+ return None;
+ }
+ // SAFETY: `fwnode_handle` is valid. Its lifetime is tied to `&self`. We
+ // return a reference instead of an `ARef<FwNode>` because `dev_fwnode()`
+ // doesn't increment the refcount. It is safe to cast from a
+ // `struct fwnode_handle*` to a `*const FwNode` because `FwNode` is
+ // defined as a `#[repr(transparent)]` wrapper around `fwnode_handle`.
+ Some(unsafe { &*fwnode_handle.cast() })
+ }
+
/// Checks if property is present or not.
pub fn property_present(&self, name: &CStr) -> bool {
// SAFETY: By the invariant of `CStr`, `name` is null-terminated.
--
2.49.0