]> rtime.felk.cvut.cz Git - lincan.git/blob - lincan/src/unican_vme.c
LinCAN version updated to 0.3
[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.3  17 Jun 2004
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 /**
31  * unican_program_irq - program interrupts
32  * @candev: Pointer to candevice/board structure
33  *
34  * Return value: The function returns zero on success or %-ENODEV on failure
35  * File: src/unican.c
36  */
37 int unican_vme_program_irq(struct candevice_t *candev)
38 {
39         struct chip_t *chip = candev->chip[0];
40
41         if (chip->chip_irq < 0 || chip->chip_irq >= VME_CHIPS_SIZE) {
42                 CANMSG("Bad irq parameter. Maximum is %d.\n", VME_CHIPS_SIZE-1);
43                 return -EINVAL;
44         }
45
46 /*      vme_chips[chip->chip_irq] = chip; */
47         vme_chips[0] = chip;
48
49         request_vmeirq(UNICAN_VME_IRQ, unican_vme_irq_handler);
50         enable_vmeirq(UNICAN_VME_IRQ);
51
52         return 0;
53 }
54
55 int unican_vme_request_io(struct candevice_t *candev)
56 {
57         unican_request_io(candev);
58
59         return 0;
60 }
61
62 /**
63  * unican_vme_release_io - free reserved io memory range
64  * @candev: pointer to candevice/board which releases io
65  *
66  * Return Value: The function always returns zero
67  * File: src/unican.c
68  */
69 int unican_vme_release_io(struct candevice_t *candev)
70 {
71         disable_vmeirq(UNICAN_VME_IRQ);
72         free_vmeirq(UNICAN_VME_IRQ);
73
74         unican_release_io(candev);
75
76         return 0;
77 }
78
79 /**
80  * unican_vme_init_hw_data - Initialize hardware cards
81  * @candev: Pointer to candevice/board structure
82  *
83  * Return Value: The function always returns zero
84  * File: src/unican.c
85  */
86 int unican_vme_reset(struct candevice_t *candev)
87 {
88         int ret;
89         struct chip_t *chip = candev->chip[0];
90
91         ret = unican_reset(candev);
92
93         /* Setup VME interrupt vector */
94         if (ret == 0) 
95                 unican_writew(0x1234/* chip->chip_irq */,chip->chip_base_addr+CL2_VME_INT_VECTOR);
96
97
98         return ret;
99 }
100
101 /**
102  * unican_vme_init_chip_data - Initialize chips
103  * @candev: Pointer to candevice/board structure
104  * @chipnr: Number of the CAN chip on the hardware card
105  *
106  * Return Value: The function always returns zero
107  * File: src/unican.c
108  */
109 int unican_vme_init_chip_data(struct candevice_t *candev, int chipnr)
110 {
111         struct chip_t *chip = candev->chip[chipnr];
112
113         unican_init_chip_data(candev, chipnr);
114
115         chip->flags |= CHIP_IRQ_VME;
116         chip->chipspecops->irq_handler=unican_vme_irq_handler;
117         return 0;
118 }
119
120
121 int unican_vme_init_hw_data(struct candevice_t *candev) 
122 {
123         unican_init_hw_data(candev);
124         candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
125
126         return 0;
127 }
128
129 int unican_vme_register(struct hwspecops_t *hwspecops)
130 {
131         unican_register(hwspecops);
132
133         hwspecops->init_hw_data = unican_vme_init_hw_data;
134         hwspecops->init_chip_data = unican_vme_init_chip_data;
135         hwspecops->request_io = unican_vme_request_io;
136         hwspecops->reset = unican_vme_reset;
137         hwspecops->program_irq = unican_vme_program_irq;
138         hwspecops->release_io = unican_vme_release_io;
139         return 0;
140 }