diff options
| author | Jeff Garzik <jeff@garzik.org> | 2007-10-03 15:37:40 -0400 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2007-10-12 09:16:49 -0400 |
| commit | 7da0d9801bd52a1d5e58eae85a3b9508b4a11ffb (patch) | |
| tree | 81d7ff659cb62f90cbcea5324d1f0b642dd9968a | |
| parent | 1e5d82e18b7204545737a5ef96bc34180a8df844 (diff) | |
[ISDN] HiSax sedlbauer: move ISAPNP and PCI code into functions of their own
Prep for hotplug API conversion. Just code movement (+glue).
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
| -rw-r--r-- | drivers/isdn/hisax/sedlbauer.c | 276 |
1 files changed, 157 insertions, 119 deletions
diff --git a/drivers/isdn/hisax/sedlbauer.c b/drivers/isdn/hisax/sedlbauer.c index ad06f3cc60fb..03dfc32166a0 100644 --- a/drivers/isdn/hisax/sedlbauer.c +++ b/drivers/isdn/hisax/sedlbauer.c | |||
| @@ -518,8 +518,6 @@ Sedl_card_msg(struct IsdnCardState *cs, int mt, void *arg) | |||
| 518 | return(0); | 518 | return(0); |
| 519 | } | 519 | } |
| 520 | 520 | ||
| 521 | static struct pci_dev *dev_sedl __devinitdata = NULL; | ||
| 522 | |||
| 523 | #ifdef __ISAPNP__ | 521 | #ifdef __ISAPNP__ |
| 524 | static struct isapnp_device_id sedl_ids[] __devinitdata = { | 522 | static struct isapnp_device_id sedl_ids[] __devinitdata = { |
| 525 | { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01), | 523 | { ISAPNP_VENDOR('S', 'A', 'G'), ISAPNP_FUNCTION(0x01), |
| @@ -533,15 +531,158 @@ static struct isapnp_device_id sedl_ids[] __devinitdata = { | |||
| 533 | 531 | ||
| 534 | static struct isapnp_device_id *ipid __devinitdata = &sedl_ids[0]; | 532 | static struct isapnp_device_id *ipid __devinitdata = &sedl_ids[0]; |
| 535 | static struct pnp_card *pnp_c __devinitdata = NULL; | 533 | static struct pnp_card *pnp_c __devinitdata = NULL; |
| 536 | #endif | 534 | |
| 535 | static int __devinit | ||
| 536 | setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt) | ||
| 537 | { | ||
| 538 | struct IsdnCardState *cs = card->cs; | ||
| 539 | struct pnp_dev *pnp_d; | ||
| 540 | |||
| 541 | if (!isapnp_present()) | ||
| 542 | return -1; | ||
| 543 | |||
| 544 | while(ipid->card_vendor) { | ||
| 545 | if ((pnp_c = pnp_find_card(ipid->card_vendor, | ||
| 546 | ipid->card_device, pnp_c))) { | ||
| 547 | pnp_d = NULL; | ||
| 548 | if ((pnp_d = pnp_find_dev(pnp_c, | ||
| 549 | ipid->vendor, ipid->function, pnp_d))) { | ||
| 550 | int err; | ||
| 551 | |||
| 552 | printk(KERN_INFO "HiSax: %s detected\n", | ||
| 553 | (char *)ipid->driver_data); | ||
| 554 | pnp_disable_dev(pnp_d); | ||
| 555 | err = pnp_activate_dev(pnp_d); | ||
| 556 | if (err<0) { | ||
| 557 | printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n", | ||
| 558 | __FUNCTION__, err); | ||
| 559 | return(0); | ||
| 560 | } | ||
| 561 | card->para[1] = pnp_port_start(pnp_d, 0); | ||
| 562 | card->para[0] = pnp_irq(pnp_d, 0); | ||
| 563 | |||
| 564 | if (!card->para[0] || !card->para[1]) { | ||
| 565 | printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n", | ||
| 566 | card->para[0], card->para[1]); | ||
| 567 | pnp_disable_dev(pnp_d); | ||
| 568 | return(0); | ||
| 569 | } | ||
| 570 | cs->hw.sedl.cfg_reg = card->para[1]; | ||
| 571 | cs->irq = card->para[0]; | ||
| 572 | if (ipid->function == ISAPNP_FUNCTION(0x2)) { | ||
| 573 | cs->subtyp = SEDL_SPEED_FAX; | ||
| 574 | cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR; | ||
| 575 | *bytecnt = 16; | ||
| 576 | } else { | ||
| 577 | cs->subtyp = SEDL_SPEED_CARD_WIN; | ||
| 578 | cs->hw.sedl.chip = SEDL_CHIP_TEST; | ||
| 579 | } | ||
| 580 | |||
| 581 | return (1); | ||
| 582 | } else { | ||
| 583 | printk(KERN_ERR "Sedlbauer PnP: PnP error card found, no device\n"); | ||
| 584 | return(0); | ||
| 585 | } | ||
| 586 | } | ||
| 587 | ipid++; | ||
| 588 | pnp_c = NULL; | ||
| 589 | } | ||
| 590 | |||
| 591 | printk(KERN_INFO "Sedlbauer PnP: no ISAPnP card found\n"); | ||
| 592 | return -1; | ||
| 593 | } | ||
| 594 | #else | ||
| 595 | |||
| 596 | static int __devinit | ||
| 597 | setup_sedlbauer_isapnp(struct IsdnCard *card, int *bytecnt) | ||
| 598 | { | ||
| 599 | return -1; | ||
| 600 | } | ||
| 601 | #endif /* __ISAPNP__ */ | ||
| 602 | |||
| 603 | #ifdef CONFIG_PCI | ||
| 604 | static struct pci_dev *dev_sedl __devinitdata = NULL; | ||
| 605 | |||
| 606 | static int __devinit | ||
| 607 | setup_sedlbauer_pci(struct IsdnCard *card) | ||
| 608 | { | ||
| 609 | struct IsdnCardState *cs = card->cs; | ||
| 610 | u16 sub_vendor_id, sub_id; | ||
| 611 | |||
| 612 | if ((dev_sedl = pci_find_device(PCI_VENDOR_ID_TIGERJET, | ||
| 613 | PCI_DEVICE_ID_TIGERJET_100, dev_sedl))) { | ||
| 614 | if (pci_enable_device(dev_sedl)) | ||
| 615 | return(0); | ||
| 616 | cs->irq = dev_sedl->irq; | ||
| 617 | if (!cs->irq) { | ||
| 618 | printk(KERN_WARNING "Sedlbauer: No IRQ for PCI card found\n"); | ||
| 619 | return(0); | ||
| 620 | } | ||
| 621 | cs->hw.sedl.cfg_reg = pci_resource_start(dev_sedl, 0); | ||
| 622 | } else { | ||
| 623 | printk(KERN_WARNING "Sedlbauer: No PCI card found\n"); | ||
| 624 | return(0); | ||
| 625 | } | ||
| 626 | cs->irq_flags |= IRQF_SHARED; | ||
| 627 | cs->hw.sedl.bus = SEDL_BUS_PCI; | ||
| 628 | sub_vendor_id = dev_sedl->subsystem_vendor; | ||
| 629 | sub_id = dev_sedl->subsystem_device; | ||
| 630 | printk(KERN_INFO "Sedlbauer: PCI subvendor:%x subid %x\n", | ||
| 631 | sub_vendor_id, sub_id); | ||
| 632 | printk(KERN_INFO "Sedlbauer: PCI base adr %#x\n", | ||
| 633 | cs->hw.sedl.cfg_reg); | ||
| 634 | if (sub_id != PCI_SUB_ID_SEDLBAUER) { | ||
| 635 | printk(KERN_ERR "Sedlbauer: unknown sub id %#x\n", sub_id); | ||
| 636 | return(0); | ||
| 637 | } | ||
| 638 | if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PYRAMID) { | ||
| 639 | cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR; | ||
| 640 | cs->subtyp = SEDL_SPEEDFAX_PYRAMID; | ||
| 641 | } else if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PCI) { | ||
| 642 | cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR; | ||
| 643 | cs->subtyp = SEDL_SPEEDFAX_PCI; | ||
| 644 | } else if (sub_vendor_id == PCI_SUBVENDOR_HST_SAPHIR3) { | ||
| 645 | cs->hw.sedl.chip = SEDL_CHIP_IPAC; | ||
| 646 | cs->subtyp = HST_SAPHIR3; | ||
| 647 | } else if (sub_vendor_id == PCI_SUBVENDOR_SEDLBAUER_PCI) { | ||
| 648 | cs->hw.sedl.chip = SEDL_CHIP_IPAC; | ||
| 649 | cs->subtyp = SEDL_SPEED_PCI; | ||
| 650 | } else { | ||
| 651 | printk(KERN_ERR "Sedlbauer: unknown sub vendor id %#x\n", | ||
| 652 | sub_vendor_id); | ||
| 653 | return(0); | ||
| 654 | } | ||
| 655 | |||
| 656 | cs->hw.sedl.reset_on = SEDL_ISAR_PCI_ISAR_RESET_ON; | ||
| 657 | cs->hw.sedl.reset_off = SEDL_ISAR_PCI_ISAR_RESET_OFF; | ||
| 658 | byteout(cs->hw.sedl.cfg_reg, 0xff); | ||
| 659 | byteout(cs->hw.sedl.cfg_reg, 0x00); | ||
| 660 | byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd); | ||
| 661 | byteout(cs->hw.sedl.cfg_reg+ 5, 0); /* disable all IRQ */ | ||
| 662 | byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on); | ||
| 663 | mdelay(2); | ||
| 664 | byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off); | ||
| 665 | mdelay(10); | ||
| 666 | |||
| 667 | return (1); | ||
| 668 | } | ||
| 669 | |||
| 670 | #else | ||
| 671 | |||
| 672 | static int __devinit | ||
| 673 | setup_sedlbauer_pci(struct IsdnCard *card) | ||
| 674 | { | ||
| 675 | return (1); | ||
| 676 | } | ||
| 677 | |||
| 678 | #endif /* CONFIG_PCI */ | ||
| 537 | 679 | ||
| 538 | int __devinit | 680 | int __devinit |
| 539 | setup_sedlbauer(struct IsdnCard *card) | 681 | setup_sedlbauer(struct IsdnCard *card) |
| 540 | { | 682 | { |
| 541 | int bytecnt, ver, val; | 683 | int bytecnt = 8, ver, val, rc; |
| 542 | struct IsdnCardState *cs = card->cs; | 684 | struct IsdnCardState *cs = card->cs; |
| 543 | char tmp[64]; | 685 | char tmp[64]; |
| 544 | u16 sub_vendor_id, sub_id; | ||
| 545 | 686 | ||
| 546 | strcpy(tmp, Sedlbauer_revision); | 687 | strcpy(tmp, Sedlbauer_revision); |
| 547 | printk(KERN_INFO "HiSax: Sedlbauer driver Rev. %s\n", HiSax_getrev(tmp)); | 688 | printk(KERN_INFO "HiSax: Sedlbauer driver Rev. %s\n", HiSax_getrev(tmp)); |
| @@ -569,124 +710,21 @@ setup_sedlbauer(struct IsdnCard *card) | |||
| 569 | bytecnt = 16; | 710 | bytecnt = 16; |
| 570 | } | 711 | } |
| 571 | } else { | 712 | } else { |
| 572 | #ifdef __ISAPNP__ | 713 | rc = setup_sedlbauer_isapnp(card, &bytecnt); |
| 573 | if (isapnp_present()) { | 714 | if (!rc) |
| 574 | struct pnp_dev *pnp_d; | 715 | return (0); |
| 575 | while(ipid->card_vendor) { | 716 | if (rc > 0) |
| 576 | if ((pnp_c = pnp_find_card(ipid->card_vendor, | 717 | goto ready; |
| 577 | ipid->card_device, pnp_c))) { | 718 | |
| 578 | pnp_d = NULL; | 719 | /* Probe for Sedlbauer speed pci */ |
| 579 | if ((pnp_d = pnp_find_dev(pnp_c, | 720 | rc = setup_sedlbauer_pci(card); |
| 580 | ipid->vendor, ipid->function, pnp_d))) { | 721 | if (!rc) |
| 581 | int err; | 722 | return (0); |
| 582 | 723 | ||
| 583 | printk(KERN_INFO "HiSax: %s detected\n", | ||
| 584 | (char *)ipid->driver_data); | ||
| 585 | pnp_disable_dev(pnp_d); | ||
| 586 | err = pnp_activate_dev(pnp_d); | ||
| 587 | if (err<0) { | ||
| 588 | printk(KERN_WARNING "%s: pnp_activate_dev ret(%d)\n", | ||
| 589 | __FUNCTION__, err); | ||
| 590 | return(0); | ||
| 591 | } | ||
| 592 | card->para[1] = pnp_port_start(pnp_d, 0); | ||
| 593 | card->para[0] = pnp_irq(pnp_d, 0); | ||
| 594 | |||
| 595 | if (!card->para[0] || !card->para[1]) { | ||
| 596 | printk(KERN_ERR "Sedlbauer PnP:some resources are missing %ld/%lx\n", | ||
| 597 | card->para[0], card->para[1]); | ||
| 598 | pnp_disable_dev(pnp_d); | ||
| 599 | return(0); | ||
| 600 | } | ||
| 601 | cs->hw.sedl.cfg_reg = card->para[1]; | ||
| 602 | cs->irq = card->para[0]; | ||
| 603 | if (ipid->function == ISAPNP_FUNCTION(0x2)) { | ||
| 604 | cs->subtyp = SEDL_SPEED_FAX; | ||
| 605 | cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR; | ||
| 606 | bytecnt = 16; | ||
| 607 | } else { | ||
| 608 | cs->subtyp = SEDL_SPEED_CARD_WIN; | ||
| 609 | cs->hw.sedl.chip = SEDL_CHIP_TEST; | ||
| 610 | } | ||
| 611 | goto ready; | ||
| 612 | } else { | ||
| 613 | printk(KERN_ERR "Sedlbauer PnP: PnP error card found, no device\n"); | ||
| 614 | return(0); | ||
| 615 | } | ||
| 616 | } | ||
| 617 | ipid++; | ||
| 618 | pnp_c = NULL; | ||
| 619 | } | ||
| 620 | if (!ipid->card_vendor) { | ||
| 621 | printk(KERN_INFO "Sedlbauer PnP: no ISAPnP card found\n"); | ||
| 622 | } | ||
| 623 | } | ||
| 624 | #endif | ||
| 625 | /* Probe for Sedlbauer speed pci */ | ||
| 626 | #ifdef CONFIG_PCI | ||
| 627 | if ((dev_sedl = pci_find_device(PCI_VENDOR_ID_TIGERJET, | ||
| 628 | PCI_DEVICE_ID_TIGERJET_100, dev_sedl))) { | ||
| 629 | if (pci_enable_device(dev_sedl)) | ||
| 630 | return(0); | ||
| 631 | cs->irq = dev_sedl->irq; | ||
| 632 | if (!cs->irq) { | ||
| 633 | printk(KERN_WARNING "Sedlbauer: No IRQ for PCI card found\n"); | ||
| 634 | return(0); | ||
| 635 | } | ||
| 636 | cs->hw.sedl.cfg_reg = pci_resource_start(dev_sedl, 0); | ||
| 637 | } else { | ||
| 638 | printk(KERN_WARNING "Sedlbauer: No PCI card found\n"); | ||
| 639 | return(0); | ||
| 640 | } | ||
| 641 | cs->irq_flags |= IRQF_SHARED; | ||
| 642 | cs->hw.sedl.bus = SEDL_BUS_PCI; | ||
| 643 | sub_vendor_id = dev_sedl->subsystem_vendor; | ||
| 644 | sub_id = dev_sedl->subsystem_device; | ||
| 645 | printk(KERN_INFO "Sedlbauer: PCI subvendor:%x subid %x\n", | ||
| 646 | sub_vendor_id, sub_id); | ||
| 647 | printk(KERN_INFO "Sedlbauer: PCI base adr %#x\n", | ||
| 648 | cs->hw.sedl.cfg_reg); | ||
| 649 | if (sub_id != PCI_SUB_ID_SEDLBAUER) { | ||
| 650 | printk(KERN_ERR "Sedlbauer: unknown sub id %#x\n", sub_id); | ||
| 651 | return(0); | ||
| 652 | } | ||
| 653 | if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PYRAMID) { | ||
| 654 | cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR; | ||
| 655 | cs->subtyp = SEDL_SPEEDFAX_PYRAMID; | ||
| 656 | } else if (sub_vendor_id == PCI_SUBVENDOR_SPEEDFAX_PCI) { | ||
| 657 | cs->hw.sedl.chip = SEDL_CHIP_ISAC_ISAR; | ||
| 658 | cs->subtyp = SEDL_SPEEDFAX_PCI; | ||
| 659 | } else if (sub_vendor_id == PCI_SUBVENDOR_HST_SAPHIR3) { | ||
| 660 | cs->hw.sedl.chip = SEDL_CHIP_IPAC; | ||
| 661 | cs->subtyp = HST_SAPHIR3; | ||
| 662 | } else if (sub_vendor_id == PCI_SUBVENDOR_SEDLBAUER_PCI) { | ||
| 663 | cs->hw.sedl.chip = SEDL_CHIP_IPAC; | ||
| 664 | cs->subtyp = SEDL_SPEED_PCI; | ||
| 665 | } else { | ||
| 666 | printk(KERN_ERR "Sedlbauer: unknown sub vendor id %#x\n", | ||
| 667 | sub_vendor_id); | ||
| 668 | return(0); | ||
| 669 | } | ||
| 670 | bytecnt = 256; | 724 | bytecnt = 256; |
| 671 | cs->hw.sedl.reset_on = SEDL_ISAR_PCI_ISAR_RESET_ON; | ||
| 672 | cs->hw.sedl.reset_off = SEDL_ISAR_PCI_ISAR_RESET_OFF; | ||
| 673 | byteout(cs->hw.sedl.cfg_reg, 0xff); | ||
| 674 | byteout(cs->hw.sedl.cfg_reg, 0x00); | ||
| 675 | byteout(cs->hw.sedl.cfg_reg+ 2, 0xdd); | ||
| 676 | byteout(cs->hw.sedl.cfg_reg+ 5, 0); /* disable all IRQ */ | ||
| 677 | byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_on); | ||
| 678 | mdelay(2); | ||
| 679 | byteout(cs->hw.sedl.cfg_reg +3, cs->hw.sedl.reset_off); | ||
| 680 | mdelay(10); | ||
| 681 | #else | ||
| 682 | printk(KERN_WARNING "Sedlbauer: NO_PCI_BIOS\n"); | ||
| 683 | return (0); | ||
| 684 | #endif /* CONFIG_PCI */ | ||
| 685 | } | 725 | } |
| 686 | 726 | ||
| 687 | #ifdef __ISAPNP__ | ||
| 688 | ready: | 727 | ready: |
| 689 | #endif | ||
| 690 | 728 | ||
| 691 | /* In case of the sedlbauer pcmcia card, this region is in use, | 729 | /* In case of the sedlbauer pcmcia card, this region is in use, |
| 692 | * reserved for us by the card manager. So we do not check it | 730 | * reserved for us by the card manager. So we do not check it |
