// SPDX-License-Identifier: GPL-2.0 //! Rust Serial device bus device driver sample. use kernel::{ acpi, device::{ Bound, Core, // }, of, prelude::*, serdev, sync::aref::ARef, // }; struct SampleDriver { sdev: ARef, } kernel::of_device_table!( OF_TABLE, MODULE_OF_TABLE, ::IdInfo, [(of::DeviceId::new(c"test,rust_driver_serdev"), ())] ); kernel::acpi_device_table!( ACPI_TABLE, MODULE_ACPI_TABLE, ::IdInfo, [(acpi::DeviceId::new(c"LNUXBEEF"), ())] ); #[vtable] impl serdev::Driver for SampleDriver { type IdInfo = (); type Data<'bound> = Self; const OF_ID_TABLE: Option> = Some(&OF_TABLE); const ACPI_ID_TABLE: Option> = Some(&ACPI_TABLE); fn probe<'bound>( sdev: &'bound serdev::Device>, _info: Option<&'bound Self::IdInfo>, ) -> impl PinInit + 'bound { let dev = sdev.as_ref(); dev_dbg!(dev, "Probe Rust Serial device bus device driver sample.\n"); if sdev .set_baudrate( dev.fwnode() .and_then(|fwnode| fwnode.property_read(c"baudrate").optional()) .unwrap_or(115200), ) .is_err() { return Err(EINVAL); } sdev.set_flow_control(false); sdev.set_parity(serdev::Parity::None)?; Ok(Self { sdev: sdev.into() }) } fn receive<'bound>( sdev: &'bound serdev::Device, _this: Pin<&Self>, data: &[u8], ) -> usize { sdev.write(data).unwrap_or_default() as usize } } impl Drop for SampleDriver { fn drop(&mut self) { dev_dbg!( self.sdev.as_ref(), "Remove Rust Serial device bus device driver sample.\n" ); } } kernel::module_serdev_device_driver! { type: SampleDriver, name: "rust_driver_serdev", authors: ["Markus Probst"], description: "Rust Serial device bus device driver", license: "GPL v2", }