staging: comedi: das08: split out bus specific code
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Thu, 31 Jan 2013 22:25:49 +0000 (15:25 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 4 Feb 2013 01:33:08 +0000 (17:33 -0800)
Split the bus specific ISA/PC-104 and PCI code out of this driver
and create two new drivers, das08_isa and das08_pci.

This allows removing all the #ifdef'ery in the das08 driver that
handled if the CONFIG_COMEDI_DAS08_{ISA,PCI} options were enabled.

It also makes the PCI driver cleanly Plug-and-Play since the comedi
driver only has an auto_attach callback. Previously it also had an
attach callback in order to handle the ISA cards.

Since the PCMCIA support was already split out, we can also remove
the now unused enum das08_bustype and it's use in the boardinfo.
The bus specific code deals with the bustype automatically before
it calls the common attach function in das08.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/Kconfig
drivers/staging/comedi/drivers/Makefile
drivers/staging/comedi/drivers/das08.c
drivers/staging/comedi/drivers/das08.h
drivers/staging/comedi/drivers/das08_cs.c
drivers/staging/comedi/drivers/das08_isa.c [new file with mode: 0644]
drivers/staging/comedi/drivers/das08_pci.c [new file with mode: 0644]

index 2da9290e3b7f78c6c88f8745133b95992a4e8344..1967852eeb1779c12ea4c8b126acb37d6a657d45 100644 (file)
@@ -274,7 +274,7 @@ config COMEDI_DAS08_ISA
          DAS08/JR-16-AO, PC104-DAS08, DAS08/JR/16.
 
          To compile this driver as a module, choose M here: the module will be
-         called das08.
+         called das08_isa.
 
 config COMEDI_DAS16
        tristate "DAS-16 compatible ISA and PC/104 card support"
@@ -802,7 +802,7 @@ config COMEDI_DAS08_PCI
          Enable support for PCI DAS-08 cards.
 
          To compile this driver as a module, choose M here: the module will be
-         called das08.
+         called das08_pci.
 
 config COMEDI_DT3000
        tristate "Data Translation DT3000 series support"
index fd74e7ecb4008d3758355b7acf67ae019058bffb..315e836ff99b9d635ad1e7ac1990750899aa2ed9 100644 (file)
@@ -25,6 +25,7 @@ obj-$(CONFIG_COMEDI_PCM3730)          += pcm3730.o
 obj-$(CONFIG_COMEDI_RTI800)            += rti800.o
 obj-$(CONFIG_COMEDI_RTI802)            += rti802.o
 obj-$(CONFIG_COMEDI_DAS16M1)           += das16m1.o
+obj-$(CONFIG_COMEDI_DAS08_ISA)         += das08_isa.o
 obj-$(CONFIG_COMEDI_DAS16)             += das16.o
 obj-$(CONFIG_COMEDI_DAS800)            += das800.o
 obj-$(CONFIG_COMEDI_DAS1800)           += das1800.o
@@ -81,6 +82,7 @@ obj-$(CONFIG_COMEDI_AMPLC_PC263)      += amplc_pc263.o
 obj-$(CONFIG_COMEDI_AMPLC_PCI224)      += amplc_pci224.o
 obj-$(CONFIG_COMEDI_AMPLC_PCI230)      += amplc_pci230.o
 obj-$(CONFIG_COMEDI_CONTEC_PCI_DIO)    += contec_pci_dio.o
+obj-$(CONFIG_COMEDI_DAS08_PCI)         += das08_pci.o
 obj-$(CONFIG_COMEDI_DT3000)            += dt3000.o
 obj-$(CONFIG_COMEDI_DYNA_PCI10XX)      += dyna_pci10xx.o
 obj-$(CONFIG_COMEDI_UNIOXX5)           += unioxx5.o
index 45a937e959103469271d5e46f1cba18dbc893c36..9823aa06787a2510fdc0d93289eb9dde01554d34 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  comedi/drivers/das08.c
- *  DAS08 driver
+ *  comedi driver for common DAS08 support (used by ISA/PCI/PCMCIA drivers)
  *
  *  COMEDI - Linux Control and Measurement Device Interface
  *  Copyright (C) 2000 David A. Schleef <ds@schleef.org>
 /*
  * Driver: das08
  * Description: DAS-08 compatible boards
+ * Devices: various, see das08_isa, das08_cs, and das08_pci drivers
  * Author: Warren Jasper, ds, Frank Hess
- * Devices: [Keithley Metrabyte] DAS08 (isa-das08),
- *   [ComputerBoards] DAS08 (isa-das08), DAS08-PGM (das08-pgm),
- *   DAS08-PGH (das08-pgh), DAS08-PGL (das08-pgl), DAS08-AOH (das08-aoh),
- *   DAS08-AOL (das08-aol), DAS08-AOM (das08-aom), DAS08/JR-AO (das08/jr-ao),
- *   DAS08/JR-16-AO (das08jr-16-ao), PCI-DAS08 (pci-das08),
- *   PC104-DAS08 (pc104-das08), DAS08/JR/16 (das08jr/16)
  * Updated: Fri, 31 Aug 2012 19:19:06 +0100
  * Status: works
  *
- * This is a rewrite of the das08 and das08jr drivers.
+ * This driver is used by the das08_isa, das08_cs, and das08_pci
+ * drivers to provide the common support for the DAS-08 hardware.
  *
- * Options (for ISA cards):
- *             [0] - base io address
- *
- * Manual configuration of PCI cards is not supported; they are
- * configured automatically.
- *
- * The das08 driver doesn't support asynchronous commands, since
- * the cheap das08 hardware doesn't really support them.  The
- * comedi_rt_timer driver can be used to emulate commands for this
- * driver.
+ * The driver doesn't support asynchronous commands, since the
+ * cheap das08 hardware doesn't really support them.
  */
 
-#include <linux/pci.h>
 #include <linux/delay.h>
 
 #include "../comedidev.h"
 #include "8253.h"
 #include "das08.h"
 
-#define DRV_NAME "das08"
-
-#define DO_ISA IS_ENABLED(CONFIG_COMEDI_DAS08_ISA)
-#define DO_PCI IS_ENABLED(CONFIG_COMEDI_DAS08_PCI)
-#define DO_COMEDI_DRIVER_REGISTER (DO_ISA || DO_PCI)
-
-#define PCI_DEVICE_ID_PCIDAS08 0x29
-#define PCIDAS08_SIZE 0x54
-
-/* pci configuration registers */
-#define INTCSR               0x4c
-#define   INTR1_ENABLE         0x1
-#define   INTR1_HIGH_POLARITY  0x2
-#define   PCI_INTR_ENABLE      0x40
-#define   INTR1_EDGE_TRIG      0x100   /*  requires high polarity */
-#define CNTRL                0x50
-#define   CNTRL_DIR            0x2
-#define   CNTRL_INTR           0x4
-
 /*
     cio-das08.pdf
 
@@ -236,16 +204,6 @@ static const int *const das08_gainlists[] = {
        das08_pgm_gainlist,
 };
 
-static inline bool is_isa_board(const struct das08_board_struct *board)
-{
-       return DO_ISA && board->bustype == isa;
-}
-
-static inline bool is_pci_board(const struct das08_board_struct *board)
-{
-       return DO_PCI && board->bustype == pci;
-}
-
 #define TIMEOUT 100000
 
 static int das08_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
@@ -502,159 +460,6 @@ static int das08_counter_config(struct comedi_device *dev,
        return 2;
 }
 
-#if DO_COMEDI_DRIVER_REGISTER
-static const struct das08_board_struct das08_boards[] = {
-#if DO_ISA
-       {
-               .name = "isa-das08",    /*  cio-das08.pdf */
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pg_none,
-               .ai_encoding = das08_encode12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8255_offset = 8,
-               .i8254_offset = 4,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08-pgm",    /*  cio-das08pgx.pdf */
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pgm,
-               .ai_encoding = das08_encode12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8255_offset = 0,
-               .i8254_offset = 0x04,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08-pgh",    /*  cio-das08pgx.pdf */
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pgh,
-               .ai_encoding = das08_encode12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8254_offset = 0x04,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08-pgl",    /*  cio-das08pgx.pdf */
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pgl,
-               .ai_encoding = das08_encode12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8254_offset = 0x04,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08-aoh",    /*  cio-das08_aox.pdf */
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pgh,
-               .ai_encoding = das08_encode12,
-               .ao_nbits = 12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8255_offset = 0x0c,
-               .i8254_offset = 0x04,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08-aol",    /*  cio-das08_aox.pdf */
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pgl,
-               .ai_encoding = das08_encode12,
-               .ao_nbits = 12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8255_offset = 0x0c,
-               .i8254_offset = 0x04,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08-aom",    /*  cio-das08_aox.pdf */
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pgm,
-               .ai_encoding = das08_encode12,
-               .ao_nbits = 12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8255_offset = 0x0c,
-               .i8254_offset = 0x04,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08/jr-ao",  /*  cio-das08-jr-ao.pdf */
-               .bustype = isa,
-               .is_jr = true,
-               .ai_nbits = 12,
-               .ai_pg = das08_pg_none,
-               .ai_encoding = das08_encode12,
-               .ao_nbits = 12,
-               .di_nchan = 8,
-               .do_nchan = 8,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08jr-16-ao",        /*  cio-das08jr-16-ao.pdf */
-               .bustype = isa,
-               .is_jr = true,
-               .ai_nbits = 16,
-               .ai_pg = das08_pg_none,
-               .ai_encoding = das08_encode16,
-               .ao_nbits = 16,
-               .di_nchan = 8,
-               .do_nchan = 8,
-               .i8254_offset = 0x04,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "pc104-das08",
-               .bustype = isa,
-               .ai_nbits = 12,
-               .ai_pg = das08_pg_none,
-               .ai_encoding = das08_encode12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8254_offset = 4,
-               .iosize = 16,           /*  unchecked */
-       },
-       {
-               .name = "das08jr/16",
-               .bustype = isa,
-               .is_jr = true,
-               .ai_nbits = 16,
-               .ai_pg = das08_pg_none,
-               .ai_encoding = das08_encode16,
-               .di_nchan = 8,
-               .do_nchan = 8,
-               .iosize = 16,           /*  unchecked */
-       },
-#endif /* DO_ISA */
-#if DO_PCI
-       {
-               .name = "pci-das08",    /*  pci-das08 */
-               .id = PCI_DEVICE_ID_PCIDAS08,
-               .bustype = pci,
-               .ai_nbits = 12,
-               .ai_pg = das08_bipolar5,
-               .ai_encoding = das08_encode12,
-               .di_nchan = 3,
-               .do_nchan = 4,
-               .i8254_offset = 4,
-               .iosize = 8,
-       },
-#endif /* DO_PCI */
-};
-#endif /* DO_COMEDI_DRIVER_REGISTER */
-
 int das08_common_attach(struct comedi_device *dev, unsigned long iobase)
 {
        const struct das08_board_struct *thisboard = comedi_board(dev);
@@ -761,84 +566,6 @@ int das08_common_attach(struct comedi_device *dev, unsigned long iobase)
 }
 EXPORT_SYMBOL_GPL(das08_common_attach);
 
