]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
staging: comedi: pcl818: define the mode register bits
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Tue, 4 Mar 2014 18:30:20 +0000 (11:30 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 7 Mar 2014 01:06:18 +0000 (17:06 -0800)
Define the bits in the register to remove the magic values.

Tidy up pcl818_ai_cancel(). The 0x73 mask of the value read from
the control register will disable dma and interrupts but it does
not change the trigger mode. So the software trigger following it
might not work.

Just disable the trigger and clear any pending end-of-conversion.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/comedi/drivers/pcl818.c

index b23457c5a881afeba89071ce92e3a5154e35a2bf..d07d3606a02de2876b017b6e427f0e24c652d7c4 100644 (file)
@@ -119,8 +119,6 @@ A word or two about DMA. Driver support DMA operations at two ways:
 #define boardPCL818 4
 #define boardPCL718 5
 
-/* R/W: operation control register */
-#define PCL818_CONTROL 9
 /* W: counter enable */
 #define PCL818_CNTENABLE 10
 
@@ -138,6 +136,14 @@ A word or two about DMA. Driver support DMA operations at two ways:
 #define PCL818_STATUS_MUX                      (1 << 5)
 #define PCL818_STATUS_UNI                      (1 << 6)
 #define PCL818_STATUS_EOC                      (1 << 7)
+#define PCL818_CTRL_REG                                0x09
+#define PCL818_CTRL_DISABLE_TRIG               (0 << 0)
+#define PCL818_CTRL_SOFT_TRIG                  (1 << 0)
+#define PCL818_CTRL_EXT_TRIG                   (2 << 0)
+#define PCL818_CTRL_PACER_TRIG                 (3 << 0)
+#define PCL818_CTRL_DMAE                       (1 << 2)
+#define PCL818_CTRL_IRQ(x)                     ((x) << 4)
+#define PCL818_CTRL_INTE                       (1 << 7)
 #define PCL818_DO_DI_MSB_REG                   0x0b
 #define PCL818_TIMER_BASE                      0x0c
 
@@ -674,12 +680,17 @@ static irqreturn_t pcl818_interrupt(int irq, void *d)
 static void pcl818_ai_mode13dma_int(int mode, struct comedi_device *dev,
                                    struct comedi_subdevice *s)
 {
+       unsigned int ctrl = 0;
+
        pcl818_ai_setup_dma(dev, s);
 
-       if (mode == 1)  /* Pacer+IRQ+DMA */
-               outb(0x87 | (dev->irq << 4), dev->iobase + PCL818_CONTROL);
-       else            /* Ext trig+IRQ+DMA */
-               outb(0x86 | (dev->irq << 4), dev->iobase + PCL818_CONTROL);
+       ctrl |= PCL818_CTRL_INTE | PCL818_CTRL_IRQ(dev->irq) | PCL818_CTRL_DMAE;
+       if (mode == 1)
+               ctrl |= PCL818_CTRL_PACER_TRIG;
+       else
+               ctrl |= PCL818_CTRL_EXT_TRIG;
+
+       outb(ctrl, dev->iobase + PCL818_CTRL_REG);
 }
 
 static int pcl818_ai_cmd_mode(int mode, struct comedi_device *dev,
@@ -687,6 +698,7 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device *dev,
 {
        struct pcl818_private *devpriv = dev->private;
        struct comedi_cmd *cmd = &s->async->cmd;
+       unsigned int ctrl = 0;
        unsigned int seglen;
 
        if (devpriv->ai_cmd_running)
@@ -717,22 +729,20 @@ static int pcl818_ai_cmd_mode(int mode, struct comedi_device *dev,
                break;
        case 0:
                if (!devpriv->usefifo) {
-                       /* IRQ */
-                       if (mode == 1)  /* Pacer+IRQ */
-                               outb(0x83 | (dev->irq << 4),
-                                    dev->iobase + PCL818_CONTROL);
-                       else            /* Ext trig+IRQ */
-                               outb(0x82 | (dev->irq << 4),
-                                    dev->iobase + PCL818_CONTROL);
+                       ctrl |= PCL818_CTRL_INTE | PCL818_CTRL_IRQ(dev->irq);
+                       if (mode == 1)
+                               ctrl |= PCL818_CTRL_PACER_TRIG;
+                       else
+                               ctrl |= PCL818_CTRL_EXT_TRIG;
                } else {
-                       /* FIFO */
                        /* enable FIFO */
                        outb(1, dev->iobase + PCL818_FI_ENABLE);
-                       if (mode == 1)  /* Pacer */
-                               outb(0x03, dev->iobase + PCL818_CONTROL);
-                       else            /* Ext trig */
-                               outb(0x02, dev->iobase + PCL818_CONTROL);
+                       if (mode == 1)
+                               ctrl |= PCL818_CTRL_PACER_TRIG;
+                       else
+                               ctrl |= PCL818_CTRL_EXT_TRIG;
                }
+               outb(ctrl, dev->iobase + PCL818_CTRL_REG);
        }
 
        pcl818_start_pacer(dev, mode == 1);
@@ -925,13 +935,8 @@ static int pcl818_ai_cancel(struct comedi_device *dev,
                disable_dma(devpriv->dma);
        }
 
-       outb(inb(dev->iobase + PCL818_CONTROL) & 0x73,
-            dev->iobase + PCL818_CONTROL);     /* Stop A/D */
-       udelay(1);
+       outb(PCL818_CTRL_DISABLE_TRIG, dev->iobase + PCL818_CTRL_REG);
        pcl818_start_pacer(dev, false);
-       pcl818_ai_soft_trig(dev);
-       pcl818_ai_get_sample(dev, s, NULL);
-       outb(0, dev->iobase + PCL818_CONTROL);  /* Stop A/D */
        pcl818_ai_clear_eoc(dev);
 
        if (devpriv->usefifo) { /*  FIFO shutdown */
@@ -955,8 +960,7 @@ static int pcl818_ai_insn_read(struct comedi_device *dev,
        int ret = 0;
        int i;
 
-       /* software trigger, DMA and INT off */
-       outb(0, dev->iobase + PCL818_CONTROL);
+       outb(PCL818_CTRL_SOFT_TRIG, dev->iobase + PCL818_CTRL_REG);
 
        pcl818_ai_set_chan_range(dev, chan, range);
        pcl818_ai_set_chan_scan(dev, chan, chan);
@@ -1055,7 +1059,7 @@ static void pcl818_reset(struct comedi_device *dev)
        outb(0, dev->iobase + PCL818_DO_DI_MSB_REG);
        outb(0, dev->iobase + PCL818_DO_DI_LSB_REG);
        udelay(1);
-       outb(0, dev->iobase + PCL818_CONTROL);
+       outb(PCL818_CTRL_DISABLE_TRIG, dev->iobase + PCL818_CTRL_REG);
        outb(0, dev->iobase + PCL818_CNTENABLE);
        outb(0, dev->iobase + PCL818_MUX_REG);
        pcl818_ai_clear_eoc(dev);