Commit b2e8a832 authored by Danilo Krummrich's avatar Danilo Krummrich Committed by Greg Kroah-Hartman
Browse files

samples: rust: add Rust platform sample driver



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: default avatarRob Herring (Arm) <robh@kernel.org>
Signed-off-by: default avatarDanilo Krummrich <dakr@kernel.org>
Tested-by: default avatarDirk Behme <dirk.behme@de.bosch.com>
Tested-by: default avatarFabien Parent <fabien.parent@linaro.org>
Link: https://lore.kernel.org/r/20241219170425.12036-16-dakr@kernel.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 683a63be
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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>
+5 −0
Original line number Diff line number Diff line
@@ -33,6 +33,11 @@ dev@100 {
					reg = <0x100>;
				};
			};

			test-device@2 {
				compatible = "test,rust-device";
				reg = <0x2>;
			};
		};
	};
};
+10 −0
Original line number Diff line number Diff line
@@ -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
+1 −0
Original line number Diff line number Diff line
@@ -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

+49 −0
Original line number Diff line number Diff line
// 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",
}