libata: clear drvdata in ata_host_release(), take#2
[powerpc.git] / drivers / ata / pata_platform.c
index 443b1d8..4b82a54 100644 (file)
@@ -30,7 +30,7 @@ static int pio_mask = 1;
  * Provide our own set_mode() as we don't want to change anything that has
  * already been configured..
  */
-static void pata_platform_set_mode(struct ata_port *ap)
+static int pata_platform_set_mode(struct ata_port *ap, struct ata_device **unused)
 {
        int i;
 
@@ -42,25 +42,10 @@ static void pata_platform_set_mode(struct ata_port *ap)
                        dev->pio_mode = dev->xfer_mode = XFER_PIO_0;
                        dev->xfer_shift = ATA_SHIFT_PIO;
                        dev->flags |= ATA_DFLAG_PIO;
+                       ata_dev_printk(dev, KERN_INFO, "configured for PIO\n");
                }
        }
-}
-
-static void pata_platform_host_stop(struct ata_host *host)
-{
-       int i;
-
-       /*
-        * Unmap the bases for MMIO
-        */
-       for (i = 0; i < host->n_ports; i++) {
-               struct ata_port *ap = host->ports[i];
-
-               if (ap->flags & ATA_FLAG_MMIO) {
-                       iounmap((void __iomem *)ap->ioaddr.ctl_addr);
-                       iounmap((void __iomem *)ap->ioaddr.cmd_addr);
-               }
-       }
+       return 0;
 }
 
 static struct scsi_host_template pata_platform_sht = {
@@ -99,14 +84,14 @@ static struct ata_port_operations pata_platform_port_ops = {
        .qc_prep                = ata_qc_prep,
        .qc_issue               = ata_qc_issue_prot,
 
-       .data_xfer              = ata_pio_data_xfer_noirq,
+       .data_xfer              = ata_data_xfer_noirq,
 
        .irq_handler            = ata_interrupt,
        .irq_clear              = ata_bmdma_irq_clear,
+       .irq_on                 = ata_irq_on,
+       .irq_ack                = ata_irq_ack,
 
        .port_start             = ata_port_start,
-       .port_stop              = ata_port_stop,
-       .host_stop              = pata_platform_host_stop
 };
 
 static void pata_platform_setup_port(struct ata_ioports *ioaddr,
@@ -152,7 +137,6 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)
        struct resource *io_res, *ctl_res;
        struct ata_probe_ent ae;
        unsigned int mmio;
-       int ret;
 
        /*
         * Simple resource validation ..
@@ -206,46 +190,29 @@ static int __devinit pata_platform_probe(struct platform_device *pdev)
         * Handle the MMIO case
         */
        if (mmio) {
-               ae.port_flags |= ATA_FLAG_MMIO;
-
-               ae.port[0].cmd_addr = (unsigned long)ioremap(io_res->start,
+               ae.port[0].cmd_addr = devm_ioremap(&pdev->dev, io_res->start,
                                io_res->end - io_res->start + 1);
-               if (unlikely(!ae.port[0].cmd_addr)) {
-                       dev_err(&pdev->dev, "failed to remap IO base\n");
-                       return -ENXIO;
-               }
-
-               ae.port[0].ctl_addr = (unsigned long)ioremap(ctl_res->start,
+               ae.port[0].ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start,
                                ctl_res->end - ctl_res->start + 1);
-               if (unlikely(!ae.port[0].ctl_addr)) {
-                       dev_err(&pdev->dev, "failed to remap CTL base\n");
-                       ret = -ENXIO;
-                       goto bad_remap;
-               }
        } else {
-               ae.port[0].cmd_addr = io_res->start;
-               ae.port[0].ctl_addr = ctl_res->start;
+               ae.port[0].cmd_addr = devm_ioport_map(&pdev->dev, io_res->start,
+                               io_res->end - io_res->start + 1);
+               ae.port[0].ctl_addr = devm_ioport_map(&pdev->dev, ctl_res->start,
+                               ctl_res->end - ctl_res->start + 1);
+       }
+       if (!ae.port[0].cmd_addr || !ae.port[0].ctl_addr) {
+               dev_err(&pdev->dev, "failed to map IO/CTL base\n");
+               return -ENOMEM;
        }
 
        ae.port[0].altstatus_addr = ae.port[0].ctl_addr;
 
        pata_platform_setup_port(&ae.port[0], pdev->dev.platform_data);
 
-       if (unlikely(ata_device_add(&ae) == 0)) {
-               ret = -ENODEV;
-               goto add_failed;
-       }
+       if (unlikely(ata_device_add(&ae) == 0))
+               return -ENODEV;
 
        return 0;
-
-add_failed:
-       if (ae.port[0].ctl_addr && mmio)
-               iounmap((void __iomem *)ae.port[0].ctl_addr);
-bad_remap:
-       if (ae.port[0].cmd_addr && mmio)
-               iounmap((void __iomem *)ae.port[0].cmd_addr);
-
-       return ret;
 }
 
 /**
@@ -260,8 +227,7 @@ static int __devexit pata_platform_remove(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct ata_host *host = dev_get_drvdata(dev);
 
-       ata_host_remove(host);
-       dev_set_drvdata(dev, NULL);
+       ata_host_detach(host);
 
        return 0;
 }