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