summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-09-20 23:40:44 (GMT)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-09-25 22:59:59 (GMT)
commitfd8b1b8c1632868f6be2c9edb5ddec8453b9b828 (patch)
tree5251647866a2d67198f26700db7477e5f8fd022b
parent08cd3e1684894e7d541ea92efb8756f7f43453a7 (diff)
downloadlinux-fsl-qoriq-fd8b1b8c1632868f6be2c9edb5ddec8453b9b828.tar.xz
staging: comedi: pcl711: define the mode register magic numbers
Define the magic numbers used with the mode register. For the PCL711B board, the mode register also contains the irq number that is being used. Introduce a helper function to write to the mode register so that this irq number is always included when needed. 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>
-rw-r--r--drivers/staging/comedi/drivers/pcl711.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c
index 1386d8f..1d0e444 100644
--- a/drivers/staging/comedi/drivers/pcl711.c
+++ b/drivers/staging/comedi/drivers/pcl711.c
@@ -83,7 +83,14 @@ supported.
#define PCL711_MUX_CS0 (1 << 4)
#define PCL711_MUX_CS1 (1 << 5)
#define PCL711_MUX_DIFF (PCL711_MUX_CS0 | PCL711_MUX_CS1)
-#define PCL711_MODE 0x0b
+#define PCL711_MODE_REG 0x0b
+#define PCL711_MODE_DEFAULT (0 << 0)
+#define PCL711_MODE_SOFTTRIG (1 << 0)
+#define PCL711_MODE_EXT (2 << 0)
+#define PCL711_MODE_EXT_IRQ (3 << 0)
+#define PCL711_MODE_PACER (4 << 0)
+#define PCL711_MODE_PACER_IRQ (6 << 0)
+#define PCL711_MODE_IRQ(x) (((x) & 0x7) << 4)
#define PCL711_SOFTTRIG 0x0c
#define PCL711_DO_LO 0x0d
#define PCL711_DO_HI 0x0e
@@ -183,6 +190,16 @@ struct pcl711_private {
unsigned int divisor2;
};
+static void pcl711_ai_set_mode(struct comedi_device *dev, unsigned int mode)
+{
+ struct pcl711_private *devpriv = dev->private;
+
+ if (mode == PCL711_MODE_EXT_IRQ || mode == PCL711_MODE_PACER_IRQ)
+ mode |= devpriv->mode;
+
+ outb(mode, dev->iobase + PCL711_MODE_REG);
+}
+
static unsigned int pcl711_ai_get_sample(struct comedi_device *dev,
struct comedi_subdevice *s)
{
@@ -214,9 +231,9 @@ static irqreturn_t pcl711_interrupt(int irq, void *d)
/* FIXME! Nothing else sets ntrig! */
if (!(--devpriv->ntrig)) {
if (board->is_8112)
- outb(1, dev->iobase + PCL711_MODE);
+ pcl711_ai_set_mode(dev, PCL711_MODE_SOFTTRIG);
else
- outb(0, dev->iobase + PCL711_MODE);
+ pcl711_ai_set_mode(dev, PCL711_MODE_DEFAULT);
s->async->events |= COMEDI_CB_EOA;
}
@@ -274,11 +291,7 @@ static int pcl711_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s,
pcl711_set_changain(dev, insn->chanspec);
for (n = 0; n < insn->n; n++) {
- /*
- * Write the correct mode (software polling) and start polling
- * by writing to the trigger register
- */
- outb(1, dev->iobase + PCL711_MODE);
+ pcl711_ai_set_mode(dev, PCL711_MODE_SOFTTRIG);
if (!board->is_8112)
outb(0, dev->iobase + PCL711_SOFTTRIG);
@@ -368,7 +381,6 @@ static int pcl711_ai_cmdtest(struct comedi_device *dev,
static int pcl711_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
{
- struct pcl711_private *devpriv = dev->private;
int timer1, timer2;
struct comedi_cmd *cmd = &s->async->cmd;
@@ -400,13 +412,9 @@ static int pcl711_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
/* clear pending interrupts (just in case) */
outb(0, dev->iobase + PCL711_CLRINTR);
- /*
- * Set mode to IRQ transfer
- */
- outb(devpriv->mode | 6, dev->iobase + PCL711_MODE);
+ pcl711_ai_set_mode(dev, PCL711_MODE_PACER_IRQ);
} else {
- /* external trigger */
- outb(devpriv->mode | 3, dev->iobase + PCL711_MODE);
+ pcl711_ai_set_mode(dev, PCL711_MODE_EXT_IRQ);
}
return 0;
@@ -510,7 +518,7 @@ static int pcl711_attach(struct comedi_device *dev, struct comedi_devconfig *it)
* mode register.
*/
if (board->is_pcl711b)
- devpriv->mode = (dev->irq << 4);
+ devpriv->mode = PCL711_MODE_IRQ(dev->irq);
}
}