]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm: renesas: rz-du: rzg2l_du_encoder: Fix max dot clock for DPI
authorBiju Das <biju.das.jz@bp.renesas.com>
Tue, 22 Oct 2024 08:24:24 +0000 (09:24 +0100)
committerBiju Das <biju.das.jz@bp.renesas.com>
Tue, 10 Dec 2024 12:46:10 +0000 (12:46 +0000)
As per the RZ/G2UL hardware manual Table 33.4 Clock List, the maximum
dot clock for the DPI interface is 83.5 MHz. Add mode_valid callback
to reject modes greater than 83.5 MHz.

Suggested-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241022082433.32513-3-biju.das.jz@bp.renesas.com
drivers/gpu/drm/renesas/rz-du/rzg2l_du_encoder.c

index 339cbaaea0b540243a1483c101eea3498c5478d5..564ab4cb3d37d121f02be0cc254491670f57eb9f 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/export.h>
 #include <linux/of.h>
 
+#include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_bridge_connector.h>
 #include <drm/drm_panel.h>
 static const struct drm_encoder_funcs rzg2l_du_encoder_funcs = {
 };
 
+static enum drm_mode_status
+rzg2l_du_encoder_mode_valid(struct drm_encoder *encoder,
+                           const struct drm_display_mode *mode)
+{
+       struct rzg2l_du_encoder *renc = to_rzg2l_encoder(encoder);
+
+       if (renc->output == RZG2L_DU_OUTPUT_DPAD0 && mode->clock > 83500)
+               return MODE_CLOCK_HIGH;
+
+       return MODE_OK;
+}
+
+static const struct drm_encoder_helper_funcs rzg2l_du_encoder_helper_funcs = {
+       .mode_valid = rzg2l_du_encoder_mode_valid,
+};
+
 int rzg2l_du_encoder_init(struct rzg2l_du_device  *rcdu,
                          enum rzg2l_du_output output,
                          struct device_node *enc_node)
@@ -48,6 +65,7 @@ int rzg2l_du_encoder_init(struct rzg2l_du_device  *rcdu,
                return PTR_ERR(renc);
 
        renc->output = output;
+       drm_encoder_helper_add(&renc->base, &rzg2l_du_encoder_helper_funcs);
 
        /* Attach the bridge to the encoder. */
        ret = drm_bridge_attach(&renc->base, bridge, NULL,