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