-static const struct das08_board_struct *
-das08_find_pci_board(struct pci_dev *pdev)
-{
-#if DO_COMEDI_DRIVER_REGISTER
-       unsigned int i;
-       for (i = 0; i < ARRAY_SIZE(das08_boards); i++)
-               if (is_pci_board(&das08_boards[i]) &&
-                   pdev->device == das08_boards[i].id)
-                       return &das08_boards[i];
-#endif
-       return NULL;
-}
-
-/* only called in the PCI probe path, via comedi_pci_auto_config() */
-static int __maybe_unused
-das08_auto_attach(struct comedi_device *dev, unsigned long context_unused)
-{
-       struct pci_dev *pdev;
-       struct das08_private_struct *devpriv;
-       unsigned long iobase;
-
-       if (!DO_PCI)
-               return -EINVAL;
-
-       pdev = comedi_to_pci_dev(dev);
-       devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
-       if (!devpriv)
-               return -ENOMEM;
-       dev->private = devpriv;
-
-       dev_info(dev->class_dev, "attach pci %s\n", pci_name(pdev));
-       dev->board_ptr = das08_find_pci_board(pdev);
-       if (dev->board_ptr == NULL) {
-               dev_err(dev->class_dev, "BUG! cannot determine board type!\n");
-               return -EINVAL;
-       }
-
-       /*  enable PCI device and reserve I/O spaces */
-       if (comedi_pci_enable(pdev, dev->driver->driver_name)) {
-               dev_err(dev->class_dev,
-                       "Error enabling PCI device and requesting regions\n");
-               return -EIO;
-       }
-       /*  read base addresses */
-       iobase = pci_resource_start(pdev, 2);
-       return das08_common_attach(dev, iobase);
-}
-
-static int __maybe_unused
-das08_attach(struct comedi_device *dev, struct comedi_devconfig *it)
-{
-       const struct das08_board_struct *thisboard = comedi_board(dev);
-       struct das08_private_struct *devpriv;
-       unsigned long iobase;
-
-       devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
-       if (!devpriv)
-               return -ENOMEM;
-       dev->private = devpriv;
-
-       dev_info(dev->class_dev, "attach\n");
-       if (is_pci_board(thisboard)) {
-               dev_err(dev->class_dev,
-                       "Manual configuration of PCI board '%s' is not supported\n",
-                       thisboard->name);
-               return -EIO;
-       } else if (is_isa_board(thisboard)) {
-               iobase = it->options[0];
-               dev_info(dev->class_dev, "iobase 0x%lx\n", iobase);
-               if (!request_region(iobase, thisboard->iosize, DRV_NAME)) {
-                       dev_err(dev->class_dev, "I/O port conflict\n");
-                       return -EIO;
-               }
-               return das08_common_attach(dev, iobase);
-       } else
-               return -EIO;
-}
-
 void das08_common_detach(struct comedi_device *dev)
 {
        if (dev->subdevices)
@@ -846,79 +573,16 @@ void das08_common_detach(struct comedi_device *dev)
 }
 EXPORT_SYMBOL_GPL(das08_common_detach);
 
