On Sat, Jul 19, 2025 at 02:09:41PM +0200, Otto Pflüger wrote: > If a panel needs to send DSI commands during initialization, it sets the > prepare_prev_first flag, which allows the DSI host to initialize itself > before the panel's prepare function is called. To support this, the DSI > host must register a bridge and perform the necessary initialization > steps in its pre_enable function. > > Implement this for the Unisoc DSI driver by moving the initialization > code from the encoder callbacks to a bridge and simplify the remaining > encoder-related code which no longer needs any callbacks. > > Signed-off-by: Otto Pflüger <otto.pflue...@abscue.de> > --- > drivers/gpu/drm/sprd/Kconfig | 2 + > drivers/gpu/drm/sprd/sprd_dsi.c | 143 > +++++++++++++++++++++++++--------------- > drivers/gpu/drm/sprd/sprd_dsi.h | 4 ++ > 3 files changed, 97 insertions(+), 52 deletions(-) > > diff --git a/drivers/gpu/drm/sprd/Kconfig b/drivers/gpu/drm/sprd/Kconfig > index > e22b780fe82248296a7153d02269faf8cd63294f..1afcdbf6f0ee3304f2297835241c9bb10d422154 > 100644 > --- a/drivers/gpu/drm/sprd/Kconfig > +++ b/drivers/gpu/drm/sprd/Kconfig > @@ -2,6 +2,8 @@ config DRM_SPRD > tristate "DRM Support for Unisoc SoCs Platform" > depends on ARCH_SPRD || COMPILE_TEST > depends on DRM && OF > + select DRM_BRIDGE_CONNECTOR > + select DRM_DISPLAY_HELPER > select DRM_GEM_DMA_HELPER > select DRM_KMS_HELPER > select DRM_MIPI_DSI > diff --git a/drivers/gpu/drm/sprd/sprd_dsi.c b/drivers/gpu/drm/sprd/sprd_dsi.c > index > 23b0e1dc547a5023ee6ad7d5e1c49e2cec986bf0..43fff12d73f12619da57606a3c4785924e2c1507 > 100644 > --- a/drivers/gpu/drm/sprd/sprd_dsi.c > +++ b/drivers/gpu/drm/sprd/sprd_dsi.c > @@ -11,8 +11,10 @@ > > #include <drm/drm_atomic_helper.h> > #include <drm/drm_bridge.h> > +#include <drm/drm_bridge_connector.h> > #include <drm/drm_of.h> > #include <drm/drm_probe_helper.h> > +#include <drm/drm_simple_kms_helper.h> > > #include "sprd_drm.h" > #include "sprd_dpu.h" > @@ -778,19 +780,53 @@ static void sprd_dphy_fini(struct dsi_context *ctx) > dsi_reg_up(ctx, PHY_INTERFACE_CTRL, RF_PHY_RESET_N, RF_PHY_RESET_N); > } > > -static void sprd_dsi_encoder_mode_set(struct drm_encoder *encoder, > - struct drm_display_mode *mode, > - struct drm_display_mode *adj_mode) > +static int sprd_dsi_encoder_init(struct sprd_dsi *dsi, > + struct device *dev) > +{ > + struct drm_encoder *encoder = &dsi->encoder; > + u32 crtc_mask; > + int ret; > + > + crtc_mask = drm_of_find_possible_crtcs(dsi->drm, dev->of_node); > + if (!crtc_mask) { > + drm_err(dsi->drm, "failed to find crtc mask\n"); > + return -EINVAL; > + } > + > + drm_dbg(dsi->drm, "find possible crtcs: 0x%08x\n", crtc_mask); > + > + encoder->possible_crtcs = crtc_mask; > + ret = drm_simple_encoder_init(dsi->drm, encoder, DRM_MODE_ENCODER_DSI);
The drm_simple_* components are being deprecated. Please open-code corresponding functionality. > + if (ret) { > + drm_err(dsi->drm, "failed to init dsi encoder\n"); > + return ret; > + } > + > + return 0; > +} > + -- With best wishes Dmitry