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