[PATCH v3 11/13] iommu/arm: Put off the initialization phase of arm_smmu_ops registration
Zhen Lei
thunder.leizhen at huawei.com
Wed Jul 9 23:53:04 PDT 2014
When more than two SMMU drivers running at the same, should make sure all SMMUs
device tree nodes can be probed before arm_smmu_ops registered.
Signed-off-by: Zhen Lei <thunder.leizhen at huawei.com>
---
drivers/iommu/arm-smmu-base.c | 3 ++-
drivers/iommu/arm-smmu.c | 12 ++----------
drivers/iommu/arm-smmu.h | 2 --
3 files changed, 4 insertions(+), 13 deletions(-)
diff --git a/drivers/iommu/arm-smmu-base.c b/drivers/iommu/arm-smmu-base.c
index 8013751..d71af43 100644
--- a/drivers/iommu/arm-smmu-base.c
+++ b/drivers/iommu/arm-smmu-base.c
@@ -1066,7 +1066,7 @@ int arm_smmu_device_remove(struct platform_device *pdev)
return smmu->hwdep_ops->device_remove(smmu);
}
-int __init arm_smmu_ops_init(void)
+static int __init arm_smmu_ops_init(void)
{
/* Oh, for a proper bus abstraction */
if (!iommu_present(&platform_bus_type))
@@ -1079,3 +1079,4 @@ int __init arm_smmu_ops_init(void)
return 0;
}
+subsys_initcall_sync(arm_smmu_ops_init);
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 6971e11..868e9ac 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -728,7 +728,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
void __iomem *gr0_base = ARM_SMMU_GR0(smmu);
u32 id;
- dev_notice(smmu->dev, "probing hardware configuration...\n");
+ dev_notice(smmu->dev, "probing arm-smmu hardware configuration...\n");
/* Primecell ID */
id = readl_relaxed(gr0_base + ARM_SMMU_GR0_PIDR2);
@@ -899,15 +899,7 @@ static struct platform_driver arm_smmu_driver = {
static int __init arm_smmu_init(void)
{
- int ret;
-
- ret = platform_driver_register(&arm_smmu_driver);
- if (ret)
- return ret;
-
- arm_smmu_ops_init();
-
- return 0;
+ return platform_driver_register(&arm_smmu_driver);
}
static void __exit arm_smmu_exit(void)
diff --git a/drivers/iommu/arm-smmu.h b/drivers/iommu/arm-smmu.h
index 3164ba78..9847a33 100644
--- a/drivers/iommu/arm-smmu.h
+++ b/drivers/iommu/arm-smmu.h
@@ -253,6 +253,4 @@ extern void arm_smmu_flush_pgtable(struct arm_smmu_device *smmu, void *addr,
extern int arm_smmu_device_dt_probe(struct platform_device *pdev,
struct smmu_hwdep_ops *ops);
extern int arm_smmu_device_remove(struct platform_device *pdev);
-
-extern int __init arm_smmu_ops_init(void);
#endif
--
1.8.0
More information about the linux-arm-kernel
mailing list