brintos

brintos / linux-shallow public Read only

0
0
Text · 5.2 KiB · c5277a6 Raw
229 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*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 11void 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 22void 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 36bool 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 118void 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 183void 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 222void viafb_get_gamma_support_state(int bpp, unsigned int *support_state)223{224	if (bpp == 8)225		*support_state = None_Device;226	else227		*support_state = CRT_Device | DVI_Device | LCD_Device;228}229