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;
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 */
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)
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;