1*9993c0fcSR0ronoa use alloc::{ 2*9993c0fcSR0ronoa string::{String, ToString}, 3*9993c0fcSR0ronoa sync::{Arc, Weak}, 4*9993c0fcSR0ronoa vec::Vec, 5*9993c0fcSR0ronoa }; 6*9993c0fcSR0ronoa use system_error::SystemError; 7*9993c0fcSR0ronoa 8*9993c0fcSR0ronoa use crate::{ 9*9993c0fcSR0ronoa driver::base::{ 10*9993c0fcSR0ronoa device::{bus::Bus, driver::Driver, Device, IdTable}, 11*9993c0fcSR0ronoa kobject::{KObjType, KObject, KObjectState, LockedKObjectState}, 12*9993c0fcSR0ronoa kset::KSet, 13*9993c0fcSR0ronoa platform::{platform_device::PlatformDevice, platform_driver::PlatformDriver}, 14*9993c0fcSR0ronoa }, 15*9993c0fcSR0ronoa filesystem::kernfs::KernFSInode, 16*9993c0fcSR0ronoa libs::{ 17*9993c0fcSR0ronoa rwlock::{RwLockReadGuard, RwLockWriteGuard}, 18*9993c0fcSR0ronoa spinlock::SpinLock, 19*9993c0fcSR0ronoa }, 20*9993c0fcSR0ronoa }; 21*9993c0fcSR0ronoa 22*9993c0fcSR0ronoa use super::{i8042_device::I8042PlatformDevice, i8042_setup_aux}; 23*9993c0fcSR0ronoa 24*9993c0fcSR0ronoa #[derive(Debug)] 25*9993c0fcSR0ronoa #[cast_to([sync] PlatformDriver)] 26*9993c0fcSR0ronoa pub struct I8042Driver { 27*9993c0fcSR0ronoa inner: SpinLock<InnerI8042Driver>, 28*9993c0fcSR0ronoa kobj_state: LockedKObjectState, 29*9993c0fcSR0ronoa } 30*9993c0fcSR0ronoa 31*9993c0fcSR0ronoa impl I8042Driver { 32*9993c0fcSR0ronoa pub const NAME: &'static str = "i8042"; new() -> Arc<I8042Driver>33*9993c0fcSR0ronoa pub fn new() -> Arc<I8042Driver> { 34*9993c0fcSR0ronoa let r = Arc::new(Self { 35*9993c0fcSR0ronoa inner: SpinLock::new(InnerI8042Driver { 36*9993c0fcSR0ronoa ktype: None, 37*9993c0fcSR0ronoa kset: None, 38*9993c0fcSR0ronoa parent: None, 39*9993c0fcSR0ronoa kernfs_inode: None, 40*9993c0fcSR0ronoa devices: Vec::new(), 41*9993c0fcSR0ronoa bus: None, 42*9993c0fcSR0ronoa self_ref: Weak::new(), 43*9993c0fcSR0ronoa }), 44*9993c0fcSR0ronoa kobj_state: LockedKObjectState::new(None), 45*9993c0fcSR0ronoa }); 46*9993c0fcSR0ronoa 47*9993c0fcSR0ronoa r.inner.lock().self_ref = Arc::downgrade(&r); 48*9993c0fcSR0ronoa 49*9993c0fcSR0ronoa return r; 50*9993c0fcSR0ronoa } 51*9993c0fcSR0ronoa } 52*9993c0fcSR0ronoa 53*9993c0fcSR0ronoa #[derive(Debug)] 54*9993c0fcSR0ronoa pub struct InnerI8042Driver { 55*9993c0fcSR0ronoa ktype: Option<&'static dyn KObjType>, 56*9993c0fcSR0ronoa kset: Option<Arc<KSet>>, 57*9993c0fcSR0ronoa parent: Option<Weak<dyn KObject>>, 58*9993c0fcSR0ronoa kernfs_inode: Option<Arc<KernFSInode>>, 59*9993c0fcSR0ronoa devices: Vec<Arc<dyn Device>>, 60*9993c0fcSR0ronoa bus: Option<Weak<dyn Bus>>, 61*9993c0fcSR0ronoa 62*9993c0fcSR0ronoa self_ref: Weak<I8042Driver>, 63*9993c0fcSR0ronoa } 64*9993c0fcSR0ronoa 65*9993c0fcSR0ronoa impl PlatformDriver for I8042Driver { 66*9993c0fcSR0ronoa // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#1542 probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>67*9993c0fcSR0ronoa fn probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 68*9993c0fcSR0ronoa let device = device 69*9993c0fcSR0ronoa .clone() 70*9993c0fcSR0ronoa .arc_any() 71*9993c0fcSR0ronoa .downcast::<I8042PlatformDevice>() 72*9993c0fcSR0ronoa .map_err(|_| SystemError::EINVAL)?; 73*9993c0fcSR0ronoa 74*9993c0fcSR0ronoa device.set_driver(Some(self.inner.lock().self_ref.clone())); 75*9993c0fcSR0ronoa 76*9993c0fcSR0ronoa i8042_setup_aux()?; 77*9993c0fcSR0ronoa return Ok(()); 78*9993c0fcSR0ronoa } 79*9993c0fcSR0ronoa 80*9993c0fcSR0ronoa // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#1587 remove(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>81*9993c0fcSR0ronoa fn remove(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 82*9993c0fcSR0ronoa todo!() 83*9993c0fcSR0ronoa } 84*9993c0fcSR0ronoa 85*9993c0fcSR0ronoa // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#1322 shutdown(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>86*9993c0fcSR0ronoa fn shutdown(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 87*9993c0fcSR0ronoa todo!() 88*9993c0fcSR0ronoa } 89*9993c0fcSR0ronoa suspend(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>90*9993c0fcSR0ronoa fn suspend(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 91*9993c0fcSR0ronoa // do nothing 92*9993c0fcSR0ronoa return Ok(()); 93*9993c0fcSR0ronoa } 94*9993c0fcSR0ronoa resume(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>95*9993c0fcSR0ronoa fn resume(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> { 96*9993c0fcSR0ronoa // do nothing 97*9993c0fcSR0ronoa return Ok(()); 98*9993c0fcSR0ronoa } 99*9993c0fcSR0ronoa } 100*9993c0fcSR0ronoa 101*9993c0fcSR0ronoa impl Driver for I8042Driver { id_table(&self) -> Option<IdTable>102*9993c0fcSR0ronoa fn id_table(&self) -> Option<IdTable> { 103*9993c0fcSR0ronoa Some(IdTable::new(I8042PlatformDevice::NAME.to_string(), None)) 104*9993c0fcSR0ronoa } 105*9993c0fcSR0ronoa devices(&self) -> Vec<Arc<dyn Device>>106*9993c0fcSR0ronoa fn devices(&self) -> Vec<Arc<dyn Device>> { 107*9993c0fcSR0ronoa self.inner.lock().devices.clone() 108*9993c0fcSR0ronoa } 109*9993c0fcSR0ronoa add_device(&self, device: Arc<dyn Device>)110*9993c0fcSR0ronoa fn add_device(&self, device: Arc<dyn Device>) { 111*9993c0fcSR0ronoa let mut guard = self.inner.lock(); 112*9993c0fcSR0ronoa // check if the device is already in the list 113*9993c0fcSR0ronoa if guard.devices.iter().any(|dev| Arc::ptr_eq(dev, &device)) { 114*9993c0fcSR0ronoa return; 115*9993c0fcSR0ronoa } 116*9993c0fcSR0ronoa 117*9993c0fcSR0ronoa guard.devices.push(device); 118*9993c0fcSR0ronoa } 119*9993c0fcSR0ronoa delete_device(&self, device: &Arc<dyn Device>)120*9993c0fcSR0ronoa fn delete_device(&self, device: &Arc<dyn Device>) { 121*9993c0fcSR0ronoa let mut guard = self.inner.lock(); 122*9993c0fcSR0ronoa guard.devices.retain(|dev| !Arc::ptr_eq(dev, device)); 123*9993c0fcSR0ronoa } 124*9993c0fcSR0ronoa set_bus(&self, bus: Option<Weak<dyn Bus>>)125*9993c0fcSR0ronoa fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 126*9993c0fcSR0ronoa self.inner.lock().bus = bus; 127*9993c0fcSR0ronoa } 128*9993c0fcSR0ronoa bus(&self) -> Option<Weak<dyn Bus>>129*9993c0fcSR0ronoa fn bus(&self) -> Option<Weak<dyn Bus>> { 130*9993c0fcSR0ronoa self.inner.lock().bus.clone() 131*9993c0fcSR0ronoa } 132*9993c0fcSR0ronoa } 133*9993c0fcSR0ronoa 134*9993c0fcSR0ronoa impl KObject for I8042Driver { as_any_ref(&self) -> &dyn core::any::Any135*9993c0fcSR0ronoa fn as_any_ref(&self) -> &dyn core::any::Any { 136*9993c0fcSR0ronoa self 137*9993c0fcSR0ronoa } 138*9993c0fcSR0ronoa set_inode(&self, inode: Option<Arc<KernFSInode>>)139*9993c0fcSR0ronoa fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 140*9993c0fcSR0ronoa self.inner.lock().kernfs_inode = inode; 141*9993c0fcSR0ronoa } 142*9993c0fcSR0ronoa inode(&self) -> Option<Arc<KernFSInode>>143*9993c0fcSR0ronoa fn inode(&self) -> Option<Arc<KernFSInode>> { 144*9993c0fcSR0ronoa self.inner.lock().kernfs_inode.clone() 145*9993c0fcSR0ronoa } 146*9993c0fcSR0ronoa parent(&self) -> Option<Weak<dyn KObject>>147*9993c0fcSR0ronoa fn parent(&self) -> Option<Weak<dyn KObject>> { 148*9993c0fcSR0ronoa self.inner.lock().parent.clone() 149*9993c0fcSR0ronoa } 150*9993c0fcSR0ronoa set_parent(&self, parent: Option<Weak<dyn KObject>>)151*9993c0fcSR0ronoa fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 152*9993c0fcSR0ronoa self.inner.lock().parent = parent; 153*9993c0fcSR0ronoa } 154*9993c0fcSR0ronoa kset(&self) -> Option<Arc<KSet>>155*9993c0fcSR0ronoa fn kset(&self) -> Option<Arc<KSet>> { 156*9993c0fcSR0ronoa self.inner.lock().kset.clone() 157*9993c0fcSR0ronoa } 158*9993c0fcSR0ronoa set_kset(&self, kset: Option<Arc<KSet>>)159*9993c0fcSR0ronoa fn set_kset(&self, kset: Option<Arc<KSet>>) { 160*9993c0fcSR0ronoa self.inner.lock().kset = kset; 161*9993c0fcSR0ronoa } 162*9993c0fcSR0ronoa kobj_type(&self) -> Option<&'static dyn KObjType>163*9993c0fcSR0ronoa fn kobj_type(&self) -> Option<&'static dyn KObjType> { 164*9993c0fcSR0ronoa self.inner.lock().ktype 165*9993c0fcSR0ronoa } 166*9993c0fcSR0ronoa set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)167*9993c0fcSR0ronoa fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 168*9993c0fcSR0ronoa self.inner.lock().ktype = ktype; 169*9993c0fcSR0ronoa } 170*9993c0fcSR0ronoa name(&self) -> String171*9993c0fcSR0ronoa fn name(&self) -> String { 172*9993c0fcSR0ronoa Self::NAME.to_string() 173*9993c0fcSR0ronoa } 174*9993c0fcSR0ronoa set_name(&self, _name: String)175*9993c0fcSR0ronoa fn set_name(&self, _name: String) { 176*9993c0fcSR0ronoa // do nothing 177*9993c0fcSR0ronoa } 178*9993c0fcSR0ronoa kobj_state(&self) -> RwLockReadGuard<KObjectState>179*9993c0fcSR0ronoa fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 180*9993c0fcSR0ronoa self.kobj_state.read() 181*9993c0fcSR0ronoa } 182*9993c0fcSR0ronoa kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>183*9993c0fcSR0ronoa fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 184*9993c0fcSR0ronoa self.kobj_state.write() 185*9993c0fcSR0ronoa } 186*9993c0fcSR0ronoa set_kobj_state(&self, state: KObjectState)187*9993c0fcSR0ronoa fn set_kobj_state(&self, state: KObjectState) { 188*9993c0fcSR0ronoa *self.kobj_state.write() = state; 189*9993c0fcSR0ronoa } 190*9993c0fcSR0ronoa } 191