aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hartleys@visionengravers.com>2012-08-16 22:47:05 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-08-17 11:14:32 -0400
commit2d069fbed1fa367e5e5f59b6723898b92b3b80ba (patch)
tree1ff8fc0efd0fc4add0a25d0951f3a02cacd189c3
parent2682b2dc46d30cad83c880645b57fbce46ab35fa (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.c68
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
254static struct pci_dev *cb_pcimdas_find_pci_dev(struct comedi_device *dev, 254static 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
285static int cb_pcimdas_attach(struct comedi_device *dev, 268static 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
375static void cb_pcimdas_detach(struct comedi_device *dev) 356static 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
388static struct comedi_driver cb_pcimdas_driver = { 368static 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