X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/d659fb1c5ce646e10820cfd349d8a4220d1ee67d..02003635287383cbe34c3da8107e9984ce4d894a:/lincan/src/setup.c diff --git a/lincan/src/setup.c b/lincan/src/setup.c index 83eef72..394704c 100644 --- a/lincan/src/setup.c +++ b/lincan/src/setup.c @@ -4,7 +4,7 @@ * Rewritten for new CAN queues 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 */ #include "../include/can.h" @@ -14,15 +14,16 @@ #include "../include/setup.h" #include "../include/finish.h" -extern int sja1000_register(struct chipspecops_t *chipspecops); -extern int sja1000p_register(struct chipspecops_t *chipspecops); -extern int i82527_register(struct chipspecops_t *chipspecops); +#ifdef CAN_ENABLE_VME_SUPPORT +#include "ca91c042.h" +/* Modified version of ca91c042 driver can be found in + * components/comm/contrib directory. */ +#endif int init_hwspecops(struct candevice_t *candev, int *irqnum_p); int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p); int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudrate); int init_obj_struct(struct candevice_t *candev, struct chip_t *hostchip, int objnr); -int init_chipspecops(struct candevice_t *candev, int chipnr); /** * can_checked_malloc - memory allocation with registering of requested blocks @@ -442,8 +443,8 @@ int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p) * @baudrate: baudrate in the units of 1Bd * * Chip structure is allocated and chip specific operations are filled by - * call to board specific init_chip_data() function and generic - * init_chipspecops() function. The message objects are generated by + * call to board specific init_chip_data() which calls chip specific + * fill_chipspecops(). The message objects are generated by * calls to init_obj_struct() function. * * Return Value: returns negative number in the case of fail @@ -474,9 +475,7 @@ int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudr chip->baudrate=baudrate; chip->flags=0x0; - candev->hwspecops->init_chip_data(candev,chipnr); - - if (init_chipspecops(candev,chipnr)) + if(candev->hwspecops->init_chip_data(candev,chipnr)<0) return -ENODEV; for (objnr=0; objnrmax_objects; objnr++) { @@ -567,35 +566,6 @@ int init_hwspecops(struct candevice_t *candev, int *irqnum_p) } -/** - * init_chipspecops - fills chip specific operations for board for known chip types - * @candev: pointer to the corresponding CAN device/board - * @chipnr: index of the chip in the device/board structure - * - * The function fills chip specific operations for next known generic chip - * types "i82527", "sja1000", "sja1000p" (PeliCAN). Other non generic chip types - * operations has to be initialized in the board specific init_chip_data() function. - * - * Return Value: returns negative number in the case of fail - */ -int init_chipspecops(struct candevice_t *candev, int chipnr) -{ - if (!strcmp(candev->chip[chipnr]->chip_type,"i82527")) { - candev->chip[chipnr]->max_objects=15; - i82527_register(candev->chip[chipnr]->chipspecops); - } - if (!strcmp(candev->chip[chipnr]->chip_type,"sja1000")) { - candev->chip[chipnr]->max_objects=1; - sja1000_register(candev->chip[chipnr]->chipspecops); - } - if (!strcmp(candev->chip[chipnr]->chip_type,"sja1000p")) { - candev->chip[chipnr]->max_objects=1; - sja1000p_register(candev->chip[chipnr]->chipspecops); - } - - return 0; -} - #ifndef CAN_WITH_RTL /** @@ -611,11 +581,24 @@ int can_chip_setup_irq(struct chip_t *chip) if(!chip->chipspecops->irq_handler) return 0; - if (request_irq(chip->chip_irq,chip->chipspecops->irq_handler,SA_SHIRQ,DEVICE_NAME,chip)) - return -1; - else { - DEBUGMSG("Registered interrupt %d\n",chip->chip_irq); + if ((chip->flags & CHIP_IRQ_VME) == 0) { + if (request_irq(chip->chip_irq,chip->chipspecops->irq_handler,SA_SHIRQ,DEVICE_NAME,chip)) + return -1; + else { + DEBUGMSG("Registered interrupt %d\n",chip->chip_irq); + chip->flags |= CHIP_IRQ_SETUP; + } + } else { +#ifdef CAN_ENABLE_VME_SUPPORT + if (chip->chip_irq < 1 || chip->chip_irq > 255) { + CANMSG("Bad irq parameter. (1 <= irq <= 255).\n"); + return -EINVAL; + } + + request_vmeirq(chip->chip_irq, chip->chipspecops->irq_handler, chip); + DEBUGMSG("Registered VME interrupt vector %d\n",chip->chip_irq); chip->flags |= CHIP_IRQ_SETUP; +#endif } return 1; } @@ -628,8 +611,14 @@ int can_chip_setup_irq(struct chip_t *chip) void can_chip_free_irq(struct chip_t *chip) { if((chip->flags & CHIP_IRQ_SETUP) && (chip->chip_irq>=0)) { - free_irq(chip->chip_irq, chip); - chip->flags &= ~CHIP_IRQ_SETUP; + if ((chip->flags & CHIP_IRQ_VME) == 0) + free_irq(chip->chip_irq, chip); + else { +#ifdef CAN_ENABLE_VME_SUPPORT + free_vmeirq(chip->chip_irq); +#endif + } + chip->flags &= ~CHIP_IRQ_SETUP; } }