drm/ast: Move connector mode_valid function to CRTC
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 7 Feb 2022 14:15:37 +0000 (15:15 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 8 Feb 2022 12:38:02 +0000 (13:38 +0100)
The tests in ast_mode_valid() verify the correct resolution for the
supplied mode. This is a limitation of the CRTC, so move the function
to the CRTC helpers. No functional changes.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220207141544.30015-3-tzimmermann@suse.de
drivers/gpu/drm/ast/ast_mode.c

index 51cc6fe..ab0a86c 100644 (file)
@@ -1005,6 +1005,71 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode)
        }
 }
 
+static enum drm_mode_status
+ast_crtc_helper_mode_valid(struct drm_crtc *crtc, const struct drm_display_mode *mode)
+{
+       struct ast_private *ast = to_ast_private(crtc->dev);
+       enum drm_mode_status status;
+       uint32_t jtemp;
+
+       if (ast->support_wide_screen) {
+               if ((mode->hdisplay == 1680) && (mode->vdisplay == 1050))
+                       return MODE_OK;
+               if ((mode->hdisplay == 1280) && (mode->vdisplay == 800))
+                       return MODE_OK;
+               if ((mode->hdisplay == 1440) && (mode->vdisplay == 900))
+                       return MODE_OK;
+               if ((mode->hdisplay == 1360) && (mode->vdisplay == 768))
+                       return MODE_OK;
+               if ((mode->hdisplay == 1600) && (mode->vdisplay == 900))
+                       return MODE_OK;
+
+               if ((ast->chip == AST2100) || (ast->chip == AST2200) ||
+                   (ast->chip == AST2300) || (ast->chip == AST2400) ||
+                   (ast->chip == AST2500)) {
+                       if ((mode->hdisplay == 1920) && (mode->vdisplay == 1080))
+                               return MODE_OK;
+
+                       if ((mode->hdisplay == 1920) && (mode->vdisplay == 1200)) {
+                               jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff);
+                               if (jtemp & 0x01)
+                                       return MODE_NOMODE;
+                               else
+                                       return MODE_OK;
+                       }
+               }
+       }
+
+       status = MODE_NOMODE;
+
+       switch (mode->hdisplay) {
+       case 640:
+               if (mode->vdisplay == 480)
+                       status = MODE_OK;
+               break;
+       case 800:
+               if (mode->vdisplay == 600)
+                       status = MODE_OK;
+               break;
+       case 1024:
+               if (mode->vdisplay == 768)
+                       status = MODE_OK;
+               break;
+       case 1280:
+               if (mode->vdisplay == 1024)
+                       status = MODE_OK;
+               break;
+       case 1600:
+               if (mode->vdisplay == 1200)
+                       status = MODE_OK;
+               break;
+       default:
+               break;
+       }
+
+       return status;
+}
+
 static int ast_crtc_helper_atomic_check(struct drm_crtc *crtc,
                                        struct drm_atomic_state *state)
 {
@@ -1107,6 +1172,7 @@ ast_crtc_helper_atomic_disable(struct drm_crtc *crtc,
 }
 
 static const struct drm_crtc_helper_funcs ast_crtc_helper_funcs = {
+       .mode_valid = ast_crtc_helper_mode_valid,
        .atomic_check = ast_crtc_helper_atomic_check,
        .atomic_flush = ast_crtc_helper_atomic_flush,
        .atomic_enable = ast_crtc_helper_atomic_enable,
@@ -1241,71 +1307,8 @@ static int ast_get_modes(struct drm_connector *connector)
        return 0;
 }
 
-static enum drm_mode_status ast_mode_valid(struct drm_connector *connector,
-                         struct drm_display_mode *mode)
-{
-       struct ast_private *ast = to_ast_private(connector->dev);
-       int flags = MODE_NOMODE;
-       uint32_t jtemp;
-
-       if (ast->support_wide_screen) {
-               if ((mode->hdisplay == 1680) && (mode->vdisplay == 1050))
-                       return MODE_OK;
-               if ((mode->hdisplay == 1280) && (mode->vdisplay == 800))
-                       return MODE_OK;
-               if ((mode->hdisplay == 1440) && (mode->vdisplay == 900))
-                       return MODE_OK;
-               if ((mode->hdisplay == 1360) && (mode->vdisplay == 768))
-                       return MODE_OK;
-               if ((mode->hdisplay == 1600) && (mode->vdisplay == 900))
-                       return MODE_OK;
-
-               if ((ast->chip == AST2100) || (ast->chip == AST2200) ||
-                   (ast->chip == AST2300) || (ast->chip == AST2400) ||
-                   (ast->chip == AST2500)) {
-                       if ((mode->hdisplay == 1920) && (mode->vdisplay == 1080))
-                               return MODE_OK;
-
-                       if ((mode->hdisplay == 1920) && (mode->vdisplay == 1200)) {
-                               jtemp = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff);
-                               if (jtemp & 0x01)
-                                       return MODE_NOMODE;
-                               else
-                                       return MODE_OK;
-                       }
-               }
-       }
-       switch (mode->hdisplay) {
-       case 640:
-               if (mode->vdisplay == 480)
-                       flags = MODE_OK;
-               break;
-       case 800:
-               if (mode->vdisplay == 600)
-                       flags = MODE_OK;
-               break;
-       case 1024:
-               if (mode->vdisplay == 768)
-                       flags = MODE_OK;
-               break;
-       case 1280:
-               if (mode->vdisplay == 1024)
-                       flags = MODE_OK;
-               break;
-       case 1600:
-               if (mode->vdisplay == 1200)
-                       flags = MODE_OK;
-               break;
-       default:
-               return flags;
-       }
-
-       return flags;
-}
-
 static const struct drm_connector_helper_funcs ast_connector_helper_funcs = {
        .get_modes = ast_get_modes,
-       .mode_valid = ast_mode_valid,
 };
 
 static const struct drm_connector_funcs ast_connector_funcs = {