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 dev_dbg!(pdev, "Probe Rust SoC driver sample.\n"); 48 49 let pdev = pdev.into(); 50 pin_init_scope(move || { 51 let machine = CString::try_from(c"My cool ACME15 dev board")?; 52 let family = CString::try_from(c"ACME")?; 53 let revision = CString::try_from(c"1.2")?; 54 let serial_number = CString::try_from(c"12345")?; 55 let soc_id = CString::try_from(c"ACME15")?; 56 57 let attr = soc::Attributes { 58 machine: Some(machine), 59 family: Some(family), 60 revision: Some(revision), 61 serial_number: Some(serial_number), 62 soc_id: Some(soc_id), 63 }; 64 65 Ok(try_pin_init!(SampleSocDriver { 66 pdev: pdev, 67 _dev_reg <- soc::Registration::new(attr), 68 }? Error)) 69 }) 70 } 71 } 72 73 kernel::module_platform_driver! { 74 type: SampleSocDriver, 75 name: "rust_soc", 76 authors: ["Matthew Maurer"], 77 description: "Rust SoC Driver", 78 license: "GPL", 79 } 80