--- linux.org/drivers/video/tridentfb.c Mon Feb 25 20:38:07 2002 +++ linux/drivers/video/tridentfb.c Fri Mar 1 00:58:59 2002 @@ -3,7 +3,7 @@ * * Copyright 2001,2002 - Jani Monoses * - * $Id$ + * $Id$ * * CREDITS:(in order of appearance) * skeletonfb.c by Geert Uytterhoeven and other fb code in drivers/video @@ -35,7 +35,7 @@ #include "tridentfb.h" -#define VERSION "0.6.8" +#define VERSION "0.7.0" struct tridentfb_par { struct fb_var_screeninfo var; @@ -82,7 +82,6 @@ static char * tridentfb_name = "Trident"; -static int family; static int pci_id; static int defaultaccel; @@ -520,9 +519,8 @@ write3X4(CRTHiOrd, (read3X4(CRTHiOrd) & 0xF8) | (base & 0xE0000) >> 17); } - -#error "Floating point maths. This needs fixing before the driver is safe" -#define calc_freq(n,m,k) ((NTSC * (n+8))/((m+2)*(1<device; + if (is_xp(pci_id)) { + defaultaccel = NOACCEL; + acc = NULL; + } else + if (is_blade(pci_id)) { + defaultaccel = ACCEL; + acc = &accel_blade; + } else { + defaultaccel = ACCEL; + acc = &accel_image; + } - if (!trident_find_board()) - return -1; + fb_info.io = pci_resource_start(dev,1); + fb_info.fbmem = pci_resource_start(dev,0); if (!request_mem_region(fb_info.io, TRIDENT_IOSIZE, "tridentfb")) { debug("request_region failed!\n"); @@ -1188,6 +1147,7 @@ return -1; } + output("%s board found\n", dev->name); debug("Trident board found : mem = %X,io = %X, mem_v = %X, io_v = %X\n", fb_info.fbmem, fb_info.io, fb_info.fbmem_virt, fb_info.io_virt); @@ -1196,8 +1156,10 @@ strcpy(fb_info.gen.info.modename, tridentfb_name); displaytype = get_displaytype(); + if(flatpanel) fb_info.nativex = get_nativex(); + fb_info.gen.info.changevar = NULL; fb_info.gen.info.node = NODEV; fb_info.gen.info.fbops = &tridentfb_ops; @@ -1213,6 +1175,7 @@ /* This should give a reasonable default video mode */ fb_find_mode(&default_var,&fb_info.gen.info,mode,NULL,0,NULL,bpp); + /* * Unless user explicitly requires accel/noaccel use * per chip defaults.Accel has priority over noaccel. @@ -1222,7 +1185,7 @@ else if (noaccel) defaultaccel = NOACCEL; - if (defaultaccel == ACCEL) + if (defaultaccel == ACCEL && acc) default_var.accel_flags |= FB_ACCELF_TEXT; else default_var.accel_flags &= ~FB_ACCELF_TEXT; @@ -1243,13 +1206,60 @@ return 0; } -void __exit tridentfb_exit(void) +static void __devexit trident_pci_remove(struct pci_dev * dev) { unregister_framebuffer(&fb_info.gen.info); iounmap((void *)fb_info.io_virt); iounmap((void *)fb_info.fbmem_virt); + release_mem_region(fb_info.fbmem, fb_info.memsize); + release_region(fb_info.io, TRIDENT_IOSIZE); } +/* List of boards that we are trying to support */ +static struct pci_device_id trident_devices[] __devinitdata = { + {PCI_VENDOR_ID_TRIDENT, BLADE3D, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi7, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi7D, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi1, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEi1D, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEAi1D, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEE4, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, IMAGE975, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, IMAGE985, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBER9320, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBER9388, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBER9520, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBER9525DVD, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBER9397, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBER9397DVD, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEXPAi1, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEXPm8, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {PCI_VENDOR_ID_TRIDENT, CYBERBLADEXPm16, PCI_ANY_ID,PCI_ANY_ID,0,0,0}, + {0,} +}; + +MODULE_DEVICE_TABLE(pci,trident_devices); + +static struct pci_driver tridentfb_pci_driver = { + name:"tridentfb", + id_table:trident_devices, + probe:trident_pci_probe, + remove:__devexit_p(trident_pci_remove), +}; + +int __init tridentfb_init(void) +{ + output("Trident framebuffer %s initializing\n", VERSION); + return pci_module_init(&tridentfb_pci_driver); +} + +void __exit tridentfb_exit(void) +{ + pci_unregister_driver(&tridentfb_pci_driver); +} + + /* * Parse user specified options (`video=trident:') * example: @@ -1260,8 +1270,8 @@ char * opt; if (!options || !*options) return 0; - for(opt = strtok(options,",");opt;opt = strtok(NULL,",")){ - if (!opt) continue; + while((opt = strsep(&options,",")) != NULL ) { + if (!*opt) continue; if (!strncmp(opt,"noaccel",7)) noaccel = 1; else if (!strncmp(opt,"accel",5)) --- linux.org/drivers/video/tridentfb.h Mon Feb 25 20:38:07 2002 +++ linux/drivers/video/tridentfb.h Tue Mar 5 11:37:58 2002 @@ -41,9 +41,19 @@ #define BLADE 1 #define XP 2 -#define is_image() (family == IMAGE) -#define is_blade() (family == BLADE) -#define is_xp() (family == XP) +#define is_image(id) +#define is_xp(id) ((id == CYBERBLADEXPAi1) ||\ + (id == CYBERBLADEXPm8) ||\ + (id == CYBERBLADEXPm16)) + +#define is_blade(id) ((id == BLADE3D) ||\ + (id == CYBERBLADEE4) ||\ + (id == CYBERBLADEi7) ||\ + (id == CYBERBLADEi7D) ||\ + (id == CYBERBLADEi1) ||\ + (id == CYBERBLADEi1D) ||\ + (id == CYBERBLADEAi1) ||\ + (id == CYBERBLADEAi1D)) /* these defines are for 'lcd' variable */ #define LCD_STRETCH 0 @@ -60,15 +70,13 @@ #define NOACCEL 0 #define TRIDENT_IOSIZE 0x20000 -#define NTSC 14.31818 -#define PAL 17.73448 /* General Registers */ #define SPR 0x1F /* Software Programming Register (videoram) */ /* 3C4 */ #define RevisionID 0x09 -#define OldOrNew 0x0B +#define OldOrNew 0x0B #define ConfPort1 0x0C #define ConfPort2 0x0C #define NewMode2 0x0D