Gen4 and later models detect the TX chip from VGACRD1, while earlier
models detect from VGACRA3. Split up the detection helper into
two separate helpers. Use SZ_ constants instead of plain numbers.

Then inline the call into its only caller ast_device_create(). When
ast_device_create() gets split up per Gen, either call will remain.

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
---
 drivers/gpu/drm/ast/ast_2000.c | 26 ++++++++++
 drivers/gpu/drm/ast/ast_2300.c | 68 ++++++++++++++++++++++++
 drivers/gpu/drm/ast/ast_drv.c  | 15 ++++++
 drivers/gpu/drm/ast/ast_drv.h  |  5 ++
 drivers/gpu/drm/ast/ast_main.c | 94 ++--------------------------------
 5 files changed, 119 insertions(+), 89 deletions(-)

diff --git a/drivers/gpu/drm/ast/ast_2000.c b/drivers/gpu/drm/ast/ast_2000.c
index a31daf7c2ceb..63fad9fbf519 100644
--- a/drivers/gpu/drm/ast/ast_2000.c
+++ b/drivers/gpu/drm/ast/ast_2000.c
@@ -181,3 +181,29 @@ const struct ast_vbios_dclk_info ast_2000_dclk_table[] = {
        {0x6a, 0x6d, 0x80},                     /* 19: VCLK97_75        */
        {0x3b, 0x2c, 0x81},                     /* 1a: VCLK118_25       */
 };
+
+/*
+ * Device initialization
+ */
+
+void ast_2000_detect_tx_chip(struct ast_device *ast, bool need_post)
+{
+       enum ast_tx_chip tx_chip = AST_TX_NONE;
+       u8 vgacra3;
+
+       /*
+        * VGACRA3 Enhanced Color Mode Register, check if DVO is already
+        * enabled, in that case, assume we have a SIL164 TMDS transmitter
+        *
+        * Don't make that assumption if we the chip wasn't enabled and
+        * is at power-on reset, otherwise we'll incorrectly "detect" a
+        * SIL164 when there is none.
+        */
+       if (!need_post) {
+               vgacra3 = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xa3, 
0xff);
+               if (vgacra3 & AST_IO_VGACRA3_DVO_ENABLED)
+                       tx_chip = AST_TX_SIL164;
+       }
+
+       __ast_device_set_tx_chip(ast, tx_chip);
+}
diff --git a/drivers/gpu/drm/ast/ast_2300.c b/drivers/gpu/drm/ast/ast_2300.c
index dc2a32244689..68d269ef9b47 100644
--- a/drivers/gpu/drm/ast/ast_2300.c
+++ b/drivers/gpu/drm/ast/ast_2300.c
@@ -27,6 +27,10 @@
  */
 
 #include <linux/delay.h>
+#include <linux/sizes.h>
+
+#include <drm/drm_managed.h>
+#include <drm/drm_print.h>
 
 #include "ast_drv.h"
 #include "ast_post.h"
@@ -1326,3 +1330,67 @@ int ast_2300_post(struct ast_device *ast)
 
        return 0;
 }
