Commit fbb92b6a authored by Danilo Krummrich's avatar Danilo Krummrich
Browse files

rust: device: implement impl_device_context_into_aref!



Implement a macro to implement all From conversions of a certain device
to ARef<Device>.

This avoids unnecessary boiler plate code for every device
implementation.

Reviewed-by: default avatarBenno Lossin <benno.lossin@proton.me>
Link: https://lore.kernel.org/r/20250413173758.12068-3-dakr@kernel.org


[ Add missing `::` prefix in macros. - Danilo ]
Signed-off-by: default avatarDanilo Krummrich <dakr@kernel.org>
parent cb271c2e
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -279,6 +279,27 @@ macro_rules! impl_device_context_deref {
    };
}

#[doc(hidden)]
#[macro_export]
macro_rules! __impl_device_context_into_aref {
    ($src:ty, $device:tt) => {
        impl ::core::convert::From<&$device<$src>> for $crate::types::ARef<$device> {
            fn from(dev: &$device<$src>) -> Self {
                (&**dev).into()
            }
        }
    };
}

/// Implement [`core::convert::From`], such that all `&Device<Ctx>` can be converted to an
/// `ARef<Device>`.
#[macro_export]
macro_rules! impl_device_context_into_aref {
    ($device:tt) => {
        ::kernel::__impl_device_context_into_aref!($crate::device::Core, $device);
    };
}

#[doc(hidden)]
#[macro_export]
macro_rules! dev_printk {
+1 −6
Original line number Diff line number Diff line
@@ -425,12 +425,7 @@ pub fn set_master(&self) {
// SAFETY: `Device` is a transparent wrapper of a type that doesn't depend on `Device`'s generic
// argument.
kernel::impl_device_context_deref!(unsafe { Device });

impl From<&Device<device::Core>> for ARef<Device> {
    fn from(dev: &Device<device::Core>) -> Self {
        (&**dev).into()
    }
}
kernel::impl_device_context_into_aref!(Device);

// SAFETY: Instances of `Device` are always reference-counted.
unsafe impl crate::types::AlwaysRefCounted for Device {
+2 −7
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@
    of,
    prelude::*,
    str::CStr,
    types::{ARef, ForeignOwnable, Opaque},
    types::{ForeignOwnable, Opaque},
    ThisModule,
};

@@ -192,12 +192,7 @@ fn as_raw(&self) -> *mut bindings::platform_device {
// SAFETY: `Device` is a transparent wrapper of a type that doesn't depend on `Device`'s generic
// argument.
kernel::impl_device_context_deref!(unsafe { Device });

impl From<&Device<device::Core>> for ARef<Device> {
    fn from(dev: &Device<device::Core>) -> Self {
        (&**dev).into()
    }
}
kernel::impl_device_context_into_aref!(Device);

// SAFETY: Instances of `Device` are always reference-counted.
unsafe impl crate::types::AlwaysRefCounted for Device {