Index: comedi/drivers/adl_pci6208.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/adl_pci6208.c,v
retrieving revision 1.3
diff -u -r1.3 adl_pci6208.c
--- comedi/drivers/adl_pci6208.c	22 Jan 2005 14:22:18 -0000	1.3
+++ comedi/drivers/adl_pci6208.c	28 Feb 2005 14:29:20 -0000
@@ -204,7 +204,10 @@
 {
 	printk("comedi%d: pci6208: remove\n",dev->minor);
 	
-	pci_release_regions(devpriv->pci_dev);
+	if(devpriv && devpriv->pci_dev){
+		pci_release_regions(devpriv->pci_dev);
+		pci_dev_put(devpriv->pci_dev);
+	}
 	
 	return 0;
 }
@@ -303,8 +306,8 @@
 	struct pci_dev *pci_dev;
 	int i;
 	
-	for(pci_dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_dev != NULL ; 
-		pci_dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci_dev)) {
+	for(pci_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_dev != NULL ; 
+		pci_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pci_dev)) {
 		if (pci_dev->vendor == PCI_VENDOR_ID_ADLINK)
 		{
 			for (i= 0; i< pci6208_board_nbr; i++)
Index: comedi/drivers/adl_pci9111.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/adl_pci9111.c,v
retrieving revision 1.14
diff -u -r1.14 adl_pci9111.c
--- comedi/drivers/adl_pci9111.c	27 Feb 2005 23:42:00 -0000	1.14
+++ comedi/drivers/adl_pci9111.c	28 Feb 2005 14:29:21 -0000
@@ -1268,8 +1268,8 @@
 	
 	printk("comedi%d: " PCI9111_DRIVER_NAME " driver\n",dev->minor);
 
-	for(pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
-		pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci_device)) 
+	for(pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
+		pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pci_device)) 
 	{
 		if (pci_device->vendor == PCI_VENDOR_ID_ADLINK)
 		{
@@ -1340,6 +1340,7 @@
 	if(pci_request_regions(pci_device, PCI9111_DRIVER_NAME))
 	{
 		printk("comedi%d: I/O port conflict\n",dev->minor);
+		pci_dev_put(pci_device);
 		return -EIO;
 	}
 	
@@ -1347,7 +1348,11 @@
 	dev->board_name = board->name;
 	
 	if(alloc_private(dev,sizeof(pci9111_private_data_struct))<0)
+	{
+		pci_release_regions(pci_device);
+		pci_dev_put(pci_device);
 		return -ENOMEM;
+	}
 	
 	dev_private->pci_device = pci_device;
 	dev_private->io_range = io_range;
@@ -1457,7 +1462,11 @@
     comedi_free_irq(dev->irq,dev);
   }
 
-  pci_release_regions(dev_private->pci_device);
+  if (dev_private!=0 && dev_private->pci_device!=0)
+  {
+    pci_release_regions(dev_private->pci_device);
+    pci_dev_put(dev_private->pci_device);
+  }
 
   return 0;
 }
Index: comedi/drivers/adv_pci_dio.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/adv_pci_dio.c,v
retrieving revision 1.4
diff -u -r1.4 adv_pci_dio.c
--- comedi/drivers/adv_pci_dio.c	22 Jan 2005 14:22:18 -0000	1.4
+++ comedi/drivers/adv_pci_dio.c	28 Feb 2005 14:29:22 -0000
@@ -896,8 +896,8 @@
 		return -ENOMEM;
 	}
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
 		if ((pcidev->vendor!=this_board->vendor_id)||
 		    (pcidev->device!=this_board->device_id))
 			continue;
@@ -911,6 +911,7 @@
 		if (ret==1) { found=1; break; }
 		if (ret>1) { 
 			pci_dio_detach(dev);
+			pci_dev_put(pcidev);
 			return -EIO;
 		}
 	}
@@ -928,6 +929,7 @@
 	
 	if (pci_request_regions(pcidev, driver_pci_dio.driver_name)) {
 		pci_dio_detach(dev);
+		pci_dev_put(pcidev);
 		rt_printk(", Error: Cann't allocate PCI device!\n");
 		return -EIO;
 	}
@@ -1048,8 +1050,10 @@
 		if (devpriv->enabled)
 			pci_disable_device(devpriv->pcidev);
 
