Commit eddd2a4c authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: cb_pcidas: refactor write_calibration_bitstream()



Refactor this function to handle the common code used to select the
calibration device (trimpot or caldac) and latch the data after
sending the bitstream.

Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2285cd51
Loading
Loading
Loading
Loading
+36 −54
Original line number Diff line number Diff line
@@ -533,42 +533,49 @@ static int eeprom_read_insn(struct comedi_device *dev,
	return 1;
}

static void write_calibration_bitstream(struct comedi_device *dev,
					unsigned int register_bits,
					unsigned int bitstream,
					unsigned int bitstream_length)
static void cb_pcidas_calib_write(struct comedi_device *dev,
				  unsigned int val, unsigned int len,
				  bool trimpot)
{
	struct cb_pcidas_private *devpriv = dev->private;
	static const int write_delay = 1;
	unsigned int calib_bits = cal_enable_bits(dev);
	unsigned int bit;

	for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) {
		if (bitstream & bit)
			register_bits |= PCIDAS_CALIB_DATA;
		else
			register_bits &= ~PCIDAS_CALIB_DATA;
		udelay(write_delay);
		outw(register_bits, devpriv->pcibar1 + PCIDAS_CALIB_REG);
	}
	if (trimpot) {
		/* select trimpot */
		calib_bits |= PCIDAS_CALIB_TRIM_SEL;
		outw(calib_bits, devpriv->pcibar1 + PCIDAS_CALIB_REG);
	}

static void cb_pcidas_caldac_8800_write(struct comedi_device *dev,
					unsigned int chan, unsigned int val)
{
	struct cb_pcidas_private *devpriv = dev->private;

	/* write 11-bit value */
	write_calibration_bitstream(dev, cal_enable_bits(dev),
				    ((chan & 0x7) << 8) | val, 11);
	/* write bitstream to calibration device */
	for (bit = 1 << (len - 1); bit; bit >>= 1) {
		if (val & bit)
			calib_bits |= PCIDAS_CALIB_DATA;
		else
			calib_bits &= ~PCIDAS_CALIB_DATA;
		udelay(1);
		outw(calib_bits, devpriv->pcibar1 + PCIDAS_CALIB_REG);
	}
	udelay(1);

	calib_bits = cal_enable_bits(dev);

	if (!trimpot) {
		/* select caldac */
	outw(cal_enable_bits(dev) | PCIDAS_CALIB_8800_SEL,
		outw(calib_bits | PCIDAS_CALIB_8800_SEL,
		     devpriv->pcibar1 + PCIDAS_CALIB_REG);
		udelay(1);
	}

	/* latch value */
	outw(cal_enable_bits(dev), devpriv->pcibar1 + PCIDAS_CALIB_REG);
	/* latch value to trimpot/caldac */
	outw(calib_bits, devpriv->pcibar1 + PCIDAS_CALIB_REG);
}

static void cb_pcidas_caldac_8800_write(struct comedi_device *dev,
					unsigned int chan, unsigned int val)
{
	/* write 11-bit value to caldac */
	cb_pcidas_calib_write(dev, ((chan & 0x7) << 8) | val, 11, false);
}

static int cb_pcidas_caldac_insn_write(struct comedi_device *dev,
@@ -630,40 +637,15 @@ static int cb_pcidas_dac08_insn_write(struct comedi_device *dev,
static void cb_pcidas_trimpot_7376_write(struct comedi_device *dev,
					 unsigned int val)
{
	struct cb_pcidas_private *devpriv = dev->private;
	unsigned int calib_bits;

	/* select trimpot */
	calib_bits = cal_enable_bits(dev) | PCIDAS_CALIB_TRIM_SEL;
	udelay(1);
	outw(calib_bits, devpriv->pcibar1 + PCIDAS_CALIB_REG);

	/* write 7-bit value */
	write_calibration_bitstream(dev, calib_bits, val, 7);
	udelay(1);

	/* latch value */
	outw(cal_enable_bits(dev), devpriv->pcibar1 + PCIDAS_CALIB_REG);
	/* write 7-bit value to trimpot */
	cb_pcidas_calib_write(dev, val, 7, true);
}

static void cb_pcidas_trimpot_8402_write(struct comedi_device *dev,
					 unsigned int chan, unsigned int val)
{
	struct cb_pcidas_private *devpriv = dev->private;
	unsigned int calib_bits;

	/* select trimpot */
	calib_bits = cal_enable_bits(dev) | PCIDAS_CALIB_TRIM_SEL;
	udelay(1);
	outw(calib_bits, devpriv->pcibar1 + PCIDAS_CALIB_REG);

	/* write 10-bit value */
	write_calibration_bitstream(dev, calib_bits,
				    ((chan & 0x3) << 8) | val, 10);
	udelay(1);

	/* latch value */
	outw(cal_enable_bits(dev), devpriv->pcibar1 + PCIDAS_CALIB_REG);
	/* write 10-bit value to trimpot */
	cb_pcidas_calib_write(dev, ((chan & 0x3) << 8) | val, 10, true);
}

static void cb_pcidas_trimpot_write(struct comedi_device *dev,