1b2e8a832SDanilo Krummrich // SPDX-License-Identifier: GPL-2.0 2b2e8a832SDanilo Krummrich 3b2e8a832SDanilo Krummrich //! Rust Platform driver sample. 4b2e8a832SDanilo Krummrich 5*4d320e30SDanilo Krummrich use kernel::{c_str, device::Core, of, platform, prelude::*, types::ARef}; 6b2e8a832SDanilo Krummrich 7b2e8a832SDanilo Krummrich struct SampleDriver { 8*4d320e30SDanilo Krummrich pdev: ARef<platform::Device>, 9b2e8a832SDanilo Krummrich } 10b2e8a832SDanilo Krummrich 11b2e8a832SDanilo Krummrich struct Info(u32); 12b2e8a832SDanilo Krummrich 13b2e8a832SDanilo Krummrich kernel::of_device_table!( 14b2e8a832SDanilo Krummrich OF_TABLE, 15b2e8a832SDanilo Krummrich MODULE_OF_TABLE, 16b2e8a832SDanilo Krummrich <SampleDriver as platform::Driver>::IdInfo, 17b2e8a832SDanilo Krummrich [(of::DeviceId::new(c_str!("test,rust-device")), Info(42))] 18b2e8a832SDanilo Krummrich ); 19b2e8a832SDanilo Krummrich 20b2e8a832SDanilo Krummrich impl platform::Driver for SampleDriver { 21b2e8a832SDanilo Krummrich type IdInfo = Info; 22b2e8a832SDanilo Krummrich const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE); 23b2e8a832SDanilo Krummrich 24*4d320e30SDanilo Krummrich fn probe( 25*4d320e30SDanilo Krummrich pdev: &platform::Device<Core>, 26*4d320e30SDanilo Krummrich info: Option<&Self::IdInfo>, 27*4d320e30SDanilo Krummrich ) -> Result<Pin<KBox<Self>>> { 28b2e8a832SDanilo Krummrich dev_dbg!(pdev.as_ref(), "Probe Rust Platform driver sample.\n"); 29b2e8a832SDanilo Krummrich 30b2e8a832SDanilo Krummrich if let Some(info) = info { 31b2e8a832SDanilo Krummrich dev_info!(pdev.as_ref(), "Probed with info: '{}'.\n", info.0); 32b2e8a832SDanilo Krummrich } 33b2e8a832SDanilo Krummrich 34*4d320e30SDanilo Krummrich let drvdata = KBox::new(Self { pdev: pdev.into() }, GFP_KERNEL)?; 35b2e8a832SDanilo Krummrich 36b2e8a832SDanilo Krummrich Ok(drvdata.into()) 37b2e8a832SDanilo Krummrich } 38b2e8a832SDanilo Krummrich } 39b2e8a832SDanilo Krummrich 40b2e8a832SDanilo Krummrich impl Drop for SampleDriver { 41b2e8a832SDanilo Krummrich fn drop(&mut self) { 42b2e8a832SDanilo Krummrich dev_dbg!(self.pdev.as_ref(), "Remove Rust Platform driver sample.\n"); 43b2e8a832SDanilo Krummrich } 44b2e8a832SDanilo Krummrich } 45b2e8a832SDanilo Krummrich 46b2e8a832SDanilo Krummrich kernel::module_platform_driver! { 47b2e8a832SDanilo Krummrich type: SampleDriver, 48b2e8a832SDanilo Krummrich name: "rust_driver_platform", 4938559da6SGuilherme Giacomo Simoes authors: ["Danilo Krummrich"], 50b2e8a832SDanilo Krummrich description: "Rust Platform driver", 51b2e8a832SDanilo Krummrich license: "GPL v2", 52b2e8a832SDanilo Krummrich } 53