diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig index b90b8a88273d..fbff2fa31778 100644 --- a/drivers/staging/comedi/Kconfig +++ b/drivers/staging/comedi/Kconfig @@ -329,6 +329,7 @@ config COMEDI_DAS1800 config COMEDI_DAS6402 tristate "DAS6402 and compatible ISA card support" + select COMEDI_8254 ---help--- Enable support for DAS6402 and compatible ISA cards Computerboards, Keithley Metrabyte DAS6402 and compatibles diff --git a/drivers/staging/comedi/drivers/das6402.c b/drivers/staging/comedi/drivers/das6402.c index b8755b50a11e..3aa6b13894bf 100644 --- a/drivers/staging/comedi/drivers/das6402.c +++ b/drivers/staging/comedi/drivers/das6402.c @@ -35,8 +35,9 @@ #include #include "../comedidev.h" + #include "comedi_fc.h" -#include "8253.h" +#include "comedi_8254.h" /* * Register I/O map @@ -138,11 +139,6 @@ static struct das6402_boardinfo das6402_boards[] = { struct das6402_private { unsigned int irq; - - unsigned int count; - unsigned int divider1; - unsigned int divider2; - unsigned int ao_range; }; @@ -172,27 +168,6 @@ static void das6402_ai_clear_eoc(struct comedi_device *dev) outb(DAS6402_STATUS_W_CLRINT, dev->iobase + DAS6402_STATUS_REG); } -static void das6402_enable_counter(struct comedi_device *dev, bool load) -{ - struct das6402_private *devpriv = dev->private; - unsigned long timer_iobase = dev->iobase + DAS6402_TIMER_BASE; - - if (load) { - i8254_set_mode(timer_iobase, 0, 0, I8254_MODE0 | I8254_BINARY); - i8254_set_mode(timer_iobase, 0, 1, I8254_MODE2 | I8254_BINARY); - i8254_set_mode(timer_iobase, 0, 2, I8254_MODE2 | I8254_BINARY); - - i8254_write(timer_iobase, 0, 0, devpriv->count); - i8254_write(timer_iobase, 0, 1, devpriv->divider1); - i8254_write(timer_iobase, 0, 2, devpriv->divider2); - - } else { - i8254_set_mode(timer_iobase, 0, 0, I8254_MODE0 | I8254_BINARY); - i8254_set_mode(timer_iobase, 0, 1, I8254_MODE0 | I8254_BINARY); - i8254_set_mode(timer_iobase, 0, 2, I8254_MODE0 | I8254_BINARY); - } -} - static unsigned int das6402_ai_read_sample(struct comedi_device *dev, struct comedi_subdevice *s) { @@ -267,7 +242,8 @@ static int das6402_ai_cmd(struct comedi_device *dev, outw(DAS6402_AI_MUX_HI(chan_hi) | DAS6402_AI_MUX_LO(chan_lo), dev->iobase + DAS6402_AI_MUX_REG); - das6402_enable_counter(dev, true); + comedi_8254_update_divisors(dev->pacer); + comedi_8254_pacer_enable(dev->pacer, 1, 2, true); /* enable interrupt and pacer trigger */ outb(DAS6402_CTRL_INTE | @@ -322,7 +298,6 @@ static int das6402_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd) { - struct das6402_private *devpriv = dev->private; int err = 0; unsigned int arg; @@ -364,14 +339,9 @@ static int das6402_ai_cmdtest(struct comedi_device *dev, /* step 4: fix up any arguments */ - if (cmd->convert_src == TRIG_TIMER) { - arg = cmd->convert_arg; - i8253_cascade_ns_to_timer(I8254_OSC_BASE_10MHZ, - &devpriv->divider1, - &devpriv->divider2, - &arg, cmd->flags); - err |= cfc_check_trigger_arg_is(&cmd->convert_arg, arg); - } + arg = cmd->convert_arg; + comedi_8254_cascade_ns_to_timer(dev->pacer, &arg, cmd->flags); + err |= cfc_check_trigger_arg_is(&cmd->convert_arg, arg); if (err) return 4; @@ -581,8 +551,6 @@ static void das6402_reset(struct comedi_device *dev) outw(0, dev->iobase + DAS6402_AO_DATA_REG(0)); inw(dev->iobase + DAS6402_AO_LSB_REG(0)); - das6402_enable_counter(dev, false); - /* set all digital outputs low */ outb(0, dev->iobase + DAS6402_DI_DO_REG); @@ -631,6 +599,11 @@ static int das6402_attach(struct comedi_device *dev, } } + dev->pacer = comedi_8254_init(dev->iobase + DAS6402_TIMER_BASE, + I8254_OSC_BASE_10MHZ, I8254_IO8, 0); + if (!dev->pacer) + return -ENOMEM; + ret = comedi_alloc_subdevices(dev, 4); if (ret) return ret;