]> err.no Git - linux-2.6/commitdiff
libata: update libata LLDs to use devres
authorTejun Heo <htejun@gmail.com>
Sat, 20 Jan 2007 07:00:28 +0000 (16:00 +0900)
committerJeff Garzik <jeff@garzik.org>
Fri, 9 Feb 2007 22:39:37 +0000 (17:39 -0500)
Update libata LLDs to use devres.  Core layer is already converted to
support managed LLDs.  This patch simplifies initialization and fixes
many resource related bugs in init failure and detach path.  For
example, all converted drivers now handle ata_device_add() failure
gracefully without excessive resource rollback code.

As most resources are released automatically on driver detach, many
drivers don't need or can do with much simpler ->{port|host}_stop().
In general, stop callbacks are need iff port or host needs to be given
commands to shut it down.  Note that freezing is enough in many cases
and ports are automatically frozen before being detached.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
59 files changed:
drivers/ata/ahci.c
drivers/ata/ata_generic.c
drivers/ata/ata_piix.c
drivers/ata/pata_ali.c
drivers/ata/pata_amd.c
drivers/ata/pata_artop.c
drivers/ata/pata_atiixp.c
drivers/ata/pata_cmd64x.c
drivers/ata/pata_cs5520.c
drivers/ata/pata_cs5530.c
drivers/ata/pata_cs5535.c
drivers/ata/pata_cypress.c
drivers/ata/pata_efar.c
drivers/ata/pata_hpt366.c
drivers/ata/pata_hpt37x.c
drivers/ata/pata_hpt3x2n.c
drivers/ata/pata_hpt3x3.c
drivers/ata/pata_isapnp.c
drivers/ata/pata_it8213.c
drivers/ata/pata_it821x.c
drivers/ata/pata_ixp4xx_cf.c
drivers/ata/pata_jmicron.c
drivers/ata/pata_legacy.c
drivers/ata/pata_marvell.c
drivers/ata/pata_mpc52xx.c
drivers/ata/pata_mpiix.c
drivers/ata/pata_netcell.c
drivers/ata/pata_ns87410.c
drivers/ata/pata_oldpiix.c
drivers/ata/pata_opti.c
drivers/ata/pata_optidma.c
drivers/ata/pata_pcmcia.c
drivers/ata/pata_pdc2027x.c
drivers/ata/pata_pdc202xx_old.c
drivers/ata/pata_qdi.c
drivers/ata/pata_radisys.c
drivers/ata/pata_rz1000.c
drivers/ata/pata_sc1200.c
drivers/ata/pata_serverworks.c
drivers/ata/pata_sil680.c
drivers/ata/pata_sis.c
drivers/ata/pata_sl82c105.c
drivers/ata/pata_triflex.c
drivers/ata/pata_via.c
drivers/ata/pata_winbond.c
drivers/ata/pdc_adma.c
drivers/ata/sata_inic162x.c
drivers/ata/sata_mv.c
drivers/ata/sata_nv.c
drivers/ata/sata_promise.c
drivers/ata/sata_qstor.c
drivers/ata/sata_sil.c
drivers/ata/sata_sil24.c
drivers/ata/sata_sis.c
drivers/ata/sata_svw.c
drivers/ata/sata_sx4.c
drivers/ata/sata_uli.c
drivers/ata/sata_via.c
drivers/ata/sata_vsc.c

index d72568392e6c94b041158b84114be86fa004b67f..20ab3ffce5595a516d520962abd6a016cad42a8f 100644 (file)
@@ -45,7 +45,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "ahci"
 #define DRV_VERSION    "2.0"
@@ -166,9 +165,6 @@ enum {
        PORT_CMD_ICC_PARTIAL    = (0x2 << 28), /* Put i/f in partial state */
        PORT_CMD_ICC_SLUMBER    = (0x6 << 28), /* Put i/f in slumber state */
 
-       /* hpriv->flags bits */
-       AHCI_FLAG_MSI           = (1 << 0),
-
        /* ap->flags bits */
        AHCI_FLAG_NO_NCQ                = (1 << 24),
        AHCI_FLAG_IGN_IRQ_IF_ERR        = (1 << 25), /* ignore IRQ_IF_ERR */
@@ -191,7 +187,6 @@ struct ahci_sg {
 };
 
 struct ahci_host_priv {
-       unsigned long           flags;
        u32                     cap;    /* cache of HOST_CAP register */
        u32                     port_map; /* cache of HOST_PORTS_IMPL reg */
 };
@@ -229,7 +224,6 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg);
 static int ahci_port_resume(struct ata_port *ap);
 static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg);
 static int ahci_pci_device_resume(struct pci_dev *pdev);
-static void ahci_remove_one (struct pci_dev *pdev);
 
 static struct scsi_host_template ahci_sht = {
        .module                 = THIS_MODULE,
@@ -441,9 +435,9 @@ static struct pci_driver ahci_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = ahci_pci_tbl,
        .probe                  = ahci_init_one,
+       .remove                 = ata_pci_remove_one,
        .suspend                = ahci_pci_device_suspend,
        .resume                 = ahci_pci_device_resume,
-       .remove                 = ahci_remove_one,
 };
 
 
@@ -1426,23 +1420,18 @@ static int ahci_port_start(struct ata_port *ap)
        dma_addr_t mem_dma;
        int rc;
 
-       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
                return -ENOMEM;
-       memset(pp, 0, sizeof(*pp));
 
        rc = ata_pad_alloc(ap, dev);
-       if (rc) {
-               kfree(pp);
+       if (rc)
                return rc;
-       }
 
-       mem = dma_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma, GFP_KERNEL);
-       if (!mem) {
-               ata_pad_free(ap, dev);
-               kfree(pp);
+       mem = dmam_alloc_coherent(dev, AHCI_PORT_PRIV_DMA_SZ, &mem_dma,
+                                 GFP_KERNEL);
+       if (!mem)
                return -ENOMEM;
-       }
        memset(mem, 0, AHCI_PORT_PRIV_DMA_SZ);
 
        /*
@@ -1484,9 +1473,7 @@ static int ahci_port_start(struct ata_port *ap)
 
 static void ahci_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
        struct ahci_host_priv *hpriv = ap->host->private_data;
-       struct ahci_port_priv *pp = ap->private_data;
        void __iomem *mmio = ap->host->mmio_base;
        void __iomem *port_mmio = ahci_port_base(mmio, ap->port_no);
        const char *emsg = NULL;
@@ -1496,12 +1483,6 @@ static void ahci_port_stop(struct ata_port *ap)
        rc = ahci_deinit_port(port_mmio, hpriv->cap, &emsg);
        if (rc)
                ata_port_printk(ap, KERN_WARNING, "%s (%d)\n", emsg, rc);
-
-       ap->private_data = NULL;
-       dma_free_coherent(dev, AHCI_PORT_PRIV_DMA_SZ,
-                         pp->cmd_slot, pp->cmd_slot_dma);
-       ata_pad_free(ap, dev);
-       kfree(pp);
 }
 
 static void ahci_setup_port(struct ata_ioports *port, unsigned long base,
@@ -1669,15 +1650,15 @@ static void ahci_print_info(struct ata_probe_ent *probe_ent)
                );
 }
 
-static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
+static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
+       unsigned int board_idx = (unsigned int) ent->driver_data;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
        struct ahci_host_priv *hpriv;
        unsigned long base;
        void __iomem *mmio_base;
-       unsigned int board_idx = (unsigned int) ent->driver_data;
-       int have_msi, pci_dev_busy = 0;
        int rc;
 
        VPRINTK("ENTER\n");
@@ -1694,46 +1675,34 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                        return -ENODEV;
        }
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
-       if (pci_enable_msi(pdev) == 0)
-               have_msi = 1;
-       else {
+       if (pci_enable_msi(pdev))
                pci_intx(pdev, 1);
-               have_msi = 0;
-       }
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_msi;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, AHCI_PCI_BAR, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, AHCI_PCI_BAR, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
        base = (unsigned long) mmio_base;
 
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-       memset(hpriv, 0, sizeof(*hpriv));
+       hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
        probe_ent->sht          = ahci_port_info[board_idx].sht;
        probe_ent->port_flags   = ahci_port_info[board_idx].flags;
@@ -1746,13 +1715,10 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        probe_ent->mmio_base = mmio_base;
        probe_ent->private_data = hpriv;
 
-       if (have_msi)
-               hpriv->flags |= AHCI_FLAG_MSI;
-
        /* initialize adapter */
        rc = ahci_host_init(probe_ent);
        if (rc)
-               goto err_out_hpriv;
+               return rc;
 
        if (!(probe_ent->port_flags & AHCI_FLAG_NO_NCQ) &&
            (hpriv->cap & HOST_CAP_NCQ))
@@ -1760,48 +1726,11 @@ static int ahci_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        ahci_print_info(probe_ent);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_hpriv:
-       kfree(hpriv);
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_msi:
-       if (have_msi)
-               pci_disable_msi(pdev);
-       else
-               pci_intx(pdev, 0);
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
-}
-
-static void ahci_remove_one(struct pci_dev *pdev)
-{
-       struct device *dev = pci_dev_to_dev(pdev);
-       struct ata_host *host = dev_get_drvdata(dev);
-       struct ahci_host_priv *hpriv = host->private_data;
-
-       ata_host_remove(host);
-
-       pci_iounmap(pdev, host->mmio_base);
-
-       if (hpriv->flags & AHCI_FLAG_MSI)
-               pci_disable_msi(pdev);
-       else
-               pci_intx(pdev, 0);
-       pci_release_regions(pdev);
-       pci_disable_device(pdev);
-       dev_set_drvdata(dev, NULL);
-       kfree(hpriv);
 }
 
 static int __init ahci_init(void)
index 24af56081b5d86a4ab2ae2736cacfb5dc038d836..a25cbd653b0c6936adf0e616172bc0df9600d7f6 100644 (file)
@@ -152,8 +152,6 @@ static struct ata_port_operations generic_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int all_generic_ide;            /* Set to claim all devices */
index f15ef88ba00c10acbbc2dda7b6faea6a0e52bdca..c6bf1a338d1a652918fb8ac33fb08f58e77ff7d5 100644 (file)
@@ -154,7 +154,6 @@ struct piix_host_priv {
 
 static int piix_init_one (struct pci_dev *pdev,
                                    const struct pci_device_id *ent);
-static void piix_host_stop(struct ata_host *host);
 static void piix_pata_error_handler(struct ata_port *ap);
 static void ich_pata_error_handler(struct ata_port *ap);
 static void piix_sata_error_handler(struct ata_port *ap);
@@ -311,8 +310,6 @@ static const struct ata_port_operations piix_pata_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = piix_host_stop,
 };
 
 static const struct ata_port_operations ich_pata_ops = {
@@ -344,8 +341,6 @@ static const struct ata_port_operations ich_pata_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = piix_host_stop,
 };
 
 static const struct ata_port_operations piix_sata_ops = {
@@ -374,8 +369,6 @@ static const struct ata_port_operations piix_sata_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = piix_host_stop,
 };
 
 static const struct piix_map_db ich5_map_db = {
@@ -1072,6 +1065,7 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev,
 static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
+       struct device *dev = &pdev->dev;
        struct ata_port_info port_info[2];
        struct ata_port_info *ppinfo[2] = { &port_info[0], &port_info[1] };
        struct piix_host_priv *hpriv;
@@ -1085,7 +1079,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (!in_module_init)
                return -ENODEV;
 
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
+       hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
        if (!hpriv)
                return -ENOMEM;
 
@@ -1135,15 +1129,6 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        return ata_pci_init_one(pdev, ppinfo, 2);
 }
 
