All of lore.kernel.org
 help / color / mirror / Atom feed
From: Danilo Krummrich <dakr@kernel.org>
To: Remo Senekowitsch <remo@buenzli.dev>
Cc: "Rob Herring" <robh@kernel.org>,
	"Saravana Kannan" <saravanak@google.com>,
	"Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Benno Lossin" <benno.lossin@proton.me>,
	"Andreas Hindborg" <a.hindborg@kernel.org>,
	"Alice Ryhl" <aliceryhl@google.com>,
	"Trevor Gross" <tmgross@umich.edu>,
	"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
	"Rafael J. Wysocki" <rafael@kernel.org>,
	"Dirk Behme" <dirk.behme@de.bosch.com>,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v4 9/9] samples: rust: platform: Add property read examples
Date: Mon, 12 May 2025 15:54:07 +0200	[thread overview]
Message-ID: <aCH9f35BJ93ebWiB@pollux> (raw)
In-Reply-To: <20250504173154.488519-10-remo@buenzli.dev>

On Sun, May 04, 2025 at 07:31:54PM +0200, Remo Senekowitsch wrote:
> Add some example usage of the device property read methods for
> DT/ACPI/swnode properties.
> 
> 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>
> ---
>  drivers/of/unittest-data/tests-platform.dtsi |  3 +
>  samples/rust/rust_driver_platform.rs         | 71 +++++++++++++++++++-
>  2 files changed, 72 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/of/unittest-data/tests-platform.dtsi b/drivers/of/unittest-data/tests-platform.dtsi
> index 4171f43cf01cc..50a51f38afb60 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 8b42b3cfb363a..a04ff4afb1325 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, device::Core, of, platform, prelude::*, types::ARef};
> +use kernel::{c_str, device::Core, of, platform, prelude::*, str::CString, types::ARef};
>  
>  struct SampleDriver {
>      pdev: ARef<platform::Device>,
> @@ -25,18 +25,85 @@ fn probe(
>          pdev: &platform::Device<Core>,
>          info: Option<&Self::IdInfo>,
>      ) -> Result<Pin<KBox<Self>>> {
> +        let dev = pdev.as_ref();
> +
>          dev_dbg!(pdev.as_ref(), "Probe Rust Platform driver sample.\n");
>  
>          if let Some(info) = info {
> -            dev_info!(pdev.as_ref(), "Probed with info: '{}'.\n", info.0);
> +            dev_info!(dev, "Probed with info: '{}'.\n", info.0);

You switch to use dev here, but not for dev_dbg() above.

>          }
>  
> +        Self::properties_parse(dev)?;

Let's just use pdev.as_ref() here too.

> +
>          let drvdata = KBox::new(Self { pdev: pdev.into() }, GFP_KERNEL)?;
>  
>          Ok(drvdata.into())
>      }
>  }
>  
> +impl SampleDriver {
> +    fn properties_parse(dev: &kernel::device::Device) -> Result<()> {

Please refer to this as &device::Device, i.e. import kernel::device. You should
also be able to just use Result, without the generic.

> +        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);
> +        }
> +
> +        if let Ok(str) = fwnode
> +            .property_read::<CString>(c_str!("compatible"))
> +            .required_by(dev)
> +        {
> +            dev_info!(dev, "compatible string = {:?}\n", str);
> +        }

And else? Why do you ignore a potential error?

> +
> +        let prop = fwnode.property_read_bool(c_str!("test,bool-prop"));
> +        dev_info!(dev, "bool prop is {}\n", prop);

Let's use a consistent style for all those prints, e.g. '$name'='$value'. For
instance:

	let name = c_str!("test,bool-prop");
	let prop = fwnode.property_read_bool(name);
	dev_info!(dev, "'{}'='{}'\n", name, prop);

> +        if fwnode.property_present(c_str!("test,u32-prop")) {
> +            dev_info!(dev, "'test,u32-prop' is present\n");

Given the above, I'd keep this one as it is.

> +        }
> +
> +        let prop = fwnode
> +            .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

Maybe additionally add that you discard the Result intentionally in order to not
make properties_parse() fail in this case.

