1 /*
2  * VIA TV additions
3  */
4 
5 
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif
9 
10 #include "trident.h"
11 #include "trident_regs.h"
12 
13 /***************************************************************************
14  *
15  * TV parameters for VT1621
16  *
17  ***************************************************************************/
18 #define TV_MODE  8
19 #define TVX_MODE_SIZE 0X72
20 #define TVX_CRTC_NUM 0x10
21 #define TVX_REG_NUM 0x62
22 #define TVX_VT1621_PORT 0x40
23 #define SMBUS_BASE 0x5000
24 unsigned char TVX_VT1621_Table[TV_MODE][TVX_MODE_SIZE] = {
25 {
26 /* NTSC, 640x480, bpp=8,16 */
27 0x02, 0x54, 0xE0, 0xFA, 0x11, 0x5D, 0x11, 0x57, 0x5A, 0x56,
28 0xA0, 0x26, 0x0A, 0x55, 0x37, 0x86,
29 
30 0x6A, 0x0B, 0x22, 0x27, 0x43, 0x50, 0x13, 0x50,
31 0xB0, 0x07, 0xEE, 0x15, 0x90, 0xE4, 0x00, 0xA8,
32 0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x00, 0x1C,
33 0x00, 0x40, 0x0C, 0x02, 0x01, 0x80, 0x00, 0x00,
34 0x0F, 0x06, 0x99, 0x7C, 0x04, 0x5D, 0x36, 0x9B,
35 0x54, 0x00, 0x00, 0xB4, 0x2F, 0x85, 0xFF, 0x00,
36 0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
37 0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
38 0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
39 0x03, 0x01, 0x90, 0x33, 0x00, 0x00, 0x00, 0x00,
40 0x00, 0x04, 0x47, 0x02, 0x02, 0xFD, 0x06, 0xf8,
41 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
42 0x11, 0x6E
43 },
44 {
45 /* NTSC, 800x600, bpp=8,16 */
46 0X02, 0x79, 0XE0, 0x73, 0x02, 0x80, 0x01, 0x7A, 0x7E, 0xEC,
47 0xA0, 0x8A, 0x0E, 0xEB, 0x8B, 0x89,
48 
49 0x8B, 0x0B, 0x6A, 0x27, 0x43, 0x50, 0x12, 0x50,
50 0xBC, 0x0A, 0XE8, 0x15, 0x88, 0xDC, 0x00, 0x98,
51 0x00, 0x00, 0x0A, 0x48, 0x1C, 0x28, 0x03, 0x20,
52 0x00, 0x40, 0x36, 0x02, 0x03, 0x80, 0x00, 0x00,
53 0x0D, 0x04, 0x04, 0x7B, 0x00, 0x5D, 0xC1, 0x9B,
54 0x6B, 0x00, 0x00, 0xA1, 0x3F, 0x9D, 0x2F, 0x10,
55 0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
56 0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
57 0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
58 0x03, 0x01, 0xD6, 0x80, 0x00, 0x00, 0x00, 0x00,
59 0x00, 0x0C, 0x46, 0x02, 0x02, 0xFD, 0x06, 0xF8,
60 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
61 0x11, 0x6E
62 },
63 {
64 /* NTSC, 640x480, bpp=32 */
65 0X02, 0x54, 0XE0, 0xFA, 0x11, 0x5D, 0x01, 0x57, 0x5A, 0x56,
66 0xA0, 0x26, 0x0A, 0X55, 0x37, 0x46,
67 
68 0x6A, 0x0B, 0x23, 0x33, 0x43, 0x50, 0x13, 0x51,
69 0xB0, 0x07, 0xAB, 0x15, 0x90, 0xA9, 0x00, 0x98,
70 0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x03, 0x1C,
71 0x00, 0x40, 0x0C, 0x02, 0x03, 0x80, 0x00, 0x00,
72 0x0F, 0x04, 0x99, 0x7A, 0x04, 0x5E, 0xB6, 0x90,
73 0x5B, 0x00, 0x00, 0x67, 0x2F, 0x88, 0xFA, 0x00,
74 0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
75 0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
76 0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
77 0x03, 0x01, 0xA0, 0x33, 0x1B, 0x00, 0X00, 0x00,
78 0x00, 0x08, 0x47, 0x02, 0x02, 0xFD, 0x06, 0xf8,
79 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
80 0x11, 0x6E
81 },
82 {
83 /* NTSC, 800x600, bpp=32 */
84 0X02, 0x79, 0XE0, 0x73, 0x02, 0x80, 0x01, 0x7B, 0x7E, 0xEC,
85 0xA0, 0x8A, 0x0E, 0xEB, 0x8B, 0x49,
86 
87 0x8B, 0x0B, 0x6B, 0x27, 0x43, 0x50, 0x12, 0x2D,
88 0xBC, 0x0C, 0xED, 0x15, 0x88, 0xEE, 0x00, 0x99,
89 0x00, 0x00, 0x0A, 0x48, 0x1C, 0x28, 0x03, 0x20,
90 0x00, 0x40, 0x36, 0x02, 0x03, 0x80, 0x00, 0x00,
91 0x0D, 0x04, 0x04, 0x7A, 0x00, 0x5D, 0xC1, 0x9B,
92 0x6B, 0x00, 0x00, 0xA1, 0x3F, 0x9D, 0x2F, 0x10,
93 0x00, 0x17, 0x15, 0x21, 0x15, 0x05, 0x05, 0x02,
94 0x1B, 0x1B, 0x24, 0xF8, 0x07, 0x00, 0x00, 0x0F,
95 0x0F, 0x60, 0x01, 0x0A, 0x00, 0x05, 0x04, 0xFF,
96 0x03, 0x01, 0xC6, 0x90, 0x00, 0x00, 0x00, 0x00,
97 0x00, 0x08, 0x46, 0x02, 0x02, 0xFD, 0x06, 0xF8,
98 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1,
99 0x11, 0x6E
100 },
101 {
102 /* PAL, 640x480, bpp=8,16 */
103 0X82, 0x5D, 0XE0, 0x23, 0x02, 0x64, 0x01, 0x56, 0x5A, 0x6F,
104 0xA0, 0x0D, 0x0F, 0x6E, 0x24, 0xC1,
105 
106 0x6B, 0x0B, 0x03, 0x67, 0x40, 0x50, 0x12, 0x96,
107 0xCE, 0x32, 0xFF, 0x01, 0x7E, 0xF6, 0x00, 0xA8,
108 0x00, 0x00, 0x07, 0x48, 0x20, 0x1C, 0x44, 0x60,
109 0x44, 0x4F, 0x1B, 0x02, 0x03, 0x80, 0x00, 0x00,
110 0x0C, 0x0C, 0xD7, 0x84, 0x04, 0x68, 0x3B, 0x9C,
111 0x57, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x29, 0x10,
112 0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
113 0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
114 0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
115 0x01, 0x01, 0xA0, 0x33, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x0C, 0x4E, 0xFE, 0x03, 0xFB, 0x06, 0xF8,
117 0x0A, 0xF5, 0x0C, 0x73, 0x06, 0xF8, 0x0B, 0xF2,
118 0x10, 0x6F
119 },
120 {
121 /* PAL, 800x600, bpp=8,16 */
122 0X82, 0x5B, 0XE0, 0x91, 0x02, 0x73, 0x07, 0x6C, 0x70, 0xEC,
123 0xA0, 0xA8, 0x0B, 0xEB, 0xAD, 0xC7,
124 
125 0x8B, 0x0B, 0x1A, 0x47, 0x40, 0x50, 0x12, 0x56,
126 0x00, 0x37, 0xF7, 0x00, 0x7D, 0xE2, 0x00, 0xB9,
127 0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x44, 0x62,
128 0x44, 0x4F, 0x53, 0x02, 0x07, 0x80, 0x00, 0x00,
129 0x0A, 0x05, 0xA2, 0x83, 0x08, 0x68, 0x46, 0x99,
130 0x68, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x6B, 0x10,
131 0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
132 0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
133 0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
134 0x01, 0x01, 0xE6, 0x90, 0x00, 0x00, 0x00, 0x00,
135 0x00, 0x0C, 0x4D, 0xFB, 0x04, 0xFB, 0x07, 0xF8,
136 0x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2,
137 0x10, 0x6F
138 },
139 {
140 /* PAL, 640x480, bpp=32 */
141 0X82, 0x5D, 0XE0, 0x23, 0x02, 0x64, 0x01, 0x56, 0x5A, 0x6F,
142 0xA0, 0x0D, 0x0F, 0x6E, 0x24, 0x81,
143 
144 0x6B, 0x0B, 0x02, 0x67, 0x40, 0x50, 0x12, 0x93,
145 0xCE, 0x32, 0xF0, 0x01, 0x88, 0xE8, 0x00, 0xA8,
146 0x00, 0x00, 0x07, 0x48, 0x20, 0x1C, 0x44, 0x60,
147 0x44, 0x4F, 0x1B, 0x02, 0x03, 0x80, 0x00, 0x00,
148 0x0C, 0x05, 0xE2, 0x84, 0x00, 0x68, 0x3B, 0x9C,
149 0x57, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x29, 0x10,
150 0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
151 0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
152 0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
153 0x01, 0x01, 0xA0, 0x33, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x0C, 0x4E, 0xFE, 0x03, 0xFB, 0x06, 0xF8,
155 0x0A, 0xF5, 0x0C, 0x73, 0x06, 0xF8, 0x0B, 0xF2,
156 0x10, 0x6F
157 },
158 {
159 /* PAL, 800x600, bpp=32 */
160 0X82, 0x5B, 0XE0, 0x91, 0x02, 0x73, 0x07, 0x6C, 0x70, 0xEC,
161 0xA0, 0xA8, 0x0B, 0xEB, 0xAD, 0x87,
162 
163 0x8B, 0x0B, 0x1A, 0x67, 0x40, 0x50, 0x12, 0x53,
164 0x00, 0x37, 0xEE, 0x00, 0x83, 0xEB, 0x00, 0xB9,
165 0x00, 0x00, 0x0E, 0x48, 0x38, 0x38, 0x44, 0x62,
166 0x44, 0x4F, 0x53, 0x02, 0x07, 0x80, 0x00, 0x00,
167 0x0A, 0x05, 0x5E, 0x83, 0x08, 0x68, 0x46, 0x99,
168 0x68, 0x63, 0x17, 0xAC, 0x25, 0x80, 0x6B, 0x10,
169 0x00, 0x1A, 0x22, 0x2A, 0x22, 0x05, 0x02, 0x00,
170 0x1C, 0x3D, 0x14, 0xFE, 0x03, 0x54, 0x01, 0xFE,
171 0x7E, 0x60, 0x00, 0x08, 0x00, 0x04, 0x07, 0x55,
172 0x01, 0x01, 0xA0, 0x22, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x0C, 0x4D, 0xFB, 0x04, 0xFB, 0x07, 0xF8,
174 0x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2,
175 0x10, 0x6F
176 }
177 };
178 /* TV Parameters for CH7005C */
179 #define TV_CH7005C_MODE_SIZE 45
180 #define TV_CH7005C_CRTC_NUM 0x10
181 #define TV_CH7005C_TVREG_NUM 29
182 #define TV_CH7005C_PORT 0xEA
183 unsigned char TV_CH7005C_Table[TV_MODE][TV_CH7005C_MODE_SIZE]={
184 {
185 /* NTSC 640x480 bpp=8,16 */
186 0x02, 0x80, 0x20, 0x02, 0x00, 0x5D, 0X80, 0X57, 0X80, 0X56,
187 0XBA, 0X10, 0X8C, 0X50, 0XF8, 0X7F,
188 
189 0X6A, 0X7A, 0X00, 0X09, 0X80, 0X66, 0X00, 0X60,
190 0X2E, 0XFF, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
191 0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
192 0X00, 0X00, 0X0A, 0X02, 0X05
193 },
194 {
195 /* NTSC 800X600 bpp=8,16 */
196 0x02, 0x80, 0x20, 0x02, 0x00, 0x7D, 0X80, 0X6E, 0X1C, 0XBA,
197 0XF0, 0X70, 0X8C, 0XBA, 0X78, 0X53,
198 
199 0X8C, 0X4A, 0X00, 0X09, 0X80, 0XAE, 0X01, 0X80,
200 0X2E, 0X02, 0X01, 0X0B, 0X7E, 0X7E, 0X7E, 0X7E,
201 0X7E, 0X40, 0X01, 0X0C, 0X00, 0X00, 0X00, 0X00,
202 0X00, 0X00, 0X0A, 0X00, 0X05
203 },
204 {
205 /* NTSC 640x480 bpp=32 */
206 0x02, 0x80, 0x20, 0x02, 0x00, 0x5D, 0X80, 0X57, 0X80, 0X56,
207 0XBA, 0X10, 0X8C, 0X50, 0XBD, 0X57,
208 
209 0X6A, 0X7A, 0X00, 0X09, 0X80, 0X67, 0X00, 0X60,
210 0X2E, 0XFF, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
211 0X7E, 0X40, 0X02, 0X00, 0X07, 0X0C, 0X0D, 0X00,
212 0X00, 0X00, 0X0A, 0X02, 0X05
213 },
214 {
215 /* NTSC 800X600 bpp=32 */
216 0x02, 0x80, 0x20, 0x02, 0x00, 0x7D, 0X80, 0X6E, 0X1C, 0XBA,
217 0XF0, 0X70, 0X8C, 0XBA, 0XF8, 0X53,
218 
219 0X8C, 0X4A, 0X00, 0X09, 0X80, 0XAF, 0X01, 0X80,
220 0X2E, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
221 0X7E, 0X40, 0X01, 0X0C, 0X00, 0X00, 0X00, 0X00,
222 0X00, 0X00, 0X0A, 0X00, 0X05
223 },
224 {
225 /* PAL 640x480 bpp=8,16 */
226 0x82, 0x80, 0x20, 0x02, 0x00, 0x71, 0X74, 0X62, 0X84, 0X6F,
227 0XF0, 0X10, 0X09, 0XEB, 0X80, 0X5F,
228 
229 0X81, 0X4A, 0X00, 0X09, 0X80, 0X84, 0X00, 0X70,
230 0X28, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
231 0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
232 0X00, 0X00, 0X0A, 0X01, 0X05
233 },
234 {
235 /* PAL 800x600 bpp=8,16 */
236 0x82, 0x80, 0x20, 0x02, 0x00, 0x73, 0X76, 0X6A, 0X8C, 0XEC,
237 0XF0, 0X7E, 0X09, 0XEB, 0X8F, 0X8D,
238 
239 0X83, 0X4A, 0X00, 0X09, 0X80, 0X7E, 0X00, 0X70,
240 0X3F, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
241 0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
242 0X00, 0X00, 0X0A, 0X01, 0X05
243 },
244 {
245 /* PAL 640x480 bpp=32 */
246 0x82, 0x80, 0x20, 0x02, 0x00, 0x71, 0X74, 0X62, 0X84, 0X6F,
247 0XF0, 0X10, 0X09, 0XEB, 0X80, 0X1F,
248 
249 0X81, 0X4A, 0X00, 0X09, 0X80, 0X84, 0X00, 0X70,
250 0X28, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
251 0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
252 0X00, 0X00, 0X0A, 0X01, 0X05
253 },
254 {
255 /* PAL 800X600 bpp=32 */
256 0x82, 0x80, 0x20, 0x02, 0x00, 0x73, 0X76, 0X6A, 0X8C, 0XEC,
257 0XF0, 0X7E, 0X09, 0XEB, 0X5D, 0X48,
258 
259 0X83, 0X4A, 0X00, 0X09, 0X80, 0X7E, 0X00, 0X70,
260 0X3F, 0X02, 0X01, 0X0B, 0X0C, 0X03, 0X40, 0X3F,
261 0X7E, 0X40, 0X02, 0X00, 0X08, 0X00, 0X00, 0X00,
262 0X00, 0X00, 0X0A, 0X01, 0X05
263 }
264 };
265 
smbus_read(ScrnInfoPtr pScrn,unsigned char bIndex,unsigned char devAdr)266 static unsigned char smbus_read(ScrnInfoPtr pScrn, unsigned char bIndex, unsigned char devAdr)
267 {
268     TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
269     unsigned short i;
270     unsigned char  bData;
271 
272     /* clear host status */
273     OUTB(SMBUS_BASE, 0xFF);
274 
275     /* check SMBUS ready */
276     for ( i = 0; i < 0xFFFF; i++ )
277         if ( (INB(SMBUS_BASE) & 0x01) == 0 )
278             break;
279 
280     /* set host command */
281     OUTB(SMBUS_BASE+3, bIndex);
282 
283     /* set slave address */
284     OUTB(SMBUS_BASE+4, devAdr | 0x01);
285 
286     /* start */
287     OUTB(SMBUS_BASE+2, 0x48);
288 
289     /* SMBUS Wait Ready */
290     for ( i = 0; i < 0xFFFF; i++ )
291         if ( (INB(SMBUS_BASE) & 0x01) == 0 )
292             break;
293     bData=INB(SMBUS_BASE+5);
294 
295     return bData;
296 
297 }
298 
smbus_write(ScrnInfoPtr pScrn,unsigned char bData,unsigned char bIndex,unsigned char devAdr)299 static void smbus_write(ScrnInfoPtr pScrn, unsigned char bData, unsigned char bIndex, unsigned char devAdr)
300 {
301     TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
302     unsigned short i;
303 
304     /* clear host status */
305     OUTB(SMBUS_BASE, 0xFF);
306 
307     /* check SMBUS ready */
308     for ( i = 0; i < 0xFFFF; i++ )
309         if ( (INB(SMBUS_BASE) & 0x01) == 0 )
310            break;
311 
312     OUTB(SMBUS_BASE+2, 0x08);
313 
314     /* set host command */
315     OUTB(SMBUS_BASE+3, bIndex);
316 
317     /* set slave address */
318     OUTB(SMBUS_BASE+4, devAdr & 0xFE);
319 
320     OUTB(SMBUS_BASE+5, bData);
321 
322     /* start */
323     OUTB(SMBUS_BASE+2, 0x48);
324 
325     /* SMBUS Wait Ready */
326     for ( i = 0; i < 0xFFFF; i++ )
327     if ( (INB(SMBUS_BASE) & 0x01) == 0 )
328        break;
329 }
VIA_SaveTVDepentVGAReg(ScrnInfoPtr pScrn)330 void VIA_SaveTVDepentVGAReg(ScrnInfoPtr pScrn)
331 {
332     TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
333     unsigned char protect;
334     unsigned char bTmp;
335     int i;
336     unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={
337                   0xD8,0XD9,/* SR */
338                   0X33,/* GR */
339                   0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */
340                   0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF
341                   };
342     unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
343                   0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
344 		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
345 		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
346 		  0X1E,0X1F,0X20,0X21,0X3D
347                   };
348 
349     /*ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg:\n");*/
350 
351     /* Unprotect */
352     OUTB(0x3C4, 0x11);
353     protect = INB(0x3C5);
354     OUTB(0x3C5, 0x92);
355 
356     /* Set TV Hw environment */
357     OUTB(0x3d4,0xc1);
358     OUTB(0x3d5,0x41);
359 
360     /* SR_d8,SR_d9 */
361     for (i=0; i<2; i++)
362     {
363         OUTB(0x3c4,VGA_RegIdx_about_TV[i]);
364         bTmp=INB(0x3c5);
365         pTrident->DefaultTVDependVGASetting[i]=bTmp;
366     }
367 
368     /* GR_33 */
369     OUTB(0x3ce,0x33);
370     bTmp=INB(0x3cf);
371     pTrident->DefaultTVDependVGASetting[2]=bTmp;
372 
373     /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */
374     for (i=3; i<VGA_REGNUM_ABOUT_TV; i++)
375     {
376         OUTB(0x3d4,VGA_RegIdx_about_TV[i]);
377         bTmp=INB(0x3d5);
378         pTrident->DefaultTVDependVGASetting[i]=bTmp;
379     }
380 
381     switch (pTrident->TVChipset)
382     {
383        case 1:
384              for (i=0; i<TVX_REG_NUM; i++)
385              {
386                  bTmp=smbus_read(pScrn,i,TVX_VT1621_PORT);
387                  pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]=bTmp;
388              }
389 	     break;
390        case 2:
391              for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
392 	     {
393                  bTmp=smbus_read(pScrn,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT);
394                  pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i]=bTmp;
395 	     }
396 	     break;
397        default:
398              ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n");
399 	     break;
400 
401     }
402     /* protect */
403     OUTB(0x3C4, 0x11);
404     OUTB(0x3C5, protect);
405 }
VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn)406 void VIA_RestoreTVDependVGAReg(ScrnInfoPtr pScrn)
407 {
408     TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
409     unsigned char protect;
410     unsigned char bTmp;
411     int i;
412     unsigned char VGA_RegIdx_about_TV[VGA_REGNUM_ABOUT_TV]={
413                   0xD8,0XD9,/* SR */
414                   0X33,/* GR */
415                   0XC0,0XD0,0XD1,0XD2,0XD3,0XE0,0XE3,0XE4,0XE5,/* CR */
416                   0XE6,0XE7,0XF0,0XF1,0XF6,0XFE,0XFF
417                   };
418     unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
419                   0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
420 		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
421 		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
422 		  0X1E,0X1F,0X20,0X21,0X3D
423                   };
424 
425     /*ErrorF("VIAB3D: VIA_RestoreTVDependVGAReg:\n");*/
426 
427     /* Unprotect */
428     OUTB(0x3C4, 0x11);
429     protect = INB(0x3C5);
430     OUTB(0x3C5, 0x92);
431 
432     /* Set TV Hw environment */
433     OUTB(0x3d4,0xc1);
434     OUTB(0x3d5,0x41);
435 
436     /* SR_d8,SR_d9 */
437     for (i=0; i<2; i++)
438     {
439         OUTB(0x3c4,VGA_RegIdx_about_TV[i]);
440         bTmp=pTrident->DefaultTVDependVGASetting[i];
441         OUTB(0x3c5,bTmp);
442     }
443     /* GR_33 */
444     OUTB(0x3ce,0x33);
445     bTmp=pTrident->DefaultTVDependVGASetting[2];
446     OUTB(0x3cf,bTmp);
447 
448     /* CR_c0,d0,d1,d2,d3,e0,e3,e4,e5,e6,e7,f0,f1,f6,fe,ff */
449     for (i=3; i<VGA_REGNUM_ABOUT_TV; i++)
450     {
451         OUTB(0x3d4,VGA_RegIdx_about_TV[i]);
452         bTmp=pTrident->DefaultTVDependVGASetting[i];
453         OUTB(0x3d5,bTmp);
454     }
455     switch (pTrident->TVChipset)
456     {
457          case 1:
458                 for (i=0; i<TVX_REG_NUM; i++)
459                 {
460                     bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i];
461                     smbus_write(pScrn,bTmp,i,TVX_VT1621_PORT);
462 		}
463 		break;
464          case 2:
465 	        for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
466 		{
467                     bTmp=pTrident->DefaultTVDependVGASetting[VGA_REGNUM_ABOUT_TV+i];
468                     smbus_write(pScrn,bTmp,TV_CH7005C_RegIdx[i],TV_CH7005C_PORT);
469 		}
470 		break;
471        default:
472              ErrorF("VIAB3D: VIA_SaveTVDepentVGAReg: Wrong Chipset setting\n");
473 	     break;
474     }
475     /* protect */
476     OUTB(0x3C4, 0x11);
477     OUTB(0x3C5, protect);
478 }
VIA_TVInit(ScrnInfoPtr pScrn)479 void VIA_TVInit(ScrnInfoPtr pScrn)
480 {
481     TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
482     unsigned char idx=0;
483     unsigned char i;
484     unsigned char protect;
485     unsigned char TV_CRTC[TVX_CRTC_NUM] =
486        { 0xC0,0xD0,0xD1,0xD2,0xD3,0xE0,0xE3,0xE4,0xE5,
487          0xE6,0xE7,0xF0,0xF1,0xF6,0xFE,0xFF  };
488     unsigned char TV_CH7005C_RegIdx[TV_CH7005C_TVREG_NUM]={
489                   0X00,0X01,0X03,0X04,0X06,0X07,0X08,0X09,
490 		  0X0A,0X0B,0X0D,0X0E,0X10,0X11,0X13,0X14,
491 		  0X15,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,
492 		  0X1E,0X1F,0X20,0X21,0X3D
493                   };
494 
495 #ifdef DEBUG_CODE_TRACE
496     ErrorF("VIAB3D: VIA_TVInit:\n");
497 #endif
498 
499     if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0)
500     {
501        /* Overlay window 1 position OK */
502        ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) NTSC\n");
503        idx=0;
504        pTrident->OverrideHsync=-71;
505        pTrident->OverrideVsync=15;
506      }
507     else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 0)
508     {
509        /* Overlay window 1 position OK */
510        ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) NTSC\n");
511        idx=1;
512        pTrident->OverrideHsync=-152;
513        pTrident->OverrideVsync=72;
514        }
515     else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 0)
516     {
517        ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 NTSC\n");
518        idx=2;
519        pTrident->OverrideHsync=-65;
520        pTrident->OverrideVsync=14;
521        }
522     else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 0)
523     {
524        ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 NTSC\n");
525        idx=3;
526        pTrident->OverrideHsync=-158;
527        pTrident->OverrideVsync=72;
528        }
529     else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1)
530     {
531        /* Overlay window 1 position OK */
532        ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x8(16) PAL\n");
533        idx=4;
534        pTrident->OverrideHsync=2;
535        pTrident->OverrideVsync=65;
536        }
537     else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && (pScrn->depth==8 || pScrn->depth==16) && pTrident->TVSignalMode == 1)
538     {
539        ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x8(16) PAL\n");
540        /* patch TV screen defection */
541        idx=5;
542        /* patch 800x600 screen defect */
543        OUTB(0x3d4,0x2f);
544        OUTB(0x3d5,0xbf);
545        pTrident->OverrideHsync=-145;
546        pTrident->OverrideVsync=43;
547        }
548     else if (pScrn->currentMode->HDisplay==640 && pScrn->currentMode->VDisplay==480 && pScrn->depth==24 && pTrident->TVSignalMode == 1)
549     {
550        ErrorF("VIAB3D: VIA_TVInit: TV Params 640x480x32 PAL\n");
551        idx=6;
552        pTrident->OverrideHsync=0;
553        pTrident->OverrideVsync=63;
554        }
555     else if (pScrn->currentMode->HDisplay==800 && pScrn->currentMode->VDisplay==600 && pScrn->depth==24 && pTrident->TVSignalMode == 1)
556     {
557        ErrorF("VIAB3D: VIA_TVInit: TV Params 800x600x32 PAL\n");
558        idx=7;
559        OUTB(0x3d4,0x2f);
560        OUTB(0x3d5,0xbf);
561        pTrident->OverrideHsync=-141;
562        pTrident->OverrideVsync=42;
563        }
564     else
565     {
566        ErrorF("VIAB3D: VIA_TVInit: TV Params default mode\n");
567        return;
568     }
569 
570     /* Unprotect */
571     OUTB(0x3C4, 0x11);
572     protect = INB(0x3C5);
573     OUTB(0x3C5, 0x92);
574 
575     /* Set TV hw environment */
576     OUTB(0x3c4,0x24);
577     OUTB(0x3c5,0x4f);
578     OUTB(0x3d4,0xc1);
579     OUTB(0x3d5,0x41);
580     OUTB(0x3ce,0x23);
581     OUTB(0x3cf,0x88);
582 
583     /* set CRT + TV */
584     OUTB(0x3CE,0x33);
585     OUTB(0x3CF,0x20);
586 
587     /* set CRTC */
588     for( i = 0; i < TVX_CRTC_NUM; i++ )
589     {
590          OUTB(0x3D4, TV_CRTC[i]);
591 
592 	 if (pTrident->TVChipset==2) {
593             OUTB(0x3D5, TV_CH7005C_Table[idx][i]);
594 	 }
595 	 else {
596 	    OUTB(0x3D5, TVX_VT1621_Table[idx][i]);
597 	 }
598     }
599 
600 
601     /* Digital TV interface control */
602     switch (pTrident->TVChipset)
603     {
604            case 1: OUTB(0x3C4,0xD8);
605                    OUTB(0x3C5,0x60);
606                    OUTB(0x3C4,0xD9);
607                    OUTB(0x3C5,0x38);
608 		   break;
609            case 2: OUTB(0x3c4,0xd8);
610 	           OUTB(0x3c5,0x24);
611                    OUTB(0x3C4,0xD9);
612                    OUTB(0x3C5,0x18);
613 		   break;
614     }
615 
616     switch (pTrident->TVChipset)
617     {
618            case 1:
619                   /* set TVX registers */
620                   for (i=0; i < TVX_REG_NUM; i++ )
621                   {
622                       smbus_write(pScrn,TVX_VT1621_Table[idx][TVX_CRTC_NUM+i], i, TVX_VT1621_PORT);
623                   }
624 		  break;
625            case 2:
626 	          for (i=0; i<TV_CH7005C_TVREG_NUM; i++)
627 		  {
628                       smbus_write(pScrn,TV_CH7005C_Table[idx][TV_CH7005C_CRTC_NUM+i], TV_CH7005C_RegIdx[i], TV_CH7005C_PORT);
629 		  }
630 	          break;
631     }
632 
633     /*VIA_DumpReg(pScrn);*/
634 
635     /* protect */
636     OUTB(0x3C4, 0x11);
637     OUTB(0x3C5, protect);
638 }
VIA_DumpReg(ScrnInfoPtr pScrn)639 void VIA_DumpReg(ScrnInfoPtr pScrn)
640 {
641     TRIDENTPtr pTrident=TRIDENTPTR(pScrn);
642     int i,j;
643     unsigned char bTmp;
644     unsigned char protect;
645 
646     /* Unprotect */
647     OUTB(0x3C4, 0x11);
648     protect = INB(0x3C5);
649     OUTB(0x3C5, 0x92);
650 
651     /* SR */
652     for (i=0; i<16; i++)
653     {
654         for (j=0; j<16; j++)
655 	{
656             OUTB(0x3c4,(16*i+j));
657 	    bTmp=INB(0x3c5);
658 
659 	    ErrorF("SR%02x=%02x ",(16*i+j),bTmp);
660 	}
661 	ErrorF("\n");
662     }
663     ErrorF("\n");
664     /* CR */
665     for (i=0; i<16; i++)
666     {
667         for (j=0; j<16; j++)
668 	{
669             OUTB(0x3d4,(16*i+j));
670 	    bTmp=INB(0x3d5);
671 
672 	    ErrorF("CR%02x=%02x ",(16*i+j),bTmp);
673 	}
674 	ErrorF("\n");
675     }
676     ErrorF("\n");
677     /* GR */
678     for (i=0; i<16; i++)
679     {
680         for (j=0; j<16; j++)
681 	{
682             OUTB(0x3ce,(16*i+j));
683 	    bTmp=INB(0x3cf);
684 
685 	    ErrorF("GR%02x=%02x ",(16*i+j),bTmp);
686 	}
687 	ErrorF("\n");
688     }
689     ErrorF("\n");
690     /* SM */
691     for (i=0; i<16; i++)
692     {
693         for (j=0; j<16; j++)
694 	{
695 	    if (pTrident->TVChipset==2)
696                bTmp=smbus_read(pScrn,(16*i+j),TV_CH7005C_PORT);
697 	    else bTmp=smbus_read(pScrn,(16*i+j),TVX_VT1621_PORT);
698 	    ErrorF("SM%02x=%02x ",(16*i+j),bTmp);
699 	}
700 	ErrorF("\n");
701     }
702     ErrorF("\n");
703     /* protect */
704     OUTB(0x3C4, 0x11);
705     OUTB(0x3C5, protect);
706 
707 }
708