diff options
Diffstat (limited to 'drivers/ata/pdc_adma.c')
-rw-r--r-- | drivers/ata/pdc_adma.c | 79 |
1 files changed, 21 insertions, 58 deletions
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c index 90786d7a20bb..a6bf7cbdfdc5 100644 --- a/drivers/ata/pdc_adma.c +++ b/drivers/ata/pdc_adma.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include <linux/sched.h> | 42 | #include <linux/sched.h> |
43 | #include <linux/device.h> | 43 | #include <linux/device.h> |
44 | #include <scsi/scsi_host.h> | 44 | #include <scsi/scsi_host.h> |
45 | #include <asm/io.h> | ||
46 | #include <linux/libata.h> | 45 | #include <linux/libata.h> |
47 | 46 | ||
48 | #define DRV_NAME "pdc_adma" | 47 | #define DRV_NAME "pdc_adma" |
@@ -550,48 +549,28 @@ static int adma_port_start(struct ata_port *ap) | |||
550 | if (rc) | 549 | if (rc) |
551 | return rc; | 550 | return rc; |
552 | adma_enter_reg_mode(ap); | 551 | adma_enter_reg_mode(ap); |
553 | rc = -ENOMEM; | 552 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); |
554 | pp = kzalloc(sizeof(*pp), GFP_KERNEL); | ||
555 | if (!pp) | 553 | if (!pp) |
556 | goto err_out; | 554 | return -ENOMEM; |
557 | pp->pkt = dma_alloc_coherent(dev, ADMA_PKT_BYTES, &pp->pkt_dma, | 555 | pp->pkt = dmam_alloc_coherent(dev, ADMA_PKT_BYTES, &pp->pkt_dma, |
558 | GFP_KERNEL); | 556 | GFP_KERNEL); |
559 | if (!pp->pkt) | 557 | if (!pp->pkt) |
560 | goto err_out_kfree; | 558 | return -ENOMEM; |
561 | /* paranoia? */ | 559 | /* paranoia? */ |
562 | if ((pp->pkt_dma & 7) != 0) { | 560 | if ((pp->pkt_dma & 7) != 0) { |
563 | printk("bad alignment for pp->pkt_dma: %08x\n", | 561 | printk("bad alignment for pp->pkt_dma: %08x\n", |
564 | (u32)pp->pkt_dma); | 562 | (u32)pp->pkt_dma); |
565 | dma_free_coherent(dev, ADMA_PKT_BYTES, | 563 | return -ENOMEM; |
566 | pp->pkt, pp->pkt_dma); | ||
567 | goto err_out_kfree; | ||
568 | } | 564 | } |
569 | memset(pp->pkt, 0, ADMA_PKT_BYTES); | 565 | memset(pp->pkt, 0, ADMA_PKT_BYTES); |
570 | ap->private_data = pp; | 566 | ap->private_data = pp; |
571 | adma_reinit_engine(ap); | 567 | adma_reinit_engine(ap); |
572 | return 0; | 568 | return 0; |
573 | |||
574 | err_out_kfree: | ||
575 | kfree(pp); | ||
576 | err_out: | ||
577 | ata_port_stop(ap); | ||
578 | return rc; | ||
579 | } | 569 | } |
580 | 570 | ||
581 | static void adma_port_stop(struct ata_port *ap) | 571 | static void adma_port_stop(struct ata_port *ap) |
582 | { | 572 | { |
583 | struct device *dev = ap->host->dev; | ||
584 | struct adma_port_priv *pp = ap->private_data; | ||
585 | |||
586 | adma_reset_engine(ADMA_REGS(ap->host->mmio_base, ap->port_no)); | 573 | adma_reset_engine(ADMA_REGS(ap->host->mmio_base, ap->port_no)); |
587 | if (pp != NULL) { | ||
588 | ap->private_data = NULL; | ||
589 | if (pp->pkt != NULL) | ||
590 | dma_free_coherent(dev, ADMA_PKT_BYTES, | ||
591 | pp->pkt, pp->pkt_dma); | ||
592 | kfree(pp); | ||
593 | } | ||
594 | ata_port_stop(ap); | ||
595 | } | 574 | } |
596 | 575 | ||
597 | static void adma_host_stop(struct ata_host *host) | 576 | static void adma_host_stop(struct ata_host *host) |
@@ -600,8 +579,6 @@ static void adma_host_stop(struct ata_host *host) | |||
600 | 579 | ||
601 | for (port_no = 0; port_no < ADMA_PORTS; ++port_no) | 580 | for (port_no = 0; port_no < ADMA_PORTS; ++port_no) |
602 | adma_reset_engine(ADMA_REGS(host->mmio_base, port_no)); | 581 | adma_reset_engine(ADMA_REGS(host->mmio_base, port_no)); |
603 | |||
604 | ata_pci_host_stop(host); | ||
605 | } | 582 | } |
606 | 583 | ||
607 | static void adma_host_init(unsigned int chip_id, | 584 | static void adma_host_init(unsigned int chip_id, |
@@ -649,34 +626,28 @@ static int adma_ata_init_one(struct pci_dev *pdev, | |||
649 | if (!printed_version++) | 626 | if (!printed_version++) |
650 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | 627 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); |
651 | 628 | ||
652 | rc = pci_enable_device(pdev); | 629 | rc = pcim_enable_device(pdev); |
653 | if (rc) | 630 | if (rc) |
654 | return rc; | 631 | return rc; |
655 | 632 | ||
656 | rc = pci_request_regions(pdev, DRV_NAME); | 633 | rc = pci_request_regions(pdev, DRV_NAME); |
657 | if (rc) | 634 | if (rc) |
658 | goto err_out; | 635 | return rc; |
659 | 636 | ||
660 | if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) { | 637 | if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) |
661 | rc = -ENODEV; | 638 | return -ENODEV; |
662 | goto err_out_regions; | ||
663 | } | ||
664 | 639 | ||
665 | mmio_base = pci_iomap(pdev, 4, 0); | 640 | mmio_base = pcim_iomap(pdev, 4, 0); |
666 | if (mmio_base == NULL) { | 641 | if (mmio_base == NULL) |
667 | rc = -ENOMEM; | 642 | return -ENOMEM; |
668 | goto err_out_regions; | ||
669 | } | ||
670 | 643 | ||
671 | rc = adma_set_dma_masks(pdev, mmio_base); | 644 | rc = adma_set_dma_masks(pdev, mmio_base); |
672 | if (rc) | 645 | if (rc) |
673 | goto err_out_iounmap; | 646 | return rc; |
674 | 647 | ||
675 | probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL); | 648 | probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL); |
676 | if (probe_ent == NULL) { | 649 | if (probe_ent == NULL) |
677 | rc = -ENOMEM; | 650 | return -ENOMEM; |
678 | goto err_out_iounmap; | ||
679 | } | ||
680 | 651 | ||
681 | probe_ent->dev = pci_dev_to_dev(pdev); | 652 | probe_ent->dev = pci_dev_to_dev(pdev); |
682 | INIT_LIST_HEAD(&probe_ent->node); | 653 | INIT_LIST_HEAD(&probe_ent->node); |
@@ -703,19 +674,11 @@ static int adma_ata_init_one(struct pci_dev *pdev, | |||
703 | /* initialize adapter */ | 674 | /* initialize adapter */ |
704 | adma_host_init(board_idx, probe_ent); | 675 | adma_host_init(board_idx, probe_ent); |
705 | 676 | ||
706 | rc = ata_device_add(probe_ent); | 677 | if (!ata_device_add(probe_ent)) |
707 | kfree(probe_ent); | 678 | return -ENODEV; |
708 | if (rc != ADMA_PORTS) | ||
709 | goto err_out_iounmap; | ||
710 | return 0; | ||
711 | 679 | ||
712 | err_out_iounmap: | 680 | devm_kfree(&pdev->dev, probe_ent); |
713 | pci_iounmap(pdev, mmio_base); | 681 | return 0; |
714 | err_out_regions: | ||
715 | pci_release_regions(pdev); | ||
716 | err_out: | ||
717 | pci_disable_device(pdev); | ||
718 | return rc; | ||
719 | } | 682 | } |
720 | 683 | ||
721 | static int __init adma_ata_init(void) | 684 | static int __init adma_ata_init(void) |