diff --git a/drivers/staging/comedi/drivers/me_daq.c b/drivers/staging/comedi/drivers/me_daq.c index eeb493d12a05..2ce0b14af589 100644 --- a/drivers/staging/comedi/drivers/me_daq.c +++ b/drivers/staging/comedi/drivers/me_daq.c @@ -50,8 +50,6 @@ Configuration options: #define ME2600_FIRMWARE "me2600_firmware.bin" -#define ME_DRIVER_NAME "me_daq" - #define PCI_VENDOR_ID_MEILHAUS 0x1402 #define ME2000_DEVICE_ID 0x2000 #define ME2600_DEVICE_ID 0x2600 @@ -192,8 +190,7 @@ struct me_board { static const struct me_board me_boards[] = { { - /* -- ME-2600i -- */ - .name = ME_DRIVER_NAME, + .name = "me-2600i", .device_id = ME2600_DEVICE_ID, /* Analog Output */ .ao_channel_nbr = 4, @@ -208,8 +205,7 @@ static const struct me_board me_boards[] = { .dio_channel_nbr = 32, }, { - /* -- ME-2000i -- */ - .name = ME_DRIVER_NAME, + .name = "me-2000i", .device_id = ME2000_DEVICE_ID, /* Analog Output */ .ao_channel_nbr = 0, @@ -617,44 +613,24 @@ static int me_reset(struct comedi_device *dev) return 0; } -static struct pci_dev *me_find_pci_dev(struct comedi_device *dev, - struct comedi_devconfig *it) +static const void *me_find_boardinfo(struct comedi_device *dev, + struct pci_dev *pcidev) { const struct me_board *board; - struct pci_dev *pcidev = NULL; - int bus = it->options[0]; - int slot = it->options[1]; int i; - for_each_pci_dev(pcidev) { - if (bus || slot) { - if (pcidev->bus->number != bus || - PCI_SLOT(pcidev->devfn) != slot) - continue; - } - if (pcidev->vendor != PCI_VENDOR_ID_MEILHAUS) - continue; - - for (i = 0; i < ARRAY_SIZE(me_boards); i++) { - board = &me_boards[i]; - if (board->device_id != pcidev->device) - continue; - - dev->board_ptr = board; - return pcidev; - } + for (i = 0; i < ARRAY_SIZE(me_boards); i++) { + board = &me_boards[i]; + if (board->device_id == pcidev->device) + return board; } - dev_err(dev->class_dev, - "No supported board found! (req. bus %d, slot %d)\n", - bus, slot); return NULL; } -static int me_attach(struct comedi_device *dev, struct comedi_devconfig *it) +static int me_attach_pci(struct comedi_device *dev, struct pci_dev *pcidev) { - struct pci_dev *pci_device; + const struct me_board *board; struct comedi_subdevice *s; - struct me_board *board; resource_size_t plx_regbase_tmp; unsigned long plx_regbase_size_tmp; resource_size_t me_regbase_tmp; @@ -664,29 +640,28 @@ static int me_attach(struct comedi_device *dev, struct comedi_devconfig *it) resource_size_t regbase_tmp; int result, error; + comedi_set_hw_dev(dev, &pcidev->dev); + + board = me_find_boardinfo(dev, pcidev); + if (!board) + return -ENODEV; + dev->board_ptr = board; + dev->board_name = board->name; + /* Allocate private memory */ if (alloc_private(dev, sizeof(struct me_private_data)) < 0) return -ENOMEM; - pci_device = me_find_pci_dev(dev, it); - if (!pci_device) - return -EIO; - comedi_set_hw_dev(dev, &pci_device->dev); - board = (struct me_board *)dev->board_ptr; - /* Enable PCI device and request PCI regions */ - if (comedi_pci_enable(pci_device, ME_DRIVER_NAME) < 0) { + if (comedi_pci_enable(pcidev, dev->board_name) < 0) { printk(KERN_ERR "comedi%d: Failed to enable PCI device and " "request regions\n", dev->minor); return -EIO; } - /* Set data in device structure */ - dev->board_name = board->name; - /* Read PLX register base address [PCI_BASE_ADDRESS #0]. */ - plx_regbase_tmp = pci_resource_start(pci_device, 0); - plx_regbase_size_tmp = pci_resource_len(pci_device, 0); + plx_regbase_tmp = pci_resource_start(pcidev, 0); + plx_regbase_size_tmp = pci_resource_len(pcidev, 0); dev_private->plx_regbase = ioremap(plx_regbase_tmp, plx_regbase_size_tmp); dev_private->plx_regbase_size = plx_regbase_size_tmp; @@ -697,8 +672,8 @@ static int me_attach(struct comedi_device *dev, struct comedi_devconfig *it) /* Read Swap base address [PCI_BASE_ADDRESS #5]. */ - swap_regbase_tmp = pci_resource_start(pci_device, 5); - swap_regbase_size_tmp = pci_resource_len(pci_device, 5); + swap_regbase_tmp = pci_resource_start(pcidev, 5); + swap_regbase_size_tmp = pci_resource_len(pcidev, 5); if (!swap_regbase_tmp) printk(KERN_ERR "comedi%d: Swap not present\n", dev->minor); @@ -712,20 +687,20 @@ static int me_attach(struct comedi_device *dev, struct comedi_devconfig *it) plx_regbase_tmp = swap_regbase_tmp; swap_regbase_tmp = regbase_tmp; - result = pci_write_config_dword(pci_device, + result = pci_write_config_dword(pcidev, PCI_BASE_ADDRESS_0, plx_regbase_tmp); if (result != PCIBIOS_SUCCESSFUL) return -EIO; - result = pci_write_config_dword(pci_device, + result = pci_write_config_dword(pcidev, PCI_BASE_ADDRESS_5, swap_regbase_tmp); if (result != PCIBIOS_SUCCESSFUL) return -EIO; } else { plx_regbase_tmp -= 0x80; - result = pci_write_config_dword(pci_device, + result = pci_write_config_dword(pcidev, PCI_BASE_ADDRESS_0, plx_regbase_tmp); if (result != PCIBIOS_SUCCESSFUL) @@ -736,8 +711,8 @@ static int me_attach(struct comedi_device *dev, struct comedi_devconfig *it) /* Read Meilhaus register base address [PCI_BASE_ADDRESS #2]. */ - me_regbase_tmp = pci_resource_start(pci_device, 2); - me_regbase_size_tmp = pci_resource_len(pci_device, 2); + me_regbase_tmp = pci_resource_start(pcidev, 2); + me_regbase_size_tmp = pci_resource_len(pcidev, 2); dev_private->me_regbase_size = me_regbase_size_tmp; dev_private->me_regbase = ioremap(me_regbase_tmp, me_regbase_size_tmp); if (!dev_private->me_regbase) { @@ -791,8 +766,9 @@ static int me_attach(struct comedi_device *dev, struct comedi_devconfig *it) s->insn_config = me_dio_insn_config; s->io_bits = 0; - printk(KERN_INFO "comedi%d: " ME_DRIVER_NAME " attached.\n", - dev->minor); + dev_info(dev->class_dev, "%s: %s attached\n", + dev->driver->driver_name, dev->board_name); + return 0; } @@ -818,7 +794,7 @@ static void me_detach(struct comedi_device *dev) static struct comedi_driver me_daq_driver = { .driver_name = "me_daq", .module = THIS_MODULE, - .attach = me_attach, + .attach_pci = me_attach_pci, .detach = me_detach, };