Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1682254
| From | Vivek Gautam <vivek.gautam@codeaurora.org> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH V4 2/6] iommu/arm-smmu: Add pm_runtime/sleep ops |
| Date | 2017-07-06 11:40 +0200 |
| Message-ID | <u0bqq-2sh-17@gated-at.bofh.it> (permalink) |
| References | <u0bqp-2sh-5@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
From: Sricharan R <sricharan@codeaurora.org>
The smmu needs to be functional only when the respective
master's using it are active. The device_link feature
helps to track such functional dependencies, so that the
iommu gets powered when the master device enables itself
using pm_runtime. So by adapting the smmu driver for
runtime pm, above said dependency can be addressed.
This patch adds the pm runtime/sleep callbacks to the
driver and also the functions to parse the smmu clocks
from DT and enable them in resume/suspend.
Signed-off-by: Sricharan R <sricharan@codeaurora.org>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
[vivek: Clock rework to loop over clock names data]
Signed-off-by: Vivek Gautam <vivek.gautam@codeaurora.org>
---
drivers/iommu/arm-smmu.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 94 insertions(+), 1 deletion(-)
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 61b1f8729a7c..bfe613f8939c 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -48,6 +48,7 @@
#include <linux/of_iommu.h>
#include <linux/pci.h>
#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
@@ -196,6 +197,9 @@ struct arm_smmu_device {
u32 num_global_irqs;
u32 num_context_irqs;
unsigned int *irqs;
+ int num_clks;
+ struct clk **clocks;
+ const char * const *clk_names;
u32 cavium_id_base; /* Specific to Cavium */
@@ -272,6 +276,32 @@ static void parse_driver_options(struct arm_smmu_device *smmu)
} while (arm_smmu_options[++i].opt);
}
+static int arm_smmu_enable_clocks(struct arm_smmu_device *smmu)
+{
+ int i, ret = 0;
+
+ for (i = 0; i < smmu->num_clks; ++i) {
+ ret = clk_prepare_enable(smmu->clocks[i]);
+ if (ret) {
+ dev_err(smmu->dev, "Couldn't enable %s clock\n",
+ smmu->clk_names[i]);
+ while (i--)
+ clk_disable_unprepare(smmu->clocks[i]);
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static void arm_smmu_disable_clocks(struct arm_smmu_device *smmu)
+{
+ int i = smmu->num_clks;
+
+ while (i--)
+ clk_disable_unprepare(smmu->clocks[i]);
+}
+
static struct device_node *dev_get_dev_node(struct device *dev)
{
if (dev_is_pci(dev)) {
@@ -1626,6 +1656,36 @@ static int arm_smmu_id_size_to_bits(int size)
}
}
+static int arm_smmu_init_clocks(struct arm_smmu_device *smmu)
+{
+ int i, err;
+ struct device *dev = smmu->dev;
+
+ if (smmu->num_clks < 1)
+ return 0;
+
+ smmu->clocks = devm_kcalloc(dev, smmu->num_clks,
+ sizeof(*smmu->clocks), GFP_KERNEL);
+ if (!smmu->clocks)
+ return -ENOMEM;
+
+ for (i = 0; i < smmu->num_clks; i++) {
+ const char *cname = smmu->clk_names[i];
+ struct clk *c = devm_clk_get(dev, cname);
+
+ if (IS_ERR(c)) {
+ err = PTR_ERR(c);
+ if (err != -EPROBE_DEFER)
+ dev_err(dev, "Couldn't get clock: %s", cname);
+
+ return err;
+ }
+ smmu->clocks[i] = c;
+ }
+
+ return 0;
+}
+
static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
{
unsigned long size;
@@ -1833,10 +1893,12 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)
struct arm_smmu_match_data {
enum arm_smmu_arch_version version;
enum arm_smmu_implementation model;
+ const char * const *clks;
+ int num_clks;
};
#define ARM_SMMU_MATCH_DATA(name, ver, imp) \
-static struct arm_smmu_match_data name = { .version = ver, .model = imp }
+static const struct arm_smmu_match_data name = { .version = ver, .model = imp }
ARM_SMMU_MATCH_DATA(smmu_generic_v1, ARM_SMMU_V1, GENERIC_SMMU);
ARM_SMMU_MATCH_DATA(smmu_generic_v2, ARM_SMMU_V2, GENERIC_SMMU);
@@ -1937,6 +1999,8 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev,
data = of_device_get_match_data(dev);
smmu->version = data->version;
smmu->model = data->model;
+ smmu->clk_names = data->clks;
+ smmu->num_clks = data->num_clks;
parse_driver_options(smmu);
@@ -2035,6 +2099,10 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
smmu->irqs[i] = irq;
}
+ err = arm_smmu_init_clocks(smmu);
+ if (err)
+ return err;
+
err = arm_smmu_device_cfg_probe(smmu);
if (err)
return err;
@@ -2120,10 +2188,35 @@ static int arm_smmu_device_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_PM
+static int arm_smmu_resume(struct device *dev)
+{
+ struct arm_smmu_device *smmu = dev_get_drvdata(dev);
+
+ return arm_smmu_enable_clocks(smmu);
+}
+
+static int arm_smmu_suspend(struct device *dev)
+{
+ struct arm_smmu_device *smmu = dev_get_drvdata(dev);
+
+ arm_smmu_disable_clocks(smmu);
+
+ return 0;
+}
+#endif
+
+static const struct dev_pm_ops arm_smmu_pm_ops = {
+ SET_RUNTIME_PM_OPS(arm_smmu_suspend, arm_smmu_resume, NULL)
+ SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
+ pm_runtime_force_resume)
+};
+
static struct platform_driver arm_smmu_driver = {
.driver = {
.name = "arm-smmu",
.of_match_table = of_match_ptr(arm_smmu_of_match),
+ .pm = &arm_smmu_pm_ops,
},
.probe = arm_smmu_device_probe,
.remove = arm_smmu_device_remove,
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH V4 0/6] iommu/arm-smmu: Add runtime pm/sleep support Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-06 11:40 +0200
[PATCH V4 2/6] iommu/arm-smmu: Add pm_runtime/sleep ops Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-06 11:40 +0200
Re: [PATCH V4 2/6] iommu/arm-smmu: Add pm_runtime/sleep ops Stephen Boyd <sboyd@codeaurora.org> - 2017-07-13 01:00 +0200
Re: [PATCH V4 2/6] iommu/arm-smmu: Add pm_runtime/sleep ops Stephen Boyd <sboyd@codeaurora.org> - 2017-07-13 01:10 +0200
Re: [PATCH V4 2/6] iommu/arm-smmu: Add pm_runtime/sleep ops Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-13 06:00 +0200
[PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-06 11:40 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Stephen Boyd <sboyd@codeaurora.org> - 2017-07-13 01:00 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-13 07:20 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Sricharan R <sricharan@codeaurora.org> - 2017-07-13 07:40 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-13 14:00 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Marek Szyprowski <m.szyprowski@samsung.com> - 2017-07-13 14:10 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-13 14:20 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Marek Szyprowski <m.szyprowski@samsung.com> - 2017-07-13 14:30 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Sricharan R <sricharan@codeaurora.org> - 2017-07-13 16:00 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-13 17:00 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Will Deacon <will.deacon@arm.com> - 2017-07-14 19:10 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-14 19:50 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Will Deacon <will.deacon@arm.com> - 2017-07-14 20:10 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-14 20:30 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Will Deacon <will.deacon@arm.com> - 2017-07-14 21:10 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-14 21:40 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Sricharan R <sricharan@codeaurora.org> - 2017-07-17 13:50 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Sricharan R <sricharan@codeaurora.org> - 2017-07-17 14:30 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Will Deacon <will.deacon@arm.com> - 2017-07-14 21:40 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-14 21:40 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-13 16:00 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-13 16:10 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Stephen Boyd <sboyd@codeaurora.org> - 2017-07-13 08:50 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Robin Murphy <robin.murphy@arm.com> - 2017-07-13 12:00 +0200
Re: [PATCH V4 3/6] iommu/arm-smmu: Invoke pm_runtime during probe, add/remove device Rob Clark <robdclark@gmail.com> - 2017-07-13 14:00 +0200
[PATCH V4 4/6] iommu/arm-smmu: Add the device_link between masters and smmu Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-06 11:40 +0200
Re: [PATCH V4 4/6] iommu/arm-smmu: Add the device_link between masters and smmu Stephen Boyd <sboyd@codeaurora.org> - 2017-07-13 01:00 +0200
Re: [PATCH V4 4/6] iommu/arm-smmu: Add the device_link between masters and smmu Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-13 06:00 +0200
[PATCH V4 5/6] iommu/arm-smmu: Add support for MMU40x/500 clocks Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-06 11:40 +0200
Re: [PATCH V4 5/6] iommu/arm-smmu: Add support for MMU40x/500 clocks Rob Herring <robh@kernel.org> - 2017-07-10 05:40 +0200
Re: [PATCH V4 5/6] iommu/arm-smmu: Add support for MMU40x/500 clocks Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-11 07:20 +0200
[PATCH V4 6/6] iommu/arm-smmu: Add support for qcom,msm8996-smmu-v2 clocks Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-06 11:40 +0200
Re: [PATCH V4 6/6] iommu/arm-smmu: Add support for qcom,msm8996-smmu-v2 clocks Rob Herring <robh@kernel.org> - 2017-07-10 05:50 +0200
Re: [PATCH V4 6/6] iommu/arm-smmu: Add support for qcom,msm8996-smmu-v2 clocks Vivek Gautam <vivek.gautam@codeaurora.org> - 2017-07-10 08:50 +0200
csiph-web