Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ enum ast_chip {
	AST2200,
	AST2150,
	AST2300,
	AST2400,
	AST1180,
};

+14 −9
Original line number Diff line number Diff line
@@ -72,7 +72,10 @@ static int ast_detect_chip(struct drm_device *dev)
		ast->chip = AST1100;
		DRM_INFO("AST 1180 detected\n");
	} 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;
			DRM_INFO("AST 2300 detected\n");
		} else if (dev->pdev->revision >= 0x10) {
@@ -121,13 +124,14 @@ static int ast_detect_chip(struct drm_device *dev)
			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 */
			data &= 0x300;
			if (ast->chip == AST2300 && data == 0x0) /* ast1300 */
				ast->support_wide_screen = true;
			if (ast->chip == AST2400 && data == 0x100) /* ast1400 */
				ast->support_wide_screen = true;
			}
		}
		break;
	}
@@ -157,7 +161,7 @@ static int ast_get_dram_info(struct drm_device *dev)
	else
		ast->dram_bus_width = 32;

	if (ast->chip == AST2300) {
	if (ast->chip == AST2300 || ast->chip == AST2400) {
		switch (data & 0x03) {
		case 0:
			ast->dram_type = AST_DRAM_512Mx16;
@@ -344,6 +348,7 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags)
	if (ast->chip == AST2100 ||
	    ast->chip == AST2200 ||
	    ast->chip == AST2300 ||
	    ast->chip == AST2400 ||
	    ast->chip == AST1180) {
		dev->mode_config.max_width = 1920;
		dev->mode_config.max_height = 2048;
+2 −2
Original line number Diff line number Diff line
@@ -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);

	/* 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, 0xa6, 0x60);
	} else if (ast->chip == AST2100 ||
@@ -771,7 +771,7 @@ static int ast_mode_valid(struct drm_connector *connector,
		if ((mode->hdisplay == 1600) && (mode->vdisplay == 900))
			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))
				return MODE_OK;

+3 −3
Original line number Diff line number Diff line
@@ -78,7 +78,7 @@ ast_set_def_ext_reg(struct drm_device *dev)
	for (i = 0x81; i <= 0x8f; i++)
		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)
			ext_reg_info = extreginfo_ast2300;
		else
@@ -102,7 +102,7 @@ ast_set_def_ext_reg(struct drm_device *dev)

	/* Enable RAMDAC for A1 */
	reg = 0x04;
	if (ast->chip == AST2300)
	if (ast->chip == AST2300 || ast->chip == AST2400)
		reg |= 0x20;
	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)
	ast_open_key(ast);
	ast_set_def_ext_reg(dev);

	if (ast->chip == AST2300)
	if (ast->chip == AST2300 || ast->chip == AST2400)
		ast_init_dram_2300(dev);
	else
		ast_init_dram_reg(dev);