On 22.03.24 23:03, Lyude Paul wrote: > diff --git a/drivers/gpu/drm/rvkms/connector.rs b/drivers/gpu/drm/rvkms/connector.rs > new file mode 100644 > index 0000000000000..40f84d38437ee > --- /dev/null > +++ b/drivers/gpu/drm/rvkms/connector.rs > @@ -0,0 +1,55 @@ > +// TODO: License and stuff > +// Contain's rvkms's drm_connector implementation > + > +use super::{RvkmsDriver, RvkmsDevice, MAX_RES, DEFAULT_RES}; > +use kernel::{ > + prelude::*, > + drm::{ > + device::Device, > + kms::{ > + connector::{self, ConnectorGuard}, > + ModeConfigGuard > + } > + }, > + prelude::* > +}; > +use core::marker::PhantomPinned; > + > +#[pin_data] > +pub(crate) struct DriverConnector { > + #[pin] > + _p: PhantomPinned > +} This struct does not need to be annotated with `#[pin_data]`, this should just work: 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 Args = (); > + > + fn new(dev: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer { And then here just return `Self`. This works, since there is a blanket impl `PinInit<T, E> for T`. Looking at how you use this API, I am not sure if you actually need pin-init for the type that implements `DriverConnector`. Do you need to store eg `Mutex<T>` or something else that needs pin-init in here in a more complex driver? -- Cheers, Benno > + try_pin_init!(Self { _p: PhantomPinned }) > + } > + > + fn get_modes( > + connector: ConnectorGuard<'_, Self>, > + _guard: &ModeConfigGuard<'_, Self::Driver> > + ) -> i32 { > + let count = connector.add_modes_noedid(MAX_RES); > + > + connector.set_preferred_mode(DEFAULT_RES); > + count > + } > +} > + > +#[derive(Clone, Default)] > +pub(crate) struct ConnectorState; > + > +impl connector::DriverConnectorState for ConnectorState { > + type Connector = DriverConnector; > +}