blob: b1a25730b7caa59ecc0029e19ce6fd05d97b1c71 [file] [log] [blame]
Kenji Toyama66229952011-04-23 08:27:48 +08001#include <linux/io.h>
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02002#include <linux/types.h>
3#include "XGIfb.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +02004
5#include "vb_def.h"
6#include "vgatypes.h"
7#include "vb_struct.h"
8#include "vb_util.h"
9#include "vb_setmode.h"
10#include "vb_ext.h"
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020011
12/**************************************************************
Prashant P. Shah914a4022010-09-01 21:37:35 +053013 *********************** Dynamic Sense ************************
14 *************************************************************/
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020015
Randy Dunlap89229672010-08-10 08:46:44 -070016static unsigned char XGINew_Is301B(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020017{
Prashant P. Shah914a4022010-09-01 21:37:35 +053018 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020019
Aaro Koskinen58839b02011-03-13 12:26:23 +020020 flag = xgifb_reg_get(pVBInfo->Part4Port, 0x01);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020021
Prashant P. Shah914a4022010-09-01 21:37:35 +053022 if (flag > 0x0B0)
23 return 0; /* 301b */
24 else
25 return 1;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020026}
27
Kenji Toyama66229952011-04-23 08:27:48 +080028static unsigned char XGINew_Sense(unsigned short tempbx,
29 unsigned short tempcx,
30 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020031{
Prashant P. Shah914a4022010-09-01 21:37:35 +053032 unsigned short temp, i, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020033
Prashant P. Shah914a4022010-09-01 21:37:35 +053034 temp = tempbx & 0xFF;
Aaro Koskinen8104e322011-03-13 12:26:22 +020035 xgifb_reg_set(pVBInfo->Part4Port, 0x11, temp);
Prashant P. Shah914a4022010-09-01 21:37:35 +053036 temp = (tempbx & 0xFF00) >> 8;
37 temp |= (tempcx & 0x00FF);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +020038 xgifb_reg_and_or(pVBInfo->Part4Port, 0x10, ~0x1F, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020039
Prashant P. Shah914a4022010-09-01 21:37:35 +053040 for (i = 0; i < 10; i++)
41 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020042
Prashant P. Shah914a4022010-09-01 21:37:35 +053043 tempch = (tempcx & 0x7F00) >> 8;
Aaro Koskinen58839b02011-03-13 12:26:23 +020044 temp = xgifb_reg_get(pVBInfo->Part4Port, 0x03);
Prashant P. Shah914a4022010-09-01 21:37:35 +053045 temp = temp ^ (0x0E);
46 temp &= tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020047
Prashant P. Shah914a4022010-09-01 21:37:35 +053048 if (temp > 0)
49 return 1;
50 else
51 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020052}
53
Kenji Toyama66229952011-04-23 08:27:48 +080054static unsigned char
55XGINew_GetLCDDDCInfo(struct xgi_hw_device_info *HwDeviceExtension,
56 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020057{
Prashant P. Shah914a4022010-09-01 21:37:35 +053058 unsigned short temp;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020059
Prashant P. Shah914a4022010-09-01 21:37:35 +053060 /* add lcd sense */
61 if (HwDeviceExtension->ulCRT2LCDType == LCD_UNKNOWN) {
62 return 0;
63 } else {
64 temp = (unsigned short) HwDeviceExtension->ulCRT2LCDType;
65 switch (HwDeviceExtension->ulCRT2LCDType) {
66 case LCD_INVALID:
67 case LCD_800x600:
68 case LCD_1024x768:
69 case LCD_1280x1024:
70 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020071
Prashant P. Shah914a4022010-09-01 21:37:35 +053072 case LCD_640x480:
73 case LCD_1024x600:
74 case LCD_1152x864:
75 case LCD_1280x960:
76 case LCD_1152x768:
77 temp = 0;
78 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020079
Prashant P. Shah914a4022010-09-01 21:37:35 +053080 case LCD_1400x1050:
81 case LCD_1280x768:
82 case LCD_1600x1200:
83 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020084
Prashant P. Shah914a4022010-09-01 21:37:35 +053085 case LCD_1920x1440:
86 case LCD_2048x1536:
87 temp = 0;
88 break;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020089
Prashant P. Shah914a4022010-09-01 21:37:35 +053090 default:
91 break;
92 }
Aaro Koskinenec9e5d32011-03-13 12:26:25 +020093 xgifb_reg_and_or(pVBInfo->P3d4, 0x36, 0xF0, temp);
Prashant P. Shah914a4022010-09-01 21:37:35 +053094 return 1;
95 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020096}
97
Aaro Koskinen3d5375f2011-03-08 22:16:17 +020098static unsigned char XGINew_GetPanelID(struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +020099{
Prashant P. Shah914a4022010-09-01 21:37:35 +0530100 unsigned short PanelTypeTable[16] = { SyncNN | PanelRGB18Bit
101 | Panel800x600 | _PanelType00, SyncNN | PanelRGB18Bit
102 | Panel1024x768 | _PanelType01, SyncNN | PanelRGB18Bit
103 | Panel800x600 | _PanelType02, SyncNN | PanelRGB18Bit
104 | Panel640x480 | _PanelType03, SyncNN | PanelRGB18Bit
105 | Panel1024x768 | _PanelType04, SyncNN | PanelRGB18Bit
106 | Panel1024x768 | _PanelType05, SyncNN | PanelRGB18Bit
107 | Panel1024x768 | _PanelType06, SyncNN | PanelRGB24Bit
108 | Panel1024x768 | _PanelType07, SyncNN | PanelRGB18Bit
109 | Panel800x600 | _PanelType08, SyncNN | PanelRGB18Bit
110 | Panel1024x768 | _PanelType09, SyncNN | PanelRGB18Bit
111 | Panel800x600 | _PanelType0A, SyncNN | PanelRGB18Bit
112 | Panel1024x768 | _PanelType0B, SyncNN | PanelRGB18Bit
113 | Panel1024x768 | _PanelType0C, SyncNN | PanelRGB24Bit
114 | Panel1024x768 | _PanelType0D, SyncNN | PanelRGB18Bit
115 | Panel1024x768 | _PanelType0E, SyncNN | PanelRGB18Bit
116 | Panel1024x768 | _PanelType0F };
117 unsigned short tempax, tempbx, temp;
118 /* unsigned short return_flag; */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200119
Aaro Koskinen58839b02011-03-13 12:26:23 +0200120 tempax = xgifb_reg_get(pVBInfo->P3c4, 0x1A);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530121 tempbx = tempax & 0x1E;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200122
Prashant P. Shah914a4022010-09-01 21:37:35 +0530123 if (tempax == 0)
124 return 0;
125 else {
126 /*
127 if (!(tempax & 0x10)) {
128 if (pVBInfo->IF_DEF_LVDS == 1) {
129 tempbx = 0;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200130 temp = xgifb_reg_get(pVBInfo->P3c4, 0x38);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530131 if (temp & 0x40)
132 tempbx |= 0x08;
133 if (temp & 0x20)
134 tempbx |= 0x02;
135 if (temp & 0x01)
136 tempbx |= 0x01;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200137
Aaro Koskinen58839b02011-03-13 12:26:23 +0200138 temp = xgifb_reg_get(pVBInfo->P3c4, 0x39);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530139 if (temp & 0x80)
140 tempbx |= 0x04;
141 } else {
142 return(0);
143 }
144 }
145 */
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200146
Prashant P. Shah914a4022010-09-01 21:37:35 +0530147 tempbx = tempbx >> 1;
148 temp = tempbx & 0x00F;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200149 xgifb_reg_set(pVBInfo->P3d4, 0x36, temp);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530150 tempbx--;
151 tempbx = PanelTypeTable[tempbx];
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200152
Prashant P. Shah914a4022010-09-01 21:37:35 +0530153 temp = (tempbx & 0xFF00) >> 8;
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200154 xgifb_reg_and_or(pVBInfo->P3d4, 0x37, ~(LCDSyncBit
Prashant P. Shah914a4022010-09-01 21:37:35 +0530155 | LCDRGB18Bit), temp);
156 return 1;
157 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200158}
159
Kenji Toyama66229952011-04-23 08:27:48 +0800160static unsigned char
161XGINew_BridgeIsEnable(struct xgi_hw_device_info *HwDeviceExtension,
162 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200163{
Prashant P. Shah914a4022010-09-01 21:37:35 +0530164 unsigned short flag;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200165
Prashant P. Shah914a4022010-09-01 21:37:35 +0530166 if (XGI_BridgeIsOn(pVBInfo) == 0) {
Aaro Koskinen58839b02011-03-13 12:26:23 +0200167 flag = xgifb_reg_get(pVBInfo->Part1Port, 0x0);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200168
Prashant P. Shah914a4022010-09-01 21:37:35 +0530169 if (flag & 0x050)
170 return 1;
171 else
172 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200173
Prashant P. Shah914a4022010-09-01 21:37:35 +0530174 }
175 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200176}
177
Kenji Toyama66229952011-04-23 08:27:48 +0800178static unsigned char
179XGINew_SenseHiTV(struct xgi_hw_device_info *HwDeviceExtension,
180 struct vb_device_info *pVBInfo)
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200181{
Prashant P. Shah914a4022010-09-01 21:37:35 +0530182 unsigned short tempbx, tempcx, temp, i, tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200183
Prashant P. Shah914a4022010-09-01 21:37:35 +0530184 tempbx = *pVBInfo->pYCSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200185
Prashant P. Shah914a4022010-09-01 21:37:35 +0530186 tempcx = 0x0604;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200187
Prashant P. Shah914a4022010-09-01 21:37:35 +0530188 temp = tempbx & 0xFF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200189 xgifb_reg_set(pVBInfo->Part4Port, 0x11, temp);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530190 temp = (tempbx & 0xFF00) >> 8;
191 temp |= (tempcx & 0x00FF);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200192 xgifb_reg_and_or(pVBInfo->Part4Port, 0x10, ~0x1F, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200193
Prashant P. Shah914a4022010-09-01 21:37:35 +0530194 for (i = 0; i < 10; i++)
195 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200196
Prashant P. Shah914a4022010-09-01 21:37:35 +0530197 tempch = (tempcx & 0xFF00) >> 8;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200198 temp = xgifb_reg_get(pVBInfo->Part4Port, 0x03);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530199 temp = temp ^ (0x0E);
200 temp &= tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200201
Prashant P. Shah914a4022010-09-01 21:37:35 +0530202 if (temp != tempch)
203 return 0;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200204
Prashant P. Shah914a4022010-09-01 21:37:35 +0530205 tempbx = *pVBInfo->pVideoSenseData2;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200206
Prashant P. Shah914a4022010-09-01 21:37:35 +0530207 tempcx = 0x0804;
208 temp = tempbx & 0xFF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200209 xgifb_reg_set(pVBInfo->Part4Port, 0x11, temp);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530210 temp = (tempbx & 0xFF00) >> 8;
211 temp |= (tempcx & 0x00FF);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200212 xgifb_reg_and_or(pVBInfo->Part4Port, 0x10, ~0x1F, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200213
Prashant P. Shah914a4022010-09-01 21:37:35 +0530214 for (i = 0; i < 10; i++)
215 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200216
Prashant P. Shah914a4022010-09-01 21:37:35 +0530217 tempch = (tempcx & 0xFF00) >> 8;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200218 temp = xgifb_reg_get(pVBInfo->Part4Port, 0x03);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530219 temp = temp ^ (0x0E);
220 temp &= tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200221
Prashant P. Shah914a4022010-09-01 21:37:35 +0530222 if (temp != tempch) {
223 return 0;
224 } else {
225 tempbx = 0x3FF;
226 tempcx = 0x0804;
227 temp = tempbx & 0xFF;
Aaro Koskinen8104e322011-03-13 12:26:22 +0200228 xgifb_reg_set(pVBInfo->Part4Port, 0x11, temp);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530229 temp = (tempbx & 0xFF00) >> 8;
230 temp |= (tempcx & 0x00FF);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200231 xgifb_reg_and_or(pVBInfo->Part4Port, 0x10, ~0x1F, temp);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200232
Prashant P. Shah914a4022010-09-01 21:37:35 +0530233 for (i = 0; i < 10; i++)
234 XGI_LongWait(pVBInfo);
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200235
Prashant P. Shah914a4022010-09-01 21:37:35 +0530236 tempch = (tempcx & 0xFF00) >> 8;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200237 temp = xgifb_reg_get(pVBInfo->Part4Port, 0x03);
Prashant P. Shah914a4022010-09-01 21:37:35 +0530238 temp = temp ^ (0x0E);
239 temp &= tempch;
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200240
Prashant P. Shah914a4022010-09-01 21:37:35 +0530241 if (temp != tempch)
242 return 1;
243 else
244 return 0;
245 }
apatard@mandriva.comd7636e02010-05-19 10:44:14 +0200246}
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200247
Kenji Toyama66229952011-04-23 08:27:48 +0800248void XGI_GetSenseStatus(struct xgi_hw_device_info *HwDeviceExtension,
249 struct vb_device_info *pVBInfo)
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200250{
Kenji Toyama66229952011-04-23 08:27:48 +0800251 unsigned short tempax = 0, tempbx, tempcx, temp,
252 P2reg0 = 0, SenseModeNo = 0,
253 OutputSelect = *pVBInfo->pOutputSelect,
254 ModeIdIndex, i;
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200255 pVBInfo->BaseAddr = (unsigned long) HwDeviceExtension->pjIOAddress;
256
257 if (pVBInfo->IF_DEF_LVDS == 1) {
Kenji Toyama66229952011-04-23 08:27:48 +0800258 /* ynlai 02/27/2002 */
259 tempax = xgifb_reg_get(pVBInfo->P3c4, 0x1A);
Aaro Koskinen58839b02011-03-13 12:26:23 +0200260 tempbx = xgifb_reg_get(pVBInfo->P3c4, 0x1B);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200261 tempax = ((tempax & 0xFE) >> 1) | (tempbx << 8);
262 if (tempax == 0x00) { /* Get Panel id from DDC */
263 temp = XGINew_GetLCDDDCInfo(HwDeviceExtension, pVBInfo);
264 if (temp == 1) { /* LCD connect */
Kenji Toyama66229952011-04-23 08:27:48 +0800265 /* set CR39 bit0="1" */
266 xgifb_reg_and_or(pVBInfo->P3d4,
267 0x39, 0xFF, 0x01);
268 /* clean CR37 bit4="0" */
269 xgifb_reg_and_or(pVBInfo->P3d4,
270 0x37, 0xEF, 0x00);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200271 temp = LCDSense;
272 } else { /* LCD don't connect */
273 temp = 0;
274 }
275 } else {
276 XGINew_GetPanelID(pVBInfo);
277 temp = LCDSense;
278 }
279
280 tempbx = ~(LCDSense | AVIDEOSense | SVIDEOSense);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200281 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, tempbx, temp);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200282 } else { /* for 301 */
283 if (pVBInfo->VBInfo & SetCRT2ToHiVisionTV) { /* for HiVision */
Aaro Koskinen58839b02011-03-13 12:26:23 +0200284 tempax = xgifb_reg_get(pVBInfo->P3c4, 0x38);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200285 temp = tempax & 0x01;
Aaro Koskinen58839b02011-03-13 12:26:23 +0200286 tempax = xgifb_reg_get(pVBInfo->P3c4, 0x3A);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200287 temp = temp | (tempax & 0x02);
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200288 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, 0xA0, temp);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200289 } else {
290 if (XGI_BridgeIsOn(pVBInfo)) {
Kenji Toyama66229952011-04-23 08:27:48 +0800291 P2reg0 = xgifb_reg_get(pVBInfo->Part2Port,
292 0x00);
293 if (!XGINew_BridgeIsEnable(HwDeviceExtension,
294 pVBInfo)) {
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200295 SenseModeNo = 0x2e;
Kenji Toyama66229952011-04-23 08:27:48 +0800296 /* xgifb_reg_set(pVBInfo->P3d4, 0x30, 0x41);
297 * XGISetModeNew(HwDeviceExtension, 0x2e);
298 * // ynlai InitMode */
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200299
Kenji Toyama66229952011-04-23 08:27:48 +0800300 temp = XGI_SearchModeID(SenseModeNo,
301 &ModeIdIndex,
302 pVBInfo);
303 XGI_GetVGAType(HwDeviceExtension,
304 pVBInfo);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200305 XGI_GetVBType(pVBInfo);
306 pVBInfo->SetFlag = 0x00;
307 pVBInfo->ModeType = ModeVGA;
Kenji Toyama66229952011-04-23 08:27:48 +0800308 pVBInfo->VBInfo = SetCRT2ToRAMDAC |
309 LoadDACFlag |
310 SetInSlaveMode;
311 XGI_GetLCDInfo(0x2e,
312 ModeIdIndex,
313 pVBInfo);
314 XGI_GetTVInfo(0x2e,
315 ModeIdIndex,
316 pVBInfo);
317 XGI_EnableBridge(HwDeviceExtension,
318 pVBInfo);
319 XGI_SetCRT2Group301(SenseModeNo,
320 HwDeviceExtension,
321 pVBInfo);
322 XGI_SetCRT2ModeRegs(0x2e,
323 HwDeviceExtension,
324 pVBInfo);
325 /* XGI_DisableBridge(HwDeviceExtension,
326 * pVBInfo ) ; */
327 /* Display Off 0212 */
328 xgifb_reg_and_or(pVBInfo->P3c4,
329 0x01,
330 0xDF,
331 0x20);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200332 for (i = 0; i < 20; i++)
333 XGI_LongWait(pVBInfo);
334 }
Aaro Koskinen8104e322011-03-13 12:26:22 +0200335 xgifb_reg_set(pVBInfo->Part2Port, 0x00, 0x1c);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200336 tempax = 0;
337 tempbx = *pVBInfo->pRGBSenseData;
338
339 if (!(XGINew_Is301B(pVBInfo)))
340 tempbx = *pVBInfo->pRGBSenseData2;
341
342 tempcx = 0x0E08;
343 if (XGINew_Sense(tempbx, tempcx, pVBInfo)) {
Kenji Toyama66229952011-04-23 08:27:48 +0800344 if (XGINew_Sense(tempbx,
345 tempcx,
346 pVBInfo))
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200347 tempax |= Monitor2Sense;
348 }
349
350 if (pVBInfo->VBType & VB_XGI301C)
Kenji Toyama66229952011-04-23 08:27:48 +0800351 xgifb_reg_or(pVBInfo->Part4Port,
352 0x0d,
353 0x04);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200354
Kenji Toyama66229952011-04-23 08:27:48 +0800355 /* add by kuku for Multi-adapter sense HiTV */
356 if (XGINew_SenseHiTV(HwDeviceExtension,
357 pVBInfo)) {
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200358 tempax |= HiTVSense;
359 if ((pVBInfo->VBType & VB_XGI301C))
Kenji Toyama66229952011-04-23 08:27:48 +0800360 tempax ^= (HiTVSense |
361 YPbPrSense);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200362 }
363
Kenji Toyama66229952011-04-23 08:27:48 +0800364 /* start */
365 if (!(tempax & (HiTVSense | YPbPrSense))) {
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200366 tempbx = *pVBInfo->pYCSenseData;
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200367 if (!(XGINew_Is301B(pVBInfo)))
368 tempbx = *pVBInfo->pYCSenseData2;
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200369 tempcx = 0x0604;
Kenji Toyama66229952011-04-23 08:27:48 +0800370 if (XGINew_Sense(tempbx,
371 tempcx,
372 pVBInfo)) {
373 if (XGINew_Sense(tempbx,
374 tempcx,
375 pVBInfo))
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200376 tempax |= SVIDEOSense;
377 }
378
379 if (OutputSelect & BoardTVType) {
380 tempbx = *pVBInfo->pVideoSenseData;
381
382 if (!(XGINew_Is301B(pVBInfo)))
383 tempbx = *pVBInfo->pVideoSenseData2;
384
385 tempcx = 0x0804;
Kenji Toyama66229952011-04-23 08:27:48 +0800386 if (XGINew_Sense(tempbx,
387 tempcx,
388 pVBInfo)) {
389 if (XGINew_Sense(tempbx,
390 tempcx,
391 pVBInfo))
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200392 tempax |= AVIDEOSense;
393 }
394 } else {
395 if (!(tempax & SVIDEOSense)) {
396 tempbx = *pVBInfo->pVideoSenseData;
397
398 if (!(XGINew_Is301B(pVBInfo)))
399 tempbx = *pVBInfo->pVideoSenseData2;
400
401 tempcx = 0x0804;
Kenji Toyama66229952011-04-23 08:27:48 +0800402 if (XGINew_Sense(tempbx,
403 tempcx,
404 pVBInfo)) {
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200405 if (XGINew_Sense(tempbx, tempcx, pVBInfo))
406 tempax |= AVIDEOSense;
407 }
408 }
409 }
410 }
411 } /* end */
412 if (!(tempax & Monitor2Sense)) {
413 if (XGINew_SenseLCD(HwDeviceExtension, pVBInfo))
414 tempax |= LCDSense;
415 }
416 tempbx = 0;
417 tempcx = 0;
418 XGINew_Sense(tempbx, tempcx, pVBInfo);
419
Aaro Koskinenec9e5d32011-03-13 12:26:25 +0200420 xgifb_reg_and_or(pVBInfo->P3d4, 0x32, ~0xDF, tempax);
Aaro Koskinen8104e322011-03-13 12:26:22 +0200421 xgifb_reg_set(pVBInfo->Part2Port, 0x00, P2reg0);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200422
423 if (!(P2reg0 & 0x20)) {
424 pVBInfo->VBInfo = DisableCRT2Display;
Kenji Toyama66229952011-04-23 08:27:48 +0800425 /* XGI_SetCRT2Group301(SenseModeNo,
426 * HwDeviceExtension,
427 * pVBInfo); */
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200428 }
429 }
430 }
431 XGI_DisableBridge(HwDeviceExtension, pVBInfo); /* shampoo 0226 */
432
433}
434
Kenji Toyama66229952011-04-23 08:27:48 +0800435unsigned short XGINew_SenseLCD(struct xgi_hw_device_info *HwDeviceExtension,
436 struct vb_device_info *pVBInfo)
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200437{
438 /* unsigned short SoftSetting ; */
439 unsigned short temp;
440
Aaro Koskinen06587332011-03-13 12:26:10 +0200441 temp = XGINew_GetLCDDDCInfo(HwDeviceExtension, pVBInfo);
Aaro Koskinen3f8214c2011-03-13 12:26:05 +0200442
443 return temp;
444}