-		if (devpriv->pcidev)
+		if (devpriv->pcidev) {
 			pci_release_regions(devpriv->pcidev);
+			pci_dev_put(devpriv->pcidev);
+		}
 		
 		if (devpriv->prev) { devpriv->prev->next=devpriv->next; }
 				    { pci_priv=devpriv->next; }
Index: comedi/drivers/amcc_s5933.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/amcc_s5933.c,v
retrieving revision 1.11
diff -u -r1.11 amcc_s5933.c
--- comedi/drivers/amcc_s5933.c	22 Jan 2005 14:22:18 -0000	1.11
+++ comedi/drivers/amcc_s5933.c	28 Feb 2005 14:29:22 -0000
@@ -31,13 +31,18 @@
 	amcc_devices=NULL;
 	last=NULL;
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
 		if(pcidev->vendor==pci_vendor){
 			amcc=kmalloc(sizeof(*amcc),GFP_KERNEL);
+			if (!amcc) {
+				printk("amcc_s5933: allocation failed\n");
+				pci_dev_put(pcidev);
+				break;
+			}
 			memset(amcc,0,sizeof(*amcc));
 
-			amcc->pcidev=pcidev;
+			amcc->pcidev=pci_dev_get(pcidev);
 			if (last) { last->next=amcc; }
 			     else { amcc_devices=amcc; }
 			last=amcc;
@@ -69,6 +74,7 @@
 	struct pcilst_struct *amcc,*next;
 
 	for(amcc=amcc_devices;amcc;amcc=next){
+		pci_dev_put(amcc->pcidev);
 		next=amcc->next;
 		kfree(amcc);
 	}
Index: comedi/drivers/amplc_dio200.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/amplc_dio200.c,v
retrieving revision 1.2
diff -u -r1.2 amplc_dio200.c
--- comedi/drivers/amplc_dio200.c	27 Feb 2005 22:05:51 -0000	1.2
+++ comedi/drivers/amplc_dio200.c	28 Feb 2005 14:29:23 -0000
@@ -277,9 +277,9 @@
 	}
 
 	/* Look for matching PCI device. */
