Add some example usage of the device property read methods for DT/ACPI/swnode properties. Co-developed-by: Rob Herring (Arm) <robh@xxxxxxxxxx> Signed-off-by: Rob Herring (Arm) <robh@xxxxxxxxxx> Signed-off-by: Remo Senekowitsch <remo@xxxxxxxxxxx> --- drivers/of/unittest-data/tests-platform.dtsi | 3 ++ samples/rust/rust_driver_platform.rs | 56 +++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/drivers/of/unittest-data/tests-platform.dtsi b/drivers/of/unittest-data/tests-platform.dtsi index 4171f43cf..50a51f38a 100644 --- a/drivers/of/unittest-data/tests-platform.dtsi +++ b/drivers/of/unittest-data/tests-platform.dtsi @@ -37,6 +37,9 @@ dev@100 { test-device@2 { compatible = "test,rust-device"; reg = <0x2>; + + test,u32-prop = <0xdeadbeef>; + test,i16-array = /bits/ 16 <1 2 (-3) (-4)>; }; }; diff --git a/samples/rust/rust_driver_platform.rs b/samples/rust/rust_driver_platform.rs index 8120609e2..ed25a3781 100644 --- a/samples/rust/rust_driver_platform.rs +++ b/samples/rust/rust_driver_platform.rs @@ -2,7 +2,7 @@ //! Rust Platform driver sample. -use kernel::{c_str, of, platform, prelude::*}; +use kernel::{c_str, of, platform, prelude::*, str::CString}; struct SampleDriver { pdev: platform::Device, @@ -28,6 +28,60 @@ fn probe(pdev: &mut platform::Device, info: Option<&Self::IdInfo>) -> Result<Pin dev_info!(pdev.as_ref(), "Probed with info: '{}'.\n", info.0); } + let dev = pdev.as_ref(); + if let Ok(idx) = dev.property_match_string(c_str!("compatible"), c_str!("test,rust-device")) + { + dev_info!(pdev.as_ref(), "matched compatible string idx = {}\n", idx); + } + + if let Ok(str) = dev + .property_read::<CString>(c_str!("compatible")) + .required() + { + dev_info!(pdev.as_ref(), "compatible string = {:?}\n", str); + } + + let prop = dev + .property_read::<bool>(c_str!("test,bool-prop")) + .required()?; + dev_info!(dev, "bool prop is {}\n", prop); + + if dev.property_present(c_str!("test,u32-prop")) { + dev_info!(dev, "'test,u32-prop' is present\n"); + } + + let prop = dev + .property_read::<u32>(c_str!("test,u32-optional-prop")) + .or(0x12); + dev_info!( + dev, + "'test,u32-optional-prop' is {:#x} (default = {:#x})\n", + prop, + 0x12 + ); + + // Missing property without a default will print an error + let _ = dev + .property_read::<u32>(c_str!("test,u32-required-prop")) + .required()?; + + let prop: u32 = dev.property_read(c_str!("test,u32-prop")).required()?; + dev_info!(dev, "'test,u32-prop' is {:#x}\n", prop); + + let prop: [i16; 4] = dev.property_read(c_str!("test,i16-array")).required()?; + dev_info!(dev, "'test,i16-array' is {:?}\n", prop); + dev_info!( + dev, + "'test,i16-array' length is {}\n", + dev.property_count_elem::<u16>(c_str!("test,i16-array")) + .unwrap() + ); + + let prop: KVec<i16> = dev + .property_read_array_vec(c_str!("test,i16-array"), 4)? + .required()?; + dev_info!(dev, "'test,i16-array' is KVec {:?}\n", prop); + let drvdata = KBox::new(Self { pdev: pdev.clone() }, GFP_KERNEL)?; Ok(drvdata.into()) -- 2.49.0