Hi Vivek,
On Thu, Aug 30, 2018 at 11:46 PM Vivek Gautam
<vivek.gautam@xxxxxxxxxxxxxx> wrote:
From: Sricharan R <sricharan@xxxxxxxxxxxxxx>[snip]
The smmu device probe/remove and add/remove master device callbacks
gets called when the smmu is not linked to its master, that is without
the context of the master device. So calling runtime apis in those places
separately.
Global locks are also initialized before enabling runtime pm as the
runtime_resume() calls device_reset() which does tlb_sync_global()
that ultimately requires locks to be initialized.
Signed-off-by: Sricharan R <sricharan@xxxxxxxxxxxxxx>
[vivek: Cleanup pm runtime calls]
Signed-off-by: Vivek Gautam <vivek.gautam@xxxxxxxxxxxxxx>
Reviewed-by: Tomasz Figa <tfiga@xxxxxxxxxxxx>
Tested-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>
---
drivers/iommu/arm-smmu.c | 89 +++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 81 insertions(+), 8 deletions(-)
@@ -2215,10 +2281,17 @@ static int arm_smmu_device_remove(struct platform_device *pdev)Aren't we missing pm_runtime_disable() here? We'll have the enable
if (!bitmap_empty(smmu->context_map, ARM_SMMU_MAX_CBS))
dev_err(&pdev->dev, "removing device with active domains!\n");
+ arm_smmu_rpm_get(smmu);
/* Turn the thing off */
writel(sCR0_CLIENTPD, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
+ arm_smmu_rpm_put(smmu);
+
+ if (pm_runtime_enabled(smmu->dev))
+ pm_runtime_force_suspend(smmu->dev);
+ else
+ clk_bulk_disable(smmu->num_clks, smmu->clks);
- clk_bulk_disable_unprepare(smmu->num_clks, smmu->clks);
+ clk_bulk_unprepare(smmu->num_clks, smmu->clks);
count unbalanced if the driver is removed and probed again.
Also, if we add pm_runtime_disable(), we can reorder things a bit and
simplify into:
arm_smmu_rpm_get(smmu);
/* Turn the thing off */
writel(sCR0_CLIENTPD, ARM_SMMU_GR0_NS(smmu) + ARM_SMMU_GR0_sCR0);
if (pm_runtime_enabled())
pm_runtime_disable();
arm_smmu_rpm_put(smmu);
clk_bulk_disable_unprepare(smmu->num_clks, smmu->clks);
Best regards,
Tomasz