diff options
Diffstat (limited to 'drivers/staging/comedi/drivers/ni_mio_common.c')
-rw-r--r-- | drivers/staging/comedi/drivers/ni_mio_common.c | 114 |
1 files changed, 48 insertions, 66 deletions
diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c index 297c95d2e0a3..320b080149b6 100644 --- a/drivers/staging/comedi/drivers/ni_mio_common.c +++ b/drivers/staging/comedi/drivers/ni_mio_common.c @@ -1186,7 +1186,7 @@ static void ni_ao_fifo_load(struct comedi_device *dev, static int ni_ao_fifo_half_empty(struct comedi_device *dev, struct comedi_subdevice *s) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; int n; n = comedi_buf_read_n_available(s); @@ -1209,7 +1209,7 @@ static int ni_ao_fifo_half_empty(struct comedi_device *dev, static int ni_ao_prep_fifo(struct comedi_device *dev, struct comedi_subdevice *s) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; int n; @@ -1296,7 +1296,7 @@ static void ni_ai_fifo_read(struct comedi_device *dev, static void ni_handle_fifo_half_full(struct comedi_device *dev) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct comedi_subdevice *s = dev->read_subdev; int n; @@ -1881,7 +1881,7 @@ static void ni_m_series_load_channelgain_list(struct comedi_device *dev, unsigned int n_chan, unsigned int *list) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; unsigned int chan, range, aref; unsigned int i; @@ -1988,7 +1988,7 @@ static void ni_load_channelgain_list(struct comedi_device *dev, struct comedi_subdevice *s, unsigned int n_chan, unsigned int *list) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; unsigned int offset = (s->maxdata + 1) >> 1; unsigned int chan, range, aref; @@ -2108,7 +2108,7 @@ static int ni_ai_insn_read(struct comedi_device *dev, unsigned int mask = (s->maxdata + 1) >> 1; int i, n; unsigned signbits; - unsigned short d; + unsigned int d; unsigned long dl; ni_load_channelgain_list(dev, s, 1, &insn->chanspec); @@ -2206,15 +2206,15 @@ static int ni_ns_to_timer(const struct comedi_device *dev, unsigned nanosec, struct ni_private *devpriv = dev->private; int divider; - switch (flags & TRIG_ROUND_MASK) { - case TRIG_ROUND_NEAREST: + switch (flags & CMDF_ROUND_MASK) { + case CMDF_ROUND_NEAREST: default: divider = (nanosec + devpriv->clock_ns / 2) / devpriv->clock_ns; break; - case TRIG_ROUND_DOWN: + case CMDF_ROUND_DOWN: divider = (nanosec) / devpriv->clock_ns; break; - case TRIG_ROUND_UP: + case CMDF_ROUND_UP: divider = (nanosec + devpriv->clock_ns - 1) / devpriv->clock_ns; break; } @@ -2231,7 +2231,7 @@ static unsigned ni_timer_to_ns(const struct comedi_device *dev, int timer) static unsigned ni_min_ai_scan_period_ns(struct comedi_device *dev, unsigned num_channels) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; /* simultaneously-sampled inputs */ @@ -2245,7 +2245,7 @@ static unsigned ni_min_ai_scan_period_ns(struct comedi_device *dev, static int ni_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; int err = 0; unsigned int tmp; @@ -2541,7 +2541,7 @@ static int ni_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) /* load SI */ timer = ni_ns_to_timer(dev, cmd->scan_begin_arg, - TRIG_ROUND_NEAREST); + CMDF_ROUND_NEAREST); ni_stc_writel(dev, timer, AI_SI_Load_A_Registers); ni_stc_writew(dev, AI_SI_Load, AI_Command_1_Register); break; @@ -2569,7 +2569,7 @@ static int ni_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) timer = 1; else timer = ni_ns_to_timer(dev, cmd->convert_arg, - TRIG_ROUND_NEAREST); + CMDF_ROUND_NEAREST); /* 0,0 does not work */ ni_stc_writew(dev, 1, AI_SI2_Load_A_Register); ni_stc_writew(dev, timer, AI_SI2_Load_B_Register); @@ -2610,7 +2610,7 @@ static int ni_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) interrupt_a_enable |= AI_FIFO_Interrupt_Enable; #endif - if (cmd->flags & TRIG_WAKE_EOS + if (cmd->flags & CMDF_WAKE_EOS || (devpriv->ai_cmd2 & AI_End_On_End_Of_Scan)) { /* wake on end-of-scan */ devpriv->aimode = AIMODE_SCAN; @@ -2732,9 +2732,6 @@ static int ni_ai_insn_config(struct comedi_device *dev, calib_source = data[1] & 0xf; - if (calib_source > 0xF) - return -EINVAL; - devpriv->ai_calib_source = calib_source; ni_writew(dev, calib_source, Calibration_Channel_6143); } else { @@ -2921,21 +2918,6 @@ static int ni_ao_config_chanlist(struct comedi_device *dev, return ni_old_ao_config_chanlist(dev, s, chanspec, n_chans); } -static int ni_ao_insn_read(struct comedi_device *dev, - struct comedi_subdevice *s, - struct comedi_insn *insn, - unsigned int *data) -{ - struct ni_private *devpriv = dev->private; - unsigned int chan = CR_CHAN(insn->chanspec); - int i; - - for (i = 0; i < insn->n; i++) - data[i] = devpriv->ao[chan]; - - return insn->n; -} - static int ni_ao_insn_write(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, @@ -2962,7 +2944,7 @@ static int ni_ao_insn_write(struct comedi_device *dev, for (i = 0; i < insn->n; i++) { unsigned int val = data[i]; - devpriv->ao[chan] = val; + s->readback[chan] = val; if (devpriv->is_6xxx) { /* @@ -2997,7 +2979,7 @@ static int ni_ao_insn_config(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; switch (data[0]) { @@ -3098,7 +3080,7 @@ static int ni_ao_inttrig(struct comedi_device *dev, static int ni_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; const struct comedi_cmd *cmd = &s->async->cmd; int bits; @@ -3208,7 +3190,7 @@ static int ni_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s) devpriv->ao_cmd2 &= ~AO_BC_Gate_Enable; trigvar = ni_ns_to_timer(dev, cmd->scan_begin_arg, - TRIG_ROUND_NEAREST); + CMDF_ROUND_NEAREST); ni_stc_writel(dev, 1, AO_UI_Load_A_Register); ni_stc_writew(dev, AO_UI_Load, AO_Command_1_Register); ni_stc_writel(dev, trigvar, AO_UI_Load_A_Register); @@ -3299,7 +3281,7 @@ static int ni_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s) static int ni_ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; int err = 0; unsigned int tmp; @@ -3552,12 +3534,10 @@ static int ni_cdio_cmdtest(struct comedi_device *dev, if (err) return 3; - /* step 4: fix up any arguments */ - - if (err) - return 4; + /* Step 4: fix up any arguments */ /* Step 5: check channel list if it exists */ + if (cmd->chanlist && cmd->chanlist_len > 0) err |= ni_cdio_check_chanlist(dev, s, cmd); @@ -4176,16 +4156,15 @@ static int ni_freq_out_insn_config(struct comedi_device *dev, return insn->n; } -static int ni_8255_callback(int dir, int port, int data, unsigned long arg) +static int ni_8255_callback(struct comedi_device *dev, + int dir, int port, int data, unsigned long iobase) { - struct comedi_device *dev = (struct comedi_device *)arg; - if (dir) { - ni_writeb(dev, data, Port_A + 2 * port); + ni_writeb(dev, data, iobase + 2 * port); return 0; } - return ni_readb(dev, Port_A + 2 * port); + return ni_readb(dev, iobase + 2 * port); } static int ni_get_pwm_config(struct comedi_device *dev, unsigned int *data) @@ -4208,15 +4187,15 @@ static int ni_m_series_pwm_config(struct comedi_device *dev, switch (data[0]) { case INSN_CONFIG_PWM_OUTPUT: switch (data[1]) { - case TRIG_ROUND_NEAREST: + case CMDF_ROUND_NEAREST: up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns; break; - case TRIG_ROUND_DOWN: + case CMDF_ROUND_DOWN: up_count = data[2] / devpriv->clock_ns; break; - case TRIG_ROUND_UP: + case CMDF_ROUND_UP: up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns; @@ -4225,15 +4204,15 @@ static int ni_m_series_pwm_config(struct comedi_device *dev, return -EINVAL; } switch (data[3]) { - case TRIG_ROUND_NEAREST: + case CMDF_ROUND_NEAREST: down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns; break; - case TRIG_ROUND_DOWN: + case CMDF_ROUND_DOWN: down_count = data[4] / devpriv->clock_ns; break; - case TRIG_ROUND_UP: + case CMDF_ROUND_UP: down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns; @@ -4272,15 +4251,15 @@ static int ni_6143_pwm_config(struct comedi_device *dev, switch (data[0]) { case INSN_CONFIG_PWM_OUTPUT: switch (data[1]) { - case TRIG_ROUND_NEAREST: + case CMDF_ROUND_NEAREST: up_count = (data[2] + devpriv->clock_ns / 2) / devpriv->clock_ns; break; - case TRIG_ROUND_DOWN: + case CMDF_ROUND_DOWN: up_count = data[2] / devpriv->clock_ns; break; - case TRIG_ROUND_UP: + case CMDF_ROUND_UP: up_count = (data[2] + devpriv->clock_ns - 1) / devpriv->clock_ns; @@ -4289,15 +4268,15 @@ static int ni_6143_pwm_config(struct comedi_device *dev, return -EINVAL; } switch (data[3]) { - case TRIG_ROUND_NEAREST: + case CMDF_ROUND_NEAREST: down_count = (data[4] + devpriv->clock_ns / 2) / devpriv->clock_ns; break; - case TRIG_ROUND_DOWN: + case CMDF_ROUND_DOWN: down_count = data[4] / devpriv->clock_ns; break; - case TRIG_ROUND_UP: + case CMDF_ROUND_UP: down_count = (data[4] + devpriv->clock_ns - 1) / devpriv->clock_ns; @@ -4390,7 +4369,7 @@ static struct caldac_struct caldacs[] = { static void ni_write_caldac(struct comedi_device *dev, int addr, int val) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; unsigned int loadbit = 0, bits = 0, bit, bitstring = 0; int i; @@ -4448,7 +4427,7 @@ static int ni_calib_insn_read(struct comedi_device *dev, static void caldac_setup(struct comedi_device *dev, struct comedi_subdevice *s) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; int i, j; int n_dacs; @@ -5418,7 +5397,7 @@ static int ni_alloc_private(struct comedi_device *dev) static int ni_E_init(struct comedi_device *dev, unsigned interrupt_pin, unsigned irq_polarity) { - const struct ni_board_struct *board = comedi_board(dev); + const struct ni_board_struct *board = dev->board_ptr; struct ni_private *devpriv = dev->private; struct comedi_subdevice *s; int ret; @@ -5491,9 +5470,13 @@ static int ni_E_init(struct comedi_device *dev, s->n_chan = board->n_aochan; s->maxdata = board->ao_maxdata; s->range_table = board->ao_range_table; - s->insn_read = ni_ao_insn_read; - s->insn_write = ni_ao_insn_write; s->insn_config = ni_ao_insn_config; + s->insn_write = ni_ao_insn_write; + s->insn_read = comedi_readback_insn_read; + + ret = comedi_alloc_subdev_readback(s); + if (ret) + return ret; /* * Along with the IRQ we need either a FIFO or DMA for @@ -5560,8 +5543,7 @@ static int ni_E_init(struct comedi_device *dev, /* 8255 device */ s = &dev->subdevices[NI_8255_DIO_SUBDEV]; if (board->has_8255) { - ret = subdev_8255_init(dev, s, ni_8255_callback, - (unsigned long)dev); + ret = subdev_8255_init(dev, s, ni_8255_callback, Port_A); if (ret) return ret; } else { |