[Xorg-commit] xc/programs/Xserver/hw/xfree86/drivers/via via_tuner.c,NONE,1.1.1.1.2.1 Imakefile,1.1.4.1,1.1.4.2 via.h,1.1,1.1.4.1 via.man,1.1,1.1.4.1 via_accel.c,1.1.4.1,1.1.4.2 via_bandwidth.c,1.1,1.1.4.1 via_bios.c,1.1.4.1,1.1.4.2 via_bios.h,1.1,1.1.4.1 via_dri.c,1.1,1.1.4.1 via_driver.c,1.1.4.1,1.1.4.2 via_driver.h,1.1.4.1,1.1.4.2 via_i2c.c,1.1,1.1.4.1 via_memory.c,1.1,1.1.4.1 via_mode.h,1.1,1.1.4.1 via_swov.c,1.1.4.1,1.1.4.2 via_utility.c,1.1,1.1.4.1 via_video.c,1.1,1.1.4.1

Kaleb Keithley xorg-commit at pdx.freedesktop.org
Wed May 9 17:30:30 EEST 2007


Committed by: kaleb

Update of /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via
In directory pdx:/home/kaleb/xorg/xc.XORG-CURRENT/programs/Xserver/hw/xfree86/drivers/via

Modified Files:
      Tag: XORG-CURRENT
	Imakefile via.h via.man via_accel.c via_bandwidth.c via_bios.c 
	via_bios.h via_dri.c via_driver.c via_driver.h via_i2c.c 
	via_memory.c via_mode.h via_swov.c via_utility.c via_video.c 
Added Files:
      Tag: XORG-CURRENT
	via_tuner.c 
Log Message:
merge most of XFree86 RC3 (4.3.99.903) from vendor branch.
bug #214


--- NEW FILE: via_tuner.c ---
/*
 * Copyright 2003 Red Hat, Inc. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sub license,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial portions
 * of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */
/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_tuner.c,v 1.2 2004/01/02 18:23:36 tsi Exp $ */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86_ansic.h"
#include "xf86fbman.h"

#include "via_compose.h"
#include "via_capture.h"
#include "via.h"
#include "ddmpeg.h"
#include "xf86drm.h"

#include "via_overlay.h"
#include "via_driver.h"
#include "via_regrec.h"
#include "via_priv.h"
#include "via_swov.h"
#include "via_common.h"

/*
 *	Architecture independant implementation of the TV tuner interfaces
 *	on the VIA chipsets. VIA have a video4linux kernel module for Linux
 *	but that gives us i2c ownership clashes and lack of portability. 
 *	Doing it in X means it should work cross platform
 *
 *	The Overlay/TV input engines on the VIA are SAA7108/7113 or 7114 based.
 */
 
 
/*
 *	Wrap the ugly I2C functions from xf86
 */
 
static void WriteI2C(I2CDevPtr i2c, int sa, int v)
{
	unsigned char buf[2];
	buf[0] = sa;
	buf[1] = v;
	xf86I2CWriteRead(i2c, buf, 2, NULL, 0);
}

static void WriteTuner(ViaTunerPtr tuner, int sa, int v)
{
	WriteI2C(tuner->I2C, sa, v);
}

static void WriteTunerList(ViaTunerPtr tuner, unsigned char *p, int len)
{
	while(len >= 2)
	{
		WriteI2C(tuner->I2C, p[0], p[1]);
		p += 2;
		len -= 2;
	}
}

static int ReadI2C(I2CDevPtr i2c, int sa)
{
	unsigned char buf[2];
	buf[0] = sa;
	xf86I2CWriteRead(i2c, buf, 1, buf+1, 1);
	return buf[1];
}

#ifdef UNUSED
static int ReadTuner(ViaTunerPtr tuner, int sa)
{
	return ReadI2C(tuner->I2C, sa);
}
#endif

/*
 *	I2C register tables to switch TV mode
 */

static unsigned char sa7113_standard[3][4] = {
	 { 0xA8, 0x01, 0x0A, 0x07 },	/* PAL */
	 { 0xE8, 0x01, 0x02, 0x0A },	/* NTSC */
	 { 0xA8, 0x51, 0x0A, 0x07 }	/* SECAM */
};

static unsigned char sa7114_standard[3][3] = {
	{ 0x08, 0x30, 0x01 },	/* PAL - CHECK ME */
	{ 0x0B, 0xFF, 0x00 },	/* NTSC */
	{ 0x08, 0x30, 0x01 }	/* SECAM*/
};

void ViaTunerStandard(ViaTunerPtr pTuner, int mode)
{
	switch(pTuner->decoderType)
	{
		case SAA7113H:
		{
			unsigned char *ptr = sa7113_standard[mode];
			WriteTuner(pTuner, 0x08, ptr[0]);
			WriteTuner(pTuner, 0x0E, ptr[1]);
			WriteTuner(pTuner, 0x40, ptr[2]);
			WriteTuner(pTuner, 0x5A, ptr[3]);
			break;
		}
		case SAA7108H:
		case SAA7114H:
		{
			unsigned char *ptr = sa7114_standard[mode];
			WriteTuner(pTuner, 0x8F, ptr[0]);
			WriteTuner(pTuner, 0x9A, ptr[1]);
			WriteTuner(pTuner, 0x9B, ptr[2]);
			WriteTuner(pTuner, 0x9E, ptr[1]);
			WriteTuner(pTuner, 0x9F, ptr[2]);
			WriteTuner(pTuner, 0x88, 0xD0);
			WriteTuner(pTuner, 0x88, 0xF0);
			break;
		}
	}
}

/*
 *	Set TV properties (0-255). Abstracted in case a non SAA tuner
 *	is added with different registers.
 */
 
void ViaTunerBrightness(ViaTunerPtr pTuner, int value)
{
	WriteTuner(pTuner, 0x0A, value);
}

void ViaTunerContrast(ViaTunerPtr pTuner, int value)
{
	WriteTuner(pTuner, 0x0B, value);
}

void ViaTunerHue(ViaTunerPtr pTuner, int value)
{
	WriteTuner(pTuner, 0x0D, value);
}

void ViaTunerLuminance(ViaTunerPtr pTuner, int value)
{
	WriteTuner(pTuner, 0x09, value);
}

void ViaTunerSaturation(ViaTunerPtr pTuner, int value)
{
	WriteTuner(pTuner, 0x0C, value);
}

/*
 *	Input Selection
 */
 
void ViaTunerInput(ViaTunerPtr pTuner, int mode)
{
	switch(pTuner->decoderType)
	{
		case SAA7113H:
			if(mode == MODE_TV)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC0);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x01);
				break;
			}
			if(mode == MODE_SVIDEO)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC9);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x81);
				break;
			}
			if(mode == MODE_COMPOSITE)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC2);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x01);
				break;
			}
			break;
		case SAA7108H:
			if(mode == MODE_TV)
				break;
			if(mode == MODE_SVIDEO)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC6);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x80);
			}
			else if(mode == MODE_COMPOSITE)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC0);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x40);
			}
			WriteTuner(pTuner, 0x08, 0x58);
			WriteTuner(pTuner, 0x08, 0xF8);
			WriteTuner(pTuner, 0x88, 0xD0);
			WriteTuner(pTuner, 0x88, 0xF0);
			break;
		case SAA7114H:
			if(mode == MODE_TV)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC0);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x40);
			}
			else if(mode == MODE_SVIDEO)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC7);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x80);
			}
			else if(mode == MODE_COMPOSITE)
			{
				if(pTuner->autoDetect)
					WriteTuner(pTuner, 0x02, 0xC2);
				else
					WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
				WriteTuner(pTuner, 0x09, 0x40);
			}
			WriteTuner(pTuner, 0x08, 0x58);
			WriteTuner(pTuner, 0x08, 0xF8);
			WriteTuner(pTuner, 0x88, 0xD0);
			WriteTuner(pTuner, 0x88, 0xF0);
			break;
	}
}

/*
 *	Switch Channel
 */
 
void ViaTunerChannel(ViaTunerPtr pTuner, int divider, int control)
{
	unsigned char buf[4];
	buf[0] = divider >> 8;
	buf[1] = divider & 0xFF;
	buf[2] = control >> 8;
	buf[3] = control & 0xFF;
	xf86I2CWriteRead(pTuner->FMI2C, buf, 4, NULL, 0);
}

/*
 *	Set up
 */
 
static void ViaTunerSetup(ViaTunerPtr pTuner)
{
	static unsigned char sa7108_boot[] = {
		0x03, 0x10, 0x04, 0x90, 0x05, 0x90, 0x06, 0xEB,
		0x07, 0xE0, 0x08, 0x98, 0x09, 0x80, 0x0A, 0x80,
		0x0B, 0x44, 0x0C, 0x40, 0x0D, 0x00, 0x0E, 0x89,
		0x0F, 0x2A, 0x10, 0x0E, 0x11, 0x00, 0x12, 0x00,
		0x13, 0x01, 0x14, 0x00, 0x15, 0x11, 0x16, 0xFE,
		0x17, 0x40, 0x18, 0x40, 0x19, 0x80, 
		
		0x80, 0x1C, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00,	/* Scaler present */
		0x84, 0x00, 0x85, 0x00, 0x86, 0x45, 0x87, 0x01,
		0x88, 0xF0, 
		
		0x8F, 0x0B, 0x90, 0x00, 0x91, 0x08, 0x92, 0x09, 
		0x93, 0x80, 0x94, 0x02, 0x95, 0x00, 0x96, 0xD0,
		0x97, 0x02, 0x98, 0x12, 0x99, 0x00, 0x9A, 0x00,
		0x9B, 0x00, 0x9C, 0xD0, 0x9D, 0x02, 0x9E, 0xFF,
		0x9F, 0x00, 0xA0, 0x01, 0xA1, 0x00, 0xA2, 0x00,

		0xA4, 0x80, 0xA5, 0x40, 0xA6, 0x40,
		
		0xA8, 0x00, 0xA9, 0x04, 0xAA, 0x00, 
		
		0xAC, 0x00, 0xAD, 0x02, 0xAE, 0x00,
		
		0xB0, 0x00, 0xB1, 0x04, 0xB2, 0x00, 0xB3, 0x04,
		0xB4, 0x00,
		
		0xB8, 0x00, 0xB9, 0x00, 0xBA, 0x00, 0xBB, 0x00,
		0xBC, 0x00, 0xBD, 0x00, 0xBE, 0x00, 0xBF, 0x00,

		0x88, 0xD0, 0x88, 0xF0
	};
	
	static unsigned char sa7113_boot[] = {
		0x03, 0x33, 0x04, 0x00, 0x05, 0x00, 0x06, 0xE9,
		0x07, 0x0D, 0x08, 0xF8, 0x09, 0x01, 0x0A, 0x80,
		0x0B, 0x47, 0x0C, 0x40, 0x0D, 0x00, 0x0E, 0x01,
		0x0F, 0x2A, 0x10, 0x40, 0x11, 0x08, 0x12, 0xB7,
		0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00,
		0x17, 0x00,
		0x40, 0x02, 0x41, 0xFF, 0x42, 0xFF, 0x43, 0xFF,
		0x44, 0xFF, 0x45, 0xFF,	0x46, 0xFF, 0x47, 0xFF,
		0x48, 0xFF, 0x49, 0xFF, 0x4A, 0xFF, 0x4B, 0xFF,
		0x4C, 0xFF, 0x4D, 0xFF, 0x4E, 0xFF, 0x4F, 0xFF,
		0x50, 0xFF, 0x51, 0xFF, 0x52, 0xFF, 0x53, 0xFF,
		0x54, 0xFF, 0x55, 0xFF, 0x56, 0xFF, 0x57, 0xFF,
		0x58, 0x00, 0x59, 0x54,0x5A, 0x0A, 0x5B, 0x83
	};
	
	static unsigned char sa7114_boot[] = {
		0x03, 0x10, 0x04, 0x90, 0x05, 0x90, 0x06, 0xEB,
		0x07, 0xE0, 0x08, 0x98, 0x09, 0x80, 0x0A, 0x80,
		0x0B, 0x44, 0x0C, 0x40, 0x0D, 0x00, 0x0E, 0x89,
		0x0F, 0x2A, 0x10, 0x0E, 0x11, 0x00, 0x12, 0x00,
		0x13, 0x01, 0x14, 0x00, 0x15, 0x11, 0x16, 0xFE,
		0x17, 0x40, 0x18, 0x40, 0x19, 0x80,
		
		0x80, 0x1C, 0x81, 0x00, 0x82, 0x00, 0x83, 0x01,
		0x84, 0x00, 0x85, 0x00, 0x86, 0x45, 0x87, 0x01,
		0x88, 0xF0, 0x8F, 0x0B,
		
		0x90, 0x00, 0x91, 0x08, 0x92, 0x09, 0x93, 0x80,
		0x94, 0x02, 0x95, 0x00, 0x96, 0xD0, 0x97, 0x02,
		0x98, 0x12, 0x99, 0x00, 0x9A, 0xFF, 0x9B, 0x00,
		0x9C, 0xD0, 0x9D, 0x02, 0x9E, 0xFF, 0xA0, 0x01,
		0xA1, 0x00, 0xA2, 0x00, 0xA4, 0x80, 0xA5, 0x40,
		0xA6, 0x40,
		
		0xA8, 0x00, 0xA9, 0x04, 0xAA, 0x00, 
		
		0xAC, 0x00, 0xAD, 0x02, 0xAE, 0x00,
		
		0xB0, 0x00, 0xB1, 0x04, 0xB2, 0x00, 0xB3, 0x04,
		0xB4, 0x00, 0xB8, 0x00, 0xB9, 0x00, 0xBA, 0x00,
		0xBB, 0x00, 0xBC, 0x00, 0xBD, 0x00, 0xBE, 0x00,
		0xBF, 0x00,
		
		0x88, 0xD0, 0x88, 0xF0
	};
	switch(pTuner->decoderType)
	{
		case SAA7113H:
			if(pTuner->autoDetect)
				WriteTuner(pTuner, 0x02, 0xC9);
			else
				WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
			WriteTunerList(pTuner, sa7113_boot, sizeof(sa7113_boot));
			break;
		case SAA7108H:
			if(pTuner->autoDetect)
				WriteTuner(pTuner, 0x02, 0xC0);
			else
				WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
			WriteTunerList(pTuner, sa7108_boot, sizeof(sa7108_boot));
			break;
		case SAA7114H:
			if(pTuner->autoDetect)
				WriteTuner(pTuner, 0x02, 0xC2);
			else
				WriteTuner(pTuner, 0x02, 0xC0|pTuner->tunerMode);
			WriteTunerList(pTuner, sa7114_boot, sizeof(sa7114_boot));
			break;
	}
}

/*
 *	Bit 7 of register 50 enables GPIO control for the audio
 *	Bit 5 then selects which tuner audio input is used
 */
 
#define AUDIO_GPIO1_ENABLE		0x80
#define AUDIO_GPIO_SELECT_TUNER1	0x20
 
void ViaAudioSelect(VIAPtr pVia, int tuner)
{
	int index = VGAIN8(0x3C4);
	int data;
	
	if(!pVia->CXA2104S)
		return;
	
	VGAOUT8(0x3C4, 0x50);	/* Select audio control bit */
	
	data = VGAIN8(0x3C5);
	data |= AUDIO_GPIO1_ENABLE;
	if(tuner == 0)
		data &= ~AUDIO_GPIO_SELECT_TUNER1;
	else
		data |= AUDIO_GPIO_SELECT_TUNER1;
	VGAOUT8(0x3C5, data);
	
	VGAOUT8(0x3C4, index);
}

void ViaAudioInit(VIAPtr pVia)
{
	if(!pVia->CXA2104S)
		return;
	
	WriteI2C(pVia->CXA2104S, 0, 0x01);
	WriteI2C(pVia->CXA2104S, 1, 0x1F);
	WriteI2C(pVia->CXA2104S, 2, 0x1F);
	WriteI2C(pVia->CXA2104S, 3, 0x00);
	WriteI2C(pVia->CXA2104S, 4, 0x00);
}

void ViaAudioMode(VIAPtr pVia, int mode)
{
	if(!pVia->CXA2104S)
		return;
	
	pVia->AudioMode = mode;
	pVia->AudioMute = 0;
	
	switch(mode)
	{
		case AUDIO_STEREO:
			WriteI2C(pVia->CXA2104S, 0, 0x01);
			WriteI2C(pVia->CXA2104S, 1, 0x1F);
			WriteI2C(pVia->CXA2104S, 2, 0x1F);
			WriteI2C(pVia->CXA2104S, 3, 0x01);
			WriteI2C(pVia->CXA2104S, 4, 0x00);
			break;
		case AUDIO_SAP:
			WriteI2C(pVia->CXA2104S, 0, 0x0F);
			WriteI2C(pVia->CXA2104S, 1, 0x1F);
			WriteI2C(pVia->CXA2104S, 2, 0x1F);
			WriteI2C(pVia->CXA2104S, 3, 0x0B);
			WriteI2C(pVia->CXA2104S, 4, 0x20);
			break;
		case AUDIO_DUAL:
			WriteI2C(pVia->CXA2104S, 0, 0x08);
			WriteI2C(pVia->CXA2104S, 1, 0x1F);
			WriteI2C(pVia->CXA2104S, 2, 0x1F);
			WriteI2C(pVia->CXA2104S, 3, 0x0F);
			WriteI2C(pVia->CXA2104S, 4, 0x20);
			break;
	}
}

void ViaAudioMute(VIAPtr pVia, int mute)
{
	if(!pVia->CXA2104S)
		return;
	
	switch(pVia->AudioMode)
	{
		case AUDIO_STEREO:
			WriteI2C(pVia->CXA2104S, 3, 0x01 - mute);
			break;
		case AUDIO_SAP:
			WriteI2C(pVia->CXA2104S, 3, 0x0B - mute);
			break;
		case AUDIO_DUAL:
			WriteI2C(pVia->CXA2104S, 3, 0x0F - mute);
			break;
	}
	pVia->AudioMute = mute;
}
				
/*
 *	Check for philips tuners to go with the I2C devices
 */
 	
static void ViaProbeFMTuner(ViaTunerPtr pTuner, int slave)
{
	if(!xf86I2CProbeAddress(pTuner->I2C->pI2CBus, slave))
		return;
	pTuner->FMI2C = xf86CreateI2CDevRec();
	pTuner->FMI2C->DevName = "FI1236";
	pTuner->FMI2C->SlaveAddr = slave;
	pTuner->FMI2C->pI2CBus = pTuner->I2C->pI2CBus;
	if(!xf86I2CDevInit(pTuner->FMI2C))
	{
		xf86DestroyI2CDevRec(pTuner->FMI2C, TRUE);
		pTuner->FMI2C = NULL;
	}
}

