xref: /linux/samples/rust/rust_driver_platform.rs (revision 4f9786035f9e519db41375818e1d0b5f20da2f10)
1b2e8a832SDanilo Krummrich // SPDX-License-Identifier: GPL-2.0
2b2e8a832SDanilo Krummrich 
3b2e8a832SDanilo Krummrich //! Rust Platform driver sample.
4b2e8a832SDanilo Krummrich 
5*4d320e30SDanilo Krummrich use kernel::{c_str, device::Core, of, platform, prelude::*, types::ARef};
6b2e8a832SDanilo Krummrich 
7b2e8a832SDanilo Krummrich struct SampleDriver {
8*4d320e30SDanilo Krummrich     pdev: ARef<platform::Device>,
9b2e8a832SDanilo Krummrich }
10b2e8a832SDanilo Krummrich 
11b2e8a832SDanilo Krummrich struct Info(u32);
12b2e8a832SDanilo Krummrich 
13b2e8a832SDanilo Krummrich kernel::of_device_table!(
14b2e8a832SDanilo Krummrich     OF_TABLE,
15b2e8a832SDanilo Krummrich     MODULE_OF_TABLE,
16b2e8a832SDanilo Krummrich     <SampleDriver as platform::Driver>::IdInfo,
17b2e8a832SDanilo Krummrich     [(of::DeviceId::new(c_str!("test,rust-device")), Info(42))]
18b2e8a832SDanilo Krummrich );
19b2e8a832SDanilo Krummrich 
20b2e8a832SDanilo Krummrich impl platform::Driver for SampleDriver {
21b2e8a832SDanilo Krummrich     type IdInfo = Info;
22b2e8a832SDanilo Krummrich     const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
23b2e8a832SDanilo Krummrich 
24*4d320e30SDanilo Krummrich     fn probe(
25*4d320e30SDanilo Krummrich         pdev: &platform::Device<Core>,
26*4d320e30SDanilo Krummrich         info: Option<&Self::IdInfo>,
27*4d320e30SDanilo Krummrich     ) -> Result<Pin<KBox<Self>>> {
28b2e8a832SDanilo Krummrich         dev_dbg!(pdev.as_ref(), "Probe Rust Platform driver sample.\n");
29b2e8a832SDanilo Krummrich 
30b2e8a832SDanilo Krummrich         if let Some(info) = info {
31b2e8a832SDanilo Krummrich             dev_info!(pdev.as_ref(), "Probed with info: '{}'.\n", info.0);
32b2e8a832SDanilo Krummrich         }
33b2e8a832SDanilo Krummrich 
34*4d320e30SDanilo Krummrich         let drvdata = KBox::new(Self { pdev: pdev.into() }, GFP_KERNEL)?;
35b2e8a832SDanilo Krummrich 
36b2e8a832SDanilo Krummrich         Ok(drvdata.into())
37b2e8a832SDanilo Krummrich     }
38b2e8a832SDanilo Krummrich }
39b2e8a832SDanilo Krummrich 
40b2e8a832SDanilo Krummrich impl Drop for SampleDriver {
41b2e8a832SDanilo Krummrich     fn drop(&mut self) {
42b2e8a832SDanilo Krummrich         dev_dbg!(self.pdev.as_ref(), "Remove Rust Platform driver sample.\n");
43b2e8a832SDanilo Krummrich     }
44b2e8a832SDanilo Krummrich }
45b2e8a832SDanilo Krummrich 
46b2e8a832SDanilo Krummrich kernel::module_platform_driver! {
47b2e8a832SDanilo Krummrich     type: SampleDriver,
48b2e8a832SDanilo Krummrich     name: "rust_driver_platform",
4938559da6SGuilherme Giacomo Simoes     authors: ["Danilo Krummrich"],
50b2e8a832SDanilo Krummrich     description: "Rust Platform driver",
51b2e8a832SDanilo Krummrich     license: "GPL v2",
52b2e8a832SDanilo Krummrich }
53