diff options
Diffstat (limited to 'drivers/ide/setup-pci.c')
-rw-r--r-- | drivers/ide/setup-pci.c | 52 |
1 files changed, 45 insertions, 7 deletions
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index b85de71fdc88..ca17bf8896df 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -525,8 +525,10 @@ out: | |||
525 | return ret; | 525 | return ret; |
526 | } | 526 | } |
527 | 527 | ||
528 | int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d) | 528 | int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d, |
529 | void *priv) | ||
529 | { | 530 | { |
531 | struct ide_host *host; | ||
530 | hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL }; | 532 | hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL }; |
531 | int ret; | 533 | int ret; |
532 | 534 | ||
@@ -536,6 +538,19 @@ int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d) | |||
536 | 538 | ||
537 | ide_pci_setup_ports(dev, d, 0, &hw[0], &hws[0]); | 539 | ide_pci_setup_ports(dev, d, 0, &hw[0], &hws[0]); |
538 | 540 | ||
541 | host = ide_host_alloc(d, hws); | ||
542 | if (host == NULL) { | ||
543 | ret = -ENOMEM; | ||
544 | goto out; | ||
545 | } | ||
546 | |||
547 | host->dev[0] = &dev->dev; | ||
548 | |||
549 | host->host_priv = priv; | ||
550 | |||
551 | if (priv) | ||
552 | pci_set_drvdata(dev, host); | ||
553 | |||
539 | ret = do_ide_setup_pci_device(dev, d, 1); | 554 | ret = do_ide_setup_pci_device(dev, d, 1); |
540 | if (ret < 0) | 555 | if (ret < 0) |
541 | goto out; | 556 | goto out; |
@@ -543,16 +558,19 @@ int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d) | |||
543 | /* fixup IRQ */ | 558 | /* fixup IRQ */ |
544 | hw[1].irq = hw[0].irq = ret; | 559 | hw[1].irq = hw[0].irq = ret; |
545 | 560 | ||
546 | ret = ide_host_add(d, hws, NULL); | 561 | ret = ide_host_register(host, d, hws); |
562 | if (ret) | ||
563 | ide_host_free(host); | ||
547 | out: | 564 | out: |
548 | return ret; | 565 | return ret; |
549 | } | 566 | } |
550 | EXPORT_SYMBOL_GPL(ide_setup_pci_device); | 567 | EXPORT_SYMBOL_GPL(ide_pci_init_one); |
551 | 568 | ||
552 | int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2, | 569 | int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2, |
553 | const struct ide_port_info *d) | 570 | const struct ide_port_info *d, void *priv) |
554 | { | 571 | { |
555 | struct pci_dev *pdev[] = { dev1, dev2 }; | 572 | struct pci_dev *pdev[] = { dev1, dev2 }; |
573 | struct ide_host *host; | ||
556 | int ret, i; | 574 | int ret, i; |
557 | hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL }; | 575 | hw_regs_t hw[4], *hws[] = { NULL, NULL, NULL, NULL }; |
558 | 576 | ||
@@ -562,7 +580,25 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2, | |||
562 | goto out; | 580 | goto out; |
563 | 581 | ||
564 | ide_pci_setup_ports(pdev[i], d, 0, &hw[i*2], &hws[i*2]); | 582 | ide_pci_setup_ports(pdev[i], d, 0, &hw[i*2], &hws[i*2]); |
583 | } | ||
565 | 584 | ||
585 | host = ide_host_alloc(d, hws); | ||
586 | if (host == NULL) { | ||
587 | ret = -ENOMEM; | ||
588 | goto out; | ||
589 | } | ||
590 | |||
591 | host->dev[0] = &dev1->dev; | ||
592 | host->dev[1] = &dev2->dev; | ||
593 | |||
594 | host->host_priv = priv; | ||
595 | |||
596 | if (priv) { | ||
597 | pci_set_drvdata(pdev[0], host); | ||
598 | pci_set_drvdata(pdev[1], host); | ||
599 | } | ||
600 | |||
601 | for (i = 0; i < 2; i++) { | ||
566 | ret = do_ide_setup_pci_device(pdev[i], d, !i); | 602 | ret = do_ide_setup_pci_device(pdev[i], d, !i); |
567 | 603 | ||
568 | /* | 604 | /* |
@@ -576,8 +612,10 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2, | |||
576 | hw[i*2 + 1].irq = hw[i*2].irq = ret; | 612 | hw[i*2 + 1].irq = hw[i*2].irq = ret; |
577 | } | 613 | } |
578 | 614 | ||
579 | ret = ide_host_add(d, hws, NULL); | 615 | ret = ide_host_register(host, d, hws); |
616 | if (ret) | ||
617 | ide_host_free(host); | ||
580 | out: | 618 | out: |
581 | return ret; | 619 | return ret; |
582 | } | 620 | } |
583 | EXPORT_SYMBOL_GPL(ide_setup_pci_devices); | 621 | EXPORT_SYMBOL_GPL(ide_pci_init_two); |