]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
samples: rust: add Rust platform sample driver
authorDanilo Krummrich <dakr@kernel.org>
Thu, 19 Dec 2024 17:04:17 +0000 (18:04 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 20 Dec 2024 16:43:02 +0000 (17:43 +0100)
Add a sample Rust platform driver illustrating the usage of the platform
bus abstractions.

This driver probes through either a match of device / driver name or a
match within the OF ID table.

Reviewed-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Tested-by: Dirk Behme <dirk.behme@de.bosch.com>
Tested-by: Fabien Parent <fabien.parent@linaro.org>
Link: https://lore.kernel.org/r/20241219170425.12036-16-dakr@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
MAINTAINERS
drivers/of/unittest-data/tests-platform.dtsi
samples/rust/Kconfig
samples/rust/Makefile
samples/rust/rust_driver_platform.rs [new file with mode: 0644]

index 0da80deb14b5861ec23c7755a2fed6f1bbc93c69..c9673877f7f8875e74636b856664fa287acf660d 100644 (file)
@@ -7038,6 +7038,7 @@ F:        rust/kernel/device_id.rs
 F:     rust/kernel/devres.rs
 F:     rust/kernel/driver.rs
 F:     rust/kernel/platform.rs
+F:     samples/rust/rust_driver_platform.rs
 
 DRIVERS FOR OMAP ADAPTIVE VOLTAGE SCALING (AVS)
 M:     Nishanth Menon <nm@ti.com>
index fa39611071b32f44fcc9bd3b4916006bfab57828..2caaf1c10ee6f86dedfdc250bdebb655fe1ffe46 100644 (file)
                                        reg = <0x100>;
                                };
                        };
+
+                       test-device@2 {
+                               compatible = "test,rust-device";
+                               reg = <0x2>;
+                       };
                };
        };
 };
index 002af98e70be8b0bd61d353cf5800dc2c04d3bb7..918dbead2c0b4d2bda1aac0eff342b9e3654688d 100644 (file)
@@ -51,6 +51,16 @@ config SAMPLE_RUST_DRIVER_PCI
 
          If unsure, say N.
 
+config SAMPLE_RUST_DRIVER_PLATFORM
+       tristate "Platform Driver"
+       help
+         This option builds the Rust Platform driver sample.
+
+         To compile this as a module, choose M here:
+         the module will be called rust_driver_platform.
+
+         If unsure, say N.
+
 config SAMPLE_RUST_HOSTPROGS
        bool "Host programs"
        help
index b4581473ca1b9211913868d6652b10d3dc0dea1d..5a8ab0df0567cb3f5acc92b7e927b61087c5834a 100644 (file)
@@ -5,6 +5,7 @@ obj-$(CONFIG_SAMPLE_RUST_MINIMAL)               += rust_minimal.o
 obj-$(CONFIG_SAMPLE_RUST_MISC_DEVICE)          += rust_misc_device.o
 obj-$(CONFIG_SAMPLE_RUST_PRINT)                        += rust_print.o
 obj-$(CONFIG_SAMPLE_RUST_DRIVER_PCI)           += rust_driver_pci.o
+obj-$(CONFIG_SAMPLE_RUST_DRIVER_PLATFORM)      += rust_driver_platform.o
 
 rust_print-y := rust_print_main.o rust_print_events.o
 
diff --git a/samples/rust/rust_driver_platform.rs b/samples/rust/rust_driver_platform.rs
new file mode 100644 (file)
index 0000000..8120609
--- /dev/null
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0
+
+//! Rust Platform driver sample.
+
+use kernel::{c_str, of, platform, prelude::*};
+
+struct SampleDriver {
+    pdev: platform::Device,
+}
+
+struct Info(u32);
+
+kernel::of_device_table!(
+    OF_TABLE,
+    MODULE_OF_TABLE,
+    <SampleDriver as platform::Driver>::IdInfo,
+    [(of::DeviceId::new(c_str!("test,rust-device")), Info(42))]
+);
+
+impl platform::Driver for SampleDriver {
+    type IdInfo = Info;
+    const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
+
+    fn probe(pdev: &mut platform::Device, info: Option<&Self::IdInfo>) -> Result<Pin<KBox<Self>>> {
+        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);
+        }
+
+        let drvdata = KBox::new(Self { pdev: pdev.clone() }, GFP_KERNEL)?;
+
+        Ok(drvdata.into())
+    }
+}
+
+impl Drop for SampleDriver {
+    fn drop(&mut self) {
+        dev_dbg!(self.pdev.as_ref(), "Remove Rust Platform driver sample.\n");
+    }
+}
+
+kernel::module_platform_driver! {
+    type: SampleDriver,
+    name: "rust_driver_platform",
+    author: "Danilo Krummrich",
+    description: "Rust Platform driver",
+    license: "GPL v2",
+}