-static void piix_host_stop(struct ata_host *host)
-{
-       struct piix_host_priv *hpriv = host->private_data;
-
-       ata_host_stop(host);
-
-       kfree(hpriv);
-}
-
 static int __init piix_init(void)
 {
        int rc;
index fde5ce9f7eaea7255344dbdf0d2c8d08b2a64a92..f4fdb10211e32448449fe93fdaf859397921a8f2 100644 (file)
@@ -376,8 +376,6 @@ static struct ata_port_operations ali_early_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -417,8 +415,6 @@ static struct ata_port_operations ali_20_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -455,8 +451,6 @@ static struct ata_port_operations ali_c2_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -492,8 +486,6 @@ static struct ata_port_operations ali_c5_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 
index a6b330089f227f0fe62204f001b23cb3c97fef87..7ee0c83c657ad5382157700a858c9bf38a54dfea 100644 (file)
@@ -368,8 +368,6 @@ static struct ata_port_operations amd33_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations amd66_port_ops = {
@@ -402,8 +400,6 @@ static struct ata_port_operations amd66_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations amd100_port_ops = {
@@ -436,8 +432,6 @@ static struct ata_port_operations amd100_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations amd133_port_ops = {
@@ -470,8 +464,6 @@ static struct ata_port_operations amd133_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations nv100_port_ops = {
@@ -504,8 +496,6 @@ static struct ata_port_operations nv100_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations nv133_port_ops = {
@@ -538,8 +528,6 @@ static struct ata_port_operations nv133_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
index 37bc1323bda7aad0aff65f3aa7b95cc8fb889069..5baea1222227554b7e86c66747de1d7eb0c4e005 100644 (file)
@@ -347,8 +347,6 @@ static const struct ata_port_operations artop6210_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations artop6260_ops = {
@@ -379,8 +377,6 @@ static const struct ata_port_operations artop6260_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index 504e1dbfffd7d9d6581fe4432c8e266bcd70730e..2bfb99493a72de569876473fc5f5f716cf0d31f7 100644 (file)
@@ -258,8 +258,6 @@ static struct ata_port_operations atiixp_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int atiixp_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 449162cbf93ef13477bbecaff90e23fdbf8df585..d97aa9bb05009c0836415fc58af76aca4e078eea 100644 (file)
@@ -319,8 +319,6 @@ static struct ata_port_operations cmd64x_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations cmd646r1_port_ops = {
@@ -353,8 +351,6 @@ static struct ata_port_operations cmd646r1_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations cmd648_port_ops = {
@@ -387,8 +383,6 @@ static struct ata_port_operations cmd648_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
index 476b87963f5d0b2bd3405ea0424e2dd766231e9f..63bdcbe455838cb8db1f1be636004d98e1ddb456 100644 (file)
@@ -199,8 +199,6 @@ static struct ata_port_operations cs5520_port_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id)
@@ -294,7 +292,7 @@ static void __devexit cs5520_remove_one(struct pci_dev *pdev)
        struct device *dev = pci_dev_to_dev(pdev);
        struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_remove(host);
+       ata_host_detach(host);
        dev_set_drvdata(dev, NULL);
 }
 
index 611d90f0d3bc0ab23ae3340aac55b285fbdbd8dc..29d459be19be946baa25c19b1eb0f7bb292abb2c 100644 (file)
@@ -216,8 +216,6 @@ static struct ata_port_operations cs5530_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct dmi_system_id palmax_dmi_table[] = {
index e3efec4ffc79ada787f54d8b612b6cf1db294168..dd3958d2cff97f1cc1ebd8743a93d1ba41b196d3 100644 (file)
@@ -220,8 +220,6 @@ static struct ata_port_operations cs5535_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index e2a95699bae7ff293ef1eb29fa5d859db3ccefd8..8479186a23738ad01e38d3874b77bb10e580dd50 100644 (file)
@@ -171,8 +171,6 @@ static struct ata_port_operations cy82c693_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int cy82c693_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
index edf8a63f50af3afe6b54d93a0deffa5da252dcb7..66814ee64d05e985449d0bb17cb69c580a2f7d8e 100644 (file)
@@ -267,8 +267,6 @@ static const struct ata_port_operations efar_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index 2202c7ec16e360951d051562e4a54e44e1cead5a..8b826102dbd9a5bba5340f795698afaff587adb5 100644 (file)
@@ -367,8 +367,6 @@ static struct ata_port_operations hpt366_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 9e1eb473c0a1a4a304db00d0094c3cd456b3e7c4..09e8be56ba36466a9aacb19c666ebc41bae354a0 100644 (file)
@@ -802,8 +802,6 @@ static struct ata_port_operations hpt370_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -841,8 +839,6 @@ static struct ata_port_operations hpt370a_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -881,8 +877,6 @@ static struct ata_port_operations hpt372_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -921,8 +915,6 @@ static struct ata_port_operations hpt374_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 886fab9aa62c5cdaec19c0036e3b32eb1cf3148c..9f8ec576317cf7070b47c68b9395e0d8c04efd91 100644 (file)
@@ -379,8 +379,6 @@ static struct ata_port_operations hpt3x2n_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 5caf167e26deb32a51e738bcf166c7457fb82a94..faa2db44ba7ff716eea6c2b1aaf4c8d9cc906e67 100644 (file)
@@ -154,8 +154,6 @@ static struct ata_port_operations hpt3x3_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index a97d55ae95c9e6809e450befd37fdf5df32bc98e..38a42eae598e26037cfbf6ef0a84ef129aeffd53 100644 (file)
@@ -59,8 +59,6 @@ static struct ata_port_operations isapnp_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -120,7 +118,7 @@ static void isapnp_remove_one(struct pnp_dev *idev)
        struct device *dev = &idev->dev;
        struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_remove(host);
+       ata_host_detach(host);
        dev_set_drvdata(dev, NULL);
 }
 
index 7e9a41630e593d8a7464fdfa4a81f898274711cd..383a611b662e2f276b21f8f27f259e7b63520a7d 100644 (file)
@@ -279,8 +279,6 @@ static const struct ata_port_operations it8213_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index 171fbd206bd5520252c3e059302b948225c3cc5f..f23365b92c0f66865eb52b67cdb21e587a81c59e 100644 (file)
@@ -594,14 +594,10 @@ static int it821x_port_start(struct ata_port *ap)
        if (ret < 0)
                return ret;
 
-       ap->private_data = kmalloc(sizeof(struct it821x_dev), GFP_KERNEL);
-       if (ap->private_data == NULL) {
-               ata_port_stop(ap);
+       itdev = devm_kzalloc(&pdev->dev, sizeof(struct it821x_dev), GFP_KERNEL);
+       if (itdev == NULL)
                return -ENOMEM;
-       }
-
-       itdev = ap->private_data;
-       memset(itdev, 0, sizeof(struct it821x_dev));
+       ap->private_data = itdev;
 
        pci_read_config_byte(pdev, 0x50, &conf);
 
@@ -632,20 +628,6 @@ static int it821x_port_start(struct ata_port *ap)
        return 0;
 }
 
-/**
- *     it821x_port_stop        -       port shutdown
- *     @ap: ATA port being removed
- *
- *     Release the private objects we added in it821x_port_start
- */
-
-static void it821x_port_stop(struct ata_port *ap) {
-       kfree(ap->private_data);
-       ap->private_data = NULL;        /* We want an OOPS if we reuse this
-                                          too late! */
-       ata_port_stop(ap);
-}
-
 static struct scsi_host_template it821x_sht = {
        .module                 = THIS_MODULE,
        .name                   = DRV_NAME,
@@ -698,8 +680,6 @@ static struct ata_port_operations it821x_smart_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = it821x_port_start,
-       .port_stop      = it821x_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations it821x_passthru_port_ops = {
@@ -734,8 +714,6 @@ static struct ata_port_operations it821x_passthru_port_ops = {
        .irq_handler    = ata_interrupt,
 
        .port_start     = it821x_port_start,
-       .port_stop      = it821x_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static void __devinit it821x_disable_raid(struct pci_dev *pdev)
index 23b8aab3ebd8f876fff754736cb0b18bad8f1b7d..230067d281e3d712a57b5a30bc304d4f91387844 100644 (file)
@@ -95,14 +95,6 @@ static void ixp4xx_irq_clear(struct ata_port *ap)
 {
 }
 
-static void ixp4xx_host_stop (struct ata_host *host)
-{
-       struct ixp4xx_pata_data *data = host->dev->platform_data;
-
-       iounmap(data->cs0);
-       iounmap(data->cs1);
-}
-
 static struct scsi_host_template ixp4xx_sht = {
        .module                 = THIS_MODULE,
        .name                   = DRV_NAME,
@@ -141,8 +133,6 @@ static struct ata_port_operations ixp4xx_port_ops = {
        .irq_clear      = ixp4xx_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ixp4xx_host_stop,
 
        .phy_reset      = ixp4xx_phy_reset,
 };
@@ -195,8 +185,8 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev)
 
        pdev->dev.coherent_dma_mask = DMA_32BIT_MASK;
 
-       data->cs0 = ioremap(cs0->start, 0x1000);
-       data->cs1 = ioremap(cs1->start, 0x1000);
+       data->cs0 = devm_ioremap(&pdev->dev, cs0->start, 0x1000);
+       data->cs1 = devm_ioremap(&pdev->dev, cs1->start, 0x1000);
 
        irq = platform_get_irq(pdev, 0);
        if (irq)
@@ -238,7 +228,7 @@ static __devexit int ixp4xx_pata_remove(struct platform_device *dev)
 {
        struct ata_host *host = platform_get_drvdata(dev);
 
-       ata_host_remove(host);
+       ata_host_detach(host);
        platform_set_drvdata(dev, NULL);
 
        return 0;
index aaf6787f5342ee3659df62c6d5aa433f18ad7cc3..128a30958210ed08cc8b71f1f0e14a1e45265525 100644 (file)
@@ -169,8 +169,6 @@ static const struct ata_port_operations jmicron_ops = {
 
        /* Generic PATA PCI ATA helpers */
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index 581cb33c6f456df927ac4ba2f88a601dc042b50e..9532b9bb6d2f0f0270f2de3fed88a60b4fc36b64 100644 (file)
@@ -170,8 +170,6 @@ static struct ata_port_operations simple_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations legacy_port_ops = {
@@ -195,8 +193,6 @@ static struct ata_port_operations legacy_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -305,8 +301,6 @@ static struct ata_port_operations pdc20230_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -357,8 +351,6 @@ static struct ata_port_operations ht6560a_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -420,8 +412,6 @@ static struct ata_port_operations ht6560b_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -538,8 +528,6 @@ static struct ata_port_operations opti82c611a_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /*
@@ -668,8 +656,6 @@ static struct ata_port_operations opti82c46x_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 
@@ -689,21 +675,19 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
        struct legacy_data *ld = &legacy_data[nr_legacy_host];
        struct ata_probe_ent ae;
        struct platform_device *pdev;
-       int ret = -EBUSY;
        struct ata_port_operations *ops = &legacy_port_ops;
        int pio_modes = pio_mask;
        u32 mask = (1 << port);
-
-       if (request_region(io, 8, "pata_legacy") == NULL)
-               return -EBUSY;
-       if (request_region(ctrl, 1, "pata_legacy") == NULL)
-               goto fail_io;
+       int ret;
 
        pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0);
-       if (IS_ERR(pdev)) {
-               ret = PTR_ERR(pdev);
-               goto fail_dev;
-       }
+       if (IS_ERR(pdev))
+               return PTR_ERR(pdev);
+
+       ret = -EBUSY;
+       if (devm_request_region(&pdev->dev, io, 8, "pata_legacy") == NULL ||
+           devm_request_region(&pdev->dev, ctrl, 1, "pata_legacy") == NULL)
+               goto fail;
 
        if (ht6560a & mask) {
                ops = &ht6560a_port_ops;
@@ -776,21 +760,16 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
        ata_std_ports(&ae.port[0]);
        ae.private_data = ld;
 
-       ret = ata_device_add(&ae);
-       if (ret == 0) {
-               ret = -ENODEV;
+       ret = -ENODEV;
+       if (!ata_device_add(&ae))
                goto fail;
-       }
+
        legacy_host[nr_legacy_host++] = dev_get_drvdata(&pdev->dev);
        ld->platform_dev = pdev;
        return 0;
 
 fail:
        platform_device_unregister(pdev);
-fail_dev:
-       release_region(ctrl, 1);
-fail_io:
-       release_region(io, 8);
        return ret;
 }
 
@@ -923,15 +902,11 @@ static __exit void legacy_exit(void)
 
        for (i = 0; i < nr_legacy_host; i++) {
                struct legacy_data *ld = &legacy_data[i];
-               struct ata_port *ap =legacy_host[i]->ports[0];
-               unsigned long io = ap->ioaddr.cmd_addr;
-               unsigned long ctrl = ap->ioaddr.ctl_addr;
-               ata_host_remove(legacy_host[i]);
+
+               ata_host_detach(legacy_host[i]);
                platform_device_unregister(ld->platform_dev);
                if (ld->timing)
                        release_region(ld->timing, 2);
-               release_region(io, 8);
-               release_region(ctrl, 1);
        }
 }
 
index af93533551ac55b28647385596da827e3c3ae8ba..0a4409546a02dc408ba97018b8fd5cf768dec374 100644 (file)
@@ -137,8 +137,6 @@ static const struct ata_port_operations marvell_ops = {
 
        /* Generic PATA PCI ATA helpers */
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index 8b7019a2f1904c9a7b8ab794adf90d77c5bccc89..5320ea854365def4b0e21dddc65cd360668bfe55 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/delay.h>
 #include <linux/libata.h>
 
-#include <asm/io.h>
 #include <asm/types.h>
 #include <asm/prom.h>
 #include <asm/of_platform.h>
@@ -300,8 +299,6 @@ static struct ata_port_operations mpc52xx_ata_port_ops = {
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_probe_ent mpc52xx_ata_probe_ent = {
@@ -353,7 +350,7 @@ mpc52xx_ata_remove_one(struct device *dev)
        struct ata_host *host = dev_get_drvdata(dev);
        struct mpc52xx_ata_priv *priv = host->private_data;
 
-       ata_host_remove(host);
+       ata_host_detach(host);
 
        return priv;
 }
@@ -369,8 +366,8 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
        unsigned int ipb_freq;
        struct resource res_mem;
        int ata_irq = NO_IRQ;
-       struct mpc52xx_ata __iomem *ata_regs = NULL;
-       struct mpc52xx_ata_priv *priv = NULL;
+       struct mpc52xx_ata __iomem *ata_regs;
+       struct mpc52xx_ata_priv *priv;
        int rv;
 
        /* Get ipb frequency */
@@ -397,16 +394,17 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
        }
 
        /* Request mem region */
-       if (!request_mem_region(res_mem.start,
-                               sizeof(struct mpc52xx_ata), DRV_NAME)) {
+       if (!devm_request_mem_region(&op->dev, res_mem.start,
+                                    sizeof(struct mpc52xx_ata), DRV_NAME)) {
                printk(KERN_ERR DRV_NAME ": "
                        "Error while requesting mem region\n");
-               irq_dispose_mapping(ata_irq);
-               return -EBUSY;
+               rv = -EBUSY;
+               goto err;
        }
 
        /* Remap registers */
-       ata_regs = ioremap(res_mem.start, sizeof(struct mpc52xx_ata));
+       ata_regs = devm_ioremap(&op->dev, res_mem.start,
+                               sizeof(struct mpc52xx_ata));
        if (!ata_regs) {
                printk(KERN_ERR DRV_NAME ": "
                        "Error while mapping register set\n");
@@ -415,7 +413,8 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
        }
 
        /* Prepare our private structure */
-       priv = kmalloc(sizeof(struct mpc52xx_ata_priv), GFP_ATOMIC);
+       priv = devm_kzalloc(&op->dev, sizeof(struct mpc52xx_ata_priv),
+                           GFP_ATOMIC);
        if (!priv) {
                printk(KERN_ERR DRV_NAME ": "
                        "Error while allocating private structure\n");
@@ -448,15 +447,7 @@ mpc52xx_ata_probe(struct of_device *op, const struct of_device_id *match)
 
        /* Error path */
 err:
-       kfree(priv);
-
-       if (ata_regs)
-               iounmap(ata_regs);
-
-       release_mem_region(res_mem.start, sizeof(struct mpc52xx_ata));
-
        irq_dispose_mapping(ata_irq);
-
        return rv;
 }
 
@@ -464,28 +455,10 @@ static int
 mpc52xx_ata_remove(struct of_device *op)
 {
        struct mpc52xx_ata_priv *priv;
-       struct resource res_mem;
-       int rv;
 
-       /* Unregister */
        priv = mpc52xx_ata_remove_one(&op->dev);
-
-       /* Free everything */
-       iounmap(priv->ata_regs);
-
-       rv = of_address_to_resource(op->node, 0, &res_mem);
-       if (rv) {
-               printk(KERN_ERR DRV_NAME ": "
-                       "Error while parsing device node resource\n");
-               printk(KERN_ERR DRV_NAME ": "
-                       "Zone may not be properly released\n");
-       } else
-               release_mem_region(res_mem.start, sizeof(struct mpc52xx_ata));
-
        irq_dispose_mapping(priv->ata_irq);
 
-       kfree(priv);
-
        return 0;
 }
 
index 4ccca938675e754a295d78d2c9510662627e1563..c4a1b10f3bca32f8b66403734f6f82defadb4398 100644 (file)
@@ -194,8 +194,6 @@ static struct ata_port_operations mpiix_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
@@ -258,24 +256,6 @@ static int mpiix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
        return -ENODEV;
 }
 
-/**
- *     mpiix_remove_one        -       device unload
- *     @pdev: PCI device being removed
- *
- *     Handle an unplug/unload event for a PCI device. Unload the
- *     PCI driver but do not use the default handler as we *MUST NOT*
- *     disable the device as it has other functions.
- */
-
-static void __devexit mpiix_remove_one(struct pci_dev *pdev)
-{
-       struct device *dev = pci_dev_to_dev(pdev);
-       struct ata_host *host = dev_get_drvdata(dev);
-
-       ata_host_remove(host);
-       dev_set_drvdata(dev, NULL);
-}
-
 static const struct pci_device_id mpiix[] = {
        { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371MX), },
 
@@ -286,7 +266,7 @@ static struct pci_driver mpiix_pci_driver = {
        .name           = DRV_NAME,
        .id_table       = mpiix,
        .probe          = mpiix_init_one,
-       .remove         = mpiix_remove_one,
+       .remove         = ata_pci_remove_one,
        .suspend        = ata_pci_device_suspend,
        .resume         = ata_pci_device_resume,
 };
index cf7fe037471c3e94660f97655885d53646a0295f..2a2f8df70582c073cbba7a170592b01d95c05865 100644 (file)
@@ -97,8 +97,6 @@ static const struct ata_port_operations netcell_ops = {
 
        /* Generic PATA PCI ATA helpers */
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index c3032eb9010dfa4b6405f44f3daea6bb7477b469..fdafd92c92a9b0ea3240b2cfadbd03ab973b3af7 100644 (file)
@@ -185,8 +185,6 @@ static struct ata_port_operations ns87410_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int ns87410_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 10ac3cc10181cbd5b48cd45dcac06f6637797bc6..df9f7fd4b4e576dd8c29471bd4c5775a5dffec6e 100644 (file)
@@ -265,8 +265,6 @@ static const struct ata_port_operations oldpiix_pata_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index c2988b0aa8ea07f30f73054ab97e5729ed733ecd..58951ccd1e4d9b508ea346b4c0fadadf1d9709a8 100644 (file)
@@ -211,8 +211,6 @@ static struct ata_port_operations opti_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int opti_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 80d111c569dc25db5fc74d76e199a31bf3c28a03..74d2e7a28da021d134c35c6da7f46a3d3fe49bd6 100644 (file)
@@ -395,8 +395,6 @@ static struct ata_port_operations optidma_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations optiplus_port_ops = {
@@ -430,8 +428,6 @@ static struct ata_port_operations optiplus_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 9ed7f58424a3a31214fb3b436f00510cb07a9264..5a9b24950f9935cf1f1fa6e2c660037cab49bf8f 100644 (file)
@@ -94,8 +94,6 @@ static struct ata_port_operations pcmcia_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 #define CS_CHECK(fn, ret) \
@@ -298,7 +296,7 @@ static void pcmcia_remove_one(struct pcmcia_device *pdev)
                /* If we have attached the device to the ATA layer, detach it */
                if (info->ndev) {
                        struct ata_host *host = dev_get_drvdata(dev);
-                       ata_host_remove(host);
+                       ata_host_detach(host);
                        dev_set_drvdata(dev, NULL);
                }
                info->ndev = 0;
index 76dd1c935dbd34449b78d49bbea80dc0587fca45..1c106b866c7940c87bc9e81b1b68e600dc177d7b 100644 (file)
@@ -33,7 +33,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "pata_pdc2027x"
 #define DRV_VERSION    "0.74-ac5"
@@ -62,7 +61,6 @@ enum {
 };
 
 static int pdc2027x_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
-static void pdc2027x_remove_one(struct pci_dev *pdev);
 static void pdc2027x_error_handler(struct ata_port *ap);
 static void pdc2027x_set_piomode(struct ata_port *ap, struct ata_device *adev);
 static void pdc2027x_set_dmamode(struct ata_port *ap, struct ata_device *adev);
@@ -123,7 +121,7 @@ static struct pci_driver pdc2027x_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = pdc2027x_pci_tbl,
        .probe                  = pdc2027x_init_one,
-       .remove                 = __devexit_p(pdc2027x_remove_one),
+       .remove                 = ata_pci_remove_one,
 };
 
 static struct scsi_host_template pdc2027x_sht = {
@@ -171,8 +169,6 @@ static struct ata_port_operations pdc2027x_pata100_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static struct ata_port_operations pdc2027x_pata133_ops = {
@@ -205,8 +201,6 @@ static struct ata_port_operations pdc2027x_pata133_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static struct ata_port_info pdc2027x_port_info[] = {
@@ -755,7 +749,7 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
        static int printed_version;
        unsigned int board_idx = (unsigned int) ent->driver_data;
 
-       struct ata_probe_ent *probe_ent = NULL;
+       struct ata_probe_ent *probe_ent;
        unsigned long base;
        void __iomem *mmio_base;
        int rc;
@@ -763,37 +757,33 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc)
-               goto err_out;
+               return rc;
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        /* Prepare the probe entry */
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 5, 0);
-       if (!mmio_base) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, 5, 0);
+       if (!mmio_base)
+               return -ENOMEM;
 
        base = (unsigned long) mmio_base;
 
@@ -820,32 +810,13 @@ static int __devinit pdc2027x_init_one(struct pci_dev *pdev, const struct pci_de
 
        /* initialize adapter */
        if (pdc_hardware_init(pdev, probe_ent, board_idx) != 0)
-               goto err_out_free_ent;
+               return -EIO;
 
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       pci_disable_device(pdev);
-       return rc;
-}
-
-/**
- * pdc2027x_remove_one - Called to remove a single instance of the
- * adapter.
- *
- * @dev: The PCI device to remove.
- * FIXME: module load/unload not working yet
- */
-static void __devexit pdc2027x_remove_one(struct pci_dev *pdev)
-{
-       ata_pci_remove_one(pdev);
 }
 
 /**
index ba982ba68ad5920c530c4c60545f00d7c0aca9de..c52e1e8aa2d216b1207fac7c494fafbfb69bb70e 100644 (file)
@@ -300,8 +300,6 @@ static struct ata_port_operations pdc2024x_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations pdc2026x_port_ops = {
@@ -334,8 +332,6 @@ static struct ata_port_operations pdc2026x_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int pdc202xx_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index afc0d990e7d6debecea9da3768e39cdc5c2e8364..4413960042a9425630cf4d11b381c7dd8d9d19eb 100644 (file)
@@ -191,8 +191,6 @@ static struct ata_port_operations qdi6500_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations qdi6580_port_ops = {
@@ -219,8 +217,6 @@ static struct ata_port_operations qdi6580_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -382,7 +378,7 @@ static __exit void qdi_exit(void)
        int i;
 
        for (i = 0; i < nr_qdi_host; i++) {
-               ata_host_remove(qdi_host[i]);
+               ata_host_detach(qdi_host[i]);
                /* Free the control resource. The 6580 dual channel has the resources
                 * claimed as a pair of 2 byte resources so we need no special cases...
                 */
index 065541d034ad200e1cce593545920cf03dbad7f7..ca9c97056c1b64a398fccc114838884813f0a000 100644 (file)
@@ -261,8 +261,6 @@ static const struct ata_port_operations radisys_pata_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 
index cec0729225e1a62eb77b0a371b429d6aaa2a6508..c99331bbbdd99dddf2b929e5192b9b2fc94317ae 100644 (file)
@@ -126,8 +126,6 @@ static struct ata_port_operations rz1000_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int rz1000_fifo_disable(struct pci_dev *pdev)
index a3b35bc5039492edae8e1bc35f2759c7d5949096..75638ccc0183f69fbfbc9cb0406c81053e9022e5 100644 (file)
@@ -226,8 +226,6 @@ static struct ata_port_operations sc1200_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 4b8c2352cdca770af393fb1532d083e874df8ccb..46ea1e8af4f4c59cfdd4f72652764c95f61519b6 100644 (file)
@@ -354,8 +354,6 @@ static struct ata_port_operations serverworks_osb4_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations serverworks_csb_port_ops = {
@@ -389,8 +387,6 @@ static struct ata_port_operations serverworks_csb_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int serverworks_fixup_osb4(struct pci_dev *pdev)
index 11da1f5271d57ff59b69cea7baf9df28e9843a4e..955c1d3a5739a541ceb6616415c1a772b935d888 100644 (file)
@@ -258,8 +258,6 @@ static struct ata_port_operations sil680_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 5e616d3cc870ac15005d930259c54c6a70d90e3c..1c5219f3ffded1724c22585372993995131af96a 100644 (file)
@@ -608,8 +608,6 @@ static const struct ata_port_operations sis_133_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_133_early_ops = {
@@ -641,8 +639,6 @@ static const struct ata_port_operations sis_133_early_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_100_ops = {
@@ -675,8 +671,6 @@ static const struct ata_port_operations sis_100_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_66_ops = {
@@ -708,8 +702,6 @@ static const struct ata_port_operations sis_66_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations sis_old_ops = {
@@ -741,8 +733,6 @@ static const struct ata_port_operations sis_old_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info sis_info = {
index e94f515ef54b6468199a78d92d5fc77e52e935de..d118a1822c454ce85008f8bff90c2766c44ed1ad 100644 (file)
@@ -268,8 +268,6 @@ static struct ata_port_operations sl82c105_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index a142971f13074071612e3326a2119813eb4e2a5e..57385a2f8286132979dcc52b6d51ca18cedfc8fc 100644 (file)
@@ -227,8 +227,6 @@ static struct ata_port_operations triflex_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static int triflex_init_one(struct pci_dev *dev, const struct pci_device_id *id)
index 2addce11000af973ee3c6210ac75101d7108297d..2b262363b96a734d56016bcbe620b044a41fd964 100644 (file)
@@ -340,8 +340,6 @@ static struct ata_port_operations via_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 static struct ata_port_operations via_port_ops_noirq = {
@@ -375,8 +373,6 @@ static struct ata_port_operations via_port_ops_noirq = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
index 022da95a33899ab731151d0d88e22c8dfed26e1a..bba04a6e37084d01b445bbb8c36b240918220974 100644 (file)
@@ -160,8 +160,6 @@ static struct ata_port_operations winbond_port_ops = {
        .irq_clear      = ata_bmdma_irq_clear,
 
        .port_start     = ata_port_start,
-       .port_stop      = ata_port_stop,
-       .host_stop      = ata_host_stop
 };
 
 /**
@@ -288,7 +286,7 @@ static __exit void winbond_exit(void)
        int i;
 
        for (i = 0; i < nr_winbond_host; i++) {
-               ata_host_remove(winbond_host[i]);
+               ata_host_detach(winbond_host[i]);
                release_region(winbond_data[i].config, 2);
                platform_device_unregister(winbond_data[i].platform_dev);
        }
index 90786d7a20bbbfde234167b64ef86a4f0a8fa16b..a6bf7cbdfdc50a142f1e346ae5f9c70006c2f628 100644 (file)
@@ -42,7 +42,6 @@
 #include <linux/sched.h>
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
-#include <asm/io.h>
 #include <linux/libata.h>
 
 #define DRV_NAME       "pdc_adma"
@@ -550,48 +549,28 @@ static int adma_port_start(struct ata_port *ap)
        if (rc)
                return rc;
        adma_enter_reg_mode(ap);
-       rc = -ENOMEM;
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
-               goto err_out;
-       pp->pkt = dma_alloc_coherent(dev, ADMA_PKT_BYTES, &pp->pkt_dma,
-                                                               GFP_KERNEL);
+               return -ENOMEM;
+       pp->pkt = dmam_alloc_coherent(dev, ADMA_PKT_BYTES, &pp->pkt_dma,
+                                     GFP_KERNEL);
        if (!pp->pkt)
-               goto err_out_kfree;
+               return -ENOMEM;
        /* paranoia? */
        if ((pp->pkt_dma & 7) != 0) {
                printk("bad alignment for pp->pkt_dma: %08x\n",
                                                (u32)pp->pkt_dma);
-               dma_free_coherent(dev, ADMA_PKT_BYTES,
-                                               pp->pkt, pp->pkt_dma);
-               goto err_out_kfree;
+               return -ENOMEM;
        }
        memset(pp->pkt, 0, ADMA_PKT_BYTES);
        ap->private_data = pp;
        adma_reinit_engine(ap);
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
 }
 
 static void adma_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
-       struct adma_port_priv *pp = ap->private_data;
-
        adma_reset_engine(ADMA_REGS(ap->host->mmio_base, ap->port_no));
-       if (pp != NULL) {
-               ap->private_data = NULL;
-               if (pp->pkt != NULL)
-                       dma_free_coherent(dev, ADMA_PKT_BYTES,
-                                       pp->pkt, pp->pkt_dma);
-               kfree(pp);
-       }
-       ata_port_stop(ap);
 }
 
 static void adma_host_stop(struct ata_host *host)
@@ -600,8 +579,6 @@ static void adma_host_stop(struct ata_host *host)
 
        for (port_no = 0; port_no < ADMA_PORTS; ++port_no)
                adma_reset_engine(ADMA_REGS(host->mmio_base, port_no));
-
-       ata_pci_host_stop(host);
 }
 
 static void adma_host_init(unsigned int chip_id,
@@ -649,34 +626,28 @@ static int adma_ata_init_one(struct pci_dev *pdev,
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc)
-               goto err_out;
+               return rc;
 
-       if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) {
-               rc = -ENODEV;
-               goto err_out_regions;
-       }
+       if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0)
+               return -ENODEV;
 
-       mmio_base = pci_iomap(pdev, 4, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       mmio_base = pcim_iomap(pdev, 4, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
 
        rc = adma_set_dma_masks(pdev, mmio_base);
        if (rc)
-               goto err_out_iounmap;
+               return rc;
 
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
@@ -703,19 +674,11 @@ static int adma_ata_init_one(struct pci_dev *pdev,
        /* initialize adapter */
        adma_host_init(board_idx, probe_ent);
 
-       rc = ata_device_add(probe_ent);
-       kfree(probe_ent);
-       if (rc != ADMA_PORTS)
-               goto err_out_iounmap;
-       return 0;
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       pci_disable_device(pdev);
-       return rc;
+       devm_kfree(&pdev->dev, probe_ent);
+       return 0;
 }
 
 static int __init adma_ata_init(void)
index b67817e440c58181c2b907f36bd96ca7d7aaa875..c98e0227a60c32ddd087a035288e91bb82070afa 100644 (file)
@@ -523,7 +523,7 @@ static int inic_port_start(struct ata_port *ap)
        int rc;
 
        /* alloc and initialize private data */
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(ap->host->dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
                return -ENOMEM;
        ap->private_data = pp;
@@ -545,12 +545,6 @@ static int inic_port_start(struct ata_port *ap)
        return 0;
 }
 
-static void inic_port_stop(struct ata_port *ap)
-{
-       ata_port_stop(ap);
-       kfree(ap->private_data);
-}
-
 static struct ata_port_operations inic_port_ops = {
        .port_disable           = ata_port_disable,
        .tf_load                = ata_tf_load,
@@ -583,8 +577,6 @@ static struct ata_port_operations inic_port_ops = {
        .port_resume            = inic_port_resume,
 
        .port_start             = inic_port_start,
-       .port_stop              = inic_port_stop,
-       .host_stop              = ata_pci_host_stop
 };
 
 static struct ata_port_info inic_port_info = {
@@ -675,42 +667,37 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc)
-               goto err_out;
+               return rc;
 
-       rc = -ENOMEM;
        mmio_base = pci_iomap(pdev, MMIO_BAR, 0);
        if (!mmio_base)
-               goto err_out_regions;
+               return -ENOMEM;
 
        /* Set dma_mask.  This devices doesn't support 64bit addressing. */
        rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
        if (rc) {
                dev_printk(KERN_ERR, &pdev->dev,
                           "32-bit DMA enable failed\n");
-               goto err_out_map;
+               return rc;
        }
 
        rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
        if (rc) {
                dev_printk(KERN_ERR, &pdev->dev,
                           "32-bit consistent DMA enable failed\n");
-               goto err_out_map;
+               return rc;
        }
 
-       rc = -ENOMEM;
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (!probe_ent)
-               goto err_out_map;
-
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv)
-               goto err_out_ent;
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!probe_ent || !hpriv)
+               return -ENOMEM;
 
        probe_ent->dev = &pdev->dev;
        INIT_LIST_HEAD(&probe_ent->node);
@@ -749,30 +736,17 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (rc) {
                dev_printk(KERN_ERR, &pdev->dev,
                           "failed to initialize controller\n");
-               goto err_out_hpriv;
+               return rc;
        }
 
        pci_set_master(pdev);
 
-       rc = -ENODEV;
        if (!ata_device_add(probe_ent))
-               goto err_out_hpriv;
+               return -ENODEV;
 
-       kfree(probe_ent);
+       devm_kfree(&pdev->dev, probe_ent);
 
        return 0;
-
- err_out_hpriv:
-       kfree(hpriv);
- err_out_ent:
-       kfree(probe_ent);
- err_out_map:
-       pci_iounmap(pdev, mmio_base);
- err_out_regions:
-       pci_release_regions(pdev);
- err_out:
-       pci_disable_device(pdev);
-       return rc;
 }
 
 static const struct pci_device_id inic_pci_tbl[] = {
index aae0b5201c1edb109a750ab717416a567126a220..c073e453dcdd6bedcdc477158dbf4539f4e408e4 100644 (file)
@@ -34,7 +34,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "sata_mv"
 #define DRV_VERSION    "0.7"
@@ -342,7 +341,6 @@ static u32 mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in);
 static void mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val);
 static void mv_phy_reset(struct ata_port *ap);
 static void __mv_phy_reset(struct ata_port *ap, int can_sleep);
-static void mv_host_stop(struct ata_host *host);
 static int mv_port_start(struct ata_port *ap);
 static void mv_port_stop(struct ata_port *ap);
 static void mv_qc_prep(struct ata_queued_cmd *qc);
@@ -418,7 +416,6 @@ static const struct ata_port_operations mv5_ops = {
 
        .port_start             = mv_port_start,
        .port_stop              = mv_port_stop,
-       .host_stop              = mv_host_stop,
 };
 
 static const struct ata_port_operations mv6_ops = {
@@ -446,7 +443,6 @@ static const struct ata_port_operations mv6_ops = {
 
        .port_start             = mv_port_start,
        .port_stop              = mv_port_stop,
-       .host_stop              = mv_host_stop,
 };
 
 static const struct ata_port_operations mv_iie_ops = {
@@ -474,7 +470,6 @@ static const struct ata_port_operations mv_iie_ops = {
 
        .port_start             = mv_port_start,
        .port_stop              = mv_port_stop,
-       .host_stop              = mv_host_stop,
 };
 
 static const struct ata_port_info mv_port_info[] = {
@@ -809,35 +804,6 @@ static void mv_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val)
        }
 }
 
-/**
- *      mv_host_stop - Host specific cleanup/stop routine.
- *      @host: host data structure
- *
- *      Disable ints, cleanup host memory, call general purpose
- *      host_stop.
- *
- *      LOCKING:
- *      Inherited from caller.
- */
-static void mv_host_stop(struct ata_host *host)
-{
-       struct mv_host_priv *hpriv = host->private_data;
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-
-       if (hpriv->hp_flags & MV_HP_FLAG_MSI) {
-               pci_disable_msi(pdev);
-       } else {
-               pci_intx(pdev, 0);
-       }
-       kfree(hpriv);
-       ata_host_stop(host);
-}
-
-static inline void mv_priv_free(struct mv_port_priv *pp, struct device *dev)
-{
-       dma_free_coherent(dev, MV_PORT_PRIV_DMA_SZ, pp->crpb, pp->crpb_dma);
-}
-
 static void mv_edma_cfg(struct mv_host_priv *hpriv, void __iomem *port_mmio)
 {
        u32 cfg = readl(port_mmio + EDMA_CFG_OFS);
@@ -883,22 +849,21 @@ static int mv_port_start(struct ata_port *ap)
        void __iomem *port_mmio = mv_ap_base(ap);
        void *mem;
        dma_addr_t mem_dma;
-       int rc = -ENOMEM;
+       int rc;
 
-       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
-               goto err_out;
-       memset(pp, 0, sizeof(*pp));
+               return -ENOMEM;
 
-       mem = dma_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma,
-                                GFP_KERNEL);
+       mem = dmam_alloc_coherent(dev, MV_PORT_PRIV_DMA_SZ, &mem_dma,
+                                 GFP_KERNEL);
        if (!mem)
-               goto err_out_pp;
+               return -ENOMEM;
        memset(mem, 0, MV_PORT_PRIV_DMA_SZ);
 
        rc = ata_pad_alloc(ap, dev);
        if (rc)
-               goto err_out_priv;
+               return rc;
 
        /* First item in chunk of DMA memory:
         * 32-slot command request table (CRQB), 32 bytes each in size
@@ -951,13 +916,6 @@ static int mv_port_start(struct ata_port *ap)
         */
        ap->private_data = pp;
        return 0;
-
-err_out_priv:
-       mv_priv_free(pp, dev);
-err_out_pp:
-       kfree(pp);
-err_out:
-       return rc;
 }
 
 /**
@@ -971,18 +929,11 @@ err_out:
  */
 static void mv_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
-       struct mv_port_priv *pp = ap->private_data;
        unsigned long flags;
 
        spin_lock_irqsave(&ap->host->lock, flags);
        mv_stop_dma(ap);
        spin_unlock_irqrestore(&ap->host->lock, flags);
-
-       ap->private_data = NULL;
-       ata_pad_free(ap, dev);
-       mv_priv_free(pp, dev);
-       kfree(pp);
 }
 
 /**
@@ -2342,49 +2293,41 @@ static void mv_print_info(struct ata_probe_ent *probe_ent)
 static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version = 0;
-       struct ata_probe_ent *probe_ent = NULL;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
        struct mv_host_priv *hpriv;
        unsigned int board_idx = (unsigned int)ent->driver_data;
        void __iomem *mmio_base;
-       int pci_dev_busy = 0, rc;
+       int rc;
 
        if (!printed_version++)
                dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
-       if (rc) {
+       rc = pcim_enable_device(pdev);
+       if (rc)
                return rc;
-       }
        pci_set_master(pdev);
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, MV_PRIMARY_BAR, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, MV_PRIMARY_BAR, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
 
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-       memset(hpriv, 0, sizeof(*hpriv));
+       hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
        probe_ent->sht = mv_port_info[board_idx].sht;
        probe_ent->port_flags = mv_port_info[board_idx].flags;
@@ -2399,48 +2342,21 @@ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        /* initialize adapter */
        rc = mv_init_host(pdev, probe_ent, board_idx);
-       if (rc) {
-               goto err_out_hpriv;
-       }
+       if (rc)
+               return rc;
 
        /* Enable interrupts */
-       if (msi && pci_enable_msi(pdev) == 0) {
-               hpriv->hp_flags |= MV_HP_FLAG_MSI;
-       } else {
+       if (msi && !pci_enable_msi(pdev))
                pci_intx(pdev, 1);
-       }
 
        mv_dump_pci_cfg(pdev, 0x68);
        mv_print_info(probe_ent);
 
-       if (ata_device_add(probe_ent) == 0) {
-               rc = -ENODEV;           /* No devices discovered */
-               goto err_out_dev_add;
-       }
+       if (ata_device_add(probe_ent) == 0)
+               return -ENODEV;
 
-       kfree(probe_ent);
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_dev_add:
-       if (MV_HP_FLAG_MSI & hpriv->hp_flags) {
-               pci_disable_msi(pdev);
-       } else {
-               pci_intx(pdev, 0);
-       }
-err_out_hpriv:
-       kfree(hpriv);
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy) {
-               pci_disable_device(pdev);
-       }
-
-       return rc;
 }
 
 static int __init mv_init(void)
index 246df22ecd05a02462ce6384f05ae559ee9d7912..18361a38aee71ad4d083b49683593d5f9b4c1281 100644 (file)
@@ -363,8 +363,6 @@ static const struct ata_port_operations nv_generic_ops = {
        .scr_read               = nv_scr_read,
        .scr_write              = nv_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static const struct ata_port_operations nv_nf2_ops = {
@@ -390,8 +388,6 @@ static const struct ata_port_operations nv_nf2_ops = {
        .scr_read               = nv_scr_read,
        .scr_write              = nv_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static const struct ata_port_operations nv_ck804_ops = {
@@ -417,7 +413,6 @@ static const struct ata_port_operations nv_ck804_ops = {
        .scr_read               = nv_scr_read,
        .scr_write              = nv_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
        .host_stop              = nv_ck804_host_stop,
 };
 
@@ -928,11 +923,9 @@ static int nv_adma_port_start(struct ata_port *ap)
        if (rc)
                return rc;
 
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
 
        mmio = ap->host->mmio_base + NV_ADMA_PORT +
               ap->port_no * NV_ADMA_PORT_SIZE;
@@ -941,13 +934,10 @@ static int nv_adma_port_start(struct ata_port *ap)
        pp->notifier_clear_block = pp->gen_block +
               NV_ADMA_NOTIFIER_CLEAR + (4 * ap->port_no);
 
-       mem = dma_alloc_coherent(dev, NV_ADMA_PORT_PRIV_DMA_SZ,
-                                &mem_dma, GFP_KERNEL);
-
-       if (!mem) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       mem = dmam_alloc_coherent(dev, NV_ADMA_PORT_PRIV_DMA_SZ,
+                                 &mem_dma, GFP_KERNEL);
+       if (!mem)
+               return -ENOMEM;
        memset(mem, 0, NV_ADMA_PORT_PRIV_DMA_SZ);
 
        /*
@@ -993,28 +983,15 @@ static int nv_adma_port_start(struct ata_port *ap)
        readl( mmio + NV_ADMA_CTL );    /* flush posted write */
 
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
 }
 
 static void nv_adma_port_stop(struct ata_port *ap)
 {
-       struct device *dev = ap->host->dev;
        struct nv_adma_port_priv *pp = ap->private_data;
        void __iomem *mmio = pp->ctl_block;
 
        VPRINTK("ENTER\n");
-
        writew(0, mmio + NV_ADMA_CTL);
-
-       ap->private_data = NULL;
-       dma_free_coherent(dev, NV_ADMA_PORT_PRIV_DMA_SZ, pp->cpb, pp->cpb_dma);
-       kfree(pp);
-       ata_port_stop(ap);
 }
 
 static int nv_adma_port_suspend(struct ata_port *ap, pm_message_t mesg)
@@ -1433,7 +1410,6 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        struct ata_port_info *ppi[2];
        struct ata_probe_ent *probe_ent;
        struct nv_host_priv *hpriv;
-       int pci_dev_busy = 0;
        int rc;
        u32 bar;
        unsigned long base;
@@ -1450,14 +1426,14 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
-               goto err_out;
+               return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out_disable;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        if(type >= CK804 && adma_enabled) {
@@ -1471,28 +1447,27 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if(!mask_set) {
                rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
                if (rc)
-                       goto err_out_regions;
+                       return rc;
                rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
                if (rc)
-                       goto err_out_regions;
+                       return rc;
        }
 
        rc = -ENOMEM;
 
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
        if (!hpriv)
-               goto err_out_regions;
+               return -ENOMEM;
 
        ppi[0] = ppi[1] = &nv_port_info[type];
        probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
        if (!probe_ent)
-               goto err_out_regions;
+               return -ENOMEM;
+
+       probe_ent->mmio_base = pcim_iomap(pdev, 5, 0);
+       if (!probe_ent->mmio_base)
+               return -EIO;
 
-       probe_ent->mmio_base = pci_iomap(pdev, 5, 0);
-       if (!probe_ent->mmio_base) {
-               rc = -EIO;
-               goto err_out_free_ent;
-       }
        probe_ent->private_data = hpriv;
        hpriv->type = type;
 
@@ -1515,28 +1490,15 @@ static int nv_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        if (type == ADMA) {
                rc = nv_adma_host_init(probe_ent);
                if (rc)
-                       goto err_out_iounmap;
+                       return rc;
        }
 
        rc = ata_device_add(probe_ent);
        if (rc != NV_PORTS)
-               goto err_out_iounmap;
-
-       kfree(probe_ent);
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_iounmap:
-       pci_iounmap(pdev, probe_ent->mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out_disable:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-err_out:
-       return rc;
 }
 
 static void nv_remove_one (struct pci_dev *pdev)
@@ -1602,8 +1564,6 @@ static void nv_ck804_host_stop(struct ata_host *host)
        pci_read_config_byte(pdev, NV_MCP_SATA_CFG_20, &regval);
        regval &= ~NV_MCP_SATA_CFG_20_SATA_SPACE_EN;
        pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval);
-
-       ata_pci_host_stop(host);
 }
 
 static void nv_adma_host_stop(struct ata_host *host)
index 32ae03e9081b913385ad6497203ba7f8a1c3739c..e09c609d496162381982ac3c8fc38592ebd36646 100644 (file)
@@ -43,7 +43,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_promise"
@@ -121,7 +120,6 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
 static irqreturn_t pdc_interrupt (int irq, void *dev_instance);
 static void pdc_eng_timeout(struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
-static void pdc_port_stop(struct ata_port *ap);
 static void pdc_pata_phy_reset(struct ata_port *ap);
 static void pdc_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
@@ -130,7 +128,6 @@ static int pdc_check_atapi_dma(struct ata_queued_cmd *qc);
 static int pdc_old_check_atapi_dma(struct ata_queued_cmd *qc);
 static void pdc_irq_clear(struct ata_port *ap);
 static unsigned int pdc_qc_issue_prot(struct ata_queued_cmd *qc);
-static void pdc_host_stop(struct ata_host *host);
 static void pdc_freeze(struct ata_port *ap);
 static void pdc_thaw(struct ata_port *ap);
 static void pdc_error_handler(struct ata_port *ap);
@@ -177,8 +174,6 @@ static const struct ata_port_operations pdc_sata_ops = {
        .scr_read               = pdc_sata_scr_read,
        .scr_write              = pdc_sata_scr_write,
        .port_start             = pdc_port_start,
-       .port_stop              = pdc_port_stop,
-       .host_stop              = pdc_host_stop,
 };
 
 /* First-generation chips need a more restrictive ->check_atapi_dma op */
@@ -204,8 +199,6 @@ static const struct ata_port_operations pdc_old_sata_ops = {
        .scr_read               = pdc_sata_scr_read,
        .scr_write              = pdc_sata_scr_write,
        .port_start             = pdc_port_start,
-       .port_stop              = pdc_port_stop,
-       .host_stop              = pdc_host_stop,
 };
 
 static const struct ata_port_operations pdc_pata_ops = {
@@ -227,8 +220,6 @@ static const struct ata_port_operations pdc_pata_ops = {
        .irq_clear              = pdc_irq_clear,
 
        .port_start             = pdc_port_start,
-       .port_stop              = pdc_port_stop,
-       .host_stop              = pdc_host_stop,
 };
 
 static const struct ata_port_info pdc_port_info[] = {
@@ -332,17 +323,13 @@ static int pdc_port_start(struct ata_port *ap)
        if (rc)
                return rc;
 
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
 
-       pp->pkt = dma_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
-       if (!pp->pkt) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
+       if (!pp->pkt)
+               return -ENOMEM;
 
        ap->private_data = pp;
 
@@ -357,37 +344,8 @@ static int pdc_port_start(struct ata_port *ap)
        }
 
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
 }
 
-
-static void pdc_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct pdc_port_priv *pp = ap->private_data;
-
-       ap->private_data = NULL;
-       dma_free_coherent(dev, 128, pp->pkt, pp->pkt_dma);
-       kfree(pp);
-       ata_port_stop(ap);
-}
-
-
-static void pdc_host_stop(struct ata_host *host)
-{
-       struct pdc_host_priv *hp = host->private_data;
-
-       ata_pci_host_stop(host);
-
-       kfree(hp);
-}
-
-
 static void pdc_reset_port(struct ata_port *ap)
 {
        void __iomem *mmio = (void __iomem *) ap->ioaddr.cmd_addr + PDC_CTLSTAT;
@@ -924,56 +882,49 @@ static void pdc_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
 static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
+       struct ata_probe_ent *probe_ent;
        struct pdc_host_priv *hp;
        unsigned long base;
        void __iomem *mmio_base;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int pci_dev_busy = 0;
        int rc;
        u8 tmp;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 3, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, 3, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
        base = (unsigned long) mmio_base;
 
-       hp = kzalloc(sizeof(*hp), GFP_KERNEL);
-       if (hp == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       hp = devm_kzalloc(&pdev->dev, sizeof(*hp), GFP_KERNEL);
+       if (hp == NULL)
+               return -ENOMEM;
 
        probe_ent->private_data = hp;
 
@@ -1043,22 +994,11 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        /* initialize adapter */
        pdc_host_init(board_idx, probe_ent);
 
-       /* FIXME: Need any other frees than hp? */
        if (!ata_device_add(probe_ent))
-               kfree(hp);
-
-       kfree(probe_ent);
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 
index 0292a79f9747ae082b28790af5290a967202b3d4..339f61648af6c176f93802e48befffa7e10dcb99 100644 (file)
@@ -37,7 +37,6 @@
 #include <linux/sched.h>
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
-#include <asm/io.h>
 #include <linux/libata.h>
 
 #define DRV_NAME       "sata_qstor"
@@ -117,7 +116,6 @@ static int qs_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *en
 static irqreturn_t qs_intr (int irq, void *dev_instance);
 static int qs_port_start(struct ata_port *ap);
 static void qs_host_stop(struct ata_host *host);
-static void qs_port_stop(struct ata_port *ap);
 static void qs_phy_reset(struct ata_port *ap);
 static void qs_qc_prep(struct ata_queued_cmd *qc);
 static unsigned int qs_qc_issue(struct ata_queued_cmd *qc);
@@ -164,7 +162,6 @@ static const struct ata_port_operations qs_ata_ops = {
        .scr_read               = qs_scr_read,
        .scr_write              = qs_scr_write,
        .port_start             = qs_port_start,
-       .port_stop              = qs_port_stop,
        .host_stop              = qs_host_stop,
        .bmdma_stop             = qs_bmdma_stop,
        .bmdma_status           = qs_bmdma_status,
@@ -501,17 +498,13 @@ static int qs_port_start(struct ata_port *ap)
        if (rc)
                return rc;
        qs_enter_reg_mode(ap);
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
-       pp->pkt = dma_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma,
-                                                               GFP_KERNEL);
-       if (!pp->pkt) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
+       pp->pkt = dmam_alloc_coherent(dev, QS_PKT_BYTES, &pp->pkt_dma,
+                                     GFP_KERNEL);
+       if (!pp->pkt)
+               return -ENOMEM;
        memset(pp->pkt, 0, QS_PKT_BYTES);
        ap->private_data = pp;
 
@@ -519,38 +512,14 @@ static int qs_port_start(struct ata_port *ap)
        writel((u32) addr,        chan + QS_CCF_CPBA);
        writel((u32)(addr >> 32), chan + QS_CCF_CPBA + 4);
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
-}
-
-static void qs_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct qs_port_priv *pp = ap->private_data;
-
-       if (pp != NULL) {
-               ap->private_data = NULL;
-               if (pp->pkt != NULL)
-                       dma_free_coherent(dev, QS_PKT_BYTES, pp->pkt,
-                                                               pp->pkt_dma);
-               kfree(pp);
-       }
-       ata_port_stop(ap);
 }
 
 static void qs_host_stop(struct ata_host *host)
 {
        void __iomem *mmio_base = host->mmio_base;
-       struct pci_dev *pdev = to_pci_dev(host->dev);
 
        writeb(0, mmio_base + QS_HCT_CTRL); /* disable host interrupts */
        writeb(QS_CNFG3_GSRST, mmio_base + QS_HCF_CNFG3); /* global reset */
-
-       pci_iounmap(pdev, mmio_base);
 }
 
 static void qs_host_init(unsigned int chip_id, struct ata_probe_ent *pe)
@@ -638,36 +607,29 @@ static int qs_ata_init_one(struct pci_dev *pdev,
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc)
-               goto err_out;
+               return rc;
 
-       if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0) {
-               rc = -ENODEV;
-               goto err_out_regions;
-       }
+       if ((pci_resource_flags(pdev, 4) & IORESOURCE_MEM) == 0)
+               return -ENODEV;
 
-       mmio_base = pci_iomap(pdev, 4, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       mmio_base = pcim_iomap(pdev, 4, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
 
        rc = qs_set_dma_masks(pdev, mmio_base);
        if (rc)
-               goto err_out_iounmap;
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
@@ -694,19 +656,11 @@ static int qs_ata_init_one(struct pci_dev *pdev,
        /* initialize adapter */
        qs_host_init(board_idx, probe_ent);
 
-       rc = ata_device_add(probe_ent);
-       kfree(probe_ent);
-       if (rc != QS_PORTS)
-               goto err_out_iounmap;
-       return 0;
+       if (ata_device_add(probe_ent) != QS_PORTS)
+               return -EIO;
 
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       pci_disable_device(pdev);
-       return rc;
+       devm_kfree(&pdev->dev, probe_ent);
+       return 0;
 }
 
 static int __init qs_ata_init(void)
index 1f3fdcf29876bb6936924e67ec21d240a7bdcd55..00f2465dcdce7ee9bb013076d816462c4dc51d4e 100644 (file)
@@ -210,8 +210,6 @@ static const struct ata_port_operations sil_ops = {
        .scr_read               = sil_scr_read,
        .scr_write              = sil_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static const struct ata_port_info sil_port_info[] = {
@@ -621,38 +619,36 @@ static void sil_init_controller(struct pci_dev *pdev,
 static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
        unsigned long base;
        void __iomem *mmio_base;
        int rc;
        unsigned int i;
-       int pci_dev_busy = 0;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
        INIT_LIST_HEAD(&probe_ent->node);
        probe_ent->dev = pci_dev_to_dev(pdev);
@@ -666,11 +662,9 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                probe_ent->irq_flags = IRQF_SHARED;
        probe_ent->port_flags = sil_port_info[ent->driver_data].flags;
 
-       mmio_base = pci_iomap(pdev, 5, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, 5, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
 
        probe_ent->mmio_base = mmio_base;
 
@@ -690,20 +684,11 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 #ifdef CONFIG_PM
index da982ed4bc47c45adac1fa08ed52b12170b55f76..c7a3c0275bee3f02324a054dad8e2038cfe3f56a 100644 (file)
@@ -28,7 +28,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "sata_sil24"
 #define DRV_VERSION    "0.3"
@@ -341,8 +340,6 @@ static void sil24_thaw(struct ata_port *ap);
 static void sil24_error_handler(struct ata_port *ap);
 static void sil24_post_internal_cmd(struct ata_queued_cmd *qc);
 static int sil24_port_start(struct ata_port *ap);
-static void sil24_port_stop(struct ata_port *ap);
-static void sil24_host_stop(struct ata_host *host);
 static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
 #ifdef CONFIG_PM
 static int sil24_pci_device_resume(struct pci_dev *pdev);
@@ -362,7 +359,7 @@ static struct pci_driver sil24_pci_driver = {
        .name                   = DRV_NAME,
        .id_table               = sil24_pci_tbl,
        .probe                  = sil24_init_one,
-       .remove                 = ata_pci_remove_one, /* safe? */
+       .remove                 = ata_pci_remove_one,
 #ifdef CONFIG_PM
        .suspend                = ata_pci_device_suspend,
        .resume                 = sil24_pci_device_resume,
@@ -416,8 +413,6 @@ static const struct ata_port_operations sil24_ops = {
        .post_internal_cmd      = sil24_post_internal_cmd,
 
        .port_start             = sil24_port_start,
-       .port_stop              = sil24_port_stop,
-       .host_stop              = sil24_host_stop,
 };
 
 /*
@@ -938,13 +933,6 @@ static void sil24_post_internal_cmd(struct ata_queued_cmd *qc)
                sil24_init_port(ap);
 }
 
-static inline void sil24_cblk_free(struct sil24_port_priv *pp, struct device *dev)
-{
-       const size_t cb_size = sizeof(*pp->cmd_block) * SIL24_MAX_CMDS;
-
-       dma_free_coherent(dev, cb_size, pp->cmd_block, pp->cmd_block_dma);
-}
-
 static int sil24_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->host->dev;
@@ -952,22 +940,22 @@ static int sil24_port_start(struct ata_port *ap)
        union sil24_cmd_block *cb;
        size_t cb_size = sizeof(*cb) * SIL24_MAX_CMDS;
        dma_addr_t cb_dma;
-       int rc = -ENOMEM;
+       int rc;
 
-       pp = kzalloc(sizeof(*pp), GFP_KERNEL);
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
        if (!pp)
-               goto err_out;
+               return -ENOMEM;
 
        pp->tf.command = ATA_DRDY;
 
-       cb = dma_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL);
+       cb = dmam_alloc_coherent(dev, cb_size, &cb_dma, GFP_KERNEL);
        if (!cb)
-               goto err_out_pp;
+               return -ENOMEM;
        memset(cb, 0, cb_size);
 
        rc = ata_pad_alloc(ap, dev);
        if (rc)
-               goto err_out_pad;
+               return rc;
 
        pp->cmd_block = cb;
        pp->cmd_block_dma = cb_dma;
@@ -975,33 +963,6 @@ static int sil24_port_start(struct ata_port *ap)
        ap->private_data = pp;
 
        return 0;
-
-err_out_pad:
-       sil24_cblk_free(pp, dev);
-err_out_pp:
-       kfree(pp);
-err_out:
-       return rc;
-}
-
-static void sil24_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct sil24_port_priv *pp = ap->private_data;
-
-       sil24_cblk_free(pp, dev);
-       ata_pad_free(ap, dev);
-       kfree(pp);
-}
-
-static void sil24_host_stop(struct ata_host *host)
-{
-       struct sil24_host_priv *hpriv = host->private_data;
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-
-       pci_iounmap(pdev, hpriv->host_base);
-       pci_iounmap(pdev, hpriv->port_base);
-       kfree(hpriv);
 }
 
 static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
@@ -1066,43 +1027,38 @@ static void sil24_init_controller(struct pci_dev *pdev, int n_ports,
 static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version = 0;
+       struct device *dev = &pdev->dev;
        unsigned int board_id = (unsigned int)ent->driver_data;
        struct ata_port_info *pinfo = &sil24_port_info[board_id];
-       struct ata_probe_ent *probe_ent = NULL;
-       struct sil24_host_priv *hpriv = NULL;
-       void __iomem *host_base = NULL;
-       void __iomem *port_base = NULL;
+       struct ata_probe_ent *probe_ent;
+       struct sil24_host_priv *hpriv;
+       void __iomem *host_base;
+       void __iomem *port_base;
        int i, rc;
        u32 tmp;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc)
-               goto out_disable;
+               return rc;
 
-       rc = -ENOMEM;
        /* map mmio registers */
-       host_base = pci_iomap(pdev, 0, 0);
-       if (!host_base)
-               goto out_free;
-       port_base = pci_iomap(pdev, 2, 0);
-       if (!port_base)
-               goto out_free;
+       host_base = pcim_iomap(pdev, 0, 0);
+       port_base = pcim_iomap(pdev, 2, 0);
+       if (!host_base || !port_base)
+               return -ENOMEM;
 
        /* allocate & init probe_ent and hpriv */
-       probe_ent = kzalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (!probe_ent)
-               goto out_free;
-
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv)
-               goto out_free;
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!probe_ent || !hpriv)
+               return -ENOMEM;
 
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
@@ -1132,7 +1088,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                        if (rc) {
                                dev_printk(KERN_ERR, &pdev->dev,
                                           "64-bit DMA enable failed\n");
-                               goto out_free;
+                               return rc;
                        }
                }
        } else {
@@ -1140,13 +1096,13 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit DMA enable failed\n");
-                       goto out_free;
+                       return rc;
                }
                rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
                if (rc) {
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "32-bit consistent DMA enable failed\n");
-                       goto out_free;
+                       return rc;
                }
        }
 
@@ -1176,23 +1132,11 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
-       kfree(probe_ent);
+       devm_kfree(dev, probe_ent);
        return 0;
-
- out_free:
-       if (host_base)
-               pci_iounmap(pdev, host_base);
-       if (port_base)
-               pci_iounmap(pdev, port_base);
-       kfree(probe_ent);
-       kfree(hpriv);
-       pci_release_regions(pdev);
- out_disable:
-       pci_disable_device(pdev);
-       return rc;
 }
 
 #ifdef CONFIG_PM
index af6f42578f59e3b3637fa092821ab80f1c9df90d..7e51f1c0f7cb13630a1bd9a864743c9dab8ab0ce 100644 (file)
@@ -126,8 +126,6 @@ static const struct ata_port_operations sis_ops = {
        .scr_read               = sis_scr_read,
        .scr_write              = sis_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info sis_port_info = {
@@ -260,29 +258,28 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        int rc;
        u32 genctl, val;
        struct ata_port_info pi = sis_port_info, *ppi[2] = { &pi, &pi };
-       int pci_dev_busy = 0;
        u8 pmr;
        u8 port2_start = 0x20;
 
        if (!printed_version++)
                dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        /* check and see if the SCRs are in IO space or PCI cfg space */
        pci_read_config_dword(pdev, SIS_GENCTL, &genctl);
@@ -351,10 +348,8 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
-       if (!probe_ent) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       if (!probe_ent)
+               return -ENOMEM;
 
        if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) {
                probe_ent->port[0].scr_addr =
@@ -366,20 +361,12 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        pci_set_master(pdev);
        pci_intx(pdev, 1);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -EIO;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
 
-err_out_regions:
-       pci_release_regions(pdev);
-
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
-
 }
 
 static int __init sis_init(void)
index 5f4e82ade6cda60ad991df3531953e1c6d4a5aae..9c48b418ad7f76e7e2bd4e9ddc9a90709172e380 100644 (file)
@@ -359,8 +359,6 @@ static const struct ata_port_operations k2_sata_ops = {
        .scr_read               = k2_sata_scr_read,
        .scr_write              = k2_sata_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_pci_host_stop,
 };
 
 static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base)
@@ -386,12 +384,12 @@ static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base)
 static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
+       struct device *dev = &pdev->dev;
+       struct ata_probe_ent *probe_ent;
        unsigned long base;
        void __iomem *mmio_base;
        const struct k2_board_info *board_info =
                        &k2_board_info[ent->driver_data];
-       int pci_dev_busy = 0;
        int rc;
        int i;
 
@@ -402,7 +400,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
         * If this driver happens to only be useful on Apple's K2, then
         * we should check that here as it has a normal Serverworks ID
         */
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
        /*
@@ -415,32 +413,27 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
        /* Request PCI regions */
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 5, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, 5, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
        base = (unsigned long) mmio_base;
 
        /* Clear a magic bit in SCR1 according to Darwin, those help
@@ -478,20 +471,11 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(dev, probe_ent);
        return 0;
-
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 /* 0x240 is device ID for Apple K2 device
index ae7992de4b08ff44c0b668899ca3f5fce3f2aee2..d9838dcb4b01fb972c474e4a802be3a92741f743 100644 (file)
@@ -42,7 +42,6 @@
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 #include "sata_promise.h"
 
 #define DRV_NAME       "sata_sx4"
@@ -156,11 +155,9 @@ static irqreturn_t pdc20621_interrupt (int irq, void *dev_instance);
 static void pdc_eng_timeout(struct ata_port *ap);
 static void pdc_20621_phy_reset (struct ata_port *ap);
 static int pdc_port_start(struct ata_port *ap);
-static void pdc_port_stop(struct ata_port *ap);
 static void pdc20621_qc_prep(struct ata_queued_cmd *qc);
 static void pdc_tf_load_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
 static void pdc_exec_command_mmio(struct ata_port *ap, const struct ata_taskfile *tf);
-static void pdc20621_host_stop(struct ata_host *host);
 static unsigned int pdc20621_dimm_init(struct ata_probe_ent *pe);
 static int pdc20621_detect_dimm(struct ata_probe_ent *pe);
 static unsigned int pdc20621_i2c_read(struct ata_probe_ent *pe,
@@ -210,8 +207,6 @@ static const struct ata_port_operations pdc_20621_ops = {
        .irq_handler            = pdc20621_interrupt,
        .irq_clear              = pdc20621_irq_clear,
        .port_start             = pdc_port_start,
-       .port_stop              = pdc_port_stop,
-       .host_stop              = pdc20621_host_stop,
 };
 
 static const struct ata_port_info pdc_port_info[] = {
@@ -243,18 +238,6 @@ static struct pci_driver pdc_sata_pci_driver = {
 };
 
 
-static void pdc20621_host_stop(struct ata_host *host)
-{
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-       struct pdc_host_priv *hpriv = host->private_data;
-       void __iomem *dimm_mmio = hpriv->dimm_mmio;
-
-       pci_iounmap(pdev, dimm_mmio);
-       kfree(hpriv);
-
-       pci_iounmap(pdev, host->mmio_base);
-}
-
 static int pdc_port_start(struct ata_port *ap)
 {
        struct device *dev = ap->host->dev;
@@ -265,43 +248,19 @@ static int pdc_port_start(struct ata_port *ap)
        if (rc)
                return rc;
 
-       pp = kmalloc(sizeof(*pp), GFP_KERNEL);
-       if (!pp) {
-               rc = -ENOMEM;
-               goto err_out;
-       }
-       memset(pp, 0, sizeof(*pp));
+       pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
+       if (!pp)
+               return -ENOMEM;
 
-       pp->pkt = dma_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
-       if (!pp->pkt) {
-               rc = -ENOMEM;
-               goto err_out_kfree;
-       }
+       pp->pkt = dmam_alloc_coherent(dev, 128, &pp->pkt_dma, GFP_KERNEL);
+       if (!pp->pkt)
+               return -ENOMEM;
 
        ap->private_data = pp;
 
        return 0;
-
-err_out_kfree:
-       kfree(pp);
-err_out:
-       ata_port_stop(ap);
-       return rc;
-}
-
-
-static void pdc_port_stop(struct ata_port *ap)
-{
-       struct device *dev = ap->host->dev;
-       struct pdc_port_priv *pp = ap->private_data;
-
-       ap->private_data = NULL;
-       dma_free_coherent(dev, 128, pp->pkt, pp->pkt_dma);
-       kfree(pp);
-       ata_port_stop(ap);
 }
 
-
 static void pdc_20621_phy_reset (struct ata_port *ap)
 {
        VPRINTK("ENTER\n");
@@ -1365,65 +1324,53 @@ static void pdc_20621_init(struct ata_probe_ent *pe)
 static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        static int printed_version;
-       struct ata_probe_ent *probe_ent = NULL;
+       struct ata_probe_ent *probe_ent;
        unsigned long base;
        void __iomem *mmio_base;
-       void __iomem *dimm_mmio = NULL;
-       struct pdc_host_priv *hpriv = NULL;
+       void __iomem *dimm_mmio;
+       struct pdc_host_priv *hpriv;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int pci_dev_busy = 0;
        int rc;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 3, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, 3, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
        base = (unsigned long) mmio_base;
 
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-       memset(hpriv, 0, sizeof(*hpriv));
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
-       dimm_mmio = pci_iomap(pdev, 4, 0);
-       if (!dimm_mmio) {
-               kfree(hpriv);
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
+       dimm_mmio = pcim_iomap(pdev, 4, 0);
+       if (!dimm_mmio)
+               return -ENOMEM;
 
        hpriv->dimm_mmio = dimm_mmio;
 
@@ -1451,31 +1398,15 @@ static int pdc_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *
 
        /* initialize adapter */
        /* initialize local dimm */
-       if (pdc20621_dimm_init(probe_ent)) {
-               rc = -ENOMEM;
-               goto err_out_iounmap_dimm;
-       }
+       if (pdc20621_dimm_init(probe_ent))
+               return -ENOMEM;
        pdc_20621_init(probe_ent);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_iounmap_dimm:          /* only get to this label if 20621 */
-       kfree(hpriv);
-       pci_iounmap(pdev, dimm_mmio);
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 
index a43aec62d505deeca00cf4ed20483eba931fc2cb..22eed6d0749578c111606d977d662283508cb908 100644 (file)
@@ -122,8 +122,6 @@ static const struct ata_port_operations uli_ops = {
        .scr_write              = uli_scr_write,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info uli_port_info = {
@@ -189,41 +187,36 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        struct ata_port_info *ppi[2];
        int rc;
        unsigned int board_idx = (unsigned int) ent->driver_data;
-       int pci_dev_busy = 0;
        struct uli_priv *hpriv;
 
        if (!printed_version++)
                dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        ppi[0] = ppi[1] = &uli_port_info;
        probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
-       if (!probe_ent) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+       if (!probe_ent)
+               return -ENOMEM;
 
-       hpriv = kzalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_probe_ent;
-       }
+       hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
+       if (!hpriv)
+               return -ENOMEM;
 
        probe_ent->private_data = hpriv;
 
@@ -269,21 +262,11 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        pci_set_master(pdev);
        pci_intx(pdev, 1);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_probe_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
-
 }
 
 static int __init uli_init(void)
index e95acfac30b99156e1c4131c57d18911249190f9..c7f527578d11317964af15434f7fbbeb2ffffe18 100644 (file)
@@ -44,7 +44,6 @@
 #include <linux/device.h>
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
-#include <asm/io.h>
 
 #define DRV_NAME       "sata_via"
 #define DRV_VERSION    "2.0"
@@ -146,8 +145,6 @@ static const struct ata_port_operations vt6420_sata_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations vt6421_pata_ops = {
@@ -180,8 +177,6 @@ static const struct ata_port_operations vt6421_pata_ops = {
        .irq_clear              = ata_bmdma_irq_clear,
 
        .port_start             = vt6421_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static const struct ata_port_operations vt6421_sata_ops = {
@@ -214,8 +209,6 @@ static const struct ata_port_operations vt6421_sata_ops = {
        .scr_write              = svia_scr_write,
 
        .port_start             = vt6421_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = ata_host_stop,
 };
 
 static struct ata_port_info vt6420_port_info = {
@@ -446,7 +439,7 @@ static struct ata_probe_ent *vt6421_init_probe_ent(struct pci_dev *pdev)
        struct ata_probe_ent *probe_ent;
        unsigned int i;
 
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
        if (!probe_ent)
                return NULL;
 
@@ -517,20 +510,19 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
        struct ata_probe_ent *probe_ent;
        int board_id = (int) ent->driver_data;
        const int *bar_sizes;
-       int pci_dev_busy = 0;
        u8 tmp8;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        if (board_id == vt6420) {
@@ -539,8 +531,7 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                        dev_printk(KERN_ERR, &pdev->dev,
                                   "SATA master/slave not supported (0x%x)\n",
                                   (int) tmp8);
-                       rc = -EIO;
-                       goto err_out_regions;
+                       return -EIO;
                }
 
                bar_sizes = &svia_bar_sizes[0];
@@ -556,16 +547,15 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
                                i,
                                (unsigned long long)pci_resource_start(pdev, i),
                                (unsigned long long)pci_resource_len(pdev, i));
-                       rc = -ENODEV;
-                       goto err_out_regions;
+                       return -ENODEV;
                }
 
        rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
 
        if (board_id == vt6420)
                probe_ent = vt6420_init_probe_ent(pdev);
@@ -574,26 +564,18 @@ static int svia_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 
        if (!probe_ent) {
                dev_printk(KERN_ERR, &pdev->dev, "out of memory\n");
-               rc = -ENOMEM;
-               goto err_out_regions;
+               return -ENOMEM;
        }
 
        svia_configure(pdev);
 
        pci_set_master(pdev);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
-       kfree(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 static int __init svia_init(void)
index 8d1683ebadc6cf862139b4a096a5a76c7626e9db..af77f71bdaa5e8832fea4b0eb858807a7934b1c9 100644 (file)
@@ -94,13 +94,6 @@ enum {
                              VSC_SATA_INT_ERROR_P    | VSC_SATA_INT_ERROR_R | \
                              VSC_SATA_INT_ERROR_E    | VSC_SATA_INT_ERROR_M | \
                              VSC_SATA_INT_PHY_CHANGE),
-
-       /* Host private flags (hp_flags) */
-       VSC_SATA_HP_FLAG_MSI    = (1 << 0),
-};
-
-struct vsc_sata_host_priv {
-       u32     hp_flags;
 };
 
 #define is_vsc_sata_int_err(port_idx, int_status) \
@@ -124,20 +117,6 @@ static void vsc_sata_scr_write (struct ata_port *ap, unsigned int sc_reg,
 }
 
 
-static void vsc_sata_host_stop(struct ata_host *host)
-{
-       struct vsc_sata_host_priv *hpriv = host->private_data;
-       struct pci_dev *pdev = to_pci_dev(host->dev);
-
-       if (hpriv->hp_flags & VSC_SATA_HP_FLAG_MSI)
-               pci_disable_msi(pdev);
-       else
-               pci_intx(pdev, 0);
-       kfree (hpriv);
-       ata_pci_host_stop(host);
-}
-
-
 static void vsc_intr_mask_update(struct ata_port *ap, u8 ctl)
 {
        void __iomem *mask_addr;
@@ -331,8 +310,6 @@ static const struct ata_port_operations vsc_sata_ops = {
        .scr_read               = vsc_sata_scr_read,
        .scr_write              = vsc_sata_scr_write,
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = vsc_sata_host_stop,
 };
 
 static void __devinit vsc_sata_setup_port(struct ata_ioports *port, unsigned long base)
@@ -361,31 +338,27 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
 {
        static int printed_version;
        struct ata_probe_ent *probe_ent = NULL;
-       struct vsc_sata_host_priv *hpriv;
        unsigned long base;
-       int pci_dev_busy = 0;
        void __iomem *mmio_base;
        int rc;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
 
-       rc = pci_enable_device(pdev);
+       rc = pcim_enable_device(pdev);
        if (rc)
                return rc;
 
        /*
         * Check if we have needed resource mapped.
         */
-       if (pci_resource_len(pdev, 0) == 0) {
-               rc = -ENODEV;
-               goto err_out;
-       }
+       if (pci_resource_len(pdev, 0) == 0)
+               return -ENODEV;
 
        rc = pci_request_regions(pdev, DRV_NAME);
        if (rc) {
-               pci_dev_busy = 1;
-               goto err_out;
+               pcim_pin_device(pdev);
+               return rc;
        }
 
        /*
@@ -393,44 +366,29 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
         */
        rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
        if (rc)
-               goto err_out_regions;
+               return rc;
        rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
        if (rc)
-               goto err_out_regions;
-
-       probe_ent = kmalloc(sizeof(*probe_ent), GFP_KERNEL);
-       if (probe_ent == NULL) {
-               rc = -ENOMEM;
-               goto err_out_regions;
-       }
+               return rc;
 
-       memset(probe_ent, 0, sizeof(*probe_ent));
+       probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
+       if (probe_ent == NULL)
+               return -ENOMEM;
        probe_ent->dev = pci_dev_to_dev(pdev);
        INIT_LIST_HEAD(&probe_ent->node);
 
-       mmio_base = pci_iomap(pdev, 0, 0);
-       if (mmio_base == NULL) {
-               rc = -ENOMEM;
-               goto err_out_free_ent;
-       }
+       mmio_base = pcim_iomap(pdev, 0, 0);
+       if (mmio_base == NULL)
+               return -ENOMEM;
        base = (unsigned long) mmio_base;
 
-       hpriv = kmalloc(sizeof(*hpriv), GFP_KERNEL);
-       if (!hpriv) {
-               rc = -ENOMEM;
-               goto err_out_iounmap;
-       }
-       memset(hpriv, 0, sizeof(*hpriv));
-
        /*
         * Due to a bug in the chip, the default cache line size can't be used
         */
        pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x80);
 
-       if (pci_enable_msi(pdev) == 0) {
-               hpriv->hp_flags |= VSC_SATA_HP_FLAG_MSI;
+       if (pci_enable_msi(pdev) == 0)
                pci_intx(pdev, 0);
-       }
        else
                probe_ent->irq_flags = IRQF_SHARED;
 
@@ -441,7 +399,6 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
        probe_ent->n_ports = 4;
        probe_ent->irq = pdev->irq;
        probe_ent->mmio_base = mmio_base;
-       probe_ent->private_data = hpriv;
 
        /* We don't care much about the PIO/UDMA masks, but the core won't like us
         * if we don't fill these
@@ -466,22 +423,11 @@ static int __devinit vsc_sata_init_one (struct pci_dev *pdev, const struct pci_d
         */
        pci_write_config_dword(pdev, 0x98, 0);
 
-       /* FIXME: check ata_device_add return value */
-       ata_device_add(probe_ent);
+       if (!ata_device_add(probe_ent))
+               return -ENODEV;
 
-       kfree(probe_ent);
+       devm_kfree(&pdev->dev, probe_ent);
        return 0;
-
-err_out_iounmap:
-       pci_iounmap(pdev, mmio_base);
-err_out_free_ent:
-       kfree(probe_ent);
-err_out_regions:
-       pci_release_regions(pdev);
-err_out:
-       if (!pci_dev_busy)
-               pci_disable_device(pdev);
-       return rc;
 }
 
 static const struct pci_device_id vsc_sata_pci_tbl[] = {