xref: /linux/samples/rust/rust_driver_i2c.rs (revision 99676aed1fec109d62822e21a06760eb098dc5f4)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 //! Rust I2C driver sample.
4 
5 use kernel::{
6     acpi,
7     device::Core,
8     i2c,
9     of,
10     prelude::*, //
11 };
12 
13 struct SampleDriver;
14 
15 kernel::acpi_device_table! {
16     ACPI_TABLE,
17     MODULE_ACPI_TABLE,
18     <SampleDriver as i2c::Driver>::IdInfo,
19     [(acpi::DeviceId::new(c"LNUXBEEF"), 0)]
20 }
21 
22 kernel::i2c_device_table! {
23     I2C_TABLE,
24     MODULE_I2C_TABLE,
25     <SampleDriver as i2c::Driver>::IdInfo,
26     [(i2c::DeviceId::new(c"rust_driver_i2c"), 0)]
27 }
28 
29 kernel::of_device_table! {
30     OF_TABLE,
31     MODULE_OF_TABLE,
32     <SampleDriver as i2c::Driver>::IdInfo,
33     [(of::DeviceId::new(c"test,rust_driver_i2c"), 0)]
34 }
35 
36 impl i2c::Driver for SampleDriver {
37     type IdInfo = u32;
38     type Data<'bound> = Self;
39 
40     const ACPI_ID_TABLE: Option<acpi::IdTable<Self::IdInfo>> = Some(&ACPI_TABLE);
41     const I2C_ID_TABLE: Option<i2c::IdTable<Self::IdInfo>> = Some(&I2C_TABLE);
42     const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
43 
44     fn probe<'bound>(
45         idev: &'bound i2c::I2cClient<Core<'_>>,
46         info: Option<&'bound Self::IdInfo>,
47     ) -> impl PinInit<Self, Error> + 'bound {
48         let dev = idev.as_ref();
49 
50         dev_info!(dev, "Probe Rust I2C driver sample.\n");
51 
52         if let Some(info) = info {
53             dev_info!(dev, "Probed with info: '{}'.\n", info);
54         }
55 
56         Ok(Self)
57     }
58 
59     fn shutdown<'bound>(idev: &'bound i2c::I2cClient<Core<'_>>, _this: Pin<&Self>) {
60         dev_info!(idev.as_ref(), "Shutdown Rust I2C driver sample.\n");
61     }
62 
63     fn unbind<'bound>(idev: &'bound i2c::I2cClient<Core<'_>>, _this: Pin<&Self>) {
64         dev_info!(idev.as_ref(), "Unbind Rust I2C driver sample.\n");
65     }
66 }
67 
68 kernel::module_i2c_driver! {
69     type: SampleDriver,
70     name: "rust_driver_i2c",
71     authors: ["Igor Korotin"],
72     description: "Rust I2C driver",
73     license: "GPL v2",
74 }
75