linux/drivers/staging/comedi/drivers/pcl725.c
<<
>>
Prefs
   1/*
   2 * comedi/drivers/pcl725.c
   3 * Driver for PCL725 and clones
   4 * David A. Schleef
   5 */
   6/*
   7Driver: pcl725
   8Description: Advantech PCL-725 (& compatibles)
   9Author: ds
  10Status: unknown
  11Devices: [Advantech] PCL-725 (pcl725)
  12*/
  13
  14#include "../comedidev.h"
  15
  16#include <linux/ioport.h>
  17
  18#define PCL725_SIZE 2
  19
  20#define PCL725_DO 0
  21#define PCL725_DI 1
  22
  23static int pcl725_do_insn(struct comedi_device *dev, struct comedi_subdevice *s,
  24                          struct comedi_insn *insn, unsigned int *data)
  25{
  26        if (data[0]) {
  27                s->state &= ~data[0];
  28                s->state |= (data[0] & data[1]);
  29                outb(s->state, dev->iobase + PCL725_DO);
  30        }
  31
  32        data[1] = s->state;
  33
  34        return insn->n;
  35}
  36
  37static int pcl725_di_insn(struct comedi_device *dev, struct comedi_subdevice *s,
  38                          struct comedi_insn *insn, unsigned int *data)
  39{
  40        data[1] = inb(dev->iobase + PCL725_DI);
  41
  42        return insn->n;
  43}
  44
  45static int pcl725_attach(struct comedi_device *dev, struct comedi_devconfig *it)
  46{
  47        struct comedi_subdevice *s;
  48        int ret;
  49
  50        ret = comedi_request_region(dev, it->options[0], PCL725_SIZE);
  51        if (ret)
  52                return ret;
  53
  54        ret = comedi_alloc_subdevices(dev, 2);
  55        if (ret)
  56                return ret;
  57
  58        s = &dev->subdevices[0];
  59        /* do */
  60        s->type = COMEDI_SUBD_DO;
  61        s->subdev_flags = SDF_WRITABLE;
  62        s->maxdata = 1;
  63        s->n_chan = 8;
  64        s->insn_bits = pcl725_do_insn;
  65        s->range_table = &range_digital;
  66
  67        s = &dev->subdevices[1];
  68        /* di */
  69        s->type = COMEDI_SUBD_DI;
  70        s->subdev_flags = SDF_READABLE;
  71        s->maxdata = 1;
  72        s->n_chan = 8;
  73        s->insn_bits = pcl725_di_insn;
  74        s->range_table = &range_digital;
  75
  76        printk(KERN_INFO "\n");
  77
  78        return 0;
  79}
  80
  81static struct comedi_driver pcl725_driver = {
  82        .driver_name    = "pcl725",
  83        .module         = THIS_MODULE,
  84        .attach         = pcl725_attach,
  85        .detach         = comedi_legacy_detach,
  86};
  87module_comedi_driver(pcl725_driver);
  88
  89MODULE_AUTHOR("Comedi http://www.comedi.org");
  90MODULE_DESCRIPTION("Comedi low-level driver");
  91MODULE_LICENSE("GPL");
  92