forked from Minki/linux
staging: comedi: pcl818: tidy up pcl818_check()
This function probes a number of the boards registers during the (*attach) to verify that it is actually a PCL-818 compatible board. For aesthetics, move the function closer to the (*attach). Refactor the function to return an errno if fails. Change the errno from -EIO to -ENODEV and remove the unnecessary comedi_error() noise. Make sure the CONTROL register is reset to a known state after the check. The 0x18 value actually defines an invalid interrupt selection and sets an undefined bit. Add a couple comments to clarify the magic values. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
18c7a6df49
commit
243e7146c8
@ -1082,25 +1082,6 @@ end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcl818_check(unsigned long iobase)
|
||||
{
|
||||
outb(0x00, iobase + PCL818_MUX);
|
||||
udelay(1);
|
||||
if (inb(iobase + PCL818_MUX) != 0x00)
|
||||
return 1; /* there isn't card */
|
||||
outb(0x55, iobase + PCL818_MUX);
|
||||
udelay(1);
|
||||
if (inb(iobase + PCL818_MUX) != 0x55)
|
||||
return 1; /* there isn't card */
|
||||
outb(0x00, iobase + PCL818_MUX);
|
||||
udelay(1);
|
||||
outb(0x18, iobase + PCL818_CONTROL);
|
||||
udelay(1);
|
||||
if (inb(iobase + PCL818_CONTROL) != 0x18)
|
||||
return 1; /* there isn't card */
|
||||
return 0; /* ok, card exist */
|
||||
}
|
||||
|
||||
static void pcl818_reset(struct comedi_device *dev)
|
||||
{
|
||||
const struct pcl818_board *board = comedi_board(dev);
|
||||
@ -1187,6 +1168,30 @@ static void pcl818_set_ai_range_table(struct comedi_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
static int pcl818_check(struct comedi_device *dev)
|
||||
{
|
||||
/* the MUX register should return the same value written */
|
||||
outb(0x00, dev->iobase + PCL818_MUX);
|
||||
if (inb(dev->iobase + PCL818_MUX) != 0x00)
|
||||
return -ENODEV;
|
||||
outb(0x55, dev->iobase + PCL818_MUX);
|
||||
if (inb(dev->iobase + PCL818_MUX) != 0x55)
|
||||
return -ENODEV;
|
||||
|
||||
/* reset the MUX register to a known state */
|
||||
outb(0x00, dev->iobase + PCL818_MUX);
|
||||
|
||||
/* the CONTROL register should return the same value written */
|
||||
outb(0x18, dev->iobase + PCL818_CONTROL);
|
||||
if (inb(dev->iobase + PCL818_CONTROL) != 0x18)
|
||||
return -ENODEV;
|
||||
|
||||
/* reset the CONTROL register to a known state */
|
||||
outb(0x00, dev->iobase + PCL818_CONTROL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
||||
{
|
||||
const struct pcl818_board *board = comedi_board(dev);
|
||||
@ -1208,10 +1213,9 @@ static int pcl818_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (pcl818_check(dev->iobase)) {
|
||||
comedi_error(dev, "I can't detect board. FAIL!\n");
|
||||
return -EIO;
|
||||
}
|
||||
ret = pcl818_check(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* we can use IRQ 2-7 for async command support */
|
||||
if (it->options[1] >= 2 && it->options[1] <= 7) {
|
||||
|
Loading…
Reference in New Issue
Block a user