ATA: sata_mv: Add device tree support
[firefly-linux-kernel-4.4.55.git] / drivers / ata / sata_mv.c
index 24712adf69dfb8a876ff98d2d39df1182de03942..311be18d3f03beff563901943bc0b08a49ecc80a 100644 (file)
@@ -65,6 +65,8 @@
 #include <linux/mbus.h>
 #include <linux/bitops.h>
 #include <linux/gfp.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
 #include <scsi/scsi_host.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_device.h>
@@ -4026,7 +4028,7 @@ static int mv_platform_probe(struct platform_device *pdev)
        struct ata_host *host;
        struct mv_host_priv *hpriv;
        struct resource *res;
-       int n_ports = 0;
+       int n_ports = 0, irq = 0;
        int rc;
 #if defined(CONFIG_HAVE_CLK)
        int port;
@@ -4050,8 +4052,14 @@ static int mv_platform_probe(struct platform_device *pdev)
                return -EINVAL;
 
        /* allocate host */
-       mv_platform_data = pdev->dev.platform_data;
-       n_ports = mv_platform_data->n_ports;
+       if (pdev->dev.of_node) {
+               of_property_read_u32(pdev->dev.of_node, "nr-ports", &n_ports);
+               irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
+       } else {
+               mv_platform_data = pdev->dev.platform_data;
+               n_ports = mv_platform_data->n_ports;
+               irq = platform_get_irq(pdev, 0);
+       }
 
        host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
        hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
@@ -4109,8 +4117,7 @@ static int mv_platform_probe(struct platform_device *pdev)
        dev_info(&pdev->dev, "slots %u ports %d\n",
                 (unsigned)MV_MAX_Q_DEPTH, host->n_ports);
 
-       rc = ata_host_activate(host, platform_get_irq(pdev, 0), mv_interrupt,
-                              IRQF_SHARED, &mv6_sht);
+       rc = ata_host_activate(host, irq, mv_interrupt, IRQF_SHARED, &mv6_sht);
        if (!rc)
                return 0;
 
@@ -4205,15 +4212,24 @@ static int mv_platform_resume(struct platform_device *pdev)
 #define mv_platform_resume NULL
 #endif
 
+#ifdef CONFIG_OF
+static struct of_device_id mv_sata_dt_ids[] __devinitdata = {
+       { .compatible = "marvell,orion-sata", },
+       {},
+};
+MODULE_DEVICE_TABLE(of, mv_sata_dt_ids);
+#endif
+
 static struct platform_driver mv_platform_driver = {
-       .probe                  = mv_platform_probe,
-       .remove                 = __devexit_p(mv_platform_remove),
-       .suspend                = mv_platform_suspend,
-       .resume                 = mv_platform_resume,
-       .driver                 = {
-                                  .name = DRV_NAME,
-                                  .owner = THIS_MODULE,
-                                 },
+       .probe          = mv_platform_probe,
+       .remove         = __devexit_p(mv_platform_remove),
+       .suspend        = mv_platform_suspend,
+       .resume         = mv_platform_resume,
+       .driver         = {
+               .name = DRV_NAME,
+               .owner = THIS_MODULE,
+               .of_match_table = of_match_ptr(mv_sata_dt_ids),
+       },
 };