-	for(pci_dev = pci_find_device(pci_id->vendor, pci_id->device, NULL);
+	for(pci_dev = pci_get_device(pci_id->vendor, pci_id->device, NULL);
 			pci_dev != NULL ; 
-			pci_dev = pci_find_device(pci_id->vendor,
+			pci_dev = pci_get_device(pci_id->vendor,
 				pci_id->device, pci_dev)) {
 		/* If bus/slot specified, check them. */
 		if (bus || slot) {
@@ -755,7 +755,7 @@
 dio200_attach(comedi_device *dev,comedi_devconfig *it)
 {
 	comedi_subdevice *s;
-	struct pci_dev *pci_dev;
+	struct pci_dev *pci_dev = NULL;
 	int iobase = 0, irq = 0;
 	int bus = 0, slot = 0;
 	dio200_layout *layout;
@@ -785,6 +785,7 @@
 		if ((ret=pci_enable_device(pci_dev)) < 0) {
 			printk(KERN_ERR "comedi%d: error! cannot enable PCI device!\n",
 					dev->minor);
+			pci_dev_put(pci_dev);
 			return ret;
 		}
 		iobase = pci_resource_start(pci_dev, 2);
@@ -799,6 +800,9 @@
 
 	if ((ret=alloc_private(dev,sizeof(dio200_private))) < 0) {
 		printk(KERN_ERR "comedi%d: error! out of memory!\n", dev->minor);
+		if (pci_dev) {
+			pci_dev_put(pci_dev);
+		}
 		return ret; 
 	}
 
@@ -926,6 +930,9 @@
 	}
 	if (dev->iobase) {
 		release_region(dev->iobase, DIO200_IO_SIZE);
+	}
+	if (devpriv && devpriv->pci_dev) {
+		pci_dev_put(devpriv->pci_dev);
 	}
 	if (dev->board_name) {
 		printk(KERN_INFO "comedi%d: %s removed\n",
Index: comedi/drivers/amplc_pc236.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/amplc_pc236.c,v
retrieving revision 1.11
diff -u -r1.11 amplc_pc236.c
--- comedi/drivers/amplc_pc236.c	17 Feb 2005 23:37:58 -0000	1.11
+++ comedi/drivers/amplc_pc236.c	28 Feb 2005 14:29:24 -0000
@@ -198,9 +198,9 @@
 		}
 
 		/* Look for matching PCI device. */
-		for(pci_dev = pci_find_device(pci_id->vendor, pci_id->device,
+		for(pci_dev = pci_get_device(pci_id->vendor, pci_id->device,
 					NULL); pci_dev != NULL; 
-				pci_dev = pci_find_device(pci_id->vendor,
+				pci_dev = pci_get_device(pci_id->vendor,
 					pci_id->device, pci_dev)) {
 			/* If bus/slot specified, check them. */
 			if (bus || slot) {
@@ -229,6 +229,7 @@
 		}
 		if ((ret=pci_enable_device(pci_dev)) < 0) {
 			printk("error enabling PCI device!\n");
+			pci_dev_put(pci_dev);
 			return ret;
 		}
 		lcr_iobase = pci_resource_start(pci_dev, 1);
@@ -253,6 +254,8 @@
  */
 	if ((ret=alloc_private(dev,sizeof(pc236_private))) < 0) {
 		printk("out of memory!\n");
+		if (pci_dev)
+			pci_dev_put(pci_dev);
 		return ret; 
 	}
 
@@ -344,11 +347,15 @@
 	if (dev->subdevices) {
 		subdev_8255_cleanup(dev, dev->subdevices+0);
 	}
+	if (dev->iobase) {
+		release_region(dev->iobase, PC236_IO_SIZE);
+	}
 	if (devpriv) {
 		if (devpriv->lcr_iobase)
 			release_region(devpriv->lcr_iobase, PC236_LCR_IO_SIZE);
+		if (devpriv->pci_dev)
+			pci_dev_put(devpriv->pci_dev);
 	}
-	if (dev->iobase) release_region(dev->iobase, PC236_IO_SIZE);
 	
 	return 0;
 }
Index: comedi/drivers/amplc_pc263.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/amplc_pc263.c,v
retrieving revision 1.6
diff -u -r1.6 amplc_pc263.c
--- comedi/drivers/amplc_pc263.c	25 Jan 2005 23:44:43 -0000	1.6
+++ comedi/drivers/amplc_pc263.c	28 Feb 2005 14:29:24 -0000
@@ -200,6 +200,7 @@
 		}
 		if ((ret=pci_enable_device(pci_dev)) < 0) {
 			printk("error enabling PCI device!\n");
+			pci_dev_put(pci_dev);
 			return ret;
 		}
 		iobase = pci_resource_start(pci_dev, 2);
@@ -222,6 +223,8 @@
  */
 	if ((ret=alloc_private(dev,sizeof(pc263_private))) < 0) {
 		printk("out of memory!\n");
+		if (pci_dev)
+			pci_dev_put(pci_dev);
 		return ret;
 	}
 
@@ -285,6 +288,8 @@
 
 	if (dev->iobase)
 		release_region(dev->iobase, PC263_IO_SIZE);
+	if (devpriv && devpriv->pci_dev)
+		pci_dev_put(devpriv->pci_dev);
 	
 	return 0;
 }
Index: comedi/drivers/amplc_pci230.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/amplc_pci230.c,v
retrieving revision 1.28
diff -u -r1.28 amplc_pci230.c
--- comedi/drivers/amplc_pci230.c	22 Jan 2005 14:22:19 -0000	1.28
+++ comedi/drivers/amplc_pci230.c	28 Feb 2005 14:29:26 -0000
@@ -332,8 +332,8 @@
 	printk("comedi%d: amplc_pci230\n",dev->minor);
 	
 	/* Find card */
-	for(pci_dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_dev != NULL ; 
-		pci_dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci_dev)) {
+	for(pci_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_dev != NULL ; 
+		pci_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pci_dev)) {
 		if(pci_dev->vendor != PCI_VENDOR_ID_AMPLICON)
 			continue;
 		for(i=0;i<n_pci230_boards;i++){
@@ -350,7 +350,10 @@
 	dev->board_ptr = pci230_boards+i;
 	
 	/* Read base addressses of the PCI230's two I/O regions from PCI configuration register. */
-	if(pci_enable_device(pci_dev)<0)return -EIO;
+	if(pci_enable_device(pci_dev)<0){
+		pci_dev_put(pci_dev);
+		return -EIO;
+	}
 
 	pci_iobase = pci_resource_start(pci_dev, 2);
 	iobase = pci_resource_start(pci_dev, 3);
@@ -359,8 +362,10 @@
 
 	/* Allocate the private structure area using alloc_private().
 	 * Macro defined in comedidev.h - memsets struct fields to 0. */
-	if((alloc_private(dev,sizeof(struct pci230_private)))<0)
+	if((alloc_private(dev,sizeof(struct pci230_private)))<0){
+		pci_dev_put(pci_dev);
 		return -ENOMEM;
+	}
 	devpriv->pci_dev = pci_dev;
 
 	/* Reserve I/O space 1. */
@@ -485,6 +490,9 @@
 	if(devpriv){
 		if(devpriv->pci_iobase){
 			release_region(devpriv->pci_iobase, PCI230_IO1_SIZE);
+		}
+		if(devpriv->pci_dev){
+			pci_dev_put(devpriv->pci_dev);
 		}
 	}
 	
Index: comedi/drivers/cb_pcidas.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/cb_pcidas.c,v
retrieving revision 1.89
diff -u -r1.89 cb_pcidas.c
--- comedi/drivers/cb_pcidas.c	6 Feb 2005 16:06:00 -0000	1.89
+++ comedi/drivers/cb_pcidas.c	28 Feb 2005 14:29:27 -0000
@@ -769,6 +769,8 @@
 		comedi_free_irq(dev->irq, dev);
 	if(dev->subdevices)
 		subdev_8255_cleanup(dev,dev->subdevices + 2);
+	if(devpriv && devpriv->pci_dev)
+		pci_dev_put(devpriv->pci_dev);
 
 	return 0;
 }
Index: comedi/drivers/cb_pcidas64.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/cb_pcidas64.c,v
retrieving revision 1.123
diff -u -r1.123 cb_pcidas64.c
--- comedi/drivers/cb_pcidas64.c	22 Jan 2005 14:22:19 -0000	1.123
+++ comedi/drivers/cb_pcidas64.c	28 Feb 2005 14:29:32 -0000
@@ -1644,8 +1644,8 @@
  * Probe the device to determine what device in the series it is.
  */
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) 
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) 
 	{
 		// is it not a computer boards card?
 		if( pcidev->vendor != PCI_VENDOR_ID_COMPUTERBOARDS )
@@ -1681,7 +1681,10 @@
 		pcidev->bus->number, PCI_SLOT(pcidev->devfn));
 
 	if( pci_enable_device( pcidev ) )
+	{
+		pci_dev_put( pcidev );
 		return -EIO;
+	}
 	pci_set_master( pcidev );
 
 	priv(dev)->hw_dev = pcidev;
@@ -1801,6 +1804,7 @@
 				pci_free_consistent(priv(dev)->hw_dev, sizeof(struct plx_dma_desc) * AO_DMA_RING_COUNT,
 					priv(dev)->ao_dma_desc, priv(dev)->ao_dma_desc_bus_addr );
 			pci_disable_device(priv(dev)->hw_dev);
+			pci_dev_put(priv(dev)->hw_dev);
 		}
 	}
 	if(dev->subdevices)
Index: comedi/drivers/cb_pcidda.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/cb_pcidda.c,v
retrieving revision 1.29
diff -u -r1.29 cb_pcidda.c
--- comedi/drivers/cb_pcidda.c	22 Jan 2005 14:22:19 -0000	1.29
+++ comedi/drivers/cb_pcidda.c	28 Feb 2005 14:29:32 -0000
@@ -284,8 +284,8 @@
  */
 	printk("\n");
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
 		if(pcidev->vendor==PCI_VENDOR_ID_CB){
 			if(it->options[0] || it->options[1]){
 				if(pcidev->bus->number==it->options[0] &&
@@ -310,6 +310,7 @@
 	}
 	printk("Not a supported ComputerBoards/MeasurementComputing card on "
 		"requested position\n");
+	pci_dev_put(pcidev);
 	return -EIO;
 
 found:
@@ -408,6 +409,8 @@
 			release_region(devpriv->digitalio, DIGITALIO_SIZE);
 		if(devpriv->dac)
 			release_region(devpriv->dac, 8 + thisboard->ao_chans*2);
+		if(devpriv->pci_dev)
+			pci_dev_put(devpriv->pci_dev);
 	}
 	// cleanup 8255
 	if(dev->subdevices)
Index: comedi/drivers/cb_pcimdas.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/cb_pcimdas.c,v
retrieving revision 1.8
diff -u -r1.8 cb_pcimdas.c
--- comedi/drivers/cb_pcimdas.c	22 Jan 2005 14:22:19 -0000	1.8
+++ comedi/drivers/cb_pcimdas.c	28 Feb 2005 14:29:33 -0000
@@ -239,8 +239,8 @@
  */
 	printk("\n");
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev))
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev))
 	{
 		// is it not a computer boards card?
 		if(pcidev->vendor != PCI_VENDOR_ID_COMPUTERBOARDS)
@@ -407,13 +407,18 @@
 static int cb_pcimdas_detach(comedi_device *dev)
 {
 #ifdef CBPCIMDAS_DEBUG
-	printk("devpriv->BADR0 = %d\n",devpriv->BADR0);
-	printk("devpriv->BADR1 = %d\n",devpriv->BADR1);
-	printk("devpriv->BADR2 = %d\n",devpriv->BADR2);
-	printk("devpriv->BADR3 = %d\n",devpriv->BADR3);
-	printk("devpriv->BADR4 = %d\n",devpriv->BADR4);
+	if(devpriv)
+	{
+		printk("devpriv->BADR0 = %d\n",devpriv->BADR0);
+		printk("devpriv->BADR1 = %d\n",devpriv->BADR1);
+		printk("devpriv->BADR2 = %d\n",devpriv->BADR2);
+		printk("devpriv->BADR3 = %d\n",devpriv->BADR3);
+		printk("devpriv->BADR4 = %d\n",devpriv->BADR4);
+	}
 #endif
 	printk("comedi%d: cb_pcimdas: remove\n",dev->minor);
+	if(devpriv)
+	{
 		if(devpriv->BADR0)
 			release_mem_region(devpriv->BADR0, BADR0_SIZE);
 		if(devpriv->BADR1)
@@ -424,6 +429,9 @@
 			release_region(devpriv->BADR3, BADR3_SIZE);
 		if(devpriv->BADR4)
 			release_region(devpriv->BADR4, BADR4_SIZE);
+		if(devpriv->pci_dev)
+			pci_dev_put(devpriv->pci_dev);
+	}
 	
 	if(dev->irq)
 		comedi_free_irq(dev->irq, dev);
Index: comedi/drivers/cb_pcimdda.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/cb_pcimdda.c,v
retrieving revision 1.10
diff -u -r1.10 cb_pcimdda.c
--- comedi/drivers/cb_pcimdda.c	22 Jan 2005 14:22:19 -0000	1.10
+++ comedi/drivers/cb_pcimdda.c	28 Feb 2005 14:29:34 -0000
@@ -347,6 +347,10 @@
             devpriv->attached_to_8255 = 0;
         }
 
+	if (devpriv->pci_dev) {
+		pci_dev_put(devpriv->pci_dev);
+	}
+
         if (devpriv->attached_successfully && thisboard)
             printk("comedi%d: %s: detached\n", dev->minor, thisboard->name);
 
@@ -438,8 +442,8 @@
     struct pci_dev *pcidev;
 	int index, registers;
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev))
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev))
 	{
 		// is it not a computer boards card?
 		if(pcidev->vendor != PCI_VENDOR_ID_COMPUTERBOARDS)
Index: comedi/drivers/contec_pci_dio.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/contec_pci_dio.c,v
retrieving revision 1.10
diff -u -r1.10 contec_pci_dio.c
--- comedi/drivers/contec_pci_dio.c	22 Jan 2005 14:22:19 -0000	1.10
+++ comedi/drivers/contec_pci_dio.c	28 Feb 2005 14:29:34 -0000
@@ -107,11 +107,12 @@
 	if(alloc_subdevices(dev, 2)<0)
 		return -ENOMEM;
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
 		
 		if ( pcidev->vendor == PCI_VENDOR_ID_CONTEC && 
 		     pcidev->device == PCI_DEVICE_ID_PIO1616L ) {
+			devpriv->pci_dev = pcidev;
 			dev->iobase = pci_resource_start ( pcidev, 0 );
 			printk ( " base addr %lx ", dev->iobase );
 
@@ -146,6 +147,9 @@
 static int contec_detach(comedi_device *dev)
 {
 	printk("comedi%d: contec: remove\n",dev->minor);
+
+	if (devpriv && devpriv->pci_dev)
+		pci_dev_put(devpriv->pci_dev);
 	
 	return 0;
 }
Index: comedi/drivers/daqboard2000.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/daqboard2000.c,v
retrieving revision 1.33
diff -u -r1.33 daqboard2000.c
--- comedi/drivers/daqboard2000.c	21 Apr 2004 05:56:54 -0000	1.33
+++ comedi/drivers/daqboard2000.c	28 Feb 2005 14:29:35 -0000
@@ -323,6 +323,7 @@
   enum {
     card_daqboard_2000
   } card;
+  struct pci_dev *pci_dev;
   void *daq;
   void *plx;
   lsampl_t ao_readback[2];
@@ -685,7 +686,7 @@
 
   /* FIXME: we should handle multiple cards, have to make David decide 
             how, so we will be consistent among all PCI card drivers... */
-  card = pci_find_device(0x1616, 0x0409, NULL);
+  card = pci_get_device(0x1616, 0x0409, NULL);
 
   if (!card) {
     printk(" no daqboard2000 found\n");
@@ -694,6 +695,7 @@
   }
 
   if((result = pci_enable_device(card))<0){
+    pci_dev_put(card);
     goto out;
   }
 
@@ -714,11 +716,17 @@
   }else{
     printk(" abnormal pci header type !?!?\n");
     result=-EIO;
+    pci_dev_put(card);
     goto out;
   }
   
   result = alloc_private(dev,sizeof(daqboard2000_private));
-  if(result<0)goto out;
+  if(result<0){
+    pci_dev_put(card);
+    goto out;
+  }
+
+  devpriv->pci_dev = card;
 
   result = alloc_subdevices(dev, 3);
   if(result<0)goto out;
@@ -799,6 +807,9 @@
   }
   if (dev->irq) {
     free_irq(dev->irq, dev);
+  }
+  if (devpriv && devpriv->pci_dev) {
+    pci_dev_put(devpriv->pci_dev);
   }
   return 0;
 }
