mirror of
https://github.com/coolsnowwolf/lede.git
synced 2025-04-16 04:13:31 +00:00
92 lines
2.5 KiB
Diff
92 lines
2.5 KiB
Diff
From 6b1080a482294824b6dfb65501de061a86a1939d Mon Sep 17 00:00:00 2001
|
|
From: Hector Martin <marcan@marcan.st>
|
|
Date: Sat, 5 Mar 2022 21:17:10 +0900
|
|
Subject: [PATCH 051/171] iommu: dart: Add suspend/resume support
|
|
|
|
We need to save/restore the TCR/TTBR registers, since they are lost
|
|
on power gate.
|
|
|
|
Signed-off-by: Hector Martin <marcan@marcan.st>
|
|
---
|
|
drivers/iommu/apple-dart.c | 50 ++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 50 insertions(+)
|
|
|
|
diff --git a/drivers/iommu/apple-dart.c b/drivers/iommu/apple-dart.c
|
|
index e5793c0d08b4..90aceb6ac774 100644
|
|
--- a/drivers/iommu/apple-dart.c
|
|
+++ b/drivers/iommu/apple-dart.c
|
|
@@ -120,6 +120,9 @@ struct apple_dart {
|
|
|
|
struct iommu_group *sid2group[DART_MAX_STREAMS];
|
|
struct iommu_device iommu;
|
|
+
|
|
+ u32 save_tcr[DART_MAX_STREAMS];
|
|
+ u32 save_ttbr[DART_MAX_STREAMS][DART_MAX_TTBR];
|
|
};
|
|
|
|
/*
|
|
@@ -963,6 +966,50 @@ static const struct apple_dart_hw apple_dart_hw_t6000 = {
|
|
.fmt = APPLE_DART2,
|
|
};
|
|
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
+static int apple_dart_suspend(struct device *dev)
|
|
+{
|
|
+ struct apple_dart *dart = dev_get_drvdata(dev);
|
|
+ unsigned int sid, idx;
|
|
+
|
|
+ for (sid = 0; sid < DART_MAX_STREAMS; sid++) {
|
|
+ dart->save_tcr[sid] = readl_relaxed(dart->regs + DART_TCR(sid));
|
|
+ for (idx = 0; idx < DART_MAX_TTBR; idx++)
|
|
+ dart->save_ttbr[sid][idx] =
|
|
+ readl_relaxed(dart->regs + DART_TTBR(sid, idx));
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int apple_dart_resume(struct device *dev)
|
|
+{
|
|
+ struct apple_dart *dart = dev_get_drvdata(dev);
|
|
+ unsigned int sid, idx;
|
|
+ int ret;
|
|
+
|
|
+ ret = apple_dart_hw_reset(dart);
|
|
+ if (ret) {
|
|
+ dev_err(dev, "Failed to reset DART on resume\n");
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ for (sid = 0; sid < DART_MAX_STREAMS; sid++) {
|
|
+ for (idx = 0; idx < DART_MAX_TTBR; idx++)
|
|
+ writel_relaxed(dart->save_ttbr[sid][idx],
|
|
+ dart->regs + DART_TTBR(sid, idx));
|
|
+ writel_relaxed(dart->save_tcr[sid], dart->regs + DART_TCR(sid));
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static const struct dev_pm_ops apple_dart_pm_ops = {
|
|
+ .suspend = apple_dart_suspend,
|
|
+ .resume = apple_dart_resume,
|
|
+};
|
|
+#endif
|
|
+
|
|
static const struct of_device_id apple_dart_of_match[] = {
|
|
{ .compatible = "apple,t8103-dart", .data = &apple_dart_hw_t8103 },
|
|
{ .compatible = "apple,t6000-dart", .data = &apple_dart_hw_t6000 },
|
|
@@ -975,6 +1022,9 @@ static struct platform_driver apple_dart_driver = {
|
|
.name = "apple-dart",
|
|
.of_match_table = apple_dart_of_match,
|
|
.suppress_bind_attrs = true,
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
+ .pm = &apple_dart_pm_ops,
|
|
+#endif
|
|
},
|
|
.probe = apple_dart_probe,
|
|
.remove = apple_dart_remove,
|
|
--
|
|
2.34.1
|
|
|