This source file includes following definitions.
- adl_pci8164_insn_read
- adl_pci8164_insn_write
- adl_pci8164_auto_attach
- adl_pci8164_pci_probe
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 #include <linux/kernel.h>
  21 #include <linux/module.h>
  22 
  23 #include "../comedi_pci.h"
  24 
  25 #define PCI8164_AXIS(x)         ((x) * 0x08)
  26 #define PCI8164_CMD_MSTS_REG    0x00
  27 #define PCI8164_OTP_SSTS_REG    0x02
  28 #define PCI8164_BUF0_REG        0x04
  29 #define PCI8164_BUF1_REG        0x06
  30 
  31 static int adl_pci8164_insn_read(struct comedi_device *dev,
  32                                  struct comedi_subdevice *s,
  33                                  struct comedi_insn *insn,
  34                                  unsigned int *data)
  35 {
  36         unsigned long offset = (unsigned long)s->private;
  37         unsigned int chan = CR_CHAN(insn->chanspec);
  38         int i;
  39 
  40         for (i = 0; i < insn->n; i++)
  41                 data[i] = inw(dev->iobase + PCI8164_AXIS(chan) + offset);
  42 
  43         return insn->n;
  44 }
  45 
  46 static int adl_pci8164_insn_write(struct comedi_device *dev,
  47                                   struct comedi_subdevice *s,
  48                                   struct comedi_insn *insn,
  49                                   unsigned int *data)
  50 {
  51         unsigned long offset = (unsigned long)s->private;
  52         unsigned int chan = CR_CHAN(insn->chanspec);
  53         int i;
  54 
  55         for (i = 0; i < insn->n; i++)
  56                 outw(data[i], dev->iobase + PCI8164_AXIS(chan) + offset);
  57 
  58         return insn->n;
  59 }
  60 
  61 static int adl_pci8164_auto_attach(struct comedi_device *dev,
  62                                    unsigned long context_unused)
  63 {
  64         struct pci_dev *pcidev = comedi_to_pci_dev(dev);
  65         struct comedi_subdevice *s;
  66         int ret;
  67 
  68         ret = comedi_pci_enable(dev);
  69         if (ret)
  70                 return ret;
  71         dev->iobase = pci_resource_start(pcidev, 2);
  72 
  73         ret = comedi_alloc_subdevices(dev, 4);
  74         if (ret)
  75                 return ret;
  76 
  77         
  78         s = &dev->subdevices[0];
  79         s->type         = COMEDI_SUBD_PROC;
  80         s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
  81         s->n_chan       = 4;
  82         s->maxdata      = 0xffff;
  83         s->len_chanlist = 4;
  84         s->insn_read    = adl_pci8164_insn_read;
  85         s->insn_write   = adl_pci8164_insn_write;
  86         s->private      = (void *)PCI8164_CMD_MSTS_REG;
  87 
  88         
  89         s = &dev->subdevices[1];
  90         s->type         = COMEDI_SUBD_PROC;
  91         s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
  92         s->n_chan       = 4;
  93         s->maxdata      = 0xffff;
  94         s->len_chanlist = 4;
  95         s->insn_read    = adl_pci8164_insn_read;
  96         s->insn_write   = adl_pci8164_insn_write;
  97         s->private      = (void *)PCI8164_OTP_SSTS_REG;
  98 
  99         
 100         s = &dev->subdevices[2];
 101         s->type         = COMEDI_SUBD_PROC;
 102         s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
 103         s->n_chan       = 4;
 104         s->maxdata      = 0xffff;
 105         s->len_chanlist = 4;
 106         s->insn_read    = adl_pci8164_insn_read;
 107         s->insn_write   = adl_pci8164_insn_write;
 108         s->private      = (void *)PCI8164_BUF0_REG;
 109 
 110         
 111         s = &dev->subdevices[3];
 112         s->type         = COMEDI_SUBD_PROC;
 113         s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
 114         s->n_chan       = 4;
 115         s->maxdata      = 0xffff;
 116         s->len_chanlist = 4;
 117         s->insn_read    = adl_pci8164_insn_read;
 118         s->insn_write   = adl_pci8164_insn_write;
 119         s->private      = (void *)PCI8164_BUF1_REG;
 120 
 121         return 0;
 122 }
 123 
 124 static struct comedi_driver adl_pci8164_driver = {
 125         .driver_name    = "adl_pci8164",
 126         .module         = THIS_MODULE,
 127         .auto_attach    = adl_pci8164_auto_attach,
 128         .detach         = comedi_pci_detach,
 129 };
 130 
 131 static int adl_pci8164_pci_probe(struct pci_dev *dev,
 132                                  const struct pci_device_id *id)
 133 {
 134         return comedi_pci_auto_config(dev, &adl_pci8164_driver,
 135                                       id->driver_data);
 136 }
 137 
 138 static const struct pci_device_id adl_pci8164_pci_table[] = {
 139         { PCI_DEVICE(PCI_VENDOR_ID_ADLINK, 0x8164) },
 140         { 0 }
 141 };
 142 MODULE_DEVICE_TABLE(pci, adl_pci8164_pci_table);
 143 
 144 static struct pci_driver adl_pci8164_pci_driver = {
 145         .name           = "adl_pci8164",
 146         .id_table       = adl_pci8164_pci_table,
 147         .probe          = adl_pci8164_pci_probe,
 148         .remove         = comedi_pci_auto_unconfig,
 149 };
 150 module_comedi_pci_driver(adl_pci8164_driver, adl_pci8164_pci_driver);
 151 
 152 MODULE_AUTHOR("Comedi http://www.comedi.org");
 153 MODULE_DESCRIPTION("Comedi low-level driver");
 154 MODULE_LICENSE("GPL");