19993c0fcSR0ronoa use alloc::{ 29993c0fcSR0ronoa string::{String, ToString}, 39993c0fcSR0ronoa sync::{Arc, Weak}, 49993c0fcSR0ronoa }; 59993c0fcSR0ronoa use system_error::SystemError; 69993c0fcSR0ronoa 79993c0fcSR0ronoa use crate::{ 89993c0fcSR0ronoa driver::{ 99993c0fcSR0ronoa base::{ 109993c0fcSR0ronoa class::Class, 119993c0fcSR0ronoa device::{bus::Bus, driver::Driver, Device, DeviceType, IdTable}, 129993c0fcSR0ronoa kobject::{KObjType, KObject, KObjectState, LockedKObjectState}, 139993c0fcSR0ronoa kset::KSet, 149993c0fcSR0ronoa }, 159993c0fcSR0ronoa input::serio::serio_device::SerioDevice, 169993c0fcSR0ronoa }, 179993c0fcSR0ronoa filesystem::kernfs::KernFSInode, 189993c0fcSR0ronoa libs::{ 199993c0fcSR0ronoa rwlock::{RwLockReadGuard, RwLockWriteGuard}, 209993c0fcSR0ronoa spinlock::SpinLock, 219993c0fcSR0ronoa }, 229993c0fcSR0ronoa }; 239993c0fcSR0ronoa 249993c0fcSR0ronoa use super::{i8042_start, i8042_stop}; 259993c0fcSR0ronoa 269993c0fcSR0ronoa #[derive(Debug)] 279993c0fcSR0ronoa #[cast_to([sync] Device)] 289993c0fcSR0ronoa pub struct I8042AuxPort { 299993c0fcSR0ronoa inner: SpinLock<InnerI8042AuxPort>, 309993c0fcSR0ronoa kobj_state: LockedKObjectState, 319993c0fcSR0ronoa } 329993c0fcSR0ronoa 339993c0fcSR0ronoa #[derive(Debug)] 349993c0fcSR0ronoa pub struct InnerI8042AuxPort { 359993c0fcSR0ronoa bus: Option<Weak<dyn Bus>>, 36*4256da7fSLoGin class: Option<Weak<dyn Class>>, 379993c0fcSR0ronoa driver: Option<Weak<dyn Driver>>, 389993c0fcSR0ronoa kern_inode: Option<Arc<KernFSInode>>, 399993c0fcSR0ronoa parent: Option<Weak<dyn KObject>>, 409993c0fcSR0ronoa kset: Option<Arc<KSet>>, 419993c0fcSR0ronoa kobj_type: Option<&'static dyn KObjType>, 429993c0fcSR0ronoa } 439993c0fcSR0ronoa 449993c0fcSR0ronoa impl I8042AuxPort { 459993c0fcSR0ronoa pub const NAME: &'static str = "serio1"; 469993c0fcSR0ronoa pub fn new() -> Self { 479993c0fcSR0ronoa return Self { 489993c0fcSR0ronoa inner: SpinLock::new(InnerI8042AuxPort { 499993c0fcSR0ronoa bus: None, 509993c0fcSR0ronoa class: None, 519993c0fcSR0ronoa driver: None, 529993c0fcSR0ronoa kern_inode: None, 539993c0fcSR0ronoa parent: None, 549993c0fcSR0ronoa kset: None, 559993c0fcSR0ronoa kobj_type: None, 569993c0fcSR0ronoa }), 579993c0fcSR0ronoa kobj_state: LockedKObjectState::new(None), 589993c0fcSR0ronoa }; 599993c0fcSR0ronoa } 609993c0fcSR0ronoa } 619993c0fcSR0ronoa 629993c0fcSR0ronoa impl Device for I8042AuxPort { 639993c0fcSR0ronoa fn dev_type(&self) -> DeviceType { 649993c0fcSR0ronoa DeviceType::Char 659993c0fcSR0ronoa } 669993c0fcSR0ronoa 679993c0fcSR0ronoa fn id_table(&self) -> IdTable { 689993c0fcSR0ronoa IdTable::new(self.name(), None) 699993c0fcSR0ronoa } 709993c0fcSR0ronoa 719993c0fcSR0ronoa fn bus(&self) -> Option<Weak<dyn Bus>> { 729993c0fcSR0ronoa self.inner.lock().bus.clone() 739993c0fcSR0ronoa } 749993c0fcSR0ronoa 759993c0fcSR0ronoa fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 769993c0fcSR0ronoa self.inner.lock().bus = bus; 779993c0fcSR0ronoa } 789993c0fcSR0ronoa 79*4256da7fSLoGin fn set_class(&self, class: Option<Weak<dyn Class>>) { 809993c0fcSR0ronoa self.inner.lock().class = class; 819993c0fcSR0ronoa } 829993c0fcSR0ronoa 83*4256da7fSLoGin fn class(&self) -> Option<Arc<dyn Class>> { 84*4256da7fSLoGin let mut guard = self.inner.lock(); 85*4256da7fSLoGin let r = guard.class.clone()?.upgrade(); 86*4256da7fSLoGin if r.is_none() { 87*4256da7fSLoGin guard.class = None; 88*4256da7fSLoGin } 89*4256da7fSLoGin return r; 90*4256da7fSLoGin } 91*4256da7fSLoGin 929993c0fcSR0ronoa fn driver(&self) -> Option<Arc<dyn Driver>> { 939993c0fcSR0ronoa self.inner.lock().driver.clone()?.upgrade() 949993c0fcSR0ronoa } 959993c0fcSR0ronoa 969993c0fcSR0ronoa fn set_driver(&self, driver: Option<Weak<dyn Driver>>) { 979993c0fcSR0ronoa self.inner.lock().driver = driver; 989993c0fcSR0ronoa } 999993c0fcSR0ronoa 1009993c0fcSR0ronoa fn is_dead(&self) -> bool { 1019993c0fcSR0ronoa false 1029993c0fcSR0ronoa } 1039993c0fcSR0ronoa 1049993c0fcSR0ronoa fn can_match(&self) -> bool { 1059993c0fcSR0ronoa true 1069993c0fcSR0ronoa } 1079993c0fcSR0ronoa 1089993c0fcSR0ronoa fn set_can_match(&self, _can_match: bool) {} 1099993c0fcSR0ronoa 1109993c0fcSR0ronoa fn state_synced(&self) -> bool { 1119993c0fcSR0ronoa true 1129993c0fcSR0ronoa } 1139993c0fcSR0ronoa } 1149993c0fcSR0ronoa 1159993c0fcSR0ronoa impl KObject for I8042AuxPort { 1169993c0fcSR0ronoa fn as_any_ref(&self) -> &dyn core::any::Any { 1179993c0fcSR0ronoa self 1189993c0fcSR0ronoa } 1199993c0fcSR0ronoa 1209993c0fcSR0ronoa fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 1219993c0fcSR0ronoa self.inner.lock().kern_inode = inode; 1229993c0fcSR0ronoa } 1239993c0fcSR0ronoa 1249993c0fcSR0ronoa fn inode(&self) -> Option<Arc<KernFSInode>> { 1259993c0fcSR0ronoa self.inner.lock().kern_inode.clone() 1269993c0fcSR0ronoa } 1279993c0fcSR0ronoa 1289993c0fcSR0ronoa fn parent(&self) -> Option<Weak<dyn KObject>> { 1299993c0fcSR0ronoa self.inner.lock().parent.clone() 1309993c0fcSR0ronoa } 1319993c0fcSR0ronoa 1329993c0fcSR0ronoa fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 1339993c0fcSR0ronoa self.inner.lock().parent = parent; 1349993c0fcSR0ronoa } 1359993c0fcSR0ronoa 1369993c0fcSR0ronoa fn kset(&self) -> Option<Arc<KSet>> { 1379993c0fcSR0ronoa self.inner.lock().kset.clone() 1389993c0fcSR0ronoa } 1399993c0fcSR0ronoa 1409993c0fcSR0ronoa fn set_kset(&self, kset: Option<Arc<KSet>>) { 1419993c0fcSR0ronoa self.inner.lock().kset = kset; 1429993c0fcSR0ronoa } 1439993c0fcSR0ronoa 1449993c0fcSR0ronoa fn kobj_type(&self) -> Option<&'static dyn KObjType> { 1459993c0fcSR0ronoa self.inner.lock().kobj_type 1469993c0fcSR0ronoa } 1479993c0fcSR0ronoa 1489993c0fcSR0ronoa fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 1499993c0fcSR0ronoa self.inner.lock().kobj_type = ktype; 1509993c0fcSR0ronoa } 1519993c0fcSR0ronoa 1529993c0fcSR0ronoa fn name(&self) -> String { 1539993c0fcSR0ronoa Self::NAME.to_string() 1549993c0fcSR0ronoa } 1559993c0fcSR0ronoa 1569993c0fcSR0ronoa fn set_name(&self, _name: String) { 1579993c0fcSR0ronoa // do nothing 1589993c0fcSR0ronoa } 1599993c0fcSR0ronoa 1609993c0fcSR0ronoa fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 1619993c0fcSR0ronoa self.kobj_state.read() 1629993c0fcSR0ronoa } 1639993c0fcSR0ronoa 1649993c0fcSR0ronoa fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 1659993c0fcSR0ronoa self.kobj_state.write() 1669993c0fcSR0ronoa } 1679993c0fcSR0ronoa 1689993c0fcSR0ronoa fn set_kobj_state(&self, state: KObjectState) { 1699993c0fcSR0ronoa *self.kobj_state.write() = state; 1709993c0fcSR0ronoa } 1719993c0fcSR0ronoa } 1729993c0fcSR0ronoa 1739993c0fcSR0ronoa impl SerioDevice for I8042AuxPort { 1749993c0fcSR0ronoa // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#387 1759993c0fcSR0ronoa fn write(&self, _device: &Arc<dyn SerioDevice>, _data: u8) -> Result<(), SystemError> { 1769993c0fcSR0ronoa todo!() 1779993c0fcSR0ronoa } 1789993c0fcSR0ronoa 1799993c0fcSR0ronoa fn open(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> { 1809993c0fcSR0ronoa Ok(()) 1819993c0fcSR0ronoa } 1829993c0fcSR0ronoa 1839993c0fcSR0ronoa fn close(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> { 1849993c0fcSR0ronoa Ok(()) 1859993c0fcSR0ronoa } 1869993c0fcSR0ronoa 1879993c0fcSR0ronoa fn start(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> { 1889993c0fcSR0ronoa i8042_start(device) 1899993c0fcSR0ronoa } 1909993c0fcSR0ronoa 1919993c0fcSR0ronoa fn stop(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> { 1929993c0fcSR0ronoa i8042_stop(device) 1939993c0fcSR0ronoa } 1949993c0fcSR0ronoa } 195