]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
iommu/omap: Add devicetree support
authorFlorian Vaussard <florian.vaussard@epfl.ch>
Fri, 28 Feb 2014 20:42:36 +0000 (14:42 -0600)
committerJoerg Roedel <joro@8bytes.org>
Tue, 4 Mar 2014 16:01:57 +0000 (17:01 +0100)
As OMAP2+ is moving to a full DT boot for all SoC families, commit
7ce93f3 "ARM: OMAP2+: Fix more missing data for omap3.dtsi file"
adds basic DT bits for OMAP3. But the driver is not yet converted,
so this will not work and driver will not be probed. Convert it!

The legacy boot mode is still supported until OMAP3 is converted
to DT-boot only.

Signed-off-by: Florian Vaussard <florian.vaussard@epfl.ch>
[s-anna@ti.com: dev_name adaptation and improved error checking]
Signed-off-by: Suman Anna <s-anna@ti.com>
[tony@atomide.com: Ack for arch/arm/*omap* parts]
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Joerg Roedel <joro@8bytes.org>
arch/arm/mach-omap2/omap-iommu.c
drivers/iommu/omap-iommu.c

index f6daae821ebb70e9cd09d2a9f82edfb54885ee47..f1fab5684a24b1fc26a20b180305398be5165c65 100644 (file)
@@ -10,6 +10,7 @@
  * published by the Free Software Foundation.
  */
 
+#include <linux/of.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/err.h>
@@ -58,6 +59,10 @@ static int __init omap_iommu_dev_init(struct omap_hwmod *oh, void *unused)
 
 static int __init omap_iommu_init(void)
 {
+       /* If dtb is there, the devices will be created dynamically */
+       if (of_have_populated_dt())
+               return -ENODEV;
+
        return omap_hwmod_for_each_by_class("mmu", omap_iommu_dev_init, NULL);
 }
 /* must be ready before omap3isp is probed */
index 217952b993e1e7df8d382655dbe4b84059501709..eb73ef2b6fa9ebae9d75f495680e0d244761afa8 100644 (file)
@@ -23,6 +23,9 @@
 #include <linux/spinlock.h>
 #include <linux/io.h>
 #include <linux/pm_runtime.h>
+#include <linux/of.h>
+#include <linux/of_iommu.h>
+#include <linux/of_irq.h>
 
 #include <asm/cacheflush.h>
 
@@ -936,17 +939,39 @@ static int omap_iommu_probe(struct platform_device *pdev)
        struct omap_iommu *obj;
        struct resource *res;
        struct iommu_platform_data *pdata = pdev->dev.platform_data;
+       struct device_node *of = pdev->dev.of_node;
 
        obj = devm_kzalloc(&pdev->dev, sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL);
        if (!obj)
                return -ENOMEM;
 
-       obj->nr_tlb_entries = pdata->nr_tlb_entries;
-       obj->name = pdata->name;
+       if (of) {
+               obj->name = dev_name(&pdev->dev);
+               obj->nr_tlb_entries = 32;
+               err = of_property_read_u32(of, "ti,#tlb-entries",
+                                          &obj->nr_tlb_entries);
+               if (err && err != -EINVAL)
+                       return err;
+               if (obj->nr_tlb_entries != 32 && obj->nr_tlb_entries != 8)
+                       return -EINVAL;
+               /*
+                * da_start and da_end are needed for omap-iovmm, so hardcode
+                * these values as used by OMAP3 ISP - the only user for
+                * omap-iovmm
+                */
+               obj->da_start = 0;
+               obj->da_end = 0xfffff000;
+       } else {
+               obj->nr_tlb_entries = pdata->nr_tlb_entries;
+               obj->name = pdata->name;
+               obj->da_start = pdata->da_start;
+               obj->da_end = pdata->da_end;
+       }
+       if (obj->da_end <= obj->da_start)
+               return -EINVAL;
+
        obj->dev = &pdev->dev;
        obj->ctx = (void *)obj + sizeof(*obj);
-       obj->da_start = pdata->da_start;
-       obj->da_end = pdata->da_end;
 
        spin_lock_init(&obj->iommu_lock);
        mutex_init(&obj->mmap_lock);
@@ -987,11 +1012,20 @@ static int omap_iommu_remove(struct platform_device *pdev)
        return 0;
 }
 
+static struct of_device_id omap_iommu_of_match[] = {
+       { .compatible = "ti,omap2-iommu" },
+       { .compatible = "ti,omap4-iommu" },
+       { .compatible = "ti,dra7-iommu" },
+       {},
+};
+MODULE_DEVICE_TABLE(of, omap_iommu_of_match);
+
 static struct platform_driver omap_iommu_driver = {
        .probe  = omap_iommu_probe,
        .remove = omap_iommu_remove,
        .driver = {
                .name   = "omap-iommu",
+               .of_match_table = of_match_ptr(omap_iommu_of_match),
        },
 };