diff options
Diffstat (limited to 'drivers/staging/comedi/range.c')
| -rw-r--r-- | drivers/staging/comedi/range.c | 96 | 
1 files changed, 48 insertions, 48 deletions
diff --git a/drivers/staging/comedi/range.c b/drivers/staging/comedi/range.c index 148ec6fd6fd..b6849545b81 100644 --- a/drivers/staging/comedi/range.c +++ b/drivers/staging/comedi/range.c @@ -14,29 +14,32 @@      but WITHOUT ANY WARRANTY; without even the implied warranty of      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the      GNU General Public License for more details. - -    You should have received a copy of the GNU General Public License -    along with this program; if not, write to the Free Software -    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -  */  #include <linux/uaccess.h>  #include "comedidev.h" -#include "internal.h" +#include "comedi_internal.h"  const struct comedi_lrange range_bipolar10 = { 1, {BIP_RANGE(10)} }; -EXPORT_SYMBOL(range_bipolar10); +EXPORT_SYMBOL_GPL(range_bipolar10);  const struct comedi_lrange range_bipolar5 = { 1, {BIP_RANGE(5)} }; -EXPORT_SYMBOL(range_bipolar5); +EXPORT_SYMBOL_GPL(range_bipolar5);  const struct comedi_lrange range_bipolar2_5 = { 1, {BIP_RANGE(2.5)} }; -EXPORT_SYMBOL(range_bipolar2_5); +EXPORT_SYMBOL_GPL(range_bipolar2_5);  const struct comedi_lrange range_unipolar10 = { 1, {UNI_RANGE(10)} }; -EXPORT_SYMBOL(range_unipolar10); +EXPORT_SYMBOL_GPL(range_unipolar10);  const struct comedi_lrange range_unipolar5 = { 1, {UNI_RANGE(5)} }; -EXPORT_SYMBOL(range_unipolar5); +EXPORT_SYMBOL_GPL(range_unipolar5); +const struct comedi_lrange range_unipolar2_5 = { 1, {UNI_RANGE(2.5)} }; +EXPORT_SYMBOL_GPL(range_unipolar2_5); +const struct comedi_lrange range_0_20mA = { 1, {RANGE_mA(0, 20)} }; +EXPORT_SYMBOL_GPL(range_0_20mA); +const struct comedi_lrange range_4_20mA = { 1, {RANGE_mA(4, 20)} }; +EXPORT_SYMBOL_GPL(range_4_20mA); +const struct comedi_lrange range_0_32mA = { 1, {RANGE_mA(0, 32)} }; +EXPORT_SYMBOL_GPL(range_0_32mA);  const struct comedi_lrange range_unknown = { 1, {{0, 1000000, UNIT_none} } }; -EXPORT_SYMBOL(range_unknown); +EXPORT_SYMBOL_GPL(range_unknown);  /*  	COMEDI_RANGEINFO @@ -68,7 +71,7 @@ int do_rangeinfo_ioctl(struct comedi_device *dev,  		return -EINVAL;  	if (subd >= dev->n_subdevices)  		return -EINVAL; -	s = dev->subdevices + subd; +	s = &dev->subdevices[subd];  	if (s->range_table) {  		lr = s->range_table;  	} else if (s->range_table_list) { @@ -80,8 +83,10 @@ int do_rangeinfo_ioctl(struct comedi_device *dev,  	}  	if (RANGE_LENGTH(it.range_type) != lr->length) { -		DPRINTK("wrong length %d should be %d (0x%08x)\n", -			RANGE_LENGTH(it.range_type), lr->length, it.range_type); +		dev_dbg(dev->class_dev, +			"wrong length %d should be %d (0x%08x)\n", +			RANGE_LENGTH(it.range_type), +			lr->length, it.range_type);  		return -EINVAL;  	} @@ -120,47 +125,42 @@ static int aref_invalid(struct comedi_subdevice *s, unsigned int chanspec)  	default:  		break;  	} -	DPRINTK("subdevice does not support aref %i", aref); +	dev_dbg(s->device->class_dev, "subdevice does not support aref %i", +		aref);  	return 1;  } -/* -   This function checks each element in a channel/gain list to make -   make sure it is valid. +/** + * comedi_check_chanlist() - Validate each element in a chanlist. + * @s: comedi_subdevice struct + * @n: number of elements in the chanlist + * @chanlist: the chanlist to validate  */  int comedi_check_chanlist(struct comedi_subdevice *s, int n,  			  unsigned int *chanlist)  { -	int i; -	int chan; - -	if (s->range_table) { -		for (i = 0; i < n; i++) -			if (CR_CHAN(chanlist[i]) >= s->n_chan || -			    CR_RANGE(chanlist[i]) >= s->range_table->length -			    || aref_invalid(s, chanlist[i])) { -				printk(KERN_ERR "bad chanlist[%d]=0x%08x " -				       "in_chan=%d range length=%d\n", i, -				       chanlist[i], s->n_chan, -				       s->range_table->length); -				return -EINVAL; -			} -	} else if (s->range_table_list) { -		for (i = 0; i < n; i++) { -			chan = CR_CHAN(chanlist[i]); -			if (chan >= s->n_chan || -			    CR_RANGE(chanlist[i]) >= -			    s->range_table_list[chan]->length -			    || aref_invalid(s, chanlist[i])) { -				printk(KERN_ERR "bad chanlist[%d]=0x%08x\n", -				       i, chanlist[i]); -				return -EINVAL; -			} +	struct comedi_device *dev = s->device; +	unsigned int chanspec; +	int chan, range_len, i; + +	for (i = 0; i < n; i++) { +		chanspec = chanlist[i]; +		chan = CR_CHAN(chanspec); +		if (s->range_table) +			range_len = s->range_table->length; +		else if (s->range_table_list && chan < s->n_chan) +			range_len = s->range_table_list[chan]->length; +		else +			range_len = 0; +		if (chan >= s->n_chan || +		    CR_RANGE(chanspec) >= range_len || +		    aref_invalid(s, chanspec)) { +			dev_warn(dev->class_dev, +				 "bad chanlist[%d]=0x%08x chan=%d range length=%d\n", +				 i, chanspec, chan, range_len); +			return -EINVAL;  		} -	} else { -		printk(KERN_ERR "comedi: (bug) no range type list!\n"); -		return -EINVAL;  	}  	return 0;  } -EXPORT_SYMBOL(comedi_check_chanlist); +EXPORT_SYMBOL_GPL(comedi_check_chanlist);  | 
