ahci_platform: utilize common ata_platform_remove_one()
[firefly-linux-kernel-4.4.55.git] / drivers / ata / ahci_platform.c
index b1ae48054dc5773eab42917d5e9d10f9764602ae..1d90690d85f7a0cefdeb44f5490c7e41943f574b 100644 (file)
@@ -25,6 +25,8 @@
 #include <linux/ahci_platform.h>
 #include "ahci.h"
 
+static void ahci_host_stop(struct ata_host *host);
+
 enum ahci_type {
        AHCI,           /* standard platform ahci */
        IMX53_AHCI,     /* ahci on i.mx53 */
@@ -47,6 +49,15 @@ static struct platform_device_id ahci_devtype[] = {
 };
 MODULE_DEVICE_TABLE(platform, ahci_devtype);
 
+struct ata_port_operations ahci_platform_ops = {
+       .inherits       = &ahci_ops,
+       .host_stop      = ahci_host_stop,
+};
+
+struct ata_port_operations ahci_platform_retry_srst_ops = {
+       .inherits       = &ahci_pmp_retry_srst_ops,
+       .host_stop      = ahci_host_stop,
+};
 
 static const struct ata_port_info ahci_port_info[] = {
        /* by features */
@@ -54,20 +65,20 @@ static const struct ata_port_info ahci_port_info[] = {
                .flags          = AHCI_FLAG_COMMON,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
-               .port_ops       = &ahci_ops,
+               .port_ops       = &ahci_platform_ops,
        },
        [IMX53_AHCI] = {
                .flags          = AHCI_FLAG_COMMON,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
-               .port_ops       = &ahci_pmp_retry_srst_ops,
+               .port_ops       = &ahci_platform_retry_srst_ops,
        },
        [STRICT_AHCI] = {
                AHCI_HFLAGS     (AHCI_HFLAG_DELAY_ENGINE),
                .flags          = AHCI_FLAG_COMMON,
                .pio_mask       = ATA_PIO4,
                .udma_mask      = ATA_UDMA6,
-               .port_ops       = &ahci_ops,
+               .port_ops       = &ahci_platform_ops,
        },
 };
 
@@ -75,7 +86,7 @@ static struct scsi_host_template ahci_platform_sht = {
        AHCI_SHT("ahci_platform"),
 };
 
-static int __init ahci_probe(struct platform_device *pdev)
+static int __devinit ahci_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct ahci_platform_data *pdata = dev_get_platdata(dev);
@@ -218,15 +229,12 @@ free_clk:
        return rc;
 }
 
-static int __devexit ahci_remove(struct platform_device *pdev)
+static void ahci_host_stop(struct ata_host *host)
 {
-       struct device *dev = &pdev->dev;
+       struct device *dev = host->dev;
        struct ahci_platform_data *pdata = dev_get_platdata(dev);
-       struct ata_host *host = dev_get_drvdata(dev);
        struct ahci_host_priv *hpriv = host->private_data;
 
-       ata_host_detach(host);
-
        if (pdata && pdata->exit)
                pdata->exit(dev);
 
@@ -234,11 +242,9 @@ static int __devexit ahci_remove(struct platform_device *pdev)
                clk_disable_unprepare(hpriv->clk);
                clk_put(hpriv->clk);
        }
-
-       return 0;
 }
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
 static int ahci_suspend(struct device *dev)
 {
        struct ahci_platform_data *pdata = dev_get_platdata(dev);
@@ -326,7 +332,8 @@ static const struct of_device_id ahci_of_match[] = {
 MODULE_DEVICE_TABLE(of, ahci_of_match);
 
 static struct platform_driver ahci_driver = {
-       .remove = __devexit_p(ahci_remove),
+       .probe = ahci_probe,
+       .remove = ata_platform_remove_one,
        .driver = {
                .name = "ahci",
                .owner = THIS_MODULE,
@@ -335,18 +342,7 @@ static struct platform_driver ahci_driver = {
        },
        .id_table       = ahci_devtype,
 };
-
-static int __init ahci_init(void)
-{
-       return platform_driver_probe(&ahci_driver, ahci_probe);
-}
-module_init(ahci_init);
-
-static void __exit ahci_exit(void)
-{
-       platform_driver_unregister(&ahci_driver);
-}
-module_exit(ahci_exit);
+module_platform_driver(ahci_driver);
 
 MODULE_DESCRIPTION("AHCI SATA platform driver");
 MODULE_AUTHOR("Anton Vorontsov <avorontsov@ru.mvista.com>");