FROMLIST: extcon: Add the support for extcon property according to extcon type
[firefly-linux-kernel-4.4.55.git] / drivers / iommu / rk-iommu.c
index b3bb9f38b313512942e0ba2f24343c37376912ff..a55345d497e4e7b9adfbb17cd273a750f4f99692 100644 (file)
@@ -701,17 +701,14 @@ static int rockchip_iommu_enable(struct iommu_drvdata *data, unsigned int pgtabl
        spin_lock_irqsave(&data->data_lock, flags);
 
        if (!rockchip_set_iommu_active(data)) {
-               if (WARN_ON(pgtable != data->pgtable)) {
+               if (WARN_ON(pgtable != data->pgtable))
                        ret = -EBUSY;
-                       rockchip_set_iommu_inactive(data);
-               } else {
+               else
                        ret = 1;
-               }
 
-               spin_unlock_irqrestore(&data->data_lock, flags);
                dev_info(data->iommu, "(%s) Already enabled\n", data->dbgname);
 
-               return ret;
+               goto enable_out;
        }
 
        for (i = 0; i < data->num_res_mem; i++) {
@@ -719,15 +716,16 @@ static int rockchip_iommu_enable(struct iommu_drvdata *data, unsigned int pgtabl
                if (!ret) {
                        dev_info(data->iommu, "(%s), %s failed\n",
                                 data->dbgname, __func__);
-                       spin_unlock_irqrestore(&data->data_lock, flags);
-                       return -EBUSY;
+                       ret = -EBUSY;
+                       goto enable_out;
                }
 
                if (!strstr(data->dbgname, "isp")) {
                        if (!rockchip_iommu_reset(data->res_bases[i],
                             data->dbgname)) {
-                               spin_unlock_irqrestore(&data->data_lock, flags);
-                               return -ENOENT;
+                               rockchip_iommu_disable_stall(data->res_bases[i]);
+                               ret = -ENOENT;
+                               goto enable_out;
                        }
                }
 
@@ -744,29 +742,35 @@ static int rockchip_iommu_enable(struct iommu_drvdata *data, unsigned int pgtabl
 
                ret = rockchip_iommu_enable_paging(data->res_bases[i]);
                if (!ret) {
-                       spin_unlock_irqrestore(&data->data_lock, flags);
                        dev_info(data->iommu, "(%s), %s failed\n",
                                 data->dbgname, __func__);
-                       return -EBUSY;
+                       rockchip_iommu_disable_stall(data->res_bases[i]);
+                       ret = -EBUSY;
+                       goto enable_out;
                }
 
                rockchip_iommu_disable_stall(data->res_bases[i]);
        }
 
        data->pgtable = pgtable;
+       spin_unlock_irqrestore(&data->data_lock, flags);
 
        dev_dbg(data->iommu,"(%s) Enabled\n", data->dbgname);
 
+       return 0;
+
+enable_out:
+       rockchip_set_iommu_inactive(data);
        spin_unlock_irqrestore(&data->data_lock, flags);
 
-       return 0;
+       return ret;
 }
 
 int rockchip_iommu_tlb_invalidate_global(struct device *dev)
 {
        unsigned long flags;
        struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
-       int ret;
+       int ret = 0;
 
        spin_lock_irqsave(&data->data_lock, flags);
 
@@ -1223,6 +1227,8 @@ static const struct of_device_id iommu_dt_ids[] = {
        { .compatible = HEVC_IOMMU_COMPATIBLE_NAME},
        { .compatible = VPU_IOMMU_COMPATIBLE_NAME},
        { .compatible = ISP_IOMMU_COMPATIBLE_NAME},
+       { .compatible = ISP0_IOMMU_COMPATIBLE_NAME},
+       { .compatible = ISP1_IOMMU_COMPATIBLE_NAME},
        { .compatible = VOP_IOMMU_COMPATIBLE_NAME},
        { .compatible = VDEC_IOMMU_COMPATIBLE_NAME},
        { /* end */ }
@@ -1243,8 +1249,15 @@ static struct platform_driver rk_iommu_driver = {
 
 static int __init rockchip_iommu_init_driver(void)
 {
+       struct device_node *np;
        int ret;
 
+       np = of_find_matching_node(NULL, iommu_dt_ids);
+       if (!np) {
+               pr_err("Failed to find legacy iommu devices\n");
+               return -ENODEV;
+       }
+
        lv2table_kmem_cache = kmem_cache_create("rk-iommu-lv2table",
                                                LV2TABLE_SIZE, LV2TABLE_SIZE,
                                                0, NULL);