| // 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<serdev::Device>, |
| } |
| |
| kernel::of_device_table!( |
| OF_TABLE, |
| <SampleDriver as serdev::Driver>::IdInfo, |
| [(of::DeviceId::new(c"test,rust_driver_serdev"), ())] |
| ); |
| |
| kernel::acpi_device_table!( |
| ACPI_TABLE, |
| <SampleDriver as serdev::Driver>::IdInfo, |
| [(acpi::DeviceId::new(c"LNUXBEEF"), ())] |
| ); |
| |
| #[vtable] |
| impl serdev::Driver for SampleDriver { |
| type IdInfo = (); |
| type Data<'bound> = Self; |
| const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE); |
| const ACPI_ID_TABLE: Option<acpi::IdTable<Self::IdInfo>> = Some(&ACPI_TABLE); |
| |
| fn probe<'bound>( |
| sdev: &'bound serdev::Device<Core<'_>>, |
| _info: Option<&'bound Self::IdInfo>, |
| ) -> impl PinInit<Self, Error> + '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<Bound>, |
| _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", |
| } |