diff --git a/rust/kernel/drm/kms/encoder.rs b/rust/kernel/drm/kms/encoder.rs
index 4cb0c8f39df0bfb1bb79894033f7773adb0c301a..2b966d70aec56ebd7cbabfae6121a8a51d8b3e30 100644
--- a/rust/kernel/drm/kms/encoder.rs
+++ b/rust/kernel/drm/kms/encoder.rs
@@ -245,6 +245,8 @@ impl<T: DriverEncoder> Encoder<T> {
         // SAFETY: We don't move anything
         Ok(unsafe { &*KBox::into_raw(Pin::into_inner_unchecked(this)) })
     }
+
+    super::impl_from_opaque_mode_obj!(Encoder, DriverEncoder, encoder, OpaqueEncoder);
 }
 
 /// A [`struct drm_encoder`] without a known [`DriverEncoder`] implementation.
@@ -253,8 +255,6 @@ impl<T: DriverEncoder> Encoder<T> {
 /// for a [`struct drm_encoder`] automatically. It is identical to [`Encoder`], except that it does not
 /// provide access to the driver's private data.
 ///
-/// TODO: Add functions for upcasting.
-///
 /// # Invariants
 ///
 /// Same as [`Encoder`].