+
+/*
+ * Device initialization
+ */
+
+void ast_2300_detect_tx_chip(struct ast_device *ast)
+{
+       enum ast_tx_chip tx_chip = AST_TX_NONE;
+       struct drm_device *dev = &ast->base;
+       u8 vgacrd1;
+
+       /*
+        * On AST GEN4+, look at the configuration set by the SoC in
+        * the SOC scratch register #1 bits 11:8 (interestingly marked
+        * as "reserved" in the spec)
+        */
+       vgacrd1 = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xd1,
+                                        AST_IO_VGACRD1_TX_TYPE_MASK);
+       switch (vgacrd1) {
+       /*
+        * GEN4 to GEN6
+        */
+       case AST_IO_VGACRD1_TX_SIL164_VBIOS:
+               tx_chip = AST_TX_SIL164;
+               break;
+       case AST_IO_VGACRD1_TX_DP501_VBIOS:
+               ast->dp501_fw_addr = drmm_kzalloc(dev, SZ_32K, GFP_KERNEL);
+               if (ast->dp501_fw_addr) {
+                       /* backup firmware */
+                       if (ast_backup_fw(ast, ast->dp501_fw_addr, SZ_32K)) {
+                               drmm_kfree(dev, ast->dp501_fw_addr);
+                               ast->dp501_fw_addr = NULL;
+                       }
+               }
+               fallthrough;
+       case AST_IO_VGACRD1_TX_FW_EMBEDDED_FW:
+               tx_chip = AST_TX_DP501;
+               break;
+       /*
+        * GEN7+
+        */
+       case AST_IO_VGACRD1_TX_ASTDP:
+               tx_chip = AST_TX_ASTDP;
+               break;
+       /*
+        * Several of the listed TX chips are not explicitly supported
+        * by the ast driver. If these exist in real-world devices, they
+        * are most likely reported as VGA or SIL164 outputs. We warn here
+        * to get bug reports for these devices. If none come in for some
+        * time, we can begin to fail device probing on these values.
+        */
+       case AST_IO_VGACRD1_TX_ITE66121_VBIOS:
+               drm_warn(dev, "ITE IT66121 detected, 0x%x, Gen%lu\n", vgacrd1, 
AST_GEN(ast));
+               break;
+       case AST_IO_VGACRD1_TX_CH7003_VBIOS:
+               drm_warn(dev, "Chrontel CH7003 detected, 0x%x, Gen%lu\n", 
vgacrd1, AST_GEN(ast));
+               break;
+       case AST_IO_VGACRD1_TX_ANX9807_VBIOS:
+               drm_warn(dev, "Analogix ANX9807 detected, 0x%x, Gen%lu\n", 
vgacrd1, AST_GEN(ast));
+               break;
+       }
+
+       __ast_device_set_tx_chip(ast, tx_chip);
+}
diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c
index 473faa92d08c..c653ea5570d8 100644
--- a/drivers/gpu/drm/ast/ast_drv.c
+++ b/drivers/gpu/drm/ast/ast_drv.c
@@ -37,6 +37,7 @@
 #include <drm/drm_fbdev_shmem.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/drm_module.h>
+#include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
 #include "ast_drv.h"
@@ -46,6 +47,20 @@ static int ast_modeset = -1;
 MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
 module_param_named(modeset, ast_modeset, int, 0400);
 
+void __ast_device_set_tx_chip(struct ast_device *ast, enum ast_tx_chip tx_chip)
+{
+       static const char * const info_str[] = {
+               "analog VGA",
+               "Sil164 TMDS transmitter",
+               "DP501 DisplayPort transmitter",
+               "ASPEED DisplayPort transmitter",
+       };
+
+       drm_info(&ast->base, "Using %s\n", info_str[tx_chip]);
+
+       ast->tx_chip = tx_chip;
+}
+
 /*
  * DRM driver
  */
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index c75600981251..ae8e6083bc2b 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -415,9 +415,13 @@ struct ast_crtc_state {
 
 int ast_mm_init(struct ast_device *ast);
 
+/* ast_drv.c */
+void __ast_device_set_tx_chip(struct ast_device *ast, enum ast_tx_chip 
tx_chip);
+
 /* ast_2000.c */
 int ast_2000_post(struct ast_device *ast);
 extern const struct ast_vbios_dclk_info ast_2000_dclk_table[];
+void ast_2000_detect_tx_chip(struct ast_device *ast, bool need_post);
 
 /* ast_2100.c */
 int ast_2100_post(struct ast_device *ast);
@@ -426,6 +430,7 @@ bool __ast_2100_detect_wuxga(struct ast_device *ast);
 
 /* ast_2300.c */
 int ast_2300_post(struct ast_device *ast);
+void ast_2300_detect_tx_chip(struct ast_device *ast);
 
 /* ast_2500.c */
 void ast_2500_patch_ahb(void __iomem *regs);
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
index 1678845274c7..8ed15563173c 100644
--- a/drivers/gpu/drm/ast/ast_main.c
+++ b/drivers/gpu/drm/ast/ast_main.c
@@ -95,94 +95,6 @@ static void ast_detect_widescreen(struct ast_device *ast)
        }
 }
 
