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