Re: [PATCH 3.14 to 3.16] staging: comedi: cb_pcidas64: fix incorrect AI range code handling

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

 



On Fri, Feb 27, 2015 at 05:39:11PM +0000, Ian Abbott wrote:
> commit be8e89087ec2d2c8a1ad1e3db64bf4efdfc3c298 upstream.
>

Thank you Ian, I'll queue if for the 3.16 kernel (although it was
originally tagged for 3.18 only).

Cheers,
--
Luís

> The hardware range code values and list of valid ranges for the AI
> subdevice is incorrect for several supported boards.  The hardware range
> code values for all boards except PCI-DAS4020/12 is determined by
> calling `ai_range_bits_6xxx()` based on the maximum voltage of the range
> and whether it is bipolar or unipolar, however it only returns the
> correct hardware range code for the PCI-DAS60xx boards.  For
> PCI-DAS6402/16 (and /12) it returns the wrong code for the unipolar
> ranges.  For PCI-DAS64/Mx/16 it returns the wrong code for all the
> ranges and the comedi range table is incorrect.
> 
> Change `ai_range_bits_6xxx()` to use a look-up table pointed to by new
> member `ai_range_codes` of `struct pcidas64_board` to map the comedi
> range table indices to the hardware range codes.  Use a new comedi range
> table for the PCI-DAS64/Mx/16 boards (and the commented out variants).
> 
> Signed-off-by: Ian Abbott <abbotti@xxxxxxxxx>
> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
> ---
>  drivers/staging/comedi/drivers/cb_pcidas64.c | 122 ++++++++++++++++-----------
>  1 file changed, 75 insertions(+), 47 deletions(-)
> 
> diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c
> index 035c3a1..18097b1 100644
> --- a/drivers/staging/comedi/drivers/cb_pcidas64.c
> +++ b/drivers/staging/comedi/drivers/cb_pcidas64.c
> @@ -441,6 +441,29 @@ static const struct comedi_lrange ai_ranges_64xx = {
>  	}
>  };
>  
> +static const uint8_t ai_range_code_64xx[8] = {
> +	0x0, 0x1, 0x2, 0x3,	/* bipolar 10, 5, 2,5, 1.25 */
> +	0x8, 0x9, 0xa, 0xb	/* unipolar 10, 5, 2.5, 1.25 */
> +};
> +
> +/* analog input ranges for 64-Mx boards */
> +static const struct comedi_lrange ai_ranges_64_mx = {
> +	7, {
> +		BIP_RANGE(5),
> +		BIP_RANGE(2.5),
> +		BIP_RANGE(1.25),
> +		BIP_RANGE(0.625),
> +		UNI_RANGE(5),
> +		UNI_RANGE(2.5),
> +		UNI_RANGE(1.25)
> +	}
> +};
> +
> +static const uint8_t ai_range_code_64_mx[7] = {
> +	0x0, 0x1, 0x2, 0x3,	/* bipolar 5, 2.5, 1.25, 0.625 */
> +	0x9, 0xa, 0xb		/* unipolar 5, 2.5, 1.25 */
> +};
> +
>  /* analog input ranges for 60xx boards */
>  static const struct comedi_lrange ai_ranges_60xx = {
>  	4, {
> @@ -451,6 +474,10 @@ static const struct comedi_lrange ai_ranges_60xx = {
>  	}
>  };
>  
> +static const uint8_t ai_range_code_60xx[4] = {
> +	0x0, 0x1, 0x4, 0x7	/* bipolar 10, 5, 0.5, 0.05 */
> +};
> +
>  /* analog input ranges for 6030, etc boards */
>  static const struct comedi_lrange ai_ranges_6030 = {
>  	14, {
> @@ -471,6 +498,11 @@ static const struct comedi_lrange ai_ranges_6030 = {
>  	}
>  };
>  
> +static const uint8_t ai_range_code_6030[14] = {
> +	0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, /* bip 10, 5, 2, 1, 0.5, 0.2, 0.1 */
> +	0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf  /* uni 10, 5, 2, 1, 0.5, 0.2, 0.1 */
> +};
> +
>  /* analog input ranges for 6052, etc boards */
>  static const struct comedi_lrange ai_ranges_6052 = {
>  	15, {
> @@ -492,6 +524,11 @@ static const struct comedi_lrange ai_ranges_6052 = {
>  	}
>  };
>  
> +static const uint8_t ai_range_code_6052[15] = {
> +	0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,	/* bipolar 10 ... 0.05 */
> +	0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf	/* unipolar 10 ... 0.1 */
> +};
> +
>  /* analog input ranges for 4020 board */
>  static const struct comedi_lrange ai_ranges_4020 = {
>  	2, {
> @@ -595,6 +632,7 @@ struct pcidas64_board {
>  	int ai_bits;		/*  analog input resolution */
>  	int ai_speed;		/*  fastest conversion period in ns */
>  	const struct comedi_lrange *ai_range_table;
> +	const uint8_t *ai_range_code;
>  	int ao_nchan;		/*  number of analog out channels */
>  	int ao_bits;		/*  analog output resolution */
>  	int ao_scan_speed;	/*  analog output scan speed */
> @@ -653,6 +691,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
>  		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_code	= ai_range_code_64xx,
>  		.ao_range_table	= &ao_ranges_64xx,
>  		.ao_range_code	= ao_range_code_64xx,
>  		.ai_fifo	= &ai_fifo_64xx,
> @@ -668,6 +707,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
>  		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_code	= ai_range_code_64xx,
>  		.ao_range_table	= &ao_ranges_64xx,
>  		.ao_range_code	= ao_range_code_64xx,
>  		.ai_fifo	= &ai_fifo_64xx,
> @@ -682,7 +722,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_bits	= 16,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ao_range_table	= &ao_ranges_64xx,
>  		.ao_range_code	= ao_range_code_64xx,
>  		.ai_fifo	= &ai_fifo_64xx,
> @@ -697,7 +738,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_bits	= 16,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ao_range_table	= &ao_ranges_64xx,
>  		.ao_range_code	= ao_range_code_64xx,
>  		.ai_fifo	= &ai_fifo_64xx,
> @@ -712,7 +754,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_bits	= 16,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ao_range_table	= &ao_ranges_64xx,
>  		.ao_range_code	= ao_range_code_64xx,
>  		.ai_fifo	= &ai_fifo_64xx,
> @@ -727,6 +770,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_bits	= 16,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_60xx,
> +		.ai_range_code	= ai_range_code_60xx,
>  		.ao_range_table	= &range_bipolar10,
>  		.ao_range_code	= ao_range_code_60xx,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -742,6 +786,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 100000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_60xx,
> +		.ai_range_code	= ai_range_code_60xx,
>  		.ao_range_table	= &range_bipolar10,
>  		.ao_range_code	= ao_range_code_60xx,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -756,6 +801,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 100000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_60xx,
> +		.ai_range_code	= ai_range_code_60xx,
>  		.ao_range_table	= &range_bipolar10,
>  		.ao_range_code	= ao_range_code_60xx,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -771,6 +817,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 100000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_60xx,
> +		.ai_range_code	= ai_range_code_60xx,
>  		.ao_range_table	= &range_bipolar10,
>  		.ao_range_code	= ao_range_code_60xx,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -786,6 +833,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6030,
> +		.ai_range_code	= ai_range_code_6030,
>  		.ao_range_table	= &ao_ranges_6030,
>  		.ao_range_code	= ao_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -801,6 +849,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6030,
> +		.ai_range_code	= ai_range_code_6030,
>  		.ao_range_table	= &ao_ranges_6030,
>  		.ao_range_code	= ao_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -814,6 +863,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 0,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6030,
> +		.ai_range_code	= ai_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
>  		.has_8255	= 0,
>  	},
> @@ -825,6 +875,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 0,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6030,
> +		.ai_range_code	= ai_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
>  		.has_8255	= 0,
>  	},
> @@ -837,6 +888,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 0,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_60xx,
> +		.ai_range_code	= ai_range_code_60xx,
>  		.ai_fifo	= &ai_fifo_60xx,
>  		.has_8255	= 0,
>  	},
> @@ -850,6 +902,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 100000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_60xx,
> +		.ai_range_code	= ai_range_code_60xx,
>  		.ao_range_table	= &range_bipolar10,
>  		.ao_range_code	= ao_range_code_60xx,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -865,6 +918,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 100000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_60xx,
> +		.ai_range_code	= ai_range_code_60xx,
>  		.ao_range_table	= &range_bipolar10,
>  		.ao_range_code	= ao_range_code_60xx,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -880,6 +934,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 1000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6052,
> +		.ai_range_code	= ai_range_code_6052,
>  		.ao_range_table	= &ao_ranges_6030,
>  		.ao_range_code	= ao_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -895,6 +950,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 3333,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6052,
> +		.ai_range_code	= ai_range_code_6052,
>  		.ao_range_table	= &ao_ranges_6030,
>  		.ao_range_code	= ao_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -910,6 +966,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 1000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6052,
> +		.ai_range_code	= ai_range_code_6052,
>  		.ao_range_table	= &ao_ranges_6030,
>  		.ao_range_code	= ao_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -925,6 +982,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 1000,
>  		.layout		= LAYOUT_60XX,
>  		.ai_range_table	= &ai_ranges_6052,
> +		.ai_range_code	= ai_range_code_6052,
>  		.ao_range_table	= &ao_ranges_6030,
>  		.ao_range_code	= ao_range_code_6030,
>  		.ai_fifo	= &ai_fifo_60xx,
> @@ -959,6 +1017,7 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
>  		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_code	= ai_range_code_64xx,
>  		.ai_fifo	= ai_fifo_64xx,
>  		.has_8255	= 1,
>  	},
> @@ -970,7 +1029,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 0,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ai_fifo	= ai_fifo_64xx,
>  		.has_8255	= 1,
>  	},
> @@ -982,7 +1042,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 0,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ai_fifo	= ai_fifo_64xx,
>  		.has_8255	= 1,
>  	},
> @@ -994,7 +1055,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 0,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ai_fifo	= ai_fifo_64xx,
>  		.has_8255	= 1,
>  	},
> @@ -1006,7 +1068,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 2,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ai_fifo	= ai_fifo_64xx,
>  		.has_8255	= 1,
>  	},
> @@ -1018,7 +1081,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 2,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ai_fifo	= ai_fifo_64xx,
>  		.has_8255	= 1,
>  	},
> @@ -1030,7 +1094,8 @@ static const struct pcidas64_board pcidas64_boards[] = {
>  		.ao_nchan	= 2,
>  		.ao_scan_speed	= 10000,
>  		.layout		= LAYOUT_64XX,
> -		.ai_range_table	= &ai_ranges_64xx,
> +		.ai_range_table	= &ai_ranges_64_mx,
> +		.ai_range_code	= ai_range_code_64_mx,
>  		.ai_fifo	= ai_fifo_64xx,
>  		.has_8255	= 1,
>  	},
> @@ -1127,45 +1192,8 @@ static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev,
>  				       unsigned int range_index)
>  {
>  	const struct pcidas64_board *thisboard = comedi_board(dev);
> -	const struct comedi_krange *range =
> -		&thisboard->ai_range_table->range[range_index];
> -	unsigned int bits = 0;
>  
> -	switch (range->max) {
> -	case 10000000:
> -		bits = 0x000;
> -		break;
> -	case 5000000:
> -		bits = 0x100;
> -		break;
> -	case 2000000:
> -	case 2500000:
> -		bits = 0x200;
> -		break;
> -	case 1000000:
> -	case 1250000:
> -		bits = 0x300;
> -		break;
> -	case 500000:
> -		bits = 0x400;
> -		break;
> -	case 200000:
> -	case 250000:
> -		bits = 0x500;
> -		break;
> -	case 100000:
> -		bits = 0x600;
> -		break;
> -	case 50000:
> -		bits = 0x700;
> -		break;
> -	default:
> -		comedi_error(dev, "bug! in ai_range_bits_6xxx");
> -		break;
> -	}
> -	if (range->min == 0)
> -		bits += 0x900;
> -	return bits;
> +	return thisboard->ai_range_code[range_index] << 8;
>  }
>  
>  static unsigned int hw_revision(const struct comedi_device *dev,
> -- 
> 2.1.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stable" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]