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>
pull/1279/head
Remo Senekowitsch 2025-06-11 12:29:08 +02:00 committed by Danilo Krummrich
parent 2db611374c
commit 2a1ea59de8
2 changed files with 62 additions and 1 deletions

View File

@ -37,6 +37,9 @@
test-device@2 {
compatible = "test,rust-device";
reg = <0x2>;
test,u32-prop = <0xdeadbeef>;
test,i16-array = /bits/ 16 <1 2 (-3) (-4)>;
};
};

View File

@ -2,7 +2,14 @@
//! Rust Platform driver sample.
use kernel::{c_str, device::Core, of, platform, prelude::*, types::ARef};
use kernel::{
c_str,
device::{self, Core},
of, platform,
prelude::*,
str::CString,
types::ARef,
};
struct SampleDriver {
pdev: ARef<platform::Device>,
@ -31,12 +38,63 @@ impl platform::Driver for SampleDriver {
dev_info!(pdev.as_ref(), "Probed with info: '{}'.\n", info.0);
}
Self::properties_parse(pdev.as_ref())?;
let drvdata = KBox::new(Self { pdev: pdev.into() }, GFP_KERNEL)?;
Ok(drvdata.into())
}
}
impl SampleDriver {
fn properties_parse(dev: &device::Device) -> Result {
let fwnode = dev.fwnode().ok_or(ENOENT)?;
if let Ok(idx) =
fwnode.property_match_string(c_str!("compatible"), c_str!("test,rust-device"))
{
dev_info!(dev, "matched compatible string idx = {}\n", idx);
}
let name = c_str!("compatible");
let prop = fwnode.property_read::<CString>(name).required_by(dev)?;
dev_info!(dev, "'{name}'='{prop:?}'\n");
let name = c_str!("test,bool-prop");
let prop = fwnode.property_read_bool(c_str!("test,bool-prop"));
dev_info!(dev, "'{name}'='{prop}'\n");
if fwnode.property_present(c_str!("test,u32-prop")) {
dev_info!(dev, "'test,u32-prop' is present\n");
}
let name = c_str!("test,u32-optional-prop");
let prop = fwnode.property_read::<u32>(name).or(0x12);
dev_info!(dev, "'{name}'='{prop:#x}' (default = 0x12)\n",);
// A missing required property will print an error. Discard the error to
// prevent properties_parse from failing in that case.
let name = c_str!("test,u32-required-prop");
let _ = fwnode.property_read::<u32>(name).required_by(dev);
let name = c_str!("test,u32-prop");
let prop: u32 = fwnode.property_read(name).required_by(dev)?;
dev_info!(dev, "'{name}'='{prop:#x}'\n");
let name = c_str!("test,i16-array");
let prop: [i16; 4] = fwnode.property_read(name).required_by(dev)?;
dev_info!(dev, "'{name}'='{prop:?}'\n");
let len = fwnode.property_count_elem::<u16>(name)?;
dev_info!(dev, "'{name}' length is {len}\n",);
let name = c_str!("test,i16-array");
let prop: KVec<i16> = fwnode.property_read_array_vec(name, 4)?.required_by(dev)?;
dev_info!(dev, "'{name}'='{prop:?}' (KVec)\n");
Ok(())
}
}
impl Drop for SampleDriver {
fn drop(&mut self) {
dev_dbg!(self.pdev.as_ref(), "Remove Rust Platform driver sample.\n");