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

staging: comedi: ni_65xx: use the pci id_table 'driver_data'

Create an enum to the boardinfo and pass that enum in the pci_driver
id_table as the driver_data.

Change the macro used to fill in the device table from PCI_DEVICE() to
PCI_VDEVICE(). This allows passing the enum as the next field.

This allows removing the 'dev_id' data from the boardinfo as well the
search function that was used to locate the boardinfo for the PCI device.

Since we now have a local variable in the attach that has the boardinfo
pointer, use that instead of calling the local board() helper function
each time the boardinfo is accessed.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a2fa439d
......@@ -112,8 +112,32 @@ static inline unsigned Filter_Enable(unsigned port)
#define OverflowIntEnable 0x02
#define EdgeIntEnable 0x01
enum ni_65xx_boardid {
BOARD_PCI6509,
BOARD_PXI6509,
BOARD_PCI6510,
BOARD_PCI6511,
BOARD_PXI6511,
BOARD_PCI6512,
BOARD_PXI6512,
BOARD_PCI6513,
BOARD_PXI6513,
BOARD_PCI6514,
BOARD_PXI6514,
BOARD_PCI6515,
BOARD_PXI6515,
BOARD_PCI6516,
BOARD_PCI6517,
BOARD_PCI6518,
BOARD_PCI6519,
BOARD_PCI6520,
BOARD_PCI6521,
BOARD_PXI6521,
BOARD_PCI6528,
BOARD_PXI6528,
};
struct ni_65xx_board {
int dev_id;
const char *name;
unsigned num_dio_ports;
unsigned num_di_ports;
......@@ -122,118 +146,96 @@ struct ni_65xx_board {
};
static const struct ni_65xx_board ni_65xx_boards[] = {
{
.dev_id = 0x7085,
[BOARD_PCI6509] = {
.name = "pci-6509",
.num_dio_ports = 12,
.invert_outputs = 0},
{
.dev_id = 0x1710,
[BOARD_PXI6509] = {
.name = "pxi-6509",
.num_dio_ports = 12,
.invert_outputs = 0},
{
.dev_id = 0x7124,
[BOARD_PCI6510] = {
.name = "pci-6510",
.num_di_ports = 4},
{
.dev_id = 0x70c3,
[BOARD_PCI6511] = {
.name = "pci-6511",
.num_di_ports = 8},
{
.dev_id = 0x70d3,
[BOARD_PXI6511] = {
.name = "pxi-6511",
.num_di_ports = 8},
{
.dev_id = 0x70cc,
[BOARD_PCI6512] = {
.name = "pci-6512",
.num_do_ports = 8},
{
.dev_id = 0x70d2,
[BOARD_PXI6512] = {
.name = "pxi-6512",
.num_do_ports = 8},
{
.dev_id = 0x70c8,
[BOARD_PCI6513] = {
.name = "pci-6513",
.num_do_ports = 8,
.invert_outputs = 1},
{
.dev_id = 0x70d1,
[BOARD_PXI6513] = {
.name = "pxi-6513",
.num_do_ports = 8,
.invert_outputs = 1},
{
.dev_id = 0x7088,
[BOARD_PCI6514] = {
.name = "pci-6514",
.num_di_ports = 4,
.num_do_ports = 4,
.invert_outputs = 1},
{
.dev_id = 0x70CD,
[BOARD_PXI6514] = {
.name = "pxi-6514",
.num_di_ports = 4,
.num_do_ports = 4,
.invert_outputs = 1},
{
.dev_id = 0x7087,
[BOARD_PCI6515] = {
.name = "pci-6515",
.num_di_ports = 4,
.num_do_ports = 4,
.invert_outputs = 1},
{
.dev_id = 0x70c9,
[BOARD_PXI6515] = {
.name = "pxi-6515",
.num_di_ports = 4,
.num_do_ports = 4,
.invert_outputs = 1},
{
.dev_id = 0x7125,
[BOARD_PCI6516] = {
.name = "pci-6516",
.num_do_ports = 4,
.invert_outputs = 1},
{
.dev_id = 0x7126,
[BOARD_PCI6517] = {
.name = "pci-6517",
.num_do_ports = 4,
.invert_outputs = 1},
{
.dev_id = 0x7127,
[BOARD_PCI6518] = {
.name = "pci-6518",
.num_di_ports = 2,
.num_do_ports = 2,
.invert_outputs = 1},
{
.dev_id = 0x7128,
[BOARD_PCI6519] = {
.name = "pci-6519",
.num_di_ports = 2,
.num_do_ports = 2,
.invert_outputs = 1},
{
.dev_id = 0x71c5,
[BOARD_PCI6520] = {
.name = "pci-6520",
.num_di_ports = 1,
.num_do_ports = 1,
},
{
.dev_id = 0x718b,
[BOARD_PCI6521] = {
.name = "pci-6521",
.num_di_ports = 1,
.num_do_ports = 1,
},
{
.dev_id = 0x718c,
[BOARD_PXI6521] = {
.name = "pxi-6521",
.num_di_ports = 1,
.num_do_ports = 1,
},
{
.dev_id = 0x70a9,
[BOARD_PCI6528] = {
.name = "pci-6528",
.num_di_ports = 3,
.num_do_ports = 3,
},
{
.dev_id = 0x7086,
[BOARD_PXI6528] = {
.name = "pxi-6528",
.num_di_ports = 3,
.num_do_ports = 3,
......@@ -571,38 +573,28 @@ static int ni_65xx_intr_insn_config(struct comedi_device *dev,
return 2;
}
static const struct ni_65xx_board *
ni_65xx_find_boardinfo(struct pci_dev *pcidev)
{
unsigned int dev_id = pcidev->device;
unsigned int n;
for (n = 0; n < ARRAY_SIZE(ni_65xx_boards); n++) {
const struct ni_65xx_board *board = &ni_65xx_boards[n];
if (board->dev_id == dev_id)
return board;
}
return NULL;
}
static int ni_65xx_auto_attach(struct comedi_device *dev,
unsigned long context_unused)
unsigned long context)
{
struct pci_dev *pcidev = comedi_to_pci_dev(dev);
const struct ni_65xx_board *board = NULL;
struct ni_65xx_private *devpriv;
struct comedi_subdevice *s;
unsigned i;
int ret;
if (context < ARRAY_SIZE(ni_65xx_boards))
board = &ni_65xx_boards[context];
if (!board)
return -ENODEV;
dev->board_ptr = board;
dev->board_name = board->name;
devpriv = kzalloc(sizeof(*devpriv), GFP_KERNEL);
if (!devpriv)
return -ENOMEM;
dev->private = devpriv;
dev->board_ptr = ni_65xx_find_boardinfo(pcidev);
if (!dev->board_ptr)
return -ENODEV;
devpriv->mite = mite_alloc(pcidev);
if (!devpriv->mite)
return -ENOMEM;
......@@ -613,7 +605,6 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
return ret;
}
dev->board_name = board(dev)->name;
dev->irq = mite_irq(devpriv->mite);
dev_info(dev->class_dev, "board: %s, ID=0x%02x", dev->board_name,
readb(devpriv->mite->daq_io_addr + ID_Register));
......@@ -623,11 +614,11 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
return ret;
s = &dev->subdevices[0];
if (board(dev)->num_di_ports) {
if (board->num_di_ports) {
s->type = COMEDI_SUBD_DI;
s->subdev_flags = SDF_READABLE;
s->n_chan =
board(dev)->num_di_ports * ni_65xx_channels_per_port;
board->num_di_ports * ni_65xx_channels_per_port;
s->range_table = &range_digital;
s->maxdata = 1;
s->insn_config = ni_65xx_dio_insn_config;
......@@ -641,28 +632,28 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
}
s = &dev->subdevices[1];
if (board(dev)->num_do_ports) {
if (board->num_do_ports) {
s->type = COMEDI_SUBD_DO;
s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
s->n_chan =
board(dev)->num_do_ports * ni_65xx_channels_per_port;
board->num_do_ports * ni_65xx_channels_per_port;
s->range_table = &range_digital;
s->maxdata = 1;
s->insn_bits = ni_65xx_dio_insn_bits;
s->private = ni_65xx_alloc_subdevice_private();
if (s->private == NULL)
return -ENOMEM;
sprivate(s)->base_port = board(dev)->num_di_ports;
sprivate(s)->base_port = board->num_di_ports;
} else {
s->type = COMEDI_SUBD_UNUSED;
}
s = &dev->subdevices[2];
if (board(dev)->num_dio_ports) {
if (board->num_dio_ports) {
s->type = COMEDI_SUBD_DIO;
s->subdev_flags = SDF_READABLE | SDF_WRITABLE;
s->n_chan =
board(dev)->num_dio_ports * ni_65xx_channels_per_port;
board->num_dio_ports * ni_65xx_channels_per_port;
s->range_table = &range_digital;
s->maxdata = 1;
s->insn_config = ni_65xx_dio_insn_config;
......@@ -671,7 +662,7 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
if (s->private == NULL)
return -ENOMEM;
sprivate(s)->base_port = 0;
for (i = 0; i < board(dev)->num_dio_ports; ++i) {
for (i = 0; i < board->num_dio_ports; ++i) {
/* configure all ports for input */
writeb(0x1,
devpriv->mite->daq_io_addr +
......@@ -694,10 +685,10 @@ static int ni_65xx_auto_attach(struct comedi_device *dev,
s->insn_bits = ni_65xx_intr_insn_bits;
s->insn_config = ni_65xx_intr_insn_config;
for (i = 0; i < ni_65xx_total_num_ports(board(dev)); ++i) {
for (i = 0; i < ni_65xx_total_num_ports(board); ++i) {
writeb(0x00,
devpriv->mite->daq_io_addr + Filter_Enable(i));
if (board(dev)->invert_outputs)
if (board->invert_outputs)
writeb(0x01,
devpriv->mite->daq_io_addr + Port_Data(i));
else
......@@ -763,28 +754,28 @@ static int ni_65xx_pci_probe(struct pci_dev *dev,
}
static DEFINE_PCI_DEVICE_TABLE(ni_65xx_pci_table) = {
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x1710) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7085) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7086) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7087) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7088) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70a9) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70c3) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70c8) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70c9) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70cc) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70CD) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70d1) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70d2) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x70d3) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7124) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7125) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7126) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7127) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x7128) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x718b) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x718c) },
{ PCI_DEVICE(PCI_VENDOR_ID_NI, 0x71c5) },
{ PCI_VDEVICE(NI, 0x1710), BOARD_PXI6509 },
{ PCI_VDEVICE(NI, 0x7085), BOARD_PCI6509 },
{ PCI_VDEVICE(NI, 0x7086), BOARD_PXI6528 },
{ PCI_VDEVICE(NI, 0x7087), BOARD_PCI6515 },
{ PCI_VDEVICE(NI, 0x7088), BOARD_PCI6514 },
{ PCI_VDEVICE(NI, 0x70a9), BOARD_PCI6528 },
{ PCI_VDEVICE(NI, 0x70c3), BOARD_PCI6511 },
{ PCI_VDEVICE(NI, 0x70c8), BOARD_PCI6513 },
{ PCI_VDEVICE(NI, 0x70c9), BOARD_PXI6515 },
{ PCI_VDEVICE(NI, 0x70cc), BOARD_PCI6512 },
{ PCI_VDEVICE(NI, 0x70cd), BOARD_PXI6514 },
{ PCI_VDEVICE(NI, 0x70d1), BOARD_PXI6513 },
{ PCI_VDEVICE(NI, 0x70d2), BOARD_PXI6512 },
{ PCI_VDEVICE(NI, 0x70d3), BOARD_PXI6511 },
{ PCI_VDEVICE(NI, 0x7124), BOARD_PCI6510 },
{ PCI_VDEVICE(NI, 0x7125), BOARD_PCI6516 },
{ PCI_VDEVICE(NI, 0x7126), BOARD_PCI6517 },
{ PCI_VDEVICE(NI, 0x7127), BOARD_PCI6518 },
{ PCI_VDEVICE(NI, 0x7128), BOARD_PCI6519 },
{ PCI_VDEVICE(NI, 0x718b), BOARD_PCI6521 },
{ PCI_VDEVICE(NI, 0x718c), BOARD_PXI6521 },
{ PCI_VDEVICE(NI, 0x71c5), BOARD_PCI6520 },
{ 0 }
};
MODULE_DEVICE_TABLE(pci, ni_65xx_pci_table);
......
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