diff options
-rw-r--r-- | drivers/char/sx.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/drivers/char/sx.c b/drivers/char/sx.c index f506ee3243d1..1057cc4466ca 100644 --- a/drivers/char/sx.c +++ b/drivers/char/sx.c | |||
@@ -2485,7 +2485,8 @@ static void __exit sx_release_drivers(void) | |||
2485 | func_exit(); | 2485 | func_exit(); |
2486 | } | 2486 | } |
2487 | 2487 | ||
2488 | static void __devexit sx_remove_card(struct sx_board *board) | 2488 | static void __devexit sx_remove_card(struct sx_board *board, |
2489 | struct pci_dev *pdev) | ||
2489 | { | 2490 | { |
2490 | if (board->flags & SX_BOARD_INITIALIZED) { | 2491 | if (board->flags & SX_BOARD_INITIALIZED) { |
2491 | /* The board should stop messing with us. (actually I mean the | 2492 | /* The board should stop messing with us. (actually I mean the |
@@ -2496,7 +2497,10 @@ static void __devexit sx_remove_card(struct sx_board *board) | |||
2496 | 2497 | ||
2497 | /* It is safe/allowed to del_timer a non-active timer */ | 2498 | /* It is safe/allowed to del_timer a non-active timer */ |
2498 | del_timer(&board->timer); | 2499 | del_timer(&board->timer); |
2499 | iounmap(board->base); | 2500 | if (pdev) |
2501 | pci_iounmap(pdev, board->base); | ||
2502 | else | ||
2503 | iounmap(board->base); | ||
2500 | 2504 | ||
2501 | board->flags &= ~(SX_BOARD_INITIALIZED | SX_BOARD_PRESENT); | 2505 | board->flags &= ~(SX_BOARD_INITIALIZED | SX_BOARD_PRESENT); |
2502 | } | 2506 | } |
@@ -2559,7 +2563,7 @@ static int __devexit sx_eisa_remove(struct device *dev) | |||
2559 | { | 2563 | { |
2560 | struct sx_board *board = dev_get_drvdata(dev); | 2564 | struct sx_board *board = dev_get_drvdata(dev); |
2561 | 2565 | ||
2562 | sx_remove_card(board); | 2566 | sx_remove_card(board, NULL); |
2563 | 2567 | ||
2564 | return 0; | 2568 | return 0; |
2565 | } | 2569 | } |
@@ -2618,7 +2622,7 @@ static int __devinit sx_pci_probe(struct pci_dev *pdev, | |||
2618 | const struct pci_device_id *ent) | 2622 | const struct pci_device_id *ent) |
2619 | { | 2623 | { |
2620 | struct sx_board *board; | 2624 | struct sx_board *board; |
2621 | unsigned int i; | 2625 | unsigned int i, reg; |
2622 | int retval = -EIO; | 2626 | int retval = -EIO; |
2623 | 2627 | ||
2624 | mutex_lock(&sx_boards_lock); | 2628 | mutex_lock(&sx_boards_lock); |
@@ -2640,12 +2644,10 @@ static int __devinit sx_pci_probe(struct pci_dev *pdev, | |||
2640 | SX_CFPCI_BOARD; | 2644 | SX_CFPCI_BOARD; |
2641 | 2645 | ||
2642 | /* CF boards use base address 3.... */ | 2646 | /* CF boards use base address 3.... */ |
2643 | if (IS_CF_BOARD(board)) | 2647 | reg = IS_CF_BOARD(board) ? 3 : 2; |
2644 | board->hw_base = pci_resource_start(pdev, 3); | 2648 | board->hw_base = pci_resource_start(pdev, reg); |
2645 | else | ||
2646 | board->hw_base = pci_resource_start(pdev, 2); | ||
2647 | board->base2 = | 2649 | board->base2 = |
2648 | board->base = ioremap(board->hw_base, WINDOW_LEN(board)); | 2650 | board->base = pci_iomap(pdev, reg, WINDOW_LEN(board)); |
2649 | if (!board->base) { | 2651 | if (!board->base) { |
2650 | dev_err(&pdev->dev, "ioremap failed\n"); | 2652 | dev_err(&pdev->dev, "ioremap failed\n"); |
2651 | goto err_flag; | 2653 | goto err_flag; |
@@ -2671,7 +2673,7 @@ static int __devinit sx_pci_probe(struct pci_dev *pdev, | |||
2671 | 2673 | ||
2672 | return 0; | 2674 | return 0; |
2673 | err_unmap: | 2675 | err_unmap: |
2674 | iounmap(board->base2); | 2676 | pci_iounmap(pdev, board->base); |
2675 | err_flag: | 2677 | err_flag: |
2676 | board->flags &= ~SX_BOARD_PRESENT; | 2678 | board->flags &= ~SX_BOARD_PRESENT; |
2677 | err: | 2679 | err: |
@@ -2682,7 +2684,7 @@ static void __devexit sx_pci_remove(struct pci_dev *pdev) | |||
2682 | { | 2684 | { |
2683 | struct sx_board *board = pci_get_drvdata(pdev); | 2685 | struct sx_board *board = pci_get_drvdata(pdev); |
2684 | 2686 | ||
2685 | sx_remove_card(board); | 2687 | sx_remove_card(board, pdev); |
2686 | } | 2688 | } |
2687 | 2689 | ||
2688 | /* Specialix has a whole bunch of cards with 0x2000 as the device ID. They say | 2690 | /* Specialix has a whole bunch of cards with 0x2000 as the device ID. They say |
@@ -2812,7 +2814,7 @@ static void __exit sx_exit(void) | |||
2812 | pci_unregister_driver(&sx_pcidriver); | 2814 | pci_unregister_driver(&sx_pcidriver); |
2813 | 2815 | ||
2814 | for (i = 0; i < SX_NBOARDS; i++) | 2816 | for (i = 0; i < SX_NBOARDS; i++) |
2815 | sx_remove_card(&boards[i]); | 2817 | sx_remove_card(&boards[i], NULL); |
2816 | 2818 | ||
2817 | if (misc_deregister(&sx_fw_device) < 0) { | 2819 | if (misc_deregister(&sx_fw_device) < 0) { |
2818 | printk(KERN_INFO "sx: couldn't deregister firmware loader " | 2820 | printk(KERN_INFO "sx: couldn't deregister firmware loader " |