]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/adlink7841.c
LinCAN PCI cards support updated to support PCI devices reference counting.
[lincan.git] / lincan / src / adlink7841.c
index 18266b8716cea5ca23f7e7b5148abd47f9b73eca..53853327dfd4965e28c0d1255b0ec897549e7832 100644 (file)
@@ -176,16 +176,16 @@ int adlink7841_reset(struct candevice_t *candev)
 
 int adlink7841_init_hw_data(struct candevice_t *candev)
 {
-       struct pci_dev *pcidev = NULL;
+       struct pci_dev *pcidev;
        int i;
 
-       do {
-               pcidev = pci_find_device(ADLINK7841_PCI_VENDOR_ID, ADLINK7841_PCI_PRODUCT_ID, pcidev);
-               if(pcidev == NULL) return -ENODEV;
-       } while(can_check_dev_taken(pcidev));
+       pcidev = can_pci_get_next_untaken_device(ADLINK7841_PCI_VENDOR_ID, ADLINK7841_PCI_PRODUCT_ID);
+       if(pcidev == NULL)
+               return -ENODEV;
        
        if (pci_enable_device (pcidev)){
                printk(KERN_CRIT "Setup of ADLINK7841 failed\n");
+               can_pci_dev_put(pcidev);
                return -EIO;
        }
        candev->sysdevptr.pcidev=pcidev;
@@ -193,6 +193,7 @@ int adlink7841_init_hw_data(struct candevice_t *candev)
        for(i=1;i<3;i++){
                if(!(pci_resource_flags(pcidev,i)&IORESOURCE_IO)){
                        printk(KERN_CRIT "ADLINK7841 region %d is not IO\n",i);
+                       can_pci_dev_put(pcidev);
                        return -EIO;
                }
        }
@@ -209,6 +210,12 @@ int adlink7841_init_hw_data(struct candevice_t *candev)
        return 0;
 }
 
+void adlink7841_done_hw_data(struct candevice_t *candev)
+{
+       struct pci_dev *pcidev = candev->sysdevptr.pcidev;
+       can_pci_dev_put(pcidev);
+}
+
 int adlink7841_init_chip_data(struct candevice_t *candev, int chipnr)
 {
 
@@ -250,6 +257,7 @@ int adlink7841_register(struct hwspecops_t *hwspecops)
        hwspecops->release_io = adlink7841_release_io;
        hwspecops->reset = adlink7841_reset;
        hwspecops->init_hw_data = adlink7841_init_hw_data;
+       hwspecops->done_hw_data = adlink7841_done_hw_data;
        hwspecops->init_chip_data = adlink7841_init_chip_data;
        hwspecops->init_obj_data = adlink7841_init_obj_data;
        hwspecops->write_register = adlink7841_write_register;