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