aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ide/setup-pci.c70
1 files changed, 16 insertions, 54 deletions
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c
index 5314edffc303..ab3db61d2ba0 100644
--- a/drivers/ide/setup-pci.c
+++ b/drivers/ide/setup-pci.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org> 2 * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
3 * Copyright (C) 1995-1998 Mark Lord 3 * Copyright (C) 1995-1998 Mark Lord
4 * Copyright (C) 2007 Bartlomiej Zolnierkiewicz 4 * Copyright (C) 2007-2009 Bartlomiej Zolnierkiewicz
5 * 5 *
6 * May be copied or modified under the terms of the GNU General Public License 6 * May be copied or modified under the terms of the GNU General Public License
7 */ 7 */
@@ -534,61 +534,15 @@ out:
534 return ret; 534 return ret;
535} 535}
536 536
537int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d,
538 void *priv)
539{
540 struct ide_host *host;
541 struct ide_hw hw[2], *hws[] = { NULL, NULL };
542 int ret;
543
544 ret = ide_setup_pci_controller(dev, d, 1);
545 if (ret < 0)
546 goto out;
547
548 ide_pci_setup_ports(dev, d, &hw[0], &hws[0]);
549
550 host = ide_host_alloc(d, hws, 2);
551 if (host == NULL) {
552 ret = -ENOMEM;
553 goto out;
554 }
555
556 host->dev[0] = &dev->dev;
557
558 host->host_priv = priv;
559
560 host->irq_flags = IRQF_SHARED;
561
562 pci_set_drvdata(dev, host);
563
564 ret = do_ide_setup_pci_device(dev, d, 1);
565 if (ret < 0)
566 goto out;
567
568 /* fixup IRQ */
569 if (ide_pci_is_in_compatibility_mode(dev)) {
570 hw[0].irq = pci_get_legacy_ide_irq(dev, 0);
571 hw[1].irq = pci_get_legacy_ide_irq(dev, 1);
572 } else
573 hw[1].irq = hw[0].irq = ret;
574
575 ret = ide_host_register(host, d, hws);
576 if (ret)
577 ide_host_free(host);
578out:
579 return ret;
580}
581EXPORT_SYMBOL_GPL(ide_pci_init_one);
582
583int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2, 537int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2,
584 const struct ide_port_info *d, void *priv) 538 const struct ide_port_info *d, void *priv)
585{ 539{
586 struct pci_dev *pdev[] = { dev1, dev2 }; 540 struct pci_dev *pdev[] = { dev1, dev2 };
587 struct ide_host *host; 541 struct ide_host *host;
588 int ret, i; 542 int ret, i, n_ports = dev2 ? 4 : 2;
589 struct ide_hw hw[4], *hws[] = { NULL, NULL, NULL, NULL }; 543 struct ide_hw hw[4], *hws[] = { NULL, NULL, NULL, NULL };
590 544
591 for (i = 0; i < 2; i++) { 545 for (i = 0; i < n_ports / 2; i++) {
592 ret = ide_setup_pci_controller(pdev[i], d, !i); 546 ret = ide_setup_pci_controller(pdev[i], d, !i);
593 if (ret < 0) 547 if (ret < 0)
594 goto out; 548 goto out;
@@ -596,23 +550,24 @@ int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2,
596 ide_pci_setup_ports(pdev[i], d, &hw[i*2], &hws[i*2]); 550 ide_pci_setup_ports(pdev[i], d, &hw[i*2], &hws[i*2]);
597 } 551 }
598 552
599 host = ide_host_alloc(d, hws, 4); 553 host = ide_host_alloc(d, hws, n_ports);
600 if (host == NULL) { 554 if (host == NULL) {
601 ret = -ENOMEM; 555 ret = -ENOMEM;
602 goto out; 556 goto out;
603 } 557 }
604 558
605 host->dev[0] = &dev1->dev; 559 host->dev[0] = &dev1->dev;
606 host->dev[1] = &dev2->dev; 560 if (dev2)
561 host->dev[1] = &dev2->dev;
607 562
608 host->host_priv = priv; 563 host->host_priv = priv;
609
610 host->irq_flags = IRQF_SHARED; 564 host->irq_flags = IRQF_SHARED;
611 565
612 pci_set_drvdata(pdev[0], host); 566 pci_set_drvdata(pdev[0], host);
613 pci_set_drvdata(pdev[1], host); 567 if (dev2)
568 pci_set_drvdata(pdev[1], host);
614 569
615 for (i = 0; i < 2; i++) { 570 for (i = 0; i < n_ports / 2; i++) {
616 ret = do_ide_setup_pci_device(pdev[i], d, !i); 571 ret = do_ide_setup_pci_device(pdev[i], d, !i);
617 572
618 /* 573 /*
@@ -638,6 +593,13 @@ out:
638} 593}
639EXPORT_SYMBOL_GPL(ide_pci_init_two); 594EXPORT_SYMBOL_GPL(ide_pci_init_two);
640 595
596int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d,
597 void *priv)
598{
599 return ide_pci_init_two(dev, NULL, d, priv);
600}
601EXPORT_SYMBOL_GPL(ide_pci_init_one);
602
641void ide_pci_remove(struct pci_dev *dev) 603void ide_pci_remove(struct pci_dev *dev)
642{ 604{
643 struct ide_host *host = pci_get_drvdata(dev); 605 struct ide_host *host = pci_get_drvdata(dev);