-static void __maybe_unused das08_detach(struct comedi_device *dev)
-{
-       const struct das08_board_struct *thisboard = comedi_board(dev);
-
-       if (!thisboard)
-               return;
-       das08_common_detach(dev);
-       if (is_isa_board(thisboard)) {
-               if (dev->iobase)
-                       release_region(dev->iobase, thisboard->iosize);
-       } else if (is_pci_board(thisboard)) {
-               struct pci_dev *pdev = comedi_to_pci_dev(dev);
-               if (pdev) {
-                       if (dev->iobase)
-                               comedi_pci_disable(pdev);
-               }
-       }
-}
-
-#if DO_COMEDI_DRIVER_REGISTER
-static struct comedi_driver das08_driver = {
-       .driver_name = DRV_NAME,
-       .module = THIS_MODULE,
-       .attach = das08_attach,
-       .auto_attach = das08_auto_attach,
-       .detach = das08_detach,
-       .board_name = &das08_boards[0].name,
-       .num_names = sizeof(das08_boards) / sizeof(struct das08_board_struct),
-       .offset = sizeof(struct das08_board_struct),
-};
-#endif
-
-#if DO_PCI
-static DEFINE_PCI_DEVICE_TABLE(das08_pci_table) = {
-       { PCI_DEVICE(PCI_VENDOR_ID_CB, PCI_DEVICE_ID_PCIDAS08) },
-       {0}
-};
-
-MODULE_DEVICE_TABLE(pci, das08_pci_table);
-
-static int das08_pci_probe(struct pci_dev *dev,
-                                           const struct pci_device_id *ent)
-{
-       return comedi_pci_auto_config(dev, &das08_driver);
-}
-
-static struct pci_driver das08_pci_driver = {
-       .id_table = das08_pci_table,
-       .name =  DRV_NAME,
-       .probe = &das08_pci_probe,
-       .remove         = comedi_pci_auto_unconfig,
-};
-#endif /* DO_PCI */
-
-#if DO_COMEDI_DRIVER_REGISTER
-#if DO_PCI
-module_comedi_pci_driver(das08_driver, das08_pci_driver);
-#else
-module_comedi_driver(das08_driver);
-#endif
-#else /* DO_COMEDI_DRIVER_REGISTER */
 static int __init das08_init(void)
 {
        return 0;
 }
