aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iommu
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2013-08-21 08:56:34 -0400
committerWill Deacon <will.deacon@arm.com>2013-09-17 07:03:11 -0400
commitfd90cecbde065eac6ecc3ef38abace725ad27010 (patch)
treeee02fb709bfc734ec6ece4beae4601719558d2e3 /drivers/iommu
parent6614ee77f49d37f9bb77eb3e81431ca8fcc4042e (diff)
iommu/arm-smmu: don't enable SMMU device until probing has completed
We currently reset and enable the SMMU before the device has finished being probed, so if we fail later on (for example, because we couldn't request a global irq successfully) then we will leave the device in an active state. This patch delays the reset and enabling of the SMMU hardware until probing has completed. Cc: <stable@vger.kernel.org> Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'drivers/iommu')
-rw-r--r--drivers/iommu/arm-smmu.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 913bd1565e41..181c9ba929cd 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -1858,8 +1858,6 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
1858 goto out_put_parent; 1858 goto out_put_parent;
1859 } 1859 }
1860 1860
1861 arm_smmu_device_reset(smmu);
1862
1863 for (i = 0; i < smmu->num_global_irqs; ++i) { 1861 for (i = 0; i < smmu->num_global_irqs; ++i) {
1864 err = request_irq(smmu->irqs[i], 1862 err = request_irq(smmu->irqs[i],
1865 arm_smmu_global_fault, 1863 arm_smmu_global_fault,
@@ -1877,6 +1875,8 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
1877 spin_lock(&arm_smmu_devices_lock); 1875 spin_lock(&arm_smmu_devices_lock);
1878 list_add(&smmu->list, &arm_smmu_devices); 1876 list_add(&smmu->list, &arm_smmu_devices);
1879 spin_unlock(&arm_smmu_devices_lock); 1877 spin_unlock(&arm_smmu_devices_lock);
1878
1879 arm_smmu_device_reset(smmu);
1880 return 0; 1880 return 0;
1881 1881
1882out_free_irqs: 1882out_free_irqs: