]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/unican.c
Changed filling of the chip specific operations.
[lincan.git] / lincan / src / unican.c
index 2347a675f99dd7b0b78acd8a1716ba73a5b27011..f2c7ec60d1498d6b91c87a2f21ed6a116eee6f8c 100644 (file)
@@ -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"
@@ -759,8 +759,6 @@ int unican_init_hw_data(struct candevice_t *candev)
        return 0;
 }
 
-#define CHIP_TYPE "unican"
-
 /**
  * unican_init_chip_data - Initialize chips
  * @candev: Pointer to candevice/board structure
@@ -772,7 +770,7 @@ int unican_init_hw_data(struct candevice_t *candev)
 int unican_init_chip_data(struct candevice_t *candev, int chipnr)
 {
        struct chip_t *chip = candev->chip[chipnr];
-       chip->chip_type = CHIP_TYPE;
+       chip->chip_type = "unican";
        chip->chip_base_addr = 0;
        chip->clock = 10000000;
        chip->int_clk_reg = 0x0;
@@ -854,6 +852,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 +866,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 +920,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 +938,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 +961,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*/