diff options
author | H Hartley Sweeten <hartleys@visionengravers.com> | 2012-08-16 22:47:05 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-08-17 11:14:32 -0400 |
commit | 2d069fbed1fa367e5e5f59b6723898b92b3b80ba (patch) | |
tree | 1ff8fc0efd0fc4add0a25d0951f3a02cacd189c3 | |
parent | 2682b2dc46d30cad83c880645b57fbce46ab35fa (diff) |
staging: comedi: cb_pcimdas: use attach_pci callback
Convert this PCI driver to use the comedi PCI auto config attach
mechanism by adding an 'attach_pci' callback function. Since the
driver does not require any external configuration options, and
the legacy 'attach' callback is now optional, remove it.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/comedi/drivers/cb_pcimdas.c | 68 |
1 files changed, 24 insertions, 44 deletions
diff --git a/drivers/staging/comedi/drivers/cb_pcimdas.c b/drivers/staging/comedi/drivers/cb_pcimdas.c index 5a5f102bb97e..fa3fd88bf730 100644 --- a/drivers/staging/comedi/drivers/cb_pcimdas.c +++ b/drivers/staging/comedi/drivers/cb_pcimdas.c | |||
@@ -251,58 +251,42 @@ static int cb_pcimdas_ao_rinsn(struct comedi_device *dev, | |||
251 | return i; | 251 | return i; |
252 | } | 252 | } |
253 | 253 | ||
254 | static struct pci_dev *cb_pcimdas_find_pci_dev(struct comedi_device *dev, | 254 | static const void *cb_pcimdas_find_boardinfo(struct comedi_device *dev, |
255 | struct comedi_devconfig *it) | 255 | struct pci_dev *pcidev) |
256 | { | 256 | { |
257 | struct pci_dev *pcidev = NULL; | 257 | const struct cb_pcimdas_board *thisboard; |
258 | int bus = it->options[0]; | ||
259 | int slot = it->options[1]; | ||
260 | int i; | 258 | int i; |
261 | 259 | ||
262 | for_each_pci_dev(pcidev) { | 260 | for (i = 0; i < ARRAY_SIZE(cb_pcimdas_boards); i++) { |
263 | if (bus || slot) { | 261 | thisboard = &cb_pcimdas_boards[i]; |
264 | if (bus != pcidev->bus->number || | 262 | if (thisboard->device_id == pcidev->device) |
265 | slot != PCI_SLOT(pcidev->devfn)) | 263 | return thisboard; |
266 | continue; | ||
267 | } | ||
268 | if (pcidev->vendor != PCI_VENDOR_ID_COMPUTERBOARDS) | ||
269 | continue; | ||
270 | |||
271 | for (i = 0; i < ARRAY_SIZE(cb_pcimdas_boards); i++) { | ||
272 | if (cb_pcimdas_boards[i].device_id != pcidev->device) | ||
273 | continue; | ||
274 | |||
275 | dev->board_ptr = cb_pcimdas_boards + i; | ||
276 | return pcidev; | ||
277 | } | ||
278 | } | 264 | } |
279 | dev_err(dev->class_dev, | ||
280 | "No supported board found! (req. bus %d, slot %d)\n", | ||
281 | bus, slot); | ||
282 | return NULL; | 265 | return NULL; |
283 | } | 266 | } |
284 | 267 | ||
285 | static int cb_pcimdas_attach(struct comedi_device *dev, | 268 | static int cb_pcimdas_attach_pci(struct comedi_device *dev, |
286 | struct comedi_devconfig *it) | 269 | struct pci_dev *pcidev) |
287 | { | 270 | { |
288 | const struct cb_pcimdas_board *thisboard; | 271 | const struct cb_pcimdas_board *thisboard; |
289 | struct cb_pcimdas_private *devpriv; | 272 | struct cb_pcimdas_private *devpriv; |
290 | struct pci_dev *pcidev; | ||
291 | struct comedi_subdevice *s; | 273 | struct comedi_subdevice *s; |
292 | unsigned long iobase_8255; | 274 | unsigned long iobase_8255; |
293 | int ret; | 275 | int ret; |
294 | 276 | ||
277 | comedi_set_hw_dev(dev, &pcidev->dev); | ||
278 | |||
279 | thisboard = cb_pcimdas_find_boardinfo(dev, pcidev); | ||
280 | if (!thisboard) | ||
281 | return -ENODEV; | ||
282 | dev->board_ptr = thisboard; | ||
283 | dev->board_name = thisboard->name; | ||
284 | |||
295 | ret = alloc_private(dev, sizeof(*devpriv)); | 285 | ret = alloc_private(dev, sizeof(*devpriv)); |
296 | if (ret) | 286 | if (ret) |
297 | return ret; | 287 | return ret; |
298 | devpriv = dev->private; | 288 | devpriv = dev->private; |
299 | 289 | ||
300 | pcidev = cb_pcimdas_find_pci_dev(dev, it); | ||
301 | if (!pcidev) | ||
302 | return -EIO; | ||
303 | comedi_set_hw_dev(dev, &pcidev->dev); | ||
304 | thisboard = comedi_board(dev); | ||
305 | |||
306 | /* Warn about non-tested features */ | 290 | /* Warn about non-tested features */ |
307 | switch (thisboard->device_id) { | 291 | switch (thisboard->device_id) { |
308 | case 0x56: | 292 | case 0x56: |
@@ -313,11 +297,9 @@ static int cb_pcimdas_attach(struct comedi_device *dev, | |||
313 | "PLEASE REPORT USAGE TO <mocelet@sucs.org>\n"); | 297 | "PLEASE REPORT USAGE TO <mocelet@sucs.org>\n"); |
314 | } | 298 | } |
315 | 299 | ||
316 | if (comedi_pci_enable(pcidev, "cb_pcimdas")) { | 300 | ret = comedi_pci_enable(pcidev, dev->board_name); |
317 | dev_err(dev->class_dev, | 301 | if (ret) |
318 | "Failed to enable PCI device and request regions\n"); | 302 | return ret; |
319 | return -EIO; | ||
320 | } | ||
321 | 303 | ||
322 | dev->iobase = pci_resource_start(pcidev, 2); | 304 | dev->iobase = pci_resource_start(pcidev, 2); |
323 | devpriv->BADR3 = pci_resource_start(pcidev, 3); | 305 | devpriv->BADR3 = pci_resource_start(pcidev, 3); |
@@ -332,9 +314,6 @@ static int cb_pcimdas_attach(struct comedi_device *dev, | |||
332 | /* } */ | 314 | /* } */ |
333 | /* dev->irq = pcidev->irq; */ | 315 | /* dev->irq = pcidev->irq; */ |
334 | 316 | ||
335 | /* Initialize dev->board_name */ | ||
336 | dev->board_name = thisboard->name; | ||
337 | |||
338 | ret = comedi_alloc_subdevices(dev, 3); | 317 | ret = comedi_alloc_subdevices(dev, 3); |
339 | if (ret) | 318 | if (ret) |
340 | return ret; | 319 | return ret; |
@@ -369,7 +348,9 @@ static int cb_pcimdas_attach(struct comedi_device *dev, | |||
369 | else | 348 | else |
370 | s->type = COMEDI_SUBD_UNUSED; | 349 | s->type = COMEDI_SUBD_UNUSED; |
371 | 350 | ||
372 | return 1; | 351 | dev_info(dev->class_dev, "%s attached\n", dev->board_name); |
352 | |||
353 | return 0; | ||
373 | } | 354 | } |
374 | 355 | ||
375 | static void cb_pcimdas_detach(struct comedi_device *dev) | 356 | static void cb_pcimdas_detach(struct comedi_device *dev) |
@@ -381,14 +362,13 @@ static void cb_pcimdas_detach(struct comedi_device *dev) | |||
381 | if (pcidev) { | 362 | if (pcidev) { |
382 | if (dev->iobase) | 363 | if (dev->iobase) |
383 | comedi_pci_disable(pcidev); | 364 | comedi_pci_disable(pcidev); |
384 | pci_dev_put(pcidev); | ||
385 | } | 365 | } |
386 | } | 366 | } |
387 | 367 | ||
388 | static struct comedi_driver cb_pcimdas_driver = { | 368 | static struct comedi_driver cb_pcimdas_driver = { |
389 | .driver_name = "cb_pcimdas", | 369 | .driver_name = "cb_pcimdas", |
390 | .module = THIS_MODULE, | 370 | .module = THIS_MODULE, |
391 | .attach = cb_pcimdas_attach, | 371 | .attach_pci = cb_pcimdas_attach_pci, |
392 | .detach = cb_pcimdas_detach, | 372 | .detach = cb_pcimdas_detach, |
393 | }; | 373 | }; |
394 | 374 | ||