Skip to content

Commit 85475a4

Browse files
senekorjannau
authored andcommitted
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>
1 parent 7c844a1 commit 85475a4

2 files changed

Lines changed: 62 additions & 1 deletion

File tree

drivers/of/unittest-data/tests-platform.dtsi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
test-device@2 {
3838
compatible = "test,rust-device";
3939
reg = <0x2>;
40+
41+
test,u32-prop = <0xdeadbeef>;
42+
test,i16-array = /bits/ 16 <1 2 (-3) (-4)>;
4043
};
4144
};
4245

samples/rust/rust_driver_platform.rs

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22

33
//! Rust Platform driver sample.
44
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+
};
613

714
struct SampleDriver {
815
pdev: ARef<platform::Device>,
@@ -31,12 +38,63 @@ impl platform::Driver for SampleDriver {
3138
dev_info!(pdev.as_ref(), "Probed with info: '{}'.\n", info.0);
3239
}
3340

41+
Self::properties_parse(pdev.as_ref())?;
42+
3443
let drvdata = KBox::new(Self { pdev: pdev.into() }, GFP_KERNEL)?;
3544

3645
Ok(drvdata.into())
3746
}
3847
}
3948

49+
impl SampleDriver {
50+
fn properties_parse(dev: &device::Device) -> Result {
51+
let fwnode = dev.fwnode().ok_or(ENOENT)?;
52+
53+
if let Ok(idx) =
54+
fwnode.property_match_string(c_str!("compatible"), c_str!("test,rust-device"))
55+
{
56+
dev_info!(dev, "matched compatible string idx = {}\n", idx);
57+
}
58+
59+
let name = c_str!("compatible");
60+
let prop = fwnode.property_read::<CString>(name).required_by(dev)?;
61+
dev_info!(dev, "'{name}'='{prop:?}'\n");
62+
63+
let name = c_str!("test,bool-prop");
64+
let prop = fwnode.property_read_bool(c_str!("test,bool-prop"));
65+
dev_info!(dev, "'{name}'='{prop}'\n");
66+
67+
if fwnode.property_present(c_str!("test,u32-prop")) {
68+
dev_info!(dev, "'test,u32-prop' is present\n");
69+
}
70+
71+
let name = c_str!("test,u32-optional-prop");
72+
let prop = fwnode.property_read::<u32>(name).or(0x12);
73+
dev_info!(dev, "'{name}'='{prop:#x}' (default = 0x12)\n",);
74+
75+
// A missing required property will print an error. Discard the error to
76+
// prevent properties_parse from failing in that case.
77+
let name = c_str!("test,u32-required-prop");
78+
let _ = fwnode.property_read::<u32>(name).required_by(dev);
79+
80+
let name = c_str!("test,u32-prop");
81+
let prop: u32 = fwnode.property_read(name).required_by(dev)?;
82+
dev_info!(dev, "'{name}'='{prop:#x}'\n");
83+
84+
let name = c_str!("test,i16-array");
85+
let prop: [i16; 4] = fwnode.property_read(name).required_by(dev)?;
86+
dev_info!(dev, "'{name}'='{prop:?}'\n");
87+
let len = fwnode.property_count_elem::<u16>(name)?;
88+
dev_info!(dev, "'{name}' length is {len}\n",);
89+
90+
let name = c_str!("test,i16-array");
91+
let prop: KVec<i16> = fwnode.property_read_array_vec(name, 4)?.required_by(dev)?;
92+
dev_info!(dev, "'{name}'='{prop:?}' (KVec)\n");
93+
94+
Ok(())
95+
}
96+
}
97+
4098
impl Drop for SampleDriver {
4199
fn drop(&mut self) {
42100
dev_dbg!(self.pdev.as_ref(), "Remove Rust Platform driver sample.\n");

0 commit comments

Comments
 (0)