staging: comedi: Move pcm do_cmdtest function into a single source file
Many of the comedi source code has functions that were created with cut and paste, this moves the do_cmdtest function into a single file. Signed-off-by: Bill Pemberton <wfp5p@virginia.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
214e7b5c82
commit
0b8f754a62
@@ -6,6 +6,7 @@ obj-$(CONFIG_COMEDI) += comedi_fc.o
|
|||||||
obj-$(CONFIG_COMEDI) += comedi_bond.o
|
obj-$(CONFIG_COMEDI) += comedi_bond.o
|
||||||
obj-$(CONFIG_COMEDI) += comedi_test.o
|
obj-$(CONFIG_COMEDI) += comedi_test.o
|
||||||
obj-$(CONFIG_COMEDI) += comedi_parport.o
|
obj-$(CONFIG_COMEDI) += comedi_parport.o
|
||||||
|
obj-$(CONFIG_COMEDI) += pcm_common.o
|
||||||
|
|
||||||
# Comedi PCI drivers
|
# Comedi PCI drivers
|
||||||
obj-$(CONFIG_COMEDI_PCI_DRIVERS) += 8255.o
|
obj-$(CONFIG_COMEDI_PCI_DRIVERS) += 8255.o
|
||||||
|
111
drivers/staging/comedi/drivers/pcm_common.c
Normal file
111
drivers/staging/comedi/drivers/pcm_common.c
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#include "../comedidev.h"
|
||||||
|
#include "pcm_common.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 'do_cmdtest' function for an 'INTERRUPT' subdevice. This is for
|
||||||
|
* the PCM drivers.
|
||||||
|
*/
|
||||||
|
int comedi_pcm_cmdtest(struct comedi_device *dev,
|
||||||
|
struct comedi_subdevice *s, struct comedi_cmd *cmd)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
unsigned int tmp;
|
||||||
|
|
||||||
|
/* step 1: make sure trigger sources are trivially valid */
|
||||||
|
|
||||||
|
tmp = cmd->start_src;
|
||||||
|
cmd->start_src &= (TRIG_NOW | TRIG_INT);
|
||||||
|
if (!cmd->start_src || tmp != cmd->start_src)
|
||||||
|
err++;
|
||||||
|
|
||||||
|
tmp = cmd->scan_begin_src;
|
||||||
|
cmd->scan_begin_src &= TRIG_EXT;
|
||||||
|
if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
|
||||||
|
err++;
|
||||||
|
|
||||||
|
tmp = cmd->convert_src;
|
||||||
|
cmd->convert_src &= TRIG_NOW;
|
||||||
|
if (!cmd->convert_src || tmp != cmd->convert_src)
|
||||||
|
err++;
|
||||||
|
|
||||||
|
tmp = cmd->scan_end_src;
|
||||||
|
cmd->scan_end_src &= TRIG_COUNT;
|
||||||
|
if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
|
||||||
|
err++;
|
||||||
|
|
||||||
|
tmp = cmd->stop_src;
|
||||||
|
cmd->stop_src &= (TRIG_COUNT | TRIG_NONE);
|
||||||
|
if (!cmd->stop_src || tmp != cmd->stop_src)
|
||||||
|
err++;
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* step 2: make sure trigger sources are unique and mutually compatible */
|
||||||
|
|
||||||
|
/* these tests are true if more than one _src bit is set */
|
||||||
|
if ((cmd->start_src & (cmd->start_src - 1)) != 0)
|
||||||
|
err++;
|
||||||
|
if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0)
|
||||||
|
err++;
|
||||||
|
if ((cmd->convert_src & (cmd->convert_src - 1)) != 0)
|
||||||
|
err++;
|
||||||
|
if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0)
|
||||||
|
err++;
|
||||||
|
if ((cmd->stop_src & (cmd->stop_src - 1)) != 0)
|
||||||
|
err++;
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
/* step 3: make sure arguments are trivially compatible */
|
||||||
|
|
||||||
|
/* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */
|
||||||
|
if (cmd->start_arg != 0) {
|
||||||
|
cmd->start_arg = 0;
|
||||||
|
err++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cmd->scan_begin_src == TRIG_EXT */
|
||||||
|
if (cmd->scan_begin_arg != 0) {
|
||||||
|
cmd->scan_begin_arg = 0;
|
||||||
|
err++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cmd->convert_src == TRIG_NOW */
|
||||||
|
if (cmd->convert_arg != 0) {
|
||||||
|
cmd->convert_arg = 0;
|
||||||
|
err++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cmd->scan_end_src == TRIG_COUNT */
|
||||||
|
if (cmd->scan_end_arg != cmd->chanlist_len) {
|
||||||
|
cmd->scan_end_arg = cmd->chanlist_len;
|
||||||
|
err++;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cmd->stop_src) {
|
||||||
|
case TRIG_COUNT:
|
||||||
|
/* any count allowed */
|
||||||
|
break;
|
||||||
|
case TRIG_NONE:
|
||||||
|
if (cmd->stop_arg != 0) {
|
||||||
|
cmd->stop_arg = 0;
|
||||||
|
err++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
return 3;
|
||||||
|
|
||||||
|
/* step 4: fix up any arguments */
|
||||||
|
|
||||||
|
/* if (err) return 4; */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(comedi_pcm_cmdtest);
|
8
drivers/staging/comedi/drivers/pcm_common.h
Normal file
8
drivers/staging/comedi/drivers/pcm_common.h
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#ifndef _comedi_common_H
|
||||||
|
#define _comedi_common_H
|
||||||
|
|
||||||
|
extern int comedi_pcm_cmdtest(struct comedi_device *dev,
|
||||||
|
struct comedi_subdevice *s,
|
||||||
|
struct comedi_cmd *cmd);
|
||||||
|
|
||||||
|
#endif
|
@@ -75,6 +75,7 @@ Configuration Options:
|
|||||||
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include "../comedidev.h"
|
#include "../comedidev.h"
|
||||||
|
#include "pcm_common.h"
|
||||||
#include <linux/pci.h> /* for PCI devices */
|
#include <linux/pci.h> /* for PCI devices */
|
||||||
|
|
||||||
/* This stuff is all from pcmuio.c -- it refers to the DIO subdevices only */
|
/* This stuff is all from pcmuio.c -- it refers to the DIO subdevices only */
|
||||||
@@ -1073,110 +1074,10 @@ static int pcmmio_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 'do_cmdtest' function for an 'INTERRUPT' subdevice.
|
|
||||||
*/
|
|
||||||
static int
|
static int
|
||||||
pcmmio_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd)
|
pcmmio_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd)
|
||||||
{
|
{
|
||||||
int err = 0;
|
return comedi_pcm_cmdtest(dev, s, cmd);
|
||||||
unsigned int tmp;
|
|
||||||
|
|
||||||
/* step 1: make sure trigger sources are trivially valid */
|
|
||||||
|
|
||||||
tmp = cmd->start_src;
|
|
||||||
cmd->start_src &= (TRIG_NOW | TRIG_INT);
|
|
||||||
if (!cmd->start_src || tmp != cmd->start_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->scan_begin_src;
|
|
||||||
cmd->scan_begin_src &= TRIG_EXT;
|
|
||||||
if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->convert_src;
|
|
||||||
cmd->convert_src &= TRIG_NOW;
|
|
||||||
if (!cmd->convert_src || tmp != cmd->convert_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->scan_end_src;
|
|
||||||
cmd->scan_end_src &= TRIG_COUNT;
|
|
||||||
if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->stop_src;
|
|
||||||
cmd->stop_src &= (TRIG_COUNT | TRIG_NONE);
|
|
||||||
if (!cmd->stop_src || tmp != cmd->stop_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* step 2: make sure trigger sources are unique and mutually compatible */
|
|
||||||
|
|
||||||
/* these tests are true if more than one _src bit is set */
|
|
||||||
if ((cmd->start_src & (cmd->start_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->convert_src & (cmd->convert_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->stop_src & (cmd->stop_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
/* step 3: make sure arguments are trivially compatible */
|
|
||||||
|
|
||||||
/* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */
|
|
||||||
if (cmd->start_arg != 0) {
|
|
||||||
cmd->start_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cmd->scan_begin_src == TRIG_EXT */
|
|
||||||
if (cmd->scan_begin_arg != 0) {
|
|
||||||
cmd->scan_begin_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cmd->convert_src == TRIG_NOW */
|
|
||||||
if (cmd->convert_arg != 0) {
|
|
||||||
cmd->convert_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cmd->scan_end_src == TRIG_COUNT */
|
|
||||||
if (cmd->scan_end_arg != cmd->chanlist_len) {
|
|
||||||
cmd->scan_end_arg = cmd->chanlist_len;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cmd->stop_src) {
|
|
||||||
case TRIG_COUNT:
|
|
||||||
/* any count allowed */
|
|
||||||
break;
|
|
||||||
case TRIG_NONE:
|
|
||||||
if (cmd->stop_arg != 0) {
|
|
||||||
cmd->stop_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return 3;
|
|
||||||
|
|
||||||
/* step 4: fix up any arguments */
|
|
||||||
|
|
||||||
/* if (err) return 4; */
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int adc_wait_ready(unsigned long iobase)
|
static int adc_wait_ready(unsigned long iobase)
|
||||||
|
@@ -77,6 +77,7 @@ Configuration Options:
|
|||||||
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include "../comedidev.h"
|
#include "../comedidev.h"
|
||||||
|
#include "pcm_common.h"
|
||||||
|
|
||||||
#include <linux/pci.h> /* for PCI devices */
|
#include <linux/pci.h> /* for PCI devices */
|
||||||
|
|
||||||
@@ -984,110 +985,10 @@ static int pcmuio_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 'do_cmdtest' function for an 'INTERRUPT' subdevice.
|
|
||||||
*/
|
|
||||||
static int
|
static int
|
||||||
pcmuio_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd)
|
pcmuio_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd)
|
||||||
{
|
{
|
||||||
int err = 0;
|
return comedi_pcm_cmdtest(dev, s, cmd);
|
||||||
unsigned int tmp;
|
|
||||||
|
|
||||||
/* step 1: make sure trigger sources are trivially valid */
|
|
||||||
|
|
||||||
tmp = cmd->start_src;
|
|
||||||
cmd->start_src &= (TRIG_NOW | TRIG_INT);
|
|
||||||
if (!cmd->start_src || tmp != cmd->start_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->scan_begin_src;
|
|
||||||
cmd->scan_begin_src &= TRIG_EXT;
|
|
||||||
if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->convert_src;
|
|
||||||
cmd->convert_src &= TRIG_NOW;
|
|
||||||
if (!cmd->convert_src || tmp != cmd->convert_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->scan_end_src;
|
|
||||||
cmd->scan_end_src &= TRIG_COUNT;
|
|
||||||
if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
tmp = cmd->stop_src;
|
|
||||||
cmd->stop_src &= (TRIG_COUNT | TRIG_NONE);
|
|
||||||
if (!cmd->stop_src || tmp != cmd->stop_src)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* step 2: make sure trigger sources are unique and mutually compatible */
|
|
||||||
|
|
||||||
/* these tests are true if more than one _src bit is set */
|
|
||||||
if ((cmd->start_src & (cmd->start_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->convert_src & (cmd->convert_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
if ((cmd->stop_src & (cmd->stop_src - 1)) != 0)
|
|
||||||
err++;
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return 2;
|
|
||||||
|
|
||||||
/* step 3: make sure arguments are trivially compatible */
|
|
||||||
|
|
||||||
/* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */
|
|
||||||
if (cmd->start_arg != 0) {
|
|
||||||
cmd->start_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cmd->scan_begin_src == TRIG_EXT */
|
|
||||||
if (cmd->scan_begin_arg != 0) {
|
|
||||||
cmd->scan_begin_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cmd->convert_src == TRIG_NOW */
|
|
||||||
if (cmd->convert_arg != 0) {
|
|
||||||
cmd->convert_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cmd->scan_end_src == TRIG_COUNT */
|
|
||||||
if (cmd->scan_end_arg != cmd->chanlist_len) {
|
|
||||||
cmd->scan_end_arg = cmd->chanlist_len;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (cmd->stop_src) {
|
|
||||||
case TRIG_COUNT:
|
|
||||||
/* any count allowed */
|
|
||||||
break;
|
|
||||||
case TRIG_NONE:
|
|
||||||
if (cmd->stop_arg != 0) {
|
|
||||||
cmd->stop_arg = 0;
|
|
||||||
err++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return 3;
|
|
||||||
|
|
||||||
/* step 4: fix up any arguments */
|
|
||||||
|
|
||||||
/* if (err) return 4; */
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user