aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/xgifb/XGI_main_26.c
diff options
context:
space:
mode:
authorAaro Koskinen <aaro.koskinen@iki.fi>2011-04-18 15:14:05 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-04-25 20:26:27 -0400
commitc4fa7dfe57f1cc2607ef01d9959d711eb073ff61 (patch)
tree41935ff19c4e5fbfee58e53f50fe425cdb1db358 /drivers/staging/xgifb/XGI_main_26.c
parentf45f59d76303d9a60dd19b37c032bdb2a6a32cfa (diff)
staging: xgifb: main: move functions to avoid forward declarations
Move functions so that all forward declarations of internal functions can be deleted. Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/xgifb/XGI_main_26.c')
-rw-r--r--drivers/staging/xgifb/XGI_main_26.c599
1 files changed, 299 insertions, 300 deletions
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c
index 8de6829b415..13506816203 100644
--- a/drivers/staging/xgifb/XGI_main_26.c
+++ b/drivers/staging/xgifb/XGI_main_26.c
@@ -50,7 +50,6 @@
50#define GPIOG_EN (1<<6) 50#define GPIOG_EN (1<<6)
51#define GPIOG_WRITE (1<<6) 51#define GPIOG_WRITE (1<<6)
52#define GPIOG_READ (1<<1) 52#define GPIOG_READ (1<<1)
53int XGIfb_GetXG21DefaultLVDSModeIdx(void);
54 53
55#define XGIFB_ROM_SIZE 65536 54#define XGIFB_ROM_SIZE 65536
56 55
@@ -480,6 +479,33 @@ unsigned char XGIfb_query_north_bridge_space(struct xgi_hw_device_info *pXGIhw_e
480*/ 479*/
481/* ------------------ Internal helper routines ----------------- */ 480/* ------------------ Internal helper routines ----------------- */
482 481
482int XGIfb_GetXG21DefaultLVDSModeIdx(void)
483{
484
485 int found_mode = 0;
486 int XGIfb_mode_idx = 0;
487
488 found_mode = 0;
489 while ((XGIbios_mode[XGIfb_mode_idx].mode_no != 0)
490 && (XGIbios_mode[XGIfb_mode_idx].xres
491 <= XGI21_LCDCapList[0].LVDSHDE)) {
492 if ((XGIbios_mode[XGIfb_mode_idx].xres
493 == XGI21_LCDCapList[0].LVDSHDE)
494 && (XGIbios_mode[XGIfb_mode_idx].yres
495 == XGI21_LCDCapList[0].LVDSVDE)
496 && (XGIbios_mode[XGIfb_mode_idx].bpp == 8)) {
497 XGIfb_mode_no = XGIbios_mode[XGIfb_mode_idx].mode_no;
498 found_mode = 1;
499 break;
500 }
501 XGIfb_mode_idx++;
502 }
503 if (!found_mode)
504 XGIfb_mode_idx = 0;
505
506 return XGIfb_mode_idx;
507}
508
483static void XGIfb_search_mode(const char *name) 509static void XGIfb_search_mode(const char *name)
484{ 510{
485 int i = 0, j = 0, l; 511 int i = 0, j = 0, l;
@@ -603,33 +629,6 @@ static int XGIfb_GetXG21LVDSData(void)
603 return 0; 629 return 0;
604} 630}
605 631
606int XGIfb_GetXG21DefaultLVDSModeIdx(void)
607{
608
609 int found_mode = 0;
610 int XGIfb_mode_idx = 0;
611
612 found_mode = 0;
613 while ((XGIbios_mode[XGIfb_mode_idx].mode_no != 0)
614 && (XGIbios_mode[XGIfb_mode_idx].xres
615 <= XGI21_LCDCapList[0].LVDSHDE)) {
616 if ((XGIbios_mode[XGIfb_mode_idx].xres
617 == XGI21_LCDCapList[0].LVDSHDE)
618 && (XGIbios_mode[XGIfb_mode_idx].yres
619 == XGI21_LCDCapList[0].LVDSVDE)
620 && (XGIbios_mode[XGIfb_mode_idx].bpp == 8)) {
621 XGIfb_mode_no = XGIbios_mode[XGIfb_mode_idx].mode_no;
622 found_mode = 1;
623 break;
624 }
625 XGIfb_mode_idx++;
626 }
627 if (!found_mode)
628 XGIfb_mode_idx = 0;
629
630 return XGIfb_mode_idx;
631}
632
633static int XGIfb_validate_mode(int myindex) 632static int XGIfb_validate_mode(int myindex)
634{ 633{
635 u16 xres, yres; 634 u16 xres, yres;
@@ -978,6 +977,224 @@ static void XGIfb_bpp_to_var(struct fb_var_screeninfo *var)
978 } 977 }
979} 978}
980 979
980/* --------------------- SetMode routines ------------------------- */
981
982static void XGIfb_pre_setmode(void)
983{
984 u8 cr30 = 0, cr31 = 0;
985
986 cr31 = xgifb_reg_get(XGICR, 0x31);
987 cr31 &= ~0x60;
988
989 switch (xgi_video_info.disp_state & DISPTYPE_DISP2) {
990 case DISPTYPE_CRT2:
991 cr30 = (XGI_VB_OUTPUT_CRT2 | XGI_SIMULTANEOUS_VIEW_ENABLE);
992 cr31 |= XGI_DRIVER_MODE;
993 break;
994 case DISPTYPE_LCD:
995 cr30 = (XGI_VB_OUTPUT_LCD | XGI_SIMULTANEOUS_VIEW_ENABLE);
996 cr31 |= XGI_DRIVER_MODE;
997 break;
998 case DISPTYPE_TV:
999 if (xgi_video_info.TV_type == TVMODE_HIVISION)
1000 cr30 = (XGI_VB_OUTPUT_HIVISION
1001 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1002 else if (xgi_video_info.TV_plug == TVPLUG_SVIDEO)
1003 cr30 = (XGI_VB_OUTPUT_SVIDEO
1004 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1005 else if (xgi_video_info.TV_plug == TVPLUG_COMPOSITE)
1006 cr30 = (XGI_VB_OUTPUT_COMPOSITE
1007 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1008 else if (xgi_video_info.TV_plug == TVPLUG_SCART)
1009 cr30 = (XGI_VB_OUTPUT_SCART
1010 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1011 cr31 |= XGI_DRIVER_MODE;
1012
1013 if (XGIfb_tvmode == 1 || xgi_video_info.TV_type == TVMODE_PAL)
1014 cr31 |= 0x01;
1015 else
1016 cr31 &= ~0x01;
1017 break;
1018 default: /* disable CRT2 */
1019 cr30 = 0x00;
1020 cr31 |= (XGI_DRIVER_MODE | XGI_VB_OUTPUT_DISABLE);
1021 }
1022
1023 xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR30, cr30);
1024 xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR31, cr31);
1025 xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR33, (XGIfb_rate_idx & 0x0F));
1026}
1027
1028static void XGIfb_post_setmode(void)
1029{
1030 u8 reg;
1031 unsigned char doit = 1;
1032 /*
1033 xgifb_reg_set(XGISR,IND_XGI_PASSWORD,XGI_PASSWORD);
1034 xgifb_reg_set(XGICR, 0x13, 0x00);
1035 xgifb_reg_and_or(XGISR,0x0E, 0xF0, 0x01);
1036 *test*
1037 */
1038 if (xgi_video_info.video_bpp == 8) {
1039 /* TW: We can't switch off CRT1 on LVDS/Chrontel in 8bpp Modes */
1040 if ((xgi_video_info.hasVB == HASVB_LVDS)
1041 || (xgi_video_info.hasVB == HASVB_LVDS_CHRONTEL)) {
1042 doit = 0;
1043 }
1044 /* TW: We can't switch off CRT1 on 301B-DH in 8bpp Modes if using LCD */
1045 if (xgi_video_info.disp_state & DISPTYPE_LCD)
1046 doit = 0;
1047 }
1048
1049 /* TW: We can't switch off CRT1 if bridge is in slave mode */
1050 if (xgi_video_info.hasVB != HASVB_NONE) {
1051 reg = xgifb_reg_get(XGIPART1, 0x00);
1052
1053 if ((reg & 0x50) == 0x10)
1054 doit = 0;
1055
1056 } else {
1057 XGIfb_crt1off = 0;
1058 }
1059
1060 reg = xgifb_reg_get(XGICR, 0x17);
1061 if ((XGIfb_crt1off) && (doit))
1062 reg &= ~0x80;
1063 else
1064 reg |= 0x80;
1065 xgifb_reg_set(XGICR, 0x17, reg);
1066
1067 xgifb_reg_and(XGISR, IND_XGI_RAMDAC_CONTROL, ~0x04);
1068
1069 if ((xgi_video_info.disp_state & DISPTYPE_TV) && (xgi_video_info.hasVB
1070 == HASVB_301)) {
1071
1072 reg = xgifb_reg_get(XGIPART4, 0x01);
1073
1074 if (reg < 0xB0) { /* Set filter for XGI301 */
1075
1076 switch (xgi_video_info.video_width) {
1077 case 320:
1078 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 4 : 12;
1079 break;
1080 case 640:
1081 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 5 : 13;
1082 break;
1083 case 720:
1084 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 6 : 14;
1085 break;
1086 case 800:
1087 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 7 : 15;
1088 break;
1089 default:
1090 filter = -1;
1091 break;
1092 }
1093
1094 xgifb_reg_or(XGIPART1, XGIfb_CRT2_write_enable, 0x01);
1095
1096 if (xgi_video_info.TV_type == TVMODE_NTSC) {
1097
1098 xgifb_reg_and(XGIPART2, 0x3a, 0x1f);
1099
1100 if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
1101
1102 xgifb_reg_and(XGIPART2, 0x30, 0xdf);
1103
1104 } else if (xgi_video_info.TV_plug
1105 == TVPLUG_COMPOSITE) {
1106
1107 xgifb_reg_or(XGIPART2, 0x30, 0x20);
1108
1109 switch (xgi_video_info.video_width) {
1110 case 640:
1111 xgifb_reg_set(XGIPART2, 0x35, 0xEB);
1112 xgifb_reg_set(XGIPART2, 0x36, 0x04);
1113 xgifb_reg_set(XGIPART2, 0x37, 0x25);
1114 xgifb_reg_set(XGIPART2, 0x38, 0x18);
1115 break;
1116 case 720:
1117 xgifb_reg_set(XGIPART2, 0x35, 0xEE);
1118 xgifb_reg_set(XGIPART2, 0x36, 0x0C);
1119 xgifb_reg_set(XGIPART2, 0x37, 0x22);
1120 xgifb_reg_set(XGIPART2, 0x38, 0x08);
1121 break;
1122 case 800:
1123 xgifb_reg_set(XGIPART2, 0x35, 0xEB);
1124 xgifb_reg_set(XGIPART2, 0x36, 0x15);
1125 xgifb_reg_set(XGIPART2, 0x37, 0x25);
1126 xgifb_reg_set(XGIPART2, 0x38, 0xF6);
1127 break;
1128 }
1129 }
1130
1131 } else if (xgi_video_info.TV_type == TVMODE_PAL) {
1132
1133 xgifb_reg_and(XGIPART2, 0x3A, 0x1F);
1134
1135 if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
1136
1137 xgifb_reg_and(XGIPART2, 0x30, 0xDF);
1138
1139 } else if (xgi_video_info.TV_plug
1140 == TVPLUG_COMPOSITE) {
1141
1142 xgifb_reg_or(XGIPART2, 0x30, 0x20);
1143
1144 switch (xgi_video_info.video_width) {
1145 case 640:
1146 xgifb_reg_set(XGIPART2, 0x35, 0xF1);
1147 xgifb_reg_set(XGIPART2, 0x36, 0xF7);
1148 xgifb_reg_set(XGIPART2, 0x37, 0x1F);
1149 xgifb_reg_set(XGIPART2, 0x38, 0x32);
1150 break;
1151 case 720:
1152 xgifb_reg_set(XGIPART2, 0x35, 0xF3);
1153 xgifb_reg_set(XGIPART2, 0x36, 0x00);
1154 xgifb_reg_set(XGIPART2, 0x37, 0x1D);
1155 xgifb_reg_set(XGIPART2, 0x38, 0x20);
1156 break;
1157 case 800:
1158 xgifb_reg_set(XGIPART2, 0x35, 0xFC);
1159 xgifb_reg_set(XGIPART2, 0x36, 0xFB);
1160 xgifb_reg_set(XGIPART2, 0x37, 0x14);
1161 xgifb_reg_set(XGIPART2, 0x38, 0x2A);
1162 break;
1163 }
1164 }
1165 }
1166
1167 if ((filter >= 0) && (filter <= 7)) {
1168 DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter,
1169 XGI_TV_filter[filter_tb].filter[filter][0],
1170 XGI_TV_filter[filter_tb].filter[filter][1],
1171 XGI_TV_filter[filter_tb].filter[filter][2],
1172 XGI_TV_filter[filter_tb].filter[filter][3]
1173 );
1174 xgifb_reg_set(
1175 XGIPART2,
1176 0x35,
1177 (XGI_TV_filter[filter_tb].filter[filter][0]));
1178 xgifb_reg_set(
1179 XGIPART2,
1180 0x36,
1181 (XGI_TV_filter[filter_tb].filter[filter][1]));
1182 xgifb_reg_set(
1183 XGIPART2,
1184 0x37,
1185 (XGI_TV_filter[filter_tb].filter[filter][2]));
1186 xgifb_reg_set(
1187 XGIPART2,
1188 0x38,
1189 (XGI_TV_filter[filter_tb].filter[filter][3]));
1190 }
1191
1192 }
1193
1194 }
1195
1196}
1197
981static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive, 1198static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
982 struct fb_info *info) 1199 struct fb_info *info)
983{ 1200{
@@ -1249,6 +1466,41 @@ static int XGIfb_setcolreg(unsigned regno, unsigned red, unsigned green,
1249 return 0; 1466 return 0;
1250} 1467}
1251 1468
1469/* ----------- FBDev related routines for all series ---------- */
1470
1471static int XGIfb_get_fix(struct fb_fix_screeninfo *fix, int con,
1472 struct fb_info *info)
1473{
1474 DEBUGPRN("inside get_fix");
1475 memset(fix, 0, sizeof(struct fb_fix_screeninfo));
1476
1477 strcpy(fix->id, myid);
1478
1479 fix->smem_start = xgi_video_info.video_base;
1480
1481 fix->smem_len = xgi_video_info.video_size;
1482
1483 fix->type = video_type;
1484 fix->type_aux = 0;
1485 if (xgi_video_info.video_bpp == 8)
1486 fix->visual = FB_VISUAL_PSEUDOCOLOR;
1487 else
1488 fix->visual = FB_VISUAL_DIRECTCOLOR;
1489 fix->xpanstep = 0;
1490#ifdef XGIFB_PAN
1491 if (XGIfb_ypan)
1492 fix->ypanstep = 1;
1493#endif
1494 fix->ywrapstep = 0;
1495 fix->line_length = xgi_video_info.video_linelength;
1496 fix->mmio_start = xgi_video_info.mmio_base;
1497 fix->mmio_len = xgi_video_info.mmio_size;
1498 fix->accel = FB_ACCEL_XGI_XABRE;
1499
1500 DEBUGPRN("end of get_fix");
1501 return 0;
1502}
1503
1252static int XGIfb_set_par(struct fb_info *info) 1504static int XGIfb_set_par(struct fb_info *info)
1253{ 1505{
1254 int err; 1506 int err;
@@ -1460,41 +1712,6 @@ static int XGIfb_blank(int blank, struct fb_info *info)
1460 return 0; 1712 return 0;
1461} 1713}
1462 1714
1463/* ----------- FBDev related routines for all series ---------- */
1464
1465static int XGIfb_get_fix(struct fb_fix_screeninfo *fix, int con,
1466 struct fb_info *info)
1467{
1468 DEBUGPRN("inside get_fix");
1469 memset(fix, 0, sizeof(struct fb_fix_screeninfo));
1470
1471 strcpy(fix->id, myid);
1472
1473 fix->smem_start = xgi_video_info.video_base;
1474
1475 fix->smem_len = xgi_video_info.video_size;
1476
1477 fix->type = video_type;
1478 fix->type_aux = 0;
1479 if (xgi_video_info.video_bpp == 8)
1480 fix->visual = FB_VISUAL_PSEUDOCOLOR;
1481 else
1482 fix->visual = FB_VISUAL_DIRECTCOLOR;
1483 fix->xpanstep = 0;
1484#ifdef XGIFB_PAN
1485 if (XGIfb_ypan)
1486 fix->ypanstep = 1;
1487#endif
1488 fix->ywrapstep = 0;
1489 fix->line_length = xgi_video_info.video_linelength;
1490 fix->mmio_start = xgi_video_info.mmio_base;
1491 fix->mmio_len = xgi_video_info.mmio_size;
1492 fix->accel = FB_ACCEL_XGI_XABRE;
1493
1494 DEBUGPRN("end of get_fix");
1495 return 0;
1496}
1497
1498static struct fb_ops XGIfb_ops = { 1715static struct fb_ops XGIfb_ops = {
1499 .owner = THIS_MODULE, 1716 .owner = THIS_MODULE,
1500 .fb_open = XGIfb_open, 1717 .fb_open = XGIfb_open,
@@ -1676,25 +1893,6 @@ static void XGIfb_detect_VB(void)
1676 } 1893 }
1677} 1894}
1678 1895
1679static void XGIfb_get_VB_type(void)
1680{
1681 u8 reg;
1682
1683 if (!XGIfb_has_VB()) {
1684 reg = xgifb_reg_get(XGICR, IND_XGI_SCRATCH_REG_CR37);
1685 switch ((reg & XGI_EXTERNAL_CHIP_MASK) >> 1) {
1686 case XGI310_EXTERNAL_CHIP_LVDS:
1687 xgi_video_info.hasVB = HASVB_LVDS;
1688 break;
1689 case XGI310_EXTERNAL_CHIP_LVDS_CHRONTEL:
1690 xgi_video_info.hasVB = HASVB_LVDS_CHRONTEL;
1691 break;
1692 default:
1693 break;
1694 }
1695 }
1696}
1697
1698static int XGIfb_has_VB(void) 1896static int XGIfb_has_VB(void)
1699{ 1897{
1700 u8 vb_chipid; 1898 u8 vb_chipid;
@@ -1714,6 +1912,25 @@ static int XGIfb_has_VB(void)
1714 return 1; 1912 return 1;
1715} 1913}
1716 1914
1915static void XGIfb_get_VB_type(void)
1916{
1917 u8 reg;
1918
1919 if (!XGIfb_has_VB()) {
1920 reg = xgifb_reg_get(XGICR, IND_XGI_SCRATCH_REG_CR37);
1921 switch ((reg & XGI_EXTERNAL_CHIP_MASK) >> 1) {
1922 case XGI310_EXTERNAL_CHIP_LVDS:
1923 xgi_video_info.hasVB = HASVB_LVDS;
1924 break;
1925 case XGI310_EXTERNAL_CHIP_LVDS_CHRONTEL:
1926 xgi_video_info.hasVB = HASVB_LVDS_CHRONTEL;
1927 break;
1928 default:
1929 break;
1930 }
1931 }
1932}
1933
1717/* ------------------ Sensing routines ------------------ */ 1934/* ------------------ Sensing routines ------------------ */
1718 1935
1719/* TW: Determine and detect attached devices on XGI30x */ 1936/* TW: Determine and detect attached devices on XGI30x */
@@ -1836,224 +2053,6 @@ void XGI_Sense30x(void)
1836 xgifb_reg_set(XGIPART4, 0x0d, backupP4_0d); 2053 xgifb_reg_set(XGIPART4, 0x0d, backupP4_0d);
1837} 2054}
1838 2055
1839/* --------------------- SetMode routines ------------------------- */
1840
1841static void XGIfb_pre_setmode(void)
1842{
1843 u8 cr30 = 0, cr31 = 0;
1844
1845 cr31 = xgifb_reg_get(XGICR, 0x31);
1846 cr31 &= ~0x60;
1847
1848 switch (xgi_video_info.disp_state & DISPTYPE_DISP2) {
1849 case DISPTYPE_CRT2:
1850 cr30 = (XGI_VB_OUTPUT_CRT2 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1851 cr31 |= XGI_DRIVER_MODE;
1852 break;
1853 case DISPTYPE_LCD:
1854 cr30 = (XGI_VB_OUTPUT_LCD | XGI_SIMULTANEOUS_VIEW_ENABLE);
1855 cr31 |= XGI_DRIVER_MODE;
1856 break;
1857 case DISPTYPE_TV:
1858 if (xgi_video_info.TV_type == TVMODE_HIVISION)
1859 cr30 = (XGI_VB_OUTPUT_HIVISION
1860 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1861 else if (xgi_video_info.TV_plug == TVPLUG_SVIDEO)
1862 cr30 = (XGI_VB_OUTPUT_SVIDEO
1863 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1864 else if (xgi_video_info.TV_plug == TVPLUG_COMPOSITE)
1865 cr30 = (XGI_VB_OUTPUT_COMPOSITE
1866 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1867 else if (xgi_video_info.TV_plug == TVPLUG_SCART)
1868 cr30 = (XGI_VB_OUTPUT_SCART
1869 | XGI_SIMULTANEOUS_VIEW_ENABLE);
1870 cr31 |= XGI_DRIVER_MODE;
1871
1872 if (XGIfb_tvmode == 1 || xgi_video_info.TV_type == TVMODE_PAL)
1873 cr31 |= 0x01;
1874 else
1875 cr31 &= ~0x01;
1876 break;
1877 default: /* disable CRT2 */
1878 cr30 = 0x00;
1879 cr31 |= (XGI_DRIVER_MODE | XGI_VB_OUTPUT_DISABLE);
1880 }
1881
1882 xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR30, cr30);
1883 xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR31, cr31);
1884 xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR33, (XGIfb_rate_idx & 0x0F));
1885}
1886
1887static void XGIfb_post_setmode(void)
1888{
1889 u8 reg;
1890 unsigned char doit = 1;
1891 /*
1892 xgifb_reg_set(XGISR,IND_XGI_PASSWORD,XGI_PASSWORD);
1893 xgifb_reg_set(XGICR, 0x13, 0x00);
1894 xgifb_reg_and_or(XGISR,0x0E, 0xF0, 0x01);
1895 *test*
1896 */
1897 if (xgi_video_info.video_bpp == 8) {
1898 /* TW: We can't switch off CRT1 on LVDS/Chrontel in 8bpp Modes */
1899 if ((xgi_video_info.hasVB == HASVB_LVDS)
1900 || (xgi_video_info.hasVB == HASVB_LVDS_CHRONTEL)) {
1901 doit = 0;
1902 }
1903 /* TW: We can't switch off CRT1 on 301B-DH in 8bpp Modes if using LCD */
1904 if (xgi_video_info.disp_state & DISPTYPE_LCD)
1905 doit = 0;
1906 }
1907
1908 /* TW: We can't switch off CRT1 if bridge is in slave mode */
1909 if (xgi_video_info.hasVB != HASVB_NONE) {
1910 reg = xgifb_reg_get(XGIPART1, 0x00);
1911
1912 if ((reg & 0x50) == 0x10)
1913 doit = 0;
1914
1915 } else {
1916 XGIfb_crt1off = 0;
1917 }
1918
1919 reg = xgifb_reg_get(XGICR, 0x17);
1920 if ((XGIfb_crt1off) && (doit))
1921 reg &= ~0x80;
1922 else
1923 reg |= 0x80;
1924 xgifb_reg_set(XGICR, 0x17, reg);
1925
1926 xgifb_reg_and(XGISR, IND_XGI_RAMDAC_CONTROL, ~0x04);
1927
1928 if ((xgi_video_info.disp_state & DISPTYPE_TV) && (xgi_video_info.hasVB
1929 == HASVB_301)) {
1930
1931 reg = xgifb_reg_get(XGIPART4, 0x01);
1932
1933 if (reg < 0xB0) { /* Set filter for XGI301 */
1934
1935 switch (xgi_video_info.video_width) {
1936 case 320:
1937 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 4 : 12;
1938 break;
1939 case 640:
1940 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 5 : 13;
1941 break;
1942 case 720:
1943 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 6 : 14;
1944 break;
1945 case 800:
1946 filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 7 : 15;
1947 break;
1948 default:
1949 filter = -1;
1950 break;
1951 }
1952
1953 xgifb_reg_or(XGIPART1, XGIfb_CRT2_write_enable, 0x01);
1954
1955 if (xgi_video_info.TV_type == TVMODE_NTSC) {
1956
1957 xgifb_reg_and(XGIPART2, 0x3a, 0x1f);
1958
1959 if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
1960
1961 xgifb_reg_and(XGIPART2, 0x30, 0xdf);
1962
1963 } else if (xgi_video_info.TV_plug
1964 == TVPLUG_COMPOSITE) {
1965
1966 xgifb_reg_or(XGIPART2, 0x30, 0x20);
1967
1968 switch (xgi_video_info.video_width) {
1969 case 640:
1970 xgifb_reg_set(XGIPART2, 0x35, 0xEB);
1971 xgifb_reg_set(XGIPART2, 0x36, 0x04);
1972 xgifb_reg_set(XGIPART2, 0x37, 0x25);
1973 xgifb_reg_set(XGIPART2, 0x38, 0x18);
1974 break;
1975 case 720:
1976 xgifb_reg_set(XGIPART2, 0x35, 0xEE);
1977 xgifb_reg_set(XGIPART2, 0x36, 0x0C);
1978 xgifb_reg_set(XGIPART2, 0x37, 0x22);
1979 xgifb_reg_set(XGIPART2, 0x38, 0x08);
1980 break;
1981 case 800:
1982 xgifb_reg_set(XGIPART2, 0x35, 0xEB);
1983 xgifb_reg_set(XGIPART2, 0x36, 0x15);
1984 xgifb_reg_set(XGIPART2, 0x37, 0x25);
1985 xgifb_reg_set(XGIPART2, 0x38, 0xF6);
1986 break;
1987 }
1988 }
1989
1990 } else if (xgi_video_info.TV_type == TVMODE_PAL) {
1991
1992 xgifb_reg_and(XGIPART2, 0x3A, 0x1F);
1993
1994 if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
1995
1996 xgifb_reg_and(XGIPART2, 0x30, 0xDF);
1997
1998 } else if (xgi_video_info.TV_plug
1999 == TVPLUG_COMPOSITE) {
2000
2001 xgifb_reg_or(XGIPART2, 0x30, 0x20);
2002
2003 switch (xgi_video_info.video_width) {
2004 case 640:
2005 xgifb_reg_set(XGIPART2, 0x35, 0xF1);
2006 xgifb_reg_set(XGIPART2, 0x36, 0xF7);
2007 xgifb_reg_set(XGIPART2, 0x37, 0x1F);
2008 xgifb_reg_set(XGIPART2, 0x38, 0x32);
2009 break;
2010 case 720:
2011 xgifb_reg_set(XGIPART2, 0x35, 0xF3);
2012 xgifb_reg_set(XGIPART2, 0x36, 0x00);
2013 xgifb_reg_set(XGIPART2, 0x37, 0x1D);
2014 xgifb_reg_set(XGIPART2, 0x38, 0x20);
2015 break;
2016 case 800:
2017 xgifb_reg_set(XGIPART2, 0x35, 0xFC);
2018 xgifb_reg_set(XGIPART2, 0x36, 0xFB);
2019 xgifb_reg_set(XGIPART2, 0x37, 0x14);
2020 xgifb_reg_set(XGIPART2, 0x38, 0x2A);
2021 break;
2022 }
2023 }
2024 }
2025
2026 if ((filter >= 0) && (filter <= 7)) {
2027 DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter,
2028 XGI_TV_filter[filter_tb].filter[filter][0],
2029 XGI_TV_filter[filter_tb].filter[filter][1],
2030 XGI_TV_filter[filter_tb].filter[filter][2],
2031 XGI_TV_filter[filter_tb].filter[filter][3]
2032 );
2033 xgifb_reg_set(
2034 XGIPART2,
2035 0x35,
2036 (XGI_TV_filter[filter_tb].filter[filter][0]));
2037 xgifb_reg_set(
2038 XGIPART2,
2039 0x36,
2040 (XGI_TV_filter[filter_tb].filter[filter][1]));
2041 xgifb_reg_set(
2042 XGIPART2,
2043 0x37,
2044 (XGI_TV_filter[filter_tb].filter[filter][2]));
2045 xgifb_reg_set(
2046 XGIPART2,
2047 0x38,
2048 (XGI_TV_filter[filter_tb].filter[filter][3]));
2049 }
2050
2051 }
2052
2053 }
2054
2055}
2056
2057XGIINITSTATIC int __init XGIfb_setup(char *options) 2056XGIINITSTATIC int __init XGIfb_setup(char *options)
2058{ 2057{
2059 char *this_opt; 2058 char *this_opt;