]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/esdpci266.c
Actual driver code for directly mapped SJA1000 into PCI mem region 0.
[lincan.git] / lincan / src / esdpci266.c
index 770ffd881ddb52caa9f57620d2ca1c159d5eaa4f..fc043bcf74c4bee2d617717c1766088b245de198 100644 (file)
@@ -203,28 +203,18 @@ int esdpci266_reset(struct candevice_t *candev)
 
 int esdpci266_init_hw_data(struct candevice_t *candev)
 {
-       struct pci_dev *pcidev = NULL;
+       struct pci_dev *pcidev;
 
        printk("lincan: search for ESD PCI/PMC 266 board ...\n");
 
-       do {
-               pcidev =
-                   pci_find_device(PLX_9056_VENDOR_ID, PLX_9056_DEVICE_ID,
-                                   pcidev);
-               if (pcidev == NULL)
-                       return -ENODEV;
-               if (pcidev->subsystem_vendor != ESDPCI266_PCI_VENDOR_ID
-                   || pcidev->subsystem_device != ESDPCI266_PCI_PRODUCT_ID) {
-                       printk
-                           ("PLX9056 found, subvendor/subdevice mismatch (%04d:%04d)\n",
-                            pcidev->subsystem_vendor,
-                            pcidev->subsystem_device);
-                       continue;
-               }
-       } while (can_check_dev_taken(pcidev));
+       pcidev = can_pci_get_next_untaken_subsyst(PLX_9056_VENDOR_ID, PLX_9056_DEVICE_ID,
+                                               ESDPCI266_PCI_VENDOR_ID, ESDPCI266_PCI_PRODUCT_ID);
+       if(pcidev == NULL)
+               return -ENODEV;
 
        if (pci_enable_device(pcidev)) {
                printk("lincan: pci_enable_device() failed\n");
+               can_pci_dev_put(pcidev);
                return -EIO;
        }
 
@@ -242,6 +232,12 @@ int esdpci266_init_hw_data(struct candevice_t *candev)
        return 0;
 }
 
+void esdpci266_done_hw_data(struct candevice_t *candev)
+{
+       struct pci_dev *pcidev = candev->sysdevptr.pcidev;
+       can_pci_dev_put(pcidev);
+}
+
 int esdpci266_init_chip_data(struct candevice_t *candev, int chipnr)
 {
        if (candev->sysdevptr.pcidev == NULL)
@@ -277,6 +273,7 @@ int esdpci266_register(struct hwspecops_t *hwspecops)
        hwspecops->release_io = esdpci266_release_io;
        hwspecops->reset = esdpci266_reset;
        hwspecops->init_hw_data = esdpci266_init_hw_data;
+       hwspecops->done_hw_data = esdpci266_done_hw_data;
        hwspecops->init_chip_data = esdpci266_init_chip_data;
        hwspecops->init_obj_data = esdpci266_init_obj_data;
        hwspecops->write_register = esdpci266_write_register;