xref: /plan9/sys/src/cmd/aux/vga/ics2494.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1 /*
2  * Integrated Circuit Systems, Inc.
3  * ICS2494[A] Dual Video/Memory Clock Generator.
4  */
5 #include <u.h>
6 #include <libc.h>
7 #include <bio.h>
8 
9 #include "pci.h"
10 #include "vga.h"
11 
12 typedef struct {
13 	char*	name[2];
14 	ulong	frequency[16];
15 } Pattern;
16 
17 static Pattern patterns[] = {
18 	{ "237", "304",
19 	 50350000,  56644000,  65000000,  72000000,  80000000,  89800000,  63000000,  75000000,
20 	 25175000,  28322000,  31500000,  36000000,  40000000,  44900000,  50000000,  65000000,
21 	},
22 
23 	{ "324", 0,
24 	 50350000,  56644000,  65000000,  72000000,  80000000,  89800000,  63000000,  75000000,
25 	 83078000,  93463000, 100000000, 104000000, 108000000, 120000000, 130000000, 134700000,
26 	},
27 
28 	{ 0,
29 	},
30 };
31 
32 static void
init(Vga * vga,Ctlr * ctlr)33 init(Vga* vga, Ctlr* ctlr)
34 {
35 	Pattern *pattern;
36 	char *p;
37 	int f, index, divisor, maxdivisor;
38 
39 	if(ctlr->flag & Finit)
40 		return;
41 
42 	if(vga->f[0] == 0)
43 		vga->f[0] = vga->mode->frequency;
44 
45 	if((p = strchr(ctlr->name, '-')) == 0)
46 		error("%s: unknown pattern\n", ctlr->name);
47 	p++;
48 
49 	for(pattern = patterns; pattern->name[0]; pattern++){
50 		if(strcmp(pattern->name[0], p) == 0)
51 			break;
52 		if(pattern->name[1] && strcmp(pattern->name[1], p) == 0)
53 			break;
54 	}
55 	if(pattern->name[0] == 0)
56 		error("%s: unknown pattern\n", ctlr->name);
57 
58 	maxdivisor = 1;
59 	if(vga->ctlr && (vga->ctlr->flag & Hclkdiv))
60 		maxdivisor = 8;
61 	for(index = 0; index < 16; index++){
62 		for(divisor = 1; divisor <= maxdivisor; divisor <<= 1){
63 			f = vga->f[0] - pattern->frequency[index]/divisor;
64 			if(f < 0)
65 				f = -f;
66 			if(f < 1000000){
67 				/*vga->f = pattern->frequency[index];*/
68 				vga->d[0] = divisor;
69 				vga->i[0] = index;
70 
71 				ctlr->flag |= Finit;
72 				return;
73 			}
74 		}
75 	}
76 	error("%s: can't find frequency %ld\n", ctlr->name, vga->f[0]);
77 }
78 
79 Ctlr ics2494 = {
80 	"ics2494",			/* name */
81 	0,				/* snarf */
82 	0,				/* options */
83 	init,				/* init */
84 	0,				/* load */
85 	0,				/* dump */
86 };
87 
88 Ctlr ics2494a = {
89 	"ics2494a",			/* name */
90 	0,				/* snarf */
91 	0,				/* options */
92 	init,				/* init */
93 	0,				/* load */
94 	0,				/* dump */
95 };
96