[PATCH 24/30] staging: comedi: addi_apci_3501: introduce apci3501_wait_for_dac()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Refactor the code that waits for the DAC to be ready into a helper
function.

A timeout of some sort should be added to this helper so code the
users to expect the error condition. In i_APCI3501_WriteAnalogOutput()
just return the error and don't actually write the new value to the
DAC. In apci3501_reset() output a dev_warn() that the DAC was not
ready.

Signed-off-by: H Hartley Sweeten <hsweeten@xxxxxxxxxxxxxxxxxxx>
Cc: Ian Abbott <abbotti@xxxxxxxxx>
Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
---
 .../comedi/drivers/addi-data/hwdrv_apci3501.c      | 21 ++++++----------
 drivers/staging/comedi/drivers/addi_apci_3501.c    | 29 ++++++++++++++--------
 2 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
index 9739e8b..b057906 100644
--- a/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
+++ b/drivers/staging/comedi/drivers/addi-data/hwdrv_apci3501.c
@@ -136,7 +136,8 @@ static int i_APCI3501_WriteAnalogOutput(struct comedi_device *dev,
 					unsigned int *data)
 {
 	struct apci3501_private *devpriv = dev->private;
-	unsigned int ul_Command1 = 0, ul_Channel_no, ul_Polarity, ul_DAC_Ready = 0;
+	unsigned int ul_Command1 = 0, ul_Channel_no, ul_Polarity;
+	int ret;
 
 	ul_Channel_no = CR_CHAN(insn->chanspec);
 
@@ -159,21 +160,15 @@ static int i_APCI3501_WriteAnalogOutput(struct comedi_device *dev,
 		printk("\nIn WriteAnalogOutput :: Not Valid Channel\n");
 	}			/*  end if((ul_Channel_no<0)||(ul_Channel_no>7)) */
 
-	ul_DAC_Ready = inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG);
+	ret = apci3501_wait_for_dac(dev);
+	if (ret)
+		return ret;
 
-	while (ul_DAC_Ready == 0) {
-		ul_DAC_Ready = inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG);
-		ul_DAC_Ready = (ul_DAC_Ready >> 8) & 1;
-	}
-
-	if (ul_DAC_Ready) {
-/* Output the Value on the output channels. */
-		ul_Command1 =
-			(unsigned int) ((unsigned int) (ul_Channel_no & 0xFF) |
+	/* Output the Value on the output channels. */
+	ul_Command1 = (unsigned int) ((unsigned int) (ul_Channel_no & 0xFF) |
 			(unsigned int) ((*data << 0x8) & 0x7FFFFF00L) |
 			(unsigned int) (ul_Polarity));
-		outl(ul_Command1, dev->iobase + APCI3501_AO_DATA_REG);
-	}
+	outl(ul_Command1, dev->iobase + APCI3501_AO_DATA_REG);
 
 	return insn->n;
 }
diff --git a/drivers/staging/comedi/drivers/addi_apci_3501.c b/drivers/staging/comedi/drivers/addi_apci_3501.c
index b4679b2..906c37a 100644
--- a/drivers/staging/comedi/drivers/addi_apci_3501.c
+++ b/drivers/staging/comedi/drivers/addi_apci_3501.c
@@ -47,6 +47,17 @@ static struct comedi_lrange apci3501_ao_range = {
 	}
 };
 
+static int apci3501_wait_for_dac(struct comedi_device *dev)
+{
+	unsigned int status;
+
+	do {
+		status = inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG);
+	} while (!(status & APCI3501_AO_STATUS_READY));
+
+	return 0;
+}
+
 #include "addi-data/hwdrv_apci3501.c"
 
 static int apci3501_di_insn_bits(struct comedi_device *dev,
@@ -209,7 +220,8 @@ static irqreturn_t apci3501_interrupt(int irq, void *d)
 static int apci3501_reset(struct comedi_device *dev)
 {
 	int i_Count = 0, i_temp = 0;
-	unsigned int ul_Command1 = 0, ul_Polarity, ul_DAC_Ready = 0;
+	unsigned int ul_Command1 = 0, ul_Polarity;
+	int ret;
 
 	outl(0x0, dev->iobase + APCI3501_DO_REG);
 	outl(1, dev->iobase + APCI3501_AO_CTRL_STATUS_REG);
@@ -217,15 +229,12 @@ static int apci3501_reset(struct comedi_device *dev)
 	ul_Polarity = 0x80000000;
 
 	for (i_Count = 0; i_Count <= 7; i_Count++) {
-		ul_DAC_Ready = inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG);
-
-		while (ul_DAC_Ready == 0) {
-			ul_DAC_Ready =
-				inl(dev->iobase + APCI3501_AO_CTRL_STATUS_REG);
-			ul_DAC_Ready = (ul_DAC_Ready >> 8) & 1;
-		}
-
-		if (ul_DAC_Ready) {
+		ret = apci3501_wait_for_dac(dev);
+		if (ret) {
+			dev_warn(dev->class_dev,
+				 "%s: DAC not-ready for channel %i\n",
+				 __func__, i_Count);
+		} else {
 			/*  Output the Value on the output channels. */
 			ul_Command1 =
 				(unsigned int) ((unsigned int) (i_Count & 0xFF) |
-- 
1.8.1.1.293.gfe73786

_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel


[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux