rust_driver_i2c.rs 1.7 KB

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