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
9 /* This file is included in unican.c when CAN_ENABLE_VME_SUPPORT is
14 #define UNICAN_VME_IRQ 1
16 /* Used to pass chip pointer to irq handler. This sould be done in VME
18 #define VME_CHIPS_SIZE 8
19 struct chip_t *vme_chips[VME_CHIPS_SIZE];
21 can_irqreturn_t unican_vme_irq_handler(int vmeirq, int vector, void *dev_id, struct pt_regs *regs)
23 /* struct chip_t *chip = vme_chips[vector < VME_CHIPS_SIZE && vector >= 0 ? vector : 0]; */
24 struct chip_t *chip = vme_chips[0];
26 DEBUGMSG("unican_vme_irq_handler: vmeirq=0x%08x vector=0x%08x\n", vmeirq, vector);
27 return unican_irq_handler(vmeirq, chip, regs);
31 * unican_program_irq - program interrupts
32 * @candev: Pointer to candevice/board structure
34 * Return value: The function returns zero on success or %-ENODEV on failure
37 int unican_vme_program_irq(struct candevice_t *candev)
39 struct chip_t *chip = candev->chip[0];
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);
46 /* vme_chips[chip->chip_irq] = chip; */
49 request_vmeirq(UNICAN_VME_IRQ, unican_vme_irq_handler);
50 enable_vmeirq(UNICAN_VME_IRQ);
55 int unican_vme_request_io(struct candevice_t *candev)
57 unican_request_io(candev);
63 * unican_vme_release_io - free reserved io memory range
64 * @candev: pointer to candevice/board which releases io
66 * Return Value: The function always returns zero
69 int unican_vme_release_io(struct candevice_t *candev)
71 disable_vmeirq(UNICAN_VME_IRQ);
72 free_vmeirq(UNICAN_VME_IRQ);
74 unican_release_io(candev);
80 * unican_vme_init_hw_data - Initialize hardware cards
81 * @candev: Pointer to candevice/board structure
83 * Return Value: The function always returns zero
86 int unican_vme_reset(struct candevice_t *candev)
89 struct chip_t *chip = candev->chip[0];
91 ret = unican_reset(candev);
93 /* Setup VME interrupt vector */
95 unican_writew(0x1234/* chip->chip_irq */,chip->chip_base_addr+CL2_VME_INT_VECTOR);
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
106 * Return Value: The function always returns zero
109 int unican_vme_init_chip_data(struct candevice_t *candev, int chipnr)
111 struct chip_t *chip = candev->chip[chipnr];
113 unican_init_chip_data(candev, chipnr);
115 chip->flags |= CHIP_IRQ_VME;
116 chip->chipspecops->irq_handler=unican_vme_irq_handler;
121 int unican_vme_init_hw_data(struct candevice_t *candev)
123 unican_init_hw_data(candev);
124 candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
129 int unican_vme_register(struct hwspecops_t *hwspecops)
131 unican_register(hwspecops);
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;