xref: /linux/samples/rust/rust_soc.rs (revision d43a12e474351161bb6d7e2a17ab56f591b9302d)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 //! Rust SoC Platform driver sample.
4 
5 use kernel::{
6     acpi,
7     device::Core,
8     of,
9     platform,
10     prelude::*,
11     soc,
12     str::CString,
13     sync::aref::ARef, //
14 };
15 use pin_init::pin_init_scope;
16 
17 #[pin_data]
18 struct SampleSocDriver {
19     pdev: ARef<platform::Device>,
20     #[pin]
21     _dev_reg: soc::Registration,
22 }
23 
24 kernel::of_device_table!(
25     OF_TABLE,
26     MODULE_OF_TABLE,
27     <SampleSocDriver as platform::Driver>::IdInfo,
28     [(of::DeviceId::new(c"test,rust-device"), ())]
29 );
30 
31 kernel::acpi_device_table!(
32     ACPI_TABLE,
33     MODULE_ACPI_TABLE,
34     <SampleSocDriver as platform::Driver>::IdInfo,
35     [(acpi::DeviceId::new(c"LNUXBEEF"), ())]
36 );
37 
38 impl platform::Driver for SampleSocDriver {
39     type IdInfo = ();
40     const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
41     const ACPI_ID_TABLE: Option<acpi::IdTable<Self::IdInfo>> = Some(&ACPI_TABLE);
42 
43     fn probe(
44         pdev: &platform::Device<Core>,
45         _info: Option<&Self::IdInfo>,
46     ) -> impl PinInit<Self, Error> {
47         let dev = pdev.as_ref();
48 
49         dev_dbg!(dev, "Probe Rust SoC driver sample.\n");
50 
51         let pdev = pdev.into();
52         pin_init_scope(move || {
53             let machine = CString::try_from(c"My cool ACME15 dev board")?;
54             let family = CString::try_from(c"ACME")?;
55             let revision = CString::try_from(c"1.2")?;
56             let serial_number = CString::try_from(c"12345")?;
57             let soc_id = CString::try_from(c"ACME15")?;
58 
59             let attr = soc::Attributes {
60                 machine: Some(machine),
61                 family: Some(family),
62                 revision: Some(revision),
63                 serial_number: Some(serial_number),
64                 soc_id: Some(soc_id),
65             };
66 
67             Ok(try_pin_init!(SampleSocDriver {
68                 pdev: pdev,
69                 _dev_reg <- soc::Registration::new(attr),
70             }? Error))
71         })
72     }
73 }
74 
75 kernel::module_platform_driver! {
76     type: SampleSocDriver,
77     name: "rust_soc",
78     authors: ["Matthew Maurer"],
79     description: "Rust SoC Driver",
80     license: "GPL",
81 }
82