Update of /cvsroot/linuxconsole/ruby/linux/drivers/video/tdfx
In directory usw-pr-cvs1:/tmp/cvs-serv18352
Modified Files:
3dfxfb.c
Log Message:
Deal with resource management more intelligently .. and make sure that the
device is enabled (as this generally causes bad things to happen on platforms
that don't pre-initialize the adapter).
Index: 3dfxfb.c
===================================================================
RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/video/tdfx/3dfxfb.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- 3dfxfb.c 2002/01/08 08:34:15 1.16
+++ 3dfxfb.c 2002/01/08 21:51:36 1.17
@@ -1127,6 +1127,13 @@
static int __devinit tdfxfb_probe(struct pci_dev *pdev,
const struct pci_device_id *id)
{
+ int err;
+
+ if ((err = pci_enable_device(pdev))) {
+ printk(KERN_WARNING "tdfxfb: Can't enable pdev: %d\n", err);
+ return err;
+ }
+
/* Configure the default fb_fix_screeninfo first */
memset(&fb_info, 0, sizeof(fb_info));
fb_info.par = &default_par;
@@ -1152,13 +1159,32 @@
printk("fb: Can't remap %s register area.\n", tdfx_fix.id);
return -ENXIO;
}
-
+
+ if (!request_mem_region(pci_resource_start(pdev, 0),
+ pci_resource_len(pdev, 0),
+ "tdfx regbase")) {
+ printk(KERN_WARNING "tdfxfb: Can't reserve regbase\n");
+ iounmap(default_par.regbase_virt);
+ return -ENXIO;
+ }
+
tdfx_fix.smem_start = pci_resource_start(pdev, 1);
if(!(tdfx_fix.smem_len = do_lfb_size(pdev->device))) {
iounmap(default_par.regbase_virt);
printk("fb: Can't count %s memory.\n", tdfx_fix.id);
return -ENXIO;
}
+
+ if (!request_mem_region(pci_resource_start(pdev, 1),
+ pci_resource_len(pdev, 1),
+ "tdfx smem")) {
+ printk(KERN_WARNING "tdfxfb: Can't reserve smem\n");
+ release_mem_region(pci_resource_start(pdev, 0),
+ pci_resource_len(pdev, 0));
+ iounmap(default_par.regbase_virt);
+ return -ENXIO;
+ }
+
fb_info.screen_base = ioremap_nocache(tdfx_fix.smem_start,
tdfx_fix.smem_len);
if(!fb_info.screen_base) {
@@ -1169,6 +1195,19 @@
default_par.iobase = pci_resource_start(pdev, 2);
+ if (!request_region(pci_resource_start(pdev, 2),
+ pci_resource_len(pdev, 2),
+ "tdfx iobase")) {
+ printk(KERN_WARNING "tdfxfb: Can't reserve iobase\n");
+ release_mem_region(pci_resource_start(pdev, 1),
+ pci_resource_len(pdev, 1));
+ release_mem_region(pci_resource_start(pdev, 0),
+ pci_resource_len(pdev, 0));
+ iounmap(default_par.regbase_virt);
+ iounmap(fb_info.screen_base);
+ return -ENXIO;
+ }
+
printk("fb: %s memory = %dK\n", tdfx_fix.id, tdfx_fix.smem_len >> 10);
/* clear framebuffer memory */
@@ -1202,8 +1241,6 @@
return -ENXIO;
}
- printk("fb%d: %s frame buffer device\n", GET_FB_IDX(fb_info.node),
- fb_info.fix.id);
return 0;
}
@@ -1224,6 +1261,14 @@
//del_timer_sync(&par->hwcursor.timer);
iounmap(par->regbase_virt);
iounmap(fb_info.screen_base);
+
+ /* Clean up after reserved regions */
+ release_region(pci_resource_start(pdev, 2),
+ pci_resource_len(pdev, 2));
+ release_mem_region(pci_resource_start(pdev, 1),
+ pci_resource_len(pdev, 1));
+ release_mem_region(pci_resource_start(pdev, 0),
+ pci_resource_len(pdev, 0));
}
int __init tdfxfb_init(void)
|