162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. 462306a36Sopenharmony_ci * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/via-core.h> 962306a36Sopenharmony_ci#include "global.h" 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_civoid viafb_get_device_support_state(u32 *support_state) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci *support_state = CRT_Device; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci if (viaparinfo->chip_info->tmds_chip_info.tmds_chip_name == VT1632_TMDS) 1662306a36Sopenharmony_ci *support_state |= DVI_Device; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci if (viaparinfo->chip_info->lvds_chip_info.lvds_chip_name == VT1631_LVDS) 1962306a36Sopenharmony_ci *support_state |= LCD_Device; 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_civoid viafb_get_device_connect_state(u32 *connect_state) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci bool mobile = false; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci *connect_state = CRT_Device; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci if (viafb_dvi_sense()) 2962306a36Sopenharmony_ci *connect_state |= DVI_Device; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci viafb_lcd_get_mobile_state(&mobile); 3262306a36Sopenharmony_ci if (mobile) 3362306a36Sopenharmony_ci *connect_state |= LCD_Device; 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cibool viafb_lcd_get_support_expand_state(u32 xres, u32 yres) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci unsigned int support_state = 0; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci switch (viafb_lcd_panel_id) { 4162306a36Sopenharmony_ci case LCD_PANEL_ID0_640X480: 4262306a36Sopenharmony_ci if ((xres < 640) && (yres < 480)) 4362306a36Sopenharmony_ci support_state = true; 4462306a36Sopenharmony_ci break; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci case LCD_PANEL_ID1_800X600: 4762306a36Sopenharmony_ci if ((xres < 800) && (yres < 600)) 4862306a36Sopenharmony_ci support_state = true; 4962306a36Sopenharmony_ci break; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci case LCD_PANEL_ID2_1024X768: 5262306a36Sopenharmony_ci if ((xres < 1024) && (yres < 768)) 5362306a36Sopenharmony_ci support_state = true; 5462306a36Sopenharmony_ci break; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci case LCD_PANEL_ID3_1280X768: 5762306a36Sopenharmony_ci if ((xres < 1280) && (yres < 768)) 5862306a36Sopenharmony_ci support_state = true; 5962306a36Sopenharmony_ci break; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci case LCD_PANEL_ID4_1280X1024: 6262306a36Sopenharmony_ci if ((xres < 1280) && (yres < 1024)) 6362306a36Sopenharmony_ci support_state = true; 6462306a36Sopenharmony_ci break; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci case LCD_PANEL_ID5_1400X1050: 6762306a36Sopenharmony_ci if ((xres < 1400) && (yres < 1050)) 6862306a36Sopenharmony_ci support_state = true; 6962306a36Sopenharmony_ci break; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci case LCD_PANEL_ID6_1600X1200: 7262306a36Sopenharmony_ci if ((xres < 1600) && (yres < 1200)) 7362306a36Sopenharmony_ci support_state = true; 7462306a36Sopenharmony_ci break; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci case LCD_PANEL_ID7_1366X768: 7762306a36Sopenharmony_ci if ((xres < 1366) && (yres < 768)) 7862306a36Sopenharmony_ci support_state = true; 7962306a36Sopenharmony_ci break; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci case LCD_PANEL_ID8_1024X600: 8262306a36Sopenharmony_ci if ((xres < 1024) && (yres < 600)) 8362306a36Sopenharmony_ci support_state = true; 8462306a36Sopenharmony_ci break; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci case LCD_PANEL_ID9_1280X800: 8762306a36Sopenharmony_ci if ((xres < 1280) && (yres < 800)) 8862306a36Sopenharmony_ci support_state = true; 8962306a36Sopenharmony_ci break; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci case LCD_PANEL_IDA_800X480: 9262306a36Sopenharmony_ci if ((xres < 800) && (yres < 480)) 9362306a36Sopenharmony_ci support_state = true; 9462306a36Sopenharmony_ci break; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci case LCD_PANEL_IDB_1360X768: 9762306a36Sopenharmony_ci if ((xres < 1360) && (yres < 768)) 9862306a36Sopenharmony_ci support_state = true; 9962306a36Sopenharmony_ci break; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci case LCD_PANEL_IDC_480X640: 10262306a36Sopenharmony_ci if ((xres < 480) && (yres < 640)) 10362306a36Sopenharmony_ci support_state = true; 10462306a36Sopenharmony_ci break; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci default: 10762306a36Sopenharmony_ci support_state = false; 10862306a36Sopenharmony_ci break; 10962306a36Sopenharmony_ci } 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci return support_state; 11262306a36Sopenharmony_ci} 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/*====================================================================*/ 11562306a36Sopenharmony_ci/* Gamma Function Implementation*/ 11662306a36Sopenharmony_ci/*====================================================================*/ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_civoid viafb_set_gamma_table(int bpp, unsigned int *gamma_table) 11962306a36Sopenharmony_ci{ 12062306a36Sopenharmony_ci int i, sr1a; 12162306a36Sopenharmony_ci int active_device_amount = 0; 12262306a36Sopenharmony_ci int device_status = viafb_DeviceStatus; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci for (i = 0; i < sizeof(viafb_DeviceStatus) * 8; i++) { 12562306a36Sopenharmony_ci if (device_status & 1) 12662306a36Sopenharmony_ci active_device_amount++; 12762306a36Sopenharmony_ci device_status >>= 1; 12862306a36Sopenharmony_ci } 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci /* 8 bpp mode can't adjust gamma */ 13162306a36Sopenharmony_ci if (bpp == 8) 13262306a36Sopenharmony_ci return ; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci /* Enable Gamma */ 13562306a36Sopenharmony_ci switch (viaparinfo->chip_info->gfx_chip_name) { 13662306a36Sopenharmony_ci case UNICHROME_CLE266: 13762306a36Sopenharmony_ci case UNICHROME_K400: 13862306a36Sopenharmony_ci viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7); 13962306a36Sopenharmony_ci break; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci case UNICHROME_K800: 14262306a36Sopenharmony_ci case UNICHROME_PM800: 14362306a36Sopenharmony_ci case UNICHROME_CN700: 14462306a36Sopenharmony_ci case UNICHROME_CX700: 14562306a36Sopenharmony_ci case UNICHROME_K8M890: 14662306a36Sopenharmony_ci case UNICHROME_P4M890: 14762306a36Sopenharmony_ci case UNICHROME_P4M900: 14862306a36Sopenharmony_ci viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7); 14962306a36Sopenharmony_ci break; 15062306a36Sopenharmony_ci } 15162306a36Sopenharmony_ci sr1a = (unsigned int)viafb_read_reg(VIASR, SR1A); 15262306a36Sopenharmony_ci viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0); 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci /* Fill IGA1 Gamma Table */ 15562306a36Sopenharmony_ci outb(0, LUT_INDEX_WRITE); 15662306a36Sopenharmony_ci for (i = 0; i < 256; i++) { 15762306a36Sopenharmony_ci outb(gamma_table[i] >> 16, LUT_DATA); 15862306a36Sopenharmony_ci outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA); 15962306a36Sopenharmony_ci outb(gamma_table[i] & 0xFF, LUT_DATA); 16062306a36Sopenharmony_ci } 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci /* If adjust Gamma value in SAMM, fill IGA1, 16362306a36Sopenharmony_ci IGA2 Gamma table simultaneous. */ 16462306a36Sopenharmony_ci /* Switch to IGA2 Gamma Table */ 16562306a36Sopenharmony_ci if ((active_device_amount > 1) && 16662306a36Sopenharmony_ci !((viaparinfo->chip_info->gfx_chip_name == 16762306a36Sopenharmony_ci UNICHROME_CLE266) && 16862306a36Sopenharmony_ci (viaparinfo->chip_info->gfx_chip_revision < 15))) { 16962306a36Sopenharmony_ci viafb_write_reg_mask(SR1A, VIASR, 0x01, BIT0); 17062306a36Sopenharmony_ci viafb_write_reg_mask(CR6A, VIACR, 0x02, BIT1); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci /* Fill IGA2 Gamma Table */ 17362306a36Sopenharmony_ci outb(0, LUT_INDEX_WRITE); 17462306a36Sopenharmony_ci for (i = 0; i < 256; i++) { 17562306a36Sopenharmony_ci outb(gamma_table[i] >> 16, LUT_DATA); 17662306a36Sopenharmony_ci outb(gamma_table[i] >> 8 & 0xFF, LUT_DATA); 17762306a36Sopenharmony_ci outb(gamma_table[i] & 0xFF, LUT_DATA); 17862306a36Sopenharmony_ci } 17962306a36Sopenharmony_ci } 18062306a36Sopenharmony_ci viafb_write_reg(SR1A, VIASR, sr1a); 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_civoid viafb_get_gamma_table(unsigned int *gamma_table) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci unsigned char color_r, color_g, color_b; 18662306a36Sopenharmony_ci unsigned char sr1a = 0; 18762306a36Sopenharmony_ci int i; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci /* Enable Gamma */ 19062306a36Sopenharmony_ci switch (viaparinfo->chip_info->gfx_chip_name) { 19162306a36Sopenharmony_ci case UNICHROME_CLE266: 19262306a36Sopenharmony_ci case UNICHROME_K400: 19362306a36Sopenharmony_ci viafb_write_reg_mask(SR16, VIASR, 0x80, BIT7); 19462306a36Sopenharmony_ci break; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci case UNICHROME_K800: 19762306a36Sopenharmony_ci case UNICHROME_PM800: 19862306a36Sopenharmony_ci case UNICHROME_CN700: 19962306a36Sopenharmony_ci case UNICHROME_CX700: 20062306a36Sopenharmony_ci case UNICHROME_K8M890: 20162306a36Sopenharmony_ci case UNICHROME_P4M890: 20262306a36Sopenharmony_ci case UNICHROME_P4M900: 20362306a36Sopenharmony_ci viafb_write_reg_mask(CR33, VIACR, 0x80, BIT7); 20462306a36Sopenharmony_ci break; 20562306a36Sopenharmony_ci } 20662306a36Sopenharmony_ci sr1a = viafb_read_reg(VIASR, SR1A); 20762306a36Sopenharmony_ci viafb_write_reg_mask(SR1A, VIASR, 0x0, BIT0); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci /* Reading gamma table to get color value */ 21062306a36Sopenharmony_ci outb(0, LUT_INDEX_READ); 21162306a36Sopenharmony_ci for (i = 0; i < 256; i++) { 21262306a36Sopenharmony_ci color_r = inb(LUT_DATA); 21362306a36Sopenharmony_ci color_g = inb(LUT_DATA); 21462306a36Sopenharmony_ci color_b = inb(LUT_DATA); 21562306a36Sopenharmony_ci gamma_table[i] = 21662306a36Sopenharmony_ci ((((u32) color_r) << 16) | 21762306a36Sopenharmony_ci (((u16) color_g) << 8)) | color_b; 21862306a36Sopenharmony_ci } 21962306a36Sopenharmony_ci viafb_write_reg(SR1A, VIASR, sr1a); 22062306a36Sopenharmony_ci} 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_civoid viafb_get_gamma_support_state(int bpp, unsigned int *support_state) 22362306a36Sopenharmony_ci{ 22462306a36Sopenharmony_ci if (bpp == 8) 22562306a36Sopenharmony_ci *support_state = None_Device; 22662306a36Sopenharmony_ci else 22762306a36Sopenharmony_ci *support_state = CRT_Device | DVI_Device | LCD_Device; 22862306a36Sopenharmony_ci} 229