mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 15:03:52 +08:00
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: Benno 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: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -425,12 +425,7 @@ impl Device<device::Core> {
|
||||
// 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 {
|
||||
|
||||
@@ -10,7 +10,7 @@ use crate::{
|
||||
of,
|
||||
prelude::*,
|
||||
str::CStr,
|
||||
types::{ARef, ForeignOwnable, Opaque},
|
||||
types::{ForeignOwnable, Opaque},
|
||||
ThisModule,
|
||||
};
|
||||
|
||||
@@ -192,12 +192,7 @@ impl 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 {
|
||||
|
||||
Reference in New Issue
Block a user