[linux-yocto] [PATCH 26/26] axm56xx: restart with ddr retention

Daniel Dragomir daniel.dragomir at windriver.com
Wed Nov 16 08:57:02 PST 2016


From: Per Hallsmark <per.hallsmark at windriver.com>

dts: correcting reset address

axxia-reset: hook in platform ddr retention on reboot

Signed-off-by: Per Hallsmark <per.hallsmark at windriver.com>
---
 arch/arm64/boot/dts/intel/axm56xx.dtsi |  2 +-
 drivers/power/reset/Kconfig            | 11 +++++++++++
 drivers/power/reset/axxia-reset.c      | 22 ++++++++++++++++++++++
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/boot/dts/intel/axm56xx.dtsi b/arch/arm64/boot/dts/intel/axm56xx.dtsi
index 4539d02..849d1e6 100644
--- a/arch/arm64/boot/dts/intel/axm56xx.dtsi
+++ b/arch/arm64/boot/dts/intel/axm56xx.dtsi
@@ -89,7 +89,7 @@
 			reg = <0x80 0x02c00000 0 0x40000>;
 		};
 
-		reset: reset at 2010031000 {
+		reset: reset at 8002C02008 {
 			compatible = "intel,axm56xx-reset";
 			syscon = <&syscon>;
 		};
diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
index 17d93a7..a263c58 100644
--- a/drivers/power/reset/Kconfig
+++ b/drivers/power/reset/Kconfig
@@ -38,6 +38,17 @@ config POWER_RESET_AXXIA
 
 	  Say Y if you have an Axxia family SoC.
 
+if POWER_RESET_AXXIA
+config POWER_RESET_AXXIA_DDR_RETENTION
+	bool "Keep memory content"
+	depends on POWER_RESET_AXXIA
+	help
+	  Keep memory content during reset. Useful to reserve memory
+	  for dumps, logs etc on fatal errors that can be analysed
+	  after a reboot.
+endif
+
+
 config POWER_RESET_BRCMSTB
 	bool "Broadcom STB reset driver"
 	depends on ARM || MIPS || COMPILE_TEST
diff --git a/drivers/power/reset/axxia-reset.c b/drivers/power/reset/axxia-reset.c
index a4957fc..195d7cd 100644
--- a/drivers/power/reset/axxia-reset.c
+++ b/drivers/power/reset/axxia-reset.c
@@ -25,6 +25,7 @@
 #include <linux/proc_fs.h>
 #include <linux/reboot.h>
 #include <linux/regmap.h>
+#include <asm/system_misc.h>
 
 #define SC_PSCRATCH            0x00dc
 #define SC_CRIT_WRITE_KEY      0x2000
@@ -36,6 +37,11 @@ static struct regmap *syscon;
 
 static int ddr_retention_enabled;
 
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+static void (*saved_arm_pm_restart)
+	    (enum reboot_mode reboot_mode, const char *cmd);
+#endif
+
 void
 initiate_retention_reset(void)
 {
@@ -51,10 +57,21 @@ initiate_retention_reset(void)
 	regmap_write(syscon, SC_PSCRATCH, 1);
 
 	/* trap into secure monitor to do the reset */
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+	saved_arm_pm_restart(0, NULL);
+#else
 	machine_restart(NULL);
+#endif
 }
 EXPORT_SYMBOL(initiate_retention_reset);
 
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+static void axxia_pm_restart(enum reboot_mode reboot_mode, const char *cmd)
+{
+	initiate_retention_reset();
+}
+#endif
+
 static ssize_t
 axxia_ddr_retention_trigger(struct file *file, const char __user *buf,
 			    size_t count, loff_t *ppos)
@@ -125,6 +142,11 @@ static int axxia_reset_probe(struct platform_device *pdev)
 	if (err)
 		dev_err(dev, "cannot register restart handler (err=%d)\n", err);
 
+#ifdef CONFIG_POWER_RESET_AXXIA_DDR_RETENTION
+	saved_arm_pm_restart = arm_pm_restart;
+	arm_pm_restart = axxia_pm_restart;
+#endif
+
 	return err;
 }
 
-- 
2.7.4



More information about the linux-yocto mailing list