[PATCH 17/22] staging: comedi: ni_6527: introduce ni6527_reset()
H Hartley Sweeten
hsweeten at visionengravers.com
Tue Oct 1 22:13:48 UTC 2013
Factor the board reset code out of the (*attach). Do the reset as
soon as possible to ensure the interrupts are disabled.
For convienence, use the ni6257_reset() during the (*detach) instead
of just disabling the interrupts.
Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
Cc: Ian Abbott <abbotti at mev.co.uk>
Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
---
drivers/staging/comedi/drivers/ni_6527.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_6527.c b/drivers/staging/comedi/drivers/ni_6527.c
index 59f6885..7ad8a4b 100644
--- a/drivers/staging/comedi/drivers/ni_6527.c
+++ b/drivers/staging/comedi/drivers/ni_6527.c
@@ -334,6 +334,19 @@ static int ni6527_intr_insn_config(struct comedi_device *dev,
return insn->n;
}
+static void ni6527_reset(struct comedi_device *dev)
+{
+ struct ni6527_private *devpriv = dev->private;
+ void __iomem *mmio = devpriv->mmio_base;
+
+ /* disable deglitch filters on all channels */
+ ni6527_set_filter_enable(dev, 0);
+
+ writeb(NI6527_CLR_IRQS | NI6527_CLR_RESET_FILT,
+ mmio + NI6527_CLR_REG);
+ writeb(NI6527_CTRL_DISABLE_IRQS, mmio + NI6527_CTRL_REG);
+}
+
static int ni6527_auto_attach(struct comedi_device *dev,
unsigned long context)
{
@@ -366,6 +379,8 @@ static int ni6527_auto_attach(struct comedi_device *dev,
if (readb(devpriv->mmio_base + NI6527_ID_REG) != 0x27)
return -ENODEV;
+ ni6527_reset(dev);
+
ret = comedi_alloc_subdevices(dev, 3);
if (ret)
return ret;
@@ -400,13 +415,6 @@ static int ni6527_auto_attach(struct comedi_device *dev,
s->insn_bits = ni6527_intr_insn_bits;
s->insn_config = ni6527_intr_insn_config;
- ni6527_set_filter_enable(dev, 0);
-
- writeb(NI6527_CLR_IRQS | NI6527_CLR_RESET_FILT,
- devpriv->mmio_base + NI6527_CLR_REG);
- writeb(NI6527_CTRL_DISABLE_IRQS,
- devpriv->mmio_base + NI6527_CTRL_REG);
-
ret = request_irq(pcidev->irq, ni6527_interrupt,
IRQF_SHARED, dev->board_name, dev);
if (ret < 0)
@@ -422,8 +430,7 @@ static void ni6527_detach(struct comedi_device *dev)
struct ni6527_private *devpriv = dev->private;
if (devpriv && devpriv->mmio_base)
- writeb(NI6527_CTRL_DISABLE_IRQS,
- devpriv->mmio_base + NI6527_CTRL_REG);
+ ni6527_reset(dev);
if (dev->irq)
free_irq(dev->irq, dev);
comedi_pci_disable(dev);
--
1.8.3.2
More information about the devel
mailing list