i8042_device.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. use alloc::{
  2. string::{String, ToString},
  3. sync::{Arc, Weak},
  4. };
  5. use crate::{
  6. driver::base::{
  7. class::Class,
  8. device::{
  9. bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceState, DeviceType, IdTable,
  10. },
  11. kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
  12. kset::KSet,
  13. platform::platform_device::PlatformDevice,
  14. },
  15. filesystem::kernfs::KernFSInode,
  16. libs::{
  17. rwlock::{RwLockReadGuard, RwLockWriteGuard},
  18. spinlock::{SpinLock, SpinLockGuard},
  19. },
  20. };
  21. #[derive(Debug)]
  22. #[cast_to([sync] Device)]
  23. #[cast_to([sync] PlatformDevice)]
  24. pub struct I8042PlatformDevice {
  25. inner: SpinLock<InnerI8042PlatformDevice>,
  26. kobj_state: LockedKObjectState,
  27. }
  28. impl I8042PlatformDevice {
  29. pub const NAME: &'static str = "i8042";
  30. pub fn new() -> Self {
  31. return Self {
  32. inner: SpinLock::new(InnerI8042PlatformDevice {
  33. kobject_common: KObjectCommonData::default(),
  34. device_common: DeviceCommonData::default(),
  35. device_state: DeviceState::NotInitialized,
  36. pdev_id: 0,
  37. pdev_id_auto: false,
  38. }),
  39. kobj_state: LockedKObjectState::new(None),
  40. };
  41. }
  42. fn inner(&self) -> SpinLockGuard<InnerI8042PlatformDevice> {
  43. self.inner.lock()
  44. }
  45. }
  46. #[derive(Debug)]
  47. pub struct InnerI8042PlatformDevice {
  48. kobject_common: KObjectCommonData,
  49. device_common: DeviceCommonData,
  50. device_state: DeviceState,
  51. pdev_id: i32,
  52. pdev_id_auto: bool,
  53. }
  54. impl Device for I8042PlatformDevice {
  55. fn dev_type(&self) -> DeviceType {
  56. DeviceType::Char
  57. }
  58. fn id_table(&self) -> IdTable {
  59. IdTable::new(self.name(), None)
  60. }
  61. fn bus(&self) -> Option<Weak<dyn Bus>> {
  62. self.inner().device_common.bus.clone()
  63. }
  64. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  65. self.inner().device_common.bus = bus;
  66. }
  67. fn class(&self) -> Option<Arc<dyn Class>> {
  68. let mut guard = self.inner();
  69. let r = guard.device_common.class.clone()?.upgrade();
  70. if r.is_none() {
  71. guard.device_common.class = None;
  72. }
  73. return r;
  74. }
  75. fn set_class(&self, class: Option<Weak<dyn Class>>) {
  76. self.inner().device_common.class = class;
  77. }
  78. fn driver(&self) -> Option<Arc<dyn Driver>> {
  79. self.inner().device_common.driver.clone()?.upgrade()
  80. }
  81. fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
  82. self.inner().device_common.driver = driver;
  83. }
  84. fn is_dead(&self) -> bool {
  85. false
  86. }
  87. fn can_match(&self) -> bool {
  88. true
  89. }
  90. fn set_can_match(&self, _can_match: bool) {}
  91. fn state_synced(&self) -> bool {
  92. true
  93. }
  94. fn dev_parent(&self) -> Option<Weak<dyn Device>> {
  95. self.inner().device_common.get_parent_weak_or_clear()
  96. }
  97. fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
  98. self.inner().device_common.parent = dev_parent;
  99. }
  100. }
  101. impl KObject for I8042PlatformDevice {
  102. fn as_any_ref(&self) -> &dyn core::any::Any {
  103. self
  104. }
  105. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  106. self.inner().kobject_common.kern_inode = inode;
  107. }
  108. fn inode(&self) -> Option<Arc<KernFSInode>> {
  109. self.inner().kobject_common.kern_inode.clone()
  110. }
  111. fn parent(&self) -> Option<Weak<dyn KObject>> {
  112. self.inner().kobject_common.parent.clone()
  113. }
  114. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  115. self.inner().kobject_common.parent = parent;
  116. }
  117. fn kset(&self) -> Option<Arc<KSet>> {
  118. self.inner().kobject_common.kset.clone()
  119. }
  120. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  121. self.inner().kobject_common.kset = kset;
  122. }
  123. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  124. self.inner().kobject_common.kobj_type
  125. }
  126. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  127. self.inner().kobject_common.kobj_type = ktype;
  128. }
  129. fn name(&self) -> String {
  130. Self::NAME.to_string()
  131. }
  132. fn set_name(&self, _name: String) {
  133. // do nothing
  134. }
  135. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  136. self.kobj_state.read()
  137. }
  138. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  139. self.kobj_state.write()
  140. }
  141. fn set_kobj_state(&self, state: KObjectState) {
  142. *self.kobj_state.write() = state;
  143. }
  144. }
  145. impl PlatformDevice for I8042PlatformDevice {
  146. fn pdev_name(&self) -> &str {
  147. Self::NAME
  148. }
  149. fn set_pdev_id(&self, id: i32) {
  150. self.inner.lock().pdev_id = id;
  151. }
  152. fn set_pdev_id_auto(&self, id_auto: bool) {
  153. self.inner.lock().pdev_id_auto = id_auto;
  154. }
  155. fn is_initialized(&self) -> bool {
  156. self.inner.lock().device_state == DeviceState::Initialized
  157. }
  158. fn set_state(&self, set_state: DeviceState) {
  159. self.inner.lock().device_state = set_state;
  160. }
  161. }