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