]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/unican_vme.c
LinCAN version updated to 0.3
[lincan.git] / lincan / src / unican_vme.c
index 5075a01fe44bd5c93decb3f3b8a059b313d8e70b..e44a39da3f61ddca96ed77182a7334226c39c687 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
  */ 
 
 /* This file is included in unican.c when CAN_ENABLE_VME_SUPPORT is
@@ -27,19 +27,24 @@ can_irqreturn_t unican_vme_irq_handler(int vmeirq, int vector, void *dev_id, str
        return  unican_irq_handler(vmeirq, chip, regs);
 }
 
-int unican_vme_request_io(struct candevice_t *candev)
+/**
+ * unican_program_irq - program interrupts
+ * @candev: Pointer to candevice/board structure
+ *
+ * Return value: The function returns zero on success or %-ENODEV on failure
+ * File: src/unican.c
+ */
+int unican_vme_program_irq(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;    
+       vme_chips[0] = chip;
 
        request_vmeirq(UNICAN_VME_IRQ, unican_vme_irq_handler);
        enable_vmeirq(UNICAN_VME_IRQ);
@@ -47,6 +52,13 @@ int unican_vme_request_io(struct candevice_t *candev)
        return 0;
 }
 
+int unican_vme_request_io(struct candevice_t *candev)
+{
+       unican_request_io(candev);
+
+       return 0;
+}
+
 /**
  * unican_vme_release_io - free reserved io memory range
  * @candev: pointer to candevice/board which releases io
@@ -56,10 +68,11 @@ int unican_vme_request_io(struct candevice_t *candev)
  */
 int unican_vme_release_io(struct candevice_t *candev)
 {
+       disable_vmeirq(UNICAN_VME_IRQ);
+       free_vmeirq(UNICAN_VME_IRQ);
+
        unican_release_io(candev);
 
-       free_vmeirq(UNICAN_VME_IRQ);
-       disable_vmeirq(UNICAN_VME_IRQ);
        return 0;
 }
 
@@ -105,13 +118,23 @@ int unican_vme_init_chip_data(struct candevice_t *candev, int chipnr)
 }
 
 
+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->init_hw_data = unican_vme_init_hw_data;
+       hwspecops->init_chip_data = unican_vme_init_chip_data;
        hwspecops->request_io = unican_vme_request_io;
-       hwspecops->release_io = unican_vme_release_io;
        hwspecops->reset = unican_vme_reset;
-       hwspecops->init_chip_data = unican_vme_init_chip_data;
+       hwspecops->program_irq = unican_vme_program_irq;
+       hwspecops->release_io = unican_vme_release_io;
        return 0;
 }