Cleaning up chip->chip_data on device unregister
authorIng. Jan Kriz <devel@jojen.net>
Mon, 18 Apr 2011 08:23:13 +0000 (10:23 +0200)
committerIng. Jan Kriz <devel@jojen.net>
Mon, 18 Apr 2011 08:23:13 +0000 (10:23 +0200)
lincan/include/constants.h
lincan/include/main.h
lincan/src/finish.c
lincan/src/usbcan.c

index 82383c2..1f0a45c 100644 (file)
 #define CHIP_IRQ_VME     (1<<5)  /* interrupt is VME bus and requires VME bridge */
 #define CHIP_IRQ_CUSTOM  (1<<6)  /* custom interrupt provided by board or chip code */
 #define CHIP_IRQ_FAST    (1<<7)  /* interrupt handler only schedules postponed processing */
+#define CHIP_KEEP_DATA   (1<<8)  /* let the hotplug device free its chip_data structure itself */
 
 #define CHIP_MAX_IRQLOOP 1000
 
index c82935b..22fb92f 100644 (file)
@@ -185,7 +185,7 @@ struct canchip_t {
        int chip_idx;   /* chip index in candevice_t.chip[] */
        int chip_irq;
        can_ioptr_t chip_base_addr;
-       unsigned int flags;
+       uint16_t flags;
        long clock; /* Chip clock in Hz */
        long baudrate;
 
index 2766c01..6a69222 100644 (file)
@@ -118,6 +118,10 @@ void canchip_done(struct canchip_t *chip)
        }
 
        can_checked_free(chip->chipspecops);
+       
+       if(~chip->flags & CHIP_KEEP_DATA)
+               can_checked_free(chip->chip_data);
+       chip->chip_data = NULL;
        chip->chipspecops=NULL;
 
 }
index 19b1dc6..3e1306a 100644 (file)
@@ -1017,7 +1017,7 @@ int usbcan_init_chip_data(struct candevice_t *candev, int chipnr)
 
        usbcan_fill_chipspecops(chip);
 
-       candev->chip[chipnr]->flags|=CHIP_IRQ_CUSTOM;
+       candev->chip[chipnr]->flags|=CHIP_IRQ_CUSTOM|CHIP_KEEP_DATA;
        candev->chip[chipnr]->chip_base_addr=0;
        candev->chip[chipnr]->clock = 0;