|
@@ -487,8 +487,6 @@ static const int dma_buffer_size = 0xff00;
|
|
|
/* 2 bytes per sample */
|
|
|
static const int sample_size = 2;
|
|
|
|
|
|
-#define devpriv ((struct labpc_private *)dev->private)
|
|
|
-
|
|
|
static inline int labpc_counter_load(struct comedi_device *dev,
|
|
|
unsigned long base_address,
|
|
|
unsigned int counter_number,
|
|
@@ -504,6 +502,7 @@ static inline int labpc_counter_load(struct comedi_device *dev,
|
|
|
int labpc_common_attach(struct comedi_device *dev, unsigned long iobase,
|
|
|
unsigned int irq, unsigned int dma_chan)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
struct comedi_subdevice *s;
|
|
|
int i;
|
|
|
unsigned long isr_flags;
|
|
@@ -700,15 +699,19 @@ labpc_pci_find_boardinfo(struct pci_dev *pcidev)
|
|
|
static int __devinit labpc_attach_pci(struct comedi_device *dev,
|
|
|
struct pci_dev *pcidev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv;
|
|
|
unsigned long iobase;
|
|
|
unsigned int irq;
|
|
|
int ret;
|
|
|
|
|
|
if (!IS_ENABLED(CONFIG_COMEDI_PCI_DRIVERS))
|
|
|
return -ENODEV;
|
|
|
- ret = alloc_private(dev, sizeof(struct labpc_private));
|
|
|
- if (ret < 0)
|
|
|
+
|
|
|
+ ret = alloc_private(dev, sizeof(*devpriv));
|
|
|
+ if (ret)
|
|
|
return ret;
|
|
|
+ devpriv = dev->private;
|
|
|
+
|
|
|
dev->board_ptr = labpc_pci_find_boardinfo(pcidev);
|
|
|
if (!dev->board_ptr)
|
|
|
return -ENODEV;
|
|
@@ -725,13 +728,16 @@ static int __devinit labpc_attach_pci(struct comedi_device *dev,
|
|
|
|
|
|
static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv;
|
|
|
unsigned long iobase = 0;
|
|
|
unsigned int irq = 0;
|
|
|
unsigned int dma_chan = 0;
|
|
|
+ int ret;
|
|
|
|
|
|
- /* allocate and initialize dev->private */
|
|
|
- if (alloc_private(dev, sizeof(struct labpc_private)) < 0)
|
|
|
- return -ENOMEM;
|
|
|
+ ret = alloc_private(dev, sizeof(*devpriv));
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ devpriv = dev->private;
|
|
|
|
|
|
/* get base address, irq etc. based on bustype */
|
|
|
switch (thisboard->bustype) {
|
|
@@ -770,6 +776,7 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|
|
|
|
|
void labpc_common_detach(struct comedi_device *dev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
struct comedi_subdevice *s;
|
|
|
|
|
|
if (dev->subdevices) {
|
|
@@ -797,6 +804,8 @@ EXPORT_SYMBOL_GPL(labpc_common_detach);
|
|
|
|
|
|
static void labpc_clear_adc_fifo(const struct comedi_device *dev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
+
|
|
|
devpriv->write_byte(0x1, dev->iobase + ADC_CLEAR_REG);
|
|
|
devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
|
|
|
devpriv->read_byte(dev->iobase + ADC_FIFO_REG);
|
|
@@ -804,6 +813,7 @@ static void labpc_clear_adc_fifo(const struct comedi_device *dev)
|
|
|
|
|
|
static int labpc_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
unsigned long flags;
|
|
|
|
|
|
spin_lock_irqsave(&dev->spinlock, flags);
|
|
@@ -1096,6 +1106,7 @@ static int labpc_ai_cmdtest(struct comedi_device *dev,
|
|
|
|
|
|
static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
int channel, range, aref;
|
|
|
#ifdef CONFIG_ISA_DMA_API
|
|
|
unsigned long irq_flags;
|
|
@@ -1363,6 +1374,7 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
|
|
|
static irqreturn_t labpc_interrupt(int irq, void *d)
|
|
|
{
|
|
|
struct comedi_device *dev = d;
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
struct comedi_subdevice *s = dev->read_subdev;
|
|
|
struct comedi_async *async;
|
|
|
struct comedi_cmd *cmd;
|
|
@@ -1451,6 +1463,7 @@ static irqreturn_t labpc_interrupt(int irq, void *d)
|
|
|
/* read all available samples from ai fifo */
|
|
|
static int labpc_drain_fifo(struct comedi_device *dev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
unsigned int lsb, msb;
|
|
|
short data;
|
|
|
struct comedi_async *async = dev->read_subdev->async;
|
|
@@ -1486,6 +1499,7 @@ static int labpc_drain_fifo(struct comedi_device *dev)
|
|
|
#ifdef CONFIG_ISA_DMA_API
|
|
|
static void labpc_drain_dma(struct comedi_device *dev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
struct comedi_subdevice *s = dev->read_subdev;
|
|
|
struct comedi_async *async = s->async;
|
|
|
int status;
|
|
@@ -1539,6 +1553,8 @@ static void labpc_drain_dma(struct comedi_device *dev)
|
|
|
|
|
|
static void handle_isa_dma(struct comedi_device *dev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
+
|
|
|
labpc_drain_dma(dev);
|
|
|
|
|
|
enable_dma(devpriv->dma_chan);
|
|
@@ -1553,6 +1569,8 @@ static void handle_isa_dma(struct comedi_device *dev)
|
|
|
static void labpc_drain_dregs(struct comedi_device *dev)
|
|
|
{
|
|
|
#ifdef CONFIG_ISA_DMA_API
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
+
|
|
|
if (devpriv->current_transfer == isa_dma_transfer)
|
|
|
labpc_drain_dma(dev);
|
|
|
#endif
|
|
@@ -1563,6 +1581,7 @@ static void labpc_drain_dregs(struct comedi_device *dev)
|
|
|
static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
|
|
|
struct comedi_insn *insn, unsigned int *data)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
int i, n;
|
|
|
int chan, range;
|
|
|
int lsb, msb;
|
|
@@ -1652,6 +1671,7 @@ static int labpc_ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
|
|
|
static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
|
|
|
struct comedi_insn *insn, unsigned int *data)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
int channel, range;
|
|
|
unsigned long flags;
|
|
|
int lsb, msb;
|
|
@@ -1693,6 +1713,8 @@ static int labpc_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
|
|
|
static int labpc_ao_rinsn(struct comedi_device *dev, struct comedi_subdevice *s,
|
|
|
struct comedi_insn *insn, unsigned int *data)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
+
|
|
|
data[0] = devpriv->ao_value[CR_CHAN(insn->chanspec)];
|
|
|
|
|
|
return 1;
|
|
@@ -1702,6 +1724,8 @@ static int labpc_calib_read_insn(struct comedi_device *dev,
|
|
|
struct comedi_subdevice *s,
|
|
|
struct comedi_insn *insn, unsigned int *data)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
+
|
|
|
data[0] = devpriv->caldac[CR_CHAN(insn->chanspec)];
|
|
|
|
|
|
return 1;
|
|
@@ -1721,6 +1745,8 @@ static int labpc_eeprom_read_insn(struct comedi_device *dev,
|
|
|
struct comedi_subdevice *s,
|
|
|
struct comedi_insn *insn, unsigned int *data)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
+
|
|
|
data[0] = devpriv->eeprom_data[CR_CHAN(insn->chanspec)];
|
|
|
|
|
|
return 1;
|
|
@@ -1777,6 +1803,7 @@ static unsigned int labpc_suggest_transfer_size(const struct comedi_cmd *cmd)
|
|
|
static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd,
|
|
|
enum scan_mode mode)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
/* max value for 16 bit counter in mode 2 */
|
|
|
const int max_counter_value = 0x10000;
|
|
|
/* min value for 16 bit counter in mode 2 */
|
|
@@ -1883,6 +1910,7 @@ static int labpc_dio_mem_callback(int dir, int port, int data,
|
|
|
static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
|
|
|
unsigned int value_width)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
int i;
|
|
|
|
|
|
for (i = 1; i <= value_width; i++) {
|
|
@@ -1907,6 +1935,7 @@ static void labpc_serial_out(struct comedi_device *dev, unsigned int value,
|
|
|
/* lowlevel read from eeprom */
|
|
|
static unsigned int labpc_serial_in(struct comedi_device *dev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
unsigned int value = 0;
|
|
|
int i;
|
|
|
const int value_width = 8; /* number of bits wide values are */
|
|
@@ -1936,6 +1965,7 @@ static unsigned int labpc_serial_in(struct comedi_device *dev)
|
|
|
static unsigned int labpc_eeprom_read(struct comedi_device *dev,
|
|
|
unsigned int address)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
unsigned int value;
|
|
|
/* bits to tell eeprom to expect a read */
|
|
|
const int read_instruction = 0x3;
|
|
@@ -1968,6 +1998,7 @@ static unsigned int labpc_eeprom_read(struct comedi_device *dev,
|
|
|
static int labpc_eeprom_write(struct comedi_device *dev,
|
|
|
unsigned int address, unsigned int value)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
const int write_enable_instruction = 0x6;
|
|
|
const int write_instruction = 0x2;
|
|
|
const int write_length = 8; /* 8 bit write lengths to eeprom */
|
|
@@ -2025,6 +2056,7 @@ static int labpc_eeprom_write(struct comedi_device *dev,
|
|
|
|
|
|
static unsigned int labpc_eeprom_read_status(struct comedi_device *dev)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
unsigned int value;
|
|
|
const int read_status_instruction = 0x5;
|
|
|
const int write_length = 8; /* 8 bit write lengths to eeprom */
|
|
@@ -2054,6 +2086,8 @@ static unsigned int labpc_eeprom_read_status(struct comedi_device *dev)
|
|
|
static void write_caldac(struct comedi_device *dev, unsigned int channel,
|
|
|
unsigned int value)
|
|
|
{
|
|
|
+ struct labpc_private *devpriv = dev->private;
|
|
|
+
|
|
|
if (value == devpriv->caldac[channel])
|
|
|
return;
|
|
|
devpriv->caldac[channel] = value;
|