]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/bridge: synopsys: dw-mipi-dsi: Add mode fixup support
authorLiu Ying <victor.liu@nxp.com>
Mon, 21 Aug 2023 03:40:03 +0000 (11:40 +0800)
committerRobert Foss <rfoss@kernel.org>
Mon, 16 Oct 2023 09:38:42 +0000 (11:38 +0200)
Vendor drivers may need to fixup mode due to pixel clock tree limitation,
so introduce the ->mode_fixup() callcack to struct dw_mipi_dsi_plat_data
and call it at atomic check stage if available.

Signed-off-by: Liu Ying <victor.liu@nxp.com>
Reviewed-by: Robert Foss <rfoss@kernel.org>
Signed-off-by: Robert Foss <rfoss@kernel.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230821034008.3876938-5-victor.liu@nxp.com
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
include/drm/bridge/dw_mipi_dsi.h

index 4e5171b5978a521666c42fee47586edee32002da..40d699428b1bdcb15d2fddf850c358fe40ec4193 100644 (file)
@@ -573,9 +573,23 @@ static int dw_mipi_dsi_bridge_atomic_check(struct drm_bridge *bridge,
                                           struct drm_crtc_state *crtc_state,
                                           struct drm_connector_state *conn_state)
 {
+       struct dw_mipi_dsi *dsi = bridge_to_dsi(bridge);
+       const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data;
+       bool ret;
+
        bridge_state->input_bus_cfg.flags =
                DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_SAMPLE_NEGEDGE;
 
+       if (pdata->mode_fixup) {
+               ret = pdata->mode_fixup(pdata->priv_data, &crtc_state->mode,
+                                       &crtc_state->adjusted_mode);
+               if (!ret) {
+                       DRM_DEBUG_DRIVER("failed to fixup mode " DRM_MODE_FMT "\n",
+                                        DRM_MODE_ARG(&crtc_state->mode));
+                       return -EINVAL;
+               }
+       }
+
        return 0;
 }
 
index 246650f2814f78a983aef9b9121669b72cc32289..65d5e68065e3d8bd38986b993653c467a18e3a58 100644 (file)
@@ -59,6 +59,9 @@ struct dw_mipi_dsi_plat_data {
                                           unsigned long mode_flags,
                                           u32 lanes, u32 format);
 
+       bool (*mode_fixup)(void *priv_data, const struct drm_display_mode *mode,
+                          struct drm_display_mode *adjusted_mode);
+
        u32 *(*get_input_bus_fmts)(void *priv_data,
                                   struct drm_bridge *bridge,
                                   struct drm_bridge_state *bridge_state,