]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/ems_cpcpci.c
LinCAN PCI cards support updated to support PCI devices reference counting.
[lincan.git] / lincan / src / ems_cpcpci.c
index ffd141873e4801e0d50ef76eea411a793c8b3454..55c4d983aea67d6fbd4db018eeb0f24998513482 100644 (file)
@@ -287,15 +287,17 @@ int ems_cpcpci_reset(struct candevice_t *candev)
 
 int ems_cpcpci_init_hw_data(struct candevice_t *candev)
 {
-       struct pci_dev *pcidev = NULL;
+       struct pci_dev *pcidev;
        int i;
        unsigned long l;
 
-       pcidev = pci_find_device(EMS_CPCPCI_PCICAN_VENDOR, EMS_CPCPCI_PCICAN_ID, pcidev);
-       if(pcidev == NULL) return -ENODEV;
+       pcidev = can_pci_get_next_untaken_device(EMS_CPCPCI_PCICAN_VENDOR, EMS_CPCPCI_PCICAN_ID);
+       if(pcidev == NULL)
+               return -ENODEV;
        
        if (pci_enable_device (pcidev)){
                printk(KERN_CRIT "Setup of EMS_CPCPCI failed\n");
+               can_pci_dev_put(pcidev);
                return -EIO;
        }
        candev->sysdevptr.pcidev=pcidev;
@@ -303,13 +305,16 @@ int ems_cpcpci_init_hw_data(struct candevice_t *candev)
        for(i=0;i<2;i++){
                if(!(pci_resource_flags(pcidev,0)&IORESOURCE_MEM)){
                        printk(KERN_CRIT "EMS_CPCPCI region %d is not memory\n",i);
+                       can_pci_dev_put(pcidev);
                        return -EIO;
                }
        }
 
        /*request IO access temporarily to check card presence*/
-       if(ems_cpcpci_request_io(candev)<0)
+       if(ems_cpcpci_request_io(candev)<0) {
+               can_pci_dev_put(pcidev);
                return -ENODEV;
+       }
 
        /*** candev->aux_base_addr=pci_resource_start(pcidev,0); ***/
        /* some control registers */
@@ -340,10 +345,16 @@ int ems_cpcpci_init_hw_data(struct candevice_t *candev)
        candev->nr_all_chips=2;
 
        ems_cpcpci_release_io(candev);
-        
+
        return 0;
 }
 
+void ems_cpcpci_done_hw_data(struct candevice_t *candev)
+{
+       struct pci_dev *pcidev = candev->sysdevptr.pcidev;
+       can_pci_dev_put(pcidev);
+}
+
 int ems_cpcpci_init_chip_data(struct candevice_t *candev, int chipnr)
 {
        if(candev->sysdevptr.pcidev==NULL)
@@ -390,6 +401,7 @@ int ems_cpcpci_register(struct hwspecops_t *hwspecops)
        hwspecops->release_io = ems_cpcpci_release_io;
        hwspecops->reset = ems_cpcpci_reset;
        hwspecops->init_hw_data = ems_cpcpci_init_hw_data;
+       hwspecops->done_hw_data = ems_cpcpci_done_hw_data;
        hwspecops->init_chip_data = ems_cpcpci_init_chip_data;
        hwspecops->init_obj_data = ems_cpcpci_init_obj_data;
        hwspecops->write_register = ems_cpcpci_write_register;