xref: /plan9/sys/src/cmd/aux/vga/att20c49x.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 /*
97dd7cddfSDavid du Colombier  * ATT20C490 and ATT20C49[12] True-Color CMOS RAMDACs.
10219b2ee8SDavid du Colombier  */
11219b2ee8SDavid du Colombier enum {
12219b2ee8SDavid du Colombier 	Cr0		= 0x00,		/* Control register 0 */
13219b2ee8SDavid du Colombier };
14219b2ee8SDavid du Colombier 
15219b2ee8SDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)16219b2ee8SDavid du Colombier init(Vga* vga, Ctlr* ctlr)
17219b2ee8SDavid du Colombier {
18219b2ee8SDavid du Colombier 	ulong pclk;
19219b2ee8SDavid du Colombier 	char *p;
20219b2ee8SDavid du Colombier 
21219b2ee8SDavid du Colombier 	/*
22219b2ee8SDavid du Colombier 	 * Part comes in -100, -80, -65 and -55MHz speed-grades.
23219b2ee8SDavid du Colombier 	 * Work out the part speed-grade from name.  Name can have,
24219b2ee8SDavid du Colombier 	 * e.g. '-100' on the end  for 100MHz part.
25219b2ee8SDavid du Colombier 	 */
26219b2ee8SDavid du Colombier 	pclk = 55000000;
27219b2ee8SDavid du Colombier 	if(p = strrchr(ctlr->name, '-'))
28219b2ee8SDavid du Colombier 		pclk = strtoul(p+1, 0, 0) * 1000000;
29219b2ee8SDavid du Colombier 
30219b2ee8SDavid du Colombier 	/*
31219b2ee8SDavid du Colombier 	 * If we don't already have a desired pclk,
32219b2ee8SDavid du Colombier 	 * take it from the mode.
33219b2ee8SDavid du Colombier 	 * Check it's within range.
34219b2ee8SDavid du Colombier 	 */
35219b2ee8SDavid du Colombier 	if(vga->f == 0)
367dd7cddfSDavid du Colombier 		vga->f[0] = vga->mode->frequency;
377dd7cddfSDavid du Colombier 	if(vga->f[0] > pclk)
387dd7cddfSDavid du Colombier 		error("%s: invalid pclk - %ld\n", ctlr->name, vga->f[0]);
39219b2ee8SDavid du Colombier }
40219b2ee8SDavid du Colombier 
41219b2ee8SDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)42219b2ee8SDavid du Colombier load(Vga* vga, Ctlr* ctlr)
43219b2ee8SDavid du Colombier {
44219b2ee8SDavid du Colombier 	uchar mode, x;
45219b2ee8SDavid du Colombier 
46219b2ee8SDavid du Colombier 	/*
47219b2ee8SDavid du Colombier 	 * Put the chip to sleep if possible.
48219b2ee8SDavid du Colombier 	 */
49219b2ee8SDavid du Colombier 	if(ctlr->name[8] == '1'){
50219b2ee8SDavid du Colombier 		x = attdaci(Cr0);
51219b2ee8SDavid du Colombier 		attdaco(Cr0, x|0x04);
52219b2ee8SDavid du Colombier 	}
53219b2ee8SDavid du Colombier 
54219b2ee8SDavid du Colombier 	/*
55219b2ee8SDavid du Colombier 	 * Set the mode in the RAMDAC, setting 6/8-bit colour
56219b2ee8SDavid du Colombier 	 * as appropriate and waking the chip back up.
57219b2ee8SDavid du Colombier 	 */
58219b2ee8SDavid du Colombier 	mode = 0x00;
59219b2ee8SDavid du Colombier 	if(vga->mode->z == 8 && ctlr->name[8] == '1' && 0)
60219b2ee8SDavid du Colombier 		mode |= 0x02;
61219b2ee8SDavid du Colombier 	attdaco(Cr0, mode);
62219b2ee8SDavid du Colombier }
63219b2ee8SDavid du Colombier 
64219b2ee8SDavid du Colombier static void
dump(Vga *,Ctlr * ctlr)657dd7cddfSDavid du Colombier dump(Vga*, Ctlr* ctlr)
66219b2ee8SDavid du Colombier {
67219b2ee8SDavid du Colombier 	printitem(ctlr->name, "Cr0");
68219b2ee8SDavid du Colombier 	printreg(attdaci(Cr0));
69219b2ee8SDavid du Colombier }
70219b2ee8SDavid du Colombier 
717dd7cddfSDavid du Colombier Ctlr att20c490 = {
727dd7cddfSDavid du Colombier 	"att20c490",			/* name */
737dd7cddfSDavid du Colombier 	0,				/* snarf */
747dd7cddfSDavid du Colombier 	0,				/* options */
757dd7cddfSDavid du Colombier 	init,				/* init */
767dd7cddfSDavid du Colombier 	load,				/* load */
777dd7cddfSDavid du Colombier 	dump,				/* dump */
787dd7cddfSDavid du Colombier };
797dd7cddfSDavid du Colombier 
80219b2ee8SDavid du Colombier Ctlr att20c491 = {
81219b2ee8SDavid du Colombier 	"att20c491",			/* name */
82219b2ee8SDavid du Colombier 	0,				/* snarf */
83219b2ee8SDavid du Colombier 	0,				/* options */
84219b2ee8SDavid du Colombier 	init,				/* init */
85219b2ee8SDavid du Colombier 	load,				/* load */
86219b2ee8SDavid du Colombier 	dump,				/* dump */
87219b2ee8SDavid du Colombier };
88219b2ee8SDavid du Colombier 
89219b2ee8SDavid du Colombier Ctlr att20c492 = {
90219b2ee8SDavid du Colombier 	"att20c492",			/* name */
91219b2ee8SDavid du Colombier 	0,				/* snarf */
92219b2ee8SDavid du Colombier 	0,				/* options */
93219b2ee8SDavid du Colombier 	init,				/* init */
94219b2ee8SDavid du Colombier 	load,				/* load */
95219b2ee8SDavid du Colombier 	dump,				/* dump */
96219b2ee8SDavid du Colombier };
97