0f3ce1a600
If a DIO subdevice has more than 32 channels, its 'insn_bits' handler is supposed to take account of the base channel from `CR_CHAN(insn->chanspec)`. (The comedi core will adjust the base channel to 0 and shift the mask and data to compensate if the subdevice has less than or equal to 32 channels.) The "comedi_bond" driver currently ignores the base channel and assumes it is 0. Replace `comedi_dio_bitfield()` in the "kcomedilib" module with `comedi_dio_bitfield2()` that takes account of the base channel, and rewrite the "comedi_bond" driver's 'insn_bits' handler (`bonding_dio_insn_bits()`) to take account of the base channel and use the new function. No other modules use `comedi_dio_bitfield()` so it is safe to replace it with `comedi_dio_bitfield2()`. The name follows that of the equivalent function in the user-space comedilib. If the base channel is non-zero and the subdevice has less than or equal to 32 channels it needs to adjust things in the same way as the comedi core (same as `parse_insn()` in "comedi_fops.c") due to most drivers ignoring the base channel. Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
36 lines
1.4 KiB
C
36 lines
1.4 KiB
C
/*
|
|
linux/include/comedilib.h
|
|
header file for kcomedilib
|
|
|
|
COMEDI - Linux Control and Measurement Device Interface
|
|
Copyright (C) 1998-2001 David A. Schleef <ds@schleef.org>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
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.
|
|
*/
|
|
|
|
#ifndef _LINUX_COMEDILIB_H
|
|
#define _LINUX_COMEDILIB_H
|
|
|
|
struct comedi_device *comedi_open(const char *path);
|
|
int comedi_close(struct comedi_device *dev);
|
|
int comedi_dio_get_config(struct comedi_device *dev, unsigned int subdev,
|
|
unsigned int chan, unsigned int *io);
|
|
int comedi_dio_config(struct comedi_device *dev, unsigned int subdev,
|
|
unsigned int chan, unsigned int io);
|
|
int comedi_dio_bitfield2(struct comedi_device *dev, unsigned int subdev,
|
|
unsigned int mask, unsigned int *bits,
|
|
unsigned int base_channel);
|
|
int comedi_find_subdevice_by_type(struct comedi_device *dev, int type,
|
|
unsigned int subd);
|
|
int comedi_get_n_channels(struct comedi_device *dev, unsigned int subdevice);
|
|
|
|
#endif
|