As the TC358768 is a DPI to DSI bridge, the DSI side does not need to
define h/v sync polarities. This means that sometimes we have a mode
without defined sync polarities, which does not work on the DPI side.

Add a mode_fixup hook to default to positive sync polarities.

Reviewed-by: Peter Ujfalusi <peter.ujfal...@gmail.com>
Tested-by: Maxim Schwalm <maxim.schw...@gmail.com> # Asus TF700T
Tested-by: Marcel Ziswiler <marcel.ziswi...@toradex.com>
Signed-off-by: Tomi Valkeinen <tomi.valkei...@ideasonboard.com>
---
 drivers/gpu/drm/bridge/tc358768.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/gpu/drm/bridge/tc358768.c 
b/drivers/gpu/drm/bridge/tc358768.c
index bc97a837955b..963ac550509b 100644
--- a/drivers/gpu/drm/bridge/tc358768.c
+++ b/drivers/gpu/drm/bridge/tc358768.c
@@ -963,9 +963,27 @@ tc358768_atomic_get_input_bus_fmts(struct drm_bridge 
*bridge,
        return input_fmts;
 }
 
+static bool tc358768_mode_fixup(struct drm_bridge *bridge,
+                               const struct drm_display_mode *mode,
+                               struct drm_display_mode *adjusted_mode)
+{
+       /* Default to positive sync */
+
+       if (!(adjusted_mode->flags &
+             (DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_NHSYNC)))
+               adjusted_mode->flags |= DRM_MODE_FLAG_PHSYNC;
+
+       if (!(adjusted_mode->flags &
+             (DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_NVSYNC)))
+               adjusted_mode->flags |= DRM_MODE_FLAG_PVSYNC;
+
+       return true;
+}
+
 static const struct drm_bridge_funcs tc358768_bridge_funcs = {
        .attach = tc358768_bridge_attach,
        .mode_valid = tc358768_bridge_mode_valid,
+       .mode_fixup = tc358768_mode_fixup,
        .pre_enable = tc358768_bridge_pre_enable,
        .enable = tc358768_bridge_enable,
        .disable = tc358768_bridge_disable,

-- 
2.34.1

Reply via email to