iommu/omap: Migrate to the generic fault report mechanism
[pandora-kernel.git] / drivers / iommu / omap-iommu.c
index 90744af..7e0188f 100644 (file)
@@ -775,6 +775,7 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
        u32 da, errs;
        u32 *iopgd, *iopte;
        struct omap_iommu *obj = data;
+       struct iommu_domain *domain = obj->domain;
 
        if (!obj->refcount)
                return IRQ_NONE;
@@ -786,7 +787,7 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
                return IRQ_HANDLED;
 
        /* Fault callback or TLB/PTE Dynamic loading */
-       if (obj->isr && !obj->isr(obj, da, errs, obj->isr_priv))
+       if (!report_iommu_fault(domain, obj->dev, da, 0))
                return IRQ_HANDLED;
 
        iommu_disable(obj);
@@ -904,33 +905,6 @@ static void omap_iommu_detach(struct omap_iommu *obj)
        dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name);
 }
 
-int omap_iommu_set_isr(const char *name,
-                 int (*isr)(struct omap_iommu *obj, u32 da, u32 iommu_errs,
-                            void *priv),
-                 void *isr_priv)
-{
-       struct device *dev;
-       struct omap_iommu *obj;
-
-       dev = driver_find_device(&omap_iommu_driver.driver, NULL, (void *)name,
-                                device_match_by_alias);
-       if (!dev)
-               return -ENODEV;
-
-       obj = to_iommu(dev);
-       spin_lock(&obj->iommu_lock);
-       if (obj->refcount != 0) {
-               spin_unlock(&obj->iommu_lock);
-               return -EBUSY;
-       }
-       obj->isr = isr;
-       obj->isr_priv = isr_priv;
-       spin_unlock(&obj->iommu_lock);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(omap_iommu_set_isr);
-
 /*
  *     OMAP Device MMU(IOMMU) detection
  */
@@ -1069,12 +1043,10 @@ static int omap_iommu_map(struct iommu_domain *domain, unsigned long da,
        iotlb_init_entry(&e, da, pa, flags);
 
        ret = omap_iopgtable_store_entry(oiommu, &e);
-       if (ret) {
+       if (ret)
                dev_err(dev, "omap_iopgtable_store_entry failed: %d\n", ret);
-               return ret;
-       }
 
-       return 0;
+       return ret;
 }
 
 static int omap_iommu_unmap(struct iommu_domain *domain, unsigned long da,
@@ -1083,18 +1055,13 @@ static int omap_iommu_unmap(struct iommu_domain *domain, unsigned long da,
        struct omap_iommu_domain *omap_domain = domain->priv;
        struct omap_iommu *oiommu = omap_domain->iommu_dev;
        struct device *dev = oiommu->dev;
-       size_t bytes = PAGE_SIZE << order;
-       size_t ret;
+       size_t unmap_size;
 
-       dev_dbg(dev, "unmapping da 0x%lx size 0x%x\n", da, bytes);
+       dev_dbg(dev, "unmapping da 0x%lx order %d\n", da, order);
 
-       ret = iopgtable_clear_entry(oiommu, da);
-       if (ret != bytes) {
-               dev_err(dev, "entry @ 0x%lx was %d; not %d\n", da, ret, bytes);
-               return -EINVAL;
-       }
+       unmap_size = iopgtable_clear_entry(oiommu, da);
 
-       return 0;
+       return unmap_size ? get_order(unmap_size) : -EINVAL;
 }
 
 static int
@@ -1122,6 +1089,7 @@ omap_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
        }
 
        omap_domain->iommu_dev = oiommu;
+       oiommu->domain = domain;
 
 out:
        spin_unlock(&omap_domain->lock);