#include "../comedidev.h"
#include <linux/ioport.h>
+#include <linux/slab.h>
#define DRIVER_NAME "unioxx5"
#define UNIOXX5_SIZE 0x10
#define ALL_2_OUTPUT 1 /* config all digital channels to output */
/* 'private' structure for each subdevice */
-typedef struct unioxx5_subd_priv {
+struct unioxx5_subd_priv {
int usp_iobase;
unsigned char usp_module_type[12]; /* 12 modules. each can be 70L or 73L */
unsigned char usp_extra_data[12][4]; /* for saving previous written value for analog modules */
unsigned char usp_prev_wr_val[3]; /* previous written value */
unsigned char usp_prev_cn_val[3]; /* previous channel value */
-} unioxx5_subd_priv;
-
-static int unioxx5_attach(struct comedi_device * dev, comedi_devconfig * it);
-static int unioxx5_subdev_write(struct comedi_device * dev, struct comedi_subdevice * subdev,
- comedi_insn * insn, unsigned int * data);
-static int unioxx5_subdev_read(struct comedi_device * dev, struct comedi_subdevice * subdev,
- comedi_insn * insn, unsigned int * data);
-static int unioxx5_insn_config(struct comedi_device * dev, struct comedi_subdevice * subdev,
- comedi_insn * insn, unsigned int * data);
-static int unioxx5_detach(struct comedi_device * dev);
-static int __unioxx5_subdev_init(struct comedi_subdevice * subdev, int subdev_iobase,
- int minor);
-static int __unioxx5_digital_write(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor);
-static int __unioxx5_digital_read(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor);
-//static void __unioxx5_digital_config(unioxx5_subd_priv* usp, int mode);
-static int __unioxx5_analog_write(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor);
-static int __unioxx5_analog_read(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor);
+};
+
+static int unioxx5_attach(struct comedi_device *dev,
+ struct comedi_devconfig *it);
+static int unioxx5_subdev_write(struct comedi_device *dev,
+ struct comedi_subdevice *subdev,
+ struct comedi_insn *insn, unsigned int *data);
+static int unioxx5_subdev_read(struct comedi_device *dev,
+ struct comedi_subdevice *subdev,
+ struct comedi_insn *insn, unsigned int *data);
+static int unioxx5_insn_config(struct comedi_device *dev,
+ struct comedi_subdevice *subdev,
+ struct comedi_insn *insn, unsigned int *data);
+static int unioxx5_detach(struct comedi_device *dev);
+static int __unioxx5_subdev_init(struct comedi_subdevice *subdev,
+ int subdev_iobase, int minor);
+static int __unioxx5_digital_write(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor);
+static int __unioxx5_digital_read(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor);
+/* static void __unioxx5_digital_config(struct unioxx5_subd_priv* usp, int mode); */
+static int __unioxx5_analog_write(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor);
+static int __unioxx5_analog_read(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor);
static int __unioxx5_define_chan_offset(int chan_num);
-static void __unioxx5_analog_config(unioxx5_subd_priv * usp, int channel);
+static void __unioxx5_analog_config(struct unioxx5_subd_priv *usp, int channel);
static struct comedi_driver unioxx5_driver = {
- driver_name:DRIVER_NAME,
- module:THIS_MODULE,
- attach:unioxx5_attach,
- detach:unioxx5_detach
+ .driver_name = DRIVER_NAME,
+ .module = THIS_MODULE,
+ .attach = unioxx5_attach,
+ .detach = unioxx5_detach
};
COMEDI_INITCLEANUP(unioxx5_driver);
-static int unioxx5_attach(struct comedi_device * dev, comedi_devconfig * it)
+static int unioxx5_attach(struct comedi_device *dev,
+ struct comedi_devconfig *it)
{
int iobase, i, n_subd;
int id, num, ba;
/* unioxx5 can has from two to four subdevices */
if (n_subd < 2) {
printk(KERN_ERR
- "your card must has at least 2 'g01' subdevices\n");
+ "your card must has at least 2 'g01' subdevices\n");
return -1;
}
/* initializing each of for same subdevices */
for (i = 0; i < n_subd; i++, iobase += UNIOXX5_SUBDEV_ODDS) {
if (__unioxx5_subdev_init(&dev->subdevices[i], iobase,
- dev->minor) < 0)
+ dev->minor) < 0)
return -1;
}
return 0;
}
-static int unioxx5_subdev_read(struct comedi_device * dev, struct comedi_subdevice * subdev,
- comedi_insn * insn, unsigned int * data)
+static int unioxx5_subdev_read(struct comedi_device *dev,
+ struct comedi_subdevice *subdev,
+ struct comedi_insn *insn, unsigned int *data)
{
- unioxx5_subd_priv *usp = subdev->private;
+ struct unioxx5_subd_priv *usp = subdev->private;
int channel, type;
channel = CR_CHAN(insn->chanspec);
return 1;
}
-static int unioxx5_subdev_write(struct comedi_device * dev, struct comedi_subdevice * subdev,
- comedi_insn * insn, unsigned int * data)
+static int unioxx5_subdev_write(struct comedi_device *dev,
+ struct comedi_subdevice *subdev,
+ struct comedi_insn *insn, unsigned int *data)
{
- unioxx5_subd_priv *usp = subdev->private;
+ struct unioxx5_subd_priv *usp = subdev->private;
int channel, type;
channel = CR_CHAN(insn->chanspec);
}
/* for digital modules only */
-static int unioxx5_insn_config(struct comedi_device * dev, struct comedi_subdevice * subdev,
- comedi_insn * insn, unsigned int * data)
+static int unioxx5_insn_config(struct comedi_device *dev,
+ struct comedi_subdevice *subdev,
+ struct comedi_insn *insn, unsigned int *data)
{
int channel_offset, flags, channel = CR_CHAN(insn->chanspec), type;
- unioxx5_subd_priv *usp = subdev->private;
+ struct unioxx5_subd_priv *usp = subdev->private;
int mask = 1 << (channel & 0x07);
type = usp->usp_module_type[channel / 2];
if (type != MODULE_DIGITAL) {
printk(KERN_ERR
- "comedi%d: channel configuration accessible only for digital modules\n",
- dev->minor);
+ "comedi%d: channel configuration accessible only for digital modules\n",
+ dev->minor);
return -1;
}
- if ((channel_offset = __unioxx5_define_chan_offset(channel)) < 0) {
+ channel_offset = __unioxx5_define_chan_offset(channel);
+ if (channel_offset < 0) {
printk(KERN_ERR
- "comedi%d: undefined channel %d. channel range is 0 .. 23\n",
- dev->minor, channel);
+ "comedi%d: undefined channel %d. channel range is 0 .. 23\n",
+ dev->minor, channel);
return -1;
}
return 0;
}
-static int unioxx5_detach(struct comedi_device * dev)
+static int unioxx5_detach(struct comedi_device *dev)
{
int i;
struct comedi_subdevice *subdev;
- unioxx5_subd_priv *usp;
+ struct unioxx5_subd_priv *usp;
for (i = 0; i < dev->n_subdevices; i++) {
subdev = &dev->subdevices[i];
}
/* initializing subdevice with given address */
-static int __unioxx5_subdev_init(struct comedi_subdevice * subdev, int subdev_iobase,
- int minor)
+static int __unioxx5_subdev_init(struct comedi_subdevice *subdev,
+ int subdev_iobase, int minor)
{
- unioxx5_subd_priv *usp;
+ struct unioxx5_subd_priv *usp;
int i, to, ndef_flag = 0;
if (!request_region(subdev_iobase, UNIOXX5_SIZE, DRIVER_NAME)) {
return -EIO;
}
- if ((usp = (unioxx5_subd_priv *) kzalloc(sizeof(*usp),
- GFP_KERNEL)) == NULL) {
+ usp = kzalloc(sizeof(*usp), GFP_KERNEL);
+
+ if (usp == NULL) {
printk(KERN_ERR "comedi%d: erorr! --> out of memory!\n", minor);
return -1;
}
usp->usp_module_type[i] = inb(subdev_iobase + 6);
printk(" [%d] 0x%02x |", i, usp->usp_module_type[i]);
- comedi_udelay(1);
+ udelay(1);
}
printk("\n");
return 0;
}
-static int __unioxx5_digital_write(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor)
+static int __unioxx5_digital_write(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor)
{
int channel_offset, val;
int mask = 1 << (channel & 0x07);
- if ((channel_offset = __unioxx5_define_chan_offset(channel)) < 0) {
+ channel_offset = __unioxx5_define_chan_offset(channel);
+ if (channel_offset < 0) {
printk(KERN_ERR
- "comedi%d: undefined channel %d. channel range is 0 .. 23\n",
- minor, channel);
+ "comedi%d: undefined channel %d. channel range is 0 .. 23\n",
+ minor, channel);
return 0;
}
}
/* function for digital reading */
-static int __unioxx5_digital_read(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor)
+static int __unioxx5_digital_read(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor)
{
int channel_offset, mask = 1 << (channel & 0x07);
- if ((channel_offset = __unioxx5_define_chan_offset(channel)) < 0) {
+ channel_offset = __unioxx5_define_chan_offset(channel);
+ if (channel_offset < 0) {
printk(KERN_ERR
- "comedi%d: undefined channel %d. channel range is 0 .. 23\n",
- minor, channel);
+ "comedi%d: undefined channel %d. channel range is 0 .. 23\n",
+ minor, channel);
return 0;
}
}
#if 0 /* not used? */
-static void __unioxx5_digital_config(unioxx5_subd_priv * usp, int mode)
+static void __unioxx5_digital_config(struct unioxx5_subd_priv *usp, int mode)
{
int i, mask;
}
#endif
-static int __unioxx5_analog_write(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor)
+static int __unioxx5_analog_write(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor)
{
int module, i;
/* defining if given module can work on output */
if (!(usp->usp_module_type[module] & MODULE_OUTPUT_MASK)) {
printk(KERN_ERR
- "comedi%d: module in position %d with id 0x%0x is for input only!\n",
- minor, module, usp->usp_module_type[module]);
+ "comedi%d: module in position %d with id 0x%0x is for input only!\n",
+ minor, module, usp->usp_module_type[module]);
return 0;
}
/* saving major byte */
usp->usp_extra_data[module][i] = (unsigned char)((*data & 0xFF00) >> 8);
- //while(!((inb(usp->usp_iobase + 0)) & TxBE));
+ /* while(!((inb(usp->usp_iobase + 0)) & TxBE)); */
outb(module + 1, usp->usp_iobase + 5); /* sending module number to card(1 .. 12) */
outb('W', usp->usp_iobase + 6); /* sends (W)rite command to module */
return 1;
}
-static int __unioxx5_analog_read(unioxx5_subd_priv * usp, unsigned int * data,
- int channel, int minor)
+static int __unioxx5_analog_read(struct unioxx5_subd_priv *usp,
+ unsigned int *data, int channel, int minor)
{
int module_no, read_ch;
char control;
/* defining if given module can work on input */
if (usp->usp_module_type[module_no] & MODULE_OUTPUT_MASK) {
printk(KERN_ERR
- "comedi%d: module in position %d with id 0x%02x is for output only",
- minor, module_no, usp->usp_module_type[module_no]);
+ "comedi%d: module in position %d with id 0x%02x is for output only",
+ minor, module_no, usp->usp_module_type[module_no]);
return 0;
}
}
/* configure channels for analog i/o (even to output, odd to input) */
-static void __unioxx5_analog_config(unioxx5_subd_priv * usp, int channel)
+static void __unioxx5_analog_config(struct unioxx5_subd_priv *usp, int channel)
{
int chan_a, chan_b, conf, channel_offset;