VME support is in a separate file
[lincan.git] / lincan / src / unican_vme.c
1 /* unican_vme.c
2  * Linux CAN-bus device driver.
3  * Written for new CAN driver version by Pavel Pisa - OCERA team member
4  * email:pisa@cmp.felk.cvut.cz
5  * This software is released under the GPL-License.
6  * Version lincan-0.2  9 Jul 2003
7  */ 
8
9 /* This file is included in unican.c when CAN_ENABLE_VME_SUPPORT is
10  * set. */
11
12 #include "ca91c042.h"
13
14 #define UNICAN_VME_IRQ 1
15
16 /* Used to pass chip pointer to irq handler. This sould be done in VME
17  * bridge driver */
18 #define VME_CHIPS_SIZE 8
19 struct chip_t *vme_chips[VME_CHIPS_SIZE];
20
21 can_irqreturn_t unican_vme_irq_handler(int vmeirq, int vector, void *dev_id, struct pt_regs *regs)
22 {
23 /*      struct chip_t *chip = vme_chips[vector < VME_CHIPS_SIZE && vector >= 0 ? vector : 0]; */
24         struct chip_t *chip = vme_chips[0];
25
26         DEBUGMSG("unican_vme_irq_handler: vmeirq=0x%08x vector=0x%08x\n", vmeirq, vector);
27         return  unican_irq_handler(vmeirq, chip, regs);
28 }
29
30 int unican_vme_request_io(struct candevice_t *candev)
31 {
32         struct chip_t *chip = candev->chip[0];
33
34         unican_request_io(candev);
35
36         if (chip->chip_irq < 0 || chip->chip_irq >= VME_CHIPS_SIZE) {
37                 CANMSG("Bad irq parameter. Maximum is %d.\n", VME_CHIPS_SIZE-1);
38                 return -EINVAL;
39         }
40
41 /*      vme_chips[chip->chip_irq] = chip; */
42         vme_chips[0] = chip;    
43
44         request_vmeirq(UNICAN_VME_IRQ, unican_vme_irq_handler);
45         enable_vmeirq(UNICAN_VME_IRQ);
46
47         return 0;
48 }
49
50 /**
51  * unican_vme_release_io - free reserved io memory range
52  * @candev: pointer to candevice/board which releases io
53  *
54  * Return Value: The function always returns zero
55  * File: src/unican.c
56  */
57 int unican_vme_release_io(struct candevice_t *candev)
58 {
59         unican_release_io(candev);
60
61         free_vmeirq(UNICAN_VME_IRQ);
62         disable_vmeirq(UNICAN_VME_IRQ);
63         return 0;
64 }
65
66 /**
67  * unican_vme_init_hw_data - Initialize hardware cards
68  * @candev: Pointer to candevice/board structure
69  *
70  * Return Value: The function always returns zero
71  * File: src/unican.c
72  */
73 int unican_vme_reset(struct candevice_t *candev)
74 {
75         int ret;
76         struct chip_t *chip = candev->chip[0];
77
78         ret = unican_reset(candev);
79
80         /* Setup VME interrupt vector */
81         if (ret == 0) 
82                 unican_writew(0x1234/* chip->chip_irq */,chip->chip_base_addr+CL2_VME_INT_VECTOR);
83
84
85         return ret;
86 }
87
88 /**
89  * unican_vme_init_chip_data - Initialize chips
90  * @candev: Pointer to candevice/board structure
91  * @chipnr: Number of the CAN chip on the hardware card
92  *
93  * Return Value: The function always returns zero
94  * File: src/unican.c
95  */
96 int unican_vme_init_chip_data(struct candevice_t *candev, int chipnr)
97 {
98         struct chip_t *chip = candev->chip[chipnr];
99
100         unican_init_chip_data(candev, chipnr);
101
102         chip->flags |= CHIP_IRQ_VME;
103         chip->chipspecops->irq_handler=unican_vme_irq_handler;
104         return 0;
105 }
106
107
108 int unican_vme_register(struct hwspecops_t *hwspecops)
109 {
110         unican_register(hwspecops);
111
112         hwspecops->request_io = unican_vme_request_io;
113         hwspecops->release_io = unican_vme_release_io;
114         hwspecops->reset = unican_vme_reset;
115         hwspecops->init_chip_data = unican_vme_init_chip_data;
116         return 0;
117 }