static int pcl711_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s) { int timer1, timer2; struct comedi_cmd *cmd = &s->async->cmd; pcl711_set_changain(dev, cmd->chanlist[0]); if (cmd->scan_begin_src == TRIG_TIMER) { /* * Set timers * timer chip is an 8253, with timers 1 and 2 * cascaded * 0x74 = Select Counter 1 | LSB/MSB | Mode=2 | Binary * Mode 2 = Rate generator * * 0xb4 = Select Counter 2 | LSB/MSB | Mode=2 | Binary */ timer1 = timer2 = 0; i8253_cascade_ns_to_timer(i8253_osc_base, &timer1, &timer2, &cmd->scan_begin_arg, TRIG_ROUND_NEAREST); outb(0x74, dev->iobase + PCL711_CTRCTL); outb(timer1 & 0xff, dev->iobase + PCL711_CTR1); outb((timer1 >> 8) & 0xff, dev->iobase + PCL711_CTR1); outb(0xb4, dev->iobase + PCL711_CTRCTL); outb(timer2 & 0xff, dev->iobase + PCL711_CTR2); outb((timer2 >> 8) & 0xff, dev->iobase + PCL711_CTR2); /* clear pending interrupts (just in case) */ outb(0, dev->iobase + PCL711_CLRINTR); /* * Set mode to IRQ transfer */ outb(devpriv->mode | 6, dev->iobase + PCL711_MODE); } else {
static int pcl711_ai_insn(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_insn *insn, unsigned int *data) { const struct pcl711_board *board = comedi_board(dev); int i, n; int hi, lo; pcl711_set_changain(dev, insn->chanspec); for (n = 0; n < insn->n; n++) { /* * Write the correct mode (software polling) and start polling * by writing to the trigger register */ outb(1, dev->iobase + PCL711_MODE); if (!board->is_8112) outb(0, dev->iobase + PCL711_SOFTTRIG); i = PCL711_TIMEOUT; while (--i) { hi = inb(dev->iobase + PCL711_AD_HI); if (!(hi & PCL711_DRDY)) goto ok; udelay(1); } printk(KERN_ERR "comedi%d: pcl711: A/D timeout\n", dev->minor); return -ETIME; ok: lo = inb(dev->iobase + PCL711_AD_LO); data[n] = ((hi & 0xf) << 8) | lo; } return n; }