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