+module_init(das08_init);
 
 static void __exit das08_exit(void)
 {
 }
-
-module_init(das08_init);
 module_exit(das08_exit);
-#endif /* DO_COMEDI_DRIVER_REGISTER */
 
 MODULE_AUTHOR("Comedi http://www.comedi.org");
 MODULE_DESCRIPTION("Comedi low-level driver");
index 0314baebae393d0f2f682fdcb6979be9b20415b0..b102ad4918c465627d513db9d4e50cdcdcec506e 100644 (file)
@@ -24,7 +24,6 @@
 #ifndef _DAS08_H
 #define _DAS08_H
 
-enum das08_bustype { isa, pci, pcmcia };
 /* different ways ai data is encoded in first two registers */
 enum das08_ai_encoding { das08_encode12, das08_encode16, das08_pcm_encode12 };
 enum das08_lrange { das08_pg_none, das08_bipolar5, das08_pgh, das08_pgl,
@@ -34,7 +33,6 @@ enum das08_lrange { das08_pg_none, das08_bipolar5, das08_pgh, das08_pgl,
 struct das08_board_struct {
        const char *name;
        unsigned int id;        /*  id for pci/pcmcia boards */
-       enum das08_bustype bustype;
        bool is_jr;             /* true for 'JR' boards */
        unsigned int ai_nbits;
        enum das08_lrange ai_pg;
index 23fdb119ada6861b23ee4d7551f93fb9e1ecb9ac..4654b60da18fe3376242437ca04d8aca38f28d93 100644 (file)
@@ -60,7 +60,6 @@ static const struct das08_board_struct das08_cs_boards[] = {
        {
                .name           = "pcm-das08",
                .id             = 0x0,  /*  XXX */
-               .bustype        = pcmcia,
                .ai_nbits       = 12,
                .ai_pg          = das08_bipolar5,
                .ai_encoding    = das08_pcm_encode12,
diff --git a/drivers/staging/comedi/drivers/das08_isa.c b/drivers/staging/comedi/drivers/das08_isa.c
new file mode 100644 (file)
index 0000000..f120782
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ *  das08_isa.c
+ *  comedi driver for DAS08 ISA/PC-104 boards
+ *
+ *  COMEDI - Linux Control and Measurement Device Interface
+ *  Copyright (C) 2000 David A. Schleef <ds@schleef.org>
+ *  Copyright (C) 2001,2002,2003 Frank Mori Hess <fmhess@users.sourceforge.net>
+ *  Copyright (C) 2004 Salvador E. Tropea <set@users.sf.net> <set@ieee.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * Driver: das08_isa
+ * Description: DAS-08 ISA/PC-104 compatible boards
+ * Devices: (Keithley Metrabyte) DAS08 [isa-das08],
+ *         (ComputerBoards) DAS08 [isa-das08]
+ *         (ComputerBoards) DAS08-PGM [das08-pgm]
+ *         (ComputerBoards) DAS08-PGH [das08-pgh]
+ *         (ComputerBoards) DAS08-PGL [das08-pgl]
+ *         (ComputerBoards) DAS08-AOH [das08-aoh]
+ *         (ComputerBoards) DAS08-AOL [das08-aol]
+ *         (ComputerBoards) DAS08-AOM [das08-aom]
+ *         (ComputerBoards) DAS08/JR-AO [das08/jr-ao]
+ *         (ComputerBoards) DAS08/JR-16-AO [das08jr-16-ao]
+ *         (ComputerBoards) PC104-DAS08 [pc104-das08]
+ *         (ComputerBoards) DAS08/JR/16 [das08jr/16]
+ * Author: Warren Jasper, ds, Frank Hess
+ * Updated: Fri, 31 Aug 2012 19:19:06 +0100
+ * Status: works
+ *
+ * This is the ISA/PC-104-specific support split off from the das08 driver.
+ *
+ * Configuration Options:
+ *     [0] - base io address
+ */
+
+#include "../comedidev.h"
+
+#include "das08.h"
+
+static const struct das08_board_struct das08_isa_boards[] = {
+       {
+               /* cio-das08.pdf */
+               .name           = "isa-das08",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pg_none,
+               .ai_encoding    = das08_encode12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8255_offset   = 8,
+               .i8254_offset   = 4,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08pgx.pdf */
+               .name           = "das08-pgm",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pgm,
+               .ai_encoding    = das08_encode12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8255_offset   = 0,
+               .i8254_offset   = 0x04,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08pgx.pdf */
+               .name           = "das08-pgh",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pgh,
+               .ai_encoding    = das08_encode12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8254_offset   = 0x04,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08pgx.pdf */
+               .name           = "das08-pgl",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pgl,
+               .ai_encoding    = das08_encode12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8254_offset   = 0x04,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08_aox.pdf */
+               .name           = "das08-aoh",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pgh,
+               .ai_encoding    = das08_encode12,
+               .ao_nbits       = 12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8255_offset   = 0x0c,
+               .i8254_offset   = 0x04,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08_aox.pdf */
+               .name           = "das08-aol",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pgl,
+               .ai_encoding    = das08_encode12,
+               .ao_nbits       = 12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8255_offset   = 0x0c,
+               .i8254_offset   = 0x04,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08_aox.pdf */
+               .name           = "das08-aom",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pgm,
+               .ai_encoding    = das08_encode12,
+               .ao_nbits       = 12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8255_offset   = 0x0c,
+               .i8254_offset   = 0x04,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08-jr-ao.pdf */
+               .name           = "das08/jr-ao",
+               .is_jr          = true,
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pg_none,
+               .ai_encoding    = das08_encode12,
+               .ao_nbits       = 12,
+               .di_nchan       = 8,
+               .do_nchan       = 8,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               /* cio-das08jr-16-ao.pdf */
+               .name           = "das08jr-16-ao",
+               .is_jr          = true,
+               .ai_nbits       = 16,
+               .ai_pg          = das08_pg_none,
+               .ai_encoding    = das08_encode16,
+               .ao_nbits       = 16,
+               .di_nchan       = 8,
+               .do_nchan       = 8,
+               .i8254_offset   = 0x04,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               .name           = "pc104-das08",
+               .ai_nbits       = 12,
+               .ai_pg          = das08_pg_none,
+               .ai_encoding    = das08_encode12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8254_offset   = 4,
+               .iosize         = 16,           /* unchecked */
+       }, {
+               .name           = "das08jr/16",
+               .is_jr          = true,
+               .ai_nbits       = 16,
+               .ai_pg          = das08_pg_none,
+               .ai_encoding    = das08_encode16,
+               .di_nchan       = 8,
+               .do_nchan       = 8,
+               .iosize         = 16,           /* unchecked */
+       },
+};
+
+static int das08_isa_attach(struct comedi_device *dev,
+                           struct comedi_devconfig *it)
+{
+       const struct das08_board_struct *thisboard = comedi_board(dev);
+       struct das08_private_struct *devpriv;
+
+       devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
+       if (!devpriv)
+               return -ENOMEM;
+       dev->private = devpriv;
+
+       if (!request_region(it->options[0], thisboard->iosize,
+                           thisboard->name))
+               return -EIO;
+
+       return das08_common_attach(dev, it->options[0]);
+}
+
+static void das08_isa_detach(struct comedi_device *dev)
+{
+       const struct das08_board_struct *thisboard = comedi_board(dev);
+
+       das08_common_detach(dev);
+       if (dev->iobase)
+               release_region(dev->iobase, thisboard->iosize);
+}
+
+static struct comedi_driver das08_isa_driver = {
+       .driver_name    = "isa-das08",
+       .module         = THIS_MODULE,
+       .attach         = das08_isa_attach,
+       .detach         = das08_isa_detach,
+       .board_name     = &das08_isa_boards[0].name,
+       .num_names      = ARRAY_SIZE(das08_isa_boards),
+       .offset         = sizeof(das08_isa_boards[0]),
+};
+module_comedi_driver(das08_isa_driver);
+
+MODULE_AUTHOR("Comedi http://www.comedi.org");
+MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/das08_pci.c b/drivers/staging/comedi/drivers/das08_pci.c
new file mode 100644 (file)
index 0000000..c405876
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ *  das08_pci.c
+ *  comedi driver for DAS08 PCI boards
+ *
+ *  COMEDI - Linux Control and Measurement Device Interface
+ *  Copyright (C) 2000 David A. Schleef <ds@schleef.org>
+ *  Copyright (C) 2001,2002,2003 Frank Mori Hess <fmhess@users.sourceforge.net>
+ *  Copyright (C) 2004 Salvador E. Tropea <set@users.sf.net> <set@ieee.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * Driver: das08_pci
+ * Description: DAS-08 PCI compatible boards
+ * Devices: (ComputerBoards) PCI-DAS08 [pci-das08]
+ * Author: Warren Jasper, ds, Frank Hess
+ * Updated: Fri, 31 Aug 2012 19:19:06 +0100
+ * Status: works
+ *
+ * This is the PCI-specific support split off from the das08 driver.
+ *
+ * Configuration Options: not applicable, uses PCI auto config
+ */
+
+#include <linux/pci.h>
+
+#include "../comedidev.h"
+
+#include "das08.h"
+
+#define PCI_DEVICE_ID_PCIDAS08         0x0029
+
+static const struct das08_board_struct das08_pci_boards[] = {
+       {
+               .name           = "pci-das08",
+               .id             = PCI_DEVICE_ID_PCIDAS08,
+               .ai_nbits       = 12,
+               .ai_pg          = das08_bipolar5,
+               .ai_encoding    = das08_encode12,
+               .di_nchan       = 3,
+               .do_nchan       = 4,
+               .i8254_offset   = 4,
+               .iosize         = 8,
+       },
+};
+
+static int das08_pci_auto_attach(struct comedi_device *dev,
+                                unsigned long context_unused)
+{
+       struct pci_dev *pdev = comedi_to_pci_dev(dev);
+       struct das08_private_struct *devpriv;
+       int ret;
+
+       devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
+       if (!devpriv)
+               return -ENOMEM;
+       dev->private = devpriv;
+
+       /* The das08 driver needs the board_ptr */
+       dev->board_ptr = &das08_pci_boards[0];
+
+       ret = comedi_pci_enable(pdev, dev->driver->driver_name);
+       if (ret)
+               return ret;
+       dev->iobase = pci_resource_start(pdev, 2);
+
+       return das08_common_attach(dev, dev->iobase);
+}
+
+static void das08_pci_detach(struct comedi_device *dev)
+{
+       struct pci_dev *pdev = comedi_to_pci_dev(dev);
+
+       das08_common_detach(dev);
+       if (dev->iobase)
+               comedi_pci_disable(pdev);
+}
+
+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,
+};
+
+static int das08_pci_probe(struct pci_dev *dev,
+                          const struct pci_device_id *ent)
+{
+       return comedi_pci_auto_config(dev, &das08_pci_comedi_driver);
+}
+
+static DEFINE_PCI_DEVICE_TABLE(das08_pci_table) = {
+       { PCI_DEVICE(PCI_VENDOR_ID_CB, PCI_DEVICE_ID_PCIDAS08) },
+       { 0 }
+};
+MODULE_DEVICE_TABLE(pci, das08_pci_table);
+
+static struct pci_driver das08_pci_driver = {
+       .name           = "pci-das08",
+       .id_table       = das08_pci_table,
+       .probe          = das08_pci_probe,
+       .remove         = comedi_pci_auto_unconfig,
+};
+module_comedi_pci_driver(das08_pci_comedi_driver, das08_pci_driver);
+
+MODULE_AUTHOR("Comedi http://www.comedi.org");
+MODULE_DESCRIPTION("Comedi low-level driver");
+MODULE_LICENSE("GPL");