1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. 4 * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. 5 6 */ 7 8 #include <linux/via-core.h> 9 #include "global.h" 10 11 void viafb_get_device_support_state(u32 *support_state) 12 { 13 *support_state = CRT_Device; 14 15 if (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name == VT1632_TMDS) 16 *support_state |= DVI_Device; 17 18 if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name == VT1631_LVDS) 19 *support_state |= LCD_Device; 20 } 21 22 void viafb_get_device_connect_state(u32 *connect_state) 23 { 24 bool mobile = false; 25 26 *connect_state = CRT_Device; 27 28 if (viafb_dvi_sense()) 29 *connect_state |= DVI_Device; 30 31 viafb_lcd_get_mobile_state(&mobile); 32 if (mobile) 33 *connect_state |= LCD_Device; 34 } 35 36 bool viafb_lcd_get_support_expand_state(u32 xres, u32 yres) 37 { 38 unsigned int support_state = 0; 39 40 switch (viafb_lcd_panel_id) { 41 case LCD_PANEL_ID0_640X480: 42 if ((xres < 640) && (yres < 480)) 43 support_state = true; 44 break; 45 46 case LCD_PANEL_ID1_800X600: 47 if ((xres < 800) && (yres < 600)) 48 support_state = true; 49 break; 50 51 case LCD_PANEL_ID2_1024X768: 52 if ((xres < 1024) && (yres < 768)) 53 support_state = true; 54 break; 55 56 case LCD_PANEL_ID3_1280X768: 57 if ((xres < 1280) && (yres < 768)) 58 support_state = true; 59 break; 60 61 case LCD_PANEL_ID4_1280X1024: 62 if ((xres < 1280) && (yres < 1024)) 63 support_state = true; 64 break; 65 66 case LCD_PANEL_ID5_1400X1050: 67 if ((xres < 1400) && (yres < 1050)) 68 support_state = true; 69 break; 70 71 case LCD_PANEL_ID6_1600X1200: 72 if ((xres < 1600) && (yres < 1200)) 73 support_state = true; 74 break; 75 76 case LCD_PANEL_ID7_1366X768: 77 if ((xres < 1366) && (yres < 768)) 78 support_state = true; 79 break; 80 81 case LCD_PANEL_ID8_1024X600: 82 if ((xres < 1024) && (yres < 600)) 83 support_state = true; 84 break; 85 86 case LCD_PANEL_ID9_1280X800: 87 if ((xres < 1280) && (yres < 800)) 88 support_state = true; 89 break; 90 91 case LCD_PANEL_IDA_800X480: 92 if ((xres < 800) && (yres < 480)) 93 support_state = true; 94 break; 95 96 case LCD_PANEL_IDB_1360X768: 97 if ((xres < 1360) && (yres < 768)) 98 support_state = true; 99 break; 100 101 case LCD_PANEL_IDC_480X640: 102 if ((xres < 480) && (yres < 640)) 103 support_state = true; 104 break; 105 106 default: 107 support_state = false; 108 break; 109 } 110 111 return support_state; 112 } 113 114 /*====================================================================*/ 115 /* Gamma Function Implementation*/ 116 /*====================================================================*/ 117 118 void viafb_set_gamma_table(int bpp, unsigned int *gamma_table) 119 { 120 int i, sr1a; 121 int active_device_amount = 0; 122 int device_status = viafb_DeviceStatus; 123 124 for (i = 0; i < sizeof(viafb_DeviceStatus) * 8; i++) { 125 if (device_status & 1) 126 active_device_amount++; 127 device_status >>= 1; 128 } 129 130 /* 8 bpp mode can't adjust gamma */ 131 if (bpp == 8) 132 return ; 133 134 /* Enable Gamma */ 135 switch (viaparinfo->chip_info->gfx_chip_name) { 136 case UNICHROME_CLE266: 137 case UNICHROME_K400: 138 viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7); 139 break; 140 141 case UNICHROME_K800: 142 case UNICHROME_PM800: 143 case UNICHROME_CN700: 144 case UNICHROME_CX700: 145 case UNICHROME_K8M890: 146 case UNICHROME_P4M890: 147 case UNICHROME_P4M900: 148 viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7); 149 break; 150 } 151 sr1a = (unsigned int)viafb_read_reg(VIASR, SR1A); 152 viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0); 153 154 /* Fill IGA1 Gamma Table */ 155 outb(0, LUT_INDEX_WRITE); 156 for (i = 0; i < 256; i++) { 157 outb(gamma_table[i] >> 16, LUT_DATA); 158 outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA); 159 outb(gamma_table[i] & 0xFF, LUT_DATA); 160 } 161 162 /* If adjust Gamma value in SAMM, fill IGA1, 163 IGA2 Gamma table simultaneous. */ 164 /* Switch to IGA2 Gamma Table */ 165 if ((active_device_amount > 1) && 166 !((viaparinfo->chip_info->gfx_chip_name == 167 UNICHROME_CLE266) && 168 (viaparinfo->chip_info->gfx_chip_revision < 15))) { 169 viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0); 170 viafb_write_reg_mask(CR6A, VIACR, 0x02, BIT1); 171 172 /* Fill IGA2 Gamma Table */ 173 outb(0, LUT_INDEX_WRITE); 174 for (i = 0; i < 256; i++) { 175 outb(gamma_table[i] >> 16, LUT_DATA); 176 outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA); 177 outb(gamma_table[i] & 0xFF, LUT_DATA); 178 } 179 } 180 viafb_write_reg(SR1A, VIASR, sr1a); 181 } 182 183 void viafb_get_gamma_table(unsigned int *gamma_table) 184 { 185 unsigned char color_r, color_g, color_b; 186 unsigned char sr1a = 0; 187 int i; 188 189 /* Enable Gamma */ 190 switch (viaparinfo->chip_info->gfx_chip_name) { 191 case UNICHROME_CLE266: 192 case UNICHROME_K400: 193 viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7); 194 break; 195 196 case UNICHROME_K800: 197 case UNICHROME_PM800: 198 case UNICHROME_CN700: 199 case UNICHROME_CX700: 200 case UNICHROME_K8M890: 201 case UNICHROME_P4M890: 202 case UNICHROME_P4M900: 203 viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7); 204 break; 205 } 206 sr1a = viafb_read_reg(VIASR, SR1A); 207 viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0); 208 209 /* Reading gamma table to get color value */ 210 outb(0, LUT_INDEX_READ); 211 for (i = 0; i < 256; i++) { 212 color_r = inb(LUT_DATA); 213 color_g = inb(LUT_DATA); 214 color_b = inb(LUT_DATA); 215 gamma_table[i] = 216 ((((u32) color_r) << 16) | 217 (((u16) color_g) << 8)) | color_b; 218 } 219 viafb_write_reg(SR1A, VIASR, sr1a); 220 } 221 222 void viafb_get_gamma_support_state(int bpp, unsigned int *support_state) 223 { 224 if (bpp == 8) 225 *support_state = None_Device; 226 else 227 *support_state = CRT_Device | DVI_Device | LCD_Device; 228 } 229