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