/*
 *	Helper for tuner creation
 */

static ViaTunerPtr CreateTuner(int type, I2CDevPtr pI2C)
{
	ViaTunerPtr v = xnfcalloc(sizeof(ViaTunerRec), 1);
	v->FMI2C = NULL;
	v->I2C = pI2C;
	v->decoderType = type;
	return v;
}

/*
 *	Probe and configure VIA tuner devices on the second I2C bus
 */
 
void ViaTunerProbe(ScrnInfoPtr pScrn)
{
	VIAPtr pVia = VIAPTR(pScrn);
	I2CDevPtr dev;
	I2CDevPtr tdev;
	
	pVia->Tuner[0] = NULL;
	pVia->Tuner[1] = NULL;
	pVia->CXA2104S = NULL;
	
	/* The TV tuners if present live on I2C bus 2. There will be an
	   encoder/decoder chip or two and one or two tuner ICs. An additional
	   sound IC may also be present */
	   
	dev = xf86CreateI2CDevRec();
	dev->DevName = "TV Probe";
	dev->SlaveAddr = 0x88;
	dev->pI2CBus = pVia->I2C_Port2;
	if (!xf86I2CDevInit(dev))
	{
		xf86DestroyI2CDevRec(dev, TRUE);
		return;
	}
		
	/* Ok so we have a TV processor for TV0 .. but what is it ?
	   Probe 0x88 register 0x1C */
	
	/* Check for an SAA7108H on tuner 1 */
	if(ReadI2C(dev, 0x1C) == 0x04)
	{
		tdev = xf86CreateI2CDevRec();
		tdev->DevName = "SAA7108H";
		tdev->SlaveAddr = 0x40;
		tdev->pI2CBus = pVia->I2C_Port2;
		if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00) >> 4) == 0x00) 	/* 7108H */
			pVia->Tuner[0] = CreateTuner(SAA7108H, tdev);
		else
			xf86DestroyI2CDevRec(tdev, TRUE);
	}
	else
	{
		/* Check for an SAA7113H on tuner 0 */
		tdev = xf86CreateI2CDevRec();
		tdev->DevName = "SAA7113H";
		tdev->SlaveAddr = 0x48;
		tdev->pI2CBus = pVia->I2C_Port2;
		if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00)  & 0xE0) == 0x00) 	/* 7113H */
			pVia->Tuner[0] = CreateTuner(SAA7113H, tdev);
		else
			xf86DestroyI2CDevRec(tdev, TRUE);
	}

	/* Tuner 0 probe done. Look for tuner 1 */
	
	/* Check for an SAA7108H on tuner 1 */
	if(ReadI2C(dev, 0x1C) == 0x04)
	{
		tdev = xf86CreateI2CDevRec();
		tdev->DevName = "SAA7108H";
		tdev->SlaveAddr = 0x42;
		tdev->pI2CBus = pVia->I2C_Port2;
		if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00) >> 4) == 0x00) 	/* 7108H */
			pVia->Tuner[1] = CreateTuner(SAA7108H, tdev);
		else
			xf86DestroyI2CDevRec(tdev, TRUE);
	}
	else
	{
		/* Check for an SAA7113H on tuner 1 */
		tdev = xf86CreateI2CDevRec();
		tdev->DevName = "SAA7113H";
		tdev->SlaveAddr = 0x4A;
		tdev->pI2CBus = pVia->I2C_Port2;
		if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00)  & 0xE0) == 0x00) 	/* 7113H */
			pVia->Tuner[1] = CreateTuner(SAA7113H, tdev);
		else
		{
			xf86DestroyI2CDevRec(tdev, TRUE);
			/* Check for an SAA7114H on tuner 1 */
			tdev = xf86CreateI2CDevRec();
			tdev->DevName = "SAA7114H";
			tdev->SlaveAddr = 0x40;
			tdev->pI2CBus = pVia->I2C_Port2;
			if (xf86I2CDevInit(dev) && (ReadI2C(tdev, 0x00)  & 0xE0) == 0x00) 	/* 7113H */
				pVia->Tuner[1] = CreateTuner(SAA7114H, tdev);
			else
				xf86DestroyI2CDevRec(tdev, TRUE);
		}
	}	
	xf86DestroyI2CDevRec(dev, TRUE);
	
	if(pVia->Tuner[0])
	{
		xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Video decoder 0: %s.\n",
			pVia->Tuner[0]->I2C->DevName);
		ViaTunerSetup(pVia->Tuner[0]);
		ViaProbeFMTuner(pVia->Tuner[0], 0xC6);
	}	
	if(pVia->Tuner[1])
	{
		xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Video decoder 1: %s.\n",
			pVia->Tuner[1]->I2C->DevName);
		ViaTunerSetup(pVia->Tuner[1]);
		ViaProbeFMTuner(pVia->Tuner[1], 0xC0);
	}
	
	/* Check for a CXA2104S audio controller */
	
	if((pVia->Tuner[0] || pVia->Tuner[1]) && xf86I2CProbeAddress(pVia->I2C_Port2, 0x84))
	{
		dev = xf86CreateI2CDevRec();
		dev->DevName = "CXA2104S";
		dev->SlaveAddr = 0x84;
		dev->pI2CBus = pVia->I2C_Port2;
		if(xf86I2CDevInit(dev))
		{
			xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Video decoder 1: %s.\n",
				pVia->Tuner[1]->I2C->DevName);
			pVia->CXA2104S = dev;
		}
		else
			xf86DestroyI2CDevRec(dev, TRUE);
	}	
}

void ViaTunerDestroy(ScrnInfoPtr pScrn)
{
	VIAPtr pVia = VIAPTR(pScrn);
	if(pVia->Tuner[0])
	{
		if(pVia->Tuner[0]->FMI2C)
			xf86DestroyI2CDevRec(pVia->Tuner[0]->FMI2C, TRUE);
		xf86DestroyI2CDevRec(pVia->Tuner[0]->I2C, TRUE);
		xfree(pVia->Tuner[0]);
		pVia->Tuner[0] = NULL;
	}
	if(pVia->Tuner[1])
	{
		if(pVia->Tuner[1]->FMI2C)
			xf86DestroyI2CDevRec(pVia->Tuner[1]->FMI2C, TRUE);
		xf86DestroyI2CDevRec(pVia->Tuner[1]->I2C, TRUE);
		xfree(pVia->Tuner[1]);
		pVia->Tuner[1] = NULL;
	}
	if(pVia->CXA2104S)
		xf86DestroyI2CDevRec(pVia->CXA2104S, TRUE);
}

Index: Imakefile
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/Imakefile,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/Imakefile	20 Dec 2003 00:28:29 -0000	1.1.4.1
+++ b/Imakefile	23 Feb 2004 21:36:29 -0000	1.1.4.2
@@ -1,5 +1,4 @@
-XCOMM $XdotOrg$
-XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/Imakefile,v 1.7 2003/12/17 18:57:17 dawes Exp $
+XCOMM $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/Imakefile,v 1.8 2003/12/31 05:42:04 dawes Exp $
 
 #define IHaveModules
 #include <Server.tmpl>
@@ -13,6 +12,7 @@
 #endif
 
 SRCS = via_driver.c \
+    via_tuner.c \
     via_accel.c \
     via_bandwidth.c \
     via_bios.c \
@@ -30,6 +30,7 @@
     via_overlay.c $(DRISRCS)
 
 OBJS = via_driver.o \
+    via_tuner.o \
     via_accel.o \
     via_bandwidth.o \
     via_bios.o \

Index: via.h
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via.h,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via.h	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via.h	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via.h,v 1.4 2003/08/27 15:16:06 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via.h,v 1.5 2004/01/05 00:34:17 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -575,4 +575,61 @@
 #define GEOutW(port, data)      *((volatile CARD16 *)(lpGEMMIO + (port))) = (data)
 #define GEOutD(port, data)      *((volatile CARD32 *)(lpGEMMIO + (port))) = (data)
 
+/*
+ *	MPEG 1/2 Slice Engine (at 0xC00 relative to base)
+ */
+ 
+#define MPG_CONTROL		0x00
+#define 	MPG_CONTROL_STRUCT	0x03
+#define			MPG_CONTROL_STRUCT_TOP		0x01
+#define			MPG_CONTROL_STRUCT_BOTTOM	0x02
+#define			MPG_CONTROL_STRUCT_FRAME	0x03
+		/* Use TOP if interlaced */
+#define		MPG_CONTROL_TYPE	0x3C
+#define			MPG_CONTROL_TYPE_I	(0x01 << 2)
+#define			MPG_CONTROL_TYPE_B	(0x02 << 2)
+#define			MPG_CONTROL_TYPE_P	(0x03 << 3)
+#define		MPG_CONTROL_ALTSCAN	0x40
+#define MPG_BLOCK		0x08		/* Unsure */
+#define MPG_COMMAND		0x0C
+#define MPG_DATA1		0x10
+#define MPG_DATA2		0x14
+#define MPG_DATA3		0x18
+#define MPG_DATA4		0x1C
+
+#define MPG_YPHYSICAL(x)	(0x20 + 12*(x))
+#define MPG_CbPHYSICAL(x)	(0x24 + 12*(x))
+#define MPG_CrPHYSICAL(x)	(0x28 + 12*(x))
+
+#define MPG_PITCH		0x50
+#define MPG_STATUS		0x54
+
+#define MPG_MATRIX_IDX		0x5C
+#define		MPG_MATRIX_IDX_INTRA	0x00
+#define		MPG_MATRIX_IDX_NON	0x01
+#define MPG_MATRIX_DATA		0x60
+
+#define MPG_SLICE_CTRL_1	0x90
+#define		MPG_SLICE_MBAMAX		0x2FFF
+#define		MPG_SLICE_PREDICTIVE_DCT	0x4000
+#define		MPG_SLICE_TOP_FIRST		0x8000
+#define 	MPG_SLICE_MACROBLOCK_WIDTH(x)	((x)<<18)	/* in 64's */
+#define	MPG_SLICE_CTRL_2	0x94
+#define		MPG_SLICE_CONCEAL_MVEC		0x0000001
+#define		MPG_SLICE_QSCALE_TYPE		0x0000002
+#define		MPG_SLICE_DCPRECISION		0x000000C
+#define		MPG_SLICE_MACROBQUOT		0x0FFFFF0
+#define		MPG_SLICE_INTRAVLC		0x1000000
+#define	MPG_SLICE_CTRL_3	0x98
+#define		MPG_SLICE_FHMVR			0x0000003
+#define		MPG_SLICE_FVMVR			0x000000C
+#define		MPG_SLICE_BHMVR			0x0000030
+#define		MPG_SLICE_BVMVR			0x00000C0
+#define		MPG_SLICE_SECOND_FIELD		0x0100000
+#define		MPG_SLICE_RESET			0x0400000
+#define MPG_SLICE_LENGTH	0x9C
+#define	MPG_SLICE_DATA		0xA0
+
+
+
 #endif /* _VIA_H_ */

Index: via.man
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via.man,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via.man	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via.man	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via.man,v 1.3 2003/08/04 10:32:26 eich Exp $
+.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via.man,v 1.4 2003/12/19 22:00:46 dawes Exp $
 .\" shorthand for double quote that works everywhere.
 .ds q \N'34'
 .TH VIA __drivermansuffix__ __vendorversion__
@@ -22,8 +22,8 @@
 VIA KM400/K8M800 VT3204/5/7204/5 video, including 2D acceleration and the Xv 
 video overlay extensions. Flat panel, TV and VGA outputs are supported.
 .PP
-Direct rendering 3D is available for this device only using XFree 4.2 
-builds. If you are interested in porting the DRI support to current XFree
+Direct rendering 3D is available for this device only using XFree86 4.2 
+builds. If you are interested in porting the DRI support to current XFree86
 then please see the DRI project on sourceforge.net.
 .PP
 .SH CONFIGURATION DETAILS

Index: via_accel.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_accel.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/via_accel.c	20 Dec 2003 00:28:29 -0000	1.1.4.1
+++ b/via_accel.c	23 Feb 2004 21:36:29 -0000	1.1.4.2
@@ -21,8 +21,7 @@
  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
-/* $XdotOrg$ */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_accel.c,v 1.6 2003/12/17 19:01:59 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_accel.c,v 1.11 2004/01/29 03:13:24 dawes Exp $ */
 
 /*************************************************************************
  *
@@ -347,7 +346,9 @@
     ScrnInfoPtr     pScrn = xf86Screens[pScreen->myNum];
     VIAPtr          pVia = VIAPTR(pScrn);
     XAAInfoRecPtr   xaaptr;
-    BoxRec AvailFBArea;
+    BoxRec 	    AvailFBArea;
+    unsigned long   cacheEnd;
+    unsigned long   cacheEndDRI;
 
     pVia->VQStart = 0;
     if (((pVia->FBFreeEnd - pVia->FBFreeStart) >= VIA_VQ_SIZE) &&
@@ -393,8 +394,8 @@
     xaaptr->SetClippingRectangle = VIASetClippingRectangle;
     xaaptr->DisableClipping = VIADisableClipping;
     xaaptr->ClippingFlags = HARDWARE_CLIP_SOLID_FILL |
-                            /*HARDWARE_CLIP_SOLID_LINE |*/
-                            /*HARDWARE_CLIP_DASHED_LINE |*/
+                            HARDWARE_CLIP_SOLID_LINE |
+                            HARDWARE_CLIP_DASHED_LINE |
                             HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY |
                             HARDWARE_CLIP_MONO_8x8_FILL |
                             HARDWARE_CLIP_COLOR_8x8_FILL |
@@ -419,7 +420,6 @@
             VIASubsequentMono8x8PatternFillRect;
     xaaptr->Mono8x8PatternFillFlags = NO_PLANEMASK |
                                       HARDWARE_PATTERN_PROGRAMMED_BITS |
-                                      HARDWARE_PATTERN_PROGRAMMED_ORIGIN |
 				      ROP_NEEDS_SOURCE |
                                       BIT_ORDER_IN_BYTE_MSBFIRST |
                                       0;
@@ -431,7 +431,6 @@
     xaaptr->Color8x8PatternFillFlags = NO_PLANEMASK |
                                        NO_TRANSPARENCY |
                                        HARDWARE_PATTERN_PROGRAMMED_BITS |
-                                       HARDWARE_PATTERN_PROGRAMMED_ORIGIN |
 				       ROP_NEEDS_SOURCE |
                                        0;
 
@@ -498,49 +497,55 @@
     xaaptr->ImageWriteRange = VIA_MMIO_BLTSIZE;
 
     /* We reserve space for pixel cache */
-    pVia->ScissB = (pVia->FBFreeStart + VIA_PIXMAP_CACHE_SIZE) / pVia->Bpl;
-    pVia->FBFreeStart += VIA_PIXMAP_CACHE_SIZE;
+    
+    cacheEnd = pVia->FBFreeEnd / pVia->Bpl;
+    cacheEndDRI = (pVia->FBFreeStart + VIA_PIXMAP_CACHE_SIZE + pVia->Bpl-1) / pVia->Bpl;
+    
+    /*
+     *	Old DRI has some assumptions here that we need to work through
+     *  and fix
+     *  UPDATE: These assumptions are that pVia->FBFreestart should
+     *  point to a free region in the framebuffer where it can place it's
+     *  allocator.
+     */
+    if(cacheEnd > cacheEndDRI)
+    {
+        xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+        	"Clipping pixmap cache for old DRI/DRM module.\n");
+        cacheEnd = cacheEndDRI;
+    }
+    
+    /*
+     *	Clip to the blitter limit
+     */
+    pVia->ScissB = cacheEnd;;
 
     if (pVia->ScissB > 2047)
         pVia->ScissB = 2047;
 
     /*
+     * The free start IS where the cache Ends. We should not add here.
+     */ 
+
+    pVia->FBFreeStart = (pVia->ScissB + 1) *pVia->Bpl;
+
+    /*
      * Finally, we set up the video memory space available to the pixmap
-     * cache. In this case, all memory from the end of the virtual screen
-     * to the end of the command overflow buffer can be used. If you haven't
-     * enabled the PIXMAP_CACHE flag, then these lines can be omitted.
+     * cache
      */
 
     AvailFBArea.x1 = 0;
     AvailFBArea.y1 = 0;
     AvailFBArea.x2 = pScrn->displayWidth;
-    AvailFBArea.y2 = (pVia->FBFreeEnd) / pVia->Bpl;
+    AvailFBArea.y2 = pVia->ScissB;
 
     /*
      * The pixmap cache must stay within the lowest 2048 lines due
      * to hardware blitting limits. The rest is available for offscreen
-     * allocations
+     * allocations unless DRI stole it.
      */
      
-    if(AvailFBArea.y2 > 2047)
-    {
-	unsigned long offset = 2048 * pVia->Bpl;
-	unsigned long size = (pVia->FBFreeEnd - offset);
-#ifdef XFREE_44	
-	int bpp = (pScrn->bitsPerPixel + 7) / 8;
-#endif
-	AvailFBArea.y2 = 2047;
-	xf86InitFBManager(pScreen, &AvailFBArea);
-#ifdef XFREE_44	
-	xf86InitFBManagerLinear(pScreen, offset/bpp, size/bpp);
-#else
-	VIAInitPool(pVia, offset, size);
-#endif	
-    }
-    else
-	xf86InitFBManager(pScreen, &AvailFBArea);
-    
-    
+    xf86InitFBManager(pScreen, &AvailFBArea);
     DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO,
 					 "Using %d lines for offscreen memory.\n",
 					 AvailFBArea.y2 - pScrn->virtualY ));
@@ -548,6 +553,32 @@
     return XAAInit(pScreen, xaaptr);
 }
 
+void VIAInitLinear(ScreenPtr pScreen)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    VIAPtr pVia = VIAPTR(pScrn);
+#ifdef XFREE86_44	
+    /*
+     * In the 44 path we must take care not to truncate offset and size so
+     * that we get overlaps. If there is available memory below line 2048
+     * we use it.
+     */ 
+    unsigned long offset = (pVia->FBFreeStart + pVia->Bpp - 1 ) / pVia->Bpp; 
+    unsigned long size = pVia->FBFreeEnd / pVia->Bpp - offset;
+    if (size > 0) xf86InitFBManagerLinear(pScreen, offset, size);
+#else
+    /*
+     * In the 43 path we don't have to care about truncation. just use
+     * all available memory, also below line 2048. The drm module uses 
+     * pVia->FBFreeStart as offscreen available start. We do it to. 
+     */
+    unsigned long offset = pVia->FBFreeStart; 
+    unsigned long size = pVia->FBFreeEnd - offset;
+    if (size > 0 ) VIAInitPool(pVia, offset, size);
+#endif	
+}
+    
+
 
 /* The sync function for the GE */
 void VIAAccelSync(ScrnInfoPtr pScrn)

