Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

samples: rust: platform: Add property read examples

Add some example usage of the device property read methods for
DT/ACPI/swnode properties.

Tested-by: Dirk Behme <dirk.behme@de.bosch.com>
Co-developed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Remo Senekowitsch <remo@buenzli.dev>
Link: https://lore.kernel.org/r/20250611102908.212514-10-remo@buenzli.dev
Signed-off-by: Danilo Krummrich <dakr@kernel.org>

authored by

Remo Senekowitsch and committed by
Danilo Krummrich
2a1ea59d 2db61137

+62 -1
+3
drivers/of/unittest-data/tests-platform.dtsi
··· 37 37 test-device@2 { 38 38 compatible = "test,rust-device"; 39 39 reg = <0x2>; 40 + 41 + test,u32-prop = <0xdeadbeef>; 42 + test,i16-array = /bits/ 16 <1 2 (-3) (-4)>; 40 43 }; 41 44 }; 42 45
+59 -1
samples/rust/rust_driver_platform.rs
··· 2 2 3 3 //! Rust Platform driver sample. 4 4 5 - use kernel::{c_str, device::Core, of, platform, prelude::*, types::ARef}; 5 + use kernel::{ 6 + c_str, 7 + device::{self, Core}, 8 + of, platform, 9 + prelude::*, 10 + str::CString, 11 + types::ARef, 12 + }; 6 13 7 14 struct SampleDriver { 8 15 pdev: ARef<platform::Device>, ··· 38 31 dev_info!(pdev.as_ref(), "Probed with info: '{}'.\n", info.0); 39 32 } 40 33 34 + Self::properties_parse(pdev.as_ref())?; 35 + 41 36 let drvdata = KBox::new(Self { pdev: pdev.into() }, GFP_KERNEL)?; 42 37 43 38 Ok(drvdata.into()) 39 + } 40 + } 41 + 42 + impl SampleDriver { 43 + fn properties_parse(dev: &device::Device) -> Result { 44 + let fwnode = dev.fwnode().ok_or(ENOENT)?; 45 + 46 + if let Ok(idx) = 47 + fwnode.property_match_string(c_str!("compatible"), c_str!("test,rust-device")) 48 + { 49 + dev_info!(dev, "matched compatible string idx = {}\n", idx); 50 + } 51 + 52 + let name = c_str!("compatible"); 53 + let prop = fwnode.property_read::<CString>(name).required_by(dev)?; 54 + dev_info!(dev, "'{name}'='{prop:?}'\n"); 55 + 56 + let name = c_str!("test,bool-prop"); 57 + let prop = fwnode.property_read_bool(c_str!("test,bool-prop")); 58 + dev_info!(dev, "'{name}'='{prop}'\n"); 59 + 60 + if fwnode.property_present(c_str!("test,u32-prop")) { 61 + dev_info!(dev, "'test,u32-prop' is present\n"); 62 + } 63 + 64 + let name = c_str!("test,u32-optional-prop"); 65 + let prop = fwnode.property_read::<u32>(name).or(0x12); 66 + dev_info!(dev, "'{name}'='{prop:#x}' (default = 0x12)\n",); 67 + 68 + // A missing required property will print an error. Discard the error to 69 + // prevent properties_parse from failing in that case. 70 + let name = c_str!("test,u32-required-prop"); 71 + let _ = fwnode.property_read::<u32>(name).required_by(dev); 72 + 73 + let name = c_str!("test,u32-prop"); 74 + let prop: u32 = fwnode.property_read(name).required_by(dev)?; 75 + dev_info!(dev, "'{name}'='{prop:#x}'\n"); 76 + 77 + let name = c_str!("test,i16-array"); 78 + let prop: [i16; 4] = fwnode.property_read(name).required_by(dev)?; 79 + dev_info!(dev, "'{name}'='{prop:?}'\n"); 80 + let len = fwnode.property_count_elem::<u16>(name)?; 81 + dev_info!(dev, "'{name}' length is {len}\n",); 82 + 83 + let name = c_str!("test,i16-array"); 84 + let prop: KVec<i16> = fwnode.property_read_array_vec(name, 4)?.required_by(dev)?; 85 + dev_info!(dev, "'{name}'='{prop:?}' (KVec)\n"); 86 + 87 + Ok(()) 44 88 } 45 89 } 46 90