diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/cb_pcidas64.c')
-rw-r--r-- | drivers/staging/comedi/drivers/cb_pcidas64.c | 154 |
1 files changed, 67 insertions, 87 deletions
diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c index 035c3a176005..fa12614cef2a 100644 --- a/drivers/staging/comedi/drivers/cb_pcidas64.c +++ b/drivers/staging/comedi/drivers/cb_pcidas64.c @@ -80,8 +80,6 @@ TODO: make ao fifo size adjustable like ai fifo */ -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - #include <linux/module.h> #include <linux/pci.h> #include <linux/delay.h> @@ -179,7 +177,7 @@ enum read_write_registers { DAC_FIFO_REG = 0x300, }; -/* devpriv->dio_counter_iobase registers */ +/* dev->mmio registers */ enum dio_counter_registers { DIO_8255_OFFSET = 0x0, DO_REG = 0x20, @@ -636,8 +634,8 @@ static inline unsigned int ai_dma_ring_count(const struct pcidas64_board *board) { if (board->layout == LAYOUT_4020) return MAX_AI_DMA_RING_COUNT; - else - return MIN_AI_DMA_RING_COUNT; + + return MIN_AI_DMA_RING_COUNT; } static const int bytes_in_sample = 2; @@ -1045,9 +1043,9 @@ static inline unsigned short se_diff_bit_6xxx(struct comedi_device *dev, if ((thisboard->layout == LAYOUT_64XX && !use_differential) || (thisboard->layout == LAYOUT_60XX && use_differential)) return ADC_SE_DIFF_BIT; - else - return 0; -}; + + return 0; +} struct ext_clock_info { /* master clock divisor to use for scans with external master clock */ @@ -1064,12 +1062,11 @@ struct pcidas64_private { /* base addresses (ioremapped) */ void __iomem *plx9080_iobase; void __iomem *main_iobase; - void __iomem *dio_counter_iobase; /* local address (used by dma controller) */ uint32_t local0_iobase; uint32_t local1_iobase; /* number of analog input samples remaining */ - volatile unsigned int ai_count; + unsigned int ai_count; /* dma buffers for analog input */ uint16_t *ai_buffer[MAX_AI_DMA_RING_COUNT]; /* physical addresses of ai dma buffers */ @@ -1081,7 +1078,7 @@ struct pcidas64_private { dma_addr_t ai_dma_desc_bus_addr; /* index of the ai dma descriptor/buffer * that is currently being used */ - volatile unsigned int ai_dma_index; + unsigned int ai_dma_index; /* dma buffers for analog output */ uint16_t *ao_buffer[AO_DMA_RING_COUNT]; /* physical addresses of ao dma buffers */ @@ -1089,35 +1086,35 @@ struct pcidas64_private { struct plx_dma_desc *ao_dma_desc; dma_addr_t ao_dma_desc_bus_addr; /* keeps track of buffer where the next ao sample should go */ - volatile unsigned int ao_dma_index; + unsigned int ao_dma_index; /* number of analog output samples remaining */ - volatile unsigned long ao_count; + unsigned long ao_count; /* remember what the analog outputs are set to, to allow readback */ - volatile unsigned int ao_value[2]; + unsigned int ao_value[2]; unsigned int hw_revision; /* stc chip hardware revision number */ /* last bits sent to INTR_ENABLE_REG register */ - volatile unsigned int intr_enable_bits; + unsigned int intr_enable_bits; /* last bits sent to ADC_CONTROL1_REG register */ - volatile uint16_t adc_control1_bits; + uint16_t adc_control1_bits; /* last bits sent to FIFO_SIZE_REG register */ - volatile uint16_t fifo_size_bits; + uint16_t fifo_size_bits; /* last bits sent to HW_CONFIG_REG register */ - volatile uint16_t hw_config_bits; - volatile uint16_t dac_control1_bits; + uint16_t hw_config_bits; + uint16_t dac_control1_bits; /* last bits written to plx9080 control register */ - volatile uint32_t plx_control_bits; + uint32_t plx_control_bits; /* last bits written to plx interrupt control and status register */ - volatile uint32_t plx_intcsr_bits; + uint32_t plx_intcsr_bits; /* index of calibration source readable through ai ch0 */ - volatile int calibration_source; + int calibration_source; /* bits written to i2c calibration/range register */ - volatile uint8_t i2c_cal_range_bits; + uint8_t i2c_cal_range_bits; /* configure digital triggers to trigger on falling edge */ - volatile unsigned int ext_trig_falling; + unsigned int ext_trig_falling; /* states of various devices stored to enable read-back */ unsigned int ad8402_state[2]; unsigned int caldac_state[8]; - volatile short ai_cmd_running; + short ai_cmd_running; unsigned int ai_fifo_segment_length; struct ext_clock_info ext_clock; unsigned short ao_bounce_buffer[DAC_FIFO_SIZE]; @@ -1160,7 +1157,7 @@ static unsigned int ai_range_bits_6xxx(const struct comedi_device *dev, bits = 0x700; break; default: - comedi_error(dev, "bug! in ai_range_bits_6xxx"); + dev_err(dev->class_dev, "bug! in %s\n", __func__); break; } if (range->min == 0) @@ -1180,16 +1177,16 @@ static unsigned int hw_revision(const struct comedi_device *dev, } static void set_dac_range_bits(struct comedi_device *dev, - volatile uint16_t *bits, unsigned int channel, + uint16_t *bits, unsigned int channel, unsigned int range) { const struct pcidas64_board *thisboard = comedi_board(dev); unsigned int code = thisboard->ao_range_code[range]; if (channel > 1) - comedi_error(dev, "bug! bad channel?"); + dev_err(dev->class_dev, "bug! bad channel?\n"); if (code & ~0x3) - comedi_error(dev, "bug! bad range code?"); + dev_err(dev->class_dev, "bug! bad range code?\n"); *bits &= ~(0x3 << (2 * channel)); *bits |= code << (2 * channel); @@ -1531,10 +1528,10 @@ static int alloc_and_init_dma_members(struct comedi_device *dev) static inline void warn_external_queue(struct comedi_device *dev) { - comedi_error(dev, - "AO command and AI external channel queue cannot be used simultaneously."); - comedi_error(dev, - "Use internal AI channel queue (channels must be consecutive and use same range/aref)"); + dev_err(dev->class_dev, + "AO command and AI external channel queue cannot be used simultaneously\n"); + dev_err(dev->class_dev, + "Use internal AI channel queue (channels must be consecutive and use same range/aref)\n"); } /* Their i2c requires a huge delay on setting clock or data high for some reason */ @@ -1648,7 +1645,8 @@ static void i2c_write(struct comedi_device *dev, unsigned int address, /* get acknowledge */ if (i2c_read_ack(dev) != 0) { - comedi_error(dev, "i2c write failed: no acknowledge"); + dev_err(dev->class_dev, "%s failed: no acknowledge\n", + __func__); i2c_stop(dev); return; } @@ -1656,7 +1654,8 @@ static void i2c_write(struct comedi_device *dev, unsigned int address, for (i = 0; i < length; i++) { i2c_write_byte(dev, data[i]); if (i2c_read_ack(dev) != 0) { - comedi_error(dev, "i2c write failed: no acknowledge"); + dev_err(dev->class_dev, "%s failed: no acknowledge\n", + __func__); i2c_stop(dev); return; } @@ -1769,6 +1768,7 @@ static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, * as it is very slow */ if (old_cal_range_bits != devpriv->i2c_cal_range_bits) { uint8_t i2c_data = devpriv->i2c_cal_range_bits; + i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data, sizeof(i2c_data)); } @@ -1796,8 +1796,7 @@ static int ai_rinsn(struct comedi_device *dev, struct comedi_subdevice *s, return ret; if (thisboard->layout == LAYOUT_4020) - data[n] = readl(devpriv->dio_counter_iobase + - ADC_FIFO_REG) & 0xffff; + data[n] = readl(dev->mmio + ADC_FIFO_REG) & 0xffff; else data[n] = readw(devpriv->main_iobase + PIPE1_READ_REG); } @@ -1874,7 +1873,6 @@ static int ai_config_master_clock_4020(struct comedi_device *dev, break; default: return -EINVAL; - break; } data[4] = divisor; @@ -1890,10 +1888,8 @@ static int ai_config_master_clock(struct comedi_device *dev, unsigned int *data) switch (thisboard->layout) { case LAYOUT_4020: return ai_config_master_clock_4020(dev, data); - break; default: return -EINVAL; - break; } return -EINVAL; @@ -1907,16 +1903,12 @@ static int ai_config_insn(struct comedi_device *dev, struct comedi_subdevice *s, switch (id) { case INSN_CONFIG_ALT_SOURCE: return ai_config_calibration_source(dev, data); - break; case INSN_CONFIG_BLOCK_SIZE: return ai_config_block_size(dev, data); - break; case INSN_CONFIG_TIMER_1: return ai_config_master_clock(dev, data); - break; default: return -EINVAL; - break; } return -EINVAL; } @@ -1991,8 +1983,6 @@ static void check_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd) scan_divisor = min_scan_divisor; cmd->scan_begin_arg = scan_divisor * TIMER_BASE; } - - return; } static int cb_pcidas64_ai_check_chanlist(struct comedi_device *dev, @@ -2162,8 +2152,8 @@ static int use_hw_sample_counter(struct comedi_cmd *cmd) if (cmd->stop_src == TRIG_COUNT && cmd->stop_arg <= max_counter_value) return 1; - else - return 0; + + return 0; } static void setup_sample_counters(struct comedi_device *dev, @@ -2224,7 +2214,6 @@ static uint32_t ai_scan_counter_6xxx(struct comedi_device *dev, break; default: return 0; - break; } return count - 3; } @@ -2243,7 +2232,7 @@ static uint32_t ai_convert_counter_4020(struct comedi_device *dev, divisor = devpriv->ext_clock.divisor; break; default: /* should never happen */ - comedi_error(dev, "bug! failed to set ai pacing!"); + dev_err(dev->class_dev, "bug! failed to set ai pacing!\n"); divisor = 1000; break; } @@ -2454,6 +2443,7 @@ static int setup_channel_queue(struct comedi_device *dev, * as it is very slow */ if (old_cal_range_bits != devpriv->i2c_cal_range_bits) { uint8_t i2c_data = devpriv->i2c_cal_range_bits; + i2c_write(dev, RANGE_CAL_I2C_ADDR, &i2c_data, sizeof(i2c_data)); } @@ -2694,7 +2684,7 @@ static void pio_drain_ai_fifo_32(struct comedi_device *dev) } for (i = 0; read_code != write_code && i < max_transfer;) { - fifo_data = readl(devpriv->dio_counter_iobase + ADC_FIFO_REG); + fifo_data = readl(dev->mmio + ADC_FIFO_REG); cfc_write_to_buffer(s, fifo_data & 0xffff); i++; if (i < max_transfer) { @@ -2775,7 +2765,7 @@ static void handle_ai_interrupt(struct comedi_device *dev, /* check for fifo overrun */ if (status & ADC_OVERRUN_BIT) { - comedi_error(dev, "fifo overrun"); + dev_err(dev->class_dev, "fifo overrun\n"); async->events |= COMEDI_CB_EOA | COMEDI_CB_ERROR; } /* spin lock makes sure no one else changes plx dma control reg */ @@ -3138,7 +3128,8 @@ static void set_dac_select_reg(struct comedi_device *dev, first_channel = CR_CHAN(cmd->chanlist[0]); last_channel = CR_CHAN(cmd->chanlist[cmd->chanlist_len - 1]); if (last_channel < first_channel) - comedi_error(dev, "bug! last ao channel < first ao channel"); + dev_err(dev->class_dev, + "bug! last ao channel < first ao channel\n"); bits = (first_channel & 0x7) | (last_channel & 0x7) << 3; @@ -3161,7 +3152,7 @@ static void set_dac_interval_regs(struct comedi_device *dev, divisor = get_ao_divisor(cmd->scan_begin_arg, cmd->flags); if (divisor > max_counter_value) { - comedi_error(dev, "bug! ao divisor too big"); + dev_err(dev->class_dev, "bug! ao divisor too big\n"); divisor = max_counter_value; } writew(divisor & 0xffff, @@ -3381,32 +3372,31 @@ static int ao_cancel(struct comedi_device *dev, struct comedi_subdevice *s) static int dio_callback(int dir, int port, int data, unsigned long arg) { void __iomem *iobase = (void __iomem *)arg; + if (dir) { writeb(data, iobase + port); return 0; - } else { - return readb(iobase + port); } + return readb(iobase + port); } static int dio_callback_4020(int dir, int port, int data, unsigned long arg) { void __iomem *iobase = (void __iomem *)arg; + if (dir) { writew(data, iobase + 2 * port); return 0; - } else { - return readw(iobase + 2 * port); } + return readw(iobase + 2 * port); } static int di_rbits(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - struct pcidas64_private *devpriv = dev->private; unsigned int bits; - bits = readb(devpriv->dio_counter_iobase + DI_REG); + bits = readb(dev->mmio + DI_REG); bits &= 0xf; data[1] = bits; data[0] = 0; @@ -3419,10 +3409,8 @@ static int do_wbits(struct comedi_device *dev, struct comedi_insn *insn, unsigned int *data) { - struct pcidas64_private *devpriv = dev->private; - if (comedi_dio_update_state(s, data)) - writeb(s->state, devpriv->dio_counter_iobase + DO_REG); + writeb(s->state, dev->mmio + DO_REG); data[1] = s->state; @@ -3434,15 +3422,13 @@ static int dio_60xx_config_insn(struct comedi_device *dev, struct comedi_insn *insn, unsigned int *data) { - struct pcidas64_private *devpriv = dev->private; int ret; ret = comedi_dio_insn_config(dev, s, insn, data, 0); if (ret) return ret; - writeb(s->io_bits, - devpriv->dio_counter_iobase + DIO_DIRECTION_60XX_REG); + writeb(s->io_bits, dev->mmio + DIO_DIRECTION_60XX_REG); return insn->n; } @@ -3452,14 +3438,10 @@ static int dio_60xx_wbits(struct comedi_device *dev, struct comedi_insn *insn, unsigned int *data) { - struct pcidas64_private *devpriv = dev->private; - - if (comedi_dio_update_state(s, data)) { - writeb(s->state, - devpriv->dio_counter_iobase + DIO_DATA_60XX_REG); - } + if (comedi_dio_update_state(s, data)) + writeb(s->state, dev->mmio + DIO_DATA_60XX_REG); - data[1] = readb(devpriv->dio_counter_iobase + DIO_DATA_60XX_REG); + data[1] = readb(dev->mmio + DIO_DATA_60XX_REG); return insn->n; } @@ -3496,7 +3478,7 @@ static int caldac_8800_write(struct comedi_device *dev, unsigned int address, static const int caldac_8800_udelay = 1; if (address >= num_caldac_channels) { - comedi_error(dev, "illegal caldac channel"); + dev_err(dev->class_dev, "illegal caldac channel\n"); return -1; } for (bit = 1 << (bitstream_length - 1); bit; bit >>= 1) { @@ -3568,9 +3550,8 @@ static int caldac_i2c_write(struct comedi_device *dev, serial_bytes[0] = GAIN_1_3; break; default: - comedi_error(dev, "invalid caldac channel\n"); + dev_err(dev->class_dev, "invalid caldac channel\n"); return -1; - break; } serial_bytes[1] = NOT_CLEAR_REGISTERS | ((value >> 8) & 0xf); serial_bytes[2] = value & 0xff; @@ -3863,8 +3844,7 @@ static int setup_subdevices(struct comedi_device *dev) ret = subdev_8255_init(dev, s, dio_callback_4020, (unsigned long)dio_8255_iobase); } else { - dio_8255_iobase = - devpriv->dio_counter_iobase + DIO_8255_OFFSET; + dio_8255_iobase = dev->mmio + DIO_8255_OFFSET; ret = subdev_8255_init(dev, s, dio_callback, (unsigned long)dio_8255_iobase); } @@ -3965,10 +3945,9 @@ static int auto_attach(struct comedi_device *dev, devpriv->plx9080_iobase = pci_ioremap_bar(pcidev, 0); devpriv->main_iobase = pci_ioremap_bar(pcidev, 2); - devpriv->dio_counter_iobase = pci_ioremap_bar(pcidev, 3); + dev->mmio = pci_ioremap_bar(pcidev, 3); - if (!devpriv->plx9080_iobase || !devpriv->main_iobase - || !devpriv->dio_counter_iobase) { + if (!devpriv->plx9080_iobase || !devpriv->main_iobase || !dev->mmio) { dev_warn(dev->class_dev, "failed to remap io memory\n"); return -ENOMEM; } @@ -3997,12 +3976,13 @@ static int auto_attach(struct comedi_device *dev, devpriv->hw_revision); init_plx9080(dev); init_stc_registers(dev); - /* get irq */ - if (request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED, - "cb_pcidas64", dev)) { + + retval = request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED, + dev->board_name, dev); + if (retval) { dev_dbg(dev->class_dev, "unable to allocate irq %u\n", pcidev->irq); - return -EINVAL; + return retval; } dev->irq = pcidev->irq; dev_dbg(dev->class_dev, "irq %u\n", dev->irq); @@ -4031,8 +4011,8 @@ static void detach(struct comedi_device *dev) } if (devpriv->main_iobase) iounmap(devpriv->main_iobase); - if (devpriv->dio_counter_iobase) - iounmap(devpriv->dio_counter_iobase); + if (dev->mmio) + iounmap(dev->mmio); /* free pci dma buffers */ for (i = 0; i < ai_dma_ring_count(thisboard); i++) { if (devpriv->ai_buffer[i]) |