Index: via_bandwidth.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_bandwidth.c,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_bandwidth.c	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via_bandwidth.c	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bandwidth.c,v 1.2 2003/08/27 15:16:06 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bandwidth.c,v 1.3 2004/01/05 00:34:17 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -75,7 +75,7 @@
             	    VGAOUT8(0x3C5, bRegTemp);
     	        }
             }
-            else   /* Single view or Simultaneoue case */
+            else   /* Single view or Simultaneous case */
             {
                 if (pBIOSInfo->HDisplay > 1024)
     	        {

Index: via_bios.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/via_bios.c	20 Dec 2003 00:28:29 -0000	1.1.4.1
+++ b/via_bios.c	23 Feb 2004 21:36:29 -0000	1.1.4.2
@@ -1,5 +1,4 @@
-/* $XdotOrg$ */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.c,v 1.8 2003/12/17 18:57:18 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.c,v 1.10 2004/02/09 01:45:22 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -7233,8 +7232,8 @@
             case 0x14:
             case 0x15:
             case 0x16:
-                pViaModeTable->Modes[j].Height = 1024;
-                pViaModeTable->Modes[j].Width = 576;
+                pViaModeTable->Modes[j].Height = 576;
+                pViaModeTable->Modes[j].Width = 1024;
                 break;
             case 0x22:
             case 0x23:
@@ -8181,11 +8180,9 @@
     if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_DFP) && (pBIOSInfo->PanelSize == VIA_PANEL_INVALID)) {
         VIAGetPanelInfo(pBIOSInfo);
     }
-    
-    /* Default settings have not been loaded, they must be
-       obtained from the BIOS */
-    pBIOSInfo->pUTUSERSETTING->DefaultSetting = FALSE;
 
+    pBIOSInfo->UserSetting->DefaultSetting = FALSE;
+        
     if (!pBIOSInfo->ActiveDevice) {
         pBIOSInfo->ActiveDevice = VIAGetDeviceDetect(pBIOSInfo);
     }
@@ -11081,7 +11078,7 @@
 {
     VIABIOSInfoPtr  pVia;
     VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
-    UTUSERSETTINGptr    pUTUSERSETTING = pBIOSInfo->pUTUSERSETTING;
+    VIAUserSettingPtr UserSetting = pBIOSInfo->UserSetting;
     BOOL            setTV = FALSE;
     int             mode, resMode, refresh;
     int             port, offset, mask, data;
@@ -11528,16 +11525,16 @@
             case VIA_SAA7108:
                 VIAPostSetSAA7108Mode(pBIOSInfo);
                 break;
-			case VIA_FS454:
-	    		VIAPostSetFS454Mode(pBIOSInfo);
-				break;
+	    case VIA_FS454:
+		VIAPostSetFS454Mode(pBIOSInfo);
+		break;
         }
     }
 
     /* load/save TV attribute for utility. */
     if (!pBIOSInfo->HasSecondary && (pBIOSInfo->ActiveDevice & VIA_DEVICE_TV)) {
         /* Read User Setting */
-        if (pUTUSERSETTING->DefaultSetting) {
+        if (UserSetting->DefaultSetting) {
             VIARestoreUserSetting(pBIOSInfo);
         }
         else {                                      /* Read from I2C */
@@ -11546,13 +11543,6 @@
     }
 
     VIAEnabledPrimaryExtendedFIFO(pBIOSInfo);
-    /* Enable extended FIFO if the resolution > 1024x768
-    if (pBIOSInfo->CrtcHDisplay > 1024) {
-        VIAEnableExtendedFIFO(pBIOSInfo);
-    }
-    else {
-        VIADisableExtendedFIFO(pBIOSInfo);
-    }*/
 
     /* Enable CRT Controller (3D5.17 Hardware Reset) */
     VGAOUT8(0x3d4, 0x17);

Index: via_bios.h
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.h,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_bios.h	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via_bios.h	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.h,v 1.3 2003/08/27 15:16:07 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_bios.h,v 1.4 2003/12/31 05:42:04 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -26,18 +26,18 @@
 #ifndef _VIA_BIOS_H_
 #define _VIA_BIOS_H_ 1
 
-#define     VIA_CRT_SUPPORT               TRUE
-#define     VIA_LCD_SUPPORT               TRUE
-#define     VIA_UNCOVERD_LCD_PANEL        FALSE
-#define     VIA_NTSC_SUPPORT              TRUE
-#define     VIA_PAL_SUPPORT               TRUE
-#define     VIA_DVI_SUPPORT               TRUE
+#define     VIA_CRT_SUPPORT                 TRUE
+#define     VIA_LCD_SUPPORT                 TRUE
+#define     VIA_UNCOVERD_LCD_PANEL          FALSE
+#define     VIA_NTSC_SUPPORT                TRUE
+#define     VIA_PAL_SUPPORT                 TRUE
+#define     VIA_DVI_SUPPORT                 TRUE
 
-#define     VIA_CRT_SUPPORT_BIT           0x01
-#define     VIA_LCD_SUPPORT_BIT           0x02
-#define     VIA_NTSC_SUPPORT_BIT          0x04
-#define     VIA_PAL_SUPPORT_BIT           0x08
-#define     VIA_DVI_SUPPORT_BIT           0x20
+#define     VIA_CRT_SUPPORT_BIT             0x01
+#define     VIA_LCD_SUPPORT_BIT             0x02
+#define     VIA_NTSC_SUPPORT_BIT            0x04
+#define     VIA_PAL_SUPPORT_BIT             0x08
+#define     VIA_DVI_SUPPORT_BIT		    0x20
 
 #define     VIA_BIOS_REG_TABLE_MAX_NUM      32
 #define     VIA_BIOS_REG_LCD_MAX_NUM        48
@@ -51,16 +51,16 @@
 #define     VIA_BIOS_MAX_NUM_CTREXP         5
 #define     VIA_BIOS_MAX_NUM_TV_REG         144		/* 00 - 8F, tv2,tv3,ch7019 are the same */
 #define     VIA_BIOS_MAX_NUM_SAA7108_TV_REG 176		/* 00 - AF */
-#define     VIA_BIOS_NUM_FS454_TV_REG   	32		/* Nums of TV Register in setmode needs */
+#define     VIA_BIOS_NUM_FS454_TV_REG       32		/* Nums of TV Register in setmode needs */
 #define     VIA_BIOS_MAX_NUM_TV_CRTC        32
 #define     VIA_BIOS_NUM_TV_SPECIAL_REG     8
 #define     VIA_BIOS_MAX_NUM_TV_PATCH       8
 #define     VIA_BIOS_NUM_TV_OTHER           16
 #define     VIA_BIOS_NUM_TV2                2
 #define     VIA_BIOS_NUM_TV3                6
-#define     VIA_BIOS_NUM_SAA7108			4
-#define     VIA_BIOS_NUM_CH7019				3
-#define     VIA_BIOS_NUM_FS454				5
+#define     VIA_BIOS_NUM_SAA7108	    4
+#define     VIA_BIOS_NUM_CH7019		    3
+#define     VIA_BIOS_NUM_FS454		    5
 
 
 /* The position of some BIOS information from start of BIOS */
@@ -104,7 +104,7 @@
 #define     VIA_RES_720X576                 13
 #define     VIA_RES_1024X512                14
 #define     VIA_RES_856X480                 15
-#define		VIA_RES_1024X576				16
+#define     VIA_RES_1024X576		    16
 #define     VIA_RES_INVALID                 255
 
 #define     VIA_TVRES_640X480               0
@@ -168,24 +168,24 @@
 #define     VIA_TV_NUM_HSCALE_LEVEL         8
 #define     VIA_TV_NUM_HSCALE_REG           16
 
-#define		VIA_DEVICE_CRT1					0x01
-#define		VIA_DEVICE_LCD					0x02
-#define		VIA_DEVICE_TV					0x04
-#define		VIA_DEVICE_DFP					0x08
-#define		VIA_DEVICE_CRT2					0x10
+#define	    VIA_DEVICE_CRT1		    0x01
+#define	    VIA_DEVICE_LCD		    0x02
+#define	    VIA_DEVICE_TV		    0x04
+#define	    VIA_DEVICE_DFP		    0x08
+#define	    VIA_DEVICE_CRT2		    0x10
 
 /* System Memory CLK */
-#define		VIA_MEM_SDR66					0x00
-#define		VIA_MEM_SDR100					0x01
-#define		VIA_MEM_SDR133					0x02
-#define		VIA_MEM_DDR200					0x03
-#define		VIA_MEM_DDR266					0x04
-#define		VIA_MEM_DDR333					0x05
-#define		VIA_MEM_DDR400					0x06
+#define	    VIA_MEM_SDR66		    0x00
+#define	    VIA_MEM_SDR100		    0x01
+#define	    VIA_MEM_SDR133		    0x02
+#define	    VIA_MEM_DDR200		    0x03
+#define	    VIA_MEM_DDR266		    0x04
+#define	    VIA_MEM_DDR333		    0x05
+#define	    VIA_MEM_DDR400		    0x06
 
 /* Digital Output Bus Width */
-#define		VIA_DI_12BIT					0x00
-#define		VIA_DI_24BIT					0x01
+#define	    VIA_DI_12BIT		    0x00
+#define	    VIA_DI_24BIT		    0x01
 
 #define     CAP_WEAVE                       0x0
 #define     CAP_BOB                         0x1
@@ -473,36 +473,35 @@
     VIABIOSTV3TableRec      tv3OverTable[VIA_BIOS_NUM_TV3];
     VIABIOSTV3TableRec      vt1622aTable[VIA_BIOS_NUM_TV3];
     VIABIOSTV3TableRec      vt1622aOverTable[VIA_BIOS_NUM_TV3];
-	VIABIOSSAA7108TableRec		saa7108Table[VIA_BIOS_NUM_SAA7108];
-	VIABIOSSAA7108TableRec		saa7108OverTable[VIA_BIOS_NUM_SAA7108];
-	VIABIOSCH7019TableRec	ch7019Table[VIA_BIOS_NUM_CH7019];
-	VIABIOSCH7019TableRec	ch7019OverTable[VIA_BIOS_NUM_CH7019];
-	VIABIOSFS454TableRec	fs454Table[VIA_BIOS_NUM_FS454];
-	VIABIOSFS454TableRec	fs454OverTable[VIA_BIOS_NUM_FS454];
+    VIABIOSSAA7108TableRec  saa7108Table[VIA_BIOS_NUM_SAA7108];
+    VIABIOSSAA7108TableRec  saa7108OverTable[VIA_BIOS_NUM_SAA7108];
+    VIABIOSCH7019TableRec   ch7019Table[VIA_BIOS_NUM_CH7019];
+    VIABIOSCH7019TableRec   ch7019OverTable[VIA_BIOS_NUM_CH7019];
+    VIABIOSFS454TableRec    fs454Table[VIA_BIOS_NUM_FS454];
+    VIABIOSFS454TableRec    fs454OverTable[VIA_BIOS_NUM_FS454];
 } VIAModeTableRec, *VIAModeTablePtr;
 
-typedef struct _UTUSERSETTING
+typedef struct _VIAUserSettingRec
 {
     Bool            DefaultSetting;
-    Bool            ADAPTIVE_FFILTER_ON;
-    unsigned long   UT_TV_VPOSITION;
-    unsigned long   UT_TV_HPOSITION;
-    unsigned long   UT_TV_FFILTER;
-    unsigned long   UT_TV_ADAPTIVE_FFILTER;
-    unsigned long   UT_TV_BRIGHTNESS;
-    unsigned long   UT_TV_CONTRAST;
-    unsigned long   UT_TV_SATURATION;
-    unsigned long   UT_TV_TINT;
-} UTUSERSETTING, *UTUSERSETTINGptr;
+    Bool            AdaptiveFilterOn;
+    unsigned long   tvVPosition;
+    unsigned long   tvHPosition;
+    unsigned long   tvFFilter;
+    unsigned long   tvAdaptiveFFilter;
+    unsigned long   tvBrightness;
+    unsigned long   tvContrast;
+    unsigned long   tvSaturation;
+    unsigned long   tvTint;
+} VIAUserSettingRec, *VIAUserSettingPtr;
 
 typedef struct _VIABIOSINFO {
-
     VIAModeTablePtr     pModeTable;
 
     int                 Chipset;
     int                 ChipRev;
-    unsigned char		TMDS;
-    unsigned char		LVDS;
+    unsigned char	TMDS;
+    unsigned char	LVDS;
     /*int                 DVIEncoder;*/
     int                 TVEncoder;
     int                 BIOSTVTabVer;
@@ -511,32 +510,32 @@
     Bool                FirstInit;
     unsigned char*      FBBase;
     unsigned long       videoRambytes;
-    unsigned char		MemClk;
+    unsigned char	MemClk;
     int                 scrnIndex;
 
     unsigned int        mode, refresh, resMode;
     int                 countWidthByQWord;
     int                 offsetWidthByQWord;
 
-    unsigned char		ConnectedDevice;
-    unsigned char		ActiveDevice;
-    unsigned char		DefaultActiveDevice;
+    unsigned char	ConnectedDevice;
+    unsigned char	ActiveDevice;
+    unsigned char	DefaultActiveDevice;
 
     /* Here are all the BIOS Relative Options */
     int                 BIOSMajorVersion;
     int                 BIOSMinorVersion;
-    unsigned char		BIOSDateYear;
-    unsigned char		BIOSDateMonth;
-    unsigned char		BIOSDateDay;
+    unsigned char	BIOSDateYear;
+    unsigned char	BIOSDateMonth;
+    unsigned char	BIOSDateDay;
     Bool                A2;
     Bool                UseBIOS;
-	Bool				LCDDualEdge;	/* mean add-on card is 2CH or Dual or DDR */
+    Bool		LCDDualEdge;	/* mean add-on card is 2CH or Dual or DDR */
     Bool                DVIAttach;
     Bool                LCDAttach;
     Bool                Center;
     Bool                TVAttach;
     Bool                TVDotCrawl;
-	unsigned char		BusWidth;		/* Digital Output Bus Width */
+    unsigned char	BusWidth;		/* Digital Output Bus Width */
     int                 PanelSize;
     int                 TVType;
     int                 TVOutput;
@@ -581,21 +580,20 @@
     xf86MonPtr          DDC2;
     I2CDevPtr           dev;
 
-	unsigned int		resTVMode;
-	unsigned char		TVI2CAdd;
+    unsigned int	resTVMode;
+    unsigned char	TVI2CAdd;
     unsigned char       TVRegs[0xFF];
 
     /* MHS */
-    Bool				SAMM;			/* SAMM success or not? */
+    Bool		SAMM;			/* SAMM success or not? */
     Bool                IsSecondary;
     Bool                HasSecondary;
     Bool                SetTV;
     Bool                SetDVI;
 
     /* Utility User Setting */
-    UTUSERSETTINGptr    pUTUSERSETTING;
+    VIAUserSettingPtr   UserSetting;
     LOCO            	colors[256];    /* Gamma value. LOCO typedef in colormapst.h */
-
 } VIABIOSInfoRec, *VIABIOSInfoPtr;
 
 /* Functions protype */

Index: via_dri.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_dri.c	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via_dri.c	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c,v 1.4 2003/09/24 02:43:30 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c,v 1.9 2004/02/08 17:57:10 tsi Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -82,7 +82,7 @@
 static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia)
 {
     unsigned long  agp_phys;
-    unsigned int agpaddr;
+    drmAddress agpaddr;
     VIADRIPtr pVIADRI;
     DRIInfoPtr pDRIInfo;
     pDRIInfo = pVia->pDRIInfo;
@@ -129,11 +129,14 @@
 	xf86DrvMsg(pScreen->myNum, X_ERROR,
 	    "[drm] Failed to map public agp area\n");
         pVIADRI->agp.size = 0;
-        return FALSE;
+	drmAgpUnbind(pVia->drmFD, pVia->agpHandle);
+	drmAgpFree(pVia->drmFD, pVia->agpHandle);
+	drmAgpRelease(pVia->drmFD);
+	return FALSE;
     }  
     /* Map AGP from kernel to Xserver - Not really needed */
-    drmMap(pVia->drmFD, pVIADRI->agp.handle,pVIADRI->agp.size,
-	(drmAddressPtr)&agpaddr);
+    drmMap(pVia->drmFD, pVIADRI->agp.handle, pVIADRI->agp.size, &agpaddr);
+    pVia->agpMappedAddr = agpaddr;
 
     xf86DrvMsg(pScreen->myNum, X_INFO, 
                 "[drm] agpBase = %p\n", pVia->agpBase);
@@ -149,8 +152,14 @@
 	agp.offset = 0;
 	agp.size = AGP_SIZE;
 	if (drmCommandWrite(pVia->drmFD, DRM_VIA_AGP_INIT, &agp,
-			    sizeof(drmViaAgp)) < 0)
+			    sizeof(drmViaAgp)) < 0) {
+	    drmUnmap(agpaddr,pVia->agpSize);
+	    drmRmMap(pVia->drmFD,pVIADRI->agp.handle);
+	    drmAgpUnbind(pVia->drmFD, pVia->agpHandle);
+	    drmAgpFree(pVia->drmFD, pVia->agpHandle);
+	    drmAgpRelease(pVia->drmFD);
 	    return FALSE;
+	}
     }
 	
     return TRUE;
@@ -462,8 +471,18 @@
     ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
     VIAPtr pVia = VIAPTR(pScrn);
 
-    DRICloseScreen(pScreen);
+    if (pVia->agpSize) {
+	drmUnmap(pVia->agpMappedAddr,pVia->agpSize);
+	drmRmMap(pVia->drmFD,pVia->agpHandle);
+	drmAgpUnbind(pVia->drmFD, pVia->agpHandle);
+	xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n");
+	drmAgpFree(pVia->drmFD, pVia->agpHandle);
+	xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n");
+	drmAgpRelease(pVia->drmFD);
+    }
 