Index: comedi/drivers/das08.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/das08.c,v
retrieving revision 1.50
diff -u -r1.50 das08.c
--- comedi/drivers/das08.c	22 Jan 2005 14:22:19 -0000	1.50
+++ comedi/drivers/das08.c	28 Feb 2005 14:29:36 -0000
@@ -943,8 +943,8 @@
 		}
 		printk("\n");
 		// find card
-		for(pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pdev != NULL ; 
-			pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) {
+		for(pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pdev != NULL ; 
+			pdev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) {
 			if(pdev->vendor == PCI_VENDOR_ID_COMPUTERBOARDS &&
 				pdev->device == PCI_DEVICE_ID_PCIDAS08){
 				if(it->options[0] || it->options[1]){
@@ -1011,6 +1011,9 @@
 	if(devpriv){
 		if(devpriv->pci_iobase){
 			release_region(devpriv->pci_iobase, PCIDAS08_SIZE);
+		}
+		if(devpriv->pdev){
+			pci_dev_put(devpriv->pdev);
 		}
 	}
 
Index: comedi/drivers/dt3000.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/dt3000.c,v
retrieving revision 1.31
diff -u -r1.31 dt3000.c
--- comedi/drivers/dt3000.c	27 Feb 2005 23:47:50 -0000	1.31
+++ comedi/drivers/dt3000.c	28 Feb 2005 14:29:36 -0000
@@ -841,6 +841,8 @@
 {
 	if(dev->irq)comedi_free_irq(dev->irq,dev);
 
+	if(devpriv && devpriv->pci_dev) pci_dev_put(devpriv->pci_dev);
+
 	/* XXX */
 
 	return 0;
@@ -892,8 +894,8 @@
 {
 	int i;
 	
-	for(from=pci_find_device(PCI_VENDOR_ID_DT,PCI_ANY_ID,from); from!=NULL;
-			from=pci_find_device(PCI_VENDOR_ID_DT,PCI_ANY_ID,from)){
+	for(from=pci_get_device(PCI_VENDOR_ID_DT,PCI_ANY_ID,from); from!=NULL;
+			from=pci_get_device(PCI_VENDOR_ID_DT,PCI_ANY_ID,from)){
 		for(i=0;i<n_dt3k_boards;i++){
 			if(from->device == dt3k_boardtypes[i].device_id){
 				*board=i;
Index: comedi/drivers/gsc_hpdi.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/gsc_hpdi.c,v
retrieving revision 1.24
diff -u -r1.24 gsc_hpdi.c
--- comedi/drivers/gsc_hpdi.c	28 Feb 2005 00:08:15 -0000	1.24
+++ comedi/drivers/gsc_hpdi.c	28 Feb 2005 14:29:37 -0000
@@ -575,7 +575,10 @@
 		pcidev->bus->number, PCI_SLOT(pcidev->devfn));
 
 	if( pci_enable_device( pcidev ) )
+	{
+		pci_dev_put( pcidev );
 		return -EIO;
+	}
 	pci_set_master( pcidev );
 
 	priv(dev)->hw_dev = pcidev;
Index: comedi/drivers/ke_counter.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/ke_counter.c,v
retrieving revision 1.7
diff -u -r1.7 ke_counter.c
--- comedi/drivers/ke_counter.c	22 Jan 2005 14:22:19 -0000	1.7
+++ comedi/drivers/ke_counter.c	28 Feb 2005 14:29:37 -0000
@@ -74,6 +74,15 @@
 
 #define cnt_board_nbr (sizeof(cnt_boards)/sizeof(cnt_board_struct))
 
+/*-- device private structure -----------------------------------------------*/
+
+typedef struct
+{
+  struct pci_dev *pcidev;
+} cnt_device_private;
+
+#define devpriv ((cnt_device_private *)dev->private)
+
 static comedi_driver cnt_driver =
 {
   driver_name: CNT_DRIVER_NAME,
@@ -140,8 +149,8 @@
   int              error, i;
 
   /* Probe the device to determine what device in the series it is. */
-	for(pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
-		pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci_device))
+	for(pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
+		pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pci_device))
   {
     if(pci_device->vendor == PCI_VENDOR_ID_KOLTER)
     {
@@ -181,6 +190,15 @@
   request_region(io_base & PCI_BASE_ADDRESS_IO_MASK, 0x08, CNT_DRIVER_NAME);
   dev->iobase = io_base & PCI_BASE_ADDRESS_IO_MASK;
 
+  /* allocate device private structure */
+  if((error = alloc_private(dev, sizeof(cnt_device_private))) < 0)
+  {
+    pci_dev_put(pci_device);
+    return error;
+  }
+
+  devpriv->pcidev = pci_device;
+
   /* allocate the subdevice structures */
   if((error = alloc_subdevices(dev, 1)) < 0)
   {
@@ -216,6 +234,10 @@
   if (dev->iobase)
   {
     release_region(dev->iobase, 0x08);
+  }
+  if (devpriv->pcidev)
+  {
+    pci_dev_put(devpriv->pcidev);
   }
 
   printk("comedi%d: " CNT_DRIVER_NAME " remove\n",dev->minor);
Index: comedi/drivers/me4000.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/me4000.c,v
retrieving revision 1.7
diff -u -r1.7 me4000.c
--- comedi/drivers/me4000.c	22 Jan 2005 14:22:20 -0000	1.7
+++ comedi/drivers/me4000.c	28 Feb 2005 14:29:39 -0000
@@ -397,8 +397,8 @@
     /*
      * Probe the device to determine what device in the series it is.
      */
- 	for(pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
-		pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci_device)) {
+ 	for(pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
+		pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pci_device)) {
 	if(pci_device->vendor == PCI_VENDOR_ID_MEILHAUS){
 	    for(i = 0; i < ME4000_BOARD_VERSIONS; i++){
 		if(me4000_boards[i].device_id == pci_device->device){
@@ -430,8 +430,10 @@
 	    pci_device->bus->number, PCI_SLOT(pci_device->devfn));
 
     /* Allocate private memory */
-    if(alloc_private(dev, sizeof(me4000_info_t)) < 0)
+    if(alloc_private(dev, sizeof(me4000_info_t)) < 0){
+	pci_dev_put(pci_device);
 	return -ENOMEM;
+    }
 
     /* Set data in device structure */
     dev->board_name = board->name;
@@ -506,7 +508,6 @@
     pci_release_regions(pci_device);
 
 PROBE_ERROR_1:
-    kfree(info);
 
     return result;
 }
@@ -847,11 +848,14 @@
 static int me4000_detach(comedi_device *dev){
     CALL_PDEBUG("In me4000_detach()\n");
 
-    reset_board(dev);
-
-    pci_release_regions(info->pci_dev_p);
+    if(info){
+	reset_board(dev);
 
-    kfree(info);
+	if(info->pci_dev_p) {
+	    pci_release_regions(info->pci_dev_p);
+	    pci_dev_put(info->pci_dev_p);
+	}
+    }
 
     return 0;
 }
Index: comedi/drivers/me_daq.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/me_daq.c,v
retrieving revision 1.7
diff -u -r1.7 me_daq.c
--- comedi/drivers/me_daq.c	22 Jan 2005 14:22:20 -0000	1.7
+++ comedi/drivers/me_daq.c	28 Feb 2005 14:29:40 -0000
@@ -684,8 +684,8 @@
 //
 // Probe the device to determine what device in the series it is.
 //
-	for(pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
-		pci_device = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pci_device))
+	for(pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pci_device != NULL ; 
+		pci_device = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pci_device))
   {
     if(pci_device->vendor == PCI_VENDOR_ID_MEILHAUS)
     {
@@ -725,7 +725,10 @@
   // Allocate private memory
 
   if(alloc_private(dev,sizeof(me_private_data_struct)) < 0)
+  {
+    pci_dev_put(pci_device);
     return -ENOMEM;
+  }
 
   // Set data in device structure
 
@@ -866,7 +869,15 @@
 
 static int me_detach(comedi_device *dev)
 {
-  me_reset(dev);
+  if(dev_private)
+  {
+    me_reset(dev);
+
+    if(dev_private->pci_device)
+    {
+      pci_dev_put(dev_private->pci_device);
+    }
+  }
 
   return 0;
 }
Index: comedi/drivers/mite.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/mite.c,v
retrieving revision 1.54
diff -u -r1.54 mite.c
--- comedi/drivers/mite.c	3 Feb 2005 23:48:24 -0000	1.54
+++ comedi/drivers/mite.c	28 Feb 2005 14:29:41 -0000
@@ -72,17 +72,18 @@
 	struct pci_dev *pcidev;
 	struct mite_struct *mite;
 
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
 		if(pcidev->vendor==PCI_VENDOR_ID_NATINST){
 			mite=kmalloc(sizeof(*mite),GFP_KERNEL);
 			if(!mite){
 				printk("mite: allocation failed\n");
+				pci_dev_put(pcidev);
 				return;
 			}
 			memset(mite,0,sizeof(*mite));
 
-			mite->pcidev=pcidev;
+			mite->pcidev=pci_dev_get(pcidev);
 
 			mite->next=mite_devices;
 			mite_devices=mite;
@@ -141,6 +142,7 @@
 	struct mite_struct *mite,*next;
 
 	for(mite=mite_devices;mite;mite=next){
+		pci_dev_put(mite->pcidev);
 		next=mite->next;
 		kfree(mite);
 	}
Index: comedi/drivers/rtd520.c
===================================================================
RCS file: /var/cvs/comedi/comedi/drivers/rtd520.c,v
retrieving revision 1.39
diff -u -r1.39 rtd520.c
--- comedi/drivers/rtd520.c	22 Jan 2005 14:22:20 -0000	1.39
+++ comedi/drivers/rtd520.c	28 Feb 2005 14:29:44 -0000
@@ -774,8 +774,8 @@
     /*
      * Probe the device to determine what device in the series it is.
      */
-	for(pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
-		pcidev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
+	for(pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); pcidev != NULL ; 
+		pcidev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, pcidev)) {
 	if (pcidev->vendor == PCI_VENDOR_ID_RTD) {
 	    if (it->options[0] || it->options[1]) {
 		if (pcidev->bus->number == it->options[0]
@@ -800,12 +800,12 @@
 	return -EIO;
     }
 
+    devpriv->pci_dev = pcidev;
     if (pcidev->device != thisboard->device_id) {
 	printk ("Found an RTD card, but not the supported type (%x).\n",
 		pcidev->device);
 	return -EIO;
     }
-    devpriv->pci_dev = pcidev;
     dev->board_name = thisboard->name;
 
     if((ret=pci_enable_device(pcidev))<0){
@@ -1022,6 +1022,7 @@
 
     return 1;
 
+#if 0
     /* hit an error, clean up memory and return ret */
 //rtd_attach_die_error:
 #ifdef USE_DMA
@@ -1063,7 +1064,11 @@
     if (devpriv->lcfg) {
 	iounmap (devpriv->lcfg);
     }
+    if (devpriv->pci_dev) {
+	pci_dev_put(devpriv->pci_dev);
+    }
     return ret;
+#endif
 }
 
 /*
@@ -1138,6 +1143,9 @@
 	}
 	if (devpriv->lcfg) {
 	    iounmap (devpriv->lcfg);
+	}
+	if (devpriv->pci_dev) {
+	    pci_dev_put(devpriv->pci_dev);
 	}
     }
 

