]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/unican_vme.c
Adapted for modified version of VME bridge driver (ca91c042).
[lincan.git] / lincan / src / unican_vme.c
index 5075a01fe44bd5c93decb3f3b8a059b313d8e70b..94f122bbb61aeac53a6f1064673b8895b7fef83e 100644 (file)
@@ -3,65 +3,12 @@
  * 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
  */ 
 
-/* This file is included in unican.c when CAN_ENABLE_VME_SUPPORT is
+/* This file is included in unican.c if CAN_ENABLE_VME_SUPPORT is
  * set. */
 
-#include "ca91c042.h"
-
-#define UNICAN_VME_IRQ 1
-
-/* Used to pass chip pointer to irq handler. This sould be done in VME
- * bridge driver */
-#define VME_CHIPS_SIZE 8
-struct chip_t *vme_chips[VME_CHIPS_SIZE];
-
-can_irqreturn_t unican_vme_irq_handler(int vmeirq, int vector, void *dev_id, struct pt_regs *regs)
-{
-/*     struct chip_t *chip = vme_chips[vector < VME_CHIPS_SIZE && vector >= 0 ? vector : 0]; */
-       struct chip_t *chip = vme_chips[0];
-
-       DEBUGMSG("unican_vme_irq_handler: vmeirq=0x%08x vector=0x%08x\n", vmeirq, vector);
-       return  unican_irq_handler(vmeirq, chip, regs);
-}
-
-int unican_vme_request_io(struct candevice_t *candev)
-{
-       struct chip_t *chip = candev->chip[0];
-
-       unican_request_io(candev);
-
-       if (chip->chip_irq < 0 || chip->chip_irq >= VME_CHIPS_SIZE) {
-               CANMSG("Bad irq parameter. Maximum is %d.\n", VME_CHIPS_SIZE-1);
-               return -EINVAL;
-       }
-
-/*     vme_chips[chip->chip_irq] = chip; */
-       vme_chips[0] = chip;    
-
-       request_vmeirq(UNICAN_VME_IRQ, unican_vme_irq_handler);
-       enable_vmeirq(UNICAN_VME_IRQ);
-
-       return 0;
-}
-
-/**
- * unican_vme_release_io - free reserved io memory range
- * @candev: pointer to candevice/board which releases io
- *
- * Return Value: The function always returns zero
- * File: src/unican.c
- */
-int unican_vme_release_io(struct candevice_t *candev)
-{
-       unican_release_io(candev);
-
-       free_vmeirq(UNICAN_VME_IRQ);
-       disable_vmeirq(UNICAN_VME_IRQ);
-       return 0;
-}
 
 /**
  * unican_vme_init_hw_data - Initialize hardware cards
@@ -79,8 +26,7 @@ int unican_vme_reset(struct candevice_t *candev)
 
        /* Setup VME interrupt vector */
        if (ret == 0) 
-               unican_writew(0x1234/* chip->chip_irq */,chip->chip_base_addr+CL2_VME_INT_VECTOR);
-
+               unican_writew(chip->chip_irq, chip->chip_base_addr+CL2_VME_INT_VECTOR);
 
        return ret;
 }
@@ -100,18 +46,27 @@ int unican_vme_init_chip_data(struct candevice_t *candev, int chipnr)
        unican_init_chip_data(candev, chipnr);
 
        chip->flags |= CHIP_IRQ_VME;
-       chip->chipspecops->irq_handler=unican_vme_irq_handler;
+       chip->chipspecops->irq_handler=unican_irq_handler;
        return 0;
 }
 
 
+int unican_vme_init_hw_data(struct candevice_t *candev) 
+{
+       unican_init_hw_data(candev);
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+
+       return 0;
+}
+
 int unican_vme_register(struct hwspecops_t *hwspecops)
 {
        unican_register(hwspecops);
 
-       hwspecops->request_io = unican_vme_request_io;
-       hwspecops->release_io = unican_vme_release_io;
-       hwspecops->reset = unican_vme_reset;
+       hwspecops->init_hw_data = unican_vme_init_hw_data;
        hwspecops->init_chip_data = unican_vme_init_chip_data;
+       hwspecops->request_io = unican_request_io;
+       hwspecops->reset = unican_vme_reset;
+       hwspecops->release_io = unican_release_io;
        return 0;
 }