+    DRICloseScreen(pScreen);
+    
     if (pVia->pDRIInfo) {
 	if (pVia->pDRIInfo->devPrivate) {
     	    xfree(pVia->pDRIInfo->devPrivate);
@@ -473,13 +492,13 @@
 	pVia->pDRIInfo=0;
     }
     
-    if (pVia->pVisualConfigs) xfree(pVia->pVisualConfigs);
-    if (pVia->pVisualConfigsPriv) xfree(pVia->pVisualConfigsPriv);
-    if (pVia->agpSize) {
-	xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Freeing agp memory\n");
-        drmAgpFree(pVia->drmFD, pVia->agpHandle);
-	xf86DrvMsg(pScreen->myNum, X_INFO, "[drm] Releasing agp module\n");
-    	drmAgpRelease(pVia->drmFD);
+    if (pVia->pVisualConfigs) {
+	xfree(pVia->pVisualConfigs);
+	pVia->pVisualConfigs = NULL;
+    }
+    if (pVia->pVisualConfigsPriv) {
+	xfree(pVia->pVisualConfigsPriv);
+	pVia->pVisualConfigsPriv = NULL;
     }
 }
 

Index: via_driver.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/via_driver.c	20 Dec 2003 00:28:29 -0000	1.1.4.1
+++ b/via_driver.c	23 Feb 2004 21:36:29 -0000	1.1.4.2
@@ -1,5 +1,4 @@
-/* $XdotOrg$ */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.c,v 1.17 2003/12/17 18:57:18 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.c,v 1.28 2004/02/08 17:57:10 tsi Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -82,7 +81,6 @@
 static Bool VIAMapMMIO(ScrnInfoPtr pScrn);
 static Bool VIAMapFB(ScrnInfoPtr pScrn);
 static void VIAUnmapMem(ScrnInfoPtr pScrn);
-static int  VIAGetMemSize(void);
 Bool VIADeviceSelection(ScrnInfoPtr pScrn);
 Bool VIADeviceDispatch(ScrnInfoPtr pScrn);
 
@@ -448,6 +446,8 @@
     pScrn->driverPrivate = xnfcalloc(sizeof(VIARec), 1);
     ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo =
         xnfcalloc(sizeof(VIABIOSInfoRec), 1);
+    ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->UserSetting =
+        xnfcalloc(sizeof(VIAUserSettingRec), 1);
     ((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->pModeTable =
         xnfcalloc(sizeof(VIAModeTableRec), 1);
 
@@ -469,7 +469,9 @@
         return;
 
     xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->pModeTable);
+    xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo->UserSetting);
     xfree(((VIARec *)(pScrn->driverPrivate))->pBIOSInfo);
+    ViaTunerDestroy(pScrn);
     xfree(pScrn->driverPrivate);
     pScrn->driverPrivate = NULL;
 
@@ -535,7 +537,7 @@
             {
                 pScrn->driverVersion = VIA_VERSION;
                 pScrn->driverName = DRIVER_NAME;
-                pScrn->name = DRIVER_NAME;
+                pScrn->name = "VIA";
                 pScrn->Probe = VIAProbe;
                 pScrn->PreInit = VIAPreInit;
                 pScrn->ScreenInit = VIAScreenInit;
@@ -1359,7 +1361,10 @@
             pScrn->videoRam = bMemSize << 6;
         }
         else {
-            VGAOUT8(0x3C4, 0x34);	/* Was 0x39 */
+            if(pVia->Chipset == VIA_CLE266)
+                VGAOUT8(0x3C4, 0x34);
+            else
+            	VGAOUT8(0x3C4, 0x39);
             bMemSize = VGAIN8(0x3c5);
             if (bMemSize > 16 && bMemSize <= 128) {
                 pScrn->videoRam = (bMemSize + 1) << 9;
@@ -1370,7 +1375,7 @@
             else {
                 DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
                 "bMemSize = %d\nGet Video Memory Size by default.\n", bMemSize));
-                pScrn->videoRam = VIAGetMemSize();
+                pScrn->videoRam = 16 << 10;	/* Assume the base 16Mb */
             }
         }
     }
@@ -2204,6 +2209,24 @@
                pVia->FrameBufferBase, pVia->videoRambytes);
 
     if (pVia->videoRambytes) {
+
+	/*
+	 * FIXME: This is a hack to get rid of offending wrongly sized
+	 * MTRR regions set up by the VIA BIOS. Should be taken care of
+	 * in the OS support layer.
+	 */
+
+        unsigned char *tmp; 
+        tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
+			    pVia->PciTag, pVia->FrameBufferBase,
+			    pVia->videoRambytes);
+        xf86UnMapVidMem(pScrn->scrnIndex, (pointer)tmp,
+                        pVia->videoRambytes);
+
+	/*
+	 * End of hack.
+	 */
+
         pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER,
                                      pVia->PciTag, pVia->FrameBufferBase,
                                      pVia->videoRambytes);
@@ -2344,8 +2367,33 @@
     fbPictureInit(pScreen, 0, 0);
 #endif
 
-    if (!pVia->NoAccel)
+    if (!pVia->NoAccel) {
         VIAInitAccel(pScreen);
+    } 
+#ifdef XFREE86_44
+    else {
+	/*
+	 * This is needed because xf86InitFBManagerLinear in VIAInitLinear
+	 * needs xf86InitFBManager to have been initialized, and 
+	 * xf86InitFBManager needs at least one line of free memory to
+	 * work. This is only for Xv in Noaccel part, and since Xv is in some
+	 * sense accelerated, it might be a better idea to disable it
+	 * altogether.
+	 */ 
+        BoxRec AvailFBArea;
+
+        AvailFBArea.x1 = 0;
+        AvailFBArea.y1 = 0;
+        AvailFBArea.x2 = pScrn->displayWidth;
+        AvailFBArea.y2 = pScrn->virtualY + 1;
+	/* 
+	 * Update FBFreeStart also for other memory managers, since 
+	 * we steal one line to make xf86InitFBManager work.
+	 */
+	pVia->FBFreeStart = (AvailFBArea.y2 + 1) * pVia->Bpl;
+	xf86InitFBManager(pScreen, &AvailFBArea);	
+    }
+#endif
 
     miInitializeBackingStore(pScreen);
     xf86SetBackingStore(pScreen);
@@ -2424,16 +2472,17 @@
     else {
         xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering disabled\n");
     }
+    if (!pVia->directRenderingEnabled)
+	VIAInitLinear(pScreen);
+#else    
+    VIAInitLinear(pScreen);
 #endif
 
-    if (VIA_SERIES(pVia->Chipset) && !pVia->IsSecondary) {
+    
+    if (!pVia->IsSecondary) {
+        /* The chipset is checked in viaInitVideo */
         viaFillGraphicInfo(pScrn);
-        /* There is alas not enough bandwidth to do 1600x1200x16 with video overlay */
-/*        if(pScrn->bitsPerPixel * pScrn->virtualX *pScrn->virtualY  <= 1400 * 1050 * 16)  */
-        	viaInitVideo(pScreen);
-/*        else
-        	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "video overlay disabled (%dx%d@%d exceeds bandwidth)\n",
-        		pScrn->virtualX, pScrn->virtualY, pScrn->bitsPerPixel);*/
+       	viaInitVideo(pScreen);
     }
 
     if (serverGeneration == 1)
@@ -2663,6 +2712,11 @@
             VIASETREG(0x440, 0x00000004);
         }
     }
+#ifdef XF86DRI
+    if (pVia->directRenderingEnabled) {
+	VIADRICloseScreen(pScreen);
+    }
+#endif
     if (pVia->AccelInfoRec) {
         XAADestroyInfoRec(pVia->AccelInfoRec);
         pVia->AccelInfoRec = NULL;
@@ -3086,14 +3140,6 @@
 }
 
 
-int VIAGetMemSize()
-{
-    /* TODO: Do memory sizing  */
-
-    /* Default 16MB */
-    return (16 << 10);
-}
-
 /* Active Device according connected status */
 Bool VIADeviceSelection(ScrnInfoPtr pScrn)
 {

Index: via_driver.h
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.h,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/via_driver.h	20 Dec 2003 00:28:29 -0000	1.1.4.1
+++ b/via_driver.h	23 Feb 2004 21:36:29 -0000	1.1.4.2
@@ -1,5 +1,4 @@
-/* $XdotOrg$ */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.h,v 1.8 2003/12/17 18:57:18 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.h,v 1.13 2004/02/08 17:57:10 tsi Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -80,6 +79,12 @@
 #define PATCHLEVEL      30
 #define VIA_VERSION     ((VERSION_MAJOR<<24) | (VERSION_MINOR<<16) | PATCHLEVEL)
 
+#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,3,99,14,0)
+#undef XFREE86_44 
+#else
+#define XFREE86_44 1
+#endif
+
 #define VGAIN8(addr)        MMIO_IN8(pVia->MapBase+0x8000, addr)
 #define VGAIN16(addr)       MMIO_IN16(pVia->MapBase+0x8000, addr)
 #define VGAIN(addr)         MMIO_IN32(pVia->MapBase+0x8000, addr)
@@ -156,36 +161,51 @@
 
 typedef struct __VIAHWRec
 {
-    unsigned long dwThreeHQVBuffer;			/*Use Three HQV Buffers*/
-    unsigned long dwV3SrcHeightSetting;			/*Set Video Source Width and Height*/
-    unsigned long dwSupportExtendFIFO;			/*Support Extand FIFO*/
-    unsigned long dwHQVFetchByteUnit;			/*HQV Fetch Count unit is byte*/
-    unsigned long dwHQVInitPatch;			/*Initialize HQV Engine 2 times*/
-    unsigned long dwSupportV3Gamma;			/*Support V3 Gamma */
-    unsigned long dwUpdFlip;				/*Set HQV3D0[15] to flip video*/
-    unsigned long dwHQVDisablePatch;			/*Change Video Engine Clock setting for HQV disable bug*/
-    unsigned long dwSUBFlip;				/*Set HQV3D0[15] to flip video for sub-picture blending*/
-    unsigned long dwNeedV3Prefetch;			/*V3 pre-fetch function for K8*/
-    unsigned long dwNeedV4Prefetch;			/*V4 pre-fetch function for K8*/
-    unsigned long dwUseSystemMemory;			/*Use system memory for DXVA compressed data buffers*/
-    unsigned long dwExpandVerPatch;			/*Patch video HW bug in expand SIM mode or same display path*/
-    unsigned long dwExpandVerHorPatch;			/*Patch video HW bug in expand SAMM mode or same display path*/
-    unsigned long dwV3ExpireNumTune;			/*Change V3 expire number setting for V3 bandwidth issue*/
-    unsigned long dwV3FIFOThresholdTune;		/*Change V3 FIFO, Threshold and Pre-threshold setting for V3 bandwidth issue*/
-    unsigned long dwCheckHQVFIFOEmpty;                  /*HW Flip path, need to check HQV FIFO status */
-    unsigned long dwUseMPEGAGP;                         /*Use MPEG AGP function*/
-    unsigned long dwV3FIFOPatch;                        /*For CLE V3 FIFO Bug (srcWidth <= 8)*/
-    unsigned long dwSupportTwoColorKey;                 /*Support two color key*/
-    unsigned long dwCxColorSpace;                       /*CLE_Cx ColorSpace*/
+    unsigned long dwThreeHQVBuffer;		/* Use Three HQV Buffers*/
+    unsigned long dwV3SrcHeightSetting;		/* Set Video Source Width and Height*/
+    unsigned long dwSupportExtendFIFO;		/* Support Extand FIFO*/
+    unsigned long dwHQVFetchByteUnit;		/* HQV Fetch Count unit is byte*/
+    unsigned long dwHQVInitPatch;		/* Initialize HQV Engine 2 times*/
+    unsigned long dwSupportV3Gamma;		/* Support V3 Gamma */
+    unsigned long dwUpdFlip;			/* Set HQV3D0[15] to flip video*/
+    unsigned long dwHQVDisablePatch;		/* Change Video Engine Clock setting for HQV disable bug*/
+    unsigned long dwSUBFlip;			/* Set HQV3D0[15] to flip video for sub-picture blending*/
+    unsigned long dwNeedV3Prefetch;		/* V3 pre-fetch function for K8*/
+    unsigned long dwNeedV4Prefetch;		/* V4 pre-fetch function for K8*/
+    unsigned long dwUseSystemMemory;		/* Use system memory for DXVA compressed data buffers*/
+    unsigned long dwExpandVerPatch;		/* Patch video HW bug in expand SIM mode or same display path*/
+    unsigned long dwExpandVerHorPatch;		/* Patch video HW bug in expand SAMM mode or same display path*/
+    unsigned long dwV3ExpireNumTune;		/* Change V3 expire number setting for V3 bandwidth issue*/
+    unsigned long dwV3FIFOThresholdTune;	/* Change V3 FIFO, Threshold and Pre-threshold setting for V3 bandwidth issue*/
+    unsigned long dwCheckHQVFIFOEmpty;          /* HW Flip path, need to check HQV FIFO status */
+    unsigned long dwUseMPEGAGP;                 /* Use MPEG AGP function*/
+    unsigned long dwV3FIFOPatch;                /* For CLE V3 FIFO Bug (srcWidth <= 8)*/
+    unsigned long dwSupportTwoColorKey;         /* Support two color key*/
+    unsigned long dwCxColorSpace;               /* CLE_Cx ColorSpace*/
 } VIAHWRec;
 
 /*Wait Function Structure and Flag*/
 typedef struct _WaitHWINFO
 {
-    unsigned char* pjVideo;				/*MMIO Address Info*/
-    unsigned long dwVideoFlag;				/*Video Flag*/
+    unsigned char *	pjVideo;		/* MMIO Address Info*/
+    unsigned long	dwVideoFlag;		/* Video Flag*/
 }WaitHWINFO, * LPWaitHWINFO;
 
+/* VIA Tuners */
+typedef struct
+{
+    int			decoderType;		/* Decoder I2C Type */
+#define SAA7108H		0
+#define SAA7113H		1
+#define SAA7114H		2
+    I2CDevPtr 		I2C;			/* Decoder I2C */
+    I2CDevPtr 		FMI2C;			/* FM Tuner I2C */
+    
+    /* Not yet used */
+    int			autoDetect;		/* Autodetect mode */
+    int			tunerMode;		/* Fixed mode */
+} ViaTunerRec, *ViaTunerPtr;
+
 /*
  * varables that need to be shared among different screens.
  */
@@ -301,21 +321,22 @@
     Bool                Cap0_FieldSwap;
 
 #ifdef XF86DRI
-    Bool directRenderingEnabled;
-    DRIInfoPtr pDRIInfo;
-    int drmFD;
-    int numVisualConfigs;
-    __GLXvisualConfig* pVisualConfigs;
-    VIAConfigPrivPtr pVisualConfigsPriv;
-    unsigned long agpHandle;
-    unsigned long registerHandle;
-    unsigned long agpAddr;
-    unsigned char *agpBase;
-    unsigned int agpSize;
-    Bool IsPCI;
-    Bool drixinerama;
+    Bool		directRenderingEnabled;
+    DRIInfoPtr		pDRIInfo;
+    int 		drmFD;
+    int 		numVisualConfigs;
+    __GLXvisualConfig* 	pVisualConfigs;
+    VIAConfigPrivPtr 	pVisualConfigsPriv;
+    unsigned long 	agpHandle;
+    unsigned long 	registerHandle;
+    unsigned long 	agpAddr;
+    drmAddress          agpMappedAddr;
+    unsigned char 	*agpBase;
+    unsigned int 	agpSize;
+    Bool 		IsPCI;
+    Bool 		drixinerama;
 #endif
-    unsigned char		ActiveDevice;	/* if SAMM, non-equal pBIOSInfo->ActiveDevice */
+    unsigned char	ActiveDevice;	/* if SAMM, non-equal pBIOSInfo->ActiveDevice */
     unsigned char       *CursorImage;
     CARD32		CursorFG;
     CARD32		CursorBG;
@@ -331,7 +352,13 @@
 
     pointer		VidReg;
     unsigned long	gdwVidRegCounter;
-    unsigned long old_dwUseExtendedFIFO;
+    unsigned long	old_dwUseExtendedFIFO;
+    
+    /* Overlay TV Tuners */
+    ViaTunerPtr		Tuner[2];
+    I2CDevPtr		CXA2104S;
+    int			AudioMode;
+    int			AudioMute;
     
     /* Global 2D state block - needs to slowly die */
     ViaGraphicRec	graphicInfo;    
@@ -378,6 +405,7 @@
 Bool VIAInitAccel(ScreenPtr);
 void VIAInitialize2DEngine(ScrnInfoPtr);
 void VIAAccelSync(ScrnInfoPtr);
+void VIAInitLinear(ScreenPtr pScreen);
 
 
 /* In via_shadow.c */
@@ -435,4 +463,25 @@
 unsigned long VIAAllocLinear(VIAMemPtr, ScrnInfoPtr, unsigned long);
 void VIAInitPool(VIAPtr, unsigned long, unsigned long);
 
+/* In via_tuner.c */
+void ViaTunerStandard(ViaTunerPtr, int);
+void ViaTunerBrightness(ViaTunerPtr, int);
+void ViaTunerContrast(ViaTunerPtr, int);
+void ViaTunerHue(ViaTunerPtr, int);
+void ViaTunerLuminance(ViaTunerPtr, int);
+void ViaTunerSaturation(ViaTunerPtr, int);
+void ViaTunerInput(ViaTunerPtr, int);
+#define MODE_TV		0
+#define MODE_SVIDEO	1
+#define MODE_COMPOSITE	2
+
+void ViaTunerChannel(ViaTunerPtr, int, int);
+void ViaAudioSelect(VIAPtr pVia, int tuner);
+void ViaAudioInit(VIAPtr pVia);
+void ViaAudioMode(VIAPtr pVia, int mode);
+void ViaAudioMute(VIAPtr pVia, int mute);
+void ViaTunerProbe(ScrnInfoPtr pScrn);
+void ViaTunerDestroy(ScrnInfoPtr pScrn);
+
+
 #endif /* _VIA_DRIVER_H_ */

Index: via_i2c.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_i2c.c,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_i2c.c	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via_i2c.c	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_i2c.c,v 1.3 2003/08/27 15:16:09 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_i2c.c,v 1.4 2003/12/31 05:42:05 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -81,7 +81,8 @@
     *data  = (reg & DDC_SDA_READ_MASK) != 0;
 }
 
