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