X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/4a1f32c3421f6e8f1ea90192e4ef4074f09db891..a4c9ead4b64bd4de307f375c2ff313a7a07a06e0:/lincan/src/unican.c diff --git a/lincan/src/unican.c b/lincan/src/unican.c index 2347a67..fde7c00 100644 --- a/lincan/src/unican.c +++ b/lincan/src/unican.c @@ -3,7 +3,7 @@ * Written for new CAN driver version by Pavel Pisa - OCERA team member * email:pisa@cmp.felk.cvut.cz * This software is released under the GPL-License. - * Version lincan-0.2 9 Jul 2003 + * Version lincan-0.3 17 Jun 2004 */ #include "../include/can.h" @@ -854,6 +854,8 @@ int unican_register(struct hwspecops_t *hwspecops) int unican_pci_request_io(struct candevice_t *candev) { + unsigned long remap_addr; + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21)) if(pci_request_region(candev->sysdevptr.pcidev, 0, "unican_pci") != 0){ CANMSG("Request of Unican PCI range failed\n"); @@ -866,12 +868,32 @@ int unican_pci_request_io(struct candevice_t *candev) } #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/ + candev->dev_base_addr=pci_resource_start(candev->sysdevptr.pcidev,0); + candev->io_addr=candev->dev_base_addr; + candev->res_addr=candev->dev_base_addr; + + if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) { + CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr); + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21)) + pci_release_region(candev->sysdevptr.pcidev, 0); + #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/ + pci_release_regions(candev->sysdevptr.pcidev); + #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/ + return -ENODEV; + + } + can_base_addr_fixup(candev, remap_addr); + DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1); + DEBUGMSG("VMA: dev_base_addr: 0x%lx chip_base_addr: 0x%lx\n", + candev->dev_base_addr, candev->chip[0]->chip_base_addr); + return 0; } int unican_pci_release_io(struct candevice_t *candev) { + iounmap((void*)candev->dev_base_addr); #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21)) pci_release_region(candev->sysdevptr.pcidev, 0); #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/ @@ -900,7 +922,7 @@ int unican_pci_init_hw_data(struct candevice_t *candev) printk(KERN_CRIT "Unican PCI region 0 is not MEM\n"); return -EIO; } - candev->dev_base_addr=pci_resource_start(pcidev,0); /*S5920*/ + candev->dev_base_addr=pci_resource_start(pcidev,0); candev->io_addr=candev->dev_base_addr; candev->res_addr=candev->dev_base_addr; @@ -918,7 +940,7 @@ int unican_pci_init_chip_data(struct candevice_t *candev, int chipnr) { int ret; candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq; - ret = unican_pci_init_chip_data(candev, chipnr); + ret = unican_init_chip_data(candev, chipnr); candev->chip[chipnr]->flags |= CHIP_IRQ_PCI; return ret; } @@ -941,26 +963,6 @@ int unican_pci_register(struct hwspecops_t *hwspecops) #ifdef CAN_ENABLE_VME_SUPPORT -int unican_vme_reset(struct candevice_t *candev) -{ - struct chip_t *chip = candev->chip[0]; - unican_writew(chip->chip_irq,chip->chip_base_addr+CL2_VME_INT_VECTOR); - return unican_reset(candev); -} - - -int unican_vme_register(struct hwspecops_t *hwspecops) -{ - hwspecops->request_io = unican_request_io; - hwspecops->release_io = unican_release_io; - hwspecops->reset = unican_vme_reset; - hwspecops->init_hw_data = unican_init_hw_data; - hwspecops->init_chip_data = unican_init_chip_data; - hwspecops->init_obj_data = unican_init_obj_data; - hwspecops->write_register = NULL; - hwspecops->read_register = NULL; - hwspecops->program_irq = unican_program_irq; - return 0; -} +#include "unican_vme.c" #endif /*CAN_ENABLE_VME_SUPPORT*/