88 lines · 2.1 KB · Rust
RawDownload
// 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",}