* [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support
@ 2013-06-28 16:09 Ian Abbott
2013-06-28 16:09 ` [PATCH 01/12] staging: comedi: ni_labpc: fix possible double-free of dma_buffer Ian Abbott
` (11 more replies)
0 siblings, 12 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
The "ni_labpc" module is a common module for the "ni_labpc_cs" and
"ni_labpc_pci" modules. It is also a comedi driver for National
Instruments Lab-PC ISA boards if the `COMEDI_NI_LABPC_ISA` option is
enabled. In that case, the module may include code
to handle ISA DMA transfers if the `ISA_DMA_API` and `VIRT_TO_BUS`
options are also enabled.
Move the ISA DMA handling code into a new module "ni_labpc_isadma" which
is only built if the `COMEDI_NI_LABPC_ISA`, `ISA_DMA_API` and
`VIRT_TO_BUS` options are enabled. This allows a bunch of `#ifdef`s to
be removed.
01) staging: comedi: ni_labpc: fix possible double-free of dma_buffer
02) staging: comedi: ni_labpc: don't clear cmd3 bits explicitly in
labpc_ai_cmd()
03) staging: comedi: ni_labpc_isadma: new module for ISA DMA support
04) staging: comedi: ni_labpc: migrate DMA channel init & free
05) staging: comedi: ni_labpc_isadma: add labpc_have_dma_chan()
06) staging: comedi: ni_labpc: use labpc_have_dma_chan()
07) staging: comedi: ni_labpc: move register defs to new file
08) staging: comedi: ni_labpc: migrate DMA transfer set-up
09) staging: comedi: ni_labpc: migrate labpc_drain_dma()
10) staging: comedi: ni_labpc: migrate DMA status handling
11) staging: comedi: ni_labpc: tidy up after DMA code migration
12) staging: comedi: COMEDI_NI_LABPC_ISA no longer depends on
VIRT_TO_BUS
drivers/staging/comedi/Kconfig | 5 +-
drivers/staging/comedi/drivers/Makefile | 1 +
drivers/staging/comedi/drivers/ni_labpc.c | 279 ++---------------------
drivers/staging/comedi/drivers/ni_labpc_isadma.c | 226 ++++++++++++++++++
drivers/staging/comedi/drivers/ni_labpc_isadma.h | 57 +++++
drivers/staging/comedi/drivers/ni_labpc_regs.h | 75 ++++++
6 files changed, 387 insertions(+), 256 deletions(-)
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 01/12] staging: comedi: ni_labpc: fix possible double-free of dma_buffer
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 02/12] staging: comedi: ni_labpc: don't clear cmd3 bits explicitly in labpc_ai_cmd() Ian Abbott
` (10 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
If `labpc_attach()` allocates memory for `devpriv->dma_buffer` but fails
to request a DMA channel, it frees `devpriv->dma_buffer` but leaves the
pointer set. Later, `labpc_detach()` frees `devpriv->dma_buffer` again,
which means it has been freed twice in this case.
Fix it by only setting `devpriv->dma_buffer` in `labpc_attach()` if the
DMA channel was requested successfully.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index f161e70..0783d65 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -1712,13 +1712,15 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
#ifdef CONFIG_ISA_DMA_API
if (dev->irq && (dma_chan == 1 || dma_chan == 3)) {
- devpriv->dma_buffer = kmalloc(dma_buffer_size,
- GFP_KERNEL | GFP_DMA);
- if (devpriv->dma_buffer) {
+ void *dma_buffer = kmalloc(dma_buffer_size,
+ GFP_KERNEL | GFP_DMA);
+
+ if (dma_buffer) {
ret = request_dma(dma_chan, dev->board_name);
if (ret == 0) {
unsigned long dma_flags;
+ devpriv->dma_buffer = dma_buffer;
devpriv->dma_chan = dma_chan;
devpriv->dma_addr =
virt_to_bus(devpriv->dma_buffer);
@@ -1728,7 +1730,7 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
release_dma_lock(dma_flags);
} else {
- kfree(devpriv->dma_buffer);
+ kfree(dma_buffer);
}
}
}
--
1.8.2.1
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 02/12] staging: comedi: ni_labpc: don't clear cmd3 bits explicitly in labpc_ai_cmd()
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
2013-06-28 16:09 ` [PATCH 01/12] staging: comedi: ni_labpc: fix possible double-free of dma_buffer Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 03/12] staging: comedi: ni_labpc_isadma: new module for ISA DMA support Ian Abbott
` (9 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
`labpc_ai_cmd()` calls `labpc_cancel()` which already sets
`devpriv->cmd3` to 0. Remove the lines from `labpc_ai_cmd()` that clear
specific bits in `devpriv->cmd3` explicitly as they have no effect.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 0783d65..7dec029 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -975,8 +975,7 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
release_dma_lock(irq_flags);
/* enable board's dma */
devpriv->cmd3 |= (CMD3_DMAEN | CMD3_DMATCINTEN);
- } else
- devpriv->cmd3 &= ~(CMD3_DMAEN | CMD3_DMATCINTEN);
+ }
#endif
/* enable error interrupts */
@@ -984,8 +983,6 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
/* enable fifo not empty interrupt? */
if (xfer == fifo_not_empty_transfer)
devpriv->cmd3 |= CMD3_FIFOINTEN;
- else
- devpriv->cmd3 &= ~CMD3_FIFOINTEN;
devpriv->write_byte(devpriv->cmd3, dev->iobase + CMD3_REG);
/* setup any external triggering/pacing (cmd4 register) */
--
1.8.2.1
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 03/12] staging: comedi: ni_labpc_isadma: new module for ISA DMA support
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
2013-06-28 16:09 ` [PATCH 01/12] staging: comedi: ni_labpc: fix possible double-free of dma_buffer Ian Abbott
2013-06-28 16:09 ` [PATCH 02/12] staging: comedi: ni_labpc: don't clear cmd3 bits explicitly in labpc_ai_cmd() Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 04/12] staging: comedi: ni_labpc: migrate DMA channel init & free Ian Abbott
` (8 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
It's just an empty module at the moment, selected by COMEDI_NI_LABPC_ISA
&& ISA_DMA_API && VIRT_TO_BUS, but will be populated by later patches to
migrate ISA DMA support for NI Lab-PC cards out of the "ni_labpc"
module.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/Kconfig | 4 +++
drivers/staging/comedi/drivers/Makefile | 1 +
drivers/staging/comedi/drivers/ni_labpc.c | 1 +
drivers/staging/comedi/drivers/ni_labpc_isadma.c | 37 ++++++++++++++++++++++++
drivers/staging/comedi/drivers/ni_labpc_isadma.h | 16 ++++++++++
5 files changed, 59 insertions(+)
create mode 100644 drivers/staging/comedi/drivers/ni_labpc_isadma.c
create mode 100644 drivers/staging/comedi/drivers/ni_labpc_isadma.h
diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig
index 8c8a551..faecf67 100644
--- a/drivers/staging/comedi/Kconfig
+++ b/drivers/staging/comedi/Kconfig
@@ -473,6 +473,7 @@ config COMEDI_NI_ATMIO16D
config COMEDI_NI_LABPC_ISA
tristate "NI Lab-PC and compatibles ISA support"
select COMEDI_NI_LABPC
+ select COMEDI_NI_LABPC_ISADMA if ISA_DMA_API && VIRT_TO_BUS
depends on VIRT_TO_BUS
---help---
Enable support for National Instruments Lab-PC and compatibles
@@ -1262,6 +1263,9 @@ config COMEDI_NI_LABPC
select COMEDI_8255
select COMEDI_FC
+config COMEDI_NI_LABPC_ISADMA
+ tristate
+
config COMEDI_NI_TIO
tristate
diff --git a/drivers/staging/comedi/drivers/Makefile b/drivers/staging/comedi/drivers/Makefile
index dbb93e3..3fdca81 100644
--- a/drivers/staging/comedi/drivers/Makefile
+++ b/drivers/staging/comedi/drivers/Makefile
@@ -132,6 +132,7 @@ obj-$(CONFIG_COMEDI_MITE) += mite.o
obj-$(CONFIG_COMEDI_NI_TIO) += ni_tio.o
obj-$(CONFIG_COMEDI_NI_TIOCMD) += ni_tiocmd.o
obj-$(CONFIG_COMEDI_NI_LABPC) += ni_labpc.o
+obj-$(CONFIG_COMEDI_NI_LABPC_ISADMA) += ni_labpc_isadma.o
obj-$(CONFIG_COMEDI_8255) += 8255.o
obj-$(CONFIG_COMEDI_AMPLC_DIO200) += amplc_dio200_common.o
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 7dec029..41f1674 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -70,6 +70,7 @@
#include "8255.h"
#include "comedi_fc.h"
#include "ni_labpc.h"
+#include "ni_labpc_isadma.h"
/*
* Register map (all registers are 8-bit)
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.c b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
new file mode 100644
index 0000000..586ea54
--- /dev/null
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
@@ -0,0 +1,37 @@
+/*
+ * comedi/drivers/ni_labpc_isadma.c
+ * ISA DMA support for National Instruments Lab-PC series boards and
+ * compatibles.
+ *
+ * Extracted from ni_labpc.c:
+ * Copyright (C) 2001-2003 Frank Mori Hess <fmhess@users.sourceforge.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/module.h>
+
+#include "ni_labpc_isadma.h"
+
+static int __init ni_labpc_isadma_init_module(void)
+{
+ return 0;
+}
+module_init(ni_labpc_isadma_init_module);
+
+static void __exit ni_labpc_isadma_cleanup_module(void)
+{
+}
+module_exit(ni_labpc_isadma_cleanup_module);
+
+MODULE_AUTHOR("Comedi http://www.comedi.org");
+MODULE_DESCRIPTION("Comedi NI Lab-PC ISA DMA support");
+MODULE_LICENSE("GPL");
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.h b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
new file mode 100644
index 0000000..ac644f0
--- /dev/null
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
@@ -0,0 +1,16 @@
+/*
+ * ni_labpc ISA DMA support.
+*/
+
+#ifndef _NI_LABPC_ISADMA_H
+#define _NI_LABPC_ISADMA_H
+
+#define NI_LABPC_HAVE_ISA_DMA IS_ENABLED(CONFIG_COMEDI_NI_LABPC_ISADMA)
+
+#if NI_LABPC_HAVE_ISA_DMA
+
+#else
+
+#endif
+
+#endif /* _NI_LABPC_ISADMA_H */
--
1.8.2.1
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 04/12] staging: comedi: ni_labpc: migrate DMA channel init & free
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (2 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 03/12] staging: comedi: ni_labpc_isadma: new module for ISA DMA support Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 05/12] staging: comedi: ni_labpc_isadma: add labpc_have_dma_chan() Ian Abbott
` (7 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
Migrate the code for requesting an ISA DMA channel and a DMA buffer, and
the code for freeing them into two new functions in the
"ni_labpc_isadma" module: `labpc_init_dma_chan()` and
`labpc_free_dma_chan()`. Dummy inline functions are provided in
"ni_labpc_isadma.h" if the "ni_labpc_isadma" module is not being built.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 35 +++------------
drivers/staging/comedi/drivers/ni_labpc_isadma.c | 54 ++++++++++++++++++++++++
drivers/staging/comedi/drivers/ni_labpc_isadma.h | 13 ++++++
3 files changed, 72 insertions(+), 30 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 41f1674..301b532 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -1708,31 +1708,8 @@ static int labpc_attach(struct comedi_device *dev, struct comedi_devconfig *it)
if (ret)
return ret;
-#ifdef CONFIG_ISA_DMA_API
- if (dev->irq && (dma_chan == 1 || dma_chan == 3)) {
- void *dma_buffer = kmalloc(dma_buffer_size,
- GFP_KERNEL | GFP_DMA);
-
- if (dma_buffer) {
- ret = request_dma(dma_chan, dev->board_name);
- if (ret == 0) {
- unsigned long dma_flags;
-
- devpriv->dma_buffer = dma_buffer;
- devpriv->dma_chan = dma_chan;
- devpriv->dma_addr =
- virt_to_bus(devpriv->dma_buffer);
-
- dma_flags = claim_dma_lock();
- disable_dma(devpriv->dma_chan);
- set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
- release_dma_lock(dma_flags);
- } else {
- kfree(dma_buffer);
- }
- }
- }
-#endif
+ if (dev->irq)
+ labpc_init_dma_chan(dev, dma_chan);
return 0;
}
@@ -1741,11 +1718,9 @@ static void labpc_detach(struct comedi_device *dev)
{
struct labpc_private *devpriv = dev->private;
- if (devpriv) {
- kfree(devpriv->dma_buffer);
- if (devpriv->dma_chan)
- free_dma(devpriv->dma_chan);
- }
+ if (devpriv)
+ labpc_free_dma_chan(dev);
+
comedi_legacy_detach(dev);
}
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.c b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
index 586ea54..e6c8437 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.c
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
@@ -18,9 +18,63 @@
*/
#include <linux/module.h>
+#include <linux/slab.h>
+#include "../comedidev.h"
+#include <asm/dma.h>
+
+#include "ni_labpc.h"
#include "ni_labpc_isadma.h"
+/* size in bytes of dma buffer */
+static const int dma_buffer_size = 0xff00;
+
+int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan)
+{
+ struct labpc_private *devpriv = dev->private;
+ void *dma_buffer;
+ unsigned long dma_flags;
+ int ret;
+
+ if (dma_chan != 1 && dma_chan != 3)
+ return -EINVAL;
+
+ dma_buffer = kmalloc(dma_buffer_size, GFP_KERNEL | GFP_DMA);
+ if (!dma_buffer)
+ return -ENOMEM;
+
+ ret = request_dma(dma_chan, dev->board_name);
+ if (ret) {
+ kfree(dma_buffer);
+ return ret;
+ }
+
+ devpriv->dma_buffer = dma_buffer;
+ devpriv->dma_chan = dma_chan;
+ devpriv->dma_addr = virt_to_bus(devpriv->dma_buffer);
+
+ dma_flags = claim_dma_lock();
+ disable_dma(devpriv->dma_chan);
+ set_dma_mode(devpriv->dma_chan, DMA_MODE_READ);
+ release_dma_lock(dma_flags);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(labpc_init_dma_chan);
+
+void labpc_free_dma_chan(struct comedi_device *dev)
+{
+ struct labpc_private *devpriv = dev->private;
+
+ kfree(devpriv->dma_buffer);
+ devpriv->dma_buffer = NULL;
+ if (devpriv->dma_chan) {
+ free_dma(devpriv->dma_chan);
+ devpriv->dma_chan = 0;
+ }
+}
+EXPORT_SYMBOL_GPL(labpc_free_dma_chan);
+
static int __init ni_labpc_isadma_init_module(void)
{
return 0;
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.h b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
index ac644f0..144f4ba 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.h
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
@@ -9,8 +9,21 @@
#if NI_LABPC_HAVE_ISA_DMA
+int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan);
+void labpc_free_dma_chan(struct comedi_device *dev);
+
#else
+static inline int labpc_init_dma_chan(struct comedi_device *dev,
+ unsigned int dma_chan)
+{
+ return -ENOTSUPP;
+}
+
+static inline void labpc_free_dma_chan(struct comedi_device *dev)
+{
+}
+
#endif
#endif /* _NI_LABPC_ISADMA_H */
--
1.8.2.1
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 05/12] staging: comedi: ni_labpc_isadma: add labpc_have_dma_chan()
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (3 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 04/12] staging: comedi: ni_labpc: migrate DMA channel init & free Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 06/12] staging: comedi: ni_labpc: use labpc_have_dma_chan() Ian Abbott
` (6 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
Add a static inline function to "ni_labpc_isadma.h" to test if a DMA
channel has been set-up, in which case `devpriv->dma_chan` will be
non-zero (where `devpriv` point to the private data for the comedi
device). If the "ni_labpc_isadma" module is not being built, don't
bother checking `devpriv->dma_chan`; just return `false` as this may
help the compiler to optimize out some unreachable code.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc_isadma.h | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.h b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
index 144f4ba..3b022ea 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.h
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
@@ -9,11 +9,23 @@
#if NI_LABPC_HAVE_ISA_DMA
+static inline bool labpc_have_dma_chan(struct comedi_device *dev)
+{
+ struct labpc_private *devpriv = dev->private;
+
+ return (bool)devpriv->dma_chan;
+}
+
int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan);
void labpc_free_dma_chan(struct comedi_device *dev);
#else
+static inline bool labpc_have_dma_chan(struct comedi_device *dev)
+{
+ return false;
+}
+
static inline int labpc_init_dma_chan(struct comedi_device *dev,
unsigned int dma_chan)
{
--
1.8.2.1
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 06/12] staging: comedi: ni_labpc: use labpc_have_dma_chan()
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (4 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 05/12] staging: comedi: ni_labpc_isadma: add labpc_have_dma_chan() Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 07/12] staging: comedi: ni_labpc: move register defs to new file Ian Abbott
` (5 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
Call the new static inline function `labpc_have_dma_chan()` from
`labpc_ai_cmd()` to check if the ISA DMA channel has been initialized,
tidying up the surrounding code and removing an `#ifdef`. If the
"ni_labpc_isadma" module is not being built, `labpc_have_dma_chan()`
doesn't bother checking the DMA channel and just returns `false`,
allowing the compiler to optimize out a small amount of code.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 29 ++++++++++++-----------------
1 file changed, 12 insertions(+), 17 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 301b532..25d8ae3 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -870,25 +870,20 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
return ret;
}
-#ifdef CONFIG_ISA_DMA_API
- /* figure out what method we will use to transfer data */
- if (devpriv->dma_chan && /* need a dma channel allocated */
- /*
- * dma unsafe at RT priority,
- * and too much setup time for TRIG_WAKE_EOS for
- */
- (cmd->flags & (TRIG_WAKE_EOS | TRIG_RT)) == 0) {
+ /* figure out what method we will use to transfer data */
+ if (labpc_have_dma_chan(dev) &&
+ /* dma unsafe at RT priority,
+ * and too much setup time for TRIG_WAKE_EOS */
+ (cmd->flags & (TRIG_WAKE_EOS | TRIG_RT)) == 0)
xfer = isa_dma_transfer;
- /* pc-plus has no fifo-half full interrupt */
- } else
-#endif
- if (board->is_labpc1200 &&
- /* wake-end-of-scan should interrupt on fifo not empty */
- (cmd->flags & TRIG_WAKE_EOS) == 0 &&
- /* make sure we are taking more than just a few points */
- (cmd->stop_src != TRIG_COUNT || devpriv->count > 256)) {
+ else if (/* pc-plus has no fifo-half full interrupt */
+ board->is_labpc1200 &&
+ /* wake-end-of-scan should interrupt on fifo not empty */
+ (cmd->flags & TRIG_WAKE_EOS) == 0 &&
+ /* make sure we are taking more than just a few points */
+ (cmd->stop_src != TRIG_COUNT || devpriv->count > 256))
xfer = fifo_half_full_transfer;
- } else
+ else
xfer = fifo_not_empty_transfer;
devpriv->current_transfer = xfer;
--
1.8.2.1
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 07/12] staging: comedi: ni_labpc: move register defs to new file
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (5 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 06/12] staging: comedi: ni_labpc: use labpc_have_dma_chan() Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 08/12] staging: comedi: ni_labpc: migrate DMA transfer set-up Ian Abbott
` (4 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
The new "ni_labpc_isadma" module will need to access some register
definitions from "ni_labpc.c", which is not part of the module's source.
Move all the register definitions into a new, common header file
"ni_labpc_regs.h".
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 68 +--------------------
drivers/staging/comedi/drivers/ni_labpc_isadma.c | 1 +
drivers/staging/comedi/drivers/ni_labpc_regs.h | 75 ++++++++++++++++++++++++
3 files changed, 77 insertions(+), 67 deletions(-)
create mode 100644 drivers/staging/comedi/drivers/ni_labpc_regs.h
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 25d8ae3..c0ab71e 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -70,75 +70,9 @@
#include "8255.h"
#include "comedi_fc.h"
#include "ni_labpc.h"
+#include "ni_labpc_regs.h"
#include "ni_labpc_isadma.h"
-/*
- * Register map (all registers are 8-bit)
- */
-#define STAT1_REG 0x00 /* R: Status 1 reg */
-#define STAT1_DAVAIL (1 << 0)
-#define STAT1_OVERRUN (1 << 1)
-#define STAT1_OVERFLOW (1 << 2)
-#define STAT1_CNTINT (1 << 3)
-#define STAT1_GATA0 (1 << 5)
-#define STAT1_EXTGATA0 (1 << 6)
-#define CMD1_REG 0x00 /* W: Command 1 reg */
-#define CMD1_MA(x) (((x) & 0x7) << 0)
-#define CMD1_TWOSCMP (1 << 3)
-#define CMD1_GAIN(x) (((x) & 0x7) << 4)
-#define CMD1_SCANEN (1 << 7)
-#define CMD2_REG 0x01 /* W: Command 2 reg */
-#define CMD2_PRETRIG (1 << 0)
-#define CMD2_HWTRIG (1 << 1)
-#define CMD2_SWTRIG (1 << 2)
-#define CMD2_TBSEL (1 << 3)
-#define CMD2_2SDAC0 (1 << 4)
-#define CMD2_2SDAC1 (1 << 5)
-#define CMD2_LDAC(x) (1 << (6 + (x)))
-#define CMD3_REG 0x02 /* W: Command 3 reg */
-#define CMD3_DMAEN (1 << 0)
-#define CMD3_DIOINTEN (1 << 1)
-#define CMD3_DMATCINTEN (1 << 2)
-#define CMD3_CNTINTEN (1 << 3)
-#define CMD3_ERRINTEN (1 << 4)
-#define CMD3_FIFOINTEN (1 << 5)
-#define ADC_START_CONVERT_REG 0x03 /* W: Start Convert reg */
-#define DAC_LSB_REG(x) (0x04 + 2 * (x)) /* W: DAC0/1 LSB reg */
-#define DAC_MSB_REG(x) (0x05 + 2 * (x)) /* W: DAC0/1 MSB reg */
-#define ADC_FIFO_CLEAR_REG 0x08 /* W: A/D FIFO Clear reg */
-#define ADC_FIFO_REG 0x0a /* R: A/D FIFO reg */
-#define DMATC_CLEAR_REG 0x0a /* W: DMA Interrupt Clear reg */
-#define TIMER_CLEAR_REG 0x0c /* W: Timer Interrupt Clear reg */
-#define CMD6_REG 0x0e /* W: Command 6 reg */
-#define CMD6_NRSE (1 << 0)
-#define CMD6_ADCUNI (1 << 1)
-#define CMD6_DACUNI(x) (1 << (2 + (x)))
-#define CMD6_HFINTEN (1 << 5)
-#define CMD6_DQINTEN (1 << 6)
-#define CMD6_SCANUP (1 << 7)
-#define CMD4_REG 0x0f /* W: Command 3 reg */
-#define CMD4_INTSCAN (1 << 0)
-#define CMD4_EOIRCV (1 << 1)
-#define CMD4_ECLKDRV (1 << 2)
-#define CMD4_SEDIFF (1 << 3)
-#define CMD4_ECLKRCV (1 << 4)
-#define DIO_BASE_REG 0x10 /* R/W: 8255 DIO base reg */
-#define COUNTER_A_BASE_REG 0x14 /* R/W: 8253 Counter A base reg */
-#define COUNTER_B_BASE_REG 0x18 /* R/W: 8253 Counter B base reg */
-#define CMD5_REG 0x1c /* W: Command 5 reg */
-#define CMD5_WRTPRT (1 << 2)
-#define CMD5_DITHEREN (1 << 3)
-#define CMD5_CALDACLD (1 << 4)
-#define CMD5_SCLK (1 << 5)
-#define CMD5_SDATA (1 << 6)
-#define CMD5_EEPROMCS (1 << 7)
-#define STAT2_REG 0x1d /* R: Status 2 reg */
-#define STAT2_PROMOUT (1 << 0)
-#define STAT2_OUTA1 (1 << 1)
-#define STAT2_FIFONHF (1 << 2)
-#define INTERVAL_COUNT_REG 0x1e /* W: Interval Counter Data reg */
-#define INTERVAL_STROBE_REG 0x1f /* W: Interval Counter Strobe reg */
-
#define LABPC_SIZE 0x20 /* size of ISA io region */
#define LABPC_TIMER_BASE 500 /* 2 MHz master clock */
#define LABPC_ADC_TIMEOUT 1000
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.c b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
index e6c8437..a052974 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.c
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
@@ -24,6 +24,7 @@
#include <asm/dma.h>
#include "ni_labpc.h"
+#include "ni_labpc_regs.h"
#include "ni_labpc_isadma.h"
/* size in bytes of dma buffer */
diff --git a/drivers/staging/comedi/drivers/ni_labpc_regs.h b/drivers/staging/comedi/drivers/ni_labpc_regs.h
new file mode 100644
index 0000000..2a274a3
--- /dev/null
+++ b/drivers/staging/comedi/drivers/ni_labpc_regs.h
@@ -0,0 +1,75 @@
+/*
+ * ni_labpc register definitions.
+*/
+
+#ifndef _NI_LABPC_REGS_H
+#define _NI_LABPC_REGS_H
+
+/*
+ * Register map (all registers are 8-bit)
+ */
+#define STAT1_REG 0x00 /* R: Status 1 reg */
+#define STAT1_DAVAIL (1 << 0)
+#define STAT1_OVERRUN (1 << 1)
+#define STAT1_OVERFLOW (1 << 2)
+#define STAT1_CNTINT (1 << 3)
+#define STAT1_GATA0 (1 << 5)
+#define STAT1_EXTGATA0 (1 << 6)
+#define CMD1_REG 0x00 /* W: Command 1 reg */
+#define CMD1_MA(x) (((x) & 0x7) << 0)
+#define CMD1_TWOSCMP (1 << 3)
+#define CMD1_GAIN(x) (((x) & 0x7) << 4)
+#define CMD1_SCANEN (1 << 7)
+#define CMD2_REG 0x01 /* W: Command 2 reg */
+#define CMD2_PRETRIG (1 << 0)
+#define CMD2_HWTRIG (1 << 1)
+#define CMD2_SWTRIG (1 << 2)
+#define CMD2_TBSEL (1 << 3)
+#define CMD2_2SDAC0 (1 << 4)
+#define CMD2_2SDAC1 (1 << 5)
+#define CMD2_LDAC(x) (1 << (6 + (x)))
+#define CMD3_REG 0x02 /* W: Command 3 reg */
+#define CMD3_DMAEN (1 << 0)
+#define CMD3_DIOINTEN (1 << 1)
+#define CMD3_DMATCINTEN (1 << 2)
+#define CMD3_CNTINTEN (1 << 3)
+#define CMD3_ERRINTEN (1 << 4)
+#define CMD3_FIFOINTEN (1 << 5)
+#define ADC_START_CONVERT_REG 0x03 /* W: Start Convert reg */
+#define DAC_LSB_REG(x) (0x04 + 2 * (x)) /* W: DAC0/1 LSB reg */
+#define DAC_MSB_REG(x) (0x05 + 2 * (x)) /* W: DAC0/1 MSB reg */
+#define ADC_FIFO_CLEAR_REG 0x08 /* W: A/D FIFO Clear reg */
+#define ADC_FIFO_REG 0x0a /* R: A/D FIFO reg */
+#define DMATC_CLEAR_REG 0x0a /* W: DMA Interrupt Clear reg */
+#define TIMER_CLEAR_REG 0x0c /* W: Timer Interrupt Clear reg */
+#define CMD6_REG 0x0e /* W: Command 6 reg */
+#define CMD6_NRSE (1 << 0)
+#define CMD6_ADCUNI (1 << 1)
+#define CMD6_DACUNI(x) (1 << (2 + (x)))
+#define CMD6_HFINTEN (1 << 5)
+#define CMD6_DQINTEN (1 << 6)
+#define CMD6_SCANUP (1 << 7)
+#define CMD4_REG 0x0f /* W: Command 3 reg */
+#define CMD4_INTSCAN (1 << 0)
+#define CMD4_EOIRCV (1 << 1)
+#define CMD4_ECLKDRV (1 << 2)
+#define CMD4_SEDIFF (1 << 3)
+#define CMD4_ECLKRCV (1 << 4)
+#define DIO_BASE_REG 0x10 /* R/W: 8255 DIO base reg */
+#define COUNTER_A_BASE_REG 0x14 /* R/W: 8253 Counter A base reg */
+#define COUNTER_B_BASE_REG 0x18 /* R/W: 8253 Counter B base reg */
+#define CMD5_REG 0x1c /* W: Command 5 reg */
+#define CMD5_WRTPRT (1 << 2)
+#define CMD5_DITHEREN (1 << 3)
+#define CMD5_CALDACLD (1 << 4)
+#define CMD5_SCLK (1 << 5)
+#define CMD5_SDATA (1 << 6)
+#define CMD5_EEPROMCS (1 << 7)
+#define STAT2_REG 0x1d /* R: Status 2 reg */
+#define STAT2_PROMOUT (1 << 0)
+#define STAT2_OUTA1 (1 << 1)
+#define STAT2_FIFONHF (1 << 2)
+#define INTERVAL_COUNT_REG 0x1e /* W: Interval Counter Data reg */
+#define INTERVAL_STROBE_REG 0x1f /* W: Interval Counter Strobe reg */
+
+#endif /* _NI_LABPC_REGS_H */
--
1.8.2.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 08/12] staging: comedi: ni_labpc: migrate DMA transfer set-up
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (6 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 07/12] staging: comedi: ni_labpc: move register defs to new file Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 09/12] staging: comedi: ni_labpc: migrate labpc_drain_dma() Ian Abbott
` (3 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
Migrate the code for setting up an ISA DMA transfer into a new function
`labpc_setup_dma()` in the "ni_labpc_isadma" module. Provide a dummy
inline function in "ni_labpc_isadma.h" if the "ni_labpc_isadma" module
is not being built.
The static function `labpc_suggest_transfer_size()` also needs to move
across to the new module.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 53 +-----------------------
drivers/staging/comedi/drivers/ni_labpc_isadma.c | 51 +++++++++++++++++++++++
drivers/staging/comedi/drivers/ni_labpc_isadma.h | 6 +++
3 files changed, 59 insertions(+), 51 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index c0ab71e..39cdfda 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -386,32 +386,6 @@ static int labpc_ai_insn_read(struct comedi_device *dev,
return insn->n;
}
-#ifdef CONFIG_ISA_DMA_API
-/* utility function that suggests a dma transfer size in bytes */
-static unsigned int labpc_suggest_transfer_size(const struct comedi_cmd *cmd)
-{
- unsigned int size;
- unsigned int freq;
-
- if (cmd->convert_src == TRIG_TIMER)
- freq = 1000000000 / cmd->convert_arg;
- /* return some default value */
- else
- freq = 0xffffffff;
-
- /* make buffer fill in no more than 1/3 second */
- size = (freq / 3) * sample_size;
-
- /* set a minimum and maximum size allowed */
- if (size > dma_buffer_size)
- size = dma_buffer_size - dma_buffer_size % sample_size;
- else if (size < sample_size)
- size = sample_size;
-
- return size;
-}
-#endif
-
static bool labpc_use_continuous_mode(const struct comedi_cmd *cmd,
enum scan_mode mode)
{
@@ -882,31 +856,8 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
labpc_clear_adc_fifo(dev);
-#ifdef CONFIG_ISA_DMA_API
- /* set up dma transfer */
- if (xfer == isa_dma_transfer) {
- unsigned long irq_flags;
-
- irq_flags = claim_dma_lock();
- disable_dma(devpriv->dma_chan);
- /* clear flip-flop to make sure 2-byte registers for
- * count and address get set correctly */
- clear_dma_ff(devpriv->dma_chan);
- set_dma_addr(devpriv->dma_chan, devpriv->dma_addr);
- /* set appropriate size of transfer */
- devpriv->dma_transfer_size = labpc_suggest_transfer_size(cmd);
- if (cmd->stop_src == TRIG_COUNT &&
- devpriv->count * sample_size < devpriv->dma_transfer_size) {
- devpriv->dma_transfer_size =
- devpriv->count * sample_size;
- }
- set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
- enable_dma(devpriv->dma_chan);
- release_dma_lock(irq_flags);
- /* enable board's dma */
- devpriv->cmd3 |= (CMD3_DMAEN | CMD3_DMATCINTEN);
- }
-#endif
+ if (xfer == isa_dma_transfer)
+ labpc_setup_dma(dev, s);
/* enable error interrupts */
devpriv->cmd3 |= CMD3_ERRINTEN;
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.c b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
index a052974..dba2be3 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.c
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
@@ -29,6 +29,57 @@
/* size in bytes of dma buffer */
static const int dma_buffer_size = 0xff00;
+/* 2 bytes per sample */
+static const int sample_size = 2;
+
+/* utility function that suggests a dma transfer size in bytes */
+static unsigned int labpc_suggest_transfer_size(const struct comedi_cmd *cmd)
+{
+ unsigned int size;
+ unsigned int freq;
+
+ if (cmd->convert_src == TRIG_TIMER)
+ freq = 1000000000 / cmd->convert_arg;
+ else
+ /* return some default value */
+ freq = 0xffffffff;
+
+ /* make buffer fill in no more than 1/3 second */
+ size = (freq / 3) * sample_size;
+
+ /* set a minimum and maximum size allowed */
+ if (size > dma_buffer_size)
+ size = dma_buffer_size - dma_buffer_size % sample_size;
+ else if (size < sample_size)
+ size = sample_size;
+
+ return size;
+}
+
+void labpc_setup_dma(struct comedi_device *dev, struct comedi_subdevice *s)
+{
+ struct labpc_private *devpriv = dev->private;
+ struct comedi_cmd *cmd = &s->async->cmd;
+ unsigned long irq_flags;
+
+ irq_flags = claim_dma_lock();
+ disable_dma(devpriv->dma_chan);
+ /* clear flip-flop to make sure 2-byte registers for
+ * count and address get set correctly */
+ clear_dma_ff(devpriv->dma_chan);
+ set_dma_addr(devpriv->dma_chan, devpriv->dma_addr);
+ /* set appropriate size of transfer */
+ devpriv->dma_transfer_size = labpc_suggest_transfer_size(cmd);
+ if (cmd->stop_src == TRIG_COUNT &&
+ devpriv->count * sample_size < devpriv->dma_transfer_size)
+ devpriv->dma_transfer_size = devpriv->count * sample_size;
+ set_dma_count(devpriv->dma_chan, devpriv->dma_transfer_size);
+ enable_dma(devpriv->dma_chan);
+ release_dma_lock(irq_flags);
+ /* set CMD3 bits for caller to enable DMA and interrupt */
+ devpriv->cmd3 |= (CMD3_DMAEN | CMD3_DMATCINTEN);
+}
+EXPORT_SYMBOL_GPL(labpc_setup_dma);
int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan)
{
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.h b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
index 3b022ea..c721f57 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.h
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
@@ -18,6 +18,7 @@ static inline bool labpc_have_dma_chan(struct comedi_device *dev)
int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan);
void labpc_free_dma_chan(struct comedi_device *dev);
+void labpc_setup_dma(struct comedi_device *dev, struct comedi_subdevice *s);
#else
@@ -36,6 +37,11 @@ static inline void labpc_free_dma_chan(struct comedi_device *dev)
{
}
+static inline void labpc_setup_dma(struct comedi_device *dev,
+ struct comedi_subdevice *s)
+{
+}
+
#endif
#endif /* _NI_LABPC_ISADMA_H */
--
1.8.2.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 09/12] staging: comedi: ni_labpc: migrate labpc_drain_dma()
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (7 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 08/12] staging: comedi: ni_labpc: migrate DMA transfer set-up Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 10/12] staging: comedi: ni_labpc: migrate DMA status handling Ian Abbott
` (2 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
Move `labpc_drain_dma()` into the "ni_labpc_isadma" module. Provide a
dummy inline function in "ni_labpc_isadma.h" if the module is not being
built.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 56 ------------------------
drivers/staging/comedi/drivers/ni_labpc_isadma.c | 56 ++++++++++++++++++++++++
drivers/staging/comedi/drivers/ni_labpc_isadma.h | 5 +++
3 files changed, 61 insertions(+), 56 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 39cdfda..fc2dfea 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -905,60 +905,6 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
}
#ifdef CONFIG_ISA_DMA_API
-static void labpc_drain_dma(struct comedi_device *dev)
-{
- struct labpc_private *devpriv = dev->private;
- struct comedi_subdevice *s = dev->read_subdev;
- struct comedi_async *async = s->async;
- int status;
- unsigned long flags;
- unsigned int max_points, num_points, residue, leftover;
- int i;
-
- status = devpriv->stat1;
-
- flags = claim_dma_lock();
- disable_dma(devpriv->dma_chan);
- /* clear flip-flop to make sure 2-byte registers for
- * count and address get set correctly */
- clear_dma_ff(devpriv->dma_chan);
-
- /* figure out how many points to read */
- max_points = devpriv->dma_transfer_size / sample_size;
- /* residue is the number of points left to be done on the dma
- * transfer. It should always be zero at this point unless
- * the stop_src is set to external triggering.
- */
- residue = get_dma_residue(devpriv->dma_chan) / sample_size;
- num_points = max_points - residue;
- if (devpriv->count < num_points && async->cmd.stop_src == TRIG_COUNT)
- num_points = devpriv->count;
-
- /* figure out how many points will be stored next time */
- leftover = 0;
- if (async->cmd.stop_src != TRIG_COUNT) {
- leftover = devpriv->dma_transfer_size / sample_size;
- } else if (devpriv->count > num_points) {
- leftover = devpriv->count - num_points;
- if (leftover > max_points)
- leftover = max_points;
- }
-
- /* write data to comedi buffer */
- for (i = 0; i < num_points; i++)
- cfc_write_to_buffer(s, devpriv->dma_buffer[i]);
-
- if (async->cmd.stop_src == TRIG_COUNT)
- devpriv->count -= num_points;
-
- /* set address and count for next transfer */
- set_dma_addr(devpriv->dma_chan, devpriv->dma_addr);
- set_dma_count(devpriv->dma_chan, leftover * sample_size);
- release_dma_lock(flags);
-
- async->events |= COMEDI_CB_BLOCK;
-}
-
static void handle_isa_dma(struct comedi_device *dev)
{
struct labpc_private *devpriv = dev->private;
@@ -1008,12 +954,10 @@ static int labpc_drain_fifo(struct comedi_device *dev)
* when acquisition is terminated by stop_src == TRIG_EXT). */
static void labpc_drain_dregs(struct comedi_device *dev)
{
-#ifdef CONFIG_ISA_DMA_API
struct labpc_private *devpriv = dev->private;
if (devpriv->current_transfer == isa_dma_transfer)
labpc_drain_dma(dev);
-#endif
labpc_drain_fifo(dev);
}
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.c b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
index dba2be3..c4bfecc 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.c
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
@@ -23,6 +23,7 @@
#include <asm/dma.h>
+#include "comedi_fc.h"
#include "ni_labpc.h"
#include "ni_labpc_regs.h"
#include "ni_labpc_isadma.h"
@@ -81,6 +82,61 @@ void labpc_setup_dma(struct comedi_device *dev, struct comedi_subdevice *s)
}
EXPORT_SYMBOL_GPL(labpc_setup_dma);
+void labpc_drain_dma(struct comedi_device *dev)
+{
+ struct labpc_private *devpriv = dev->private;
+ struct comedi_subdevice *s = dev->read_subdev;
+ struct comedi_async *async = s->async;
+ int status;
+ unsigned long flags;
+ unsigned int max_points, num_points, residue, leftover;
+ int i;
+
+ status = devpriv->stat1;
+
+ flags = claim_dma_lock();
+ disable_dma(devpriv->dma_chan);
+ /* clear flip-flop to make sure 2-byte registers for
+ * count and address get set correctly */
+ clear_dma_ff(devpriv->dma_chan);
+
+ /* figure out how many points to read */
+ max_points = devpriv->dma_transfer_size / sample_size;
+ /* residue is the number of points left to be done on the dma
+ * transfer. It should always be zero at this point unless
+ * the stop_src is set to external triggering.
+ */
+ residue = get_dma_residue(devpriv->dma_chan) / sample_size;
+ num_points = max_points - residue;
+ if (devpriv->count < num_points && async->cmd.stop_src == TRIG_COUNT)
+ num_points = devpriv->count;
+
+ /* figure out how many points will be stored next time */
+ leftover = 0;
+ if (async->cmd.stop_src != TRIG_COUNT) {
+ leftover = devpriv->dma_transfer_size / sample_size;
+ } else if (devpriv->count > num_points) {
+ leftover = devpriv->count - num_points;
+ if (leftover > max_points)
+ leftover = max_points;
+ }
+
+ /* write data to comedi buffer */
+ for (i = 0; i < num_points; i++)
+ cfc_write_to_buffer(s, devpriv->dma_buffer[i]);
+
+ if (async->cmd.stop_src == TRIG_COUNT)
+ devpriv->count -= num_points;
+
+ /* set address and count for next transfer */
+ set_dma_addr(devpriv->dma_chan, devpriv->dma_addr);
+ set_dma_count(devpriv->dma_chan, leftover * sample_size);
+ release_dma_lock(flags);
+
+ async->events |= COMEDI_CB_BLOCK;
+}
+EXPORT_SYMBOL_GPL(labpc_drain_dma);
+
int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan)
{
struct labpc_private *devpriv = dev->private;
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.h b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
index c721f57..1f322f2 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.h
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
@@ -19,6 +19,7 @@ static inline bool labpc_have_dma_chan(struct comedi_device *dev)
int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan);
void labpc_free_dma_chan(struct comedi_device *dev);
void labpc_setup_dma(struct comedi_device *dev, struct comedi_subdevice *s);
+void labpc_drain_dma(struct comedi_device *dev);
#else
@@ -42,6 +43,10 @@ static inline void labpc_setup_dma(struct comedi_device *dev,
{
}
+static inline void labpc_drain_dma(struct comedi_device *dev)
+{
+}
+
#endif
#endif /* _NI_LABPC_ISADMA_H */
--
1.8.2.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 10/12] staging: comedi: ni_labpc: migrate DMA status handling
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (8 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 09/12] staging: comedi: ni_labpc: migrate labpc_drain_dma() Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 11/12] staging: comedi: ni_labpc: tidy up after DMA code migration Ian Abbott
2013-06-28 16:09 ` [PATCH 12/12] staging: comedi: COMEDI_NI_LABPC_ISA no longer depends on VIRT_TO_BUS Ian Abbott
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
Migrate the code for checking and handling the interrupt status handling
for ISA DMA transfers into new a new function
`labpc_handle_dma_status()` in the "ni_labpc_isadma" module. Provide a
dummy inline function in "ni_labpc_isadma.h" if the "ni_labpc_isadma"
module is not being built.
The static function `handle_isa_dma()` also needs to move across to the
new module.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 29 +++---------------------
drivers/staging/comedi/drivers/ni_labpc_isadma.c | 27 ++++++++++++++++++++++
drivers/staging/comedi/drivers/ni_labpc_isadma.h | 5 ++++
3 files changed, 35 insertions(+), 26 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index fc2dfea..2f6c430e 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -904,20 +904,6 @@ static int labpc_ai_cmd(struct comedi_device *dev, struct comedi_subdevice *s)
return 0;
}
-#ifdef CONFIG_ISA_DMA_API
-static void handle_isa_dma(struct comedi_device *dev)
-{
- struct labpc_private *devpriv = dev->private;
-
- labpc_drain_dma(dev);
-
- enable_dma(devpriv->dma_chan);
-
- /* clear dma tc interrupt */
- devpriv->write_byte(0x1, dev->iobase + DMATC_CLEAR_REG);
-}
-#endif
-
/* read all available samples from ai fifo */
static int labpc_drain_fifo(struct comedi_device *dev)
{
@@ -1002,18 +988,9 @@ static irqreturn_t labpc_interrupt(int irq, void *d)
return IRQ_HANDLED;
}
-#ifdef CONFIG_ISA_DMA_API
- if (devpriv->current_transfer == isa_dma_transfer) {
- /*
- * if a dma terminal count of external stop trigger
- * has occurred
- */
- if (devpriv->stat1 & STAT1_GATA0 ||
- (board->is_labpc1200 && devpriv->stat2 & STAT2_OUTA1)) {
- handle_isa_dma(dev);
- }
- } else
-#endif
+ if (devpriv->current_transfer == isa_dma_transfer)
+ labpc_handle_dma_status(dev);
+ else
labpc_drain_fifo(dev);
if (devpriv->stat1 & STAT1_CNTINT) {
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.c b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
index c4bfecc..2149596 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.c
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.c
@@ -137,6 +137,33 @@ void labpc_drain_dma(struct comedi_device *dev)
}
EXPORT_SYMBOL_GPL(labpc_drain_dma);
+static void handle_isa_dma(struct comedi_device *dev)
+{
+ struct labpc_private *devpriv = dev->private;
+
+ labpc_drain_dma(dev);
+
+ enable_dma(devpriv->dma_chan);
+
+ /* clear dma tc interrupt */
+ devpriv->write_byte(0x1, dev->iobase + DMATC_CLEAR_REG);
+}
+
+void labpc_handle_dma_status(struct comedi_device *dev)
+{
+ const struct labpc_boardinfo *board = comedi_board(dev);
+ struct labpc_private *devpriv = dev->private;
+
+ /*
+ * if a dma terminal count of external stop trigger
+ * has occurred
+ */
+ if (devpriv->stat1 & STAT1_GATA0 ||
+ (board->is_labpc1200 && devpriv->stat2 & STAT2_OUTA1))
+ handle_isa_dma(dev);
+}
+EXPORT_SYMBOL_GPL(labpc_handle_dma_status);
+
int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan)
{
struct labpc_private *devpriv = dev->private;
diff --git a/drivers/staging/comedi/drivers/ni_labpc_isadma.h b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
index 1f322f2..771af4b 100644
--- a/drivers/staging/comedi/drivers/ni_labpc_isadma.h
+++ b/drivers/staging/comedi/drivers/ni_labpc_isadma.h
@@ -20,6 +20,7 @@ int labpc_init_dma_chan(struct comedi_device *dev, unsigned int dma_chan);
void labpc_free_dma_chan(struct comedi_device *dev);
void labpc_setup_dma(struct comedi_device *dev, struct comedi_subdevice *s);
void labpc_drain_dma(struct comedi_device *dev);
+void labpc_handle_dma_status(struct comedi_device *dev);
#else
@@ -47,6 +48,10 @@ static inline void labpc_drain_dma(struct comedi_device *dev)
{
}
+static inline void labpc_handle_dma_status(struct comedi_device *dev)
+{
+}
+
#endif
#endif /* _NI_LABPC_ISADMA_H */
--
1.8.2.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 11/12] staging: comedi: ni_labpc: tidy up after DMA code migration
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (9 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 10/12] staging: comedi: ni_labpc: migrate DMA status handling Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
2013-06-28 16:09 ` [PATCH 12/12] staging: comedi: COMEDI_NI_LABPC_ISA no longer depends on VIRT_TO_BUS Ian Abbott
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
After migrating the ISA DMA handling code to the "ni_labpc_isadma"
module, get rid of an unneeded `#include` and a couple of unused
static variables.
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/drivers/ni_labpc.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/staging/comedi/drivers/ni_labpc.c b/drivers/staging/comedi/drivers/ni_labpc.c
index 2f6c430e..6a35ec0a 100644
--- a/drivers/staging/comedi/drivers/ni_labpc.c
+++ b/drivers/staging/comedi/drivers/ni_labpc.c
@@ -64,8 +64,6 @@
#include "../comedidev.h"
-#include <asm/dma.h>
-
#include "8253.h"
#include "8255.h"
#include "comedi_fc.h"
@@ -174,11 +172,6 @@ static const struct labpc_boardinfo labpc_boards[] = {
};
#endif
-/* size in bytes of dma buffer */
-static const int dma_buffer_size = 0xff00;
-/* 2 bytes per sample */
-static const int sample_size = 2;
-
static int labpc_counter_load(struct comedi_device *dev,
unsigned long base_address,
unsigned int counter_number,
--
1.8.2.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 12/12] staging: comedi: COMEDI_NI_LABPC_ISA no longer depends on VIRT_TO_BUS
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
` (10 preceding siblings ...)
2013-06-28 16:09 ` [PATCH 11/12] staging: comedi: ni_labpc: tidy up after DMA code migration Ian Abbott
@ 2013-06-28 16:09 ` Ian Abbott
11 siblings, 0 replies; 13+ messages in thread
From: Ian Abbott @ 2013-06-28 16:09 UTC (permalink / raw)
To: driverdev-devel
Cc: Greg Kroah-Hartman, Ian Abbott, Bernd Porr, H Hartley Sweeten
After migrating ISA DMA support from the "ni_labpc" module to the new
"ni_labpc_isadma" module, the `COMEDI_NI_LABPC_ISA` configuration option
no longer depends on `VIRT_TO_BUS`, so remove the dependency.
(The new `COMEDI_NI_LABPC_ISADMA` option does depend on `VIRT_TO_BUS`
but is not configured manually and is only selected automatically if the
`VIRT_TO_BUS` and `ISA_DMA_API` options are set.)
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
---
drivers/staging/comedi/Kconfig | 1 -
1 file changed, 1 deletion(-)
diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig
index faecf67..620100b 100644
--- a/drivers/staging/comedi/Kconfig
+++ b/drivers/staging/comedi/Kconfig
@@ -474,7 +474,6 @@ config COMEDI_NI_LABPC_ISA
tristate "NI Lab-PC and compatibles ISA support"
select COMEDI_NI_LABPC
select COMEDI_NI_LABPC_ISADMA if ISA_DMA_API && VIRT_TO_BUS
- depends on VIRT_TO_BUS
---help---
Enable support for National Instruments Lab-PC and compatibles
Lab-PC-1200, Lab-PC-1200AI, Lab-PC+.
--
1.8.2.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2013-06-28 16:09 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-06-28 16:09 [PATCH 00/12] staging: comedi: ni_labpc: split out ISA DMA support Ian Abbott
2013-06-28 16:09 ` [PATCH 01/12] staging: comedi: ni_labpc: fix possible double-free of dma_buffer Ian Abbott
2013-06-28 16:09 ` [PATCH 02/12] staging: comedi: ni_labpc: don't clear cmd3 bits explicitly in labpc_ai_cmd() Ian Abbott
2013-06-28 16:09 ` [PATCH 03/12] staging: comedi: ni_labpc_isadma: new module for ISA DMA support Ian Abbott
2013-06-28 16:09 ` [PATCH 04/12] staging: comedi: ni_labpc: migrate DMA channel init & free Ian Abbott
2013-06-28 16:09 ` [PATCH 05/12] staging: comedi: ni_labpc_isadma: add labpc_have_dma_chan() Ian Abbott
2013-06-28 16:09 ` [PATCH 06/12] staging: comedi: ni_labpc: use labpc_have_dma_chan() Ian Abbott
2013-06-28 16:09 ` [PATCH 07/12] staging: comedi: ni_labpc: move register defs to new file Ian Abbott
2013-06-28 16:09 ` [PATCH 08/12] staging: comedi: ni_labpc: migrate DMA transfer set-up Ian Abbott
2013-06-28 16:09 ` [PATCH 09/12] staging: comedi: ni_labpc: migrate labpc_drain_dma() Ian Abbott
2013-06-28 16:09 ` [PATCH 10/12] staging: comedi: ni_labpc: migrate DMA status handling Ian Abbott
2013-06-28 16:09 ` [PATCH 11/12] staging: comedi: ni_labpc: tidy up after DMA code migration Ian Abbott
2013-06-28 16:09 ` [PATCH 12/12] staging: comedi: COMEDI_NI_LABPC_ISA no longer depends on VIRT_TO_BUS Ian Abbott
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.