History

samples: rust: platform: Add property read examples

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

Remo Senekowitsch committed 1 year ago

Commit 2a1ea591 parent 2db61132 files · +62 −1Browse files

Unified · Split

2 files
  1. drivers/of/unittest-data/tests-platform.dtsi +3 −0
  2. samples/rust/rust_driver_platform.rs +59 −1
drivers/of/unittest-data/tests-platform.dtsi+3−0
@@ -37,6 +37,9 @@ · 36 unmodified lines
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+59−1
@@ -2,7 +2,14 @@ · 1 unmodified line
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 { · 22 unmodified lines
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");

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t