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);
30 int unican_vme_request_io(struct candevice_t *candev)
32 struct chip_t *chip = candev->chip[0];
34 unican_request_io(candev);
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);
41 /* vme_chips[chip->chip_irq] = chip; */
44 request_vmeirq(UNICAN_VME_IRQ, unican_vme_irq_handler);
45 enable_vmeirq(UNICAN_VME_IRQ);
51 * unican_vme_release_io - free reserved io memory range
52 * @candev: pointer to candevice/board which releases io
54 * Return Value: The function always returns zero
57 int unican_vme_release_io(struct candevice_t *candev)
59 unican_release_io(candev);
61 free_vmeirq(UNICAN_VME_IRQ);
62 disable_vmeirq(UNICAN_VME_IRQ);
67 * unican_vme_init_hw_data - Initialize hardware cards
68 * @candev: Pointer to candevice/board structure
70 * Return Value: The function always returns zero
73 int unican_vme_reset(struct candevice_t *candev)
76 struct chip_t *chip = candev->chip[0];
78 ret = unican_reset(candev);
80 /* Setup VME interrupt vector */
82 unican_writew(0x1234/* chip->chip_irq */,chip->chip_base_addr+CL2_VME_INT_VECTOR);
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
93 * Return Value: The function always returns zero
96 int unican_vme_init_chip_data(struct candevice_t *candev, int chipnr)
98 struct chip_t *chip = candev->chip[chipnr];
100 unican_init_chip_data(candev, chipnr);
102 chip->flags |= CHIP_IRQ_VME;
103 chip->chipspecops->irq_handler=unican_vme_irq_handler;
108 int unican_vme_register(struct hwspecops_t *hwspecops)
110 unican_register(hwspecops);
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;