1a03c4f9dSLoGin use alloc::sync::Arc;
22a7d773dSTingHuang
391e9d4abSLoGin use crate::driver::base::device::{
4a03c4f9dSLoGin bus::Bus,
5a03c4f9dSLoGin driver::{driver_manager, Driver},
6a03c4f9dSLoGin };
7b087521eSChiichen
891e9d4abSLoGin use system_error::SystemError;
991e9d4abSLoGin
10a03c4f9dSLoGin use super::{platform_bus, platform_device::PlatformDevice};
11a03c4f9dSLoGin
122a7d773dSTingHuang /// @brief: 实现该trait的设备驱动实例应挂载在platform总线上,
132a7d773dSTingHuang /// 同时应该实现Driver trait
14a03c4f9dSLoGin ///
15a03c4f9dSLoGin /// ## 注意
16a03c4f9dSLoGin ///
17a03c4f9dSLoGin /// 应当在所有实现这个trait的结构体上方,添加 `#[cast_to([sync] PlatformDriver)]`,
18a03c4f9dSLoGin /// 否则运行时将报错“该对象不是PlatformDriver”
19*bd70d2d1SLoGin #[allow(dead_code)]
202a7d773dSTingHuang pub trait PlatformDriver: Driver {
21a03c4f9dSLoGin /// 检测设备是否能绑定到这个驱动
22a03c4f9dSLoGin ///
23c566df45SLoGin /// 如果能,则把设备的driver字段指向这个驱动。
24a03c4f9dSLoGin /// 请注意,这个函数不应该把driver加入驱动的devices列表,相关工作会在外部的函数里面处理。
probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>25a03c4f9dSLoGin fn probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>;
remove(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>26a03c4f9dSLoGin fn remove(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>;
shutdown(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>27a03c4f9dSLoGin fn shutdown(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>;
suspend(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>28a03c4f9dSLoGin fn suspend(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>;
resume(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>29a03c4f9dSLoGin fn resume(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError>;
30b087521eSChiichen }
31a03c4f9dSLoGin
32a03c4f9dSLoGin #[inline(always)]
platform_driver_manager() -> &'static PlatformDriverManager33a03c4f9dSLoGin pub fn platform_driver_manager() -> &'static PlatformDriverManager {
34a03c4f9dSLoGin &PlatformDriverManager
35a03c4f9dSLoGin }
36a03c4f9dSLoGin
37a03c4f9dSLoGin #[derive(Debug)]
38a03c4f9dSLoGin pub struct PlatformDriverManager;
39a03c4f9dSLoGin
40a03c4f9dSLoGin impl PlatformDriverManager {
41a03c4f9dSLoGin /// 注册平台设备驱动
42a03c4f9dSLoGin ///
43e7071df6SLoGin /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/platform.c?fi=__platform_driver_register#861
register(&self, driver: Arc<dyn PlatformDriver>) -> Result<(), SystemError>44a03c4f9dSLoGin pub fn register(&self, driver: Arc<dyn PlatformDriver>) -> Result<(), SystemError> {
45c566df45SLoGin driver.set_bus(Some(Arc::downgrade(&(platform_bus() as Arc<dyn Bus>))));
46a03c4f9dSLoGin return driver_manager().register(driver as Arc<dyn Driver>);
47a03c4f9dSLoGin }
48a03c4f9dSLoGin
49a03c4f9dSLoGin /// 卸载平台设备驱动
50a03c4f9dSLoGin #[allow(dead_code)]
unregister(&self, driver: &Arc<dyn PlatformDriver>)51a03c4f9dSLoGin pub fn unregister(&self, driver: &Arc<dyn PlatformDriver>) {
52a03c4f9dSLoGin driver_manager().unregister(&(driver.clone() as Arc<dyn Driver>));
53b087521eSChiichen }
542a7d773dSTingHuang }
55