xref: /plan9/sys/src/cmd/aux/vga/tvp3025.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier 
5*9a747e4fSDavid du Colombier #include "pci.h"
6219b2ee8SDavid du Colombier #include "vga.h"
7219b2ee8SDavid du Colombier 
8219b2ee8SDavid du Colombier /*
9219b2ee8SDavid du Colombier  * Tvp3025 Viewpoint Video Interface Pallette.
10219b2ee8SDavid du Colombier  * Assumes hooked up to an S3 Vision964.
11219b2ee8SDavid du Colombier  * The #9GXE64pro uses bit 5 of Crt5C as RS4,
12219b2ee8SDavid du Colombier  * giving access to the Bt485 emulation mode registers.
13219b2ee8SDavid du Colombier  */
14219b2ee8SDavid du Colombier static void
options(Vga * vga,Ctlr * ctlr)15219b2ee8SDavid du Colombier options(Vga* vga, Ctlr* ctlr)
16219b2ee8SDavid du Colombier {
177dd7cddfSDavid du Colombier 	tvp3020.options(vga, ctlr);
18219b2ee8SDavid du Colombier }
19219b2ee8SDavid du Colombier 
20219b2ee8SDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)21219b2ee8SDavid du Colombier init(Vga* vga, Ctlr* ctlr)
22219b2ee8SDavid du Colombier {
237dd7cddfSDavid du Colombier 	/*
247dd7cddfSDavid du Colombier 	 * Although the Tvp3025 has a higher default
257dd7cddfSDavid du Colombier 	 * speed-grade (135MHz), just use the 3020 code.
267dd7cddfSDavid du Colombier 	 */
277dd7cddfSDavid du Colombier 	tvp3020.init(vga, ctlr);
28219b2ee8SDavid du Colombier }
29219b2ee8SDavid du Colombier 
30219b2ee8SDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)31219b2ee8SDavid du Colombier load(Vga* vga, Ctlr* ctlr)
32219b2ee8SDavid du Colombier {
33219b2ee8SDavid du Colombier 	uchar crt5c, x;
34219b2ee8SDavid du Colombier 
35219b2ee8SDavid du Colombier 	crt5c = vgaxi(Crtx, 0x5C) & ~0x20;
36219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x5C, crt5c);
37219b2ee8SDavid du Colombier 	x = tvp3020xi(0x06) & ~0x80;
38219b2ee8SDavid du Colombier 	tvp3020xo(0x06, x);
397dd7cddfSDavid du Colombier 	tvp3020xo(0x0E, 0x00);
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier 	(tvp3020.load)(vga, ctlr);
427dd7cddfSDavid du Colombier 	if(ctlr->flag & Uenhanced)
437dd7cddfSDavid du Colombier 		tvp3020xo(0x29, 0x01);
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier 	ctlr->flag |= Fload;
467dd7cddfSDavid du Colombier }
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier static ulong
dumpclock(ulong d,ulong n,ulong p)497dd7cddfSDavid du Colombier dumpclock(ulong d, ulong n, ulong p)
507dd7cddfSDavid du Colombier {
517dd7cddfSDavid du Colombier 	ulong f;
527dd7cddfSDavid du Colombier 
537dd7cddfSDavid du Colombier 	f = RefFreq*((n+2)*8);
547dd7cddfSDavid du Colombier 	f /= (d+2);
557dd7cddfSDavid du Colombier 	f >>= p;
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier 	return f;
58219b2ee8SDavid du Colombier }
59219b2ee8SDavid du Colombier 
60219b2ee8SDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)61219b2ee8SDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
62219b2ee8SDavid du Colombier {
63219b2ee8SDavid du Colombier 	uchar crt5c;
64219b2ee8SDavid du Colombier 	int i;
657dd7cddfSDavid du Colombier 	ulong clock[4];
66219b2ee8SDavid du Colombier 
67219b2ee8SDavid du Colombier 	crt5c = vgaxi(Crtx, 0x5C);
68219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x5C, crt5c & ~0x20);
697dd7cddfSDavid du Colombier 	tvp3020.dump(vga, ctlr);
70219b2ee8SDavid du Colombier 
71219b2ee8SDavid du Colombier 	printitem(ctlr->name, "PCLK");
72219b2ee8SDavid du Colombier 	for(i = 0; i < 4; i++){
73219b2ee8SDavid du Colombier 		tvp3020xo(0x2C, (i<<4)|(i<<2)|i);
747dd7cddfSDavid du Colombier 		printreg(clock[i] = tvp3020xi(0x2D));
75219b2ee8SDavid du Colombier 	}
767dd7cddfSDavid du Colombier 	Bprint(&stdout, "%23ld\n", dumpclock(clock[0], clock[1], clock[2] & 0x07));
777dd7cddfSDavid du Colombier 
78219b2ee8SDavid du Colombier 	printitem(ctlr->name, "MCLK");
79219b2ee8SDavid du Colombier 	for(i = 0; i < 4; i++){
80219b2ee8SDavid du Colombier 		tvp3020xo(0x2C, (i<<4)|(i<<2)|i);
817dd7cddfSDavid du Colombier 		printreg(clock[i] = tvp3020xi(0x2E));
82219b2ee8SDavid du Colombier 	}
837dd7cddfSDavid du Colombier 	Bprint(&stdout, "%23ld\n", dumpclock(clock[0], clock[1], clock[2] & 0x07));
847dd7cddfSDavid du Colombier 
85219b2ee8SDavid du Colombier 	printitem(ctlr->name, "RCLK");
86219b2ee8SDavid du Colombier 	for(i = 0; i < 4; i++){
87219b2ee8SDavid du Colombier 		tvp3020xo(0x2C, (i<<4)|(i<<2)|i);
887dd7cddfSDavid du Colombier 		printreg(clock[i] = tvp3020xi(0x2F));
89219b2ee8SDavid du Colombier 	}
907dd7cddfSDavid du Colombier 	Bprint(&stdout, "%23ld\n", dumpclock(clock[0], clock[1], clock[2] & 0x07));
91219b2ee8SDavid du Colombier 
92219b2ee8SDavid du Colombier 	vgaxo(Crtx, 0x5C, crt5c);
93219b2ee8SDavid du Colombier }
94219b2ee8SDavid du Colombier 
95219b2ee8SDavid du Colombier Ctlr tvp3025 = {
96219b2ee8SDavid du Colombier 	"tvp3025",			/* name */
97219b2ee8SDavid du Colombier 	0,				/* snarf */
98219b2ee8SDavid du Colombier 	options,			/* options */
99219b2ee8SDavid du Colombier 	init,				/* init */
100219b2ee8SDavid du Colombier 	load,				/* load */
101219b2ee8SDavid du Colombier 	dump,				/* dump */
102219b2ee8SDavid du Colombier };
103