This function can be used by comedi pci drivers for the driver (*detach) callback when all that is required is to release the regions and disable the PCI device. Enhance this function to work like comedi_legacy_detach(). * Rename the function to comedi_pci_detach(). * free the irq if it has been requested * iounmap the 'mmio' address if it has been ioremap'ed Remove all the free_irq() and iounmap() code in the drivers. If the drivers (*detach) function is then a stub, use comedi_pci_detach() directly for the (*detach). The amplc_dio200 drivers required a bit of additional work. Currently, amplc_dio200_common_detach() was used to do the free_irq() because the PCI driver needed it. Since the ISA driver also called this function, the dev->irq is set to 0 to prevent comedi_legacy_detach() from doing the free_irq() again. Now that the PCI drivers will automatically do the free_irq(), both the ISA driver and PCI driver can use the core provided functions directly for the (*detach). Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/staging/comedi/comedi_pci.c | 22 ++++++++++++++++------ drivers/staging/comedi/comedidev.h | 4 ++-- drivers/staging/comedi/drivers/8255_pci.c | 9 +-------- .../staging/comedi/drivers/addi-data/addi_common.c | 4 +--- drivers/staging/comedi/drivers/addi_apci_1032.c | 4 +--- drivers/staging/comedi/drivers/addi_apci_1516.c | 2 +- drivers/staging/comedi/drivers/addi_apci_1564.c | 4 +--- drivers/staging/comedi/drivers/addi_apci_16xx.c | 2 +- drivers/staging/comedi/drivers/addi_apci_2032.c | 4 +--- drivers/staging/comedi/drivers/addi_apci_2200.c | 2 +- drivers/staging/comedi/drivers/addi_apci_3120.c | 4 +--- drivers/staging/comedi/drivers/addi_apci_3501.c | 4 +--- drivers/staging/comedi/drivers/addi_apci_3xxx.c | 6 +----- drivers/staging/comedi/drivers/adl_pci6208.c | 2 +- drivers/staging/comedi/drivers/adl_pci7x3x.c | 2 +- drivers/staging/comedi/drivers/adl_pci8164.c | 2 +- drivers/staging/comedi/drivers/adl_pci9111.c | 4 +--- drivers/staging/comedi/drivers/adl_pci9118.c | 4 +--- drivers/staging/comedi/drivers/adv_pci1710.c | 4 +--- drivers/staging/comedi/drivers/adv_pci1723.c | 2 +- drivers/staging/comedi/drivers/adv_pci1724.c | 2 +- drivers/staging/comedi/drivers/adv_pci_dio.c | 2 +- drivers/staging/comedi/drivers/amplc_dio200.c | 8 +------- drivers/staging/comedi/drivers/amplc_dio200.h | 2 -- .../staging/comedi/drivers/amplc_dio200_common.c | 9 --------- drivers/staging/comedi/drivers/amplc_dio200_pci.c | 10 +--------- drivers/staging/comedi/drivers/amplc_pci224.c | 4 +--- drivers/staging/comedi/drivers/amplc_pci230.c | 4 +--- drivers/staging/comedi/drivers/amplc_pci236.c | 9 +-------- drivers/staging/comedi/drivers/amplc_pci263.c | 2 +- drivers/staging/comedi/drivers/cb_pcidas.c | 13 ++++--------- drivers/staging/comedi/drivers/cb_pcidas64.c | 6 +----- drivers/staging/comedi/drivers/cb_pcidda.c | 2 +- drivers/staging/comedi/drivers/cb_pcimdas.c | 9 +-------- drivers/staging/comedi/drivers/cb_pcimdda.c | 2 +- drivers/staging/comedi/drivers/contec_pci_dio.c | 2 +- drivers/staging/comedi/drivers/daqboard2000.c | 12 +++--------- drivers/staging/comedi/drivers/das08_pci.c | 2 +- drivers/staging/comedi/drivers/dt3000.c | 11 +---------- drivers/staging/comedi/drivers/dyna_pci10xx.c | 2 +- drivers/staging/comedi/drivers/gsc_hpdi.c | 6 +----- drivers/staging/comedi/drivers/icp_multi.c | 11 +++-------- drivers/staging/comedi/drivers/jr3_pci.c | 2 +- drivers/staging/comedi/drivers/ke_counter.c | 2 +- drivers/staging/comedi/drivers/me4000.c | 4 +--- drivers/staging/comedi/drivers/me_daq.c | 6 ++---- drivers/staging/comedi/drivers/mf6x4.c | 4 +--- drivers/staging/comedi/drivers/ni_6527.c | 6 +----- drivers/staging/comedi/drivers/ni_65xx.c | 8 ++------ drivers/staging/comedi/drivers/ni_660x.c | 6 +----- drivers/staging/comedi/drivers/ni_670x.c | 4 +--- drivers/staging/comedi/drivers/ni_labpc_pci.c | 11 +---------- drivers/staging/comedi/drivers/ni_pcidio.c | 6 +----- drivers/staging/comedi/drivers/ni_pcimio.c | 6 +----- drivers/staging/comedi/drivers/rtd520.c | 5 +---- drivers/staging/comedi/drivers/s626.c | 7 +------ drivers/staging/comedi/drivers/skel.c | 2 +- 57 files changed, 80 insertions(+), 220 deletions(-) diff --git a/drivers/staging/comedi/comedi_pci.c b/drivers/staging/comedi/comedi_pci.c index abbc0e4..e594d76 100644 --- a/drivers/staging/comedi/comedi_pci.c +++ b/drivers/staging/comedi/comedi_pci.c @@ -17,6 +17,7 @@ */ #include <linux/pci.h> +#include <linux/interrupt.h> #include "comedidev.h" @@ -57,20 +58,29 @@ int comedi_pci_enable(struct comedi_device *dev) EXPORT_SYMBOL_GPL(comedi_pci_enable); /** - * comedi_pci_disable() - Release the regions and disable the PCI device. + * comedi_pci_detach() - A generic (*detach) function for PCI drivers. * @dev: comedi_device struct */ -void comedi_pci_disable(struct comedi_device *dev) +void comedi_pci_detach(struct comedi_device *dev) { struct pci_dev *pcidev = comedi_to_pci_dev(dev); - if (pcidev && dev->ioenabled) { - pci_release_regions(pcidev); - pci_disable_device(pcidev); + if (!pcidev || !dev->ioenabled) + return; + + if (dev->irq) { + free_irq(dev->irq, dev); + dev->irq = 0; + } + if (dev->mmio) { + iounmap(dev->mmio); + dev->mmio = NULL; } + pci_release_regions(pcidev); + pci_disable_device(pcidev); dev->ioenabled = false; } -EXPORT_SYMBOL_GPL(comedi_pci_disable); +EXPORT_SYMBOL_GPL(comedi_pci_detach); /** * comedi_pci_auto_config() - Configure/probe a comedi PCI driver. diff --git a/drivers/staging/comedi/comedidev.h b/drivers/staging/comedi/comedidev.h index 58e58a3..73e5fd3 100644 --- a/drivers/staging/comedi/comedidev.h +++ b/drivers/staging/comedi/comedidev.h @@ -502,7 +502,7 @@ struct pci_driver; struct pci_dev *comedi_to_pci_dev(struct comedi_device *); int comedi_pci_enable(struct comedi_device *); -void comedi_pci_disable(struct comedi_device *); +void comedi_pci_detach(struct comedi_device *); int comedi_pci_auto_config(struct pci_dev *, struct comedi_driver *, unsigned long context); @@ -543,7 +543,7 @@ static inline int comedi_pci_enable(struct comedi_device *dev) return -ENOSYS; } -static inline void comedi_pci_disable(struct comedi_device *dev) +static inline void comedi_pcmcia_disable(struct comedi_device *dev) { } diff --git a/drivers/staging/comedi/drivers/8255_pci.c b/drivers/staging/comedi/drivers/8255_pci.c index f21e656..21f8b17 100644 --- a/drivers/staging/comedi/drivers/8255_pci.c +++ b/drivers/staging/comedi/drivers/8255_pci.c @@ -265,18 +265,11 @@ static int pci_8255_auto_attach(struct comedi_device *dev, return 0; } -static void pci_8255_detach(struct comedi_device *dev) -{ - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); -} - static struct comedi_driver pci_8255_driver = { .driver_name = "8255_pci", .module = THIS_MODULE, .auto_attach = pci_8255_auto_attach, - .detach = pci_8255_detach, + .detach = comedi_pci_detach, }; static int pci_8255_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/addi-data/addi_common.c b/drivers/staging/comedi/drivers/addi-data/addi_common.c index de5843a..35aed68 100644 --- a/drivers/staging/comedi/drivers/addi-data/addi_common.c +++ b/drivers/staging/comedi/drivers/addi-data/addi_common.c @@ -273,8 +273,6 @@ static void i_ADDI_Detach(struct comedi_device *dev) if (devpriv) { if (dev->iobase) i_ADDI_Reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } diff --git a/drivers/staging/comedi/drivers/addi_apci_1032.c b/drivers/staging/comedi/drivers/addi_apci_1032.c index 1b2e7c0..8a556fe 100644 --- a/drivers/staging/comedi/drivers/addi_apci_1032.c +++ b/drivers/staging/comedi/drivers/addi_apci_1032.c @@ -347,9 +347,7 @@ static void apci1032_detach(struct comedi_device *dev) { if (dev->iobase) apci1032_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci1032_driver = { diff --git a/drivers/staging/comedi/drivers/addi_apci_1516.c b/drivers/staging/comedi/drivers/addi_apci_1516.c index e9c5291..5cd3968 100644 --- a/drivers/staging/comedi/drivers/addi_apci_1516.c +++ b/drivers/staging/comedi/drivers/addi_apci_1516.c @@ -190,7 +190,7 @@ static void apci1516_detach(struct comedi_device *dev) { if (dev->iobase) apci1516_reset(dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci1516_driver = { diff --git a/drivers/staging/comedi/drivers/addi_apci_1564.c b/drivers/staging/comedi/drivers/addi_apci_1564.c index 190b026..1c826d8 100644 --- a/drivers/staging/comedi/drivers/addi_apci_1564.c +++ b/drivers/staging/comedi/drivers/addi_apci_1564.c @@ -441,9 +441,7 @@ static void apci1564_detach(struct comedi_device *dev) { if (dev->iobase) apci1564_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci1564_driver = { diff --git a/drivers/staging/comedi/drivers/addi_apci_16xx.c b/drivers/staging/comedi/drivers/addi_apci_16xx.c index 28df4b5..4162e2d 100644 --- a/drivers/staging/comedi/drivers/addi_apci_16xx.c +++ b/drivers/staging/comedi/drivers/addi_apci_16xx.c @@ -159,7 +159,7 @@ static struct comedi_driver apci16xx_driver = { .driver_name = "addi_apci_16xx", .module = THIS_MODULE, .auto_attach = apci16xx_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int apci16xx_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/addi_apci_2032.c b/drivers/staging/comedi/drivers/addi_apci_2032.c index be0a8a7..d35998d 100644 --- a/drivers/staging/comedi/drivers/addi_apci_2032.c +++ b/drivers/staging/comedi/drivers/addi_apci_2032.c @@ -339,11 +339,9 @@ static void apci2032_detach(struct comedi_device *dev) { if (dev->iobase) apci2032_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (dev->read_subdev) kfree(dev->read_subdev->private); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci2032_driver = { diff --git a/drivers/staging/comedi/drivers/addi_apci_2200.c b/drivers/staging/comedi/drivers/addi_apci_2200.c index e1a9165..51ab1f9 100644 --- a/drivers/staging/comedi/drivers/addi_apci_2200.c +++ b/drivers/staging/comedi/drivers/addi_apci_2200.c @@ -118,7 +118,7 @@ static void apci2200_detach(struct comedi_device *dev) { if (dev->iobase) apci2200_reset(dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci2200_driver = { diff --git a/drivers/staging/comedi/drivers/addi_apci_3120.c b/drivers/staging/comedi/drivers/addi_apci_3120.c index 0b77f10..2c4c23b 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3120.c +++ b/drivers/staging/comedi/drivers/addi_apci_3120.c @@ -198,8 +198,6 @@ static void apci3120_detach(struct comedi_device *dev) if (devpriv) { if (dev->iobase) apci3120_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv->ul_DmaBufferVirtual[0]) { free_pages((unsigned long)devpriv-> ul_DmaBufferVirtual[0], @@ -211,7 +209,7 @@ static void apci3120_detach(struct comedi_device *dev) devpriv->ui_DmaBufferPages[1]); } } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci3120_driver = { diff --git a/drivers/staging/comedi/drivers/addi_apci_3501.c b/drivers/staging/comedi/drivers/addi_apci_3501.c index d9594f4..b7e14c5 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3501.c +++ b/drivers/staging/comedi/drivers/addi_apci_3501.c @@ -410,9 +410,7 @@ static void apci3501_detach(struct comedi_device *dev) { if (dev->iobase) apci3501_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci3501_driver = { diff --git a/drivers/staging/comedi/drivers/addi_apci_3xxx.c b/drivers/staging/comedi/drivers/addi_apci_3xxx.c index 0f0c7fa..7e1c587 100644 --- a/drivers/staging/comedi/drivers/addi_apci_3xxx.c +++ b/drivers/staging/comedi/drivers/addi_apci_3xxx.c @@ -906,12 +906,8 @@ static void apci3xxx_detach(struct comedi_device *dev) if (devpriv) { if (dev->iobase) apci3xxx_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - if (dev->mmio) - iounmap(dev->mmio); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver apci3xxx_driver = { diff --git a/drivers/staging/comedi/drivers/adl_pci6208.c b/drivers/staging/comedi/drivers/adl_pci6208.c index 921f694..3b4f787 100644 --- a/drivers/staging/comedi/drivers/adl_pci6208.c +++ b/drivers/staging/comedi/drivers/adl_pci6208.c @@ -230,7 +230,7 @@ static struct comedi_driver adl_pci6208_driver = { .driver_name = "adl_pci6208", .module = THIS_MODULE, .auto_attach = pci6208_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int adl_pci6208_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/adl_pci7x3x.c b/drivers/staging/comedi/drivers/adl_pci7x3x.c index 5e3cc77..fb8e5f5 100644 --- a/drivers/staging/comedi/drivers/adl_pci7x3x.c +++ b/drivers/staging/comedi/drivers/adl_pci7x3x.c @@ -246,7 +246,7 @@ static struct comedi_driver adl_pci7x3x_driver = { .driver_name = "adl_pci7x3x", .module = THIS_MODULE, .auto_attach = adl_pci7x3x_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int adl_pci7x3x_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/adl_pci8164.c b/drivers/staging/comedi/drivers/adl_pci8164.c index 300df55..72bccb4 100644 --- a/drivers/staging/comedi/drivers/adl_pci8164.c +++ b/drivers/staging/comedi/drivers/adl_pci8164.c @@ -135,7 +135,7 @@ static struct comedi_driver adl_pci8164_driver = { .driver_name = "adl_pci8164", .module = THIS_MODULE, .auto_attach = adl_pci8164_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int adl_pci8164_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/adl_pci9111.c b/drivers/staging/comedi/drivers/adl_pci9111.c index 51edfeb..823ba34 100644 --- a/drivers/staging/comedi/drivers/adl_pci9111.c +++ b/drivers/staging/comedi/drivers/adl_pci9111.c @@ -793,9 +793,7 @@ static void pci9111_detach(struct comedi_device *dev) { if (dev->iobase) pci9111_reset(dev); - if (dev->irq != 0) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver adl_pci9111_driver = { diff --git a/drivers/staging/comedi/drivers/adl_pci9118.c b/drivers/staging/comedi/drivers/adl_pci9118.c index f30b84e..073740b 100644 --- a/drivers/staging/comedi/drivers/adl_pci9118.c +++ b/drivers/staging/comedi/drivers/adl_pci9118.c @@ -2036,8 +2036,6 @@ static void pci9118_detach(struct comedi_device *dev) if (devpriv) { if (dev->iobase) pci9118_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv->dmabuf_virt[0]) free_pages((unsigned long)devpriv->dmabuf_virt[0], devpriv->dmabuf_pages[0]); @@ -2045,7 +2043,7 @@ static void pci9118_detach(struct comedi_device *dev) free_pages((unsigned long)devpriv->dmabuf_virt[1], devpriv->dmabuf_pages[1]); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); if (pcidev) pci_dev_put(pcidev); } diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c index e19ab95..3e37b0b 100644 --- a/drivers/staging/comedi/drivers/adv_pci1710.c +++ b/drivers/staging/comedi/drivers/adv_pci1710.c @@ -1250,9 +1250,7 @@ static void pci1710_detach(struct comedi_device *dev) { if (dev->iobase) pci1710_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver adv_pci1710_driver = { diff --git a/drivers/staging/comedi/drivers/adv_pci1723.c b/drivers/staging/comedi/drivers/adv_pci1723.c index 1881df4..1610e2b 100644 --- a/drivers/staging/comedi/drivers/adv_pci1723.c +++ b/drivers/staging/comedi/drivers/adv_pci1723.c @@ -286,7 +286,7 @@ static void pci1723_detach(struct comedi_device *dev) { if (dev->iobase) pci1723_reset(dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver adv_pci1723_driver = { diff --git a/drivers/staging/comedi/drivers/adv_pci1724.c b/drivers/staging/comedi/drivers/adv_pci1724.c index bc3c349..2697758 100644 --- a/drivers/staging/comedi/drivers/adv_pci1724.c +++ b/drivers/staging/comedi/drivers/adv_pci1724.c @@ -372,7 +372,7 @@ static struct comedi_driver adv_pci1724_driver = { .driver_name = "adv_pci1724", .module = THIS_MODULE, .auto_attach = adv_pci1724_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int adv_pci1724_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/adv_pci_dio.c b/drivers/staging/comedi/drivers/adv_pci_dio.c index b8c7d914..7791df8 100644 --- a/drivers/staging/comedi/drivers/adv_pci_dio.c +++ b/drivers/staging/comedi/drivers/adv_pci_dio.c @@ -1172,7 +1172,7 @@ static void pci_dio_detach(struct comedi_device *dev) if (devpriv->valid) pci_dio_reset(dev); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver adv_pci_dio_driver = { diff --git a/drivers/staging/comedi/drivers/amplc_dio200.c b/drivers/staging/comedi/drivers/amplc_dio200.c index 17d2e20..19b5c40 100644 --- a/drivers/staging/comedi/drivers/amplc_dio200.c +++ b/drivers/staging/comedi/drivers/amplc_dio200.c @@ -282,17 +282,11 @@ static int dio200_attach(struct comedi_device *dev, struct comedi_devconfig *it) return amplc_dio200_common_attach(dev, irq, 0); } -static void dio200_detach(struct comedi_device *dev) -{ - amplc_dio200_common_detach(dev); - comedi_legacy_detach(dev); -} - static struct comedi_driver amplc_dio200_driver = { .driver_name = "amplc_dio200", .module = THIS_MODULE, .attach = dio200_attach, - .detach = dio200_detach, + .detach = comedi_legacy_detach, .board_name = &dio200_isa_boards[0].name, .offset = sizeof(struct dio200_board), .num_names = ARRAY_SIZE(dio200_isa_boards), diff --git a/drivers/staging/comedi/drivers/amplc_dio200.h b/drivers/staging/comedi/drivers/amplc_dio200.h index e0afe2c..641f1bf 100644 --- a/drivers/staging/comedi/drivers/amplc_dio200.h +++ b/drivers/staging/comedi/drivers/amplc_dio200.h @@ -69,8 +69,6 @@ struct dio200_private { int amplc_dio200_common_attach(struct comedi_device *dev, unsigned int irq, unsigned long req_irq_flags); -void amplc_dio200_common_detach(struct comedi_device *dev); - /* Used by initialization of PCIe boards. */ void amplc_dio200_set_enhance(struct comedi_device *dev, unsigned char val); diff --git a/drivers/staging/comedi/drivers/amplc_dio200_common.c b/drivers/staging/comedi/drivers/amplc_dio200_common.c index f0d709e..81b082b 100644 --- a/drivers/staging/comedi/drivers/amplc_dio200_common.c +++ b/drivers/staging/comedi/drivers/amplc_dio200_common.c @@ -1193,15 +1193,6 @@ int amplc_dio200_common_attach(struct comedi_device *dev, unsigned int irq, } EXPORT_SYMBOL_GPL(amplc_dio200_common_attach); -void amplc_dio200_common_detach(struct comedi_device *dev) -{ - if (dev->irq) { - free_irq(dev->irq, dev); - dev->irq = 0; - } -} -EXPORT_SYMBOL_GPL(amplc_dio200_common_detach); - static int __init amplc_dio200_common_init(void) { return 0; diff --git a/drivers/staging/comedi/drivers/amplc_dio200_pci.c b/drivers/staging/comedi/drivers/amplc_dio200_pci.c index fbf0568..2aea03a 100644 --- a/drivers/staging/comedi/drivers/amplc_dio200_pci.c +++ b/drivers/staging/comedi/drivers/amplc_dio200_pci.c @@ -410,19 +410,11 @@ static int dio200_pci_auto_attach(struct comedi_device *dev, return amplc_dio200_common_attach(dev, pci_dev->irq, IRQF_SHARED); } -static void dio200_pci_detach(struct comedi_device *dev) -{ - amplc_dio200_common_detach(dev); - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); -} - static struct comedi_driver dio200_pci_comedi_driver = { .driver_name = "amplc_dio200_pci", .module = THIS_MODULE, .auto_attach = dio200_pci_auto_attach, - .detach = dio200_pci_detach, + .detach = comedi_pci_detach, }; static const struct pci_device_id dio200_pci_table[] = { diff --git a/drivers/staging/comedi/drivers/amplc_pci224.c b/drivers/staging/comedi/drivers/amplc_pci224.c index 6fed6b8..21f06bb 100644 --- a/drivers/staging/comedi/drivers/amplc_pci224.c +++ b/drivers/staging/comedi/drivers/amplc_pci224.c @@ -1166,14 +1166,12 @@ static void pci224_detach(struct comedi_device *dev) { struct pci224_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { kfree(devpriv->ao_readback); kfree(devpriv->ao_scan_vals); kfree(devpriv->ao_scan_order); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver amplc_pci224_driver = { diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c index 684275d..99f7694 100644 --- a/drivers/staging/comedi/drivers/amplc_pci230.c +++ b/drivers/staging/comedi/drivers/amplc_pci230.c @@ -2864,9 +2864,7 @@ static void pci230_detach(struct comedi_device *dev) { struct pci_dev *pcidev = comedi_to_pci_dev(dev); - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); if (pcidev) pci_dev_put(pcidev); } diff --git a/drivers/staging/comedi/drivers/amplc_pci236.c b/drivers/staging/comedi/drivers/amplc_pci236.c index 436aeba..ad1e93d 100644 --- a/drivers/staging/comedi/drivers/amplc_pci236.c +++ b/drivers/staging/comedi/drivers/amplc_pci236.c @@ -119,18 +119,11 @@ static int pci236_auto_attach(struct comedi_device *dev, IRQF_SHARED); } -static void pci236_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); -} - static struct comedi_driver amplc_pci236_driver = { .driver_name = "amplc_pci236", .module = THIS_MODULE, .auto_attach = pci236_auto_attach, - .detach = pci236_detach, + .detach = comedi_pci_detach, }; static const struct pci_device_id pci236_pci_table[] = { diff --git a/drivers/staging/comedi/drivers/amplc_pci263.c b/drivers/staging/comedi/drivers/amplc_pci263.c index 748a6b1..2259bee 100644 --- a/drivers/staging/comedi/drivers/amplc_pci263.c +++ b/drivers/staging/comedi/drivers/amplc_pci263.c @@ -86,7 +86,7 @@ static struct comedi_driver amplc_pci263_driver = { .driver_name = "amplc_pci263", .module = THIS_MODULE, .auto_attach = pci263_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static const struct pci_device_id pci263_pci_table[] = { diff --git a/drivers/staging/comedi/drivers/cb_pcidas.c b/drivers/staging/comedi/drivers/cb_pcidas.c index 4a7bd4e..80908eb 100644 --- a/drivers/staging/comedi/drivers/cb_pcidas.c +++ b/drivers/staging/comedi/drivers/cb_pcidas.c @@ -1599,15 +1599,10 @@ static void cb_pcidas_detach(struct comedi_device *dev) { struct cb_pcidas_private *devpriv = dev->private; - if (devpriv) { - if (devpriv->s5933_config) { - outl(INTCSR_INBOX_INTR_STATUS, - devpriv->s5933_config + AMCC_OP_REG_INTCSR); - } - } - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + if (devpriv && devpriv->s5933_config) + outl(INTCSR_INBOX_INTR_STATUS, + devpriv->s5933_config + AMCC_OP_REG_INTCSR); + comedi_pci_detach(dev); } static struct comedi_driver cb_pcidas_driver = { diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c index fa12614..b3041e3 100644 --- a/drivers/staging/comedi/drivers/cb_pcidas64.c +++ b/drivers/staging/comedi/drivers/cb_pcidas64.c @@ -4001,8 +4001,6 @@ static void detach(struct comedi_device *dev) struct pcidas64_private *devpriv = dev->private; unsigned int i; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (pcidev) { if (devpriv->plx9080_iobase) { @@ -4011,8 +4009,6 @@ static void detach(struct comedi_device *dev) } if (devpriv->main_iobase) iounmap(devpriv->main_iobase); - if (dev->mmio) - iounmap(dev->mmio); /* free pci dma buffers */ for (i = 0; i < ai_dma_ring_count(thisboard); i++) { if (devpriv->ai_buffer[i]) @@ -4043,7 +4039,7 @@ static void detach(struct comedi_device *dev) devpriv->ao_dma_desc_bus_addr); } } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver cb_pcidas64_driver = { diff --git a/drivers/staging/comedi/drivers/cb_pcidda.c b/drivers/staging/comedi/drivers/cb_pcidda.c index 901dc5d..bbec7529 100644 --- a/drivers/staging/comedi/drivers/cb_pcidda.c +++ b/drivers/staging/comedi/drivers/cb_pcidda.c @@ -395,7 +395,7 @@ static struct comedi_driver cb_pcidda_driver = { .driver_name = "cb_pcidda", .module = THIS_MODULE, .auto_attach = cb_pcidda_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int cb_pcidda_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/cb_pcimdas.c b/drivers/staging/comedi/drivers/cb_pcimdas.c index ccb9c72..765e0a0 100644 --- a/drivers/staging/comedi/drivers/cb_pcimdas.c +++ b/drivers/staging/comedi/drivers/cb_pcimdas.c @@ -259,18 +259,11 @@ static int cb_pcimdas_auto_attach(struct comedi_device *dev, return 0; } -static void cb_pcimdas_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); -} - static struct comedi_driver cb_pcimdas_driver = { .driver_name = "cb_pcimdas", .module = THIS_MODULE, .auto_attach = cb_pcimdas_auto_attach, - .detach = cb_pcimdas_detach, + .detach = comedi_pci_detach, }; static int cb_pcimdas_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 4a2b200..e5483eb 100644 --- a/drivers/staging/comedi/drivers/cb_pcimdda.c +++ b/drivers/staging/comedi/drivers/cb_pcimdda.c @@ -194,7 +194,7 @@ static struct comedi_driver cb_pcimdda_driver = { .driver_name = "cb_pcimdda", .module = THIS_MODULE, .auto_attach = cb_pcimdda_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int cb_pcimdda_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/contec_pci_dio.c b/drivers/staging/comedi/drivers/contec_pci_dio.c index f066fb0..205f9df 100644 --- a/drivers/staging/comedi/drivers/contec_pci_dio.c +++ b/drivers/staging/comedi/drivers/contec_pci_dio.c @@ -97,7 +97,7 @@ static struct comedi_driver contec_pci_dio_driver = { .driver_name = "contec_pci_dio", .module = THIS_MODULE, .auto_attach = contec_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int contec_pci_dio_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/daqboard2000.c b/drivers/staging/comedi/drivers/daqboard2000.c index cd369cd..ac9f83c 100644 --- a/drivers/staging/comedi/drivers/daqboard2000.c +++ b/drivers/staging/comedi/drivers/daqboard2000.c @@ -755,15 +755,9 @@ static void daqboard2000_detach(struct comedi_device *dev) { struct daqboard2000_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); - if (devpriv) { - if (dev->mmio) - iounmap(dev->mmio); - if (devpriv->plx) - iounmap(devpriv->plx); - } - comedi_pci_disable(dev); + if (devpriv && devpriv->plx) + iounmap(devpriv->plx); + comedi_pci_detach(dev); } static struct comedi_driver daqboard2000_driver = { diff --git a/drivers/staging/comedi/drivers/das08_pci.c b/drivers/staging/comedi/drivers/das08_pci.c index 4ce3eb0..0987ce55 100644 --- a/drivers/staging/comedi/drivers/das08_pci.c +++ b/drivers/staging/comedi/drivers/das08_pci.c @@ -77,7 +77,7 @@ static struct comedi_driver das08_pci_comedi_driver = { .driver_name = "pci-das08", .module = THIS_MODULE, .auto_attach = das08_pci_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int das08_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/dt3000.c b/drivers/staging/comedi/drivers/dt3000.c index 56e21cc..c8732fb 100644 --- a/drivers/staging/comedi/drivers/dt3000.c +++ b/drivers/staging/comedi/drivers/dt3000.c @@ -750,20 +750,11 @@ static int dt3000_auto_attach(struct comedi_device *dev, return 0; } -static void dt3000_detach(struct comedi_device *dev) -{ - if (dev->irq) - free_irq(dev->irq, dev); - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); -} - static struct comedi_driver dt3000_driver = { .driver_name = "dt3000", .module = THIS_MODULE, .auto_attach = dt3000_auto_attach, - .detach = dt3000_detach, + .detach = comedi_pci_detach, }; static int dt3000_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/dyna_pci10xx.c b/drivers/staging/comedi/drivers/dyna_pci10xx.c index e5593f8..78dd404 100644 --- a/drivers/staging/comedi/drivers/dyna_pci10xx.c +++ b/drivers/staging/comedi/drivers/dyna_pci10xx.c @@ -245,7 +245,7 @@ static void dyna_pci10xx_detach(struct comedi_device *dev) if (devpriv) mutex_destroy(&devpriv->mutex); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver dyna_pci10xx_driver = { diff --git a/drivers/staging/comedi/drivers/gsc_hpdi.c b/drivers/staging/comedi/drivers/gsc_hpdi.c index 91c1e8c..77817f3 100644 --- a/drivers/staging/comedi/drivers/gsc_hpdi.c +++ b/drivers/staging/comedi/drivers/gsc_hpdi.c @@ -685,15 +685,11 @@ static void gsc_hpdi_detach(struct comedi_device *dev) struct hpdi_private *devpriv = dev->private; unsigned int i; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->plx9080_mmio) { writel(0, devpriv->plx9080_mmio + PLX_INTRCS_REG); iounmap(devpriv->plx9080_mmio); } - if (dev->mmio) - iounmap(dev->mmio); /* free pci dma buffers */ for (i = 0; i < NUM_DMA_BUFFERS; i++) { if (devpriv->dio_buffer[i]) @@ -711,7 +707,7 @@ static void gsc_hpdi_detach(struct comedi_device *dev) devpriv->dma_desc, devpriv->dma_desc_phys_addr); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver gsc_hpdi_driver = { diff --git a/drivers/staging/comedi/drivers/icp_multi.c b/drivers/staging/comedi/drivers/icp_multi.c index a98cef2..406ae50 100644 --- a/drivers/staging/comedi/drivers/icp_multi.c +++ b/drivers/staging/comedi/drivers/icp_multi.c @@ -558,14 +558,9 @@ static void icp_multi_detach(struct comedi_device *dev) { struct icp_multi_private *devpriv = dev->private; - if (devpriv) - if (devpriv->valid) - icp_multi_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); + if (devpriv && devpriv->valid) + icp_multi_reset(dev); + comedi_pci_detach(dev); } static struct comedi_driver icp_multi_driver = { diff --git a/drivers/staging/comedi/drivers/jr3_pci.c b/drivers/staging/comedi/drivers/jr3_pci.c index 7b20e19..65940c1 100644 --- a/drivers/staging/comedi/drivers/jr3_pci.c +++ b/drivers/staging/comedi/drivers/jr3_pci.c @@ -793,7 +793,7 @@ static void jr3_pci_detach(struct comedi_device *dev) if (devpriv->iobase) iounmap(devpriv->iobase); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver jr3_pci_driver = { diff --git a/drivers/staging/comedi/drivers/ke_counter.c b/drivers/staging/comedi/drivers/ke_counter.c index f46722c..77e94a3 100644 --- a/drivers/staging/comedi/drivers/ke_counter.c +++ b/drivers/staging/comedi/drivers/ke_counter.c @@ -212,7 +212,7 @@ static struct comedi_driver ke_counter_driver = { .driver_name = "ke_counter", .module = THIS_MODULE, .auto_attach = ke_counter_auto_attach, - .detach = comedi_pci_disable, + .detach = comedi_pci_detach, }; static int ke_counter_pci_probe(struct pci_dev *dev, diff --git a/drivers/staging/comedi/drivers/me4000.c b/drivers/staging/comedi/drivers/me4000.c index 9a5c535..bb2f2f1 100644 --- a/drivers/staging/comedi/drivers/me4000.c +++ b/drivers/staging/comedi/drivers/me4000.c @@ -1563,11 +1563,9 @@ static int me4000_auto_attach(struct comedi_device *dev, static void me4000_detach(struct comedi_device *dev) { - if (dev->irq) - free_irq(dev->irq, dev); if (dev->iobase) me4000_reset(dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver me4000_driver = { diff --git a/drivers/staging/comedi/drivers/me_daq.c b/drivers/staging/comedi/drivers/me_daq.c index 37a6fa9..a1e52a9 100644 --- a/drivers/staging/comedi/drivers/me_daq.c +++ b/drivers/staging/comedi/drivers/me_daq.c @@ -554,14 +554,12 @@ static void me_detach(struct comedi_device *dev) struct me_private_data *dev_private = dev->private; if (dev_private) { - if (dev->mmio) { + if (dev->mmio) me_reset(dev); - iounmap(dev->mmio); - } if (dev_private->plx_regbase) iounmap(dev_private->plx_regbase); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver me_daq_driver = { diff --git a/drivers/staging/comedi/drivers/mf6x4.c b/drivers/staging/comedi/drivers/mf6x4.c index 464f4b4..4316ad3 100644 --- a/drivers/staging/comedi/drivers/mf6x4.c +++ b/drivers/staging/comedi/drivers/mf6x4.c @@ -305,12 +305,10 @@ static void mf6x4_detach(struct comedi_device *dev) if (devpriv->bar0_mem) iounmap(devpriv->bar0_mem); - if (dev->mmio) - iounmap(dev->mmio); if (devpriv->bar2_mem) iounmap(devpriv->bar2_mem); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver mf6x4_driver = { diff --git a/drivers/staging/comedi/drivers/ni_6527.c b/drivers/staging/comedi/drivers/ni_6527.c index e84dac2..6306f0f 100644 --- a/drivers/staging/comedi/drivers/ni_6527.c +++ b/drivers/staging/comedi/drivers/ni_6527.c @@ -472,11 +472,7 @@ static void ni6527_detach(struct comedi_device *dev) { if (dev->mmio) ni6527_reset(dev); - if (dev->irq) - free_irq(dev->irq, dev); - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver ni6527_driver = { diff --git a/drivers/staging/comedi/drivers/ni_65xx.c b/drivers/staging/comedi/drivers/ni_65xx.c index 873941b..9f58543 100644 --- a/drivers/staging/comedi/drivers/ni_65xx.c +++ b/drivers/staging/comedi/drivers/ni_65xx.c @@ -793,13 +793,9 @@ static int ni_65xx_auto_attach(struct comedi_device *dev, static void ni_65xx_detach(struct comedi_device *dev) { - if (dev->mmio) { + if (dev->mmio) writeb(0x00, dev->mmio + NI_65XX_CTRL_REG); - iounmap(dev->mmio); - } - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver ni_65xx_driver = { diff --git a/drivers/staging/comedi/drivers/ni_660x.c b/drivers/staging/comedi/drivers/ni_660x.c index b0b03d4..5451b4b 100644 --- a/drivers/staging/comedi/drivers/ni_660x.c +++ b/drivers/staging/comedi/drivers/ni_660x.c @@ -1176,17 +1176,13 @@ static void ni_660x_detach(struct comedi_device *dev) { struct ni_660x_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->counter_dev) ni_gpct_device_destroy(devpriv->counter_dev); ni_660x_free_mite_rings(dev); mite_detach(devpriv->mite); } - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver ni_660x_driver = { diff --git a/drivers/staging/comedi/drivers/ni_670x.c b/drivers/staging/comedi/drivers/ni_670x.c index f5caefa..37ee18d 100644 --- a/drivers/staging/comedi/drivers/ni_670x.c +++ b/drivers/staging/comedi/drivers/ni_670x.c @@ -271,9 +271,7 @@ static void ni_670x_detach(struct comedi_device *dev) if (s) kfree(s->range_table_list); } - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver ni_670x_driver = { diff --git a/drivers/staging/comedi/drivers/ni_labpc_pci.c b/drivers/staging/comedi/drivers/ni_labpc_pci.c index 65984ea..3fc4204 100644 --- a/drivers/staging/comedi/drivers/ni_labpc_pci.c +++ b/drivers/staging/comedi/drivers/ni_labpc_pci.c @@ -108,20 +108,11 @@ static int labpc_pci_auto_attach(struct comedi_device *dev, return labpc_common_attach(dev, pcidev->irq, IRQF_SHARED); } -static void labpc_pci_detach(struct comedi_device *dev) -{ - if (dev->mmio) - iounmap(dev->mmio); - if (dev->irq) - free_irq(dev->irq, dev); - comedi_pci_disable(dev); -} - static struct comedi_driver labpc_pci_comedi_driver = { .driver_name = "labpc_pci", .module = THIS_MODULE, .auto_attach = labpc_pci_auto_attach, - .detach = labpc_pci_detach, + .detach = comedi_pci_detach, }; static const struct pci_device_id labpc_pci_table[] = { diff --git a/drivers/staging/comedi/drivers/ni_pcidio.c b/drivers/staging/comedi/drivers/ni_pcidio.c index b5b36af..1aae277 100644 --- a/drivers/staging/comedi/drivers/ni_pcidio.c +++ b/drivers/staging/comedi/drivers/ni_pcidio.c @@ -986,8 +986,6 @@ static void nidio_detach(struct comedi_device *dev) { struct nidio96_private *devpriv = dev->private; - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { if (devpriv->di_mite_ring) { mite_free_ring(devpriv->di_mite_ring); @@ -995,9 +993,7 @@ static void nidio_detach(struct comedi_device *dev) } mite_detach(devpriv->mite); } - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver ni_pcidio_driver = { diff --git a/drivers/staging/comedi/drivers/ni_pcimio.c b/drivers/staging/comedi/drivers/ni_pcimio.c index da61fa7..da55549 100644 --- a/drivers/staging/comedi/drivers/ni_pcimio.c +++ b/drivers/staging/comedi/drivers/ni_pcimio.c @@ -1113,8 +1113,6 @@ static void pcimio_detach(struct comedi_device *dev) struct ni_private *devpriv = dev->private; mio_common_detach(dev); - if (dev->irq) - free_irq(dev->irq, dev); if (devpriv) { mite_free_ring(devpriv->ai_mite_ring); mite_free_ring(devpriv->ao_mite_ring); @@ -1123,9 +1121,7 @@ static void pcimio_detach(struct comedi_device *dev) mite_free_ring(devpriv->gpct_mite_ring[1]); mite_detach(devpriv->mite); } - if (dev->mmio) - iounmap(dev->mmio); - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static int pcimio_auto_attach(struct comedi_device *dev, diff --git a/drivers/staging/comedi/drivers/rtd520.c b/drivers/staging/comedi/drivers/rtd520.c index 6fc4ed3..ae53307 100644 --- a/drivers/staging/comedi/drivers/rtd520.c +++ b/drivers/staging/comedi/drivers/rtd520.c @@ -1368,16 +1368,13 @@ static void rtd_detach(struct comedi_device *dev) writel(readl(devpriv->lcfg + PLX_INTRCS_REG) & ~(ICS_PLIE | ICS_DMA0_E | ICS_DMA1_E), devpriv->lcfg + PLX_INTRCS_REG); - free_irq(dev->irq, dev); } - if (dev->mmio) - iounmap(dev->mmio); if (devpriv->las1) iounmap(devpriv->las1); if (devpriv->lcfg) iounmap(devpriv->lcfg); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver rtd520_driver = { diff --git a/drivers/staging/comedi/drivers/s626.c b/drivers/staging/comedi/drivers/s626.c index 080608a..975cda4 100644 --- a/drivers/staging/comedi/drivers/s626.c +++ b/drivers/staging/comedi/drivers/s626.c @@ -2929,13 +2929,8 @@ static void s626_detach(struct comedi_device *dev) s626_close_dma_b(dev, &devpriv->ana_buf, S626_DMABUF_SIZE); } - - if (dev->irq) - free_irq(dev->irq, dev); - if (dev->mmio) - iounmap(dev->mmio); } - comedi_pci_disable(dev); + comedi_pci_detach(dev); } static struct comedi_driver s626_driver = { diff --git a/drivers/staging/comedi/drivers/skel.c b/drivers/staging/comedi/drivers/skel.c index a118678..72e2507 100644 --- a/drivers/staging/comedi/drivers/skel.c +++ b/drivers/staging/comedi/drivers/skel.c @@ -636,7 +636,7 @@ static void skel_detach(struct comedi_device *dev) * If PCI device enabled by _auto_attach() (or _attach()), * disable it here. */ - comedi_pci_disable(dev); + comedi_pci_detach(dev); } else { /* * ISA board -- 2.0.3 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel