Commit 1453bf4c authored by Dave Airlie's avatar Dave Airlie

drm/ast: add AST 2400 support.

This is ported from the userspace driver.

Untested on any ast2400 hw so far.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent f1f62f2c
...@@ -61,6 +61,7 @@ enum ast_chip { ...@@ -61,6 +61,7 @@ enum ast_chip {
AST2200, AST2200,
AST2150, AST2150,
AST2300, AST2300,
AST2400,
AST1180, AST1180,
}; };
......
...@@ -72,7 +72,10 @@ static int ast_detect_chip(struct drm_device *dev) ...@@ -72,7 +72,10 @@ static int ast_detect_chip(struct drm_device *dev)
ast->chip = AST1100; ast->chip = AST1100;
DRM_INFO("AST 1180 detected\n"); DRM_INFO("AST 1180 detected\n");
} else { } else {
if (dev->pdev->revision >= 0x20) { if (dev->pdev->revision >= 0x30) {
ast->chip = AST2400;
DRM_INFO("AST 2400 detected\n");
} else if (dev->pdev->revision >= 0x20) {
ast->chip = AST2300; ast->chip = AST2300;
DRM_INFO("AST 2300 detected\n"); DRM_INFO("AST 2300 detected\n");
} else if (dev->pdev->revision >= 0x10) { } else if (dev->pdev->revision >= 0x10) {
...@@ -121,13 +124,14 @@ static int ast_detect_chip(struct drm_device *dev) ...@@ -121,13 +124,14 @@ static int ast_detect_chip(struct drm_device *dev)
ast->support_wide_screen = true; ast->support_wide_screen = true;
else { else {
ast->support_wide_screen = false; ast->support_wide_screen = false;
if (ast->chip == AST2300) { ast_write32(ast, 0xf004, 0x1e6e0000);
ast_write32(ast, 0xf004, 0x1e6e0000); ast_write32(ast, 0xf000, 0x1);
ast_write32(ast, 0xf000, 0x1); data = ast_read32(ast, 0x1207c);
data = ast_read32(ast, 0x1207c); data &= 0x300;
if ((data & 0x300) == 0) /* ast1300 */ if (ast->chip == AST2300 && data == 0x0) /* ast1300 */
ast->support_wide_screen = true; ast->support_wide_screen = true;
} if (ast->chip == AST2400 && data == 0x100) /* ast1400 */
ast->support_wide_screen = true;
} }
break; break;
} }
...@@ -157,7 +161,7 @@ static int ast_get_dram_info(struct drm_device *dev) ...@@ -157,7 +161,7 @@ static int ast_get_dram_info(struct drm_device *dev)
else else
ast->dram_bus_width = 32; ast->dram_bus_width = 32;
if (ast->chip == AST2300) { if (ast->chip == AST2300 || ast->chip == AST2400) {
switch (data & 0x03) { switch (data & 0x03) {
case 0: case 0:
ast->dram_type = AST_DRAM_512Mx16; ast->dram_type = AST_DRAM_512Mx16;
...@@ -344,6 +348,7 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags) ...@@ -344,6 +348,7 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags)
if (ast->chip == AST2100 || if (ast->chip == AST2100 ||
ast->chip == AST2200 || ast->chip == AST2200 ||
ast->chip == AST2300 || ast->chip == AST2300 ||
ast->chip == AST2400 ||
ast->chip == AST1180) { ast->chip == AST1180) {
dev->mode_config.max_width = 1920; dev->mode_config.max_width = 1920;
dev->mode_config.max_height = 2048; dev->mode_config.max_height = 2048;
......
...@@ -398,7 +398,7 @@ static void ast_set_ext_reg(struct drm_crtc *crtc, struct drm_display_mode *mode ...@@ -398,7 +398,7 @@ static void ast_set_ext_reg(struct drm_crtc *crtc, struct drm_display_mode *mode
ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa8, 0xfd, jregA8); ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa8, 0xfd, jregA8);
/* Set Threshold */ /* Set Threshold */
if (ast->chip == AST2300) { if (ast->chip == AST2300 || ast->chip == AST2400) {
ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa7, 0x78); ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa7, 0x78);
ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa6, 0x60); ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa6, 0x60);
} else if (ast->chip == AST2100 || } else if (ast->chip == AST2100 ||
...@@ -771,7 +771,7 @@ static int ast_mode_valid(struct drm_connector *connector, ...@@ -771,7 +771,7 @@ static int ast_mode_valid(struct drm_connector *connector,
if ((mode->hdisplay == 1600) && (mode->vdisplay == 900)) if ((mode->hdisplay == 1600) && (mode->vdisplay == 900))
return MODE_OK; return MODE_OK;
if ((ast->chip == AST2100) || (ast->chip == AST2200) || (ast->chip == AST2300) || (ast->chip == AST1180)) { if ((ast->chip == AST2100) || (ast->chip == AST2200) || (ast->chip == AST2300) || (ast->chip == AST2400) || (ast->chip == AST1180)) {
if ((mode->hdisplay == 1920) && (mode->vdisplay == 1080)) if ((mode->hdisplay == 1920) && (mode->vdisplay == 1080))
return MODE_OK; return MODE_OK;
......
...@@ -78,7 +78,7 @@ ast_set_def_ext_reg(struct drm_device *dev) ...@@ -78,7 +78,7 @@ ast_set_def_ext_reg(struct drm_device *dev)
for (i = 0x81; i <= 0x8f; i++) for (i = 0x81; i <= 0x8f; i++)
ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, 0x00); ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, 0x00);
if (ast->chip == AST2300) { if (ast->chip == AST2300 || ast->chip == AST2400) {
if (dev->pdev->revision >= 0x20) if (dev->pdev->revision >= 0x20)
ext_reg_info = extreginfo_ast2300; ext_reg_info = extreginfo_ast2300;
else else
...@@ -102,7 +102,7 @@ ast_set_def_ext_reg(struct drm_device *dev) ...@@ -102,7 +102,7 @@ ast_set_def_ext_reg(struct drm_device *dev)
/* Enable RAMDAC for A1 */ /* Enable RAMDAC for A1 */
reg = 0x04; reg = 0x04;
if (ast->chip == AST2300) if (ast->chip == AST2300 || ast->chip == AST2400)
reg |= 0x20; reg |= 0x20;
ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0xff, reg); ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0xff, reg);
} }
...@@ -365,7 +365,7 @@ void ast_post_gpu(struct drm_device *dev) ...@@ -365,7 +365,7 @@ void ast_post_gpu(struct drm_device *dev)
ast_open_key(ast); ast_open_key(ast);
ast_set_def_ext_reg(dev); ast_set_def_ext_reg(dev);
if (ast->chip == AST2300) if (ast->chip == AST2300 || ast->chip == AST2400)
ast_init_dram_2300(dev); ast_init_dram_2300(dev);
else else
ast_init_dram_reg(dev); ast_init_dram_reg(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment