xref: /DragonOS/kernel/src/driver/input/serio/subsys.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a)
1 use alloc::{
2     string::{String, ToString},
3     sync::{Arc, Weak},
4 };
5 use intertrait::cast::CastArc;
6 use log::error;
7 use system_error::SystemError;
8 
9 use crate::{
10     driver::{
11         acpi::acpi_manager,
12         base::{
13             device::{bus::Bus, driver::Driver, Device},
14             kobject::KObject,
15             subsys::SubSysPrivate,
16         },
17     },
18     filesystem::{
19         sysfs::{Attribute, AttributeGroup},
20         vfs::syscall::ModeType,
21     },
22 };
23 
24 use super::{serio_device::SerioDevice, serio_driver::SerioDriver};
25 
26 #[derive(Debug)]
27 pub struct SerioBus {
28     private: SubSysPrivate,
29 }
30 
31 impl SerioBus {
new() -> Arc<Self>32     pub fn new() -> Arc<Self> {
33         let w: Weak<Self> = Weak::new();
34         let private = SubSysPrivate::new("serio".to_string(), Some(w), None, &[]);
35         let bus = Arc::new(Self { private });
36         bus.subsystem()
37             .set_bus(Some(Arc::downgrade(&(bus.clone() as Arc<dyn Bus>))));
38 
39         return bus;
40     }
41 }
42 
43 impl Bus for SerioBus {
name(&self) -> String44     fn name(&self) -> String {
45         return "serio".to_string();
46     }
47 
dev_name(&self) -> String48     fn dev_name(&self) -> String {
49         return self.name();
50     }
51 
dev_groups(&self) -> &'static [&'static dyn AttributeGroup]52     fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] {
53         return &[&SerioDeviceAttrGroup];
54     }
55 
subsystem(&self) -> &SubSysPrivate56     fn subsystem(&self) -> &SubSysPrivate {
57         return &self.private;
58     }
59 
probe(&self, device: &Arc<dyn Device>) -> Result<(), SystemError>60     fn probe(&self, device: &Arc<dyn Device>) -> Result<(), SystemError> {
61         let drv = device.driver().ok_or(SystemError::EINVAL)?;
62         let pdrv = drv.cast::<dyn SerioDriver>().map_err(|_| {
63             error!(
64                 "SerioBus::probe() failed: device.driver() is not a SerioDriver. Device: '{:?}'",
65                 device.name()
66             );
67             SystemError::EINVAL
68         })?;
69 
70         let pdev = device.clone().cast::<dyn SerioDevice>().map_err(|_| {
71             error!(
72                 "SerioBus::probe() failed: device is not a SerioDevice. Device: '{:?}'",
73                 device.name()
74             );
75             SystemError::EINVAL
76         })?;
77 
78         return pdrv.connect(&pdev);
79     }
80 
remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>81     fn remove(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
82         todo!()
83     }
84 
sync_state(&self, _device: &Arc<dyn Device>)85     fn sync_state(&self, _device: &Arc<dyn Device>) {
86         todo!()
87     }
88 
shutdown(&self, _device: &Arc<dyn Device>)89     fn shutdown(&self, _device: &Arc<dyn Device>) {
90         todo!()
91     }
92 
resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError>93     fn resume(&self, _device: &Arc<dyn Device>) -> Result<(), SystemError> {
94         todo!()
95     }
96 
match_device( &self, device: &Arc<dyn Device>, driver: &Arc<dyn Driver>, ) -> Result<bool, SystemError>97     fn match_device(
98         &self,
99         device: &Arc<dyn Device>,
100         driver: &Arc<dyn Driver>,
101     ) -> Result<bool, SystemError> {
102         // 尝试从 ACPI 中匹配
103         if let Ok(x) = acpi_manager().driver_match_device(driver, device) {
104             if x {
105                 return Ok(true);
106             }
107         }
108 
109         // 尝试从 ID table 中匹配
110         if let Some(drv_id_table) = driver.id_table() {
111             let pdev = device
112                 .clone()
113                 .cast::<dyn SerioDevice>()
114                 .map_err(|_| SystemError::EINVAL)?;
115             if drv_id_table.name().eq(&pdev.name()) {
116                 return Ok(true);
117             }
118         }
119 
120         // 尝试根据设备名称匹配
121         return Ok(device.name().eq(&driver.name()));
122     }
123 }
124 
125 #[derive(Debug)]
126 pub struct SerioDeviceAttrGroup;
127 
128 impl AttributeGroup for SerioDeviceAttrGroup {
name(&self) -> Option<&str>129     fn name(&self) -> Option<&str> {
130         None
131     }
132 
133     /// todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#473
attrs(&self) -> &[&'static dyn Attribute]134     fn attrs(&self) -> &[&'static dyn Attribute] {
135         return &[];
136     }
137 
is_visible(&self, _kobj: Arc<dyn KObject>, _attr: &dyn Attribute) -> Option<ModeType>138     fn is_visible(&self, _kobj: Arc<dyn KObject>, _attr: &dyn Attribute) -> Option<ModeType> {
139         None
140     }
141 }
142