rust_soc.rs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // SPDX-License-Identifier: GPL-2.0
  2. //! Rust SoC Platform driver sample.
  3. use kernel::{
  4. acpi,
  5. device::Core,
  6. of,
  7. platform,
  8. prelude::*,
  9. soc,
  10. str::CString,
  11. sync::aref::ARef, //
  12. };
  13. use pin_init::pin_init_scope;
  14. #[pin_data]
  15. struct SampleSocDriver {
  16. pdev: ARef<platform::Device>,
  17. #[pin]
  18. _dev_reg: soc::Registration,
  19. }
  20. kernel::of_device_table!(
  21. OF_TABLE,
  22. MODULE_OF_TABLE,
  23. <SampleSocDriver as platform::Driver>::IdInfo,
  24. [(of::DeviceId::new(c"test,rust-device"), ())]
  25. );
  26. kernel::acpi_device_table!(
  27. ACPI_TABLE,
  28. MODULE_ACPI_TABLE,
  29. <SampleSocDriver as platform::Driver>::IdInfo,
  30. [(acpi::DeviceId::new(c"LNUXBEEF"), ())]
  31. );
  32. impl platform::Driver for SampleSocDriver {
  33. type IdInfo = ();
  34. const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
  35. const ACPI_ID_TABLE: Option<acpi::IdTable<Self::IdInfo>> = Some(&ACPI_TABLE);
  36. fn probe(
  37. pdev: &platform::Device<Core>,
  38. _info: Option<&Self::IdInfo>,
  39. ) -> impl PinInit<Self, Error> {
  40. dev_dbg!(pdev, "Probe Rust SoC driver sample.\n");
  41. let pdev = pdev.into();
  42. pin_init_scope(move || {
  43. let machine = CString::try_from(c"My cool ACME15 dev board")?;
  44. let family = CString::try_from(c"ACME")?;
  45. let revision = CString::try_from(c"1.2")?;
  46. let serial_number = CString::try_from(c"12345")?;
  47. let soc_id = CString::try_from(c"ACME15")?;
  48. let attr = soc::Attributes {
  49. machine: Some(machine),
  50. family: Some(family),
  51. revision: Some(revision),
  52. serial_number: Some(serial_number),
  53. soc_id: Some(soc_id),
  54. };
  55. Ok(try_pin_init!(SampleSocDriver {
  56. pdev: pdev,
  57. _dev_reg <- soc::Registration::new(attr),
  58. }? Error))
  59. })
  60. }
  61. }
  62. kernel::module_platform_driver! {
  63. type: SampleSocDriver,
  64. name: "rust_soc",
  65. authors: ["Matthew Maurer"],
  66. description: "Rust SoC Driver",
  67. license: "GPL",
  68. }