Split the register-setting component of ast_get_vbios_mode_info into a
separate function.

Signed-off-by: Daniel Stone <daniels at collabora.com>
---
 drivers/gpu/drm/ast/ast_drv.h  |  1 +
 drivers/gpu/drm/ast/ast_mode.c | 70 +++++++++++++++++++++++++-----------------
 2 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 86205a2..4d8b16c 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -302,6 +302,7 @@ struct ast_vbios_dclk_info {
 struct ast_vbios_mode_info {
        struct ast_vbios_stdtable *std_table;
        struct ast_vbios_enhtable *enh_table;
+       u32 color_index;
 };

 extern int ast_mode_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c
index b7ee263..e8c24a5 100644
--- a/drivers/gpu/drm/ast/ast_mode.c
+++ b/drivers/gpu/drm/ast/ast_mode.c
@@ -78,8 +78,7 @@ static bool ast_get_vbios_mode_info(struct drm_crtc *crtc, 
struct drm_display_mo
                                    struct drm_display_mode *adjusted_mode,
                                    struct ast_vbios_mode_info *vbios_mode)
 {
-       struct ast_private *ast = crtc->dev->dev_private;
-       u32 refresh_rate_index = 0, mode_id, color_index, refresh_rate;
+       u32 refresh_rate_index = 0, refresh_rate;
        u32 hborder, vborder;
        bool check_sync;
        struct ast_vbios_enhtable *best = NULL;
@@ -87,16 +86,16 @@ static bool ast_get_vbios_mode_info(struct drm_crtc *crtc, 
struct drm_display_mo
        switch (crtc->primary->fb->bits_per_pixel) {
        case 8:
                vbios_mode->std_table = &vbios_stdtable[VGAModeIndex];
-               color_index = VGAModeIndex - 1;
+               vbios_mode->color_index = VGAModeIndex - 1;
                break;
        case 16:
                vbios_mode->std_table = &vbios_stdtable[HiCModeIndex];
-               color_index = HiCModeIndex;
+               vbios_mode->color_index = HiCModeIndex;
                break;
        case 24:
        case 32:
                vbios_mode->std_table = &vbios_stdtable[TrueCModeIndex];
-               color_index = TrueCModeIndex;
+               vbios_mode->color_index = TrueCModeIndex;
                break;
        default:
                return false;
@@ -194,33 +193,45 @@ static bool ast_get_vbios_mode_info(struct drm_crtc 
*crtc, struct drm_display_mo
                                         vbios_mode->enh_table->vfp +
                                         vbios_mode->enh_table->vsync);

-       refresh_rate_index = vbios_mode->enh_table->refresh_rate_index;
-       mode_id = vbios_mode->enh_table->mode_id;
-
-       if (ast->chip == AST1180) {
-               /* TODO 1180 */
-       } else {
-               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8c, 
(u8)((color_index & 0xf) << 4));
-               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8d, 
refresh_rate_index & 0xff);
-               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8e, mode_id & 0xff);
-
-               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x91, 0x00);
-               if (vbios_mode->enh_table->flags & NewModeInfo) {
-                       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x91, 0xa8);
-                       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x92, 
crtc->primary->fb->bits_per_pixel);
-                       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x93, 
adjusted_mode->clock / 1000);
-                       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x94, 
adjusted_mode->crtc_hdisplay);
-                       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x95, 
adjusted_mode->crtc_hdisplay >> 8);
-
-                       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x96, 
adjusted_mode->crtc_vdisplay);
-                       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x97, 
adjusted_mode->crtc_vdisplay >> 8);
-               }
-       }
-
        return true;
+}
+
+static void ast_set_port_reg(struct drm_crtc *crtc, struct drm_display_mode 
*mode,
+                            struct ast_vbios_mode_info *vbios_mode)
+{
+       struct ast_private *ast = crtc->dev->dev_private;
+       u32 refresh_rate_index, mode_id, color_index;

+       if (ast->chip == AST1180)
+               return;

+       refresh_rate_index = vbios_mode->enh_table->refresh_rate_index;
+       mode_id = vbios_mode->enh_table->mode_id;
+       color_index = vbios_mode->color_index;
+
+       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8c, (u8)((color_index & 0xf) 
<< 4));
+       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8d, refresh_rate_index & 
0xff);
+       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x8e, mode_id & 0xff);
+
+       ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x91, 0x00);
+       if (vbios_mode->enh_table->flags & NewModeInfo) {
+               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x91, 0xa8);
+               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x92,
+                                 crtc->primary->fb->bits_per_pixel);
+               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x93,
+                                 mode->clock / 1000);
+               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x94,
+                                 mode->crtc_hdisplay);
+               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x95,
+                                 mode->crtc_hdisplay >> 8);
+
+               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x96,
+                                 mode->crtc_vdisplay);
+               ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0x97,
+                                 mode->crtc_vdisplay >> 8);
+       }
 }
+
 static void ast_set_std_reg(struct drm_crtc *crtc, struct drm_display_mode 
*mode,
                            struct ast_vbios_mode_info *vbios_mode)
 {
@@ -579,6 +590,9 @@ static int ast_crtc_mode_set(struct drm_crtc *crtc,
        ret = ast_get_vbios_mode_info(crtc, mode, adjusted_mode, &vbios_mode);
        if (ret == false)
                return -EINVAL;
+
+       ast_set_port_reg(crtc, adjusted_mode, &vbios_mode);
+
        ast_open_key(ast);

        ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa1, 0xff, 0x04);
-- 
2.3.2

Reply via email to