-static void ast_detect_tx_chip(struct ast_device *ast, bool need_post)
-{
-       static const char * const info_str[] = {
-               "analog VGA",
-               "Sil164 TMDS transmitter",
-               "DP501 DisplayPort transmitter",
-               "ASPEED DisplayPort transmitter",
-       };
-
-       struct drm_device *dev = &ast->base;
-       u8 vgacra3, vgacrd1;
-
-       /* Check 3rd Tx option (digital output afaik) */
-       ast->tx_chip = AST_TX_NONE;
-
-       if (AST_GEN(ast) <= 3) {
-               /*
-                * VGACRA3 Enhanced Color Mode Register, check if DVO is already
-                * enabled, in that case, assume we have a SIL164 TMDS 
transmitter
-                *
-                * Don't make that assumption if we the chip wasn't enabled and
-                * is at power-on reset, otherwise we'll incorrectly "detect" a
-                * SIL164 when there is none.
-                */
-               if (!need_post) {
-                       vgacra3 = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 
0xa3, 0xff);
-                       if (vgacra3 & AST_IO_VGACRA3_DVO_ENABLED)
-                               ast->tx_chip = AST_TX_SIL164;
-               }
-       } else {
-               /*
-                * On AST GEN4+, look at the configuration set by the SoC in
-                * the SOC scratch register #1 bits 11:8 (interestingly marked
-                * as "reserved" in the spec)
-                */
-               vgacrd1 = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xd1,
-                                                AST_IO_VGACRD1_TX_TYPE_MASK);
-               switch (vgacrd1) {
-               /*
-                * GEN4 to GEN6
-                */
-               case AST_IO_VGACRD1_TX_SIL164_VBIOS:
-                       ast->tx_chip = AST_TX_SIL164;
-                       break;
-               case AST_IO_VGACRD1_TX_DP501_VBIOS:
-                       ast->dp501_fw_addr = drmm_kzalloc(dev, 32*1024, 
GFP_KERNEL);
-                       if (ast->dp501_fw_addr) {
-                               /* backup firmware */
-                               if (ast_backup_fw(ast, ast->dp501_fw_addr, 
32*1024)) {
-                                       drmm_kfree(dev, ast->dp501_fw_addr);
-                                       ast->dp501_fw_addr = NULL;
-                               }
-                       }
-                       fallthrough;
-               case AST_IO_VGACRD1_TX_FW_EMBEDDED_FW:
-                       ast->tx_chip = AST_TX_DP501;
-                       break;
-               /*
-                * GEN7+
-                */
-               case AST_IO_VGACRD1_TX_ASTDP:
-                       ast->tx_chip = AST_TX_ASTDP;
-                       break;
-               /*
-                * Several of the listed TX chips are not explicitly supported
-                * by the ast driver. If these exist in real-world devices, they
-                * are most likely reported as VGA or SIL164 outputs. We warn 
here
-                * to get bug reports for these devices. If none come in for 
some
-                * time, we can begin to fail device probing on these values.
-                */
-               case AST_IO_VGACRD1_TX_ITE66121_VBIOS:
-                       drm_warn(dev, "ITE IT66121 detected, 0x%x, Gen%lu\n",
-                                vgacrd1, AST_GEN(ast));
-                       break;
-               case AST_IO_VGACRD1_TX_CH7003_VBIOS:
-                       drm_warn(dev, "Chrontel CH7003 detected, 0x%x, 
Gen%lu\n",
-                                vgacrd1, AST_GEN(ast));
-                       break;
-               case AST_IO_VGACRD1_TX_ANX9807_VBIOS:
-                       drm_warn(dev, "Analogix ANX9807 detected, 0x%x, 
Gen%lu\n",
-                                vgacrd1, AST_GEN(ast));
-                       break;
-               }
-       }
-
-       drm_info(dev, "Using %s\n", info_str[ast->tx_chip]);
-}
-
 struct drm_device *ast_device_create(struct pci_dev *pdev,
                                     const struct drm_driver *drv,
                                     enum ast_chip chip,
@@ -205,7 +117,11 @@ struct drm_device *ast_device_create(struct pci_dev *pdev,
        ast->regs = regs;
        ast->ioregs = ioregs;
 
-       ast_detect_tx_chip(ast, need_post);
+       if (AST_GEN(ast) >= 4)
+               ast_2300_detect_tx_chip(ast);
+       else
+               ast_2000_detect_tx_chip(ast, need_post);
+
        switch (ast->tx_chip) {
        case AST_TX_ASTDP:
                ret = ast_post_gpu(ast);
-- 
2.51.0

Reply via email to