> +        let _ = fwnode
> +            .property_read::<u32>(c_str!("test,u32-required-prop"))
> +            .required_by(dev);
> +
> +        let prop: u32 = fwnode
> +            .property_read(c_str!("test,u32-prop"))
> +            .required_by(dev)?;
> +        dev_info!(dev, "'test,u32-prop' is {:#x}\n", prop);
> +
> +        let prop: [i16; 4] = fwnode
> +            .property_read(c_str!("test,i16-array"))
> +            .required_by(dev)?;
> +        dev_info!(dev, "'test,i16-array' is {:?}\n", prop);
> +        dev_info!(
> +            dev,
> +            "'test,i16-array' length is {}\n",
> +            fwnode.property_count_elem::<u16>(c_str!("test,i16-array"))?,
> +        );
> +
> +        let prop: KVec<i16> = fwnode
> +            .property_read_array_vec(c_str!("test,i16-array"), 4)?
> +            .required_by(dev)?;
> +        dev_info!(dev, "'test,i16-array' is KVec {:?}\n", prop);
> +
> +        Ok(())
> +    }
> +}
> +
>  impl Drop for SampleDriver {
>      fn drop(&mut self) {
>          dev_dbg!(self.pdev.as_ref(), "Remove Rust Platform driver sample.\n");
> -- 
> 2.49.0
> 

  reply	other threads:[~2025-05-12 13:54 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-04 17:31 [PATCH v4 0/9] More Rust bindings for device property reads Remo Senekowitsch
2025-05-04 17:31 ` [PATCH v4 1/9] rust: device: Create FwNode abstraction for accessing device properties Remo Senekowitsch
2025-05-12 13:59   ` Danilo Krummrich
2025-05-12 14:12   ` Danilo Krummrich
2025-05-04 17:31 ` [PATCH v4 2/9] rust: device: Enable accessing the FwNode of a Device Remo Senekowitsch
2025-05-04 17:31 ` [PATCH v4 3/9] rust: device: Move property_present() to FwNode Remo Senekowitsch
2025-05-12 17:29   ` Rob Herring
2025-05-12 17:44     ` Danilo Krummrich
2025-05-04 17:31 ` [PATCH v4 4/9] rust: device: Enable printing fwnode name and path Remo Senekowitsch
2025-05-04 17:31 ` [PATCH v4 5/9] rust: device: Introduce PropertyGuard Remo Senekowitsch
2025-05-05  5:14   ` Dirk Behme
2025-05-05 13:02     ` Remo Senekowitsch
2025-05-05 15:37       ` Rob Herring
2025-05-05 15:53         ` Remo Senekowitsch
2025-05-05 16:12           ` Danilo Krummrich
2025-05-05 18:33           ` Rob Herring
2025-05-12 17:09   ` Rob Herring
2025-05-04 17:31 ` [PATCH v4 6/9] rust: device: Add bindings for reading device properties Remo Senekowitsch
2025-05-12 13:36   ` Danilo Krummrich
2025-05-19 15:43     ` Remo Senekowitsch
2025-05-19 16:55       ` Danilo Krummrich
2025-05-19 19:51         ` Remo Senekowitsch
2025-05-20  7:21           ` Benno Lossin
2025-05-20  7:40             ` Benno Lossin
2025-05-20 10:37               ` Remo Senekowitsch
2025-05-20  7:37   ` Benno Lossin
2025-05-20 10:32     ` Remo Senekowitsch
2025-05-20 11:04       ` Benno Lossin
2025-05-04 17:31 ` [PATCH v4 7/9] rust: device: Add child accessor and iterator Remo Senekowitsch
2025-05-04 17:31 ` [PATCH v4 8/9] rust: device: Add property_get_reference_args Remo Senekowitsch
2025-05-04 17:31 ` [PATCH v4 9/9] samples: rust: platform: Add property read examples Remo Senekowitsch
2025-05-12 13:54   ` Danilo Krummrich [this message]
2025-05-12 11:49 ` [PATCH v4 0/9] More Rust bindings for device property reads Remo Senekowitsch
2025-05-12 12:04   ` Danilo Krummrich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=aCH9f35BJ93ebWiB@pollux \
    --to=dakr@kernel.org \
    --cc=a.hindborg@kernel.org \
    --cc=alex.gaynor@gmail.com \
    --cc=aliceryhl@google.com \
    --cc=benno.lossin@proton.me \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=devicetree@vger.kernel.org \
    --cc=dirk.behme@de.bosch.com \
    --cc=gary@garyguo.net \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ojeda@kernel.org \
    --cc=rafael@kernel.org \
    --cc=remo@buenzli.dev \
    --cc=robh@kernel.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=saravanak@google.com \
    --cc=tmgross@umich.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.