Commit b965b77f authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: ni_65xx: remove COMEDI_MITE and HAS_DMA dependancy

The mite module provides the DMA interface for the PCI MITE ASIC used on
many National Instruments DAQ boards. This driver does not use DMA and only
depends on the mite module to initialize the MITE ASIC.

Handle the initialization localy and remove the unnecessary dependancies.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 319a883b
......@@ -1014,8 +1014,6 @@ config COMEDI_NI_6527
config COMEDI_NI_65XX
tristate "NI 65xx static dio PCI card support"
depends on HAS_DMA
select COMEDI_MITE
---help---
Enable support for National Instruments 65xx static dio boards.
Supported devices: National Instruments PCI-6509 (ni_65xx),
......
......@@ -50,7 +50,6 @@ except maybe the 6514.
#include "../comedidev.h"
#include "comedi_fc.h"
#include "mite.h"
#define NI6514_DIO_SIZE 4096
#define NI6514_MITE_SIZE 4096
......@@ -261,7 +260,7 @@ static inline unsigned ni_65xx_total_num_ports(const struct ni_65xx_board
}
struct ni_65xx_private {
struct mite_struct *mite;
void __iomem *mmio;
unsigned int filter_interval;
unsigned short filter_enable[NI_65XX_MAX_NUM_PORTS];
unsigned short output_bits[NI_65XX_MAX_NUM_PORTS];
......@@ -300,9 +299,7 @@ static int ni_65xx_config_filter(struct comedi_device *dev,
data[1] = interval * filter_resolution_ns;
if (interval != devpriv->filter_interval) {
writeb(interval,
devpriv->mite->daq_io_addr +
Filter_Interval);
writeb(interval, devpriv->mmio + Filter_Interval);
devpriv->filter_interval = interval;
}
......@@ -314,7 +311,7 @@ static int ni_65xx_config_filter(struct comedi_device *dev,
}
writeb(devpriv->filter_enable[port],
devpriv->mite->daq_io_addr + Filter_Enable(port));
devpriv->mmio + Filter_Enable(port));
return 2;
}
......@@ -338,14 +335,14 @@ static int ni_65xx_dio_insn_config(struct comedi_device *dev,
if (s->type != COMEDI_SUBD_DIO)
return -EINVAL;
devpriv->dio_direction[port] = COMEDI_OUTPUT;
writeb(0, devpriv->mite->daq_io_addr + Port_Select(port));
writeb(0, devpriv->mmio + Port_Select(port));
return 1;
break;
case INSN_CONFIG_DIO_INPUT:
if (s->type != COMEDI_SUBD_DIO)
return -EINVAL;
devpriv->dio_direction[port] = COMEDI_INPUT;
writeb(1, devpriv->mite->daq_io_addr + Port_Select(port));
writeb(1, devpriv->mmio + Port_Select(port));
return 1;
break;
case INSN_CONFIG_DIO_QUERY:
......@@ -400,12 +397,9 @@ static int ni_65xx_dio_insn_bits(struct comedi_device *dev,
bits = devpriv->output_bits[port];
if (board->invert_outputs)
bits = ~bits;
writeb(bits,
devpriv->mite->daq_io_addr +
Port_Data(port));
writeb(bits, devpriv->mmio + Port_Data(port));
}
port_read_bits =
readb(devpriv->mite->daq_io_addr + Port_Data(port));
port_read_bits = readb(devpriv->mmio + Port_Data(port));
if (s->type == COMEDI_SUBD_DO && board->invert_outputs) {
/* Outputs inverted, so invert value read back from
* DO subdevice. (Does not apply to boards with DIO
......@@ -430,14 +424,13 @@ static irqreturn_t ni_65xx_interrupt(int irq, void *d)
struct comedi_subdevice *s = dev->read_subdev;
unsigned int status;
status = readb(devpriv->mite->daq_io_addr + Change_Status);
status = readb(devpriv->mmio + Change_Status);
if ((status & MasterInterruptStatus) == 0)
return IRQ_NONE;
if ((status & EdgeStatus) == 0)
return IRQ_NONE;
writeb(ClrEdge | ClrOverflow,
devpriv->mite->daq_io_addr + Clear_Register);
writeb(ClrEdge | ClrOverflow, devpriv->mmio + Clear_Register);
comedi_buf_put(s, 0);
s->async->events |= COMEDI_CB_EOS;
......@@ -492,11 +485,10 @@ static int ni_65xx_intr_cmd(struct comedi_device *dev,
{
struct ni_65xx_private *devpriv = dev->private;
writeb(ClrEdge | ClrOverflow,
devpriv->mite->daq_io_addr + Clear_Register);
writeb(ClrEdge | ClrOverflow, devpriv->mmio + Clear_Register);
writeb(FallingEdgeIntEnable | RisingEdgeIntEnable |
MasterInterruptEnable | EdgeIntEnable,
devpriv->mite->daq_io_addr + Master_Interrupt_Control);
devpriv->mmio + Master_Interrupt_Control);
return 0;
}
......@@ -506,7 +498,7 @@ static int ni_65xx_intr_cancel(struct comedi_device *dev,
{
struct ni_65xx_private *devpriv = dev->private;
writeb(0x00, devpriv->mite->daq_io_addr + Master_Interrupt_Control);
writeb(0x00, devpriv->mmio + Master_Interrupt_Control);
return 0;
}
......@@ -531,35 +523,48 @@ static int ni_65xx_intr_insn_config(struct comedi_device *dev,
if (data[0] != INSN_CONFIG_CHANGE_NOTIFY)
return -EINVAL;
writeb(data[1],
devpriv->mite->daq_io_addr +
Rising_Edge_Detection_Enable(0));
writeb(data[1], devpriv->mmio + Rising_Edge_Detection_Enable(0));
writeb(data[1] >> 8,
devpriv->mite->daq_io_addr +
Rising_Edge_Detection_Enable(0x10));
devpriv->mmio + Rising_Edge_Detection_Enable(0x10));
writeb(data[1] >> 16,
devpriv->mite->daq_io_addr +
Rising_Edge_Detection_Enable(0x20));
devpriv->mmio + Rising_Edge_Detection_Enable(0x20));
writeb(data[1] >> 24,
devpriv->mite->daq_io_addr +
Rising_Edge_Detection_Enable(0x30));
devpriv->mmio + Rising_Edge_Detection_Enable(0x30));
writeb(data[2],
devpriv->mite->daq_io_addr +
Falling_Edge_Detection_Enable(0));
writeb(data[2], devpriv->mmio + Falling_Edge_Detection_Enable(0));
writeb(data[2] >> 8,
devpriv->mite->daq_io_addr +
Falling_Edge_Detection_Enable(0x10));
devpriv->mmio + Falling_Edge_Detection_Enable(0x10));
writeb(data[2] >> 16,
devpriv->mite->daq_io_addr +
Falling_Edge_Detection_Enable(0x20));
devpriv->mmio + Falling_Edge_Detection_Enable(0x20));
writeb(data[2] >> 24,
devpriv->mite->daq_io_addr +
Falling_Edge_Detection_Enable(0x30));
devpriv->mmio + Falling_Edge_Detection_Enable(0x30));
return 2;
}
/* ripped from mite.h and mite_setup2() to avoid mite dependancy */
#define MITE_IODWBSR 0xc0 /* IO Device Window Base Size Register */
#define WENAB (1 << 7) /* window enable */
static int ni_65xx_mite_init(struct pci_dev *pcidev)
{
void __iomem *mite_base;
u32 main_phys_addr;
/* ioremap the MITE registers (BAR 0) temporarily */
mite_base = pci_ioremap_bar(pcidev, 0);
if (!mite_base)
return -ENOMEM;
/* set data window to main registers (BAR 1) */
main_phys_addr = pci_resource_start(pcidev, 1);
writel(main_phys_addr | WENAB, mite_base + MITE_IODWBSR);
/* finished with MITE registers */
iounmap(mite_base);
return 0;
}
static int ni_65xx_auto_attach(struct comedi_device *dev,
unsigned long context)
{
......@@ -586,19 +591,17 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
if (!devpriv)
return -ENOMEM;
devpriv->mite = mite_alloc(pcidev);
if (!devpriv->mite)
return -ENOMEM;
ret = mite_setup(devpriv->mite);
if (ret < 0) {
dev_warn(dev->class_dev, "error setting up mite\n");
ret = ni_65xx_mite_init(pcidev);
if (ret)
return ret;
}
devpriv->mmio = pci_ioremap_bar(pcidev, 1);
if (!devpriv->mmio)
return -ENOMEM;
dev->irq = pcidev->irq;
dev_info(dev->class_dev, "board: %s, ID=0x%02x", dev->board_name,
readb(devpriv->mite->daq_io_addr + ID_Register));
readb(devpriv->mmio + ID_Register));
ret = comedi_alloc_subdevices(dev, 4);
if (ret)
......@@ -655,9 +658,7 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
spriv->base_port = 0;
for (i = 0; i < board->num_dio_ports; ++i) {
/* configure all ports for input */
writeb(0x1,
devpriv->mite->daq_io_addr +
Port_Select(i));
writeb(0x1, devpriv->mmio + Port_Select(i));
}
} else {
s->type = COMEDI_SUBD_UNUSED;
......@@ -678,22 +679,17 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
s->insn_config = ni_65xx_intr_insn_config;
for (i = 0; i < ni_65xx_total_num_ports(board); ++i) {
writeb(0x00,
devpriv->mite->daq_io_addr + Filter_Enable(i));
writeb(0x00, devpriv->mmio + Filter_Enable(i));
if (board->invert_outputs)
writeb(0x01,
devpriv->mite->daq_io_addr + Port_Data(i));
writeb(0x01, devpriv->mmio + Port_Data(i));
else
writeb(0x00,
devpriv->mite->daq_io_addr + Port_Data(i));
writeb(0x00, devpriv->mmio + Port_Data(i));
}
writeb(ClrEdge | ClrOverflow,
devpriv->mite->daq_io_addr + Clear_Register);
writeb(0x00,
devpriv->mite->daq_io_addr + Master_Interrupt_Control);
writeb(ClrEdge | ClrOverflow, devpriv->mmio + Clear_Register);
writeb(0x00, devpriv->mmio + Master_Interrupt_Control);
/* Set filter interval to 0 (32bit reg) */
writeb(0x00000000, devpriv->mite->daq_io_addr + Filter_Interval);
writeb(0x00000000, devpriv->mmio + Filter_Interval);
ret = request_irq(dev->irq, ni_65xx_interrupt, IRQF_SHARED,
"ni_65xx", dev);
......@@ -709,15 +705,12 @@ static void ni_65xx_detach(struct comedi_device *dev)
{
struct ni_65xx_private *devpriv = dev->private;
if (devpriv && devpriv->mite && devpriv->mite->daq_io_addr) {
writeb(0x00,
devpriv->mite->daq_io_addr +
Master_Interrupt_Control);
if (devpriv && devpriv->mmio) {
writeb(0x00, devpriv->mmio + Master_Interrupt_Control);
iounmap(devpriv->mmio);
}
if (dev->irq)
free_irq(dev->irq, dev);
if (devpriv)
mite_detach(devpriv->mite);
comedi_pci_disable(dev);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment