1 /* vgahico.c - used by ET4000 driver. */
2 /* Set Hicolor RAMDAC mode.
3 
4  * HH: Added support for 24-bit Sierra RAMDAC (15025/6) (untested).
5  */
6 
7 
8 #include "vga.h"
9 #include "libvga.h"
10 #include "driver.h"
11 #include "ramdac/ramdac.h"
12 
__svgalib_hicolor(int dac_type,int mode)13 int __svgalib_hicolor(int dac_type, int mode)
14 /* Enters hicolor mode - 0 for no hi, 1 for 15 bit, 2 for 16, 3 for 24 */
15 /* For any modes it doesn't know about, etc, it attempts to turn hicolor off. */
16 {
17     int x;
18 
19     _ramdac_dactocomm();
20     x = port_in(PEL_MSK);
21     _ramdac_dactocomm();
22     switch (dac_type & ~1) {
23     case 0:			/* Sierra SC11486 */
24 	if (mode == HI15_DAC)
25 	    port_out(x | 0x80, PEL_MSK);
26 	else
27 	    port_out(x & ~0x80, PEL_MSK);
28 	break;
29     case 2:			/* Sierra Mark2/Mark3 */
30 	switch (mode) {
31 	case HI15_DAC:
32 	    /* port_out( (x | 0x80) & ~0x40, PEL_MSK); */
33 	    port_out((x & 0x1f) | 0xa0, PEL_MSK);
34 	    break;
35 	case HI16_DAC:
36 	    /* port_out( x | 0xC0, PEL_MSK); */
37 	    port_out((x & 0x1f) | 0xe0, PEL_MSK);
38 	    break;
39 	default:
40 	    port_out(x & ~0xC0, PEL_MSK);
41 	    break;
42 	}
43 	break;
44     case 4:			/* Diamond SS2410 */
45 	if (mode == HI15_DAC)
46 	    port_out(x | 0x80, PEL_MSK);
47 	else
48 	    port_out(x & ~0x80, PEL_MSK);
49 	break;
50     case 8:			/* AT&T 20c491/2 */
51 	switch (mode) {
52 	case HI15_DAC:
53 	    port_out((x & 0x1f) | 0xA0, PEL_MSK);
54 	    break;
55 	case HI16_DAC:
56 	    port_out((x & 0x1f) | 0xC0, PEL_MSK);
57 	    break;
58 	case TC24_DAC:
59 	    port_out((x & 0x1f) | 0xE0, PEL_MSK);
60 	    break;
61 	default:
62 	    port_out(x & 0x1F, PEL_MSK);
63 	    break;
64 	}
65 	break;
66     case 16:			/* AcuMos ADAC1 */
67 	switch (mode) {
68 	case HI15_DAC:
69 	    port_out(0xF0, PEL_MSK);
70 	    break;
71 	case HI16_DAC:
72 	    port_out(0xE1, PEL_MSK);
73 	    break;
74 	case TC24_DAC:
75 	    port_out(0xE5, PEL_MSK);
76 	    break;
77 	default:
78 	    port_out(0, PEL_MSK);
79 	    break;
80 	}
81 	break;
82     case 32:			/* Sierra 15025/6 24-bit DAC */
83 	switch (mode) {
84 	case HI15_DAC:
85 	    port_out((x & 0x1f) | 0xa0, PEL_MSK);
86 	    /* 0xa0 is also a 15-bit mode. */
87 	    break;
88 	case HI16_DAC:
89 	    port_out((x & 0x1f) | 0xe0, PEL_MSK);
90 	    /* 0xc0 is also a 16-bit mode. */
91 	    /* 0xc0 doesn't seem to work, so use 0xe0. */
92 	    break;
93 	case TC24_DAC:
94 	    port_out((x & 0x1f) | 0x60, PEL_MSK);
95 	    break;
96 	default:
97 	    port_out(x & 0x1f, PEL_MSK);
98 	    break;
99 	}
100 	break;
101     default:
102 	/* Normal VGA mode. */
103 	port_out(x & 0x1F, PEL_MSK);
104 	break;
105     }
106     _ramdac_dactopel();
107 
108     return 0;
109 }
110