diff options
Diffstat (limited to 'drivers/ide/pci/sgiioc4.c')
-rw-r--r-- | drivers/ide/pci/sgiioc4.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index 24513e3dcd6b..c79ff5b41088 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -568,6 +568,7 @@ static const struct ide_dma_ops sgiioc4_dma_ops = { | |||
568 | }; | 568 | }; |
569 | 569 | ||
570 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { | 570 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { |
571 | .name = DRV_NAME, | ||
571 | .chipset = ide_pci, | 572 | .chipset = ide_pci, |
572 | .init_dma = ide_dma_sgiioc4, | 573 | .init_dma = ide_dma_sgiioc4, |
573 | .port_ops = &sgiioc4_port_ops, | 574 | .port_ops = &sgiioc4_port_ops, |
@@ -587,13 +588,6 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
587 | hw_regs_t hw; | 588 | hw_regs_t hw; |
588 | struct ide_port_info d = sgiioc4_port_info; | 589 | struct ide_port_info d = sgiioc4_port_info; |
589 | 590 | ||
590 | hwif = ide_find_port(); | ||
591 | if (hwif == NULL) { | ||
592 | printk(KERN_ERR "%s: too many IDE interfaces, no room in table\n", | ||
593 | DRV_NAME); | ||
594 | return -ENOMEM; | ||
595 | } | ||
596 | |||
597 | /* Get the CmdBlk and CtrlBlk Base Registers */ | 591 | /* Get the CmdBlk and CtrlBlk Base Registers */ |
598 | bar0 = pci_resource_start(dev, 0); | 592 | bar0 = pci_resource_start(dev, 0); |
599 | virt_base = ioremap(bar0, pci_resource_len(dev, 0)); | 593 | virt_base = ioremap(bar0, pci_resource_len(dev, 0)); |
@@ -608,11 +602,11 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
608 | 602 | ||
609 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; | 603 | cmd_phys_base = bar0 + IOC4_CMD_OFFSET; |
610 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, | 604 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, |
611 | hwif->name)) { | 605 | DRV_NAME)) { |
612 | printk(KERN_ERR | 606 | printk(KERN_ERR |
613 | "%s : %s -- ERROR, Addresses " | 607 | "%s : %s -- ERROR, Addresses " |
614 | "0x%p to 0x%p ALREADY in use\n", | 608 | "0x%p to 0x%p ALREADY in use\n", |
615 | __func__, hwif->name, (void *) cmd_phys_base, | 609 | __func__, DRV_NAME, (void *) cmd_phys_base, |
616 | (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); | 610 | (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); |
617 | return -ENOMEM; | 611 | return -ENOMEM; |
618 | } | 612 | } |
@@ -623,9 +617,12 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
623 | hw.irq = dev->irq; | 617 | hw.irq = dev->irq; |
624 | hw.chipset = ide_pci; | 618 | hw.chipset = ide_pci; |
625 | hw.dev = &dev->dev; | 619 | hw.dev = &dev->dev; |
626 | ide_init_port_hw(hwif, &hw); | ||
627 | 620 | ||
628 | hwif->dev = &dev->dev; | 621 | hwif = ide_find_port_slot(&d); |
622 | if (hwif == NULL) | ||
623 | goto err; | ||
624 | |||
625 | ide_init_port_hw(hwif, &hw); | ||
629 | 626 | ||
630 | /* The IOC4 uses MMIO rather than Port IO. */ | 627 | /* The IOC4 uses MMIO rather than Port IO. */ |
631 | default_hwif_mmiops(hwif); | 628 | default_hwif_mmiops(hwif); |
@@ -641,6 +638,10 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
641 | return -EIO; | 638 | return -EIO; |
642 | 639 | ||
643 | return 0; | 640 | return 0; |
641 | err: | ||
642 | release_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE); | ||
643 | iounmap(virt_base); | ||
644 | return -ENOMEM; | ||
644 | } | 645 | } |
645 | 646 | ||
646 | static unsigned int __devinit | 647 | static unsigned int __devinit |