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