1 use alloc::{
2 string::{String, ToString},
3 sync::{Arc, Weak},
4 vec::Vec,
5 };
6 use intertrait::cast::CastArc;
7 use system_error::SystemError;
8 use unified_init::macros::unified_init;
9
10 use super::{
11 class::rtc_register_device,
12 sysfs::{rtc_general_device_create, RtcGeneralDevice},
13 RtcClassOps, RtcDevice, RtcTime,
14 };
15 use crate::{
16 driver::base::{
17 device::{
18 bus::Bus,
19 driver::{Driver, DriverCommonData},
20 Device, IdTable,
21 },
22 kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
23 kset::KSet,
24 platform::{
25 platform_device::PlatformDevice,
26 platform_driver::{platform_driver_manager, PlatformDriver},
27 },
28 },
29 filesystem::kernfs::KernFSInode,
30 init::initcall::INITCALL_DEVICE,
31 libs::{
32 rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
33 spinlock::{SpinLock, SpinLockGuard},
34 },
35 };
36
37 static CMOS_RTC_GENERAL_DEVICE: RwLock<Option<Arc<RtcGeneralDevice>>> = RwLock::new(None);
38
39 #[derive(Debug)]
40 #[cast_to([sync] Driver, PlatformDriver)]
41 struct CmosPlatformDriver {
42 inner: SpinLock<InnerCmosPlatformDriver>,
43 locked_kobjstate: LockedKObjectState,
44 }
45
46 impl CmosPlatformDriver {
47 const NAME: &str = "rtc_cmos";
48
new() -> Arc<Self>49 fn new() -> Arc<Self> {
50 Arc::new(CmosPlatformDriver {
51 inner: SpinLock::new(InnerCmosPlatformDriver {
52 driver_common: DriverCommonData::default(),
53 kobject_common: KObjectCommonData::default(),
54 }),
55 locked_kobjstate: LockedKObjectState::new(None),
56 })
57 }
58
inner(&self) -> SpinLockGuard<InnerCmosPlatformDriver>59 fn inner(&self) -> SpinLockGuard<InnerCmosPlatformDriver> {
60 self.inner.lock()
61 }
62 }
63
64 #[derive(Debug)]
65 struct InnerCmosPlatformDriver {
66 driver_common: DriverCommonData,
67 kobject_common: KObjectCommonData,
68 }
69
70 impl PlatformDriver for CmosPlatformDriver {
probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>71 fn probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
72 let dev = device
73 .clone()
74 .arc_any()
75 .cast::<dyn RtcDevice>()
76 .map_err(|_| SystemError::ENODEV)?;
77
78 if dev.id_table() != self.id_table().unwrap() {
79 return Err(SystemError::ENODEV);
80 }
81
82 if CMOS_RTC_GENERAL_DEVICE.read().is_some() {
83 return Err(SystemError::EBUSY);
84 }
85
86 let mut guard = CMOS_RTC_GENERAL_DEVICE.write();
87
88 // 再次检查
89 if guard.is_some() {
90 return Err(SystemError::EBUSY);
91 }
92
93 let general_rtc_device: Arc<RtcGeneralDevice> = rtc_general_device_create(&dev, None);
94 guard.replace(general_rtc_device.clone());
95
96 general_rtc_device.set_class_ops(&CmosRtcClassOps);
97 drop(guard);
98
99 rtc_register_device(&general_rtc_device)
100 .expect("cmos_rtc: register general rtc device failed");
101
102 return Ok(());
103 }
104
remove(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>105 fn remove(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
106 // todo: remove
107 Err(SystemError::ENOSYS)
108 }
109
shutdown(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>110 fn shutdown(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
111 unimplemented!("cmos platform driver shutdown")
112 }
113
suspend(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>114 fn suspend(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
115 todo!("cmos platform driver suspend")
116 }
117
resume(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>118 fn resume(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
119 todo!("cmos platform driver resume")
120 }
121 }
122
123 impl Driver for CmosPlatformDriver {
id_table(&self) -> Option<IdTable>124 fn id_table(&self) -> Option<IdTable> {
125 Some(IdTable::new(Self::NAME.to_string(), None))
126 }
127
devices(&self) -> Vec<Arc<dyn Device>>128 fn devices(&self) -> Vec<Arc<dyn Device>> {
129 self.inner().driver_common.devices.clone()
130 }
131
add_device(&self, device: Arc<dyn Device>)132 fn add_device(&self, device: Arc<dyn Device>) {
133 self.inner().driver_common.push_device(device);
134 }
135
delete_device(&self, device: &Arc<dyn Device>)136 fn delete_device(&self, device: &Arc<dyn Device>) {
137 self.inner().driver_common.delete_device(device);
138 }
139
set_bus(&self, bus: Option<Weak<dyn Bus>>)140 fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
141 self.inner().driver_common.bus = bus;
142 }
143
bus(&self) -> Option<Weak<dyn Bus>>144 fn bus(&self) -> Option<Weak<dyn Bus>> {
145 self.inner().driver_common.bus.clone()
146 }
147 }
148
149 impl KObject for CmosPlatformDriver {
as_any_ref(&self) -> &dyn core::any::Any150 fn as_any_ref(&self) -> &dyn core::any::Any {
151 self
152 }
153
set_inode(&self, inode: Option<Arc<KernFSInode>>)154 fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
155 self.inner().kobject_common.kern_inode = inode;
156 }
157
inode(&self) -> Option<Arc<KernFSInode>>158 fn inode(&self) -> Option<Arc<KernFSInode>> {
159 self.inner().kobject_common.kern_inode.clone()
160 }
161
parent(&self) -> Option<Weak<dyn KObject>>162 fn parent(&self) -> Option<Weak<dyn KObject>> {
163 self.inner().kobject_common.parent.clone()
164 }
165
set_parent(&self, parent: Option<Weak<dyn KObject>>)166 fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
167 self.inner().kobject_common.parent = parent;
168 }
169
kset(&self) -> Option<Arc<KSet>>170 fn kset(&self) -> Option<Arc<KSet>> {
171 self.inner().kobject_common.kset.clone()
172 }
173
set_kset(&self, kset: Option<Arc<KSet>>)174 fn set_kset(&self, kset: Option<Arc<KSet>>) {
175 self.inner().kobject_common.kset = kset;
176 }
177
kobj_type(&self) -> Option<&'static dyn KObjType>178 fn kobj_type(&self) -> Option<&'static dyn KObjType> {
179 self.inner().kobject_common.kobj_type
180 }
181
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)182 fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
183 self.inner().kobject_common.kobj_type = ktype;
184 }
185
name(&self) -> String186 fn name(&self) -> String {
187 Self::NAME.to_string()
188 }
189
set_name(&self, _name: String)190 fn set_name(&self, _name: String) {
191 // do nothing
192 }
193
kobj_state(&self) -> RwLockReadGuard<KObjectState>194 fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
195 self.locked_kobjstate.read()
196 }
197
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>198 fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
199 self.locked_kobjstate.write()
200 }
201
set_kobj_state(&self, state: KObjectState)202 fn set_kobj_state(&self, state: KObjectState) {
203 *self.locked_kobjstate.write() = state;
204 }
205 }
206
207 #[unified_init(INITCALL_DEVICE)]
cmos_rtc_driver_init() -> Result<(), SystemError>208 pub fn cmos_rtc_driver_init() -> Result<(), SystemError> {
209 let driver = CmosPlatformDriver::new();
210
211 platform_driver_manager().register(driver)?;
212
213 return Ok(());
214 }
215
216 #[derive(Debug)]
217 struct CmosRtcClassOps;
218
219 impl RtcClassOps for CmosRtcClassOps {
read_time(&self, dev: &Arc<dyn RtcDevice>) -> Result<RtcTime, SystemError>220 fn read_time(&self, dev: &Arc<dyn RtcDevice>) -> Result<RtcTime, SystemError> {
221 dev.class_ops().read_time(dev)
222 }
223
set_time(&self, dev: &Arc<dyn RtcDevice>, time: &RtcTime) -> Result<(), SystemError>224 fn set_time(&self, dev: &Arc<dyn RtcDevice>, time: &RtcTime) -> Result<(), SystemError> {
225 dev.class_ops().set_time(dev, time)
226 }
227 }
228