diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index c561a0eda92a..423f882416d9 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c @@ -531,6 +531,21 @@ static bool comedi_is_subdevice_idle(struct comedi_subdevice *s) return (runflags & (SRF_ERROR | SRF_RUNNING)) ? false : true; } +/** + * comedi_set_spriv() - Set the subdevice private data pointer. + * @s: comedi_subdevice struct + * @data: pointer to the private data + * + * This also sets the subdevice runflags to allow the core to automatically + * free the private data during the detach. + */ +void comedi_set_spriv(struct comedi_subdevice *s, void *data) +{ + s->private = data; + comedi_set_subdevice_runflags(s, ~0, SRF_FREE_SPRIV); +} +EXPORT_SYMBOL_GPL(comedi_set_spriv); + /* This function restores a subdevice to an idle state. */ diff --git a/drivers/staging/comedi/comedidev.h b/drivers/staging/comedi/comedidev.h index 57deabf77418..e8dc7af8f5a1 100644 --- a/drivers/staging/comedi/comedidev.h +++ b/drivers/staging/comedi/comedidev.h @@ -265,10 +265,12 @@ enum subdevice_runflags { /* indicates an COMEDI_CB_ERROR event has occurred since the last * command was started */ SRF_ERROR = 0x00000004, - SRF_RUNNING = 0x08000000 + SRF_RUNNING = 0x08000000, + SRF_FREE_SPRIV = 0x80000000, /* free s->private on detach */ }; bool comedi_is_subdevice_running(struct comedi_subdevice *s); +void comedi_set_spriv(struct comedi_subdevice *s, void *data); int comedi_check_chanlist(struct comedi_subdevice *s, int n, @@ -356,8 +358,6 @@ void comedi_buf_memcpy_from(struct comedi_async *async, unsigned int offset, int comedi_alloc_subdevices(struct comedi_device *, int); -void comedi_spriv_free(struct comedi_device *, int subdev_num); - int comedi_load_firmware(struct comedi_device *, struct device *, const char *name, int (*cb)(struct comedi_device *, diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c index f3e57fd8b2fb..e25eba5713c1 100644 --- a/drivers/staging/comedi/drivers.c +++ b/drivers/staging/comedi/drivers.c @@ -83,18 +83,6 @@ int comedi_alloc_subdevices(struct comedi_device *dev, int num_subdevices) } EXPORT_SYMBOL_GPL(comedi_alloc_subdevices); -void comedi_spriv_free(struct comedi_device *dev, int subdev_num) -{ - struct comedi_subdevice *s; - - if (dev->subdevices && subdev_num < dev->n_subdevices) { - s = &dev->subdevices[subdev_num]; - kfree(s->private); - s->private = NULL; - } -} -EXPORT_SYMBOL_GPL(comedi_spriv_free); - static void cleanup_device(struct comedi_device *dev) { int i; @@ -103,6 +91,8 @@ static void cleanup_device(struct comedi_device *dev) if (dev->subdevices) { for (i = 0; i < dev->n_subdevices; i++) { s = &dev->subdevices[i]; + if (s->runflags & SRF_FREE_SPRIV) + kfree(s->private); comedi_free_subdevice_minor(s); if (s->async) { comedi_buf_alloc(dev, s, 0); diff --git a/drivers/staging/comedi/drivers/8255.c b/drivers/staging/comedi/drivers/8255.c index 1a1c2dae886b..dca9b40cefdc 100644 --- a/drivers/staging/comedi/drivers/8255.c +++ b/drivers/staging/comedi/drivers/8255.c @@ -288,12 +288,11 @@ int subdev_8255_init(struct comedi_device *dev, struct comedi_subdevice *s, spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); if (!spriv) return -ENOMEM; + comedi_set_spriv(s, spriv); spriv->iobase = iobase; spriv->io = io ? io : subdev_8255_io; - s->private = spriv; - s->type = COMEDI_SUBD_DIO; s->subdev_flags = SDF_READABLE | SDF_WRITABLE; s->n_chan = 24; @@ -386,7 +385,6 @@ static void dev_8255_detach(struct comedi_device *dev) spriv = s->private; release_region(spriv->iobase, _8255_SIZE); } - comedi_spriv_free(dev, i); } } diff --git a/drivers/staging/comedi/drivers/8255_pci.c b/drivers/staging/comedi/drivers/8255_pci.c index 1117b61da3af..3d3547c19480 100644 --- a/drivers/staging/comedi/drivers/8255_pci.c +++ b/drivers/staging/comedi/drivers/8255_pci.c @@ -238,10 +238,7 @@ static int pci_8255_auto_attach(struct comedi_device *dev, static void pci_8255_detach(struct comedi_device *dev) { struct pci_8255_private *devpriv = dev->private; - int i; - for (i = 0; i < dev->n_subdevices; i++) - comedi_spriv_free(dev, i); if (devpriv && devpriv->mmio_base) iounmap(devpriv->mmio_base); comedi_pci_disable(dev); diff --git a/drivers/staging/comedi/drivers/addi_apci_1516.c b/drivers/staging/comedi/drivers/addi_apci_1516.c index 5bf6bb129cd4..b626738bb73c 100644 --- a/drivers/staging/comedi/drivers/addi_apci_1516.c +++ b/drivers/staging/comedi/drivers/addi_apci_1516.c @@ -196,7 +196,6 @@ static void apci1516_detach(struct comedi_device *dev) { if (dev->iobase) apci1516_reset(dev); - comedi_spriv_free(dev, 2); comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/addi_apci_2032.c b/drivers/staging/comedi/drivers/addi_apci_2032.c index c0d83d8709f4..89ead8eb3c70 100644 --- a/drivers/staging/comedi/drivers/addi_apci_2032.c +++ b/drivers/staging/comedi/drivers/addi_apci_2032.c @@ -347,7 +347,6 @@ static void apci2032_detach(struct comedi_device *dev) free_irq(dev->irq, dev); if (dev->read_subdev) kfree(dev->read_subdev->private); - comedi_spriv_free(dev, 1); comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/addi_apci_2200.c b/drivers/staging/comedi/drivers/addi_apci_2200.c index 060620e184d6..ca1bd92ecb17 100644 --- a/drivers/staging/comedi/drivers/addi_apci_2200.c +++ b/drivers/staging/comedi/drivers/addi_apci_2200.c @@ -123,7 +123,6 @@ static void apci2200_detach(struct comedi_device *dev) { if (dev->iobase) apci2200_reset(dev); - comedi_spriv_free(dev, 2); comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/addi_watchdog.c b/drivers/staging/comedi/drivers/addi_watchdog.c index 2c21a1625547..decc97d0e415 100644 --- a/drivers/staging/comedi/drivers/addi_watchdog.c +++ b/drivers/staging/comedi/drivers/addi_watchdog.c @@ -129,11 +129,10 @@ int addi_watchdog_init(struct comedi_subdevice *s, unsigned long iobase) spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); if (!spriv) return -ENOMEM; + comedi_set_spriv(s, spriv); spriv->iobase = iobase; - s->private = spriv; - s->type = COMEDI_SUBD_TIMER; s->subdev_flags = SDF_WRITEABLE; s->n_chan = 1; diff --git a/drivers/staging/comedi/drivers/adv_pci_dio.c b/drivers/staging/comedi/drivers/adv_pci_dio.c index f70c67471c13..8e6ec75bd294 100644 --- a/drivers/staging/comedi/drivers/adv_pci_dio.c +++ b/drivers/staging/comedi/drivers/adv_pci_dio.c @@ -1173,19 +1173,11 @@ static int pci_dio_auto_attach(struct comedi_device *dev, static void pci_dio_detach(struct comedi_device *dev) { struct pci_dio_private *devpriv = dev->private; - struct comedi_subdevice *s; - int i; if (devpriv) { if (devpriv->valid) pci_dio_reset(dev); } - for (i = 0; i < dev->n_subdevices; i++) { - s = &dev->subdevices[i]; - if (s->type == COMEDI_SUBD_DIO) - comedi_spriv_free(dev, i); - s->private = NULL; /* some private data is static */ - } comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/aio_aio12_8.c b/drivers/staging/comedi/drivers/aio_aio12_8.c index 77c92cb23d47..279dfe8951f7 100644 --- a/drivers/staging/comedi/drivers/aio_aio12_8.c +++ b/drivers/staging/comedi/drivers/aio_aio12_8.c @@ -255,17 +255,11 @@ static int aio_aio12_8_attach(struct comedi_device *dev, return 0; } -static void aio_aio12_8_detach(struct comedi_device *dev) -{ - comedi_spriv_free(dev, 2); - comedi_legacy_detach(dev); -} - static struct comedi_driver aio_aio12_8_driver = { .driver_name = "aio_aio12_8", .module = THIS_MODULE, .attach = aio_aio12_8_attach, - .detach = aio_aio12_8_detach, + .detach = comedi_legacy_detach, .board_name = &board_types[0].name, .num_names = ARRAY_SIZE(board_types), .offset = sizeof(struct aio12_8_boardtype), diff --git a/drivers/staging/comedi/drivers/amplc_dio200_common.c b/drivers/staging/comedi/drivers/amplc_dio200_common.c index 81d6ee4549cb..00c35a3541e8 100644 --- a/drivers/staging/comedi/drivers/amplc_dio200_common.c +++ b/drivers/staging/comedi/drivers/amplc_dio200_common.c @@ -559,6 +559,7 @@ dio200_subdev_intr_init(struct comedi_device *dev, struct comedi_subdevice *s, subpriv = kzalloc(sizeof(*subpriv), GFP_KERNEL); if (!subpriv) return -ENOMEM; + comedi_set_spriv(s, subpriv); subpriv->ofs = offset; subpriv->valid_isns = valid_isns; @@ -568,7 +569,6 @@ dio200_subdev_intr_init(struct comedi_device *dev, struct comedi_subdevice *s, /* Disable interrupt sources. */ dio200_write8(dev, subpriv->ofs, 0); - s->private = subpriv; s->type = COMEDI_SUBD_DI; s->subdev_flags = SDF_READABLE | SDF_CMD_READ; if (layout->has_int_sce) { @@ -886,8 +886,8 @@ dio200_subdev_8254_init(struct comedi_device *dev, struct comedi_subdevice *s, subpriv = kzalloc(sizeof(*subpriv), GFP_KERNEL); if (!subpriv) return -ENOMEM; + comedi_set_spriv(s, subpriv); - s->private = subpriv; s->type = COMEDI_SUBD_COUNTER; s->subdev_flags = SDF_WRITABLE | SDF_READABLE; s->n_chan = 3; @@ -1022,8 +1022,10 @@ static int dio200_subdev_8255_init(struct comedi_device *dev, subpriv = kzalloc(sizeof(*subpriv), GFP_KERNEL); if (!subpriv) return -ENOMEM; + comedi_set_spriv(s, subpriv); + subpriv->ofs = offset; - s->private = subpriv; + s->type = COMEDI_SUBD_DIO; s->subdev_flags = SDF_READABLE | SDF_WRITABLE; s->n_chan = 24; @@ -1225,28 +1227,11 @@ void amplc_dio200_common_detach(struct comedi_device *dev) { const struct dio200_board *thisboard = comedi_board(dev); struct dio200_private *devpriv = dev->private; - const struct dio200_layout *layout; - unsigned n; if (!thisboard || !devpriv) return; if (dev->irq) free_irq(dev->irq, dev); - if (dev->subdevices) { - layout = dio200_board_layout(thisboard); - for (n = 0; n < dev->n_subdevices; n++) { - switch (layout->sdtype[n]) { - case sd_8254: - case sd_8255: - case sd_intr: - comedi_spriv_free(dev, n); - break; - case sd_timer: - default: - break; - } - } - } } EXPORT_SYMBOL_GPL(amplc_dio200_common_detach); diff --git a/drivers/staging/comedi/drivers/amplc_pc236.c b/drivers/staging/comedi/drivers/amplc_pc236.c index 179d25e00ace..4e889b82cbf2 100644 --- a/drivers/staging/comedi/drivers/amplc_pc236.c +++ b/drivers/staging/comedi/drivers/amplc_pc236.c @@ -538,7 +538,6 @@ static void pc236_detach(struct comedi_device *dev) return; if (dev->iobase) pc236_intr_disable(dev); - comedi_spriv_free(dev, 0); if (is_isa_board(thisboard)) { comedi_legacy_detach(dev); } else if (is_pci_board(thisboard)) { diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c index 08ff12837e00..846d6448fa4d 100644 --- a/drivers/staging/comedi/drivers/amplc_pci230.c +++ b/drivers/staging/comedi/drivers/amplc_pci230.c @@ -2830,7 +2830,6 @@ static void pci230_detach(struct comedi_device *dev) { struct pci_dev *pcidev = comedi_to_pci_dev(dev); - comedi_spriv_free(dev, 2); if (dev->irq) free_irq(dev->irq, dev); comedi_pci_disable(dev); diff --git a/drivers/staging/comedi/drivers/cb_pcidas.c b/drivers/staging/comedi/drivers/cb_pcidas.c index 172f459b0af2..58bca184bf22 100644 --- a/drivers/staging/comedi/drivers/cb_pcidas.c +++ b/drivers/staging/comedi/drivers/cb_pcidas.c @@ -1602,7 +1602,6 @@ static void cb_pcidas_detach(struct comedi_device *dev) } if (dev->irq) free_irq(dev->irq, dev); - comedi_spriv_free(dev, 2); comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c index 11f8101d851a..43c0bf58771a 100644 --- a/drivers/staging/comedi/drivers/cb_pcidas64.c +++ b/drivers/staging/comedi/drivers/cb_pcidas64.c @@ -4158,7 +4158,6 @@ static void detach(struct comedi_device *dev) devpriv->ao_dma_desc_bus_addr); } } - comedi_spriv_free(dev, 4); comedi_pci_disable(dev); } diff --git a/drivers/staging/comedi/drivers/cb_pcidda.c b/drivers/staging/comedi/drivers/cb_pcidda.c index b74d4c38b5c3..2d3e920e5987 100644 --- a/drivers/staging/comedi/drivers/cb_pcidda.c +++ b/drivers/staging/comedi/drivers/cb_pcidda.c @@ -393,18 +393,11 @@ static int cb_pcidda_auto_attach(struct comedi_device *dev, return 0; } -static void cb_pcidda_detach(struct comedi_device *dev) -{ - comedi_spriv_free(dev, 1); - comedi_spriv_free(dev, 2); - comedi_pci_disable(dev); -} - static struct comedi_driver cb_pcidda_driver = { .driver_name = "cb_pcidda", .module = THIS_MODULE, .auto_attach = cb_pcidda_auto_attach, - .detach = cb_pcidda_detach, + .detach = comedi_pci_disable, }; static int cb_pcidda_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/cb_pcimdda.c b/drivers/staging/comedi/drivers/cb_pcimdda.c index d3a796eef883..406cba8cba88 100644 --- a/drivers/staging/comedi/drivers/cb_pcimdda.c +++ b/drivers/staging/comedi/drivers/cb_pcimdda.c @@ -192,17 +192,11 @@ static int cb_pcimdda_auto_attach(struct comedi_device *dev, return 1; } -static void cb_pcimdda_detach(struct comedi_device *dev) -{ - comedi_spriv_free(dev, 1); - comedi_pci_disable(dev); -} - static struct comedi_driver cb_pcimdda_driver = { .driver_name = "cb_pcimdda", .module = THIS_MODULE, .auto_attach = cb_pcimdda_auto_attach, - .detach = cb_pcimdda_detach, + .detach = comedi_pci_disable, }; static int cb_pcimdda_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/daqboard2000.c b/drivers/staging/comedi/drivers/daqboard2000.c index f5aa3860e3e7..44c912b48b6e 100644 --- a/drivers/staging/comedi/drivers/daqboard2000.c +++ b/drivers/staging/comedi/drivers/daqboard2000.c @@ -747,7 +747,6 @@ static void daqboard2000_detach(struct comedi_device *dev) { struct daqboard2000_private *devpriv = dev->private; - comedi_spriv_free(dev, 2); if (dev->irq) free_irq(dev->irq, dev); if (devpriv) { diff --git a/drivers/staging/comedi/drivers/das08.c b/drivers/staging/comedi/drivers/das08.c index 64807eaa559e..2e7e3e202390 100644 --- a/drivers/staging/comedi/drivers/das08.c +++ b/drivers/staging/comedi/drivers/das08.c @@ -560,12 +560,6 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase) } EXPORT_SYMBOL_GPL(das08_common_attach); -void das08_common_detach(struct comedi_device *dev) -{ - comedi_spriv_free(dev, 4); -} -EXPORT_SYMBOL_GPL(das08_common_detach); - static int __init das08_init(void) { return 0; diff --git a/drivers/staging/comedi/drivers/das08.h b/drivers/staging/comedi/drivers/das08.h index c312870ab691..cce1b584200a 100644 --- a/drivers/staging/comedi/drivers/das08.h +++ b/drivers/staging/comedi/drivers/das08.h @@ -47,6 +47,5 @@ struct das08_private_struct { }; int das08_common_attach(struct comedi_device *dev, unsigned long iobase); -void das08_common_detach(struct comedi_device *dev); #endif /* _DAS08_H */ diff --git a/drivers/staging/comedi/drivers/das08_cs.c b/drivers/staging/comedi/drivers/das08_cs.c index 3625b3eafe7c..885fb179c9b4 100644 --- a/drivers/staging/comedi/drivers/das08_cs.c +++ b/drivers/staging/comedi/drivers/das08_cs.c @@ -86,17 +86,11 @@ static int das08_cs_auto_attach(struct comedi_device *dev, return das08_common_attach(dev, iobase); } -static void das08_cs_detach(struct comedi_device *dev) -{ - das08_common_detach(dev); - comedi_pcmcia_disable(dev); -} - static struct comedi_driver driver_das08_cs = { .driver_name = "das08_cs", .module = THIS_MODULE, .auto_attach = das08_cs_auto_attach, - .detach = das08_cs_detach, + .detach = comedi_pcmcia_disable, }; static int das08_pcmcia_attach(struct pcmcia_device *link) diff --git a/drivers/staging/comedi/drivers/das08_isa.c b/drivers/staging/comedi/drivers/das08_isa.c index 10e96e94515c..21a94389b8b2 100644 --- a/drivers/staging/comedi/drivers/das08_isa.c +++ b/drivers/staging/comedi/drivers/das08_isa.c @@ -189,17 +189,11 @@ static int das08_isa_attach(struct comedi_device *dev, return das08_common_attach(dev, dev->iobase); } -static void das08_isa_detach(struct comedi_device *dev) -{ - das08_common_detach(dev); - comedi_legacy_detach(dev); -} - static struct comedi_driver das08_isa_driver = { .driver_name = "isa-das08", .module = THIS_MODULE, .attach = das08_isa_attach, - .detach = das08_isa_detach, + .detach = comedi_legacy_detach, .board_name = &das08_isa_boards[0].name, .num_names = ARRAY_SIZE(das08_isa_boards), .offset = sizeof(das08_isa_boards[0]), diff --git a/drivers/staging/comedi/drivers/das08_pci.c b/drivers/staging/comedi/drivers/das08_pci.c index 351fbc6027f1..9c5d234e063f 100644 --- a/drivers/staging/comedi/drivers/das08_pci.c +++ b/drivers/staging/comedi/drivers/das08_pci.c @@ -75,17 +75,11 @@ static int das08_pci_auto_attach(struct comedi_device *dev, return das08_common_attach(dev, dev->iobase); } -static void das08_pci_detach(struct comedi_device *dev) -{ - das08_common_detach(dev); - comedi_pci_disable(dev); -} - static struct comedi_driver das08_pci_comedi_driver = { .driver_name = "pci-das08", .module = THIS_MODULE, .auto_attach = das08_pci_auto_attach, - .detach = das08_pci_detach, + .detach = comedi_pci_disable, }; static int das08_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/das16.c b/drivers/staging/comedi/drivers/das16.c index dab7647ec2f5..dbec3ba99548 100644 --- a/drivers/staging/comedi/drivers/das16.c +++ b/drivers/staging/comedi/drivers/das16.c @@ -1333,7 +1333,6 @@ static void das16_detach(struct comedi_device *dev) struct das16_private_struct *devpriv = dev->private; das16_reset(dev); - comedi_spriv_free(dev, 4); if (devpriv) { int i; for (i = 0; i < 2; i++) { diff --git a/drivers/staging/comedi/drivers/das16m1.c b/drivers/staging/comedi/drivers/das16m1.c index e7ae2ffe8c79..0b33808c3a7d 100644 --- a/drivers/staging/comedi/drivers/das16m1.c +++ b/drivers/staging/comedi/drivers/das16m1.c @@ -666,7 +666,6 @@ static void das16m1_detach(struct comedi_device *dev) { struct das16m1_private_struct *devpriv = dev->private; - comedi_spriv_free(dev, 3); if (devpriv && devpriv->extra_iobase) release_region(devpriv->extra_iobase, DAS16M1_SIZE2); comedi_legacy_detach(dev); diff --git a/drivers/staging/comedi/drivers/ni_65xx.c b/drivers/staging/comedi/drivers/ni_65xx.c index 6a89e5c166e3..5907fd262a38 100644 --- a/drivers/staging/comedi/drivers/ni_65xx.c +++ b/drivers/staging/comedi/drivers/ni_65xx.c @@ -281,13 +281,16 @@ static inline struct ni_65xx_subdevice_private *sprivate(struct comedi_subdevice return subdev->private; } -static struct ni_65xx_subdevice_private *ni_65xx_alloc_subdevice_private(void) +static int ni_65xx_alloc_subdevice_private(struct comedi_subdevice *s) { - struct ni_65xx_subdevice_private *subdev_private = - kzalloc(sizeof(struct ni_65xx_subdevice_private), GFP_KERNEL); - if (subdev_private == NULL) - return NULL; - return subdev_private; + struct ni_65xx_subdevice_private *spriv; + + spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); + if (!spriv) + return -ENOMEM; + comedi_set_spriv(s, spriv); + + return 0; } static int ni_65xx_config_filter(struct comedi_device *dev, @@ -632,9 +635,9 @@ static int ni_65xx_auto_attach(struct comedi_device *dev, s->maxdata = 1; s->insn_config = ni_65xx_dio_insn_config; s->insn_bits = ni_65xx_dio_insn_bits; - s->private = ni_65xx_alloc_subdevice_private(); - if (s->private == NULL) - return -ENOMEM; + ret = ni_65xx_alloc_subdevice_private(s); + if (ret) + return ret; sprivate(s)->base_port = 0; } else { s->type = COMEDI_SUBD_UNUSED; @@ -649,9 +652,9 @@ static int ni_65xx_auto_attach(struct comedi_device *dev, s->range_table = &range_digital; s->maxdata = 1; s->insn_bits = ni_65xx_dio_insn_bits; - s->private = ni_65xx_alloc_subdevice_private(); - if (s->private == NULL) - return -ENOMEM; + ret = ni_65xx_alloc_subdevice_private(s); + if (ret) + return ret; sprivate(s)->base_port = board->num_di_ports; } else { s->type = COMEDI_SUBD_UNUSED; @@ -667,9 +670,9 @@ static int ni_65xx_auto_attach(struct comedi_device *dev, s->maxdata = 1; s->insn_config = ni_65xx_dio_insn_config; s->insn_bits = ni_65xx_dio_insn_bits; - s->private = ni_65xx_alloc_subdevice_private(); - if (s->private == NULL) - return -ENOMEM; + ret = ni_65xx_alloc_subdevice_private(s); + if (ret) + return ret; sprivate(s)->base_port = 0; for (i = 0; i < board->num_dio_ports; ++i) { /* configure all ports for input */ @@ -725,7 +728,6 @@ static int ni_65xx_auto_attach(struct comedi_device *dev, static void ni_65xx_detach(struct comedi_device *dev) { struct ni_65xx_private *devpriv = dev->private; - int i; if (devpriv && devpriv->mite && devpriv->mite->daq_io_addr) { writeb(0x00, @@ -734,8 +736,6 @@ static void ni_65xx_detach(struct comedi_device *dev) } if (dev->irq) free_irq(dev->irq, dev); - for (i = 0; i < dev->n_subdevices; ++i) - comedi_spriv_free(dev, i); if (devpriv) { if (devpriv->mite) { mite_unsetup(devpriv->mite); diff --git a/drivers/staging/comedi/drivers/ni_atmio16d.c b/drivers/staging/comedi/drivers/ni_atmio16d.c index d280332d32d1..da7396f94297 100644 --- a/drivers/staging/comedi/drivers/ni_atmio16d.c +++ b/drivers/staging/comedi/drivers/ni_atmio16d.c @@ -762,7 +762,6 @@ static int atmio16d_attach(struct comedi_device *dev, static void atmio16d_detach(struct comedi_device *dev) { - comedi_spriv_free(dev, 3); reset_atmio16d(dev); comedi_legacy_detach(dev); } diff --git a/drivers/staging/comedi/drivers/ni_daq_dio24.c b/drivers/staging/comedi/drivers/ni_daq_dio24.c index 6ff1526bd063..d3d4eb9356a7 100644 --- a/drivers/staging/comedi/drivers/ni_daq_dio24.c +++ b/drivers/staging/comedi/drivers/ni_daq_dio24.c @@ -65,17 +65,11 @@ static int dio24_auto_attach(struct comedi_device *dev, return 0; } -static void dio24_detach(struct comedi_device *dev) -{ - comedi_spriv_free(dev, 0); - comedi_pcmcia_disable(dev); -} - static struct comedi_driver driver_dio24 = { .driver_name = "ni_daq_dio24", .module = THIS_MODULE, .auto_attach = dio24_auto_attach, - .detach = dio24_detach, + .detach = comedi_pcmcia_disable, }; static int dio24_cs_attach(struct pcmcia_device *link) diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c index a918b7ffbe22..f161e70b3a0d 100644 --- a/drivers/staging/comedi/drivers/ni_labpc.c +++ b/drivers/staging/comedi/drivers/ni_labpc.c @@ -1689,12 +1689,6 @@ int labpc_common_attach(struct comedi_device *dev, } EXPORT_SYMBOL_GPL(labpc_common_attach); -void labpc_common_detach(struct comedi_device *dev) -{ - comedi_spriv_free(dev, 2); -} -EXPORT_SYMBOL_GPL(labpc_common_detach); - #if IS_ENABLED(CONFIG_COMEDI_NI_LABPC_ISA) static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it) { @@ -1747,8 +1741,6 @@ static void labpc_detach(struct comedi_device *dev) { struct labpc_private *devpriv = dev->private; - labpc_common_detach(dev); - if (devpriv) { kfree(devpriv->dma_buffer); if (devpriv->dma_chan) diff --git a/drivers/staging/comedi/drivers/ni_labpc.h b/drivers/staging/comedi/drivers/ni_labpc.h index aa5c4d8bdf75..486589fa6fd8 100644 --- a/drivers/staging/comedi/drivers/ni_labpc.h +++ b/drivers/staging/comedi/drivers/ni_labpc.h @@ -86,6 +86,5 @@ struct labpc_private { int labpc_common_attach(struct comedi_device *dev, unsigned int irq, unsigned long isr_flags); -void labpc_common_detach(struct comedi_device *dev); #endif /* _NI_LABPC_H */ diff --git a/drivers/staging/comedi/drivers/ni_labpc_cs.c b/drivers/staging/comedi/drivers/ni_labpc_cs.c index 883581eb3dbe..ce67f4bbb1f5 100644 --- a/drivers/staging/comedi/drivers/ni_labpc_cs.c +++ b/drivers/staging/comedi/drivers/ni_labpc_cs.c @@ -104,17 +104,11 @@ static int labpc_auto_attach(struct comedi_device *dev, return labpc_common_attach(dev, link->irq, IRQF_SHARED); } -static void labpc_detach(struct comedi_device *dev) -{ - labpc_common_detach(dev); - comedi_pcmcia_disable(dev); -} - static struct comedi_driver driver_labpc_cs = { .driver_name = "ni_labpc_cs", .module = THIS_MODULE, .auto_attach = labpc_auto_attach, - .detach = labpc_detach, + .detach = comedi_pcmcia_disable, }; static int labpc_cs_attach(struct pcmcia_device *link) diff --git a/drivers/staging/comedi/drivers/ni_labpc_pci.c b/drivers/staging/comedi/drivers/ni_labpc_pci.c index 1f80711bf368..6c79237b2b5c 100644 --- a/drivers/staging/comedi/drivers/ni_labpc_pci.c +++ b/drivers/staging/comedi/drivers/ni_labpc_pci.c @@ -92,8 +92,6 @@ static void labpc_pci_detach(struct comedi_device *dev) { struct labpc_private *devpriv = dev->private; - labpc_common_detach(dev); - if (devpriv && devpriv->mite) { mite_unsetup(devpriv->mite); mite_free(devpriv->mite); diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c index 1e78198a2253..3e9f544e67fc 100644 --- a/drivers/staging/comedi/drivers/ni_mio_common.c +++ b/drivers/staging/comedi/drivers/ni_mio_common.c @@ -4072,7 +4072,6 @@ static void mio_common_detach(struct comedi_device *dev) ni_gpct_device_destroy(devpriv->counter_dev); } } - comedi_spriv_free(dev, NI_8255_DIO_SUBDEV); } static void init_ao_67xx(struct comedi_device *dev, struct comedi_subdevice *s) diff --git a/drivers/staging/comedi/drivers/pcl724.c b/drivers/staging/comedi/drivers/pcl724.c index 1bcabb8901d1..cea657c7801d 100644 --- a/drivers/staging/comedi/drivers/pcl724.c +++ b/drivers/staging/comedi/drivers/pcl724.c @@ -136,20 +136,11 @@ static int pcl724_attach(struct comedi_device *dev, return 0; } -static void pcl724_detach(struct comedi_device *dev) -{ - int i; - - for (i = 0; i < dev->n_subdevices; i++) - comedi_spriv_free(dev, i); - comedi_legacy_detach(dev); -} - static struct comedi_driver pcl724_driver = { .driver_name = "pcl724", .module = THIS_MODULE, .attach = pcl724_attach, - .detach = pcl724_detach, + .detach = comedi_legacy_detach, .board_name = &boardtypes[0].name, .num_names = ARRAY_SIZE(boardtypes), .offset = sizeof(struct pcl724_board), diff --git a/drivers/staging/comedi/drivers/pcm3724.c b/drivers/staging/comedi/drivers/pcm3724.c index 4ef0df30b07a..5a9cd38e15f2 100644 --- a/drivers/staging/comedi/drivers/pcm3724.c +++ b/drivers/staging/comedi/drivers/pcm3724.c @@ -250,20 +250,11 @@ static int pcm3724_attach(struct comedi_device *dev, return 0; } -static void pcm3724_detach(struct comedi_device *dev) -{ - int i; - - for (i = 0; i < dev->n_subdevices; i++) - comedi_spriv_free(dev, i); - comedi_legacy_detach(dev); -} - static struct comedi_driver pcm3724_driver = { .driver_name = "pcm3724", .module = THIS_MODULE, .attach = pcm3724_attach, - .detach = pcm3724_detach, + .detach = comedi_legacy_detach, }; module_comedi_driver(pcm3724_driver);