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