drm/ast: add widescreen + rb modes from X.org driver (v2)
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / ast / ast_main.c
index 50535fd5a88d258492b90ca9e9e9cebfaf2de563..cd0a791e76c5ba91141d2e40d224ec3418684102 100644 (file)
@@ -66,6 +66,7 @@ uint8_t ast_get_index_reg_mask(struct ast_private *ast,
 static int ast_detect_chip(struct drm_device *dev)
 {
        struct ast_private *ast = dev->dev_private;
+       uint32_t data, jreg;
 
        if (dev->pdev->device == PCI_CHIP_AST1180) {
                ast->chip = AST1100;
@@ -104,6 +105,33 @@ static int ast_detect_chip(struct drm_device *dev)
                        DRM_INFO("AST 2000 detected\n");
                }
        }
+
+       switch (ast->chip) {
+       case AST1180:
+               ast->support_wide_screen = true;
+               break;
+       case AST2000:
+               ast->support_wide_screen = false;
+               break;
+       default:
+               jreg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
+               if (!(jreg & 0x80))
+                       ast->support_wide_screen = true;
+               else if (jreg & 0x01)
+                       ast->support_wide_screen = true;
+               else {
+                       ast->support_wide_screen = false;
+                       if (ast->chip == AST2300) {
+                               ast_write32(ast, 0xf004, 0x1e6e0000);
+                               ast_write32(ast, 0xf000, 0x1);
+                               data = ast_read32(ast, 0x1207c);
+                               if ((data & 0x300) == 0) /* ast1300 */
+                                       ast->support_wide_screen = true;
+                       }
+               }
+               break;
+       }
+
        return 0;
 }