19993c0fcSR0ronoa use alloc::{ 29993c0fcSR0ronoa string::{String, ToString}, 39993c0fcSR0ronoa sync::{Arc, Weak}, 49993c0fcSR0ronoa }; 59993c0fcSR0ronoa 69993c0fcSR0ronoa use crate::{ 79993c0fcSR0ronoa driver::base::{ 89993c0fcSR0ronoa class::Class, 9*28fe4ad2S黄铭涛 device::{ 10*28fe4ad2S黄铭涛 bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceState, DeviceType, IdTable, 11*28fe4ad2S黄铭涛 }, 12*28fe4ad2S黄铭涛 kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState}, 139993c0fcSR0ronoa kset::KSet, 14da152319SLoGin platform::platform_device::PlatformDevice, 159993c0fcSR0ronoa }, 169993c0fcSR0ronoa filesystem::kernfs::KernFSInode, 179993c0fcSR0ronoa libs::{ 189993c0fcSR0ronoa rwlock::{RwLockReadGuard, RwLockWriteGuard}, 19*28fe4ad2S黄铭涛 spinlock::{SpinLock, SpinLockGuard}, 209993c0fcSR0ronoa }, 219993c0fcSR0ronoa }; 229993c0fcSR0ronoa 239993c0fcSR0ronoa #[derive(Debug)] 249993c0fcSR0ronoa #[cast_to([sync] Device)] 259993c0fcSR0ronoa #[cast_to([sync] PlatformDevice)] 269993c0fcSR0ronoa pub struct I8042PlatformDevice { 279993c0fcSR0ronoa inner: SpinLock<InnerI8042PlatformDevice>, 289993c0fcSR0ronoa kobj_state: LockedKObjectState, 299993c0fcSR0ronoa } 309993c0fcSR0ronoa 319993c0fcSR0ronoa impl I8042PlatformDevice { 329993c0fcSR0ronoa pub const NAME: &'static str = "i8042"; new() -> Self339993c0fcSR0ronoa pub fn new() -> Self { 349993c0fcSR0ronoa return Self { 359993c0fcSR0ronoa inner: SpinLock::new(InnerI8042PlatformDevice { 36*28fe4ad2S黄铭涛 kobject_common: KObjectCommonData::default(), 37*28fe4ad2S黄铭涛 device_common: DeviceCommonData::default(), 389993c0fcSR0ronoa device_state: DeviceState::NotInitialized, 399993c0fcSR0ronoa pdev_id: 0, 409993c0fcSR0ronoa pdev_id_auto: false, 419993c0fcSR0ronoa }), 429993c0fcSR0ronoa kobj_state: LockedKObjectState::new(None), 439993c0fcSR0ronoa }; 449993c0fcSR0ronoa } 45*28fe4ad2S黄铭涛 inner(&self) -> SpinLockGuard<InnerI8042PlatformDevice>46*28fe4ad2S黄铭涛 fn inner(&self) -> SpinLockGuard<InnerI8042PlatformDevice> { 47*28fe4ad2S黄铭涛 self.inner.lock() 48*28fe4ad2S黄铭涛 } 499993c0fcSR0ronoa } 509993c0fcSR0ronoa 519993c0fcSR0ronoa #[derive(Debug)] 529993c0fcSR0ronoa pub struct InnerI8042PlatformDevice { 53*28fe4ad2S黄铭涛 kobject_common: KObjectCommonData, 54*28fe4ad2S黄铭涛 device_common: DeviceCommonData, 559993c0fcSR0ronoa device_state: DeviceState, 569993c0fcSR0ronoa pdev_id: i32, 579993c0fcSR0ronoa pdev_id_auto: bool, 589993c0fcSR0ronoa } 599993c0fcSR0ronoa 609993c0fcSR0ronoa impl Device for I8042PlatformDevice { dev_type(&self) -> DeviceType619993c0fcSR0ronoa fn dev_type(&self) -> DeviceType { 629993c0fcSR0ronoa DeviceType::Char 639993c0fcSR0ronoa } 649993c0fcSR0ronoa id_table(&self) -> IdTable659993c0fcSR0ronoa fn id_table(&self) -> IdTable { 669993c0fcSR0ronoa IdTable::new(self.name(), None) 679993c0fcSR0ronoa } 689993c0fcSR0ronoa bus(&self) -> Option<Weak<dyn Bus>>699993c0fcSR0ronoa fn bus(&self) -> Option<Weak<dyn Bus>> { 70*28fe4ad2S黄铭涛 self.inner().device_common.bus.clone() 719993c0fcSR0ronoa } 729993c0fcSR0ronoa set_bus(&self, bus: Option<Weak<dyn Bus>>)739993c0fcSR0ronoa fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 74*28fe4ad2S黄铭涛 self.inner().device_common.bus = bus; 759993c0fcSR0ronoa } class(&self) -> Option<Arc<dyn Class>>764256da7fSLoGin fn class(&self) -> Option<Arc<dyn Class>> { 77*28fe4ad2S黄铭涛 let mut guard = self.inner(); 78*28fe4ad2S黄铭涛 let r = guard.device_common.class.clone()?.upgrade(); 794256da7fSLoGin if r.is_none() { 80*28fe4ad2S黄铭涛 guard.device_common.class = None; 814256da7fSLoGin } 829993c0fcSR0ronoa 834256da7fSLoGin return r; 844256da7fSLoGin } set_class(&self, class: Option<Weak<dyn Class>>)854256da7fSLoGin fn set_class(&self, class: Option<Weak<dyn Class>>) { 86*28fe4ad2S黄铭涛 self.inner().device_common.class = class; 879993c0fcSR0ronoa } 889993c0fcSR0ronoa driver(&self) -> Option<Arc<dyn Driver>>899993c0fcSR0ronoa fn driver(&self) -> Option<Arc<dyn Driver>> { 90*28fe4ad2S黄铭涛 self.inner().device_common.driver.clone()?.upgrade() 919993c0fcSR0ronoa } 929993c0fcSR0ronoa set_driver(&self, driver: Option<Weak<dyn Driver>>)939993c0fcSR0ronoa fn set_driver(&self, driver: Option<Weak<dyn Driver>>) { 94*28fe4ad2S黄铭涛 self.inner().device_common.driver = driver; 959993c0fcSR0ronoa } 969993c0fcSR0ronoa is_dead(&self) -> bool979993c0fcSR0ronoa fn is_dead(&self) -> bool { 989993c0fcSR0ronoa false 999993c0fcSR0ronoa } 1009993c0fcSR0ronoa can_match(&self) -> bool1019993c0fcSR0ronoa fn can_match(&self) -> bool { 1029993c0fcSR0ronoa true 1039993c0fcSR0ronoa } 1049993c0fcSR0ronoa set_can_match(&self, _can_match: bool)1059993c0fcSR0ronoa fn set_can_match(&self, _can_match: bool) {} 1069993c0fcSR0ronoa state_synced(&self) -> bool1079993c0fcSR0ronoa fn state_synced(&self) -> bool { 1089993c0fcSR0ronoa true 1099993c0fcSR0ronoa } 110*28fe4ad2S黄铭涛 dev_parent(&self) -> Option<Weak<dyn Device>>111*28fe4ad2S黄铭涛 fn dev_parent(&self) -> Option<Weak<dyn Device>> { 112*28fe4ad2S黄铭涛 self.inner().device_common.get_parent_weak_or_clear() 113*28fe4ad2S黄铭涛 } 114*28fe4ad2S黄铭涛 set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>)115*28fe4ad2S黄铭涛 fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) { 116*28fe4ad2S黄铭涛 self.inner().device_common.parent = dev_parent; 117*28fe4ad2S黄铭涛 } 1189993c0fcSR0ronoa } 1199993c0fcSR0ronoa 1209993c0fcSR0ronoa impl KObject for I8042PlatformDevice { as_any_ref(&self) -> &dyn core::any::Any1219993c0fcSR0ronoa fn as_any_ref(&self) -> &dyn core::any::Any { 1229993c0fcSR0ronoa self 1239993c0fcSR0ronoa } 1249993c0fcSR0ronoa set_inode(&self, inode: Option<Arc<KernFSInode>>)1259993c0fcSR0ronoa fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 126*28fe4ad2S黄铭涛 self.inner().kobject_common.kern_inode = inode; 1279993c0fcSR0ronoa } 1289993c0fcSR0ronoa inode(&self) -> Option<Arc<KernFSInode>>1299993c0fcSR0ronoa fn inode(&self) -> Option<Arc<KernFSInode>> { 130*28fe4ad2S黄铭涛 self.inner().kobject_common.kern_inode.clone() 1319993c0fcSR0ronoa } 1329993c0fcSR0ronoa parent(&self) -> Option<Weak<dyn KObject>>1339993c0fcSR0ronoa fn parent(&self) -> Option<Weak<dyn KObject>> { 134*28fe4ad2S黄铭涛 self.inner().kobject_common.parent.clone() 1359993c0fcSR0ronoa } 1369993c0fcSR0ronoa set_parent(&self, parent: Option<Weak<dyn KObject>>)1379993c0fcSR0ronoa fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 138*28fe4ad2S黄铭涛 self.inner().kobject_common.parent = parent; 1399993c0fcSR0ronoa } 1409993c0fcSR0ronoa kset(&self) -> Option<Arc<KSet>>1419993c0fcSR0ronoa fn kset(&self) -> Option<Arc<KSet>> { 142*28fe4ad2S黄铭涛 self.inner().kobject_common.kset.clone() 1439993c0fcSR0ronoa } 1449993c0fcSR0ronoa set_kset(&self, kset: Option<Arc<KSet>>)1459993c0fcSR0ronoa fn set_kset(&self, kset: Option<Arc<KSet>>) { 146*28fe4ad2S黄铭涛 self.inner().kobject_common.kset = kset; 1479993c0fcSR0ronoa } 1489993c0fcSR0ronoa kobj_type(&self) -> Option<&'static dyn KObjType>1499993c0fcSR0ronoa fn kobj_type(&self) -> Option<&'static dyn KObjType> { 150*28fe4ad2S黄铭涛 self.inner().kobject_common.kobj_type 1519993c0fcSR0ronoa } 1529993c0fcSR0ronoa set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)1539993c0fcSR0ronoa fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 154*28fe4ad2S黄铭涛 self.inner().kobject_common.kobj_type = ktype; 1559993c0fcSR0ronoa } 1569993c0fcSR0ronoa name(&self) -> String1579993c0fcSR0ronoa fn name(&self) -> String { 1589993c0fcSR0ronoa Self::NAME.to_string() 1599993c0fcSR0ronoa } 1609993c0fcSR0ronoa set_name(&self, _name: String)1619993c0fcSR0ronoa fn set_name(&self, _name: String) { 1629993c0fcSR0ronoa // do nothing 1639993c0fcSR0ronoa } 1649993c0fcSR0ronoa kobj_state(&self) -> RwLockReadGuard<KObjectState>1659993c0fcSR0ronoa fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 1669993c0fcSR0ronoa self.kobj_state.read() 1679993c0fcSR0ronoa } 1689993c0fcSR0ronoa kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>1699993c0fcSR0ronoa fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 1709993c0fcSR0ronoa self.kobj_state.write() 1719993c0fcSR0ronoa } 1729993c0fcSR0ronoa set_kobj_state(&self, state: KObjectState)1739993c0fcSR0ronoa fn set_kobj_state(&self, state: KObjectState) { 1749993c0fcSR0ronoa *self.kobj_state.write() = state; 1759993c0fcSR0ronoa } 1769993c0fcSR0ronoa } 1779993c0fcSR0ronoa 1789993c0fcSR0ronoa impl PlatformDevice for I8042PlatformDevice { pdev_name(&self) -> &str1799993c0fcSR0ronoa fn pdev_name(&self) -> &str { 1809993c0fcSR0ronoa Self::NAME 1819993c0fcSR0ronoa } 1829993c0fcSR0ronoa set_pdev_id(&self, id: i32)1839993c0fcSR0ronoa fn set_pdev_id(&self, id: i32) { 1849993c0fcSR0ronoa self.inner.lock().pdev_id = id; 1859993c0fcSR0ronoa } 1869993c0fcSR0ronoa set_pdev_id_auto(&self, id_auto: bool)1879993c0fcSR0ronoa fn set_pdev_id_auto(&self, id_auto: bool) { 1889993c0fcSR0ronoa self.inner.lock().pdev_id_auto = id_auto; 1899993c0fcSR0ronoa } 1909993c0fcSR0ronoa is_initialized(&self) -> bool1919993c0fcSR0ronoa fn is_initialized(&self) -> bool { 1929993c0fcSR0ronoa self.inner.lock().device_state == DeviceState::Initialized 1939993c0fcSR0ronoa } 1949993c0fcSR0ronoa set_state(&self, set_state: DeviceState)1959993c0fcSR0ronoa fn set_state(&self, set_state: DeviceState) { 1969993c0fcSR0ronoa self.inner.lock().device_state = set_state; 1979993c0fcSR0ronoa } 1989993c0fcSR0ronoa } 199