Browse Source

staging: comedi: pcmuio: remove 'iobases' from subdevice private data

The 'asic' and 'port' associated with a given subdevice can easily be
found based on the subdevice 'index'. With that information we can
then calculate the correct iobase and register offset needed to read/
write the 8-bit ports.

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>
H Hartley Sweeten 12 years ago
parent
commit
c4ad65e6ce
1 changed files with 15 additions and 23 deletions
  1. 15 23
      drivers/staging/comedi/drivers/pcmuio.c

+ 15 - 23
drivers/staging/comedi/drivers/pcmuio.c

@@ -141,9 +141,6 @@ static const struct pcmuio_board pcmuio_boards[] = {
 };
 
 struct pcmuio_subdev_private {
-	/* mapping of halfwords (bytes) in port/chanarray to iobase */
-	unsigned long iobases[PORTS_PER_SUBDEV];
-
 	/* The below is only used for intr subdevices */
 	struct {
 		/* if non-negative, this subdev has an interrupt asic */
@@ -190,7 +187,9 @@ static int pcmuio_dio_insn_bits(struct comedi_device *dev,
 				struct comedi_subdevice *s,
 				struct comedi_insn *insn, unsigned int *data)
 {
-	struct pcmuio_subdev_private *subpriv = s->private;
+	int asic = s->index / 2;
+	int port = (s->index % 2) ? 3 : 0;
+	unsigned long iobase = dev->iobase + (asic * ASIC_IOSIZE);
 	int byte_no;
 
 	/* NOTE:
@@ -207,10 +206,8 @@ static int pcmuio_dio_insn_bits(struct comedi_device *dev,
 	s->state = 0;
 
 	for (byte_no = 0; byte_no < s->n_chan / CHANS_PER_PORT; ++byte_no) {
-		/* address of 8-bit port */
-		unsigned long ioaddr = subpriv->iobases[byte_no],
-		    /* bit offset of port in 32-bit doubleword */
-		    offset = byte_no * 8;
+		/* bit offset of port in 32-bit doubleword */
+		unsigned long offset = byte_no * 8;
 		/* this 8-bit port's data */
 		unsigned char byte = 0,
 		    /* The write mask for this port (if any) */
@@ -218,12 +215,12 @@ static int pcmuio_dio_insn_bits(struct comedi_device *dev,
 		    /* The data byte for this port */
 		    data_byte = (data[1] >> offset) & 0xff;
 
-		byte = inb(ioaddr);	/* read all 8-bits for this port */
+		byte = inb(iobase + PCMUIO_PORT_REG(port + byte_no));
 
 		if (write_mask_byte) {
 			byte &= ~write_mask_byte;
 			byte |= ~data_byte & write_mask_byte;
-			outb(byte, ioaddr);
+			outb(byte, iobase + PCMUIO_PORT_REG(port + byte_no));
 		}
 		/* save the digital input lines for this byte.. */
 		s->state |= ((unsigned int)byte) << offset;
@@ -239,15 +236,14 @@ static int pcmuio_dio_insn_config(struct comedi_device *dev,
 				  struct comedi_subdevice *s,
 				  struct comedi_insn *insn, unsigned int *data)
 {
-	struct pcmuio_subdev_private *subpriv = s->private;
-	int chan = CR_CHAN(insn->chanspec), byte_no = chan / 8, bit_no =
-	    chan % 8;
-	unsigned long ioaddr;
+	int asic = s->index / 2;
+	int port = (s->index % 2) ? 3 : 0;
+	unsigned long iobase = dev->iobase + (asic * ASIC_IOSIZE);
+	unsigned int chan = CR_CHAN(insn->chanspec);
+	int byte_no = chan / 8;
+	int bit_no = chan % 8;
 	unsigned char byte;
 
-	/* Compute ioaddr for this channel */
-	ioaddr = subpriv->iobases[byte_no];
-
 	/* NOTE:
 	   writing a 0 an IO channel's bit sets the channel to INPUT
 	   and pulls the line high as well
@@ -269,7 +265,7 @@ static int pcmuio_dio_insn_config(struct comedi_device *dev,
 	case INSN_CONFIG_DIO_INPUT:
 		/* write a 0 to the actual register representing the channel
 		   to set it to 'input'.  0 means "float high". */
-		byte = inb(ioaddr);
+		byte = inb(iobase + PCMUIO_PORT_REG(port + byte_no));
 		byte &= ~(1 << bit_no);
 				/**< set input channel to '0' */
 
@@ -279,7 +275,7 @@ static int pcmuio_dio_insn_config(struct comedi_device *dev,
 		 * as all channels are implicitly output -- but input
 		 * channels are set to float-high.
 		 */
-		outb(byte, ioaddr);
+		outb(byte, iobase + PCMUIO_PORT_REG(port + byte_no));
 
 		/* save to io_bits */
 		s->io_bits &= ~(1 << chan);
@@ -706,8 +702,6 @@ static int pcmuio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
 		subpriv->intr.asic = -1;
 		s->len_chanlist = 1;
 
-		/* save the ioport address for each 'port' of 8 channels in the
-		   subdevice */
 		for (byte_no = 0; byte_no < PORTS_PER_SUBDEV;
 		     ++byte_no, ++port) {
 			if (port >= PORTS_PER_ASIC) {
@@ -715,8 +709,6 @@ static int pcmuio_attach(struct comedi_device *dev, struct comedi_devconfig *it)
 				++asic;
 				thisasic_chanct = 0;
 			}
-			subpriv->iobases[byte_no] = dev->iobase +
-						    (asic * ASIC_IOSIZE) + port;
 
 			if (thisasic_chanct <
 			    CHANS_PER_PORT * INTR_PORTS_PER_ASIC