Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3cc544df authored by Gustavo Silva's avatar Gustavo Silva Committed by Greg Kroah-Hartman
Browse files

Staging: comedi: drivers: fix coding style issues in pcl812.c



This is a patch to the pcl812.c file that fixes up the following
issues:

ERROR: code indent should use tabs where possible		   x 27
WARNING: line over 80 characters				   x 37
WARNING: please, no space before tabs				   x 13
WARNING: braces {} are not necessary for single statement blocks   x  2
WARNING: printk() should include KERN_ facility level		   x 22
WARNING: braces {} are not necessary for any arm of this statement x  5

Signed-off-by: default avatarGustavo Silva <silvagustavo@users.sourceforge.net>
Acked-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent ba22a15a
Loading
Loading
Loading
Loading
+259 −217
Original line number Diff line number Diff line
@@ -15,96 +15,97 @@
 *  card:   A-823PGH, A-823PGL, A-826PG
 * driver:  a823pgh,  a823pgl,  a826pg
 */

/*
Driver: pcl812
Description: Advantech PCL-812/PG, PCL-813/B,
             ADLink ACL-8112DG/HG/PG, ACL-8113, ACL-8216,
             ICP DAS A-821PGH/PGL/PGL-NDA, A-822PGH/PGL, A-823PGH/PGL, A-826PG,
             ICP DAS ISO-813
Author: Michal Dobes <dobes@tesnet.cz>
Devices: [Advantech] PCL-812 (pcl812), PCL-812PG (pcl812pg),
  PCL-813 (pcl813), PCL-813B (pcl813b), [ADLink] ACL-8112DG (acl8112dg),
  ACL-8112HG (acl8112hg), ACL-8113 (acl-8113), ACL-8216 (acl8216),
  [ICP] ISO-813 (iso813), A-821PGH (a821pgh), A-821PGL (a821pgl),
  A-821PGL-NDA (a821pclnda), A-822PGH (a822pgh), A-822PGL (a822pgl),
  A-823PGH (a823pgh), A-823PGL (a823pgl), A-826PG (a826pg)
Updated: Mon, 06 Aug 2007 12:03:15 +0100
Status: works (I hope. My board fire up under my hands
               and I cann't test all features.)

This driver supports insn and cmd interfaces. Some boards support only insn
becouse their hardware don't allow more (PCL-813/B, ACL-8113, ISO-813).
Data transfer over DMA is supported only when you measure only one
channel, this is too hardware limitation of these boards.

Options for PCL-812:
  [0] - IO Base
  [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7; 10, 11, 12, 14, 15)
  [2] - DMA  (0=disable, 1, 3)
  [3] - 0=trigger source is internal 8253 with 2MHz clock
        1=trigger source is external
  [4] - 0=A/D input range is +/-10V
        1=A/D input range is +/-5V
        2=A/D input range is +/-2.5V
        3=A/D input range is +/-1.25V
        4=A/D input range is +/-0.625V
        5=A/D input range is +/-0.3125V
  [5] - 0=D/A outputs 0-5V  (internal reference -5V)
        1=D/A outputs 0-10V (internal reference -10V)
        2=D/A outputs unknown (external reference)

Options for PCL-812PG, ACL-8112PG:
  [0] - IO Base
  [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7; 10, 11, 12, 14, 15)
  [2] - DMA  (0=disable, 1, 3)
  [3] - 0=trigger source is internal 8253 with 2MHz clock
        1=trigger source is external
  [4] - 0=A/D have max +/-5V input
        1=A/D have max +/-10V input
  [5] - 0=D/A outputs 0-5V  (internal reference -5V)
        1=D/A outputs 0-10V (internal reference -10V)
        2=D/A outputs unknown (external reference)

Options for ACL-8112DG/HG, A-822PGL/PGH, A-823PGL/PGH, ACL-8216, A-826PG:
  [0] - IO Base
  [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7; 10, 11, 12, 14, 15)
  [2] - DMA  (0=disable, 1, 3)
  [3] - 0=trigger source is internal 8253 with 2MHz clock
        1=trigger source is external
  [4] - 0=A/D channels are S.E.
        1=A/D channels are DIFF
  [5] - 0=D/A outputs 0-5V  (internal reference -5V)
        1=D/A outputs 0-10V (internal reference -10V)
        2=D/A outputs unknown (external reference)

Options for A-821PGL/PGH:
  [0] - IO Base
  [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7)
  [2] - 0=A/D channels are S.E.
        1=A/D channels are DIFF
  [3] - 0=D/A output 0-5V  (internal reference -5V)
        1=D/A output 0-10V (internal reference -10V)

Options for A-821PGL-NDA:
  [0] - IO Base
  [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7)
  [2] - 0=A/D channels are S.E.
        1=A/D channels are DIFF

Options for PCL-813:
  [0] - IO Base

Options for PCL-813B:
  [0] - IO Base
  [1] - 0= bipolar inputs
        1= unipolar inputs

Options for ACL-8113, ISO-813:
  [0] - IO Base
  [1] - 0= 10V bipolar inputs
        1= 10V unipolar inputs
        2= 20V bipolar inputs
        3= 20V unipolar inputs
 * Driver: pcl812
 * Description: Advantech PCL-812/PG, PCL-813/B,
 *	     ADLink ACL-8112DG/HG/PG, ACL-8113, ACL-8216,
 *	     ICP DAS A-821PGH/PGL/PGL-NDA, A-822PGH/PGL, A-823PGH/PGL, A-826PG,
 *	     ICP DAS ISO-813
 * Author: Michal Dobes <dobes@tesnet.cz>
 * Devices: [Advantech] PCL-812 (pcl812), PCL-812PG (pcl812pg),
 *	PCL-813 (pcl813), PCL-813B (pcl813b), [ADLink] ACL-8112DG (acl8112dg),
 *	ACL-8112HG (acl8112hg), ACL-8113 (acl-8113), ACL-8216 (acl8216),
 *	[ICP] ISO-813 (iso813), A-821PGH (a821pgh), A-821PGL (a821pgl),
 *	A-821PGL-NDA (a821pclnda), A-822PGH (a822pgh), A-822PGL (a822pgl),
 *	A-823PGH (a823pgh), A-823PGL (a823pgl), A-826PG (a826pg)
 * Updated: Mon, 06 Aug 2007 12:03:15 +0100
 * Status: works (I hope. My board fire up under my hands
 *	       and I cann't test all features.)
 *
 * This driver supports insn and cmd interfaces. Some boards support only insn
 * becouse their hardware don't allow more (PCL-813/B, ACL-8113, ISO-813).
 * Data transfer over DMA is supported only when you measure only one
 * channel, this is too hardware limitation of these boards.
 *
 * Options for PCL-812:
 *   [0] - IO Base
 *   [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7; 10, 11, 12, 14, 15)
 *   [2] - DMA  (0=disable, 1, 3)
 *   [3] - 0=trigger source is internal 8253 with 2MHz clock
 *         1=trigger source is external
 *   [4] - 0=A/D input range is +/-10V
 *	   1=A/D input range is +/-5V
 *	   2=A/D input range is +/-2.5V
 *	   3=A/D input range is +/-1.25V
 *	   4=A/D input range is +/-0.625V
 *	   5=A/D input range is +/-0.3125V
 *   [5] - 0=D/A outputs 0-5V  (internal reference -5V)
 *	   1=D/A outputs 0-10V (internal reference -10V)
 *	   2=D/A outputs unknown (external reference)
 *
 * Options for PCL-812PG, ACL-8112PG:
 *   [0] - IO Base
 *   [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7; 10, 11, 12, 14, 15)
 *   [2] - DMA  (0=disable, 1, 3)
 *   [3] - 0=trigger source is internal 8253 with 2MHz clock
 *	   1=trigger source is external
 *   [4] - 0=A/D have max +/-5V input
 *	   1=A/D have max +/-10V input
 *   [5] - 0=D/A outputs 0-5V  (internal reference -5V)
 *	   1=D/A outputs 0-10V (internal reference -10V)
 *	   2=D/A outputs unknown (external reference)
 *
 * Options for ACL-8112DG/HG, A-822PGL/PGH, A-823PGL/PGH, ACL-8216, A-826PG:
 *   [0] - IO Base
 *   [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7; 10, 11, 12, 14, 15)
 *   [2] - DMA  (0=disable, 1, 3)
 *   [3] - 0=trigger source is internal 8253 with 2MHz clock
 *	   1=trigger source is external
 *   [4] - 0=A/D channels are S.E.
 *	   1=A/D channels are DIFF
 *   [5] - 0=D/A outputs 0-5V  (internal reference -5V)
 *	   1=D/A outputs 0-10V (internal reference -10V)
 *	   2=D/A outputs unknown (external reference)
 *
 * Options for A-821PGL/PGH:
 *   [0] - IO Base
 *   [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7)
 *   [2] - 0=A/D channels are S.E.
 *	   1=A/D channels are DIFF
 *   [3] - 0=D/A output 0-5V  (internal reference -5V)
 *	   1=D/A output 0-10V (internal reference -10V)
 *
 * Options for A-821PGL-NDA:
 *   [0] - IO Base
 *   [1] - IRQ  (0=disable, 2, 3, 4, 5, 6, 7)
 *   [2] - 0=A/D channels are S.E.
 *	   1=A/D channels are DIFF
 *
 * Options for PCL-813:
 *   [0] - IO Base
 *
 * Options for PCL-813B:
 *   [0] - IO Base
 *   [1] - 0= bipolar inputs
 *	   1= unipolar inputs
 *
 * Options for ACL-8113, ISO-813:
 *   [0] - IO Base
 *   [1] - 0= 10V bipolar inputs
 *	   1= 10V unipolar inputs
 *	   2= 20V bipolar inputs
 *	   3= 20V unipolar inputs
 */

