[PATCH 14/14] staging: comedi: ii_pci20kc: reorder subdevices

H Hartley Sweeten hsweeten at visionengravers.com
Wed Jul 24 19:14:30 UTC 2013


Make the built-on dio subdevice 0 and the three add-on modules
subdevices 1-3. This allows the driver to consistently use the
ii20k_module_iobase() helper to get the base address needed to
access a the registers used by a given subdevice.

Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
Cc: Ian Abbott <abbotti at mev.co.uk>
Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
---
 drivers/staging/comedi/drivers/ii_pci20kc.c | 66 ++++++++++++++---------------
 1 file changed, 33 insertions(+), 33 deletions(-)

diff --git a/drivers/staging/comedi/drivers/ii_pci20kc.c b/drivers/staging/comedi/drivers/ii_pci20kc.c
index 954c539..377bf00 100644
--- a/drivers/staging/comedi/drivers/ii_pci20kc.c
+++ b/drivers/staging/comedi/drivers/ii_pci20kc.c
@@ -144,7 +144,7 @@ static void __iomem *ii20k_module_iobase(struct comedi_device *dev,
 {
 	struct ii20k_private *devpriv = dev->private;
 
-	return devpriv->ioaddr + (s->index + 1) * II20K_MOD_OFFSET;
+	return devpriv->ioaddr + (s->index * II20K_MOD_OFFSET);
 }
 
 static int ii20k_ao_insn_read(struct comedi_device *dev,
@@ -283,7 +283,7 @@ static int ii20k_ai_insn_read(struct comedi_device *dev,
 static void ii20k_dio_config(struct comedi_device *dev,
 			     struct comedi_subdevice *s)
 {
-	struct ii20k_private *devpriv = dev->private;
+	void __iomem *iobase = ii20k_module_iobase(dev, s);
 	unsigned char ctrl01 = 0;
 	unsigned char ctrl23 = 0;
 	unsigned char dir_ena = 0;
@@ -340,9 +340,9 @@ static void ii20k_dio_config(struct comedi_device *dev,
 	ctrl23 |= II20K_CTRL23_SET;
 
 	/* order is important */
-	writeb(ctrl01, devpriv->ioaddr + II20K_CTRL01_REG);
-	writeb(ctrl23, devpriv->ioaddr + II20K_CTRL23_REG);
-	writeb(dir_ena, devpriv->ioaddr + II20K_DIR_ENA_REG);
+	writeb(ctrl01, iobase + II20K_CTRL01_REG);
+	writeb(ctrl23, iobase + II20K_CTRL23_REG);
+	writeb(dir_ena, iobase + II20K_DIR_ENA_REG);
 }
 
 static int ii20k_dio_insn_config(struct comedi_device *dev,
@@ -386,7 +386,7 @@ static int ii20k_dio_insn_bits(struct comedi_device *dev,
 			       struct comedi_insn *insn,
 			       unsigned int *data)
 {
-	struct ii20k_private *devpriv = dev->private;
+	void __iomem *iobase = ii20k_module_iobase(dev, s);
 	unsigned int mask = data[0] & s->io_bits;	/* outputs only */
 	unsigned int bits = data[1];
 
@@ -396,22 +396,22 @@ static int ii20k_dio_insn_bits(struct comedi_device *dev,
 
 		if (mask & 0x000000ff)
 			writeb((s->state >> 0) & 0xff,
-			       devpriv->ioaddr + II20K_DIO0_REG);
+			       iobase + II20K_DIO0_REG);
 		if (mask & 0x0000ff00)
 			writeb((s->state >> 8) & 0xff,
-			       devpriv->ioaddr + II20K_DIO1_REG);
+			       iobase + II20K_DIO1_REG);
 		if (mask & 0x00ff0000)
 			writeb((s->state >> 16) & 0xff,
-			       devpriv->ioaddr + II20K_DIO2_REG);
+			       iobase + II20K_DIO2_REG);
 		if (mask & 0xff000000)
 			writeb((s->state >> 24) & 0xff,
-			       devpriv->ioaddr + II20K_DIO3_REG);
+			       iobase + II20K_DIO3_REG);
 	}
 
-	data[1] = readb(devpriv->ioaddr + II20K_DIO0_REG);
-	data[1] |= readb(devpriv->ioaddr + II20K_DIO1_REG) << 8;
-	data[1] |= readb(devpriv->ioaddr + II20K_DIO2_REG) << 16;
-	data[1] |= readb(devpriv->ioaddr + II20K_DIO3_REG) << 24;
+	data[1] = readb(iobase + II20K_DIO0_REG);
+	data[1] |= readb(iobase + II20K_DIO1_REG) << 8;
+	data[1] |= readb(iobase + II20K_DIO2_REG) << 16;
+	data[1] |= readb(iobase + II20K_DIO3_REG) << 24;
 
 	return insn->n;
 }
@@ -487,7 +487,24 @@ static int ii20k_attach(struct comedi_device *dev,
 	if (ret)
 		return ret;
 
+	/* Digital I/O subdevice */
 	s = &dev->subdevices[0];
+	if (has_dio) {
+		s->type		= COMEDI_SUBD_DIO;
+		s->subdev_flags	= SDF_READABLE | SDF_WRITABLE;
+		s->n_chan	= 32;
+		s->maxdata	= 1;
+		s->range_table	= &range_digital;
+		s->insn_bits	= ii20k_dio_insn_bits;
+		s->insn_config	= ii20k_dio_insn_config;
+
+		/* default all channels to input */
+		ii20k_dio_config(dev, s);
+	} else {
+		s->type = COMEDI_SUBD_UNUSED;
+	}
+
+	s = &dev->subdevices[1];
 	if (id & II20K_ID_MOD1_EMPTY) {
 		s->type = COMEDI_SUBD_UNUSED;
 	} else {
@@ -496,7 +513,7 @@ static int ii20k_attach(struct comedi_device *dev,
 			return ret;
 	}
 
-	s = &dev->subdevices[1];
+	s = &dev->subdevices[2];
 	if (id & II20K_ID_MOD2_EMPTY) {
 		s->type = COMEDI_SUBD_UNUSED;
 	} else {
@@ -505,7 +522,7 @@ static int ii20k_attach(struct comedi_device *dev,
 			return ret;
 	}
 
-	s = &dev->subdevices[2];
+	s = &dev->subdevices[3];
 	if (id & II20K_ID_MOD3_EMPTY) {
 		s->type = COMEDI_SUBD_UNUSED;
 	} else {
@@ -514,23 +531,6 @@ static int ii20k_attach(struct comedi_device *dev,
 			return ret;
 	}
 
-	/* Digital I/O subdevice */
-	s = &dev->subdevices[3];
-	if (has_dio) {
-		s->type		= COMEDI_SUBD_DIO;
-		s->subdev_flags	= SDF_READABLE | SDF_WRITABLE;
-		s->n_chan	= 32;
-		s->maxdata	= 1;
-		s->range_table	= &range_digital;
-		s->insn_bits	= ii20k_dio_insn_bits;
-		s->insn_config	= ii20k_dio_insn_config;
-
-		/* default all channels to input */
-		ii20k_dio_config(dev, s);
-	} else {
-		s->type = COMEDI_SUBD_UNUSED;
-	}
-
 	return 0;
 }
 
-- 
1.8.3.2



More information about the devel mailing list