mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
staging: comedi: amplc_dio200: Simplify PCI board look-up
Set the `driver_data` member of each element (apart from the sentinel) of our PCI device table `dio200_pci_table[]` to the index of the corresponding element of our private PCI board details `dio200_pci_boards[]`. This index appears in the context parameter of our auto_attach routine `dio200_auto_attach()`. In this function, nename the parameter to `context_model` and use it to set `dev->board_ptr` to point to an element of `dio200_pci_boards[] directly by index instead of calling `dio200_find_pci_board()` to search for the element whose `devid` member matches the PCI device ID. Remove `dio200_find_pci_board()` and the `devid` member of `struct dio200_board`. Also remove the `model` member of `struct dio200_board` and the `enum dio200_model` type as we can do without them. The only function that uses the `model` member is `dio200_auto_attach()`, so use the `context_model` parameter instead. Define the enumerated value for each PCI board in new type `enum dio200_pci_model` which replaces `enum dio200_model` minus the enumerated values for the ISA boards (so the numeric values for the PCI boards have changed). Use these enumerated values to designate the initializer for each element of `dio200_pci_boards[]`. Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
3c6b670d4f
commit
470cf7261a
@ -378,14 +378,12 @@ struct dio200_region {
|
|||||||
|
|
||||||
enum dio200_bustype { isa_bustype, pci_bustype };
|
enum dio200_bustype { isa_bustype, pci_bustype };
|
||||||
|
|
||||||
enum dio200_model {
|
enum dio200_pci_model {
|
||||||
pc212e_model,
|
pci215_model,
|
||||||
pc214e_model,
|
pci272_model,
|
||||||
pc215e_model, pci215_model, pcie215_model,
|
pcie215_model,
|
||||||
pc218e_model,
|
|
||||||
pcie236_model,
|
pcie236_model,
|
||||||
pc272e_model, pci272_model,
|
pcie296_model
|
||||||
pcie296_model,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum dio200_layout_idx {
|
enum dio200_layout_idx {
|
||||||
@ -407,9 +405,7 @@ enum dio200_layout_idx {
|
|||||||
|
|
||||||
struct dio200_board {
|
struct dio200_board {
|
||||||
const char *name;
|
const char *name;
|
||||||
unsigned short devid;
|
|
||||||
enum dio200_bustype bustype;
|
enum dio200_bustype bustype;
|
||||||
enum dio200_model model;
|
|
||||||
enum dio200_layout_idx layout;
|
enum dio200_layout_idx layout;
|
||||||
unsigned char mainbar;
|
unsigned char mainbar;
|
||||||
unsigned char mainshift;
|
unsigned char mainshift;
|
||||||
@ -421,35 +417,30 @@ static const struct dio200_board dio200_isa_boards[] = {
|
|||||||
{
|
{
|
||||||
.name = "pc212e",
|
.name = "pc212e",
|
||||||
.bustype = isa_bustype,
|
.bustype = isa_bustype,
|
||||||
.model = pc212e_model,
|
|
||||||
.layout = pc212_layout,
|
.layout = pc212_layout,
|
||||||
.mainsize = DIO200_IO_SIZE,
|
.mainsize = DIO200_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "pc214e",
|
.name = "pc214e",
|
||||||
.bustype = isa_bustype,
|
.bustype = isa_bustype,
|
||||||
.model = pc214e_model,
|
|
||||||
.layout = pc214_layout,
|
.layout = pc214_layout,
|
||||||
.mainsize = DIO200_IO_SIZE,
|
.mainsize = DIO200_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "pc215e",
|
.name = "pc215e",
|
||||||
.bustype = isa_bustype,
|
.bustype = isa_bustype,
|
||||||
.model = pc215e_model,
|
|
||||||
.layout = pc215_layout,
|
.layout = pc215_layout,
|
||||||
.mainsize = DIO200_IO_SIZE,
|
.mainsize = DIO200_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "pc218e",
|
.name = "pc218e",
|
||||||
.bustype = isa_bustype,
|
.bustype = isa_bustype,
|
||||||
.model = pc218e_model,
|
|
||||||
.layout = pc218_layout,
|
.layout = pc218_layout,
|
||||||
.mainsize = DIO200_IO_SIZE,
|
.mainsize = DIO200_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "pc272e",
|
.name = "pc272e",
|
||||||
.bustype = isa_bustype,
|
.bustype = isa_bustype,
|
||||||
.model = pc272e_model,
|
|
||||||
.layout = pc272_layout,
|
.layout = pc272_layout,
|
||||||
.mainsize = DIO200_IO_SIZE,
|
.mainsize = DIO200_IO_SIZE,
|
||||||
},
|
},
|
||||||
@ -458,49 +449,39 @@ static const struct dio200_board dio200_isa_boards[] = {
|
|||||||
|
|
||||||
#if DO_PCI
|
#if DO_PCI
|
||||||
static const struct dio200_board dio200_pci_boards[] = {
|
static const struct dio200_board dio200_pci_boards[] = {
|
||||||
{
|
[pci215_model] {
|
||||||
.name = "pci215",
|
.name = "pci215",
|
||||||
.devid = PCI_DEVICE_ID_AMPLICON_PCI215,
|
|
||||||
.bustype = pci_bustype,
|
.bustype = pci_bustype,
|
||||||
.model = pci215_model,
|
|
||||||
.layout = pc215_layout,
|
.layout = pc215_layout,
|
||||||
.mainbar = 2,
|
.mainbar = 2,
|
||||||
.mainsize = DIO200_IO_SIZE,
|
.mainsize = DIO200_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
[pci272_model] {
|
||||||
.name = "pci272",
|
.name = "pci272",
|
||||||
.devid = PCI_DEVICE_ID_AMPLICON_PCI272,
|
|
||||||
.bustype = pci_bustype,
|
.bustype = pci_bustype,
|
||||||
.model = pci272_model,
|
|
||||||
.layout = pc272_layout,
|
.layout = pc272_layout,
|
||||||
.mainbar = 2,
|
.mainbar = 2,
|
||||||
.mainsize = DIO200_IO_SIZE,
|
.mainsize = DIO200_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
[pcie215_model] {
|
||||||
.name = "pcie215",
|
.name = "pcie215",
|
||||||
.devid = PCI_DEVICE_ID_AMPLICON_PCIE215,
|
|
||||||
.bustype = pci_bustype,
|
.bustype = pci_bustype,
|
||||||
.model = pcie215_model,
|
|
||||||
.layout = pcie215_layout,
|
.layout = pcie215_layout,
|
||||||
.mainbar = 1,
|
.mainbar = 1,
|
||||||
.mainshift = 3,
|
.mainshift = 3,
|
||||||
.mainsize = DIO200_PCIE_IO_SIZE,
|
.mainsize = DIO200_PCIE_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
[pcie236_model] {
|
||||||
.name = "pcie236",
|
.name = "pcie236",
|
||||||
.devid = PCI_DEVICE_ID_AMPLICON_PCIE236,
|
|
||||||
.bustype = pci_bustype,
|
.bustype = pci_bustype,
|
||||||
.model = pcie236_model,
|
|
||||||
.layout = pcie236_layout,
|
.layout = pcie236_layout,
|
||||||
.mainbar = 1,
|
.mainbar = 1,
|
||||||
.mainshift = 3,
|
.mainshift = 3,
|
||||||
.mainsize = DIO200_PCIE_IO_SIZE,
|
.mainsize = DIO200_PCIE_IO_SIZE,
|
||||||
},
|
},
|
||||||
{
|
[pcie296_model] {
|
||||||
.name = "pcie296",
|
.name = "pcie296",
|
||||||
.devid = PCI_DEVICE_ID_AMPLICON_PCIE296,
|
|
||||||
.bustype = pci_bustype,
|
.bustype = pci_bustype,
|
||||||
.model = pcie296_model,
|
|
||||||
.layout = pcie296_layout,
|
.layout = pcie296_layout,
|
||||||
.mainbar = 1,
|
.mainbar = 1,
|
||||||
.mainshift = 3,
|
.mainshift = 3,
|
||||||
@ -732,20 +713,6 @@ static void dio200_write32(struct comedi_device *dev, unsigned int offset,
|
|||||||
writel(val, devpriv->io.u.membase + offset);
|
writel(val, devpriv->io.u.membase + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* This function looks for a board matching the supplied PCI device.
|
|
||||||
*/
|
|
||||||
static const struct dio200_board *
|
|
||||||
dio200_find_pci_board(struct pci_dev *pci_dev)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(dio200_pci_boards); i++)
|
|
||||||
if (pci_dev->device == dio200_pci_boards[i].devid)
|
|
||||||
return &dio200_pci_boards[i];
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function checks and requests an I/O region, reporting an error
|
* This function checks and requests an I/O region, reporting an error
|
||||||
* if there is a conflict.
|
* if there is a conflict.
|
||||||
@ -1908,13 +1875,13 @@ static int dio200_attach(struct comedi_device *dev, struct comedi_devconfig *it)
|
|||||||
/*
|
/*
|
||||||
* The auto_attach hook is called at PCI probe time via
|
* The auto_attach hook is called at PCI probe time via
|
||||||
* comedi_pci_auto_config(). dev->board_ptr is NULL on entry.
|
* comedi_pci_auto_config(). dev->board_ptr is NULL on entry.
|
||||||
* There should be a board entry matching the supplied PCI device.
|
* The context should be an index into dio200_pci_boards[].
|
||||||
*/
|
*/
|
||||||
static int dio200_auto_attach(struct comedi_device *dev,
|
static int dio200_auto_attach(struct comedi_device *dev,
|
||||||
unsigned long context_unused)
|
unsigned long context_model)
|
||||||
{
|
{
|
||||||
struct pci_dev *pci_dev = comedi_to_pci_dev(dev);
|
struct pci_dev *pci_dev = comedi_to_pci_dev(dev);
|
||||||
const struct dio200_board *thisboard;
|
const struct dio200_board *thisboard = NULL;
|
||||||
struct dio200_private *devpriv;
|
struct dio200_private *devpriv;
|
||||||
resource_size_t base, len;
|
resource_size_t base, len;
|
||||||
unsigned int bar;
|
unsigned int bar;
|
||||||
@ -1923,6 +1890,13 @@ static int dio200_auto_attach(struct comedi_device *dev,
|
|||||||
if (!DO_PCI)
|
if (!DO_PCI)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (context_model < ARRAY_SIZE(dio200_pci_boards))
|
||||||
|
thisboard = &dio200_pci_boards[context_model];
|
||||||
|
if (!thisboard)
|
||||||
|
return -EINVAL;
|
||||||
|
dev->board_ptr = thisboard;
|
||||||
|
dev->board_name = thisboard->name;
|
||||||
|
|
||||||
dev_info(dev->class_dev, DIO200_DRIVER_NAME ": attach pci %s\n",
|
dev_info(dev->class_dev, DIO200_DRIVER_NAME ": attach pci %s\n",
|
||||||
pci_name(pci_dev));
|
pci_name(pci_dev));
|
||||||
|
|
||||||
@ -1931,13 +1905,6 @@ static int dio200_auto_attach(struct comedi_device *dev,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
dev->private = devpriv;
|
dev->private = devpriv;
|
||||||
|
|
||||||
dev->board_ptr = dio200_find_pci_board(pci_dev);
|
|
||||||
if (dev->board_ptr == NULL) {
|
|
||||||
dev_err(dev->class_dev, "BUG! cannot determine board type!\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
thisboard = comedi_board(dev);
|
|
||||||
|
|
||||||
ret = comedi_pci_enable(dev);
|
ret = comedi_pci_enable(dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
@ -1961,7 +1928,7 @@ static int dio200_auto_attach(struct comedi_device *dev,
|
|||||||
devpriv->io.u.iobase = (unsigned long)base;
|
devpriv->io.u.iobase = (unsigned long)base;
|
||||||
devpriv->io.regtype = io_regtype;
|
devpriv->io.regtype = io_regtype;
|
||||||
}
|
}
|
||||||
switch (thisboard->model) {
|
switch (context_model) {
|
||||||
case pcie215_model:
|
case pcie215_model:
|
||||||
case pcie236_model:
|
case pcie236_model:
|
||||||
case pcie296_model:
|
case pcie296_model:
|
||||||
@ -2042,11 +2009,22 @@ static struct comedi_driver amplc_dio200_driver = {
|
|||||||
|
|
||||||
#if DO_PCI
|
#if DO_PCI
|
||||||
static DEFINE_PCI_DEVICE_TABLE(dio200_pci_table) = {
|
static DEFINE_PCI_DEVICE_TABLE(dio200_pci_table) = {
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMPLICON, PCI_DEVICE_ID_AMPLICON_PCI215) },
|
{
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMPLICON, PCI_DEVICE_ID_AMPLICON_PCI272) },
|
PCI_VDEVICE(AMPLICON, PCI_DEVICE_ID_AMPLICON_PCI215),
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMPLICON, PCI_DEVICE_ID_AMPLICON_PCIE236) },
|
pci215_model
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMPLICON, PCI_DEVICE_ID_AMPLICON_PCIE215) },
|
}, {
|
||||||
{ PCI_DEVICE(PCI_VENDOR_ID_AMPLICON, PCI_DEVICE_ID_AMPLICON_PCIE296) },
|
PCI_VDEVICE(AMPLICON, PCI_DEVICE_ID_AMPLICON_PCI272),
|
||||||
|
pci272_model
|
||||||
|
}, {
|
||||||
|
PCI_VDEVICE(AMPLICON, PCI_DEVICE_ID_AMPLICON_PCIE236),
|
||||||
|
pcie236_model
|
||||||
|
}, {
|
||||||
|
PCI_VDEVICE(AMPLICON, PCI_DEVICE_ID_AMPLICON_PCIE215),
|
||||||
|
pcie215_model
|
||||||
|
}, {
|
||||||
|
PCI_VDEVICE(AMPLICON, PCI_DEVICE_ID_AMPLICON_PCIE296),
|
||||||
|
pcie296_model
|
||||||
|
},
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user