trident_tv.c revision 95b296d0
1/* 2 * VIA TV additions 3 */ 4 5/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/trident/trident_tv.c,v 1.1 2003/04/15 22:13:43 alanh Exp $ */ 6 7#ifdef HAVE_CONFIG_H 8#include "config.h" 9#endif 10 11#include "trident.h" 12#include "trident_regs.h" 13 14/*************************************************************************** 15 * 16 * TV parameters for VT1621 17 * 18 ***************************************************************************/ 19#define TV_MODE 8 20#define TVX_MODE_SIZE 0X72 21#define TVX_CRTC_NUM 0x10 22#define TVX_REG_NUM 0x62 23#define TVX_VT1621_PORT 0x40 24#define SMBUS_BASE 0x5000 25unsigned char TVX_VT1621_Table[TV_MODE][TVX_MODE_SIZE] = { 26{ 27/* NTSC, 640x480, bpp=8,16 */ 280x02, 0x54, 0xE0, 0xFA, 0x11, 0x5D, 0x11, 0x57, 0x5A, 0x56, 290xA0, 0x26, 0x0A, 0x55, 0x37, 0x86, 30 310x6A, 0x0B, 0x22, 0x27, 0x43, 0x50, 0x13, 0x50, 320xB0, 0x07, 0xEE, 0x15, 0x90, 0xE4, 0x00, 0xA8, 330x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x00, 0x1C, 340x00, 0x40, 0x0C, 0x02, 0x01, 0x80, 0x00, 0x00, 350x0F, 0x06, 0x99, 0x7C, 0x04, 0x5D, 0x36, 0x9B, 360x54, 0x00, 0x00, 0xB4, 0x2F, 0x85, 0xFF, 0x00, 370x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02, 380x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F, 390x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF, 400x03, 0x01, 0x90, 0x33, 0x00, 0x00, 0x00, 0x00, 410x00, 0x04, 0x47, 0x02, 0x02, 0xFD, 0x06, 0xf8, 420x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 430x11, 0x6E 44}, 45{ 46/* NTSC, 800x600, bpp=8,16 */ 470X02, 0x79, 0XE0, 0x73, 0x02, 0x80, 0x01, 0x7A, 0x7E, 0xEC, 480xA0, 0x8A, 0x0E, 0xEB, 0x8B, 0x89, 49 500x8B, 0x0B, 0x6A, 0x27, 0x43, 0x50, 0x12, 0x50, 510xBC, 0x0A, 0XE8, 0x15, 0x88, 0xDC, 0x00, 0x98, 520x00, 0x00, 0x0A, 0x48, 0x1C, 0x28, 0x03, 0x20, 530x00, 0x40, 0x36, 0x02, 0x03, 0x80, 0x00, 0x00, 540x0D, 0x04, 0x04, 0x7B, 0x00, 0x5D, 0xC1, 0x9B, 550x6B, 0x00, 0x00, 0xA1, 0x3F, 0x9D, 0x2F, 0x10, 560x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02, 570x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F, 580x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF, 590x03, 0x01, 0xD6, 0x80, 0x00, 0x00, 0x00, 0x00, 600x00, 0x0C, 0x46, 0x02, 0x02, 0xFD, 0x06, 0xF8, 610x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 620x11, 0x6E 63}, 64{ 65/* NTSC, 640x480, bpp=32 */ 660X02, 0x54, 0XE0, 0xFA, 0x11, 0x5D, 0x01, 0x57, 0x5A, 0x56, 670xA0, 0x26, 0x0A, 0X55, 0x37, 0x46, 68 690x6A, 0x0B, 0x23, 0x33, 0x43, 0x50, 0x13, 0x51, 700xB0, 0x07, 0xAB, 0x15, 0x90, 0xA9, 0x00, 0x98, 710x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x03, 0x1C, 720x00, 0x40, 0x0C, 0x02, 0x03, 0x80, 0x00, 0x00, 730x0F, 0x04, 0x99, 0x7A, 0x04, 0x5E, 0xB6, 0x90, 740x5B, 0x00, 0x00, 0x67, 0x2F, 0x88, 0xFA, 0x00, 750x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02, 760x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F, 770x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF, 780x03, 0x01, 0xA0, 0x33, 0x1B, 0x00, 0X00, 0x00, 790x00, 0x08, 0x47, 0x02, 0x02, 0xFD, 0x06, 0xf8, 800x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 810x11, 0x6E 82}, 83{ 84/* NTSC, 800x600, bpp=32 */ 850X02, 0x79, 0XE0, 0x73, 0x02, 0x80, 0x01, 0x7B, 0x7E, 0xEC, 860xA0, 0x8A, 0x0E, 0xEB, 0x8B, 0x49, 87 880x8B, 0x0B, 0x6B, 0x27, 0x43, 0x50, 0x12, 0x2D, 890xBC, 0x0C, 0xED, 0x15, 0x88, 0xEE, 0x00, 0x99, 900x00, 0x00, 0x0A, 0x48, 0x1C, 0x28, 0x03, 0x20, 910x00, 0x40, 0x36, 0x02, 0x03, 0x80, 0x00, 0x00, 920x0D, 0x04, 0x04, 0x7A, 0x00, 0x5D, 0xC1, 0x9B, 930x6B, 0x00, 0x00, 0xA1, 0x3F, 0x9D, 0x2F, 0x10, 940x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02, 950x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F, 960x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF, 970x03, 0x01, 0xC6, 0x90, 0x00, 0x00, 0x00, 0x00, 980x00, 0x08, 0x46, 0x02, 0x02, 0xFD, 0x06, 0xF8, 990x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 1000x11, 0x6E 101}, 102{ 103/* PAL, 640x480, bpp=8,16 */ 1040X82, 0x5D, 0XE0, 0x23, 0x02, 0x64, 0x01, 0x56, 0x5A, 0x6F, 1050xA0, 0x0D, 0x0F, 0x6E, 0x24, 0xC1, 106 1070x6B, 0x0B, 0x03, 0x67, 0x40, 0x50, 0x12, 0x96, 1080xCE, 0x32, 0xFF, 0x01, 0x7E, 0xF6, 0x00, 0xA8, 1090x00, 0x00, 0x07, 0x48, 0x20, 0x1C, 0x44, 0x60, 1100x44, 0x4F, 0x1B, 0x02, 0x03, 0x80, 0x00, 0x00, 1110x0C, 0x0C, 0xD7, 0x84, 0x04, 0x68, 0x3B, 0x9C, 1120x57, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x29, 0x10, 1130x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00, 1140x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE, 1150x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55, 1160x01, 0x01, 0xA0, 0x33, 0x00, 0x00, 0x00, 0x00, 1170x00, 0x0C, 0x4E, 0xFE, 0x03, 0xFB, 0x06, 0xF8, 1180x0A, 0xF5, 0x0C, 0x73, 0x06, 0xF8, 0x0B, 0xF2, 1190x10, 0x6F 120}, 121{ 122/* PAL, 800x600, bpp=8,16 */ 1230X82, 0x5B, 0XE0, 0x91, 0x02, 0x73, 0x07, 0x6C, 0x70, 0xEC, 1240xA0, 0xA8, 0x0B, 0xEB, 0xAD, 0xC7, 125 1260x8B, 0x0B, 0x1A, 0x47, 0x40, 0x50, 0x12, 0x56, 1270x00, 0x37, 0xF7, 0x00, 0x7D, 0xE2, 0x00, 0xB9, 1280x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x44, 0x62, 1290x44, 0x4F, 0x53, 0x02, 0x07, 0x80, 0x00, 0x00, 1300x0A, 0x05, 0xA2, 0x83, 0x08, 0x68, 0x46, 0x99, 1310x68, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x6B, 0x10, 1320x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00, 1330x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE, 1340x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55, 1350x01, 0x01, 0xE6, 0x90, 0x00, 0x00, 0x00, 0x00, 1360x00, 0x0C, 0x4D, 0xFB, 0x04, 0xFB, 0x07, 0xF8, 1370x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2, 1380x10, 0x6F 139}, 140{ 141/* PAL, 640x480, bpp=32 */ 1420X82, 0x5D, 0XE0, 0x23, 0x02, 0x64, 0x01, 0x56, 0x5A, 0x6F, 1430xA0, 0x0D, 0x0F, 0x6E, 0x24, 0x81, 144 1450x6B, 0x0B, 0x02, 0x67, 0x40, 0x50, 0x12, 0x93, 1460xCE, 0x32, 0xF0, 0x01, 0x88, 0xE8, 0x00, 0xA8, 1470x00, 0x00, 0x07, 0x48, 0x20, 0x1C, 0x44, 0x60, 1480x44, 0x4F, 0x1B, 0x02, 0x03, 0x80, 0x00, 0x00, 1490x0C, 0x05, 0xE2, 0x84, 0x00, 0x68, 0x3B, 0x9C, 1500x57, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x29, 0x10, 1510x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00, 1520x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE, 1530x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55, 1540x01, 0x01, 0xA0, 0x33, 0x00, 0x00, 0x00, 0x00, 1550x00, 0x0C, 0x4E, 0xFE, 0x03, 0xFB, 0x06, 0xF8, 1560x0A, 0xF5, 0x0C, 0x73, 0x06, 0xF8, 0x0B, 0xF2, 1570x10, 0x6F 158}, 159{ 160/* PAL, 800x600, bpp=32 */ 1610X82, 0x5B, 0XE0, 0x91, 0x02, 0x73, 0x07, 0x6C, 0x70, 0xEC, 1620xA0, 0xA8, 0x0B, 0xEB, 0xAD, 0x87, 163 1640x8B, 0x0B, 0x1A, 0x67, 0x40, 0x50, 0x12, 0x53, 1650x00, 0x37, 0xEE, 0x00, 0x83, 0xEB, 0x00, 0xB9, 1660x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x44, 0x62, 1670x44, 0x4F, 0x53, 0x02, 0x07, 0x80, 0x00, 0x00, 1680x0A, 0x05, 0x5E, 0x83, 0x08, 0x68, 0x46, 0x99, 1690x68, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x6B, 0x10, 1700x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00, 1710x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE, 1720x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55, 1730x01, 0x01, 0xA0, 0x22, 0x00, 0x00, 0x00, 0x00, 1740x00, 0x0C, 0x4D, 0xFB, 0x04, 0xFB, 0x07, 0xF8, 1750x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2, 1760x10, 0x6F 177} 178}; 179/* TV Parameters for CH7005C */ 180#define TV_CH7005C_MODE_SIZE 45 181#define TV_CH7005C_CRTC_NUM 0x10 182#define TV_CH7005C_TVREG_NUM 29 183#define TV_CH7005C_PORT 0xEA 184unsigned char TV_CH7005C_Table[TV_MODE][TV_CH7005C_MODE_SIZE]={ 185{ 186/* NTSC 640x480 bpp=8,16 */ 1870x02, 0x80, 0x20, 0x02, 0x00, 0x5D, 0X80, 0X57, 0X80, 0X56, 1880XBA, 0X10, 0X8C, 0X50, 0XF8, 0X7F, 189 1900X6A, 0X7A, 0X00, 0X09, 0X80, 0X66, 0X00, 0X60, 1910X2E, 0XFF, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F, 1920X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00, 1930X00, 0X00, 0X0A, 0X02, 0X05 194}, 195{ 196/* NTSC 800X600 bpp=8,16 */ 1970x02, 0x80, 0x20, 0x02, 0x00, 0x7D, 0X80, 0X6E, 0X1C, 0XBA, 1980XF0, 0X70, 0X8C, 0XBA, 0X78, 0X53, 199 2000X8C, 0X4A, 0X00, 0X09, 0X80, 0XAE, 0X01, 0X80, 2010X2E, 0X02, 0X01, 0X0B, 0X7E, 0X7E, 0X7E, 0X7E, 2020X7E, 0X40, 0X01, 0X0C, 0X00, 0X00, 0X00, 0X00, 2030X00, 0X00, 0X0A, 0X00, 0X05 204}, 205{ 206/* NTSC 640x480 bpp=32 */ 2070x02, 0x80, 0x20, 0x02, 0x00, 0x5D, 0X80, 0X57, 0X80, 0X56, 2080XBA, 0X10, 0X8C, 0X50, 0XBD, 0X57, 209 2100X6A, 0X7A, 0X00, 0X09, 0X80, 0X67, 0X00, 0X60, 2110X2E, 0XFF, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F, 2120X7E, 0X40, 0X02, 0X00, 0X07, 0X0C, 0X0D, 0X00, 2130X00, 0X00, 0X0A, 0X02, 0X05 214}, 215{ 216/* NTSC 800X600 bpp=32 */ 2170x02, 0x80, 0x20, 0x02, 0x00, 0x7D, 0X80, 0X6E, 0X1C, 0XBA, 2180XF0, 0X70, 0X8C, 0XBA, 0XF8, 0X53, 219 2200X8C, 0X4A, 0X00, 0X09, 0X80, 0XAF, 0X01, 0X80, 2210X2E, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F, 2220X7E, 0X40, 0X01, 0X0C, 0X00, 0X00, 0X00, 0X00, 2230X00, 0X00, 0X0A, 0X00, 0X05 224}, 225{ 226/* PAL 640x480 bpp=8,16 */ 2270x82, 0x80, 0x20, 0x02, 0x00, 0x71, 0X74, 0X62, 0X84, 0X6F, 2280XF0, 0X10, 0X09, 0XEB, 0X80, 0X5F, 229 2300X81, 0X4A, 0X00, 0X09, 0X80, 0X84, 0X00, 0X70, 2310X28, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F, 2320X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00, 2330X00, 0X00, 0X0A, 0X01, 0X05 234}, 235{ 236/* PAL 800x600 bpp=8,16 */ 2370x82, 0x80, 0x20, 0x02, 0x00, 0x73, 0X76, 0X6A, 0X8C, 0XEC, 2380XF0, 0X7E, 0X09, 0XEB, 0X8F, 0X8D, 239 2400X83, 0X4A, 0X00, 0X09, 0X80, 0X7E, 0X00, 0X70, 2410X3F, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F, 2420X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00, 2430X00, 0X00, 0X0A, 0X01, 0X05 244}, 245{ 246/* PAL 640x480 bpp=32 */ 2470x82, 0x80, 0x20, 0x02, 0x00, 0x71, 0X74, 0X62, 0X84, 0X6F, 2480XF0, 0X10, 0X09, 0XEB, 0X80, 0X1F, 249 2500X81, 0X4A, 0X00, 0X09, 0X80, 0X84, 0X00, 0X70, 2510X28, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F, 2520X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00, 2530X00, 0X00, 0X0A, 0X01, 0X05 254}, 255{ 256/* PAL 800X600 bpp=32 */ 2570x82, 0x80, 0x20, 0x02, 0x00, 0x73, 0X76, 0X6A, 0X8C, 0XEC, 2580XF0, 0X7E, 0X09, 0XEB, 0X5D, 0X48, 259 2600X83, 0X4A, 0X00, 0X09, 0X80, 0X7E, 0X00, 0X70, 2610X3F, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F, 2620X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00, 2630X00, 0X00, 0X0A, 0X01, 0X05 264} 265}; 266 267static unsigned char smbus_read(ScrnInfoPtr pScrn, unsigned char bIndex, unsigned char devAdr) 268{ 269 TRIDENTPtr pTrident=TRIDENTPTR(pScrn); 270 unsigned short i; 271 unsigned char bData; 272 273 /* clear host status */ 274 OUTB(SMBUS_BASE, 0xFF); 275 276 /* check SMBUS ready */ 277 for ( i = 0; i < 0xFFFF; i++ ) 278 if ( (INB(SMBUS_BASE) & 0x01) == 0 ) 279 break; 280 281 /* set host command */ 282 OUTB(SMBUS_BASE+3, bIndex); 283 284 /* set slave address */ 285 OUTB(SMBUS_BASE+4, devAdr | 0x01); 286 287 /* start */ 288 OUTB(SMBUS_BASE+2, 0x48); 289 290 /* SMBUS Wait Ready */ 291 for ( i = 0; i < 0xFFFF; i++ ) 292 if ( (INB(SMBUS_BASE) & 0x01) == 0 ) 293 break; 294 bData=INB(SMBUS_BASE+5); 295 296 return bData; 297 298} 299 300static void smbus_write(ScrnInfoPtr pScrn, unsigned char bData, unsigned char bIndex, unsigned char devAdr) 301{ 302 TRIDENTPtr pTrident=TRIDENTPTR(pScrn); 303 unsigned short i; 304 305 /* clear host status */ 306 OUTB(SMBUS_BASE, 0xFF); 307 308 /* check SMBUS ready */ 309 for ( i = 0; i < 0xFFFF; i++ ) 310 if ( (INB(SMBUS_BASE) & 0x01) == 0 ) 311 break; 312 313 OUTB(SMBUS_BASE+2, 0x08); 314 315 /* set host command */ 316 OUTB(SMBUS_BASE+3, bIndex); 317 318 /* set slave address */ 319 OUTB(SMBUS_BASE+4, devAdr & 0xFE); 320 321 OUTB(SMBUS_BASE+5, bData); 322 323 /* start */ 324 OUTB(SMBUS_BASE+2, 0x48); 325 326 /* SMBUS Wait Ready */ 327 for ( i = 0; i < 0xFFFF; i++ ) 328 if ( (INB(SMBUS_BASE) & 0x01) == 0 ) 329 break; 330} 331void VIA_SaveTVDepentVGAReg(ScrnInfoPtr pScrn) 332{ 333 TRIDENTPtr pTrident=TRIDENTPTR(pScrn); 334 unsigned char protect; 335 unsigned char bTmp; 336 int i; 337 unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={ 338 0xD8,0XD9,/* SR */ 339 0X33,/* GR */ 340 0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */ 341 0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF 342 }; 343 unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={ 344 0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09, 345 0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14, 346 0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D, 347 0X1E,0X1F,0X20,0X21,0X3D 348 }; 349 350 /*ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg:\n");*/ 351 352 /* Unprotect */ 353 OUTB(0x3C4, 0x11); 354 protect = INB(0x3C5); 355 OUTB(0x3C5, 0x92); 356 357 /* Set TV Hw environment */ 358 OUTB(0x3d4,0xc1); 359 OUTB(0x3d5,0x41); 360 361 /* SR_d8,SR_d9 */ 362 for (i=0; i<2; i++) 363 { 364 OUTB(0x3c4,VGA_RegIdx_about_TV[i]); 365 bTmp=INB(0x3c5); 366 pTrident->DefaultTVDependVGASetting[i]=bTmp; 367 } 368 369 /* GR_33 */ 370 OUTB(0x3ce,0x33); 371 bTmp=INB(0x3cf); 372 pTrident->DefaultTVDependVGASetting[2]=bTmp; 373 374 /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */ 375 for (i=3; i<VGA_REGNUM_ABOUT_TV; i++) 376 { 377 OUTB(0x3d4,VGA_RegIdx_about_TV[i]); 378 bTmp=INB(0x3d5); 379 pTrident->DefaultTVDependVGASetting[i]=bTmp; 380 } 381 382 switch (pTrident->TVChipset) 383 { 384 case 1: 385 for (i=0; i<TVX_REG_NUM; i++) 386 { 387 bTmp=smbus_read(pScrn,i,TVX_VT1621_PORT); 388 pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]=bTmp; 389 } 390 break; 391 case 2: 392 for (i=0; i<TV_CH7005C_TVREG_NUM; i++) 393 { 394 bTmp=smbus_read(pScrn,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT); 395 pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]=bTmp; 396 } 397 break; 398 default: 399 ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n"); 400 break; 401 402 } 403 /* protect */ 404 OUTB(0x3C4, 0x11); 405 OUTB(0x3C5, protect); 406} 407void VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn) 408{ 409 TRIDENTPtr pTrident=TRIDENTPTR(pScrn); 410 unsigned char protect; 411 unsigned char bTmp; 412 int i; 413 unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={ 414 0xD8,0XD9,/* SR */ 415 0X33,/* GR */ 416 0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */ 417 0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF 418 }; 419 unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={ 420 0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09, 421 0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14, 422 0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D, 423 0X1E,0X1F,0X20,0X21,0X3D 424 }; 425 426 /*ErrorF("VIAB3D: VIA_RestoreTVDependVGAReg:\n");*/ 427 428 /* Unprotect */ 429 OUTB(0x3C4, 0x11); 430 protect = INB(0x3C5); 431 OUTB(0x3C5, 0x92); 432 433 /* Set TV Hw environment */ 434 OUTB(0x3d4,0xc1); 435 OUTB(0x3d5,0x41); 436 437 /* SR_d8,SR_d9 */ 438 for (i=0; i<2; i++) 439 { 440 OUTB(0x3c4,VGA_RegIdx_about_TV[i]); 441 bTmp=pTrident->DefaultTVDependVGASetting[i]; 442 OUTB(0x3c5,bTmp); 443 } 444 /* GR_33 */ 445 OUTB(0x3ce,0x33); 446 bTmp=pTrident->DefaultTVDependVGASetting[2]; 447 OUTB(0x3cf,bTmp); 448 449 /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */ 450 for (i=3; i<VGA_REGNUM_ABOUT_TV; i++) 451 { 452 OUTB(0x3d4,VGA_RegIdx_about_TV[i]); 453 bTmp=pTrident->DefaultTVDependVGASetting[i]; 454 OUTB(0x3d5,bTmp); 455 } 456 switch (pTrident->TVChipset) 457 { 458 case 1: 459 for (i=0; i<TVX_REG_NUM; i++) 460 { 461 bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]; 462 smbus_write(pScrn,bTmp,i,TVX_VT1621_PORT); 463 } 464 break; 465 case 2: 466 for (i=0; i<TV_CH7005C_TVREG_NUM; i++) 467 { 468 bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]; 469 smbus_write(pScrn,bTmp,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT); 470 } 471 break; 472 default: 473 ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n"); 474 break; 475 } 476 /* protect */ 477 OUTB(0x3C4, 0x11); 478 OUTB(0x3C5, protect); 479} 480void VIA_TVInit(ScrnInfoPtr pScrn) 481{ 482 TRIDENTPtr pTrident=TRIDENTPTR(pScrn); 483 unsigned char idx=0; 484 unsigned char i; 485 unsigned char protect; 486 unsigned char TV_CRTC[TVX_CRTC_NUM] = 487 { 0xC0,0xD0,0xD1,0xD2,0xD3,0xE0,0xE3,0xE4,0xE5, 488 0xE6,0xE7,0xF0,0xF1,0xF6,0xFE,0xFF }; 489 unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={ 490 0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09, 491 0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14, 492 0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D, 493 0X1E,0X1F,0X20,0X21,0X3D 494 }; 495 496#ifdef DEBUG_CODE_TRACE 497 ErrorF("VIAB3D: VIA_TVInit:\n"); 498#endif 499 500 if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0) 501 { 502 /* Overlay window 1 position OK */ 503 ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) NTSC\n"); 504 idx=0; 505 pTrident->OverrideHsync=-71; 506 pTrident->OverrideVsync=15; 507 } 508 else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0) 509 { 510 /* Overlay window 1 position OK */ 511 ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) NTSC\n"); 512 idx=1; 513 pTrident->OverrideHsync=-152; 514 pTrident->OverrideVsync=72; 515 } 516 else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 0) 517 { 518 ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 NTSC\n"); 519 idx=2; 520 pTrident->OverrideHsync=-65; 521 pTrident->OverrideVsync=14; 522 } 523 else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 0) 524 { 525 ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 NTSC\n"); 526 idx=3; 527 pTrident->OverrideHsync=-158; 528 pTrident->OverrideVsync=72; 529 } 530 else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1) 531 { 532 /* Overlay window 1 position OK */ 533 ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) PAL\n"); 534 idx=4; 535 pTrident->OverrideHsync=2; 536 pTrident->OverrideVsync=65; 537 } 538 else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1) 539 { 540 ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) PAL\n"); 541 /* patch TV screen defection */ 542 idx=5; 543 /* patch 800x600 screen defect */ 544 OUTB(0x3d4,0x2f); 545 OUTB(0x3d5,0xbf); 546 pTrident->OverrideHsync=-145; 547 pTrident->OverrideVsync=43; 548 } 549 else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 1) 550 { 551 ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 PAL\n"); 552 idx=6; 553 pTrident->OverrideHsync=0; 554 pTrident->OverrideVsync=63; 555 } 556 else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 1) 557 { 558 ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 PAL\n"); 559 idx=7; 560 OUTB(0x3d4,0x2f); 561 OUTB(0x3d5,0xbf); 562 pTrident->OverrideHsync=-141; 563 pTrident->OverrideVsync=42; 564 } 565 else 566 { 567 ErrorF("VIAB3D: VIA_TVInit: TV Params default mode\n"); 568 return; 569 } 570 571 /* Unprotect */ 572 OUTB(0x3C4, 0x11); 573 protect = INB(0x3C5); 574 OUTB(0x3C5, 0x92); 575 576 /* Set TV hw environment */ 577 OUTB(0x3c4,0x24); 578 OUTB(0x3c5,0x4f); 579 OUTB(0x3d4,0xc1); 580 OUTB(0x3d5,0x41); 581 OUTB(0x3ce,0x23); 582 OUTB(0x3cf,0x88); 583 584 /* set CRT + TV */ 585 OUTB(0x3CE,0x33); 586 OUTB(0x3CF,0x20); 587 588 /* set CRTC */ 589 for( i = 0; i < TVX_CRTC_NUM; i++ ) 590 { 591 OUTB(0x3D4, TV_CRTC[i]); 592 593 if (pTrident->TVChipset==2) { 594 OUTB(0x3D5, TV_CH7005C_Table[idx][i]); 595 } 596 else { 597 OUTB(0x3D5, TVX_VT1621_Table[idx][i]); 598 } 599 } 600 601 602 /* Digital TV interface control */ 603 switch (pTrident->TVChipset) 604 { 605 case 1: OUTB(0x3C4,0xD8); 606 OUTB(0x3C5,0x60); 607 OUTB(0x3C4,0xD9); 608 OUTB(0x3C5,0x38); 609 break; 610 case 2: OUTB(0x3c4,0xd8); 611 OUTB(0x3c5,0x24); 612 OUTB(0x3C4,0xD9); 613 OUTB(0x3C5,0x18); 614 break; 615 } 616 617 switch (pTrident->TVChipset) 618 { 619 case 1: 620 /* set TVX registers */ 621 for (i=0; i < TVX_REG_NUM; i++ ) 622 { 623 smbus_write(pScrn,TVX_VT1621_Table[idx][TVX_CRTC_NUM+i], i, TVX_VT1621_PORT); 624 } 625 break; 626 case 2: 627 for (i=0; i<TV_CH7005C_TVREG_NUM; i++) 628 { 629 smbus_write(pScrn,TV_CH7005C_Table[idx][TV_CH7005C_CRTC_NUM+i], TV_CH7005C_RegIdx[i], TV_CH7005C_PORT); 630 } 631 break; 632 } 633 634 /*VIA_DumpReg(pScrn);*/ 635 636 /* protect */ 637 OUTB(0x3C4, 0x11); 638 OUTB(0x3C5, protect); 639} 640void VIA_DumpReg(ScrnInfoPtr pScrn) 641{ 642 TRIDENTPtr pTrident=TRIDENTPTR(pScrn); 643 int i,j; 644 unsigned char bTmp; 645 unsigned char protect; 646 647 /* Unprotect */ 648 OUTB(0x3C4, 0x11); 649 protect = INB(0x3C5); 650 OUTB(0x3C5, 0x92); 651 652 /* SR */ 653 for (i=0; i<16; i++) 654 { 655 for (j=0; j<16; j++) 656 { 657 OUTB(0x3c4,(16*i+j)); 658 bTmp=INB(0x3c5); 659 660 ErrorF("SR%02x=%02x ",(16*i+j),bTmp); 661 } 662 ErrorF("\n"); 663 } 664 ErrorF("\n"); 665 /* CR */ 666 for (i=0; i<16; i++) 667 { 668 for (j=0; j<16; j++) 669 { 670 OUTB(0x3d4,(16*i+j)); 671 bTmp=INB(0x3d5); 672 673 ErrorF("CR%02x=%02x ",(16*i+j),bTmp); 674 } 675 ErrorF("\n"); 676 } 677 ErrorF("\n"); 678 /* GR */ 679 for (i=0; i<16; i++) 680 { 681 for (j=0; j<16; j++) 682 { 683 OUTB(0x3ce,(16*i+j)); 684 bTmp=INB(0x3cf); 685 686 ErrorF("GR%02x=%02x ",(16*i+j),bTmp); 687 } 688 ErrorF("\n"); 689 } 690 ErrorF("\n"); 691 /* SM */ 692 for (i=0; i<16; i++) 693 { 694 for (j=0; j<16; j++) 695 { 696 if (pTrident->TVChipset==2) 697 bTmp=smbus_read(pScrn,(16*i+j),TV_CH7005C_PORT); 698 else bTmp=smbus_read(pScrn,(16*i+j),TVX_VT1621_PORT); 699 ErrorF("SM%02x=%02x ",(16*i+j),bTmp); 700 } 701 ErrorF("\n"); 702 } 703 ErrorF("\n"); 704 /* protect */ 705 OUTB(0x3C4, 0x11); 706 OUTB(0x3C5, protect); 707 708} 709