xref: /DragonOS/kernel/src/driver/input/serio/i8042/i8042_driver.rs (revision 9993c0fc61e9603f631bd6748ff0b4fecb7bd483)
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