xref: /linux/drivers/gpu/drm/ast/ast_2100.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
11be08550SThomas Zimmermann // SPDX-License-Identifier: MIT
21be08550SThomas Zimmermann /*
31be08550SThomas Zimmermann  * Copyright 2012 Red Hat Inc.
41be08550SThomas Zimmermann  *
51be08550SThomas Zimmermann  * Permission is hereby granted, free of charge, to any person obtaining a
61be08550SThomas Zimmermann  * copy of this software and associated documentation files (the
71be08550SThomas Zimmermann  * "Software"), to deal in the Software without restriction, including
81be08550SThomas Zimmermann  * without limitation the rights to use, copy, modify, merge, publish,
91be08550SThomas Zimmermann  * distribute, sub license, and/or sell copies of the Software, and to
101be08550SThomas Zimmermann  * permit persons to whom the Software is furnished to do so, subject to
111be08550SThomas Zimmermann  * the following conditions:
121be08550SThomas Zimmermann  *
131be08550SThomas Zimmermann  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
141be08550SThomas Zimmermann  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
151be08550SThomas Zimmermann  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
161be08550SThomas Zimmermann  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
171be08550SThomas Zimmermann  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
181be08550SThomas Zimmermann  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
191be08550SThomas Zimmermann  * USE OR OTHER DEALINGS IN THE SOFTWARE.
201be08550SThomas Zimmermann  *
211be08550SThomas Zimmermann  * The above copyright notice and this permission notice (including the
221be08550SThomas Zimmermann  * next paragraph) shall be included in all copies or substantial portions
231be08550SThomas Zimmermann  * of the Software.
241be08550SThomas Zimmermann  */
251be08550SThomas Zimmermann /*
261be08550SThomas Zimmermann  * Authors: Dave Airlie <airlied@redhat.com>
271be08550SThomas Zimmermann  */
281be08550SThomas Zimmermann 
291be08550SThomas Zimmermann #include <linux/delay.h>
301be08550SThomas Zimmermann 
311be08550SThomas Zimmermann #include "ast_drv.h"
32f28f15e6SThomas Zimmermann #include "ast_post.h"
331be08550SThomas Zimmermann 
341be08550SThomas Zimmermann /*
351be08550SThomas Zimmermann  * POST
361be08550SThomas Zimmermann  */
371be08550SThomas Zimmermann 
381be08550SThomas Zimmermann static const struct ast_dramstruct ast1100_dram_table_data[] = {
391be08550SThomas Zimmermann 	{ 0x2000, 0x1688a8a8 },
401be08550SThomas Zimmermann 	{ 0x2020, 0x000041f0 },
41eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_UDELAY(67u),
421be08550SThomas Zimmermann 	{ 0x0000, 0xfc600309 },
431be08550SThomas Zimmermann 	{ 0x006C, 0x00909090 },
441be08550SThomas Zimmermann 	{ 0x0064, 0x00050000 },
45eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_INIT(DRAM_TYPE, 0x00000585),
461be08550SThomas Zimmermann 	{ 0x0008, 0x0011030f },
471be08550SThomas Zimmermann 	{ 0x0010, 0x22201724 },
481be08550SThomas Zimmermann 	{ 0x0018, 0x1e29011a },
491be08550SThomas Zimmermann 	{ 0x0020, 0x00c82222 },
501be08550SThomas Zimmermann 	{ 0x0014, 0x01001523 },
511be08550SThomas Zimmermann 	{ 0x001C, 0x1024010d },
521be08550SThomas Zimmermann 	{ 0x0024, 0x00cb2522 },
531be08550SThomas Zimmermann 	{ 0x0038, 0xffffff82 },
541be08550SThomas Zimmermann 	{ 0x003C, 0x00000000 },
551be08550SThomas Zimmermann 	{ 0x0040, 0x00000000 },
561be08550SThomas Zimmermann 	{ 0x0044, 0x00000000 },
571be08550SThomas Zimmermann 	{ 0x0048, 0x00000000 },
581be08550SThomas Zimmermann 	{ 0x004C, 0x00000000 },
591be08550SThomas Zimmermann 	{ 0x0050, 0x00000000 },
601be08550SThomas Zimmermann 	{ 0x0054, 0x00000000 },
611be08550SThomas Zimmermann 	{ 0x0058, 0x00000000 },
621be08550SThomas Zimmermann 	{ 0x005C, 0x00000000 },
631be08550SThomas Zimmermann 	{ 0x0060, 0x032aa02a },
641be08550SThomas Zimmermann 	{ 0x0064, 0x002d3000 },
651be08550SThomas Zimmermann 	{ 0x0068, 0x00000000 },
661be08550SThomas Zimmermann 	{ 0x0070, 0x00000000 },
671be08550SThomas Zimmermann 	{ 0x0074, 0x00000000 },
681be08550SThomas Zimmermann 	{ 0x0078, 0x00000000 },
691be08550SThomas Zimmermann 	{ 0x007C, 0x00000000 },
701be08550SThomas Zimmermann 	{ 0x0034, 0x00000001 },
71eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_UDELAY(67u),
721be08550SThomas Zimmermann 	{ 0x002C, 0x00000732 },
731be08550SThomas Zimmermann 	{ 0x0030, 0x00000040 },
741be08550SThomas Zimmermann 	{ 0x0028, 0x00000005 },
751be08550SThomas Zimmermann 	{ 0x0028, 0x00000007 },
761be08550SThomas Zimmermann 	{ 0x0028, 0x00000003 },
771be08550SThomas Zimmermann 	{ 0x0028, 0x00000001 },
781be08550SThomas Zimmermann 	{ 0x000C, 0x00005a08 },
791be08550SThomas Zimmermann 	{ 0x002C, 0x00000632 },
801be08550SThomas Zimmermann 	{ 0x0028, 0x00000001 },
811be08550SThomas Zimmermann 	{ 0x0030, 0x000003c0 },
821be08550SThomas Zimmermann 	{ 0x0028, 0x00000003 },
831be08550SThomas Zimmermann 	{ 0x0030, 0x00000040 },
841be08550SThomas Zimmermann 	{ 0x0028, 0x00000003 },
851be08550SThomas Zimmermann 	{ 0x000C, 0x00005a21 },
861be08550SThomas Zimmermann 	{ 0x0034, 0x00007c03 },
871be08550SThomas Zimmermann 	{ 0x0120, 0x00004c41 },
88eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_INVALID,
891be08550SThomas Zimmermann };
901be08550SThomas Zimmermann 
911be08550SThomas Zimmermann static const struct ast_dramstruct ast2100_dram_table_data[] = {
921be08550SThomas Zimmermann 	{ 0x2000, 0x1688a8a8 },
931be08550SThomas Zimmermann 	{ 0x2020, 0x00004120 },
94eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_UDELAY(67u),
951be08550SThomas Zimmermann 	{ 0x0000, 0xfc600309 },
961be08550SThomas Zimmermann 	{ 0x006C, 0x00909090 },
971be08550SThomas Zimmermann 	{ 0x0064, 0x00070000 },
98eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_INIT(DRAM_TYPE, 0x00000489),
991be08550SThomas Zimmermann 	{ 0x0008, 0x0011030f },
1001be08550SThomas Zimmermann 	{ 0x0010, 0x32302926 },
1011be08550SThomas Zimmermann 	{ 0x0018, 0x274c0122 },
1021be08550SThomas Zimmermann 	{ 0x0020, 0x00ce2222 },
1031be08550SThomas Zimmermann 	{ 0x0014, 0x01001523 },
1041be08550SThomas Zimmermann 	{ 0x001C, 0x1024010d },
1051be08550SThomas Zimmermann 	{ 0x0024, 0x00cb2522 },
1061be08550SThomas Zimmermann 	{ 0x0038, 0xffffff82 },
1071be08550SThomas Zimmermann 	{ 0x003C, 0x00000000 },
1081be08550SThomas Zimmermann 	{ 0x0040, 0x00000000 },
1091be08550SThomas Zimmermann 	{ 0x0044, 0x00000000 },
1101be08550SThomas Zimmermann 	{ 0x0048, 0x00000000 },
1111be08550SThomas Zimmermann 	{ 0x004C, 0x00000000 },
1121be08550SThomas Zimmermann 	{ 0x0050, 0x00000000 },
1131be08550SThomas Zimmermann 	{ 0x0054, 0x00000000 },
1141be08550SThomas Zimmermann 	{ 0x0058, 0x00000000 },
1151be08550SThomas Zimmermann 	{ 0x005C, 0x00000000 },
1161be08550SThomas Zimmermann 	{ 0x0060, 0x0f2aa02a },
1171be08550SThomas Zimmermann 	{ 0x0064, 0x003f3005 },
1181be08550SThomas Zimmermann 	{ 0x0068, 0x02020202 },
1191be08550SThomas Zimmermann 	{ 0x0070, 0x00000000 },
1201be08550SThomas Zimmermann 	{ 0x0074, 0x00000000 },
1211be08550SThomas Zimmermann 	{ 0x0078, 0x00000000 },
1221be08550SThomas Zimmermann 	{ 0x007C, 0x00000000 },
1231be08550SThomas Zimmermann 	{ 0x0034, 0x00000001 },
124eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_UDELAY(67u),
1251be08550SThomas Zimmermann 	{ 0x002C, 0x00000942 },
1261be08550SThomas Zimmermann 	{ 0x0030, 0x00000040 },
1271be08550SThomas Zimmermann 	{ 0x0028, 0x00000005 },
1281be08550SThomas Zimmermann 	{ 0x0028, 0x00000007 },
1291be08550SThomas Zimmermann 	{ 0x0028, 0x00000003 },
1301be08550SThomas Zimmermann 	{ 0x0028, 0x00000001 },
1311be08550SThomas Zimmermann 	{ 0x000C, 0x00005a08 },
1321be08550SThomas Zimmermann 	{ 0x002C, 0x00000842 },
1331be08550SThomas Zimmermann 	{ 0x0028, 0x00000001 },
1341be08550SThomas Zimmermann 	{ 0x0030, 0x000003c0 },
1351be08550SThomas Zimmermann 	{ 0x0028, 0x00000003 },
1361be08550SThomas Zimmermann 	{ 0x0030, 0x00000040 },
1371be08550SThomas Zimmermann 	{ 0x0028, 0x00000003 },
1381be08550SThomas Zimmermann 	{ 0x000C, 0x00005a21 },
1391be08550SThomas Zimmermann 	{ 0x0034, 0x00007c03 },
1401be08550SThomas Zimmermann 	{ 0x0120, 0x00005061 },
141eb104c69SThomas Zimmermann 	AST_DRAMSTRUCT_INVALID,
1421be08550SThomas Zimmermann };
1431be08550SThomas Zimmermann 
1441be08550SThomas Zimmermann /*
1451be08550SThomas Zimmermann  * AST2100/2150 DLL CBR Setting
1461be08550SThomas Zimmermann  */
1471be08550SThomas Zimmermann #define CBR_SIZE_AST2150	     ((16 << 10) - 1)
1481be08550SThomas Zimmermann #define CBR_PASSNUM_AST2150          5
1491be08550SThomas Zimmermann #define CBR_THRESHOLD_AST2150        10
1501be08550SThomas Zimmermann #define CBR_THRESHOLD2_AST2150       10
1511be08550SThomas Zimmermann #define TIMEOUT_AST2150              5000000
1521be08550SThomas Zimmermann 
1531be08550SThomas Zimmermann #define CBR_PATNUM_AST2150           8
1541be08550SThomas Zimmermann 
1551be08550SThomas Zimmermann static const u32 pattern_AST2150[14] = {
1561be08550SThomas Zimmermann 	0xFF00FF00,
1571be08550SThomas Zimmermann 	0xCC33CC33,
1581be08550SThomas Zimmermann 	0xAA55AA55,
1591be08550SThomas Zimmermann 	0xFFFE0001,
1601be08550SThomas Zimmermann 	0x683501FE,
1611be08550SThomas Zimmermann 	0x0F1929B0,
1621be08550SThomas Zimmermann 	0x2D0B4346,
1631be08550SThomas Zimmermann 	0x60767F02,
1641be08550SThomas Zimmermann 	0x6FBE36A6,
1651be08550SThomas Zimmermann 	0x3A253035,
1661be08550SThomas Zimmermann 	0x3019686D,
1671be08550SThomas Zimmermann 	0x41C6167E,
1681be08550SThomas Zimmermann 	0x620152BF,
1691be08550SThomas Zimmermann 	0x20F050E0
1701be08550SThomas Zimmermann };
1711be08550SThomas Zimmermann 
1721be08550SThomas Zimmermann static u32 mmctestburst2_ast2150(struct ast_device *ast, u32 datagen)
1731be08550SThomas Zimmermann {
1741be08550SThomas Zimmermann 	u32 data, timeout;
1751be08550SThomas Zimmermann 
1761be08550SThomas Zimmermann 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
1771be08550SThomas Zimmermann 	ast_moutdwm(ast, 0x1e6e0070, 0x00000001 | (datagen << 3));
1781be08550SThomas Zimmermann 	timeout = 0;
1791be08550SThomas Zimmermann 	do {
1801be08550SThomas Zimmermann 		data = ast_mindwm(ast, 0x1e6e0070) & 0x40;
1811be08550SThomas Zimmermann 		if (++timeout > TIMEOUT_AST2150) {
1821be08550SThomas Zimmermann 			ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
1831be08550SThomas Zimmermann 			return 0xffffffff;
1841be08550SThomas Zimmermann 		}
1851be08550SThomas Zimmermann 	} while (!data);
1861be08550SThomas Zimmermann 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
1871be08550SThomas Zimmermann 	ast_moutdwm(ast, 0x1e6e0070, 0x00000003 | (datagen << 3));
1881be08550SThomas Zimmermann 	timeout = 0;
1891be08550SThomas Zimmermann 	do {
1901be08550SThomas Zimmermann 		data = ast_mindwm(ast, 0x1e6e0070) & 0x40;
1911be08550SThomas Zimmermann 		if (++timeout > TIMEOUT_AST2150) {
1921be08550SThomas Zimmermann 			ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
1931be08550SThomas Zimmermann 			return 0xffffffff;
1941be08550SThomas Zimmermann 		}
1951be08550SThomas Zimmermann 	} while (!data);
1961be08550SThomas Zimmermann 	data = (ast_mindwm(ast, 0x1e6e0070) & 0x80) >> 7;
1971be08550SThomas Zimmermann 	ast_moutdwm(ast, 0x1e6e0070, 0x00000000);
1981be08550SThomas Zimmermann 	return data;
1991be08550SThomas Zimmermann }
2001be08550SThomas Zimmermann 
2011be08550SThomas Zimmermann static int cbrtest_ast2150(struct ast_device *ast)
2021be08550SThomas Zimmermann {
2031be08550SThomas Zimmermann 	int i;
2041be08550SThomas Zimmermann 
2051be08550SThomas Zimmermann 	for (i = 0; i < 8; i++)
2061be08550SThomas Zimmermann 		if (mmctestburst2_ast2150(ast, i))
2071be08550SThomas Zimmermann 			return 0;
2081be08550SThomas Zimmermann 	return 1;
2091be08550SThomas Zimmermann }
2101be08550SThomas Zimmermann 
2111be08550SThomas Zimmermann static int cbrscan_ast2150(struct ast_device *ast, int busw)
2121be08550SThomas Zimmermann {
2131be08550SThomas Zimmermann 	u32 patcnt, loop;
2141be08550SThomas Zimmermann 
2151be08550SThomas Zimmermann 	for (patcnt = 0; patcnt < CBR_PATNUM_AST2150; patcnt++) {
2161be08550SThomas Zimmermann 		ast_moutdwm(ast, 0x1e6e007c, pattern_AST2150[patcnt]);
2171be08550SThomas Zimmermann 		for (loop = 0; loop < CBR_PASSNUM_AST2150; loop++) {
2181be08550SThomas Zimmermann 			if (cbrtest_ast2150(ast))
2191be08550SThomas Zimmermann 				break;
2201be08550SThomas Zimmermann 		}
2211be08550SThomas Zimmermann 		if (loop == CBR_PASSNUM_AST2150)
2221be08550SThomas Zimmermann 			return 0;
2231be08550SThomas Zimmermann 	}
2241be08550SThomas Zimmermann 	return 1;
2251be08550SThomas Zimmermann }
2261be08550SThomas Zimmermann 
2271be08550SThomas Zimmermann static void cbrdlli_ast2150(struct ast_device *ast, int busw)
2281be08550SThomas Zimmermann {
2291be08550SThomas Zimmermann 	u32 dll_min[4], dll_max[4], dlli, data, passcnt;
2301be08550SThomas Zimmermann 
2311be08550SThomas Zimmermann cbr_start:
2321be08550SThomas Zimmermann 	dll_min[0] = 0xff;
2331be08550SThomas Zimmermann 	dll_min[1] = 0xff;
2341be08550SThomas Zimmermann 	dll_min[2] = 0xff;
2351be08550SThomas Zimmermann 	dll_min[3] = 0xff;
2361be08550SThomas Zimmermann 	dll_max[0] = 0x00;
2371be08550SThomas Zimmermann 	dll_max[1] = 0x00;
2381be08550SThomas Zimmermann 	dll_max[2] = 0x00;
2391be08550SThomas Zimmermann 	dll_max[3] = 0x00;
2401be08550SThomas Zimmermann 	passcnt = 0;
2411be08550SThomas Zimmermann 
2421be08550SThomas Zimmermann 	for (dlli = 0; dlli < 100; dlli++) {
2431be08550SThomas Zimmermann 		ast_moutdwm(ast, 0x1e6e0068, dlli | (dlli << 8) | (dlli << 16) | (dlli << 24));
2441be08550SThomas Zimmermann 		data = cbrscan_ast2150(ast, busw);
2451be08550SThomas Zimmermann 		if (data != 0) {
2461be08550SThomas Zimmermann 			if (data & 0x1) {
2471be08550SThomas Zimmermann 				if (dll_min[0] > dlli)
2481be08550SThomas Zimmermann 					dll_min[0] = dlli;
2491be08550SThomas Zimmermann 				if (dll_max[0] < dlli)
2501be08550SThomas Zimmermann 					dll_max[0] = dlli;
2511be08550SThomas Zimmermann 			}
2521be08550SThomas Zimmermann 			passcnt++;
2531be08550SThomas Zimmermann 		} else if (passcnt >= CBR_THRESHOLD_AST2150) {
2541be08550SThomas Zimmermann 			goto cbr_start;
2551be08550SThomas Zimmermann 		}
2561be08550SThomas Zimmermann 	}
2571be08550SThomas Zimmermann 	if (dll_max[0] == 0 || (dll_max[0] - dll_min[0]) < CBR_THRESHOLD_AST2150)
2581be08550SThomas Zimmermann 		goto cbr_start;
2591be08550SThomas Zimmermann 
2601be08550SThomas Zimmermann 	dlli = dll_min[0] + (((dll_max[0] - dll_min[0]) * 7) >> 4);
2611be08550SThomas Zimmermann 	ast_moutdwm(ast, 0x1e6e0068, dlli | (dlli << 8) | (dlli << 16) | (dlli << 24));
2621be08550SThomas Zimmermann }
2631be08550SThomas Zimmermann 
2641be08550SThomas Zimmermann static void ast_post_chip_2100(struct ast_device *ast)
2651be08550SThomas Zimmermann {
2661be08550SThomas Zimmermann 	u8 j;
2671be08550SThomas Zimmermann 	u32 data, temp, i;
2681be08550SThomas Zimmermann 	const struct ast_dramstruct *dram_reg_info;
2691be08550SThomas Zimmermann 
2701be08550SThomas Zimmermann 	j = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xd0, 0xff);
2711be08550SThomas Zimmermann 
2721be08550SThomas Zimmermann 	if ((j & 0x80) == 0) { /* VGA only */
2731be08550SThomas Zimmermann 		if (ast->chip == AST2100 || ast->chip == AST2200)
2741be08550SThomas Zimmermann 			dram_reg_info = ast2100_dram_table_data;
2751be08550SThomas Zimmermann 		else
2761be08550SThomas Zimmermann 			dram_reg_info = ast1100_dram_table_data;
2771be08550SThomas Zimmermann 
2781be08550SThomas Zimmermann 		ast_write32(ast, 0xf004, 0x1e6e0000);
2791be08550SThomas Zimmermann 		ast_write32(ast, 0xf000, 0x1);
2801be08550SThomas Zimmermann 		ast_write32(ast, 0x12000, 0x1688A8A8);
2811be08550SThomas Zimmermann 		do {
2821be08550SThomas Zimmermann 			;
2831be08550SThomas Zimmermann 		} while (ast_read32(ast, 0x12000) != 0x01);
2841be08550SThomas Zimmermann 
2851be08550SThomas Zimmermann 		ast_write32(ast, 0x10000, 0xfc600309);
2861be08550SThomas Zimmermann 		do {
2871be08550SThomas Zimmermann 			;
2881be08550SThomas Zimmermann 		} while (ast_read32(ast, 0x10000) != 0x01);
2891be08550SThomas Zimmermann 
290eb104c69SThomas Zimmermann 		while (!AST_DRAMSTRUCT_IS(dram_reg_info, INVALID)) {
291eb104c69SThomas Zimmermann 			if (AST_DRAMSTRUCT_IS(dram_reg_info, UDELAY)) {
2921be08550SThomas Zimmermann 				for (i = 0; i < 15; i++)
2931be08550SThomas Zimmermann 					udelay(dram_reg_info->data);
294eb104c69SThomas Zimmermann 			} else if (AST_DRAMSTRUCT_IS(dram_reg_info, DRAM_TYPE)) {
2951be08550SThomas Zimmermann 				data = dram_reg_info->data;
2961be08550SThomas Zimmermann 				if (ast->dram_type == AST_DRAM_1Gx16)
2971be08550SThomas Zimmermann 					data = 0x00000d89;
2981be08550SThomas Zimmermann 				else if (ast->dram_type == AST_DRAM_1Gx32)
2991be08550SThomas Zimmermann 					data = 0x00000c8d;
3001be08550SThomas Zimmermann 
3011be08550SThomas Zimmermann 				temp = ast_read32(ast, 0x12070);
3021be08550SThomas Zimmermann 				temp &= 0xc;
3031be08550SThomas Zimmermann 				temp <<= 2;
3041be08550SThomas Zimmermann 				ast_write32(ast, 0x10000 + dram_reg_info->index, data | temp);
3051be08550SThomas Zimmermann 			} else {
3061be08550SThomas Zimmermann 				ast_write32(ast, 0x10000 + dram_reg_info->index,
3071be08550SThomas Zimmermann 					    dram_reg_info->data);
3081be08550SThomas Zimmermann 			}
3091be08550SThomas Zimmermann 			dram_reg_info++;
3101be08550SThomas Zimmermann 		}
3111be08550SThomas Zimmermann 
3121be08550SThomas Zimmermann 		/* AST 2100/2150 DRAM calibration */
3131be08550SThomas Zimmermann 		data = ast_read32(ast, 0x10120);
3141be08550SThomas Zimmermann 		if (data == 0x5061) { /* 266Mhz */
3151be08550SThomas Zimmermann 			data = ast_read32(ast, 0x10004);
3161be08550SThomas Zimmermann 			if (data & 0x40)
3171be08550SThomas Zimmermann 				cbrdlli_ast2150(ast, 16); /* 16 bits */
3181be08550SThomas Zimmermann 			else
3191be08550SThomas Zimmermann 				cbrdlli_ast2150(ast, 32); /* 32 bits */
3201be08550SThomas Zimmermann 		}
3211be08550SThomas Zimmermann 
3221be08550SThomas Zimmermann 		temp = ast_read32(ast, 0x1200c);
3231be08550SThomas Zimmermann 		ast_write32(ast, 0x1200c, temp & 0xfffffffd);
3241be08550SThomas Zimmermann 		temp = ast_read32(ast, 0x12040);
3251be08550SThomas Zimmermann 		ast_write32(ast, 0x12040, temp | 0x40);
3261be08550SThomas Zimmermann 	}
3271be08550SThomas Zimmermann 
3281be08550SThomas Zimmermann 	/* wait ready */
3291be08550SThomas Zimmermann 	do {
3301be08550SThomas Zimmermann 		j = ast_get_index_reg_mask(ast, AST_IO_VGACRI, 0xd0, 0xff);
3311be08550SThomas Zimmermann 	} while ((j & 0x40) == 0);
3321be08550SThomas Zimmermann }
3331be08550SThomas Zimmermann 
3341be08550SThomas Zimmermann int ast_2100_post(struct ast_device *ast)
3351be08550SThomas Zimmermann {
336*b1ce4ab0SThomas Zimmermann 	ast_2000_set_def_ext_reg(ast);
337*b1ce4ab0SThomas Zimmermann 
3381be08550SThomas Zimmermann 	if (ast->config_mode == ast_use_p2a) {
3391be08550SThomas Zimmermann 		ast_post_chip_2100(ast);
3401be08550SThomas Zimmermann 	} else {
3411be08550SThomas Zimmermann 		if (ast->tx_chip == AST_TX_SIL164) {
3421be08550SThomas Zimmermann 			/* Enable DVO */
3431be08550SThomas Zimmermann 			ast_set_index_reg_mask(ast, AST_IO_VGACRI, 0xa3, 0xcf, 0x80);
3441be08550SThomas Zimmermann 		}
3451be08550SThomas Zimmermann 	}
3461be08550SThomas Zimmermann 
3471be08550SThomas Zimmermann 	return 0;
3481be08550SThomas Zimmermann }
349