New version of ThisModule is trait which can be passed in const context. To have unified way to pass THIS_MODULE to abstactions have const parameter which can be used to get owner and name.
Signed-off-by: Kari Argillander <[email protected]> --- rust/kernel/auxiliary.rs | 16 ++++++++-------- rust/kernel/driver.rs | 29 +++++++++++++---------------- rust/kernel/i2c.rs | 11 ++++------- rust/kernel/pci.rs | 15 +++++---------- rust/kernel/platform.rs | 12 ++++-------- rust/kernel/usb.rs | 13 ++++--------- samples/rust/rust_driver_auxiliary.rs | 6 +++--- 7 files changed, 41 insertions(+), 61 deletions(-) diff --git a/rust/kernel/auxiliary.rs b/rust/kernel/auxiliary.rs index 56f3c180e8f6..102b0349af16 100644 --- a/rust/kernel/auxiliary.rs +++ b/rust/kernel/auxiliary.rs @@ -11,8 +11,8 @@ driver, error::{from_result, to_result, Result}, prelude::*, + this_module::ThisModule, types::Opaque, - ThisModule, }; use core::{ marker::PhantomData, @@ -28,14 +28,10 @@ unsafe impl<T: Driver + 'static> driver::RegistrationOps for Adapter<T> { type RegType = bindings::auxiliary_driver; - unsafe fn register( - adrv: &Opaque<Self::RegType>, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register<TM: ThisModule>(adrv: &Opaque<Self::RegType>) -> Result { // SAFETY: It's safe to set the fields of `struct auxiliary_driver` on initialization. unsafe { - (*adrv.get()).name = name.as_char_ptr(); + (*adrv.get()).name = TM::NAME.as_char_ptr(); (*adrv.get()).probe = Some(Self::probe_callback); (*adrv.get()).remove = Some(Self::remove_callback); (*adrv.get()).id_table = T::ID_TABLE.as_ptr(); @@ -43,7 +39,11 @@ unsafe fn register( // SAFETY: `adrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::__auxiliary_driver_register(adrv.get(), module.0, name.as_char_ptr()) + bindings::__auxiliary_driver_register( + adrv.get(), + TM::OWNER.as_ptr(), + TM::NAME.as_char_ptr(), + ) }) } diff --git a/rust/kernel/driver.rs b/rust/kernel/driver.rs index 649d06468f41..dc7522c4ebda 100644 --- a/rust/kernel/driver.rs +++ b/rust/kernel/driver.rs @@ -94,10 +94,14 @@ //! [`device_id`]: kernel::device_id //! [`module_driver`]: kernel::module_driver -use crate::error::{Error, Result}; -use crate::{acpi, device, of, str::CStr, try_pin_init, types::Opaque, ThisModule}; -use core::pin::Pin; -use pin_init::{pin_data, pinned_drop, PinInit}; +use crate::{ + acpi, + device, + of, + prelude::*, + this_module::ThisModule, + types::Opaque, // +}; /// The [`RegistrationOps`] trait serves as generic interface for subsystems (e.g., PCI, Platform, /// Amba, etc.) to provide the corresponding subsystem specific implementation to register / @@ -122,11 +126,7 @@ pub unsafe trait RegistrationOps { /// /// On success, `reg` must remain pinned and valid until the matching call to /// [`RegistrationOps::unregister`]. - unsafe fn register( - reg: &Opaque<Self::RegType>, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result; + unsafe fn register<TM: ThisModule>(reg: &Opaque<Self::RegType>) -> Result; /// Unregisters a driver previously registered with [`RegistrationOps::register`]. /// @@ -159,7 +159,7 @@ unsafe impl<T: RegistrationOps> Send for Registration<T> {} impl<T: RegistrationOps> Registration<T> { /// Creates a new instance of the registration object. - pub fn new(name: &'static CStr, module: &'static ThisModule) -> impl PinInit<Self, Error> { + pub fn new<TM: ThisModule>() -> impl PinInit<Self, Error> { try_pin_init!(Self { reg <- Opaque::try_ffi_init(|ptr: *mut T::RegType| { // SAFETY: `try_ffi_init` guarantees that `ptr` is valid for write. @@ -170,7 +170,7 @@ pub fn new(name: &'static CStr, module: &'static ThisModule) -> impl PinInit<Sel let drv = unsafe { &*(ptr as *const Opaque<T::RegType>) }; // SAFETY: `drv` is guaranteed to be pinned until `T::unregister`. - unsafe { T::register(drv, name, module) } + unsafe { T::register::<TM>(drv) } }), }) } @@ -202,13 +202,10 @@ struct DriverModule { impl $crate::InPlaceModule for DriverModule { fn init( - module: &'static $crate::ThisModule + _module: &'static $crate::ThisModule ) -> impl ::pin_init::PinInit<Self, $crate::error::Error> { $crate::try_pin_init!(Self { - _driver <- $crate::driver::Registration::new( - <Self as $crate::ModuleMetadata>::NAME, - module, - ), + _driver <- $crate::driver::Registration::new::<crate::THIS_MODULE>(), }) } } diff --git a/rust/kernel/i2c.rs b/rust/kernel/i2c.rs index 491e6cc25cf4..b23a26a445cd 100644 --- a/rust/kernel/i2c.rs +++ b/rust/kernel/i2c.rs @@ -16,6 +16,7 @@ error::*, of, prelude::*, + this_module::ThisModule, types::{ AlwaysRefCounted, Opaque, // @@ -97,11 +98,7 @@ macro_rules! i2c_device_table { unsafe impl<T: Driver + 'static> driver::RegistrationOps for Adapter<T> { type RegType = bindings::i2c_driver; - unsafe fn register( - idrv: &Opaque<Self::RegType>, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register<TM: ThisModule>(idrv: &Opaque<Self::RegType>) -> Result { build_assert!( T::ACPI_ID_TABLE.is_some() || T::OF_ID_TABLE.is_some() || T::I2C_ID_TABLE.is_some(), "At least one of ACPI/OF/Legacy tables must be present when registering an i2c driver" @@ -124,7 +121,7 @@ unsafe fn register( // SAFETY: It's safe to set the fields of `struct i2c_client` on initialization. unsafe { - (*idrv.get()).driver.name = name.as_char_ptr(); + (*idrv.get()).driver.name = TM::NAME.as_char_ptr(); (*idrv.get()).probe = Some(Self::probe_callback); (*idrv.get()).remove = Some(Self::remove_callback); (*idrv.get()).shutdown = Some(Self::shutdown_callback); @@ -134,7 +131,7 @@ unsafe fn register( } // SAFETY: `idrv` is guaranteed to be a valid `RegType`. - to_result(unsafe { bindings::i2c_register_driver(module.0, idrv.get()) }) + to_result(unsafe { bindings::i2c_register_driver(TM::OWNER.as_ptr(), idrv.get()) }) } unsafe fn unregister(idrv: &Opaque<Self::RegType>) { diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs index 82e128431f08..88a5416fb44b 100644 --- a/rust/kernel/pci.rs +++ b/rust/kernel/pci.rs @@ -18,9 +18,8 @@ to_result, // }, prelude::*, - str::CStr, - types::Opaque, - ThisModule, // + this_module::ThisModule, + types::Opaque, // }; use core::{ marker::PhantomData, @@ -55,14 +54,10 @@ unsafe impl<T: Driver + 'static> driver::RegistrationOps for Adapter<T> { type RegType = bindings::pci_driver; - unsafe fn register( - pdrv: &Opaque<Self::RegType>, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register<TM: ThisModule>(pdrv: &Opaque<Self::RegType>) -> Result { // SAFETY: It's safe to set the fields of `struct pci_driver` on initialization. unsafe { - (*pdrv.get()).name = name.as_char_ptr(); + (*pdrv.get()).name = TM::NAME.as_char_ptr(); (*pdrv.get()).probe = Some(Self::probe_callback); (*pdrv.get()).remove = Some(Self::remove_callback); (*pdrv.get()).id_table = T::ID_TABLE.as_ptr(); @@ -70,7 +65,7 @@ unsafe fn register( // SAFETY: `pdrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::__pci_register_driver(pdrv.get(), module.0, name.as_char_ptr()) + bindings::__pci_register_driver(pdrv.get(), TM::OWNER.as_ptr(), TM::NAME.as_char_ptr()) }) } diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs index bddb593cee7b..a4678af3b891 100644 --- a/rust/kernel/platform.rs +++ b/rust/kernel/platform.rs @@ -13,8 +13,8 @@ irq::{self, IrqRequest}, of, prelude::*, + this_module::ThisModule, types::Opaque, - ThisModule, }; use core::{ @@ -31,11 +31,7 @@ unsafe impl<T: Driver + 'static> driver::RegistrationOps for Adapter<T> { type RegType = bindings::platform_driver; - unsafe fn register( - pdrv: &Opaque<Self::RegType>, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register<TM: ThisModule>(pdrv: &Opaque<Self::RegType>) -> Result { let of_table = match T::OF_ID_TABLE { Some(table) => table.as_ptr(), None => core::ptr::null(), @@ -48,7 +44,7 @@ unsafe fn register( // SAFETY: It's safe to set the fields of `struct platform_driver` on initialization. unsafe { - (*pdrv.get()).driver.name = name.as_char_ptr(); + (*pdrv.get()).driver.name = TM::NAME.as_char_ptr(); (*pdrv.get()).probe = Some(Self::probe_callback); (*pdrv.get()).remove = Some(Self::remove_callback); (*pdrv.get()).driver.of_match_table = of_table; @@ -56,7 +52,7 @@ unsafe fn register( } // SAFETY: `pdrv` is guaranteed to be a valid `RegType`. - to_result(unsafe { bindings::__platform_driver_register(pdrv.get(), module.0) }) + to_result(unsafe { bindings::__platform_driver_register(pdrv.get(), TM::OWNER.as_ptr()) }) } unsafe fn unregister(pdrv: &Opaque<Self::RegType>) { diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs index d10b65e9fb6a..e7e07360f953 100644 --- a/rust/kernel/usb.rs +++ b/rust/kernel/usb.rs @@ -11,9 +11,8 @@ driver, error::{from_result, to_result, Result}, prelude::*, - str::CStr, + this_module::ThisModule, types::{AlwaysRefCounted, Opaque}, - ThisModule, }; use core::{ marker::PhantomData, @@ -32,14 +31,10 @@ unsafe impl<T: Driver + 'static> driver::RegistrationOps for Adapter<T> { type RegType = bindings::usb_driver; - unsafe fn register( - udrv: &Opaque<Self::RegType>, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register<TM: ThisModule>(udrv: &Opaque<Self::RegType>) -> Result { // SAFETY: It's safe to set the fields of `struct usb_driver` on initialization. unsafe { - (*udrv.get()).name = name.as_char_ptr(); + (*udrv.get()).name = TM::NAME.as_char_ptr(); (*udrv.get()).probe = Some(Self::probe_callback); (*udrv.get()).disconnect = Some(Self::disconnect_callback); (*udrv.get()).id_table = T::ID_TABLE.as_ptr(); @@ -47,7 +42,7 @@ unsafe fn register( // SAFETY: `udrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::usb_register_driver(udrv.get(), module.0, name.as_char_ptr()) + bindings::usb_register_driver(udrv.get(), TM::OWNER.as_ptr(), TM::NAME.as_char_ptr()) }) } diff --git a/samples/rust/rust_driver_auxiliary.rs b/samples/rust/rust_driver_auxiliary.rs index 1e4fb23cfcb0..28a25e540298 100644 --- a/samples/rust/rust_driver_auxiliary.rs +++ b/samples/rust/rust_driver_auxiliary.rs @@ -111,10 +111,10 @@ struct SampleModule { } impl InPlaceModule for SampleModule { - fn init(module: &'static kernel::ThisModule) -> impl PinInit<Self, Error> { + fn init(_module: &'static kernel::ThisModule) -> impl PinInit<Self, Error> { try_pin_init!(Self { - _pci_driver <- driver::Registration::new(MODULE_NAME, module), - _aux_driver <- driver::Registration::new(MODULE_NAME, module), + _pci_driver <- driver::Registration::new::<THIS_MODULE>(), + _aux_driver <- driver::Registration::new::<THIS_MODULE>(), }) } } -- 2.43.0

