[PATCH 08/28] staging: comedi: adv_pci1710: change boardinfo 'fifo_half_size' to 'has_large_fifo'

H Hartley Sweeten hsweeten at visionengravers.com
Tue Jan 20 21:53:06 UTC 2015


The boards supported by this driver have a 4K or 1K FIFO that is used when reading
analog input samples when running an async command. The maximum number of samples
in the FIFO is half the FIFO size due to the 2 bytes/sample (12-bit resolution).

For aesthetics, change the 'fifo_half_size' member to a bit-field flag 'has_large_fifo'
and add a new member to the private data to hold the 'max_samples' available in the
FIFO. Refactor the board attach and pci1710_handle_fifo() accordingly.

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/adv_pci1710.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c
index 634b2a0..14aaa1e 100644
--- a/drivers/staging/comedi/drivers/adv_pci1710.c
+++ b/drivers/staging/comedi/drivers/adv_pci1710.c
@@ -197,8 +197,8 @@ struct boardtype {
 	const struct comedi_lrange *rangelist_ai;	/*  rangelist for A/D */
 	const char *rangecode_ai;	/*  range codes for programming */
 	const struct comedi_lrange *rangelist_ao;	/*  rangelist for D/A */
-	unsigned int fifo_half_size;	/*  size of FIFO/2 */
 	unsigned int has_irq:1;
+	unsigned int has_large_fifo:1;	/* 4K or 1K FIFO */
 	unsigned int has_diff_ai:1;
 	unsigned int has_di_do:1;
 	unsigned int has_counter:1;
@@ -213,8 +213,8 @@ static const struct boardtype boardtypes[] = {
 		.rangelist_ai	= &range_pci1710_3,
 		.rangecode_ai	= range_codes_pci1710_3,
 		.rangelist_ao	= &range_pci171x_da,
-		.fifo_half_size	= 2048,
 		.has_irq	= 1,
+		.has_large_fifo	= 1,
 		.has_diff_ai	= 1,
 		.has_di_do	= 1,
 		.has_counter	= 1,
@@ -227,8 +227,8 @@ static const struct boardtype boardtypes[] = {
 		.rangelist_ai	= &range_pci1710hg,
 		.rangecode_ai	= range_codes_pci1710hg,
 		.rangelist_ao	= &range_pci171x_da,
-		.fifo_half_size	= 2048,
 		.has_irq	= 1,
+		.has_large_fifo	= 1,
 		.has_diff_ai	= 1,
 		.has_di_do	= 1,
 		.has_counter	= 1,
@@ -241,7 +241,6 @@ static const struct boardtype boardtypes[] = {
 		.rangelist_ai	= &range_pci17x1,
 		.rangecode_ai	= range_codes_pci17x1,
 		.rangelist_ao	= &range_pci171x_da,
-		.fifo_half_size	= 512,
 		.has_irq	= 1,
 		.has_di_do	= 1,
 		.has_counter	= 1,
@@ -252,8 +251,8 @@ static const struct boardtype boardtypes[] = {
 		.n_aichan	= 32,
 		.rangelist_ai	= &range_pci1710_3,
 		.rangecode_ai	= range_codes_pci1710_3,
-		.fifo_half_size	= 2048,
 		.has_irq	= 1,
+		.has_large_fifo	= 1,
 		.has_diff_ai	= 1,
 	},
 	[BOARD_PCI1720] = {
@@ -268,13 +267,13 @@ static const struct boardtype boardtypes[] = {
 		.n_aichan	= 16,
 		.rangelist_ai	= &range_pci17x1,
 		.rangecode_ai	= range_codes_pci17x1,
-		.fifo_half_size	= 512,
 		.has_irq	= 1,
 		.has_di_do	= 1,
 	},
 };
 
 struct pci1710_private {
+	unsigned int max_samples;
 	unsigned int CntrlReg;	/*  Control register */
 	unsigned char ai_et;
 	unsigned int ai_et_CntrlReg;
@@ -786,7 +785,7 @@ static int move_block_from_fifo(struct comedi_device *dev,
 static void pci1710_handle_fifo(struct comedi_device *dev,
 				struct comedi_subdevice *s)
 {
-	const struct boardtype *this_board = dev->board_ptr;
+	struct pci1710_private *devpriv = dev->private;
 	struct comedi_cmd *cmd = &s->async->cmd;
 	unsigned int nsamples;
 	unsigned int m;
@@ -806,7 +805,7 @@ static void pci1710_handle_fifo(struct comedi_device *dev,
 		return;
 	}
 
-	nsamples = this_board->fifo_half_size;
+	nsamples = devpriv->max_samples;
 	if (comedi_samples_to_bytes(s, nsamples) >= s->async->prealloc_bufsz) {
 		m = comedi_bytes_to_samples(s, s->async->prealloc_bufsz);
 		if (move_block_from_fifo(dev, s, m, 0))
@@ -1188,6 +1187,9 @@ static int pci1710_auto_attach(struct comedi_device *dev,
 		subdev++;
 	}
 
+	/* max_samples is half the FIFO size (2 bytes/sample) */
+	devpriv->max_samples = (this_board->has_large_fifo) ? 2048 : 512;
+
 	return 0;
 }
 
-- 
2.0.3



More information about the devel mailing list