|
@@ -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),
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
|