-/* Function for DVI DDC2 */
+/* Function for DVI DDC2. Also used for the tuner and TV IC's */
+
 static void
 VIAI2C2PutBits(I2CBusPtr b, int clock,  int data)
 {

Index: via_memory.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_memory.c,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_memory.c	19 Dec 2003 20:55:20 -0000	1.1
+++ b/via_memory.c	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -20,7 +20,7 @@
  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_memory.c,v 1.2 2003/12/18 04:05:58 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_memory.c,v 1.5 2004/01/29 03:13:25 dawes Exp $ */
 
 #include "xf86.h"
 #include "xf86_OSproc.h"
@@ -66,10 +66,13 @@
 			mem->pool = 0;
 			return;
 		case 2:
+#ifdef XF86DRI
 			if(drmCommandWrite(mem->drm_fd, DRM_VIA_FREEMEM,
 					&mem->drm, sizeof(drmViaMem)) < 0)
 				ErrorF("DRM module failed free.\n");
-			drmClose(mem->drm_fd);
+			/* Don't close the global drmFD on each memory free! */
+			/* drmClose(mem->drm_fd); */
+#endif
 			mem->pool = 0;
 			return;
 		case 3:
@@ -82,7 +85,7 @@
 
 unsigned long VIAAllocLinear(VIAMemPtr mem, ScrnInfoPtr pScrn, unsigned long size)
 {
-#if defined(XF86DRI) || !defined(XFREE_44)
+#if defined(XF86DRI) || !defined(XFREE86_44)
 	VIAPtr  pVia = VIAPTR(pScrn);
 #endif
 	
@@ -111,10 +114,12 @@
 	}
 #endif
 
-#ifdef XFREE_44
+#ifdef XFREE86_44
 	{
 		int depth = (pScrn->bitsPerPixel + 7) >> 3;
-		mem->linear = xf86AllocateOffscreenLinear(pScrn->pScreen, size/depth,
+		/* Make sure we don't truncate requested size */
+		mem->linear = xf86AllocateOffscreenLinear(pScrn->pScreen, 
+			( size + depth - 1 ) / depth,
 			32, NULL, NULL, NULL);
 		if(mem->linear == NULL)
 		{

Index: via_mode.h
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.h,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_mode.h	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via_mode.h	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.h,v 1.3 2003/08/27 15:16:09 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.h,v 1.4 2004/02/09 01:45:23 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -132,9 +132,9 @@
     { 512, 384, 8, 0X25, 3, 0X432E, 0XC53F, { 64, 47, 8, 0XFFFF, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X4D, 0X3F, 0X3F, 0X91, 0X42, 0X9, 0X92, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X80, 0X3, 0X7F, 0X40, 0X40, 0X7F, 0X93, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } },
     { 512, 384, 16, 0X26, 6, 0X432E, 0XC53F, { 64, 47, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X4D, 0X3F, 0X3F, 0X91, 0X42, 0X9, 0X92, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X80, 0X3, 0X7F, 0X80, 0X40, 0X7F, 0X93, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0X26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 } },
     { 512, 384, 32, 0X27, 12, 0X432E, 0XC53F, { 64, 47, 8, 0X8000, { 0, 0X1, 0XF, 0, 0XE }, 0X4F, { 0X4D, 0X3F, 0X3F, 0X91, 0X42, 0X9, 0X92, 0X1F, 0, 0X40, 0X1E, 0, 0, 0, 0, 0, 0X80, 0X3, 0X7F, 0, 0X40, 0X7F, 0X93, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0X27, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X26, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 } },
-    { 576, 1024, 8, 0X14, 9, 0X432E, 0XC4E9, { 128, 35, 16, 0XFFFF, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0X80, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } },
-    { 576, 1024, 16, 0X15, 18, 0X432E, 0XC4E9, { 128, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } },
-    { 576, 1024, 32, 0X16, 36, 0X432E, 0XC4E9, { 128, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X6, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }
+    { 1024, 576, 8, 0X14, 9, 0X432E, 0XC4E9, { 128, 35, 16, 0XFFFF, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0X80, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X22, 0XC, 0X1F, 0X4C, 0X6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } },
+    { 1024, 576, 16, 0X15, 18, 0X432E, 0XC4E9, { 128, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XB6, 0XC, 0X1F, 0X4C, 0X6, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } },
+    { 1024, 576, 32, 0X16, 36, 0X432E, 0XC4E9, { 128, 35, 16, 0X8000, { 0, 0X1, 0XF, 0X3, 0XE }, 0X4F, { 0X9F, 0X7F, 0X7F, 0X83, 0X85, 0X92, 0X53, 0XF0, 0, 0X60, 0X1E, 0, 0, 0, 0, 0, 0X40, 0X3, 0X3F, 0, 0, 0X3F, 0X54, 0XE3, 0XFF }, { 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X8, 0X9, 0XA, 0XB, 0XC, 0XD, 0XE, 0XF, 0X41, 0, 0XF, 0 }, { 0, 0, 0, 0, 0, 0X40, 0X5, 0XF, 0XFF } }, { { 0XC4, 0XC4, 0XC4, 0XC4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0X16, 0X17, 0X18, 0X33, 0X35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFE, 0XBF, 0XFF, 0XFF, 0X7, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0XC, 0X1F, 0X4C, 0X6, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 } }
 };
 
 static const VIABIOSRegTableRec commExtTable = {

Index: via_swov.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_swov.c,v
retrieving revision 1.1.4.1
retrieving revision 1.1.4.2
diff -u -d -r1.1.4.1 -r1.1.4.2
--- a/via_swov.c	20 Dec 2003 00:28:29 -0000	1.1.4.1
+++ b/via_swov.c	23 Feb 2004 21:36:29 -0000	1.1.4.2
@@ -1,5 +1,4 @@
-/* $XdotOrg$ */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_swov.c,v 1.10 2003/12/17 19:01:59 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_swov.c,v 1.11 2004/02/04 04:15:09 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -66,19 +65,18 @@
 {
     VIAPtr  pVia = VIAPTR(pScrn);
     unsigned long   dwWidth, dwHeight, dwPitch=0;
-    unsigned long   dwRet=PI_OK;
     unsigned long   size;
     unsigned long   dwAddr;
     unsigned long   HQVFBSIZE = 0, SWFBSIZE = 0;
     int     iCount;        /* iCount for clean HQV FB use */
     unsigned char    *lpTmpAddr;    /* for clean HQV FB use */
     VIAHWRec *hwDiff = &pVia->ViaHW;
-    
+    unsigned long retCode;
     
     DBG_DD(ErrorF("//VIAVidCreateSurface: \n"));
 
     if ( lpDDSurfaceDesc == NULL )
-        return PI_ERR;
+        return BadAccess;
         
     ErrorF("Creating %lu surface\n", lpDDSurfaceDesc->dwFourCC);
 
@@ -121,8 +119,8 @@
             SWFBSIZE = dwPitch*dwHeight;    /*YUYV*/
 
 	    VIAFreeLinear(&pVia->swov.SWOVMem);            
-            if(VIAAllocLinear(&pVia->swov.SWOVMem, pScrn, SWFBSIZE * 2))
-            	return BadAccess;
+            if(Success != (retCode = VIAAllocLinear(&pVia->swov.SWOVMem, pScrn, SWFBSIZE * 2)))
+            	return retCode;
             
             dwAddr = pVia->swov.SWOVMem.base;
             /* fill in the SW buffer with 0x8000 (YUY2-black color) to clear FB buffer*/
@@ -170,8 +168,8 @@
                 size = HQVFBSIZE*2;
             
 	    VIAFreeLinear(&pVia->swov.HQVMem);                
-            if(VIAAllocLinear(&pVia->swov.HQVMem, pScrn, size))
-            	return BadAccess;
+            if(Success != (retCode = VIAAllocLinear(&pVia->swov.HQVMem, pScrn, size)))
+            	return retCode;
             dwAddr = pVia->swov.HQVMem.base;
 /*            dwAddr = pVia->swov.SWOVlinear->offset * depth + SWOVFBSIZE; */
 
@@ -253,8 +251,8 @@
             SWFBSIZE = dwPitch * dwHeight * 1.5;    /* 1.5 bytes per pixel */
 
 	    VIAFreeLinear(&pVia->swov.SWfbMem);                
-	    if(VIAAllocLinear(&pVia->swov.SWfbMem, pScrn, 2 * SWFBSIZE))
-	    	return BadAccess;
+	    if(Success != (retCode = VIAAllocLinear(&pVia->swov.SWfbMem, pScrn, 2 * SWFBSIZE)))
+	    	return retCode;
 	    dwAddr = pVia->swov.SWfbMem.base;
 	    
 	    DEBUG(ErrorF("dwAddr for SWfbMem is %lu\n", dwAddr));
@@ -316,8 +314,8 @@
                 size = HQVFBSIZE * 2;
 
 	    VIAFreeLinear(&pVia->swov.HQVMem);                
-	    if(VIAAllocLinear(&pVia->swov.HQVMem, pScrn, size))
-	    	return BadAccess;
+	    if(Success != (retCode = VIAAllocLinear(&pVia->swov.HQVMem, pScrn, size)))
+	    	return retCode;
             
             dwAddr = pVia->swov.HQVMem.base;
 	    DEBUG(ErrorF("dwAddr for HQV is %lu\n", dwAddr));
@@ -359,7 +357,7 @@
             break;
     }
 
-    return dwRet;
+    return Success;
 
 } /*VIAVidCreateSurface*/
 

Index: via_utility.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_utility.c,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_utility.c	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via_utility.c	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_utility.c,v 1.4 2003/11/03 05:11:46 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_utility.c,v 1.5 2003/12/31 05:42:05 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -34,7 +34,7 @@
 {
     VIAPtr pVia = VIAPTR(pScrn);
     VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo;
-    UTUSERSETTINGptr pUTUSERSETTING = pBIOSInfo->pUTUSERSETTING;
+    VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting;
     VIAModeTablePtr pViaModeTable = pBIOSInfo->pModeTable;
     CARD8 *TV = NULL;
     int i, HPos, VPos, ADWHS, ADWHE;
@@ -42,20 +42,15 @@
     CARD32 dwFunc, dwAction = 0, dwInData = 0;
     UTBIOSVERSION pUTBIOSVERSION;
     UTBIOSDATE pUTBIOSDATE;
-    UTDriverVersion pUTDriverVersion;
     UTPANELINFO pUTPANELINFO;
     UTXYVALUE MaxViewSizeValue, ViewSizeValue, MaxViewPosValue, ViewPosValue;
     UTSETTVTUNINGINFO pUTSETTVTUNINGINFO;
     UTSETTVITEMSTATE pUTSETTVITEMSTATE;
     UTGAMMAINFO pUTGAMMAINFO;
-    char DISPLAY_DRIVER_NAME[] = "via_drv.o\0";
-    char VDO_CAPTURE_DRIVER_NAME[] = "via_v4l_drv.o\0";
-    char HWOVERLAY_DRIVER_NAME[] = "libddmpeg.a\0";
     CARD32 dwVideoRam, dwSupportState = 0, dwConnectState = 0, dwActiveState = 0;
     CARD32 dwSAMMState, dwRotateState = 0, dwExpandState, dwStandard = 0;
     CARD32 dwSignalType, dwMaxValue, dwItemID = 0, dwValue, dwState;
     CARD32 value;
-    CARD16 szDriverName[16];
     long dwUTRetOK = 1, dwUTRetFail = 0, dwUTRetNoFunc = -1;
     unsigned char *InParam;
     I2CDevPtr dev = NULL;
@@ -64,7 +59,7 @@
 
     WaitIdle();
 
-    if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) && (!pUTUSERSETTING->DefaultSetting)) {
+    if ((pBIOSInfo->ActiveDevice & VIA_DEVICE_TV) && (!pUserSetting->DefaultSetting)) {
 	VIAUTGetInfo(pBIOSInfo);
     }
 
@@ -259,82 +254,6 @@
 	    break;
 	}
 	break;
-    case UT_XV_FUNC_DRIVER:
-	switch (dwAction) {
-	case UT_XV_FUNC_DRIVER_GetFileName:
-	    InParam += 4;
-	    dwInData = *((CARD32 *) InParam);
-	    switch (dwInData) {
-	    case DISPLAY_DRIVER:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
-		memcpy((void *) szDriverName, (void *) DISPLAY_DRIVER_NAME, sizeof(DISPLAY_DRIVER_NAME));
-		InParam += 4;
-		memcpy((void *) InParam, &szDriverName, sizeof(szDriverName));
-		break;
-	    case VIDEO_CAPTURE_DRIVER:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
-		memcpy((void *) szDriverName, (void *) VDO_CAPTURE_DRIVER_NAME, sizeof(VDO_CAPTURE_DRIVER_NAME));
-		InParam += 4;
-		memcpy((void *) InParam, &szDriverName, sizeof(szDriverName));
-		break;
-	    case HWOVERLAY_DRIVER:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
-		memcpy((void *) szDriverName, (void *) HWOVERLAY_DRIVER_NAME, sizeof(HWOVERLAY_DRIVER_NAME));
-		InParam += 4;
-		memcpy((void *) InParam, &szDriverName, sizeof(szDriverName));
-		break;
-	    default:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
-		break;
-	    }
-	    break;
-	case UT_XV_FUNC_DRIVER_GetFileVersion:
-	    InParam += 4;
-	    dwInData = *((CARD32 *) InParam);
-	    switch (dwInData) {
-	    case DISPLAY_DRIVER:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
-		pUTDriverVersion.dwMajorNum = VERSION_MAJOR;
-		pUTDriverVersion.dwMinorNum = VERSION_MINOR;
-		pUTDriverVersion.dwReversionNum = PATCHLEVEL;
-		InParam += 4;
-		memcpy((void *) InParam, &pUTDriverVersion, sizeof(UTDriverVersion));
-		break;
-	    case VIDEO_CAPTURE_DRIVER:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
-		pUTDriverVersion.dwMajorNum = 4;
-		pUTDriverVersion.dwMinorNum = 1;
-		pUTDriverVersion.dwReversionNum = 30;
-		InParam += 4;
-		memcpy((void *) InParam, &pUTDriverVersion, sizeof(UTDriverVersion));
-		break;
-	    case HWOVERLAY_DRIVER:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
-		pUTDriverVersion.dwMajorNum = 4;
-		pUTDriverVersion.dwMinorNum = 1;
-		pUTDriverVersion.dwReversionNum = 30;
-		InParam += 4;
-		memcpy((void *) InParam, &pUTDriverVersion, sizeof(UTDriverVersion));
-		break;
-	    default:
-		InParam = buf + 8;
-		memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
-		break;
-	    }
-	    break;
-	default:
-	    memcpy((void *) InParam, &dwUTRetFail, sizeof(CARD32));
-	    ErrorF(" via_utility.c : dwAction not supported\n");
-	    break;
-	}
-	break;
     case UT_XV_FUNC_DEVICE:
 	switch (dwAction) {
 	case UT_XV_FUNC_DEVICE_GetSupportState:
@@ -687,53 +606,6 @@
 	    memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 	    break;
 
-	    /*switch (pBIOSInfo->TVEncoder) {
-	       case VIA_TV2PLUS :
-	       if (ViewSizeValue.dwY == 0xFFFF)
-	       pBIOSInfo->TVVScan = VIA_TVNORMAL;
-	       else
-	       pBIOSInfo->TVVScan = (int)ViewSizeValue.dwY - 1;
-	       VIAPreSetTV2Mode(pBIOSInfo);
-	       VIAPostSetTV2Mode(pBIOSInfo);
-	       InParam = buf + 8;
-	       memcpy((void *)InParam, &dwUTRetOK, sizeof(CARD32));
-	       break;
-	       case VIA_TV3 :
-	       if (ViewSizeValue.dwY == 0xFFFF)
-	       pBIOSInfo->TVVScan = VIA_TVNORMAL;
-	       else
-	       pBIOSInfo->TVVScan = (int)ViewSizeValue.dwY - 1;
-	       VIAPreSetTV3Mode(pBIOSInfo);
-	       VIAPostSetTV3Mode(pBIOSInfo);
-	       InParam = buf + 8;
-	       memcpy((void *)InParam, &dwUTRetOK, sizeof(CARD32));
-	       break;
-	       case VIA_CH7009:
-	       case VIA_CH7019:
-	       if (ViewSizeValue.dwY == 0xFFFF)
-	       pBIOSInfo->TVVScan = VIA_TVNORMAL;
-	       else
-	       pBIOSInfo->TVVScan = (int)ViewSizeValue.dwY - 1;
-	       VIAPreSetCH7019Mode(pBIOSInfo);
-	       VIAPostSetCH7019Mode(pBIOSInfo);
-	       InParam = buf + 8;
-	       memcpy((void *)InParam, &dwUTRetOK, sizeof(CARD32));
-	       break;
-	       case VIA_SAA7108:
-	       if (ViewSizeValue.dwY == 0xFFFF)
-	       pBIOSInfo->TVVScan = VIA_TVNORMAL;
-	       else
-	       pBIOSInfo->TVVScan = (int)ViewSizeValue.dwY - 1;
-	       VIAPreSetSAA7108Mode(pBIOSInfo);
-	       VIAPostSetSAA7108Mode(pBIOSInfo);
-	       InParam = buf + 8;
-	       memcpy((void *)InParam, &dwUTRetOK, sizeof(CARD32));
-	       break;
-	       default :
-	       InParam = buf + 8;
-	       memcpy((void *)InParam, &dwUTRetFail, sizeof(CARD32));
-	       break;
-	       } */
 	case UT_XV_FUNC_TV_GetMaxViewPositionValue:
 	    switch (pBIOSInfo->TVEncoder) {
 	    case VIA_TV2PLUS:
@@ -782,8 +654,8 @@
 		    ViewPosValue.dwX = 6;
 		    ViewPosValue.dwY = 6;
 		} else {
-		    ViewPosValue.dwX = pUTUSERSETTING->UT_TV_HPOSITION;
-		    ViewPosValue.dwY = pUTUSERSETTING->UT_TV_VPOSITION;
+		    ViewPosValue.dwX = pUserSetting->tvHPosition;
+		    ViewPosValue.dwY = pUserSetting->tvVPosition;
 		}
 		break;
 	    case VIA_SAA7108:
@@ -791,8 +663,8 @@
 		    ViewPosValue.dwX = 6;
 		    ViewPosValue.dwY = 6;
 		} else {
-		    ViewPosValue.dwX = pUTUSERSETTING->UT_TV_HPOSITION;
-		    ViewPosValue.dwY = pUTUSERSETTING->UT_TV_VPOSITION;
+		    ViewPosValue.dwX = pUserSetting->tvHPosition;
+		    ViewPosValue.dwY = pUserSetting->tvVPosition;
 		}
 		break;
 	    case VIA_FS454:
@@ -820,8 +692,8 @@
 		if (xf86I2CDevInit(dev)) {
 		    switch (pBIOSInfo->TVEncoder) {
 		    case VIA_TV2PLUS:
-			pUTUSERSETTING->UT_TV_HPOSITION = 0;
-			pUTUSERSETTING->UT_TV_VPOSITION = 0;
+			pUserSetting->tvHPosition = 0;
+			pUserSetting->tvVPosition = 0;
 			break;
 		    case VIA_TV3:
 		    case VIA_VT1622A:
@@ -834,12 +706,12 @@
 			    W_Buffer[2] = TV[0x09];
 			    xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
 			    /*value = TV[0x1C];
-			       pUTUSERSETTING->UT_TV_HPOSITION = TV[0x08] & 0xFF;
-			       pUTUSERSETTING->UT_TV_HPOSITION |= (value & 0x04) << 6;
-			       pUTUSERSETTING->UT_TV_VPOSITION = TV[0x09] & 0xFF;
-			       pUTUSERSETTING->UT_TV_VPOSITION |= (value & 0x02) << 7; */
-			    pUTUSERSETTING->UT_TV_HPOSITION = 6;
-			    pUTUSERSETTING->UT_TV_VPOSITION = 6;
+			       pUserSetting->tvHPosition = TV[0x08] & 0xFF;
+			       pUserSetting->tvHPosition |= (value & 0x04) << 6;
+			       pUserSetting->tvVPosition = TV[0x09] & 0xFF;
+			       pUserSetting->tvVPosition |= (value & 0x02) << 7; */
+			    pUserSetting->tvHPosition = 6;
+			    pUserSetting->tvVPosition = 6;
 			} else {
 			    W_Buffer[0] = 0x08;
 			    xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 2);
@@ -850,8 +722,8 @@
 			    HPos |= (R_Buffer[0] & 0x04) << 6;
 			    VPos |= (R_Buffer[0] & 0x02) << 7;
 
-			    HPos += ViewPosValue.dwX - pUTUSERSETTING->UT_TV_HPOSITION;
-			    VPos += ViewPosValue.dwY - pUTUSERSETTING->UT_TV_VPOSITION;
+			    HPos += ViewPosValue.dwX - pUserSetting->tvHPosition;
+			    VPos += ViewPosValue.dwY - pUserSetting->tvVPosition;
 
 			    W_Buffer[0] = 0x08;
 			    W_Buffer[1] = HPos & 0xFF;
@@ -864,8 +736,8 @@
 			    W_Buffer[1] |= (VPos >> 7) & 0x02;
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 
-			    pUTUSERSETTING->UT_TV_HPOSITION = ViewPosValue.dwX;
-			    pUTUSERSETTING->UT_TV_VPOSITION = ViewPosValue.dwY;
+			    pUserSetting->tvHPosition = ViewPosValue.dwX;
+			    pUserSetting->tvVPosition = ViewPosValue.dwY;
 			}
 			break;
 		    case VIA_SAA7108:
@@ -890,8 +762,8 @@
 			    W_Buffer[0] = 0x71;
 			    W_Buffer[1] = TV[0x71];
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
-			    pUTUSERSETTING->UT_TV_HPOSITION = 6;
-			    pUTUSERSETTING->UT_TV_VPOSITION = 6;
+			    pUserSetting->tvHPosition = 6;
+			    pUserSetting->tvVPosition = 6;
 			} else {
 			    for (i = 0; i < 3; i++) {
 				W_Buffer[0] = VIASAA7108PostionOffset[i];
@@ -905,7 +777,7 @@
 			    xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 3);
 			    ADWHS = R_Buffer[0] | ((R_Buffer[2] & 0x07) << 8);
 			    ADWHE = R_Buffer[1] | ((R_Buffer[2] & 0x70) << 4);
-			    switch (ViewPosValue.dwX - pUTUSERSETTING->UT_TV_HPOSITION) {
+			    switch (ViewPosValue.dwX - pUserSetting->tvHPosition) {
 			    case 1:	/* Moving Right by 1 unit */
 				ADWHS++;
 				ADWHE++;
@@ -941,16 +813,16 @@
 			    default:
 				break;
 			    }
-			    pUTUSERSETTING->UT_TV_HPOSITION = ViewPosValue.dwX;
-			    pUTUSERSETTING->UT_TV_VPOSITION = ViewPosValue.dwY;
+			    pUserSetting->tvHPosition = ViewPosValue.dwX;
+			    pUserSetting->tvVPosition = ViewPosValue.dwY;
 			}
 			break;
 		    case VIA_FS454:
 		    case VIA_CH7009:
 		    case VIA_CH7019:
 		    default:
-			pUTUSERSETTING->UT_TV_HPOSITION = 0;
-			pUTUSERSETTING->UT_TV_VPOSITION = 0;
+			pUserSetting->tvHPosition = 0;
+			pUserSetting->tvVPosition = 0;
 			break;
 		    }
 		    xf86DestroyI2CDevRec(dev, TRUE);
@@ -1135,32 +1007,32 @@
 	    dwInData = *((CARD32 *) InParam);
 	    switch (dwInData) {
 	    case UT_TV_TUNING_FFILTER:
-		dwValue = pUTUSERSETTING->UT_TV_FFILTER;
+		dwValue = pUserSetting->tvFFilter;
 		InParam = buf + 8;
 		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 		break;
 	    case UT_TV_TUNING_ADAPTIVE_FFILTER:
-		dwValue = pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER;
+		dwValue = pUserSetting->tvAdaptiveFFilter;
 		InParam = buf + 8;
 		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 		break;
 	    case UT_TV_TUNING_BRIGHTNESS:
-		dwValue = pUTUSERSETTING->UT_TV_BRIGHTNESS;
+		dwValue = pUserSetting->tvBrightness;
 		InParam = buf + 8;
 		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 		break;
 	    case UT_TV_TUNING_CONTRAST:
-		dwValue = pUTUSERSETTING->UT_TV_CONTRAST;
+		dwValue = pUserSetting->tvContrast;
 		InParam = buf + 8;
 		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 		break;
 	    case UT_TV_TUNING_SATURATION:
-		dwValue = pUTUSERSETTING->UT_TV_SATURATION;
+		dwValue = pUserSetting->tvSaturation;
 		InParam = buf + 8;
 		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 		break;
 	    case UT_TV_TUNING_TINT:
-		dwValue = pUTUSERSETTING->UT_TV_TINT;
+		dwValue = pUserSetting->tvTint;
 		InParam = buf + 8;
 		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 		break;
@@ -1187,7 +1059,7 @@
 		    if (xf86I2CDevInit(dev)) {
 			switch (pBIOSInfo->TVEncoder) {
 			case VIA_TV2PLUS:
-			    pUTUSERSETTING->UT_TV_FFILTER = 0;
+			    pUserSetting->tvFFilter = 0;
 			    break;
 			case VIA_TV3:
 			case VIA_VT1622A:
@@ -1195,15 +1067,15 @@
 			    if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
 				W_Buffer[0] = 0x03;
 				W_Buffer[1] = TV[0x03];
-				pUTUSERSETTING->UT_TV_FFILTER = TV[0x03] & 0x03;
-				if (pUTUSERSETTING->UT_TV_FFILTER == 0)
-				    pUTUSERSETTING->ADAPTIVE_FFILTER_ON = TRUE;
+				pUserSetting->tvFFilter = TV[0x03] & 0x03;
+				if (pUserSetting->tvFFilter == 0)
+				    pUserSetting->AdaptiveFilterOn = TRUE;
 			    } else {
 				W_Buffer[0] = 0x03;
 				xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
 				W_Buffer[1] = R_Buffer[0] & ~0x03;
 				W_Buffer[1] |= pUTSETTVTUNINGINFO.dwValue;
-				pUTUSERSETTING->UT_TV_FFILTER = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvFFilter = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 			    break;
@@ -1211,20 +1083,20 @@
 			    if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
 				W_Buffer[0] = 0x37;
 				W_Buffer[1] = TV[0x37];
-				pUTUSERSETTING->UT_TV_FFILTER = (TV[0x37] & 0x30) + 1;
+				pUserSetting->tvFFilter = (TV[0x37] & 0x30) + 1;
 			    } else {
 				W_Buffer[0] = 0x37;
 				xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
 				W_Buffer[1] = R_Buffer[0] & ~0x30;
 				W_Buffer[1] |= (unsigned char) (pUTSETTVTUNINGINFO.dwValue - 1);
-				pUTUSERSETTING->UT_TV_FFILTER = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvFFilter = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    break;
 			case VIA_CH7009:
 			case VIA_CH7019:
 			case VIA_FS454:
 			default:
-			    pUTUSERSETTING->UT_TV_FFILTER = 0;
+			    pUserSetting->tvFFilter = 0;
 			    break;
 			}
 
@@ -1250,7 +1122,7 @@
 		    if (xf86I2CDevInit(dev)) {
 			switch (pBIOSInfo->TVEncoder) {
 			case VIA_TV2PLUS:
-			    pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = 0;
+			    pUserSetting->tvAdaptiveFFilter = 0;
 			    break;
 			case VIA_TV3:
 			case VIA_VT1622A:
@@ -1258,11 +1130,11 @@
 			    if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
 				W_Buffer[0] = 0x61;
 				W_Buffer[1] = TV[0x61];
-				pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = TV[0x61] & 0xFF;
+				pUserSetting->tvAdaptiveFFilter = TV[0x61] & 0xFF;
 			    } else {
 				W_Buffer[0] = 0x61;
 				W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue;
-				pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvAdaptiveFFilter = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 			    break;
@@ -1271,7 +1143,7 @@
 			case VIA_CH7009:
 			case VIA_CH7019:
 			default:
-			    pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = 0;
+			    pUserSetting->tvAdaptiveFFilter = 0;
 			    break;
 			}
 			xf86DestroyI2CDevRec(dev, TRUE);
@@ -1296,7 +1168,7 @@
 		    if (xf86I2CDevInit(dev)) {
 			switch (pBIOSInfo->TVEncoder) {
 			case VIA_TV2PLUS:
-			    pUTUSERSETTING->UT_TV_BRIGHTNESS = 0;
+			    pUserSetting->tvBrightness = 0;
 			    break;
 			case VIA_TV3:
 			case VIA_VT1622A:
@@ -1304,10 +1176,10 @@
 			    W_Buffer[0] = 0x0B;
 			    if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
 				W_Buffer[1] = TV[0x0B];
-				pUTUSERSETTING->UT_TV_BRIGHTNESS = TV[0x0B] & 0xFF;
+				pUserSetting->tvBrightness = TV[0x0B] & 0xFF;
 			    } else {
 				W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue;
-				pUTUSERSETTING->UT_TV_BRIGHTNESS = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvBrightness = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 			    break;
@@ -1316,7 +1188,7 @@
 			case VIA_CH7009:
 			case VIA_CH7019:
 			default:
-			    pUTUSERSETTING->UT_TV_BRIGHTNESS = 0;
+			    pUserSetting->tvBrightness = 0;
 			    break;
 			}
 
@@ -1342,7 +1214,7 @@
 		    if (xf86I2CDevInit(dev)) {
 			switch (pBIOSInfo->TVEncoder) {
 			case VIA_TV2PLUS:
-			    pUTUSERSETTING->UT_TV_CONTRAST = 0;
+			    pUserSetting->tvContrast = 0;
 			    break;
 			case VIA_TV3:
 			case VIA_VT1622A:
@@ -1350,10 +1222,10 @@
 			    W_Buffer[0] = 0x0C;
 			    if (pUTSETTVTUNINGINFO.dwValue == 0xFFFF) {
 				W_Buffer[1] = TV[0x0C];
-				pUTUSERSETTING->UT_TV_CONTRAST = TV[0x0C] & 0xFF;
+				pUserSetting->tvContrast = TV[0x0C] & 0xFF;
 			    } else {
 				W_Buffer[1] = (unsigned char) pUTSETTVTUNINGINFO.dwValue;
-				pUTUSERSETTING->UT_TV_CONTRAST = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvContrast = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 			    break;
@@ -1362,7 +1234,7 @@
 			case VIA_CH7009:
 			case VIA_CH7019:
 			default:
-			    pUTUSERSETTING->UT_TV_CONTRAST = 0;
+			    pUserSetting->tvContrast = 0;
 			    break;
 			}
 
@@ -1388,7 +1260,7 @@
 		    if (xf86I2CDevInit(dev)) {
 			switch (pBIOSInfo->TVEncoder) {
 			case VIA_TV2PLUS:
-			    pUTUSERSETTING->UT_TV_SATURATION = 0;
+			    pUserSetting->tvSaturation = 0;
 			    break;
 			case VIA_TV3:
 			case VIA_VT1622A:
@@ -1400,15 +1272,15 @@
 				W_Buffer[0] = 0x0A;
 				W_Buffer[1] = TV[0x0A];
 				value = TV[0x0D];
-				pUTUSERSETTING->UT_TV_SATURATION = TV[0x0A] & 0xFF;
-				pUTUSERSETTING->UT_TV_SATURATION |= value << 8;
+				pUserSetting->tvSaturation = TV[0x0A] & 0xFF;
+				pUserSetting->tvSaturation |= value << 8;
 			    } else {
 				W_Buffer[0] = 0x0D;
 				W_Buffer[1] = (unsigned char) ((pUTSETTVTUNINGINFO.dwValue >> 8) & 0xFF);
 				xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 				W_Buffer[0] = 0x0A;
 				W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF);
-				pUTUSERSETTING->UT_TV_SATURATION = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvSaturation = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
 			    break;
@@ -1417,7 +1289,7 @@
 			case VIA_CH7009:
 			case VIA_CH7019:
 			default:
-			    pUTUSERSETTING->UT_TV_SATURATION = 0;
+			    pUserSetting->tvSaturation = 0;
 			    break;
 			}
 
@@ -1447,8 +1319,8 @@
 				W_Buffer[0] = 0x10;
 				W_Buffer[1] = TV[0x10];
 				W_Buffer[2] = TV[0x11];
-				pUTUSERSETTING->UT_TV_TINT = TV[0x10] & 0xFF;
-				pUTUSERSETTING->UT_TV_TINT |= (TV[0x11] & 0xE0) << 3;
+				pUserSetting->tvTint = TV[0x10] & 0xFF;
+				pUserSetting->tvTint |= (TV[0x11] & 0xE0) << 3;
 			    } else {
 				W_Buffer[0] = 0x11;
 				xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
@@ -1456,7 +1328,7 @@
 				W_Buffer[2] |= (unsigned char) ((pUTSETTVTUNINGINFO.dwValue >> 3) & 0xFF);
 				W_Buffer[0] = 0x10;
 				W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF);
-				pUTUSERSETTING->UT_TV_TINT = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvTint = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
 			    break;
@@ -1468,8 +1340,8 @@
 				W_Buffer[1] = TV[0x10];
 				W_Buffer[2] = TV[0x11];
 				value = TV[0x11];
-				pUTUSERSETTING->UT_TV_TINT = TV[0x10] & 0xFF;
-				pUTUSERSETTING->UT_TV_TINT |= TV[0x11] << 8;
+				pUserSetting->tvTint = TV[0x10] & 0xFF;
+				pUserSetting->tvTint |= TV[0x11] << 8;
 			    } else {
 				W_Buffer[0] = 0x11;
 				xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
@@ -1477,7 +1349,7 @@
 				W_Buffer[2] |= (unsigned char) (pUTSETTVTUNINGINFO.dwValue >> 8) & 0xFF;
 				W_Buffer[0] = 0x10;
 				W_Buffer[1] = (unsigned char) (pUTSETTVTUNINGINFO.dwValue & 0xFF);
-				pUTUSERSETTING->UT_TV_TINT = pUTSETTVTUNINGINFO.dwValue;
+				pUserSetting->tvTint = pUTSETTVTUNINGINFO.dwValue;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 3, NULL, 0);
 			    break;
@@ -1486,7 +1358,7 @@
 			case VIA_CH7009:
 			case VIA_CH7019:
 			default:
-			    pUTUSERSETTING->UT_TV_TINT = 0;
+			    pUserSetting->tvTint = 0;
 			    break;
 			}
 
@@ -1536,7 +1408,7 @@
 	    dwInData = *((CARD32 *) InParam);
 	    switch (dwInData) {
 	    case UT_TV_SETTING_FFILTER:
-		if (pUTUSERSETTING->UT_TV_FFILTER)
+		if (pUserSetting->tvFFilter)
 		    dwState = UT_STATE_ON;
 		else
 		    dwState = UT_STATE_OFF;
@@ -1544,7 +1416,7 @@
 		memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 		break;
 	    case UT_TV_SETTING_ADAPTIVE_FFILTER:
-		if (pUTUSERSETTING->UT_TV_FFILTER)
+		if (pUserSetting->tvFFilter)
 		    dwState = UT_STATE_OFF;
 		else
 		    dwState = UT_STATE_ON;
@@ -1603,7 +1475,7 @@
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 			    xf86DestroyI2CDevRec(dev, TRUE);
-			    pUTUSERSETTING->ADAPTIVE_FFILTER_ON = TRUE;
+			    pUserSetting->AdaptiveFilterOn = TRUE;
 			    InParam = buf + 8;
 			    memcpy((void *) InParam, &dwUTRetOK, sizeof(CARD32));
 
@@ -1629,18 +1501,18 @@
 				W_Buffer[0] = 0x03;
 				xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
 				W_Buffer[1] = R_Buffer[0] & ~0x03;
-				W_Buffer[1] |= (unsigned char) (pUTUSERSETTING->UT_TV_FFILTER - 1);
+				W_Buffer[1] |= (unsigned char) (pUserSetting->tvFFilter - 1);
 				break;
 			    case VIA_SAA7108:
 				W_Buffer[0] = 0x37;
 				xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
 				W_Buffer[1] = R_Buffer[0] & ~0x30;
-				W_Buffer[1] |= (unsigned char) ((pUTUSERSETTING->UT_TV_FFILTER - 1) << 4);
+				W_Buffer[1] |= (unsigned char) ((pUserSetting->tvFFilter - 1) << 4);
 				break;
 			    }
 			    xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 			    xf86DestroyI2CDevRec(dev, TRUE);
-			    pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+			    pUserSetting->AdaptiveFilterOn = FALSE;
 			} else {
 			    xf86DestroyI2CDevRec(dev, TRUE);
 			    InParam = buf + 8;
@@ -1663,7 +1535,7 @@
 			if (xf86I2CDevInit(dev)) {
 			    switch (pBIOSInfo->TVEncoder) {
 			    case VIA_TV2PLUS:
-				pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+				pUserSetting->AdaptiveFilterOn = FALSE;
 				break;
 			    case VIA_TV3:
 			    case VIA_VT1622A:
@@ -1672,14 +1544,14 @@
 				W_Buffer[1] = 0x00;
 				xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 				xf86DestroyI2CDevRec(dev, TRUE);
-				pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+				pUserSetting->AdaptiveFilterOn = FALSE;
 				break;
 			    case VIA_SAA7108:
 			    case VIA_FS454:
 			    case VIA_CH7009:
 			    case VIA_CH7019:
 			    default:
-				pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+				pUserSetting->AdaptiveFilterOn = FALSE;
 				break;
 			    }
 			    InParam = buf + 8;
@@ -1700,8 +1572,8 @@
 			if (xf86I2CDevInit(dev)) {
 			    switch (pBIOSInfo->TVEncoder) {
 			    case VIA_TV2PLUS:
-				pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
-				pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = 0;
+				pUserSetting->AdaptiveFilterOn = FALSE;
+				pUserSetting->tvAdaptiveFFilter = 0;
 				break;
 			    case VIA_TV3:
 			    case VIA_VT1622A:
@@ -1711,17 +1583,17 @@
 				W_Buffer[1] = R_Buffer[0] & ~0x03;
 				xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 				W_Buffer[0] = 0x61;
-				W_Buffer[1] = (unsigned char) pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER;
+				W_Buffer[1] = (unsigned char) pUserSetting->tvAdaptiveFFilter;
 				xf86DestroyI2CDevRec(dev, TRUE);
-				pUTUSERSETTING->ADAPTIVE_FFILTER_ON = TRUE;
+				pUserSetting->AdaptiveFilterOn = TRUE;
 				break;
 			    case VIA_SAA7108:
 			    case VIA_FS454:
 			    case VIA_CH7009:
 			    case VIA_CH7019:
 			    default:
-				pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
-				pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = 0;
+				pUserSetting->AdaptiveFilterOn = FALSE;
+				pUserSetting->tvAdaptiveFFilter = 0;
 				break;
 			    }
 			    InParam = buf + 8;
@@ -1894,7 +1766,7 @@
 
 Bool VIAUTGetInfo(VIABIOSInfoPtr pBIOSInfo)
 {
-    UTUSERSETTINGptr pUTUSERSETTING = pBIOSInfo->pUTUSERSETTING;
+    VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting;
     I2CDevPtr dev;
     unsigned char W_Buffer[3];
     unsigned char R_Buffer[2];
@@ -1911,116 +1783,116 @@
 	    case VIA_TV2PLUS:
 	    case VIA_TV3:
 	    case VIA_VT1622A:
-		pUTUSERSETTING->UT_TV_HPOSITION = 6;
-		pUTUSERSETTING->UT_TV_VPOSITION = 6;
+		pUserSetting->tvHPosition = 6;
+		pUserSetting->tvVPosition = 6;
 
 		W_Buffer[0] = 0x03;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_FFILTER = (R_Buffer[0] & 0x03) + 1;
+		pUserSetting->tvFFilter = (R_Buffer[0] & 0x03) + 1;
 
 		W_Buffer[0] = 0x0B;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_BRIGHTNESS = R_Buffer[0];
+		pUserSetting->tvBrightness = R_Buffer[0];
 
 		W_Buffer[0] = 0x0C;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_CONTRAST = R_Buffer[0];
+		pUserSetting->tvContrast = R_Buffer[0];
 
 		W_Buffer[0] = 0x0D;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_SATURATION = R_Buffer[0] << 8;
+		pUserSetting->tvSaturation = R_Buffer[0] << 8;
 		W_Buffer[0] = 0x0A;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_SATURATION += R_Buffer[0];
+		pUserSetting->tvSaturation += R_Buffer[0];
 
 		break;
 	    case VIA_VT1623:
 		VIAGPIOI2C_Initial(pBIOSInfo, 0x40);
-		pUTUSERSETTING->UT_TV_HPOSITION = 6;
-		pUTUSERSETTING->UT_TV_VPOSITION = 6;
+		pUserSetting->tvHPosition = 6;
+		pUserSetting->tvVPosition = 6;
 
 		VIAGPIOI2C_Read(pBIOSInfo, 0x03, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_FFILTER = (R_Buffer[0] & 0x03) + 1;
+		pUserSetting->tvFFilter = (R_Buffer[0] & 0x03) + 1;
 
 		VIAGPIOI2C_Read(pBIOSInfo, 0x0B, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_BRIGHTNESS = R_Buffer[0];
+		pUserSetting->tvBrightness = R_Buffer[0];
 
 		VIAGPIOI2C_Read(pBIOSInfo, 0x0C, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_CONTRAST = R_Buffer[0];
+		pUserSetting->tvContrast = R_Buffer[0];
 
 		VIAGPIOI2C_Read(pBIOSInfo, 0x0D, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_SATURATION = R_Buffer[0] << 8;
+		pUserSetting->tvSaturation = R_Buffer[0] << 8;
 		VIAGPIOI2C_Read(pBIOSInfo, 0x0A, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_SATURATION += R_Buffer[0];
+		pUserSetting->tvSaturation += R_Buffer[0];
 
 		break;
 	    case VIA_SAA7108:
-		pUTUSERSETTING->UT_TV_HPOSITION = 6;
-		pUTUSERSETTING->UT_TV_VPOSITION = 6;
+		pUserSetting->tvHPosition = 6;
+		pUserSetting->tvVPosition = 6;
 
 		W_Buffer[0] = 0x37;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_FFILTER = ((R_Buffer[0] & 0x30) >> 4) + 1;
+		pUserSetting->tvFFilter = ((R_Buffer[0] & 0x30) >> 4) + 1;
 
-		pUTUSERSETTING->UT_TV_BRIGHTNESS = 0;
-		pUTUSERSETTING->UT_TV_CONTRAST = 0;
-		pUTUSERSETTING->UT_TV_SATURATION = 0;
-		pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = 0;
-		pUTUSERSETTING->UT_TV_TINT = 0;
-		pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+		pUserSetting->tvBrightness = 0;
+		pUserSetting->tvContrast = 0;
+		pUserSetting->tvSaturation = 0;
+		pUserSetting->tvAdaptiveFFilter = 0;
+		pUserSetting->tvTint = 0;
+		pUserSetting->AdaptiveFilterOn = FALSE;
 		break;
 	    case VIA_CH7009:
 	    case VIA_CH7019:
 	    case VIA_FS454:
 	    default:
-		pUTUSERSETTING->UT_TV_HPOSITION = 0;
-		pUTUSERSETTING->UT_TV_VPOSITION = 0;
-		pUTUSERSETTING->UT_TV_FFILTER = 0;
-		pUTUSERSETTING->UT_TV_BRIGHTNESS = 0;
-		pUTUSERSETTING->UT_TV_CONTRAST = 0;
-		pUTUSERSETTING->UT_TV_SATURATION = 0;
-		pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = 0;
-		pUTUSERSETTING->UT_TV_TINT = 0;
-		pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+		pUserSetting->tvHPosition = 0;
+		pUserSetting->tvVPosition = 0;
+		pUserSetting->tvFFilter = 0;
+		pUserSetting->tvBrightness = 0;
+		pUserSetting->tvContrast = 0;
+		pUserSetting->tvSaturation = 0;
+		pUserSetting->tvAdaptiveFFilter = 0;
+		pUserSetting->tvTint = 0;
+		pUserSetting->AdaptiveFilterOn = FALSE;
 		break;
 	    }
 	    if (pBIOSInfo->TVEncoder == VIA_TV2PLUS) {
-		pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = 0;
+		pUserSetting->tvAdaptiveFFilter = 0;
 
 		W_Buffer[0] = 0x10;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_TINT = R_Buffer[0];
+		pUserSetting->tvTint = R_Buffer[0];
 		W_Buffer[0] = 0x11;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_TINT += (R_Buffer[0] & 0xE0) << 8;
+		pUserSetting->tvTint += (R_Buffer[0] & 0xE0) << 8;
 	    } else if (pBIOSInfo->TVEncoder == VIA_TV3 || pBIOSInfo->TVEncoder == VIA_VT1622A) {
 		W_Buffer[0] = 0x61;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = R_Buffer[0];
+		pUserSetting->tvAdaptiveFFilter = R_Buffer[0];
 		W_Buffer[0] = 0x10;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_TINT = R_Buffer[0];
+		pUserSetting->tvTint = R_Buffer[0];
 		W_Buffer[0] = 0x11;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_TINT += (R_Buffer[0] & 0x07) << 8;
-		if (pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER && !pUTUSERSETTING->UT_TV_FFILTER)
-		    pUTUSERSETTING->ADAPTIVE_FFILTER_ON = TRUE;
+		pUserSetting->tvTint += (R_Buffer[0] & 0x07) << 8;
+		if (pUserSetting->tvAdaptiveFFilter && !pUserSetting->tvFFilter)
+		    pUserSetting->AdaptiveFilterOn = TRUE;
 		else
-		    pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+		    pUserSetting->AdaptiveFilterOn = FALSE;
 	    } else if (pBIOSInfo->TVEncoder == VIA_VT1623) {
 		VIAGPIOI2C_Read(pBIOSInfo, 0x61, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER = R_Buffer[0];
+		pUserSetting->tvAdaptiveFFilter = R_Buffer[0];
 		VIAGPIOI2C_Read(pBIOSInfo, 0x10, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_TINT = R_Buffer[0];
+		pUserSetting->tvTint = R_Buffer[0];
 		VIAGPIOI2C_Read(pBIOSInfo, 0x11, R_Buffer, 1);
-		pUTUSERSETTING->UT_TV_TINT += (R_Buffer[0] & 0x07) << 8;
-		if (pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER && !pUTUSERSETTING->UT_TV_FFILTER)
-		    pUTUSERSETTING->ADAPTIVE_FFILTER_ON = TRUE;
+		pUserSetting->tvTint += (R_Buffer[0] & 0x07) << 8;
+		if (pUserSetting->tvAdaptiveFFilter && !pUserSetting->tvFFilter)
+		    pUserSetting->AdaptiveFilterOn = TRUE;
 		else
-		    pUTUSERSETTING->ADAPTIVE_FFILTER_ON = FALSE;
+		    pUserSetting->AdaptiveFilterOn = FALSE;
 	    }
 	    xf86DestroyI2CDevRec(dev, TRUE);
-	    pUTUSERSETTING->DefaultSetting = TRUE;
+	    pUserSetting->DefaultSetting = TRUE;
 	} else {
 	    xf86DestroyI2CDevRec(dev, TRUE);
 	    DEBUG(xf86Msg(X_DEFAULT, "DevInit fail!\n"));
@@ -2033,7 +1905,7 @@
 
 Bool VIARestoreUserSetting(VIABIOSInfoPtr pBIOSInfo)
 {
-    UTUSERSETTINGptr pUTUSERSETTING = pBIOSInfo->pUTUSERSETTING;
+    VIAUserSettingPtr pUserSetting = pBIOSInfo->UserSetting;
     I2CDevPtr dev;
     int i, HPos, VPos, ADWHS, ADWHE;
     unsigned char W_Buffer[4], R_Buffer[3];
@@ -2046,8 +1918,8 @@
 	switch (pBIOSInfo->TVEncoder) {
 	case VIA_TV3:
 	case VIA_VT1622A:
-	    if ((pUTUSERSETTING->UT_TV_HPOSITION != 6)
-		|| (pUTUSERSETTING->UT_TV_VPOSITION != 6)) {
+	    if ((pUserSetting->tvHPosition != 6)
+		|| (pUserSetting->tvVPosition != 6)) {
 		W_Buffer[0] = 0x08;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 2);
 		HPos = R_Buffer[0];
@@ -2057,8 +1929,8 @@
 		HPos |= (R_Buffer[0] & 0x04) << 6;
 		VPos |= (R_Buffer[0] & 0x02) << 7;
 
-		HPos += pUTUSERSETTING->UT_TV_HPOSITION - 6;
-		VPos += pUTUSERSETTING->UT_TV_VPOSITION - 6;
+		HPos += pUserSetting->tvHPosition - 6;
+		VPos += pUserSetting->tvVPosition - 6;
 
 		W_Buffer[0] = 0x08;
 		W_Buffer[1] = (unsigned char) (HPos & 0xFF);
@@ -2073,49 +1945,49 @@
 
 	    W_Buffer[0] = 0x03;	/* Fflick */
 	    xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
-	    if (pUTUSERSETTING->ADAPTIVE_FFILTER_ON) {
+	    if (pUserSetting->AdaptiveFilterOn) {
 		W_Buffer[1] = R_Buffer[0] & ~0x03;
 	    } else {
 		W_Buffer[1] = R_Buffer[0] & ~0x03;
-		W_Buffer[1] |= (unsigned char) (pUTUSERSETTING->UT_TV_FFILTER - 1);
+		W_Buffer[1] |= (unsigned char) (pUserSetting->tvFFilter - 1);
 	    }
 	    xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
 
 	    W_Buffer[0] = 0x61;	/* Adaptive Fflick */
-	    W_Buffer[1] = (unsigned char) pUTUSERSETTING->UT_TV_ADAPTIVE_FFILTER;
+	    W_Buffer[1] = (unsigned char) pUserSetting->tvAdaptiveFFilter;
 	    xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
 
 	    W_Buffer[0] = 0x0B;	/* BRIGHTNESS */
-	    W_Buffer[1] = (unsigned char) pUTUSERSETTING->UT_TV_BRIGHTNESS;
+	    W_Buffer[1] = (unsigned char) pUserSetting->tvBrightness;
 	    xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
 
 	    W_Buffer[0] = 0x0C;	/* CONTRAST */
-	    W_Buffer[1] = (unsigned char) pUTUSERSETTING->UT_TV_CONTRAST;
+	    W_Buffer[1] = (unsigned char) pUserSetting->tvContrast;
 	    xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
 
 	    W_Buffer[0] = 0x0D;	/* SATURATION highbyte */
-	    W_Buffer[1] = (unsigned char) (pUTUSERSETTING->UT_TV_SATURATION >> 8);
+	    W_Buffer[1] = (unsigned char) (pUserSetting->tvSaturation >> 8);
 	    xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
 	    W_Buffer[0] = 0x0A;	/* SATURATION lowbyte */
-	    W_Buffer[1] = (unsigned char) pUTUSERSETTING->UT_TV_SATURATION & 0xFF;
+	    W_Buffer[1] = (unsigned char) pUserSetting->tvSaturation & 0xFF;
 	    xf86I2CWriteRead(dev, W_Buffer, 2, R_Buffer, 0);
 
 	    W_Buffer[0] = 0x11;	/* TINT highbyte */
 	    xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
 	    W_Buffer[2] = R_Buffer[0] & ~0xE0;
-	    W_Buffer[2] |= (unsigned char) (pUTUSERSETTING->UT_TV_TINT >> 8);
+	    W_Buffer[2] |= (unsigned char) (pUserSetting->tvTint >> 8);
 	    W_Buffer[0] = 0x10;	/* TINT lowbyte */
-	    W_Buffer[1] = (unsigned char) pUTUSERSETTING->UT_TV_TINT & 0xFF;
+	    W_Buffer[1] = (unsigned char) pUserSetting->tvTint & 0xFF;
 	    xf86I2CWriteRead(dev, W_Buffer, 3, R_Buffer, 0);
 	    break;
 	case VIA_SAA7108:
-	    if ((pUTUSERSETTING->UT_TV_HPOSITION - 6) != 0) {
+	    if ((pUserSetting->tvHPosition - 6) != 0) {
 		W_Buffer[0] = 0x70;
 		xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 3);
 		ADWHS = (R_Buffer[0] | ((R_Buffer[2] & 0x07) << 8))
-		    + (pUTUSERSETTING->UT_TV_HPOSITION - 6);
+		    + (pUserSetting->tvHPosition - 6);
 		ADWHE = (R_Buffer[1] | ((R_Buffer[2] & 0x70) << 4))
-		    + (pUTUSERSETTING->UT_TV_HPOSITION - 6);
+		    + (pUserSetting->tvHPosition - 6);
 		W_Buffer[0] = 0x70;
 		W_Buffer[1] = ADWHS & 0xFF;
 		W_Buffer[2] = ADWHE & 0xFF;
@@ -2126,15 +1998,15 @@
 	    for (i = 0; i < 3; i++) {
 		W_Buffer[0] = VIASAA7108PostionOffset[i];
 		if (pBIOSInfo->TVVScan == VIA_TVNORMAL)
-		    W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUTUSERSETTING->UT_TV_VPOSITION][i];
+		    W_Buffer[1] = VIASAA7108PostionNormalTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUserSetting->tvVPosition][i];
 		else
-		    W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUTUSERSETTING->UT_TV_VPOSITION][i];
+		    W_Buffer[1] = VIASAA7108PostionOverTabRec[pBIOSInfo->TVType - 1][pBIOSInfo->resTVMode][pUserSetting->tvVPosition][i];
 		xf86I2CWriteRead(dev, W_Buffer, 2, NULL, 0);
 	    }
 	    W_Buffer[0] = 0x37;
 	    W_Buffer[1] = R_Buffer[0] & ~0x30;
-	    if (!pUTUSERSETTING->ADAPTIVE_FFILTER_ON) {
-		W_Buffer[1] |= (unsigned char) ((pUTUSERSETTING->UT_TV_FFILTER - 1) << 4);
+	    if (!pUserSetting->AdaptiveFilterOn) {
+		W_Buffer[1] |= (unsigned char) ((pUserSetting->tvFFilter - 1) << 4);
 	    }
 	    xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 1);
 	    break;

Index: via_video.c
===================================================================
RCS file: /cvs/xorg/xc/programs/Xserver/hw/xfree86/drivers/via/via_video.c,v
retrieving revision 1.1
retrieving revision 1.1.4.1
diff -u -d -r1.1 -r1.1.4.1
--- a/via_video.c	25 Nov 2003 19:28:43 -0000	1.1
+++ b/via_video.c	23 Feb 2004 21:36:29 -0000	1.1.4.1
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_video.c,v 1.12 2003/11/10 18:22:35 tsi Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/via/via_video.c,v 1.17 2004/02/04 04:15:09 dawes Exp $ */
 /*
  * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
  * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
@@ -223,28 +223,10 @@
    "XV_SWOV",
    "XV_TV0" ,
    "XV_TV1" ,
-   /*"XV_TV2" ,*/
    "XV_UTCTRL",
    "XV_DUMMY"
 };
 
-
-#define DDR100SUPPORTMODECOUNT 24
-#define DDR133UNSUPPORTMODECOUNT 19
-static const MODEINFO SupportDDR100[DDR100SUPPORTMODECOUNT]=
-         {{640,480,8,60}, {640,480,8,75}, {640,480,8,85}, {640,480,8,100}, {640,480,8,120},
-          {640,480,16,60}, {640,480,16,75}, {640,480,16,85}, {640,480,16,100}, {640,480,16,120},
-          {640,480,32,60}, {640,480,32,75}, {640,480,32,85}, {640,480,16,100}, {640,480,32,120},
-          {800,600,8,60}, {800,600,8,75}, {800,600,8,85}, {800,600,8,100}, {800,600,16,60},
-          {800,600,16,75}, {800,600,16,85}, {800,600,32,60}, {1024,768,8,60}};
-
-static const MODEINFO UnSupportDDR133[DDR133UNSUPPORTMODECOUNT]=
-         {{1152,864,32,75}, {1280,768,32,75}, {1280,768,32,85}, {1280,960,32,60}, {1280,960,32,75},
-          {1280,960,32,85}, {1280,1024,16,85}, {1280,1024,32,60}, {1280,1024,32,75}, {1280,1024,32,85},
-          {1400,1050,16,85}, {1400,1050,32,60}, {1400,1050,32,75}, {1400,1050,32,85}, {1600,1200,8,75},
-          {1600,1200,8,85}, {1600,1200,16,75}, {1600,1200,16,85}, {1600,1200,32,60}};
-
-
 /*
  *  F U N C T I O N
  */
@@ -264,54 +246,46 @@
     while (IN_VBLANK);
 }
 
-/* Decide if the mode support video overlay */
+/*
+ *   Decide if the mode support video overlay. This depends on the bandwidth
+ *   of the mode and the type of RAM available.
+ */
+
 static Bool DecideOverlaySupport(VIAPtr pVia)
 {
-    unsigned long iCount;   
+    /* Small trick here. We keep the height in 16's of lines and width in 32's 
+       to avoid numeric overflow */
+    unsigned long bandwidth = (pVia->graphicInfo.dwHeight >> 4) * (pVia->graphicInfo.dwWidth >> 5) *
+    				pVia->graphicInfo.dwBPP * pVia->graphicInfo.dwRefreshRate;
 
     VGAOUT8(0x3D4, 0x3D);
     switch ((VGAIN8(0x3D5) & 0x70) >> 4)
     {
-        case 0:
+        case 0:			/* No overlay without DDR */
         case SDR100:
-            break;
-
         case SDR133:
-            break;
-
+            return FALSE;
         case DDR100:
-            for (iCount=0; iCount < DDR100SUPPORTMODECOUNT; iCount++)
+            /* Basic limit for DDR100 is about this */
+            if(bandwidth > 1800000)
+            	return FALSE;
+            /* But we have constraints at higher than 800x600 */
+            if (pVia->graphicInfo.dwWidth > 800)
             {
-                if ( (pVia->graphicInfo.dwWidth == SupportDDR100[iCount].dwWidth) && 
-                     (pVia->graphicInfo.dwHeight == SupportDDR100[iCount].dwHeight) &&
-                     (pVia->graphicInfo.dwBPP == SupportDDR100[iCount].dwBPP) && 
-                     (pVia->graphicInfo.dwRefreshRate == SupportDDR100[iCount].dwRefreshRate) )
-                {
-                    return TRUE;
-                    break;
-                }                         
+            	if(pVia->graphicInfo.dwBPP != 8)
+            		return FALSE;
+            	if(pVia->graphicInfo.dwHeight > 768)
+            		return FALSE;
+            	if(pVia->graphicInfo.dwRefreshRate > 60)
+            		return FALSE;
             }
-
-            return FALSE;
-            break;
+            return TRUE;
 
         case DDR133:
-            for (iCount=0; iCount < DDR133UNSUPPORTMODECOUNT; iCount++)
-            {
-                if ( (pVia->graphicInfo.dwWidth == UnSupportDDR133[iCount].dwWidth) && 
-                     (pVia->graphicInfo.dwHeight == UnSupportDDR133[iCount].dwHeight) &&
-                     (pVia->graphicInfo.dwBPP == UnSupportDDR133[iCount].dwBPP) && 
-                     (pVia->graphicInfo.dwRefreshRate == UnSupportDDR133[iCount].dwRefreshRate) )
-                {
-                    return FALSE;
-                    break;
-                }                         
-            }
-
+            if(bandwidth > 7901250)
+            	return FALSE;
             return TRUE;
-            break;
     }
-
     return FALSE;
 }
 
@@ -377,7 +351,10 @@
 
     DBG_DD(ErrorF(" via_video.c : viaInitVideo : \n"));
 
-    if((pVia->Chipset == VIA_CLE266))
+    /*
+     *	We have no KM400 information..
+     */
+    if(pVia->Chipset == VIA_CLE266)
     {
         newAdaptor = viaSetupImageVideoG(pScreen);
     }
@@ -408,17 +385,6 @@
 
     if(newAdaptors)
         xfree(newAdaptors);
-
-
-    /* Driver init */
-    /* DriverProc(CREATEDRIVER,NULL); */
-
-    /* 3rd party  Device Init */
-    /*
-    InitializeVDEC();
-    InitializeTUNER();
-    InitializeAudio();
-    */
 }
 
 
@@ -433,6 +399,8 @@
     
     DBG_DD(ErrorF(" via_video.c : viaSetupImageVideoG: \n"));
 
+    /* Look for available devices */
+    ViaTunerProbe(pScrn);
 
     xvBrightness      = MAKE_ATOM("XV_BRIGHTNESS");
     xvContrast        = MAKE_ATOM("XV_CONTRAST");
@@ -455,25 +423,19 @@
         if(!(adaptPtr[i] = xf86XVAllocateVideoAdaptorRec(pScrn)))
             return NULL;
 
-       gviaPortPriv[i] =  (viaPortPrivPtr)xcalloc(1, sizeof(viaPortPrivRec) );
-       if ( ! gviaPortPriv[i] ){
-          DBG_DD(ErrorF(" via_xvpriv.c : Fail to allocate gviaPortPriv: \n"));
-       }
-       else{
-          DBG_DD(ErrorF(" via_xvpriv.c : gviaPortPriv[%d] = 0x%08x \n", i,gviaPortPriv[i]));
-       }
-        /*
-        if(!(pPriv[i] = xcalloc(1, sizeof(viaPortPrivPtr))))
+        gviaPortPriv[i] =  (viaPortPrivPtr)xnfcalloc(1, sizeof(viaPortPrivRec) );
+        pdevUnion[i] = (DevUnion  *)xnfcalloc(1, sizeof(DevUnion));
+
+        if(i == 0)		/* Overlay engine */
         {
-            xfree(adaptPtr[i]);
-            return NULL;
+            adaptPtr[i]->type = XvInputMask | XvWindowMask | XvImageMask | XvVideoMask | XvStillMask;
+            adaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
+        }
+        else
+        {
+            adaptPtr[i]->type = XvInputMask | XvWindowMask | XvVideoMask;
+            adaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
         }
-        */
-
-        pdevUnion[i] = (DevUnion  *)xcalloc(1, sizeof(DevUnion) );
-
-        adaptPtr[i]->type = XvInputMask | XvWindowMask | XvImageMask | XvVideoMask | XvStillMask;
-        adaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
         adaptPtr[i]->name = XVPORTNAME[i];
         adaptPtr[i]->nEncodings = 8;
         adaptPtr[i]->pEncodings = DummyEncoding;
@@ -484,10 +446,6 @@
         adaptPtr[i]->nPorts = 1; 
         adaptPtr[i]->pPortPrivates = pdevUnion[i];
         adaptPtr[i]->pPortPrivates->ptr = (pointer) gviaPortPriv[i];
-/*
-        adaptPtr[i]->pPortPrivates = (DevUnion*)(&pPriv[1]);
-        adaptPtr[i]->pPortPrivates[0].ptr = (pointer)pPriv;
-*/
         if (i == 3) /* Utility port doesn't need attribute */
         {
             adaptPtr[i]->nAttributes = 0;
@@ -506,7 +464,6 @@
         adaptPtr[i]->GetPortAttribute = viaGetPortAttributeG;
         adaptPtr[i]->QueryBestSize = viaQueryBestSizeG;
         adaptPtr[i]->PutImage = viaPutImageG;
-/*        adaptPtr[i]->ReputImage= viaReputImageG; */
         adaptPtr[i]->QueryImageAttributes = viaQueryImageAttributesG;
 
 #ifdef COLOR_KEY
@@ -519,14 +476,14 @@
         gviaPortPriv[i]->xv_portnum = i;
 
         /* gotta uninit this someplace */
+#ifdef XFREE86_44
         REGION_NULL(pScreen, &gviaPortPriv[i]->clip);
+#else
+	REGION_INIT(pScreen, &gviaPortPriv[i]->clip, NullBox, 1);
+#endif
     } /* End of for */
-
-
     viaResetVideo(pScrn);
-
     return adaptPtr[0];
-
 }
 
 
@@ -560,13 +517,14 @@
 }
 
 
-static unsigned long CreateSWOVSurface(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, int fourcc, short width, short height)
+static int CreateSWOVSurface(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, int fourcc, short width, short height)
 {
     VIAPtr  pVia = VIAPTR(pScrn);
     LPDDSURFACEDESC lpSurfaceDesc = &pPriv->SurfaceDesc;
+    unsigned long retCode;
 
     if (pVia->Video.VideoStatus & SWOV_SURFACE_CREATED)
-        return TRUE;
+        return Success;
 
     lpSurfaceDesc->dwWidth  = (unsigned long)width;
     lpSurfaceDesc->dwHeight = (unsigned long)height;
@@ -574,7 +532,8 @@
 
     lpSurfaceDesc->dwFourCC = (unsigned long)fourcc;
 
-    VIAVidCreateSurface(pScrn, lpSurfaceDesc);
+    if (Success != (retCode = VIAVidCreateSurface(pScrn, lpSurfaceDesc)))
+	return retCode;
 
     pPriv->ddLock.dwFourCC = (unsigned long)fourcc;
 
@@ -588,7 +547,7 @@
     
     pVia->Video.VideoStatus |= SWOV_SURFACE_CREATED|SW_VIDEO_ON;
     pVia->Video.dwAction = ACTION_SET_VIDEOSTATUS;
-    return TRUE;
+    return Success;
 }
 
 
@@ -665,7 +624,7 @@
  *  Inputs: CARD16 channel - the tuner channel to be set.                   *
  *  Outputs: NONE                                                          *
  ****************************************************************************/
-static void SetTunerChannel (viaPortPrivPtr pChanPriv, INT32 frequency)
+static void SetTunerChannel (ViaTunerPtr pTuner, viaPortPrivPtr pChanPriv, INT32 frequency)
 {
     int      control;
     short    divider = 0;
@@ -675,36 +634,30 @@
       case PAL_60_COMPOSITE :
       case PAL_60_TUNER     :
       case PAL_60_SVIDEO    :
-           divider=633+(short)frequency;
+           divider = 633 + (short)frequency;
            break;
       case NTSC_COMPOSITE   :
       case NTSC_TUNER       :
       case NTSC_SVIDEO      :
-           divider=733+(short)frequency;
+           divider = 733 + (short)frequency;
            break;
       default:
-           divider=frequency;
+           divider = frequency;
     }
 
     control = 0x8E00;
 
     if ( divider <= LOW_BAND )
-    {
-       control |= 0xA0;
-    }
-    else{
-       if ( divider <= MID_BAND )
-          control |= 0x90;
-       else
-          control |= 0x30;
-    }
-
-
+        control |= 0xA0;
+    else if ( divider <= MID_BAND )
+        control |= 0x90;
+    else
+        control |= 0x30;
 
-    DBG_DD(ErrorF(" via_video.c : SetTunerChannel : Divider = 0x%08x, Control= 0x%08x, \n",
-            divider,control));
+    DBG_DD(ErrorF(" via_video.c : SetTunerChannel : Divider = 0x%08x, Control= 0x%08x, \n", divider,control));
 
-    /* Tuner chip interfacing goes here */
+    if(pTuner)
+    	ViaTunerChannel(pTuner, divider, control);
 
 } /* SetTunerChannel ()... */
 
@@ -736,7 +689,13 @@
     vmmtr   viaVidEng = (vmmtr) pVia->VidMapBase;    
     viaPortPrivPtr pPriv = (viaPortPrivPtr)data;
     int attr, avalue;
-
+    ViaTunerPtr pTuner = NULL;
+    
+    if(pPriv->xv_portnum == COMMAND_FOR_TV0)
+    	pTuner = pVia->Tuner[0];
+    else if(pPriv->xv_portnum == COMMAND_FOR_TV1)
+        pTuner = pVia->Tuner[1];
+        ;
     DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : \n"));
 
     pVia->OverlaySupported = DecideOverlaySupport(pVia);
@@ -763,53 +722,53 @@
         {
             DBG_DD(ErrorF("     xvBrightness = %08d\n",value));
             pPriv->pict.brightness = xv_to_v4l(value);
+            if(pTuner)
+            	ViaTunerBrightness(pTuner, value);
         }
         if (attribute == xvContrast)
         {
             DBG_DD(ErrorF("     xvContrast = %08d\n",value));
             pPriv->pict.contrast   = xv_to_v4l(value);
+            if(pTuner)
+            	ViaTunerContrast(pTuner, value);
         }
         if (attribute == xvSaturation)
         {
             DBG_DD(ErrorF("     xvSaturation = %08d\n",value));
             pPriv->pict.colour     = xv_to_v4l(value);
+            if(pTuner)
+            	ViaTunerSaturation(pTuner, value);
         }
         if (attribute == xvHue)
         {
             DBG_DD(ErrorF("     xvHue = %08d\n",value));
             pPriv->pict.hue        = xv_to_v4l(value);
+            if(pTuner)
+            	ViaTunerHue(pTuner, value);
         }
 
     /* Audio control */
     } else if (attribute == xvMute){
             DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvMute = %08d\n",value));
-            if ( value )
-            {
-              pPriv->AudioMode = ATTR_MUTE_ON;
-              attr = ATTR_MUTE_ON;
-            }
-            else{
-              pPriv->AudioMode = ATTR_MUTE_OFF;
-              attr = ATTR_STEREO;
-            }
-
+            if(value)
+            	value = 1;
+           ViaAudioMute(pVia, value);
     } else if (attribute == xvVolume){
             DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvVolume = %08d\n",value));
             pPriv->Volume = value;
             attr = ATTR_VOLUME;
             avalue = value;
-
+            /* FIXME */
     /* Tuner control. Channel switch */
     } else if (attribute == xvFreq){
             DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvFreq = %08x\n",value));
-            SetTunerChannel(pPriv, value );
-
+            SetTunerChannel(pTuner, pPriv, value );
     /* Video decoder control. NTSC/PAL, SVIDEO/COMPOSITIVE/TV */
     } else if (attribute == xvEncoding){
             DBG_DD(ErrorF("     xvEncoding = %d. \n",value));
-
             pPriv->dwEncoding = value;
-
+            if(pTuner)
+            	ViaTunerStandard(pTuner, value);
     /* VIA Proprietary Attribute for Video control */
     } else if (attribute == xvPort ){
             DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvPort=%d\n", value));
@@ -829,9 +788,14 @@
     /* VIA Proprietary Attribute for AUDIO control */
     } else if (attribute == xvAudioCtrl ){
             DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : xvAudioSwitch=%d\n", value));
-
-            attr = ATTR_AUDIO_CONTROLByAP;
-            avalue = value;
+            if(pTuner)
+            {
+            	ViaAudioMode(pVia, value);
+            	if(pPriv->xv_portnum == COMMAND_FOR_TV0)
+            		ViaAudioSelect(pVia,0);
+            	else
+            		ViaAudioSelect(pVia, 1);
+           }
     }else{
            DBG_DD(ErrorF(" via_video.c : viaSetPortAttributeG : is not supported the attribute"));
            return BadMatch;
@@ -946,17 +910,21 @@
     int h,
     int w )
 {
-   int count;
+    int count;
 
     /*  copy YUY2 data to video memory,
      *  do 32 bits alignment.
      */
-       count = h;
-       while(count--) {
-       memcpy(dst, src, w);
-       src += srcPitch;
-       dst += dstPitch;
-       }
+     
+    w <<= 1;		/* Each pixel is YU or YV - 16 bits */
+    srcPitch <<= 1;
+    
+    count = h;
+    while(count--) {
+        memcpy(dst, src, w);
+        src += srcPitch;
+        dst += dstPitch;
+    }
 }
 
 
@@ -975,38 +943,37 @@
    int h,
    int w
 ){
-   int count;
+    int count;
 
     /* copy Y component to video memory */
-       count = h;
-       while(count--) {
-       memcpy(dst1, src1, w);
-       src1 += srcPitch;
-       dst1 += dstPitch;
-       }
+    count = h;
+    while(count--) {
+        memcpy(dst1, src1, w);
+        src1 += srcPitch;
+        dst1 += dstPitch;
+    }
 
     /* UV component is 1/4 of Y */
-   w >>= 1;
-   h >>= 1;
-   srcPitch >>= 1;
-   dstPitch >>= 1;
+    w >>= 1;
+    h >>= 1;
+    srcPitch >>= 1;
+    dstPitch >>= 1;
 
     /* copy V(Cr) component to video memory */
-       count = h;
-       while(count--) {
-       memcpy(dst2, src2, w);
-       src2 += srcPitch;
-       dst2 += dstPitch;
-       }
+    count = h;
+    while(count--) {
+        memcpy(dst2, src2, w);
+        src2 += srcPitch;
+        dst2 += dstPitch;
+    }
 
     /* copy U(Cb) component to video memory */
-       count = h;
-       while(count--) {
-       memcpy(dst3, src3, w);
-       src3 += srcPitch;
-       dst3 += dstPitch;
-       }
-
+    count = h;
+    while(count--) {
+        memcpy(dst3, src3, w);
+        src3 += srcPitch;
+        dst3 += dstPitch;
+    }
 }
 
 
@@ -1025,6 +992,7 @@
     VIAPtr  pVia = VIAPTR(pScrn);
     viaPortPrivPtr pPriv = (viaPortPrivPtr)data;
     vmmtr   viaVidEng = (vmmtr) pVia->VidMapBase;    
+    unsigned long retCode;
 /*    int i;
     BoxPtr pbox; */
 
@@ -1061,9 +1029,10 @@
                 if ( (pPriv->old_src_w != src_w) || (pPriv->old_src_h != src_h) )
                     DestroySWOVSurface(pScrn, pPriv);
 
-                if ( !CreateSWOVSurface(pScrn, pPriv, id, width, height) )
+                if (Success != ( retCode = CreateSWOVSurface(pScrn, pPriv, id, width, height) ))
                 {
                    DBG_DD(ErrorF("             : Fail to Create SW Video Surface\n"));
+		   return retCode;
                 }
 
 
@@ -1108,12 +1077,7 @@
                 lpUpdateOverlay->rSrc.right = src_x + width;
                 lpUpdateOverlay->rSrc.bottom = src_y + height;
 
-                /* temp solve LinDVD AP bug */
-                /* When y<0, lindvd will send wrong x */
-                if (drw_y<0)
-                    lpUpdateOverlay->rDest.left = drw_x/2;
-                else
-                    lpUpdateOverlay->rDest.left = drw_x;
+                lpUpdateOverlay->rDest.left = drw_x;
                 lpUpdateOverlay->rDest.top = drw_y;
                 lpUpdateOverlay->rDest.right = lpUpdateOverlay->rDest.left + drw_w;
                 lpUpdateOverlay->rDest.bottom = drw_y + drw_h;
@@ -1169,18 +1133,6 @@
                     REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
                     
                     xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
-#if 0                    
-                    /* draw these */
-                    /*  FillSolidRects function cause segment fail in SAMM mode
-                     *  So I change to use SetupForSolidFill
-                     *  Changed to XAAFillSolidRects by Alan
-                     */
-                     
-                    XAAFillSolidRects(pScrn, pPriv->colorKey, GXcopy,
-                                    (CARD32)~0,
-                                    REGION_NUM_RECTS(clipBoxes),
-                                    REGION_RECTS(clipBoxes));
-#endif                                    
                 }
 
                 /*





More information about the xorg-commit mailing list