aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/moxa.c64
1 files changed, 46 insertions, 18 deletions
diff --git a/drivers/char/moxa.c b/drivers/char/moxa.c
index 8849d662295e..9b7067b6ab73 100644
--- a/drivers/char/moxa.c
+++ b/drivers/char/moxa.c
@@ -275,10 +275,35 @@ static DEFINE_TIMER(moxaTimer, moxa_poll, 0, 0);
275static DEFINE_SPINLOCK(moxa_lock); 275static DEFINE_SPINLOCK(moxa_lock);
276 276
277#ifdef CONFIG_PCI 277#ifdef CONFIG_PCI
278static int moxa_get_PCI_conf(struct pci_dev *p, int board_type, 278static int __devinit moxa_pci_probe(struct pci_dev *pdev,
279 struct moxa_board_conf *board) 279 const struct pci_device_id *ent)
280{ 280{
281 board->baseAddr = pci_resource_start (p, 2); 281 struct moxa_board_conf *board;
282 unsigned int i;
283 int board_type = ent->driver_data;
284 int retval;
285
286 retval = pci_enable_device(pdev);
287 if (retval)
288 goto err;
289
290 for (i = 0; i < MAX_BOARDS; i++)
291 if (moxa_boards[i].basemem == NULL)
292 break;
293
294 retval = -ENODEV;
295 if (i >= MAX_BOARDS) {
296 if (verbose)
297 printk("More than %d MOXA Intellio family boards "
298 "found. Board is ignored.\n", MAX_BOARDS);
299 goto err;
300 }
301
302 board = &moxa_boards[i];
303 board->basemem = pci_iomap(pdev, 2, 0x4000);
304 if (board->basemem == NULL)
305 goto err;
306
282 board->boardType = board_type; 307 board->boardType = board_type;
283 switch (board_type) { 308 switch (board_type) {
284 case MOXA_BOARD_C218_ISA: 309 case MOXA_BOARD_C218_ISA:
@@ -295,9 +320,21 @@ static int moxa_get_PCI_conf(struct pci_dev *p, int board_type,
295 } 320 }
296 board->busType = MOXA_BUS_TYPE_PCI; 321 board->busType = MOXA_BUS_TYPE_PCI;
297 /* don't lose the reference in the next pci_get_device iteration */ 322 /* don't lose the reference in the next pci_get_device iteration */
298 board->pdev = pci_dev_get(p); 323 board->pdev = pci_dev_get(pdev);
324 pci_set_drvdata(pdev, board);
299 325
300 return (0); 326 return (0);
327err:
328 return retval;
329}
330
331static void __devexit moxa_pci_remove(struct pci_dev *pdev)
332{
333 struct moxa_board_conf *brd = pci_get_drvdata(pdev);
334
335 pci_iounmap(pdev, brd->basemem);
336 brd->basemem = NULL;
337 pci_dev_put(pdev);
301} 338}
302#endif /* CONFIG_PCI */ 339#endif /* CONFIG_PCI */
303 340
@@ -401,18 +438,7 @@ static int __init moxa_init(void)
401 i = 0; 438 i = 0;
402 while (i < n) { 439 while (i < n) {
403 while ((p = pci_get_device(moxa_pcibrds[i].vendor, moxa_pcibrds[i].device, p))!=NULL) 440 while ((p = pci_get_device(moxa_pcibrds[i].vendor, moxa_pcibrds[i].device, p))!=NULL)
404 { 441 moxa_pci_probe(p, &moxa_pcibrds[i]);
405 if (pci_enable_device(p))
406 continue;
407 if (numBoards >= MAX_BOARDS) {
408 if (verbose)
409 printk("More than %d MOXA Intellio family boards found. Board is ignored.", MAX_BOARDS);
410 } else {
411 moxa_get_PCI_conf(p, moxa_pcibrds[i].driver_data,
412 &moxa_boards[numBoards]);
413 numBoards++;
414 }
415 }
416 i++; 442 i++;
417 } 443 }
418 } 444 }
@@ -442,10 +468,12 @@ static void __exit moxa_exit(void)
442 put_tty_driver(moxaDriver); 468 put_tty_driver(moxaDriver);
443 469
444 for (i = 0; i < MAX_BOARDS; i++) { 470 for (i = 0; i < MAX_BOARDS; i++) {
471#ifdef CONFIG_PCI
472 if (moxa_boards[i].busType == MOXA_BUS_TYPE_PCI)
473 moxa_pci_remove(moxa_boards[i].pdev);
474#endif
445 if (moxa_boards[i].basemem) 475 if (moxa_boards[i].basemem)
446 iounmap(moxa_boards[i].basemem); 476 iounmap(moxa_boards[i].basemem);
447 if (moxa_boards[i].busType == MOXA_BUS_TYPE_PCI)
448 pci_dev_put(moxa_boards[i].pdev);
449 } 477 }
450 478
451 if (verbose) 479 if (verbose)