Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved.
0004  * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved.
0005 
0006  */
0007 
0008 #include <linux/via-core.h>
0009 #include "global.h"
0010 
0011 void viafb_get_device_support_state(u32 *support_state)
0012 {
0013     *support_state = CRT_Device;
0014 
0015     if (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name == VT1632_TMDS)
0016         *support_state |= DVI_Device;
0017 
0018     if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name == VT1631_LVDS)
0019         *support_state |= LCD_Device;
0020 }
0021 
0022 void viafb_get_device_connect_state(u32 *connect_state)
0023 {
0024     bool mobile = false;
0025 
0026     *connect_state = CRT_Device;
0027 
0028     if (viafb_dvi_sense())
0029         *connect_state |= DVI_Device;
0030 
0031     viafb_lcd_get_mobile_state(&mobile);
0032     if (mobile)
0033         *connect_state |= LCD_Device;
0034 }
0035 
0036 bool viafb_lcd_get_support_expand_state(u32 xres, u32 yres)
0037 {
0038     unsigned int support_state = 0;
0039 
0040     switch (viafb_lcd_panel_id) {
0041     case LCD_PANEL_ID0_640X480:
0042         if ((xres < 640) && (yres < 480))
0043             support_state = true;
0044         break;
0045 
0046     case LCD_PANEL_ID1_800X600:
0047         if ((xres < 800) && (yres < 600))
0048             support_state = true;
0049         break;
0050 
0051     case LCD_PANEL_ID2_1024X768:
0052         if ((xres < 1024) && (yres < 768))
0053             support_state = true;
0054         break;
0055 
0056     case LCD_PANEL_ID3_1280X768:
0057         if ((xres < 1280) && (yres < 768))
0058             support_state = true;
0059         break;
0060 
0061     case LCD_PANEL_ID4_1280X1024:
0062         if ((xres < 1280) && (yres < 1024))
0063             support_state = true;
0064         break;
0065 
0066     case LCD_PANEL_ID5_1400X1050:
0067         if ((xres < 1400) && (yres < 1050))
0068             support_state = true;
0069         break;
0070 
0071     case LCD_PANEL_ID6_1600X1200:
0072         if ((xres < 1600) && (yres < 1200))
0073             support_state = true;
0074         break;
0075 
0076     case LCD_PANEL_ID7_1366X768:
0077         if ((xres < 1366) && (yres < 768))
0078             support_state = true;
0079         break;
0080 
0081     case LCD_PANEL_ID8_1024X600:
0082         if ((xres < 1024) && (yres < 600))
0083             support_state = true;
0084         break;
0085 
0086     case LCD_PANEL_ID9_1280X800:
0087         if ((xres < 1280) && (yres < 800))
0088             support_state = true;
0089         break;
0090 
0091     case LCD_PANEL_IDA_800X480:
0092         if ((xres < 800) && (yres < 480))
0093             support_state = true;
0094         break;
0095 
0096     case LCD_PANEL_IDB_1360X768:
0097         if ((xres < 1360) && (yres < 768))
0098             support_state = true;
0099         break;
0100 
0101     case LCD_PANEL_IDC_480X640:
0102         if ((xres < 480) && (yres < 640))
0103             support_state = true;
0104         break;
0105 
0106     default:
0107         support_state = false;
0108         break;
0109     }
0110 
0111     return support_state;
0112 }
0113 
0114 /*====================================================================*/
0115 /*                      Gamma Function Implementation*/
0116 /*====================================================================*/
0117 
0118 void viafb_set_gamma_table(int bpp, unsigned int *gamma_table)
0119 {
0120     int i, sr1a;
0121     int active_device_amount = 0;
0122     int device_status = viafb_DeviceStatus;
0123 
0124     for (i = 0; i < sizeof(viafb_DeviceStatus) * 8; i++) {
0125         if (device_status & 1)
0126             active_device_amount++;
0127         device_status >>= 1;
0128     }
0129 
0130     /* 8 bpp mode can't adjust gamma */
0131     if (bpp == 8)
0132         return ;
0133 
0134     /* Enable Gamma */
0135     switch (viaparinfo->chip_info->gfx_chip_name) {
0136     case UNICHROME_CLE266:
0137     case UNICHROME_K400:
0138         viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7);
0139         break;
0140 
0141     case UNICHROME_K800:
0142     case UNICHROME_PM800:
0143     case UNICHROME_CN700:
0144     case UNICHROME_CX700:
0145     case UNICHROME_K8M890:
0146     case UNICHROME_P4M890:
0147     case UNICHROME_P4M900:
0148         viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7);
0149         break;
0150     }
0151     sr1a = (unsigned int)viafb_read_reg(VIASR, SR1A);
0152     viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0);
0153 
0154     /* Fill IGA1 Gamma Table */
0155     outb(0, LUT_INDEX_WRITE);
0156     for (i = 0; i < 256; i++) {
0157         outb(gamma_table[i] >> 16, LUT_DATA);
0158         outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA);
0159         outb(gamma_table[i] & 0xFF, LUT_DATA);
0160     }
0161 
0162     /* If adjust Gamma value in SAMM, fill IGA1,
0163        IGA2 Gamma table simultaneous. */
0164     /* Switch to IGA2 Gamma Table */
0165     if ((active_device_amount > 1) &&
0166         !((viaparinfo->chip_info->gfx_chip_name ==
0167         UNICHROME_CLE266) &&
0168         (viaparinfo->chip_info->gfx_chip_revision < 15))) {
0169         viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0);
0170         viafb_write_reg_mask(CR6A, VIACR, 0x02, BIT1);
0171 
0172         /* Fill IGA2 Gamma Table */
0173         outb(0, LUT_INDEX_WRITE);
0174         for (i = 0; i < 256; i++) {
0175             outb(gamma_table[i] >> 16, LUT_DATA);
0176             outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA);
0177             outb(gamma_table[i] & 0xFF, LUT_DATA);
0178         }
0179     }
0180     viafb_write_reg(SR1A, VIASR, sr1a);
0181 }
0182 
0183 void viafb_get_gamma_table(unsigned int *gamma_table)
0184 {
0185     unsigned char color_r, color_g, color_b;
0186     unsigned char sr1a = 0;
0187     int i;
0188 
0189     /* Enable Gamma */
0190     switch (viaparinfo->chip_info->gfx_chip_name) {
0191     case UNICHROME_CLE266:
0192     case UNICHROME_K400:
0193         viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7);
0194         break;
0195 
0196     case UNICHROME_K800:
0197     case UNICHROME_PM800:
0198     case UNICHROME_CN700:
0199     case UNICHROME_CX700:
0200     case UNICHROME_K8M890:
0201     case UNICHROME_P4M890:
0202     case UNICHROME_P4M900:
0203         viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7);
0204         break;
0205     }
0206     sr1a = viafb_read_reg(VIASR, SR1A);
0207     viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0);
0208 
0209     /* Reading gamma table to get color value */
0210     outb(0, LUT_INDEX_READ);
0211     for (i = 0; i < 256; i++) {
0212         color_r = inb(LUT_DATA);
0213         color_g = inb(LUT_DATA);
0214         color_b = inb(LUT_DATA);
0215         gamma_table[i] =
0216             ((((u32) color_r) << 16) |
0217              (((u16) color_g) << 8)) | color_b;
0218     }
0219     viafb_write_reg(SR1A, VIASR, sr1a);
0220 }
0221 
0222 void viafb_get_gamma_support_state(int bpp, unsigned int *support_state)
0223 {
0224     if (bpp == 8)
0225         *support_state = None_Device;
0226     else
0227         *support_state = CRT_Device | DVI_Device | LCD_Device;
0228 }