#include <linux/interrupt.h>
@@ -117,7 +118,8 @@ Options for ACL-8113, ISO-813:

#include "8253.h"

#undef PCL812_EXTDEBUG		/* if this is defined then a lot of messages is printed */
/* if this is defined then a lot of messages is printed */
#undef PCL812_EXTDEBUG

/* hardware types of the cards */
#define boardPCL812PG	      0	/* and ACL-8112PG */
@@ -477,10 +479,13 @@ static int pcl812_ai_insn_read(struct comedi_device *dev,
	int n;
	int timeout, hi;

	outb(devpriv->mode_reg_int | 1, dev->iobase + PCL812_MODE);	/* select software trigger */
	setup_range_channel(dev, s, insn->chanspec, 1);	/*  select channel and renge */
	/* select software trigger */
	outb(devpriv->mode_reg_int | 1, dev->iobase + PCL812_MODE);
	/*  select channel and renge */
	setup_range_channel(dev, s, insn->chanspec, 1);
	for (n = 0; n < insn->n; n++) {
		outb(255, dev->iobase + PCL812_SOFTTRIG);	/* start conversion */
		/* start conversion */
		outb(255, dev->iobase + PCL812_SOFTTRIG);
		udelay(5);
		timeout = 50;	/* wait max 50us, it must finish under 33us */
		while (timeout--) {
@@ -512,10 +517,13 @@ static int acl8216_ai_insn_read(struct comedi_device *dev,
	int n;
	int timeout;

	outb(1, dev->iobase + PCL812_MODE);	/* select software trigger */
	setup_range_channel(dev, s, insn->chanspec, 1);	/*  select channel and renge */
	/* select software trigger */
	outb(1, dev->iobase + PCL812_MODE);
	/*  select channel and renge */
	setup_range_channel(dev, s, insn->chanspec, 1);
	for (n = 0; n < insn->n; n++) {
		outb(255, dev->iobase + PCL812_SOFTTRIG);	/* start conversion */
		/* start conversion */
		outb(255, dev->iobase + PCL812_SOFTTRIG);
		udelay(5);
		timeout = 50;	/* wait max 50us, it must finish under 33us */
		while (timeout--) {
@@ -569,9 +577,8 @@ static int pcl812_ao_insn_read(struct comedi_device *dev,
	int chan = CR_CHAN(insn->chanspec);
	int i;

	for (i = 0; i < insn->n; i++) {
	for (i = 0; i < insn->n; i++)
		data[i] = devpriv->ao_readback[chan];
	}

	return i;
}
@@ -619,14 +626,15 @@ static int pcl812_do_insn_bits(struct comedi_device *dev,
*/
static void pcl812_cmdtest_out(int e, struct comedi_cmd *cmd)
{
	printk("pcl812 e=%d startsrc=%x scansrc=%x convsrc=%x\n", e,
	printk(KERN_INFO "pcl812 e=%d startsrc=%x scansrc=%x convsrc=%x\n", e,
	       cmd->start_src, cmd->scan_begin_src, cmd->convert_src);
	printk("pcl812 e=%d startarg=%d scanarg=%d convarg=%d\n", e,
	printk(KERN_INFO "pcl812 e=%d startarg=%d scanarg=%d convarg=%d\n", e,
	       cmd->start_arg, cmd->scan_begin_arg, cmd->convert_arg);
	printk("pcl812 e=%d stopsrc=%x scanend=%x\n", e, cmd->stop_src,
	       cmd->scan_end_src);
	printk("pcl812 e=%d stoparg=%d scanendarg=%d chanlistlen=%d\n", e,
	       cmd->stop_arg, cmd->scan_end_arg, cmd->chanlist_len);
	printk(KERN_INFO "pcl812 e=%d stopsrc=%x scanend=%x\n", e,
	       cmd->stop_src, cmd->scan_end_src);
	printk(KERN_INFO "pcl812 e=%d stoparg=%d scanendarg=%d "
	       "chanlistlen=%d\n", e, cmd->stop_arg, cmd->scan_end_arg,
	       cmd->chanlist_len);
}
#endif

@@ -656,11 +664,11 @@ static int pcl812_ai_cmdtest(struct comedi_device *dev,
		err++;

	tmp = cmd->convert_src;
	if (devpriv->use_ext_trg) {
	if (devpriv->use_ext_trg)
		cmd->convert_src &= TRIG_EXT;
	} else {
	else
		cmd->convert_src &= TRIG_TIMER;
	}

	if (!cmd->convert_src || tmp != cmd->convert_src)
		err++;

@@ -684,7 +692,10 @@ static int pcl812_ai_cmdtest(struct comedi_device *dev,
		return 1;
	}

	/* step 2: make sure trigger sources are unique and mutually compatible */
	/*
	 * step 2: make sure trigger sources are
	 * unique and mutually compatible
	 */

	if (cmd->start_src != TRIG_NOW) {
		cmd->start_src = TRIG_NOW;
@@ -818,7 +829,7 @@ static int pcl812_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
	struct comedi_cmd *cmd = &s->async->cmd;

#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: BGN: pcl812_ai_cmd(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: BGN: pcl812_ai_cmd(...)\n");
#endif

	if (cmd->start_src != TRIG_NOW)
@@ -853,13 +864,15 @@ static int pcl812_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
	devpriv->ai_n_chan = cmd->chanlist_len;
	memcpy(devpriv->ai_chanlist, cmd->chanlist,
	       sizeof(unsigned int) * cmd->scan_end_arg);
	setup_range_channel(dev, s, devpriv->ai_chanlist[0], 1);	/*  select first channel and range */
	/*  select first channel and range */
	setup_range_channel(dev, s, devpriv->ai_chanlist[0], 1);

	if (devpriv->dma) {	/*  check if we can use DMA transfer */
		devpriv->ai_dma = 1;
		for (i = 1; i < devpriv->ai_n_chan; i++)
			if (devpriv->ai_chanlist[0] != devpriv->ai_chanlist[i]) {
				devpriv->ai_dma = 0;	/*  we cann't use DMA :-( */
				/*  we cann't use DMA :-( */
				devpriv->ai_dma = 0;
				break;
			}
	} else
@@ -880,14 +893,18 @@ static int pcl812_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
	devpriv->ai_poll_ptr = 0;
	s->async->cur_chan = 0;

	if ((devpriv->ai_flags & TRIG_WAKE_EOS)) {	/*  don't we want wake up every scan? */
	/*  don't we want wake up every scan? */
	if ((devpriv->ai_flags & TRIG_WAKE_EOS)) {
		devpriv->ai_eos = 1;

		/*  DMA is useless for this situation */
		if (devpriv->ai_n_chan == 1)
			devpriv->ai_dma = 0;	/*  DMA is useless for this situation */
			devpriv->ai_dma = 0;
	}

	if (devpriv->ai_dma) {
		if (devpriv->ai_eos) {	/*  we use EOS, so adapt DMA buffer to one scan */
		/*  we use EOS, so adapt DMA buffer to one scan */
		if (devpriv->ai_eos) {
			devpriv->dmabytestomove[0] =
			    devpriv->ai_n_chan * sizeof(short);
			devpriv->dmabytestomove[1] =
@@ -905,9 +922,17 @@ static int pcl812_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
			if (devpriv->ai_neverending) {
				devpriv->dma_runs_to_end = 1;
			} else {
				bytes = devpriv->ai_n_chan * devpriv->ai_scans * sizeof(short);	/*  how many samples we must transfer? */
				devpriv->dma_runs_to_end = bytes / devpriv->dmabytestomove[0];	/*  how many DMA pages we must fill */
				devpriv->last_dma_run = bytes % devpriv->dmabytestomove[0];	/* on last dma transfer must be moved */
				/*  how many samples we must transfer? */
				bytes = devpriv->ai_n_chan *
					devpriv->ai_scans * sizeof(short);

				/*  how many DMA pages we must fill */
				devpriv->dma_runs_to_end =
					bytes / devpriv->dmabytestomove[0];

				/* on last dma transfer must be moved */
				devpriv->last_dma_run =
					bytes % devpriv->dmabytestomove[0];
				if (devpriv->dma_runs_to_end == 0)
					devpriv->dmabytestomove[0] =
					    devpriv->last_dma_run;
@@ -945,14 +970,13 @@ static int pcl812_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
		break;
	}

	if (devpriv->ai_dma) {
		outb(devpriv->mode_reg_int | 2, dev->iobase + PCL812_MODE);	/*  let's go! */
	} else {
		outb(devpriv->mode_reg_int | 6, dev->iobase + PCL812_MODE);	/*  let's go! */
	}
	if (devpriv->ai_dma)					/*  let's go! */
		outb(devpriv->mode_reg_int | 2, dev->iobase + PCL812_MODE);
	else							/*  let's go! */
		outb(devpriv->mode_reg_int | 6, dev->iobase + PCL812_MODE);

#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: END: pcl812_ai_cmd(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: END: pcl812_ai_cmd(...)\n");
#endif

	return 0;
@@ -994,7 +1018,8 @@ static irqreturn_t interrupt_pcl812_ai_int(int irq, void *d)

	if (err) {
		printk
		    ("comedi%d: pcl812: (%s at 0x%lx) A/D cmd IRQ without DRDY!\n",
		    ("comedi%d: pcl812: (%s at 0x%lx) "
		     "A/D cmd IRQ without DRDY!\n",
		     dev->minor, dev->board_name, dev->iobase);
		pcl812_ai_cancel(dev, s);
		s->async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR;
@@ -1020,7 +1045,8 @@ static irqreturn_t interrupt_pcl812_ai_int(int irq, void *d)
	if (next_chan == 0) {	/* one scan done */
		devpriv->ai_act_scan++;
		if (!(devpriv->ai_neverending))
			if (devpriv->ai_act_scan >= devpriv->ai_scans) {	/* all data sampled */
							/* all data sampled */
			if (devpriv->ai_act_scan >= devpriv->ai_scans) {
				pcl812_ai_cancel(dev, s);
				s->async->events |= COMEDI_CB_EOA;
			}
@@ -1041,14 +1067,16 @@ static void transfer_from_dma_buf(struct comedi_device *dev,

	s->async->events = 0;
	for (i = len; i; i--) {
		comedi_buf_put(s->async, ptr[bufptr++]);	/*  get one sample */
							/*  get one sample */
		comedi_buf_put(s->async, ptr[bufptr++]);

		s->async->cur_chan++;
		if (s->async->cur_chan >= devpriv->ai_n_chan) {
			s->async->cur_chan = 0;
			devpriv->ai_act_scan++;
			if (!devpriv->ai_neverending)
				if (devpriv->ai_act_scan >= devpriv->ai_scans) {	/* all data sampled */
							/* all data sampled */
				if (devpriv->ai_act_scan >= devpriv->ai_scans) {
					pcl812_ai_cancel(dev, s);
					s->async->events |= COMEDI_CB_EOA;
					break;
@@ -1071,7 +1099,7 @@ static irqreturn_t interrupt_pcl812_ai_dma(int irq, void *d)
	short *ptr;

#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: BGN: interrupt_pcl812_ai_dma(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: BGN: interrupt_pcl812_ai_dma(...)\n");
#endif
	ptr = (short *)devpriv->dmabuf[devpriv->next_dma_buf];
	len = (devpriv->dmabytestomove[devpriv->next_dma_buf] >> 1) -
@@ -1106,7 +1134,7 @@ static irqreturn_t interrupt_pcl812_ai_dma(int irq, void *d)
	transfer_from_dma_buf(dev, s, ptr, bufptr, len);

#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: END: interrupt_pcl812_ai_dma(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: END: interrupt_pcl812_ai_dma(...)\n");
#endif
	return IRQ_HANDLED;
}
@@ -1122,11 +1150,10 @@ static irqreturn_t interrupt_pcl812(int irq, void *d)
		comedi_error(dev, "spurious interrupt");
		return IRQ_HANDLED;
	}
	if (devpriv->ai_dma) {
	if (devpriv->ai_dma)
		return interrupt_pcl812_ai_dma(irq, d);
	} else {
	else
		return interrupt_pcl812_ai_int(irq, d);
	};
}

/*
@@ -1143,7 +1170,8 @@ static int pcl812_ai_poll(struct comedi_device *dev, struct comedi_subdevice *s)
	spin_lock_irqsave(&dev->spinlock, flags);

	for (i = 0; i < 10; i++) {
		top1 = get_dma_residue(devpriv->ai_dma);	/*  where is now DMA */
		/*  where is now DMA */
		top1 = get_dma_residue(devpriv->ai_dma);
		top2 = get_dma_residue(devpriv->ai_dma);
		if (top1 == top2)
			break;
@@ -1153,8 +1181,8 @@ static int pcl812_ai_poll(struct comedi_device *dev, struct comedi_subdevice *s)
		spin_unlock_irqrestore(&dev->spinlock, flags);
		return 0;
	}

	top1 = devpriv->dmabytestomove[1 - devpriv->next_dma_buf] - top1;	/*  where is now DMA in buffer */
	/*  where is now DMA in buffer */
	top1 = devpriv->dmabytestomove[1 - devpriv->next_dma_buf] - top1;
	top1 >>= 1;		/*  sample position */
	top2 = top1 - devpriv->ai_poll_ptr;
	if (top2 < 1) {		/*  no new samples */
@@ -1182,7 +1210,9 @@ static void setup_range_channel(struct comedi_device *dev,
				unsigned int rangechan, char wait)
{
	unsigned char chan_reg = CR_CHAN(rangechan);	/*  normal board */
	unsigned char gain_reg = CR_RANGE(rangechan) + devpriv->range_correction;	/*  gain index */
							/*  gain index */
	unsigned char gain_reg = CR_RANGE(rangechan) +
				 devpriv->range_correction;

	if ((chan_reg == devpriv->old_chan_reg)
	    && (gain_reg == devpriv->old_gain_reg))
@@ -1195,20 +1225,25 @@ static void setup_range_channel(struct comedi_device *dev,
		if (devpriv->use_diff) {
			chan_reg = chan_reg | 0x30;	/*  DIFF inputs */
		} else {
			if (chan_reg & 0x80) {
				chan_reg = chan_reg | 0x20;	/*  SE inputs 8-15 */
			} else {
				chan_reg = chan_reg | 0x10;	/*  SE inputs 0-7 */
			}
			if (chan_reg & 0x80)
							/*  SE inputs 8-15 */
				chan_reg = chan_reg | 0x20;
			else
							/*  SE inputs 0-7 */
				chan_reg = chan_reg | 0x10;
		}
	}

	outb(chan_reg, dev->iobase + PCL812_MUX);	/* select channel */
	outb(gain_reg, dev->iobase + PCL812_GAIN);	/* select gain */

	if (wait) {
		udelay(devpriv->max_812_ai_mode0_rangewait);	/*  XXX this depends on selected range and can be very long for some high gain ranges! */
	}

	if (wait)
		/*
		 * XXX this depends on selected range and can be very long for
		 * some high gain ranges!
		 */
		udelay(devpriv->max_812_ai_mode0_rangewait);
}

/*
@@ -1218,8 +1253,8 @@ static void start_pacer(struct comedi_device *dev, int mode,
			unsigned int divisor1, unsigned int divisor2)
{
#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: BGN: start_pacer(%d,%u,%u)\n", mode, divisor1,
	       divisor2);
	printk(KERN_DEBUG "pcl812 EDBG: BGN: start_pacer(%d,%u,%u)\n", mode,
	       divisor1, divisor2);
#endif
	outb(0xb4, dev->iobase + PCL812_CTRCTL);
	outb(0x74, dev->iobase + PCL812_CTRCTL);
@@ -1232,7 +1267,7 @@ static void start_pacer(struct comedi_device *dev, int mode,
		outb((divisor1 >> 8) & 0xff, dev->iobase + PCL812_CTR1);
	}
#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: END: start_pacer(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: END: start_pacer(...)\n");
#endif
}

@@ -1263,16 +1298,17 @@ static int pcl812_ai_cancel(struct comedi_device *dev,
			    struct comedi_subdevice *s)
{
#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: BGN: pcl812_ai_cancel(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: BGN: pcl812_ai_cancel(...)\n");
#endif
	if (devpriv->ai_dma)
		disable_dma(devpriv->dma);
	outb(0, dev->iobase + PCL812_CLRINT);	/* clear INT request */
	outb(devpriv->mode_reg_int | 0, dev->iobase + PCL812_MODE);	/* Stop A/D */
							/* Stop A/D */
	outb(devpriv->mode_reg_int | 0, dev->iobase + PCL812_MODE);
	start_pacer(dev, -1, 0, 0);	/*  stop 8254 */
	outb(0, dev->iobase + PCL812_CLRINT);	/* clear INT request */
#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: END: pcl812_ai_cancel(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: END: pcl812_ai_cancel(...)\n");
#endif
	return 0;
}
@@ -1283,7 +1319,7 @@ static int pcl812_ai_cancel(struct comedi_device *dev,
static void pcl812_reset(struct comedi_device *dev)
{
#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: BGN: pcl812_reset(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: BGN: pcl812_reset(...)\n");
#endif
	outb(0, dev->iobase + PCL812_MUX);
	outb(0 + devpriv->range_correction, dev->iobase + PCL812_GAIN);
@@ -1315,7 +1351,7 @@ static void pcl812_reset(struct comedi_device *dev)
	}
	udelay(5);
#ifdef PCL812_EXTDEBUG
	printk("pcl812 EDBG: END: pcl812_reset(...)\n");
	printk(KERN_DEBUG "pcl812 EDBG: END: pcl812_reset(...)\n");
#endif
}

@@ -1333,8 +1369,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
	int n_subdevices;

	iobase = it->options[0];
	printk("comedi%d: pcl812:  board=%s, ioport=0x%03lx", dev->minor,
	       this_board->name, iobase);
	printk(KERN_INFO "comedi%d: pcl812:  board=%s, ioport=0x%03lx",
	       dev->minor, this_board->name, iobase);

	if (!request_region(iobase, this_board->io_range, "pcl812")) {
		printk("I/O port conflict\n");
@@ -1356,18 +1392,18 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
		if (irq) {	/* we want to use IRQ */
			if (((1 << irq) & this_board->IRQbits) == 0) {
				printk
				    (", IRQ %u is out of allowed range, DISABLING IT",
				     irq);
				    (", IRQ %u is out of allowed range, "
				     "DISABLING IT", irq);
				irq = 0;	/* Bad IRQ */
			} else {
				if (request_irq
				    (irq, interrupt_pcl812, 0, "pcl812", dev)) {
					printk
					    (", unable to allocate IRQ %u, DISABLING IT",
					     irq);
					    (", unable to allocate IRQ %u, "
					     "DISABLING IT", irq);
					irq = 0;	/* Can't use IRQ */
				} else {
					printk(", irq=%u", irq);
					printk(KERN_INFO ", irq=%u", irq);
				}
			}
		}
@@ -1387,16 +1423,20 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
		}
		ret = request_dma(dma, "pcl812");
		if (ret) {
			printk(", unable to allocate DMA %u, FAIL!\n", dma);
			printk(KERN_ERR ", unable to allocate DMA %u, FAIL!\n",
			       dma);
			return -EBUSY;	/* DMA isn't free */
		}
		devpriv->dma = dma;
		printk(", dma=%u", dma);
		printk(KERN_INFO ", dma=%u", dma);
		pages = 1;	/* we want 8KB */
		devpriv->dmabuf[0] = __get_dma_pages(GFP_KERNEL, pages);
		if (!devpriv->dmabuf[0]) {
			printk(", unable to allocate DMA buffer, FAIL!\n");
			/* maybe experiment with try_to_free_pages() will help .... */
			/*
			 * maybe experiment with try_to_free_pages()
			 * will help ....
			 */
			free_resources(dev);
			return -EBUSY;	/* no buffer :-( */
		}
@@ -1405,7 +1445,7 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
		devpriv->hwdmasize[0] = PAGE_SIZE * (1 << pages);
		devpriv->dmabuf[1] = __get_dma_pages(GFP_KERNEL, pages);
		if (!devpriv->dmabuf[1]) {
			printk(", unable to allocate DMA buffer, FAIL!\n");
			printk(KERN_ERR ", unable to allocate DMA buffer, FAIL!\n");
			free_resources(dev);
			return -EBUSY;
		}
@@ -1468,11 +1508,11 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
		s->maxdata = this_board->ai_maxdata;
		s->len_chanlist = MAX_CHANLIST_LEN;
		s->range_table = this_board->rangelist_ai;
		if (this_board->board_type == boardACL8216) {
		if (this_board->board_type == boardACL8216)
			s->insn_read = acl8216_ai_insn_read;
		} else {
		else
			s->insn_read = pcl812_ai_insn_read;
		}

		devpriv->use_MPC = this_board->haveMPC508;
		s->cancel = pcl812_ai_cancel;
		if (dev->irq) {
@@ -1511,8 +1551,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
				s->range_table = &range_bipolar10;
				break;
				printk
				    (", incorrect range number %d, changing to 0 (+/-10V)",
				     it->options[4]);
				    (", incorrect range number %d, changing "
				     "to 0 (+/-10V)", it->options[4]);
				break;
			}
			break;
@@ -1541,8 +1581,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
				s->range_table = &range_iso813_1_ai;
				break;
				printk
				    (", incorrect range number %d, changing to 0 ",
				     it->options[1]);
				    (", incorrect range number %d, "
				     "changing to 0 ", it->options[1]);
				break;
			}
			break;
@@ -1566,8 +1606,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
				s->range_table = &range_acl8113_1_ai;
				break;
				printk
				    (", incorrect range number %d, changing to 0 ",
				     it->options[1]);
				    (", incorrect range number %d, "
				     "changing to 0 ", it->options[1]);
				break;
			}
			break;
@@ -1638,7 +1678,8 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
	case boardACL8112:
		devpriv->max_812_ai_mode0_rangewait = 1;
		if (it->options[3] > 0)
			devpriv->use_ext_trg = 1;	/*  we use external trigger */
						/*  we use external trigger */
			devpriv->use_ext_trg = 1;
	case boardA821:
		devpriv->max_812_ai_mode0_rangewait = 1;
		devpriv->mode_reg_int = (irq << 4) & 0xf0;
@@ -1647,11 +1688,12 @@ static int pcl812_attach(struct comedi_device *dev, struct comedi_devconfig *it)
	case boardPCL813:
	case boardISO813:
	case boardACL8113:
		devpriv->max_812_ai_mode0_rangewait = 5;	/* maybe there must by greatest timeout */
		/* maybe there must by greatest timeout */
		devpriv->max_812_ai_mode0_rangewait = 5;
		break;
	}

	printk("\n");
	printk(KERN_INFO "\n");
	devpriv->valid = 1;

	pcl812_reset(dev);
@@ -1666,7 +1708,7 @@ static int pcl812_detach(struct comedi_device *dev)
{

#ifdef PCL812_EXTDEBUG
	printk("comedi%d: pcl812: remove\n", dev->minor);
	printk(KERN_DEBUG "comedi%d: pcl812: remove\n", dev->minor);
#endif
	free_resources(dev);
	return 0;