if (candev->hwspecops->init_hw_data(candev))
goto error_nodev;
- if (init_chip_struct(candev))
- goto error_nodev;
+ if ((ret=init_chip_struct(candev)))
+ goto error_chip;
return 0;
error_nodev:
- candevice_done(candev);
ret=-ENODEV;
+ error_chip:
+ candevice_done(candev);
goto error_both;
error_nomem:
*/
int init_chip_struct(struct candevice_t *candev)
{
+ struct chip_t *chip;
static int irq_count=0;
int i=0;
/* Alocate and initialize the chip structures */
for (i=0; i < candev->nr_all_chips; i++) {
candev->chip[i]=(struct chip_t *)can_checked_malloc(sizeof(struct chip_t));
- if (candev->chip[i]==NULL)
+ if ((chip=candev->chip[i])==NULL)
return -ENOMEM;
- memset(candev->chip[i], 0, sizeof(struct chip_t));
+ memset(chip, 0, sizeof(struct chip_t));
- candev->chip[i]->write_register=candev->hwspecops->write_register;
- candev->chip[i]->read_register=candev->hwspecops->read_register;
+ chip->write_register=candev->hwspecops->write_register;
+ chip->read_register=candev->hwspecops->read_register;
- candev->chip[i]->chipspecops=can_checked_malloc(sizeof(struct chipspecops_t));
- if (candev->chip[i]->chipspecops==NULL)
+ chip->chipspecops=can_checked_malloc(sizeof(struct chipspecops_t));
+ if (chip->chipspecops==NULL)
return -ENOMEM;
-
- chips_p[irq_count]=candev->chip[i];
- candev->chip[i]->chip_idx=i;
- candev->chip[i]->hostdevice=candev;
- candev->chip[i]->chip_irq=irq[irq_count];
- candev->chip[i]->baudrate=baudrate[irq_count]*1000;
- if(!candev->chip[i]->baudrate)
- candev->chip[i]->baudrate=baudrate[0]*1000;
- candev->chip[i]->flags=0x0;
+
+ chips_p[irq_count]=chip;
+ chip->chip_idx=i;
+ chip->hostdevice=candev;
+ chip->chip_irq=irq[irq_count];
+ chip->baudrate=baudrate[irq_count]*1000;
+ if(!chip->baudrate)
+ chip->baudrate=baudrate[0]*1000;
+ chip->flags=0x0;
candev->hwspecops->init_chip_data(candev,i);
if (init_chipspecops(candev,i))
return -ENODEV;
-
- init_obj_struct(candev, candev->chip[i], minor[irq_count]);
+
+ init_obj_struct(candev, chip, minor[irq_count]);
irq_count++;
}
obj->qends=qends;
obj->tx_qedge=NULL;
obj->tx_slot=NULL;
- obj->flags = 0x0;
+ obj->obj_flags = 0x0;
canqueue_ends_init_chip(qends, hostchip, obj);
return 0;
}
+
+#ifndef CAN_WITH_RTL
+
+int can_chip_setup_irq(struct chip_t *chip)
+{
+ if(chip==NULL)
+ return -1;
+ 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);
+ chip->flags |= CHIP_IRQ_SETUP;
+ }
+ return 1;
+}
+
+
+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;
+ }
+}
+
+#endif /*CAN_WITH_RTL*/