diff options
| author | Remo Senekowitsch <remo@buenzli.dev> | 2025-06-16 17:45:11 +0200 |
|---|---|---|
| committer | Danilo Krummrich <dakr@kernel.org> | 2025-06-25 17:48:41 +0200 |
| commit | c79cbde9b7bc7a650af96269588518950e3c2441 (patch) | |
| tree | 92da49bc9289a3a8dc64f7687ef2de9af4d6910f | |
| parent | rust: device: Add property_get_reference_args (diff) | |
| download | linux-c79cbde9b7bc7a650af96269588518950e3c2441.tar.gz linux-c79cbde9b7bc7a650af96269588518950e3c2441.zip | |
samples: rust: platform: Add property child and reference args examples
Add some example usage of the device property methods for reading
DT/ACPI/swnode child nodes and reference args.
Signed-off-by: Remo Senekowitsch <remo@buenzli.dev>
Link: https://lore.kernel.org/r/20250616154511.1862909-4-remo@buenzli.dev
[ Convert 'child@{0,1}' to 'child-{0,1}'; skip child nodes without
'compatible' property in of_unittest_platform_populate() as proposed
by Rob Herring. - Danilo]
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
| -rw-r--r-- | drivers/of/unittest-data/tests-platform.dtsi | 7 | ||||
| -rw-r--r-- | drivers/of/unittest.c | 2 | ||||
| -rw-r--r-- | samples/rust/rust_driver_platform.rs | 13 |
3 files changed, 21 insertions, 1 deletions
diff --git a/drivers/of/unittest-data/tests-platform.dtsi b/drivers/of/unittest-data/tests-platform.dtsi index 50a51f38afb6..59aa2a9731a7 100644 --- a/drivers/of/unittest-data/tests-platform.dtsi +++ b/drivers/of/unittest-data/tests-platform.dtsi @@ -40,6 +40,13 @@ test,u32-prop = <0xdeadbeef>; test,i16-array = /bits/ 16 <1 2 (-3) (-4)>; + + ref_child_0: child-0 { + test,ref-arg = <&ref_child_1 0x20 0x32>; + }; + ref_child_1: child-1 { + test,ref-arg = <&ref_child_0 0x10 0x64>; + }; }; }; diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c index eeb370e0f507..e3503ec20f6c 100644 --- a/drivers/of/unittest.c +++ b/drivers/of/unittest.c @@ -1856,6 +1856,8 @@ static void __init of_unittest_platform_populate(void) of_platform_populate(np, match, NULL, &test_bus->dev); for_each_child_of_node(np, child) { for_each_child_of_node(child, grandchild) { + if (!of_property_present(grandchild, "compatible")) + continue; pdev = of_find_device_by_node(grandchild); unittest(pdev, "Could not create device for node '%pOFn'\n", diff --git a/samples/rust/rust_driver_platform.rs b/samples/rust/rust_driver_platform.rs index c0abf78d0683..4dcedb22a4bb 100644 --- a/samples/rust/rust_driver_platform.rs +++ b/samples/rust/rust_driver_platform.rs @@ -4,7 +4,11 @@ use kernel::{ c_str, - device::{self, Core}, + device::{ + self, + property::{FwNodeReferenceArgs, NArgs}, + Core, + }, of, platform, prelude::*, str::CString, @@ -91,6 +95,13 @@ impl SampleDriver { let prop: KVec<i16> = fwnode.property_read_array_vec(name, 4)?.required_by(dev)?; dev_info!(dev, "'{name}'='{prop:?}' (KVec)\n"); + for child in fwnode.children() { + let name = c_str!("test,ref-arg"); + let nargs = NArgs::N(2); + let prop: FwNodeReferenceArgs = child.property_get_reference_args(name, nargs, 0)?; + dev_info!(dev, "'{name}'='{prop:?}'\n"); + } + Ok(()) } } |
