]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/ast/ast_main.c
drm/ast: Base support for AST2500
[karo-tx-linux.git] / drivers / gpu / drm / ast / ast_main.c
index fd167008be318251fa9414b0ee27e8d4686193fd..8e8c0310245f8507b388b1aa53e642b773245c11 100644 (file)
@@ -142,7 +142,10 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post)
                ast->chip = AST1100;
                DRM_INFO("AST 1180 detected\n");
        } else {
-               if (dev->pdev->revision >= 0x30) {
+               if (dev->pdev->revision >= 0x40) {
+                       ast->chip = AST2500;
+                       DRM_INFO("AST 2500 detected\n");
+               } else if (dev->pdev->revision >= 0x30) {
                        ast->chip = AST2400;
                        DRM_INFO("AST 2400 detected\n");
                } else if (dev->pdev->revision >= 0x20) {
@@ -196,6 +199,9 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post)
                        if (ast->chip == AST2400 &&
                            (scu_rev & 0x300) == 0x100) /* ast1400 */
                                ast->support_wide_screen = true;
+                       if (ast->chip == AST2500 &&
+                           scu_rev == 0x100)           /* ast2510 */
+                               ast->support_wide_screen = true;
                }
                break;
        }
@@ -291,7 +297,10 @@ static int ast_get_dram_info(struct drm_device *dev)
        default:
                ast->dram_bus_width = 16;
                ast->dram_type = AST_DRAM_1Gx16;
-               ast->mclk = 396;
+               if (ast->chip == AST2500)
+                       ast->mclk = 800;
+               else
+                       ast->mclk = 396;
                return 0;
        }
 
@@ -300,7 +309,23 @@ static int ast_get_dram_info(struct drm_device *dev)
        else
                ast->dram_bus_width = 32;
 
-       if (ast->chip == AST2300 || ast->chip == AST2400) {
+       if (ast->chip == AST2500) {
+               switch (mcr_cfg & 0x03) {
+               case 0:
+                       ast->dram_type = AST_DRAM_1Gx16;
+                       break;
+               default:
+               case 1:
+                       ast->dram_type = AST_DRAM_2Gx16;
+                       break;
+               case 2:
+                       ast->dram_type = AST_DRAM_4Gx16;
+                       break;
+               case 3:
+                       ast->dram_type = AST_DRAM_8Gx16;
+                       break;
+               }
+       } else if (ast->chip == AST2300 || ast->chip == AST2400) {
                switch (mcr_cfg & 0x03) {
                case 0:
                        ast->dram_type = AST_DRAM_512Mx16;
@@ -523,6 +548,7 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags)
            ast->chip == AST2200 ||
            ast->chip == AST2300 ||
            ast->chip == AST2400 ||
+           ast->chip == AST2500 ||
            ast->chip == AST1180) {
                dev->mode_config.max_width = 1920;
                dev->mode_config.max_height = 2048;