1 --- linux.org/drivers/video/tridentfb.c Mon Feb 25 20:38:07 2002
2 +++ linux/drivers/video/tridentfb.c Fri Mar 1 00:58:59 2002
5 * Copyright 2001,2002 - Jani Monoses <jani@astechnix.ro>
10 * CREDITS:(in order of appearance)
11 * skeletonfb.c by Geert Uytterhoeven and other fb code in drivers/video
14 #include "tridentfb.h"
16 -#define VERSION "0.6.8"
17 +#define VERSION "0.7.0"
19 struct tridentfb_par {
20 struct fb_var_screeninfo var;
23 static char * tridentfb_name = "Trident";
28 static int defaultaccel;
30 write3X4(CRTHiOrd, (read3X4(CRTHiOrd) & 0xF8) | (base & 0xE0000) >> 17);
34 -#error "Floating point maths. This needs fixing before the driver is safe"
35 -#define calc_freq(n,m,k) ((NTSC * (n+8))/((m+2)*(1<<k)))
36 +/* Use 20.12 fixed-point for NTSC value and frequency calculation */
37 +#define calc_freq(n,m,k) ( (unsigned long)0xE517 * (n+8) / ((m+2)*(1<<k)) )
39 /* Set dotclock frequency */
40 static void set_vclk(int freq)
41 @@ -1098,68 +1096,29 @@
45 -/* List of boards that we are trying to support */
46 -static struct almost_supported_board {
49 - struct accel_switch * acc;
52 -} asb[] __initdata = {
53 - { BLADE3D, BLADE, &accel_blade, "Blade3D", ACCEL },
54 - { CYBERBLADEi7, BLADE, &accel_blade, "CyberBladei7", ACCEL },
55 - { CYBERBLADEi7D, BLADE, &accel_blade, "CyberBladei7D", ACCEL },
56 - { CYBERBLADEi1, BLADE, &accel_blade, "CyberBladei1", ACCEL },
57 - { CYBERBLADEi1D, BLADE, &accel_blade, "CyberBladei1D", ACCEL },
58 - { CYBERBLADEAi1, BLADE, &accel_blade, "CyberBladeAi1", ACCEL },
59 - { CYBERBLADEAi1D, BLADE, &accel_blade, "CyberBladeAi1D", ACCEL },
60 - { CYBERBLADEE4, BLADE, &accel_blade, "CyberBladeE4", ACCEL },
62 - { IMAGE975, IMAGE, &accel_image, "IMAGE975", NOACCEL },
63 - { IMAGE985, IMAGE, &accel_image, "IMAGE985", NOACCEL },
64 - { CYBER9320, IMAGE, &accel_image, "Cyber9320", NOACCEL },
65 - { CYBER9388, IMAGE, &accel_image, "Cyber9388", NOACCEL },
66 - { CYBER9520, IMAGE, &accel_image, "Cyber9520", NOACCEL },
67 - { CYBER9525DVD, IMAGE, &accel_image, "Cyber9525DVD", NOACCEL },
68 - { CYBER9397, IMAGE, &accel_image, "Cyber9397", NOACCEL },
69 - { CYBER9397DVD, IMAGE, &accel_image, "Cyber9397DVD", NOACCEL },
71 - { CYBERBLADEXPAi1, XP, &accel_blade, "CyberBladeXPAi1", NOACCEL },
72 - { CYBERBLADEXPm8, XP, &accel_blade, "CyberBladeXPm8", NOACCEL },
73 - { CYBERBLADEXPm16, XP, &accel_blade, "CyberBladeXPm16", NOACCEL },
76 -static __init int trident_find_board(void)
77 +static int __devinit trident_pci_probe(struct pci_dev * dev, const struct pci_device_id * id)
80 - struct pci_dev * board;
83 - for (i = 0;i < ARRAY_SIZE(asb);i++) {
84 - if ((board = pci_find_device(PCI_VENDOR_ID_TRIDENT,
87 - family = asb[i].family;
89 - pci_id = asb[i].pci_id;
90 - defaultaccel = asb[i].accel;
92 - fb_info.io = pci_resource_start(board,1);
93 - fb_info.fbmem = pci_resource_start(board,0);
94 - output("%s board found\n", asb[i].board_name);
98 - output("No Trident board found\n");
102 -int __init tridentfb_init(void)
104 + err = pci_enable_device(dev);
108 - output("Trident framebuffer %s initializing\n", VERSION);
109 + pci_id = id->device;
110 + if (is_xp(pci_id)) {
111 + defaultaccel = NOACCEL;
114 + if (is_blade(pci_id)) {
115 + defaultaccel = ACCEL;
116 + acc = &accel_blade;
118 + defaultaccel = ACCEL;
119 + acc = &accel_image;
122 - if (!trident_find_board())
124 + fb_info.io = pci_resource_start(dev,1);
125 + fb_info.fbmem = pci_resource_start(dev,0);
127 if (!request_mem_region(fb_info.io, TRIDENT_IOSIZE, "tridentfb")) {
128 debug("request_region failed!\n");
129 @@ -1188,6 +1147,7 @@
133 + output("%s board found\n", dev->name);
134 debug("Trident board found : mem = %X,io = %X, mem_v = %X, io_v = %X\n",
135 fb_info.fbmem, fb_info.io, fb_info.fbmem_virt, fb_info.io_virt);
137 @@ -1196,8 +1156,10 @@
139 strcpy(fb_info.gen.info.modename, tridentfb_name);
140 displaytype = get_displaytype();
143 fb_info.nativex = get_nativex();
145 fb_info.gen.info.changevar = NULL;
146 fb_info.gen.info.node = NODEV;
147 fb_info.gen.info.fbops = &tridentfb_ops;
148 @@ -1213,6 +1175,7 @@
150 /* This should give a reasonable default video mode */
151 fb_find_mode(&default_var,&fb_info.gen.info,mode,NULL,0,NULL,bpp);
154 * Unless user explicitly requires accel/noaccel use
155 * per chip defaults.Accel has priority over noaccel.
156 @@ -1222,7 +1185,7 @@
158 defaultaccel = NOACCEL;
160 - if (defaultaccel == ACCEL)
161 + if (defaultaccel == ACCEL && acc)
162 default_var.accel_flags |= FB_ACCELF_TEXT;
164 default_var.accel_flags &= ~FB_ACCELF_TEXT;
165 @@ -1243,13 +1206,60 @@
169 -void __exit tridentfb_exit(void)
170 +static void __devexit trident_pci_remove(struct pci_dev * dev)
172 unregister_framebuffer(&fb_info.gen.info);
173 iounmap((void *)fb_info.io_virt);
174 iounmap((void *)fb_info.fbmem_virt);
175 + release_mem_region(fb_info.fbmem, fb_info.memsize);
176 + release_region(fb_info.io, TRIDENT_IOSIZE);
179 +/* List of boards that we are trying to support */
180 +static struct pci_device_id trident_devices[] __devinitdata = {
181 + {PCI_VENDOR_ID_TRIDENT, BLADE3D, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
182 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi7, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
183 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi7D, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
184 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi1, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
185 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi1D, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
186 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
187 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1D, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
188 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEE4, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
189 + {PCI_VENDOR_ID_TRIDENT, IMAGE975, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
190 + {PCI_VENDOR_ID_TRIDENT, IMAGE985, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
191 + {PCI_VENDOR_ID_TRIDENT, CYBER9320, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
192 + {PCI_VENDOR_ID_TRIDENT, CYBER9388, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
193 + {PCI_VENDOR_ID_TRIDENT, CYBER9520, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
194 + {PCI_VENDOR_ID_TRIDENT, CYBER9525DVD, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
195 + {PCI_VENDOR_ID_TRIDENT, CYBER9397, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
196 + {PCI_VENDOR_ID_TRIDENT, CYBER9397DVD, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
197 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEXPAi1, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
198 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEXPm8, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
199 + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEXPm16, PCI_ANY_ID,PCI_ANY_ID,0,0,0},
203 +MODULE_DEVICE_TABLE(pci,trident_devices);
205 +static struct pci_driver tridentfb_pci_driver = {
207 + id_table:trident_devices,
208 + probe:trident_pci_probe,
209 + remove:__devexit_p(trident_pci_remove),
212 +int __init tridentfb_init(void)
214 + output("Trident framebuffer %s initializing\n", VERSION);
215 + return pci_module_init(&tridentfb_pci_driver);
218 +void __exit tridentfb_exit(void)
220 + pci_unregister_driver(&tridentfb_pci_driver);
225 * Parse user specified options (`video=trident:')
227 @@ -1260,8 +1270,8 @@
229 if (!options || !*options)
231 - for(opt = strtok(options,",");opt;opt = strtok(NULL,",")){
232 - if (!opt) continue;
233 + while((opt = strsep(&options,",")) != NULL ) {
234 + if (!*opt) continue;
235 if (!strncmp(opt,"noaccel",7))
237 else if (!strncmp(opt,"accel",5))
238 --- linux.org/drivers/video/tridentfb.h Mon Feb 25 20:38:07 2002
239 +++ linux/drivers/video/tridentfb.h Tue Mar 5 11:37:58 2002
244 -#define is_image() (family == IMAGE)
245 -#define is_blade() (family == BLADE)
246 -#define is_xp() (family == XP)
247 +#define is_image(id)
248 +#define is_xp(id) ((id == CYBERBLADEXPAi1) ||\
249 + (id == CYBERBLADEXPm8) ||\
250 + (id == CYBERBLADEXPm16))
252 +#define is_blade(id) ((id == BLADE3D) ||\
253 + (id == CYBERBLADEE4) ||\
254 + (id == CYBERBLADEi7) ||\
255 + (id == CYBERBLADEi7D) ||\
256 + (id == CYBERBLADEi1) ||\
257 + (id == CYBERBLADEi1D) ||\
258 + (id == CYBERBLADEAi1) ||\
259 + (id == CYBERBLADEAi1D))
261 /* these defines are for 'lcd' variable */
262 #define LCD_STRETCH 0
266 #define TRIDENT_IOSIZE 0x20000
267 -#define NTSC 14.31818
268 -#define PAL 17.73448
270 /* General Registers */
271 #define SPR 0x1F /* Software Programming Register (videoram) */
274 #define RevisionID 0x09
275 -#define OldOrNew 0x0B
276 +#define OldOrNew 0x0B
277 #define ConfPort1 0x0C
278 #define ConfPort2 0x0C
279 #define NewMode2 0x0D