diff --git a/drivers/gpu/drm/rvkms/connector.rs b/drivers/gpu/drm/rvkms/connector.rs
index 40f84d38437ee1d191eb6ff45818807ea7aeae68..576afe0c080b047cf223e138b70b4281a662e4b3 100644
--- a/drivers/gpu/drm/rvkms/connector.rs
+++ b/drivers/gpu/drm/rvkms/connector.rs
@@ -1,7 +1,7 @@
 // TODO: License and stuff
 // Contain's rvkms's drm_connector implementation
 
-use super::{RvkmsDriver, RvkmsDevice, MAX_RES, DEFAULT_RES};
+use super::{Rvkms, RvkmsDevice, MAX_RES, DEFAULT_RES};
 use kernel::{
     prelude::*,
     drm::{
@@ -24,15 +24,13 @@ pub(crate) struct DriverConnector {
 pub(crate) type Connector = connector::Connector<DriverConnector>;
 
 impl connector::DriverConnector for DriverConnector {
-    type Initializer = impl PinInit<Self, Error>;
-
     type State = ConnectorState;
 
-    type Driver = RvkmsDriver;
+    type Driver = Rvkms;
 
     type Args = ();
 
-    fn new(dev: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer {
+    fn new(dev: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> {
         try_pin_init!(Self { _p: PhantomPinned })
     }
 
diff --git a/drivers/gpu/drm/rvkms/crtc.rs b/drivers/gpu/drm/rvkms/crtc.rs
index dd55ef2ebc72db54ebde0195bec4d2656f0ac079..3c8ff0a992d1bcb0669fbbd9b058909501b4811f 100644
--- a/drivers/gpu/drm/rvkms/crtc.rs
+++ b/drivers/gpu/drm/rvkms/crtc.rs
@@ -1,7 +1,7 @@
 // TODO: License and stuff
 // Contain's rvkms's drm_crtc implementation
 use core::marker::PhantomPinned;
-use super::{RvkmsDriver, plane::*};
+use super::{Rvkms, plane::*};
 use kernel::{
     prelude::*,
     drm::{
@@ -12,7 +12,6 @@ use kernel::{
             ModeObject,
         }
     },
-    device::RawDevice
 };
 
 pub(crate) type Crtc = crtc::Crtc<DriverCrtc>;
@@ -25,15 +24,13 @@ pub(crate) struct DriverCrtc {
 
 #[vtable]
 impl crtc::DriverCrtc for DriverCrtc {
-    type Initializer = impl PinInit<Self, Error>;
-
     type Args = ();
 
     type State = CrtcState;
 
-    type Driver = RvkmsDriver;
+    type Driver = Rvkms;
 
-    fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer {
+    fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> {
         try_pin_init!(Self { _p: PhantomPinned })
     }
 
diff --git a/drivers/gpu/drm/rvkms/encoder.rs b/drivers/gpu/drm/rvkms/encoder.rs
index 5c145ecfcb710c8067e92f7470ca54420f313fda..1174d512e48d48e79a97170a0f429cc790de66b8 100644
--- a/drivers/gpu/drm/rvkms/encoder.rs
+++ b/drivers/gpu/drm/rvkms/encoder.rs
@@ -5,7 +5,7 @@ use kernel::{
     types::ARef,
 };
 use crate::{
-    RvkmsDriver,
+    Rvkms,
     connector::Connector,
 };
 
@@ -19,13 +19,11 @@ pub(crate) struct DriverEncoder {
 pub(crate) type Encoder = kms::encoder::Encoder<DriverEncoder>;
 
 impl kms::encoder::DriverEncoder for DriverEncoder {
-    type Initializer = impl PinInit<Self, Error>;
-
-    type Driver = RvkmsDriver;
+    type Driver = Rvkms;
 
     type Args = ARef<Connector>;
 
-    fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer {
+    fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> {
         try_pin_init!(Self {
             connector: args,
             _p: PhantomPinned
diff --git a/drivers/gpu/drm/rvkms/file.rs b/drivers/gpu/drm/rvkms/file.rs
index 24b1b53b7823897f7e8b74d488f24faa8be2809d..baa9297673ecceb02b0a20964b32737a6e461c9f 100644
--- a/drivers/gpu/drm/rvkms/file.rs
+++ b/drivers/gpu/drm/rvkms/file.rs
@@ -1,4 +1,4 @@
-use super::RvkmsDriver;
+use super::Rvkms;
 
 use kernel::{
     drm::{
@@ -9,14 +9,14 @@ use kernel::{
 };
 use core::option::*;
 
-pub(crate) struct File();
+pub(crate) struct File;
 
 impl drm::file::DriverFile for File {
-    type Driver = RvkmsDriver;
+    type Driver = Rvkms;
 
     fn open(device: &DrmDevice<Self::Driver>) -> Result<Pin<Box<Self>>> {
         pr_info!("Someone opened a file! But I do not yet know which one...\n");
 
-        Ok(Box::into_pin(Box::try_new(Self())?))
+        Box::pin_init(init!(File { }), GFP_KERNEL)
     }
 }
diff --git a/drivers/gpu/drm/rvkms/gem.rs b/drivers/gpu/drm/rvkms/gem.rs
index b789a1c2170c7df65993b8032b3cfa5c85e88de3..950ef33758657de297e1a92517e030ec0ae9d2dd 100644
--- a/drivers/gpu/drm/rvkms/gem.rs
+++ b/drivers/gpu/drm/rvkms/gem.rs
@@ -1,4 +1,4 @@
-use crate::{RvkmsDriver, RvkmsDevice};
+use crate::{Rvkms, RvkmsDevice};
 use core::sync::atomic::{AtomicU64, Ordering};
 use kernel::{
     drm::{self, gem},
@@ -17,9 +17,7 @@ pub(crate) struct DriverObject {
 pub(crate) type Object = gem::shmem::Object<DriverObject>;
 
 impl gem::BaseDriverObject<Object> for DriverObject {
-    type Initializer = impl PinInit<Self, Error>;
-
-    fn new(dev: &RvkmsDevice, size: usize) -> Self::Initializer {
+    fn new(dev: &RvkmsDevice, size: usize) -> impl PinInit<Self, Error> {
         let id = GEM_ID.fetch_add(1, Ordering::Relaxed);
 
         pr_debug!("DriverObject::new id={id}\n");
@@ -28,5 +26,5 @@ impl gem::BaseDriverObject<Object> for DriverObject {
 }
 
 impl gem::shmem::DriverObject for DriverObject {
-    type Driver = RvkmsDriver;
+    type Driver = Rvkms;
 }
diff --git a/drivers/gpu/drm/rvkms/output.rs b/drivers/gpu/drm/rvkms/output.rs
index 822dc9e8e863a2f11c00f100a26cd537ccd15d9f..c352cb7900f2668b23d1a3103a49c0e159bb950b 100644
--- a/drivers/gpu/drm/rvkms/output.rs
+++ b/drivers/gpu/drm/rvkms/output.rs
@@ -4,7 +4,7 @@ use crate::{
     connector::Connector,
     encoder::Encoder,
     RvkmsDevice,
-    RvkmsDriver
+    Rvkms
 };
 use kernel::{
     drm::{
@@ -32,7 +32,7 @@ pub(crate) struct Output<'a> {
     encoder: &'a Encoder,
 }
 
-pub(crate) fn create_output(dev: &PendingDevice<RvkmsDriver>, index: u8) -> Result {
+pub(crate) fn create_output(dev: &PendingDevice<Rvkms>, index: u8) -> Result {
     let possible_crtcs = 1 << index;
 
     let primary = Plane::new(
@@ -69,7 +69,7 @@ pub(crate) fn create_output(dev: &PendingDevice<RvkmsDriver>, index: u8) -> Resu
 
 /*
 impl<'a, 'b: 'a> Output<'b> {
-    pub(crate) fn new(dev: &'a PendingDevice<RvkmsDriver>, index: u8) -> Result<Self> {
+    pub(crate) fn new(dev: &'a PendingDevice<Rvkms>, index: u8) -> Result<Self> {
         let primary = Plane::new(
             dev,
             1 << index,
@@ -116,7 +116,7 @@ impl<'a, 'b: 'a> Output<'b> {
 
 #[derive(Clone)]
 pub(crate) struct FrameInfo {
-    pub(crate) fb: ARef<Framebuffer<RvkmsDriver>>,
+    pub(crate) fb: ARef<Framebuffer<Rvkms>>,
     pub(crate) src: Rect,
     pub(crate) dst: Rect,
     pub(crate) rotated: Rect,
diff --git a/drivers/gpu/drm/rvkms/plane.rs b/drivers/gpu/drm/rvkms/plane.rs
index de85e2b404e7ca2e3e12cbee890f666d4fb90f42..dc1d63d4c93d757ecfcb1211b322d2876ccce111 100644
--- a/drivers/gpu/drm/rvkms/plane.rs
+++ b/drivers/gpu/drm/rvkms/plane.rs
@@ -1,12 +1,11 @@
 use core::marker::PhantomPinned;
 use super::{
-    RvkmsDriver,
+    Rvkms,
     crtc::DriverCrtc,
     output::FrameInfo,
 };
 use kernel::{
     prelude::*,
-    device::RawDevice,
     drm::{
         device::Device,
         kms::{
@@ -31,15 +30,13 @@ pub(crate) type PlaneState = ShadowPlaneState<RvkmsPlaneState>;
 
 #[vtable]
 impl plane::DriverPlane for DriverPlane {
-    type Initializer = impl PinInit<Self, Error>;
-
     type State = PlaneState;
 
-    type Driver = RvkmsDriver;
+    type Driver = Rvkms;
 
     type Args = ();
 
-    fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer {
+    fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> {
         try_pin_init!(Self { _p: PhantomPinned })
     }
 
diff --git a/drivers/gpu/drm/rvkms/rvkms.rs b/drivers/gpu/drm/rvkms/rvkms.rs
index f66a6a86d71e2dbbb296a2de9f5b8736975a4e9a..85b353af0c150a3fdc30fbf2b3a8e0959d287cd9 100644
--- a/drivers/gpu/drm/rvkms/rvkms.rs
+++ b/drivers/gpu/drm/rvkms/rvkms.rs
@@ -36,21 +36,19 @@ use kernel::{
     prelude::*,
     sync::{Arc, Mutex},
     types::ARef,
-    new_mutex
+    new_mutex,
+    module_platform_driver
 };
 
 use crate::output::Output;
 
-pub(crate) struct RvkmsDriver;
 pub(crate) struct Resources;
 
-pub(crate) type DeviceData = device::Data<Arc<Data>>;
-
 /// Convienence type alias for the DRM device type for this driver
-pub(crate) type RvkmsDevice = drm::device::Device<RvkmsDriver>;
+pub(crate) type RvkmsDevice = drm::device::Device<Rvkms>;
 
 /// The name of the driver
-const NAME: CStr = c_str!("rvkms");
+const NAME: &'static CStr = c_str!("rvkms");
 
 /// Driver metadata
 const INFO: drv::DriverInfo = drv::DriverInfo {
@@ -72,12 +70,11 @@ const MAX_RES: (i32, i32) = (8192, 8192);
 const DEFAULT_RES: (i32, i32) = (1024, 768);
 
 pub(crate) struct Data {
-    drm: ARef<RvkmsDevice>,
 }
 
 /// DRM Driver implementation for `RvkmsDriver`
 #[vtable]
-impl drv::Driver for RvkmsDriver {
+impl drv::Driver for Rvkms {
     type Data = Arc<Data>;
     type Object = gem::Object;
     type File = file::File;
@@ -86,41 +83,43 @@ impl drv::Driver for RvkmsDriver {
     const FEATURES:u32 = drv::FEAT_GEM | drv::FEAT_MODESET | drv::FEAT_ATOMIC;
 
     kernel::declare_drm_ioctls! {}
+
+    fn pre_registration(drm: &drm::device::PendingDevice<Self>) -> Result {
+        drm.setup_kms(&MODE_CONFIG_INFO)?;
+
+        output::create_output(drm, 0)?;
+
+        drm.mode_config_reset();
+
+        Ok(())
+    }
 }
 
-impl KmsDriver for RvkmsDriver {}
+impl KmsDriver for Rvkms {}
 
-impl platform::Driver for RvkmsDriver {
+impl platform::Driver for Rvkms {
     type Data = Arc<Data>;
     type IdInfo = ();
 
     fn probe(pdev: &mut platform::Device, id_info: Option<&Self::IdInfo>) -> Result<Self::Data> {
         // XXX: do not fret, the mutable reference here is temporary (poke dakr if it isn't)
         let dev: &device::Device = pdev.as_ref();
-        dev.pr_info(format_args!("RVKMS probing"));
-
-        let drm = drm::device::PendingDevice::new(dev)?;
-
-        drm.setup_kms(&MODE_CONFIG_INFO)?;
-
-        output::create_output(drm, 0)?;
-
-        drm.mode_config_reset()?;
+        dev.pr_info(format_args!("RVKMS probing\n"));
 
         dev.dma_coerce_mask_and_coherent(kernel::dma::dma_bit_mask(64))?;
 
-        let data = Arc::new(Data { drm: ARef::from(&drm) }, GFP_KERNEL)?;
-        let drm = drv::Registration::new_foreign_owned(drm, data.clone(), 0)?;
-
-        drm.fbdev_generic_setup();
+        let data = Arc::new(Data { }, GFP_KERNEL)?;
+        let drm = drv::Registration::<Rvkms>::new_foreign_owned(dev, data.clone(), 0)?;
 
         Ok(data)
     }
 }
 
 pub(crate) struct Rvkms {
-    drm: ARef<RvkmsDevice>,
-    //_resource: device::Resource,
+    //drm: ARef<RvkmsDevice>,
+    // TODO: Figure out if we still need this
+    _resource: device::Resource,
+    drv_reg: Pin<Box<platform::Registration<Self>>>,
     pdev: platform::Device,
 }
 
@@ -131,9 +130,21 @@ const MODE_CONFIG_INFO: ModeConfigInfo = ModeConfigInfo {
     preferred_depth: 0,
 };
 
-impl<'a> kernel::Module for Rvkms<'a> {
-    fn init(name: &'static str::CStr, module: &'static ThisModule) -> kernel::error::Result<Self> {
-        todo!()
+impl kernel::Module for Rvkms {
+    fn init(name: &'static CStr, module: &'static ThisModule) -> kernel::error::Result<Self> {
+        pr_info!("RVKMS module loaded\n");
+
+        // Register the driver
+        let drv_reg = Box::try_pin_init(platform::Registration::new(name, module), GFP_KERNEL)?;
+
+        let pdev = platform::Device::create_simple(&NAME, 0)?;
+        let dev: &device::Device = pdev.as_ref();
+
+        Ok(Self {
+            drv_reg,
+            _resource: dev.open_group()?,
+            pdev,
+        })
     }
 
     // TODO: Redo this whole init function, we should merely register the driver here and create the
diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs
index bb210c957d8434348c174fc1d1f99b2a1d2bc764..8b873daac17c810cc7a418afca1d4f7dc8102fc0 100644
--- a/rust/kernel/device.rs
+++ b/rust/kernel/device.rs
@@ -10,7 +10,10 @@ use crate::{
     prelude::*,
     types::{ARef, Opaque},
 };
-use core::{fmt, ptr};
+use core::{
+    fmt,
+    ptr::{self, NonNull, null_mut}
+};
 
 #[cfg(CONFIG_PRINTK)]
 use crate::c_str;
@@ -256,22 +259,19 @@ impl Device {
         unsafe { bindings::dma_unmap_sg_attrs(dev, &mut sglist[0], count, dir, 0) };
     }
 
-    /// Open a new devres group for dev with id.
-    pub fn open_group(&self, id: *mut core::ffi::c_void) -> Result<Resource> {
+    /// Open a new devres group for the given device
+    pub fn open_group(&self) -> Result<Resource> {
         // SAFETY: The requirements are satisfied by the existence of `Device` and its safety
         // requirements.
         let id = unsafe {
             // Keep the allocation flags as GFP_KERNEL, as currently all users
             // are using this flag.
-            bindings::devres_open_group(self.as_raw(), id, bindings::GFP_KERNEL)
+            bindings::devres_open_group(self.as_raw(), null_mut(), bindings::GFP_KERNEL)
         };
 
-        if id.is_null() {
-            return Err(ENOMEM);
-        }
         Ok(Resource {
-            dev: self.as_raw(),
-            id,
+            dev: self.into(),
+            id: NonNull::new(id).ok_or(ENOMEM)?,
         })
     }
 }
@@ -296,17 +296,19 @@ unsafe impl Send for Device {}
 // synchronization in `struct device`.
 unsafe impl Sync for Device {}
 
-/// Device Resource Management
+/// A devres resource group
+///
+/// It will be destroyed once dropped
 pub struct Resource {
-    dev: *mut bindings::device,
-    id: *mut core::ffi::c_void,
+    dev: NonNull<Device>,
+    id: NonNull<core::ffi::c_void>,
 }
 
 impl Drop for Resource {
     /// Release resources in a devres group
     fn drop(&mut self) {
         // SAFETY: The resource was properly allocated by the Device
-        unsafe { bindings::devres_release_group(self.dev, self.id) };
+        unsafe { bindings::devres_release_group(self.dev.as_ref().as_raw(), self.id.as_ptr()) };
     }
 }
 
diff --git a/rust/kernel/drm/device.rs b/rust/kernel/drm/device.rs
index 09cf4240f938feb5c0d93ec487db3e218f547b8a..1c086cedd53954d84a84ed0adfd442f1c8e72342 100644
--- a/rust/kernel/drm/device.rs
+++ b/rust/kernel/drm/device.rs
@@ -207,9 +207,3 @@ impl<T: drm::drv::Driver> Deref for PendingDevice<T> {
         &self.0
     }
 }
-
-impl<T: drm::drv::Driver> PendingDevice<T> {
-    pub fn new(dev: impl AsRef<device::Device>) -> Result<Self> {
-        Ok(Self(Device::new(dev.as_ref())?))
-    }
-}
diff --git a/rust/kernel/drm/drv.rs b/rust/kernel/drm/drv.rs
index 7d685a8551e4bddfdebe51a185172848892a8657..25651ffe16f2045f1395656c76bb1b44ab0b02c8 100644
--- a/rust/kernel/drm/drv.rs
+++ b/rust/kernel/drm/drv.rs
@@ -9,6 +9,7 @@ use crate::{
     bindings,
     devres::Devres,
     drm,
+    device,
     error::{Error, Result},
     private::Sealed,
     str::CStr,
@@ -115,7 +116,7 @@ pub trait AllocImpl: Sealed + drm::gem::IntoGEMObject {
 
 /// A DRM driver implementation.
 #[vtable]
-pub trait Driver {
+pub trait Driver: Sized {
     /// Context data associated with the DRM driver
     ///
     /// Determines the type of the context data passed to each of the methods of the trait.
@@ -137,6 +138,11 @@ pub trait Driver {
 
     /// IOCTL list. See `kernel::drm::ioctl::declare_drm_ioctls!{}`.
     const IOCTLS: &'static [drm::ioctl::DrmIoctlDescriptor];
+
+    /// Optional trait for handling pre-registration device initialization
+    fn pre_registration(drm: &drm::device::PendingDevice<Self>) -> Result {
+        Ok(())
+    }
 }
 
 /// A registration of a DRM device
@@ -148,21 +154,39 @@ pub struct Registration<T: Driver>(ARef<drm::device::Device<T>>);
 
 impl<T: Driver> Registration<T> {
     /// Creates a new [`Registration`] and registers it.
-    pub fn new(drm: drm::device::PendingDevice<T>, flags: usize) -> Result<Self> {
+    pub fn new(dev: &device::Device, data: T::Data, flags: usize) -> Result<Self> {
+        let drm = drm::device::PendingDevice(drm::device::Device::<T>::new(dev, data)?);
+
+        T::pre_registration(&drm)?;
+
         // SAFETY: Safe by the invariants of `drm::device::Device`.
         let ret = unsafe { bindings::drm_dev_register(drm.as_raw(), flags as u64) };
         if ret < 0 {
             return Err(Error::from_errno(ret));
         }
 
-        Ok(Self(dev.0))
+        // For KMS devices, don't forget to setup fbdev before handing the registration to the
+        // caller since this is common to all KMS devices
+        if drm.kms_initialized() {
+            // SAFETY: We just checked that KMS was initialized for this device, so this function is
+            // safe to call
+            unsafe { bindings::drm_fbdev_generic_setup(
+                drm.as_raw(),
+                (*drm.as_raw()).mode_config.preferred_depth) }
+        }
+
+        Ok(Self(ARef::from(drm.0)))
     }
 
     /// Same as [`Registration::new`}, but transfers ownership of the [`Registration`] to `Devres`.
-    pub fn new_foreign_owned(drm: drm::device::PendingDevice<T>, flags: usize) -> Result {
-        let reg = Registration::<T>::new(drm.clone(), flags)?;
-
-        Devres::new_foreign_owned(dev.as_ref(), reg, GFP_KERNEL).map(|_| dev.0)
+    pub fn new_foreign_owned(
+        dev: &device::Device,
+        data: T::Data,
+        flags: usize
+    ) -> Result {
+        let reg = Registration::<T>::new(dev, data, flags)?;
+
+        Devres::new_foreign_owned(dev, reg, GFP_KERNEL)
     }
 
     /// Returns a reference to the `Device` instance for this registration.
diff --git a/rust/kernel/drm/kms/connector.rs b/rust/kernel/drm/kms/connector.rs
index c918dbbf1810f202626d40158e3c70f6e93d2140..e62514c020caa43f0e07059e374edbcb6c977530 100644
--- a/rust/kernel/drm/kms/connector.rs
+++ b/rust/kernel/drm/kms/connector.rs
@@ -63,10 +63,6 @@ pub use bindings::{
 
 /// A DRM connector implementation
 pub trait DriverConnector: Send + Sync + Sized {
-    /// The return type of the new() function. Should be `impl PinInit<Self, Error>`.
-    /// TODO: Remove this when return_position_impl_trait_in_trait is stable.
-    type Initializer: PinInit<Self, Error>;
-
     /// The data type to use for passing incoming arguments for new `Connector<T>` instances
     /// Drivers which don't care about this can just use `()`
     type Args;
@@ -78,7 +74,7 @@ pub trait DriverConnector: Send + Sync + Sized {
     type State: DriverConnectorState;
 
     /// Create a new instance of the private driver data struct for this connector in-place
-    fn new(dev: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer;
+    fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>;
 
     /// Retrieve a list of available display modes for this connector
     fn get_modes<'a>(
diff --git a/rust/kernel/drm/kms/crtc.rs b/rust/kernel/drm/kms/crtc.rs
index fad2b00b740cd02bafd677c1c7476ff10b504d1f..3ea8cda55554e688989b3a2fcab9a4cad4e76f76 100644
--- a/rust/kernel/drm/kms/crtc.rs
+++ b/rust/kernel/drm/kms/crtc.rs
@@ -32,10 +32,6 @@ use macros::vtable;
 /// KMS CRTC object functions, which must be implemented by drivers.
 #[vtable]
 pub trait DriverCrtc: Send + Sync + Sized {
-    /// The return type of the new() function. Should be `impl PinInit<Self, Error>`.
-    /// TODO: Remove this when return_position_impl_trait_in_trait is stable.
-    type Initializer: PinInit<Self, Error>;
-
     /// The data type to use for passing incoming arguments for new `Crtc<T>` instances
     /// Drivers which don't care about this can just use `()`
     type Args;
@@ -47,7 +43,7 @@ pub trait DriverCrtc: Send + Sync + Sized {
     type State: DriverCrtcState;
 
     /// Create a new CRTC for this driver
-    fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer;
+    fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>;
 
     fn atomic_check(crtc: &Crtc<Self>, state: &AtomicStateComposer<Self::Driver>) -> Result {
         build_error::build_error("This should not be reachable")
diff --git a/rust/kernel/drm/kms/encoder.rs b/rust/kernel/drm/kms/encoder.rs
index 4179cce4da90fb1aaea7dd45e56fada8f24dd9fc..8585c328e6ecf9cf047bfed0d85710b3f6132865 100644
--- a/rust/kernel/drm/kms/encoder.rs
+++ b/rust/kernel/drm/kms/encoder.rs
@@ -37,10 +37,6 @@ pub use bindings::{
 
 /// The main trait for KMS drivers to implement for their display encoders.
 pub trait DriverEncoder: Send + Sync + Sized {
-    /// The return type of the new() function. Should be `impl PinInit<Self, Error>`.
-    /// TODO: Remove this when return_position_impl_trait_in_trait is stable.
-    type Initializer: PinInit<Self, Error>;
-
     /// The parent driver for this drm_encoder implementation
     type Driver: KmsDriver;
 
@@ -49,7 +45,7 @@ pub trait DriverEncoder: Send + Sync + Sized {
     type Args;
 
     /// Create a new encoder for this driver
-    fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer;
+    fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>;
 }
 
 /// A trait for objects which can be used as a DRM encoder.
diff --git a/rust/kernel/drm/kms/plane.rs b/rust/kernel/drm/kms/plane.rs
index 28a5fb6c84acba6715c764c9e79cb067ea4f88a2..52917e2923e8af49d8707a75d64ef6e484bd66ba 100644
--- a/rust/kernel/drm/kms/plane.rs
+++ b/rust/kernel/drm/kms/plane.rs
@@ -37,10 +37,6 @@ use super::{
 /// whatever struct the driver defines which implements this trait.
 #[vtable]
 pub trait DriverPlane: Send + Sync + Sized {
-    /// The return type of the new() function. Should be `impl PinInit<Self, Error>`.
-    /// TODO: Remove this when return_position_impl_trait_in_trait is stable.
-    type Initializer: PinInit<Self, Error>;
-
     /// The data type to use for passing incoming arguments for new `Plane<T>` instances
     /// Drivers which don't care about this can just use `()`
     type Args;
@@ -54,7 +50,7 @@ pub trait DriverPlane: Send + Sync + Sized {
     type State: PlaneStateHelper;
 
     /// Create the plane driver's private data structure
-    fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer;
+    fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>;
 
     /// The atomic check hook
     fn atomic_check(plane: &Plane<Self>, state: &AtomicStateComposer<Self::Driver>) -> Result {
diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs
index 86d662609ee457212e8f1b2395dff39acc7fc8ea..08fa9048067798bc8acf8a3557f3ede0765c0445 100644
--- a/rust/kernel/platform.rs
+++ b/rust/kernel/platform.rs
@@ -186,3 +186,37 @@ impl AsRef<device::Device> for Device {
         &self.dev
     }
 }
+
+/// XXX: Lyude: I literally just copy pasted this from asahi. do it properly with a commit TODO
+
+/// Declares a kernel module that exposes a single platform driver.
+///
+/// # Examples
+///
+/// ```ignore
+/// # use kernel::{platform, define_of_id_table, module_platform_driver};
+/// #
+/// struct MyDriver;
+/// impl platform::Driver for MyDriver {
+///     // [...]
+/// #   fn probe(_dev: &mut platform::Device, _id_info: Option<&Self::IdInfo>) -> Result {
+/// #       Ok(())
+/// #   }
+/// #   define_of_id_table! {(), [
+/// #       (of::DeviceId::Compatible(b"brcm,bcm2835-rng"), None),
+/// #   ]}
+/// }
+///
+/// module_platform_driver! {
+///     type: MyDriver,
+///     name: "module_name",
+///     author: "Author name",
+///     license: "GPL",
+/// }
+/// ```
+#[macro_export]
+macro_rules! module_platform_driver {
+    ($($f:tt)*) => {
+        $crate::module_driver!(<T>, $crate::platform::Adapter<T>, { $($f)* });
+    };
+}